|[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,o=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,a=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i,s=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,c=/\((\S*)(?::(\d+))(?::(\d+))\)/,l=e.stack.split("\n"),u=[],h=(/^(.*) is undefined$/.exec(e.message),0),p=l.length;h eval")>-1&&(t=s.exec(r[3]))?(r[3]=t[1],r[4]=t[2],r[5]=null):0!==h||r[5]||void 0===e.columnNumber||(u[0].column=e.columnNumber+1),n={url:r[3],func:r[1]||S,args:r[2]?r[2].split(","):[],line:r[4]?+r[4]:null,column:r[5]?+r[5]:null}}!n.func&&n.line&&(n.func=S),u.push(n)}return u.length?{name:e.name,message:e.message,url:C(),stack:u}:null}}function t(e,t,r,n){var i={url:t,line:r};if(i.url&&i.line){if(e.incomplete=!1,i.func||(i.func=S),e.stack.length>0&&e.stack[0].url===i.url){if(e.stack[0].line===i.line)return!1;if(!e.stack[0].line&&e.stack[0].func===i.func)return e.stack[0].line=i.line,!1}return e.stack.unshift(i),e.partial=!0,!0}return e.incomplete=!0,!1}function r(e,i){for(var o,a,s=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,c=[],l={},u=!1,h=r.caller;h&&!u;h=h.caller)if(h!==n&&h!==w.report){if(a={url:null,func:S,line:null,column:null},h.name?a.func=h.name:(o=s.exec(h.toString()))&&(a.func=o[1]),void 0===a.func)try{a.func=o.input.substring(0,o.input.indexOf("{"))}catch(e){}l[""+h]?u=!0:l[""+h]=!0,c.push(a)}i&&c.splice(0,i);var p={name:e.name,message:e.message,url:C(),stack:c};return t(p,e.sourceURL||e.fileName,e.line||e.lineNumber,e.message||e.description),p}function n(t,n){var i=null;n=null==n?0:+n;try{if(i=e(t))return i}catch(e){if(w.debug)throw e}try{if(i=r(t,n+1))return i}catch(e){if(w.debug)throw e}return{name:t.name,message:t.message,url:C()}}return n.augmentStackTraceWithInitialElement=t,n.computeStackTraceFromStackProp=e,n}();var R=w;function j(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function T(e,t,r,n,i,o){return j((a=j(j(t,e),j(n,o)))<<(s=i)|a>>>32-s,r);var a,s}function F(e,t,r,n,i,o,a){return T(t&r|~t&n,e,t,i,o,a)}function A(e,t,r,n,i,o,a){return T(t&n|r&~n,e,t,i,o,a)}function B(e,t,r,n,i,o,a){return T(t^r^n,e,t,i,o,a)}function D(e,t,r,n,i,o,a){return T(r^(t|~n),e,t,i,o,a)}function H(e,t){var r,n,i,o,a;e[t>>5]|=128<>>9<<4)]=t;var s=1732584193,c=-271733879,l=-1732584194,u=271733878;for(r=0;r>5]>>>t%32&255);return r}function P(e){var t,r=[];for(r[(e.length>>2)-1]=void 0,t=0;t>5]|=(255&e.charCodeAt(t/8))<>>4&15)+"0123456789abcdef".charAt(15&t);return n}function U(e){return unescape(encodeURIComponent(e))}function N(e){return function(e){return L(H(P(e),8*e.length))}(U(e))}function M(e,t){return function(e,t){var r,n,i=P(e),o=[],a=[];for(o[15]=a[15]=void 0,i.length>16&&(i=H(i,8*e.length)),r=0;r<16;r+=1)o[r]=909522486^i[r],a[r]=1549556828^i[r];return n=H(o.concat(P(t)),512+8*t.length),L(H(a.concat(n),640))}(U(e),U(t))}var q=function(e,t,r){return t?r?M(t,e):I(M(t,e)):r?N(e):I(N(e))};function z(e){this.name="RavenConfigError",this.message=e}z.prototype=new Error,z.prototype.constructor=z;var K=z,W=function(e,t,r){var n=e[t],i=e;if(t in e){var o="warn"===t?"warning":t;e[t]=function(){var e=[].slice.call(arguments),a=E.safeJoin(e," "),s={level:o,logger:"console",extra:{arguments:e}};"assert"===t?!1===e[0]&&(a="Assertion failed: "+(E.safeJoin(e.slice(1)," ")||"console.assert"),s.extra.arguments=e.slice(1),r&&r(a,s)):r&&r(a,s),n&&Function.prototype.apply.call(n,i,e)}}},V=E.isError,$=E.isObject,J=E.isPlainObject,X=E.isErrorEvent,G=E.isUndefined,Y=E.isFunction,Z=E.isString,Q=E.isArray,ee=E.isEmptyObject,te=E.each,re=E.objectMerge,ne=E.truncate,ie=E.objectFrozen,oe=E.hasKey,ae=E.joinRegExp,se=E.urlencode,ce=E.uuid4,le=E.htmlTreeAsString,ue=E.isSameException,he=E.isSameStacktrace,pe=E.parseUrl,fe=E.fill,de=E.supportsFetch,ge=E.supportsReferrerPolicy,_e=E.serializeKeysForMessage,ve=E.serializeException,me=E.sanitize,be=W,ye="source protocol user pass host port path".split(" "),Ee=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;function we(){return+new Date}var ke="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},xe=ke.document,Se=ke.navigator;function Oe(e,t){return Y(t)?function(r){return t(r,e)}:t}function Ce(){for(var e in this._hasJSON=!("object"!=typeof JSON||!JSON.stringify),this._hasDocument=!G(xe),this._hasNavigator=!G(Se),this._lastCapturedException=null,this._lastData=null,this._lastEventId=null,this._globalServer=null,this._globalKey=null,this._globalProject=null,this._globalContext={},this._globalOptions={release:ke.SENTRY_RELEASE&&ke.SENTRY_RELEASE.id,logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],headers:null,collectWindowErrors:!0,captureUnhandledRejections:!0,maxMessageLength:0,maxUrlLength:250,stackTraceLimit:50,autoBreadcrumbs:!0,instrument:!0,sampleRate:1,sanitizeKeys:[]},this._fetchDefaults={method:"POST",keepalive:!0,referrerPolicy:ge()?"origin":""},this._ignoreOnError=0,this._isRavenInstalled=!1,this._originalErrorStackTraceLimit=Error.stackTraceLimit,this._originalConsole=ke.console||{},this._originalConsoleMethods={},this._plugins=[],this._startTime=we(),this._wrappedBuiltIns=[],this._breadcrumbs=[],this._lastCapturedEvent=null,this._keypressTimeout,this._location=ke.location,this._lastHref=this._location&&this._location.href,this._resetBackoff(),this._originalConsole)this._originalConsoleMethods[e]=this._originalConsole[e]}Ce.prototype={VERSION:"3.24.0",debug:!1,TraceKit:R,config:function(e,t){var r=this;if(r._globalServer)return this._logDebug("error","Error: Raven has already been configured"),r;if(!e)return r;var n=r._globalOptions;t&&te(t,function(e,t){"tags"===e||"extra"===e||"user"===e?r._globalContext[e]=t:n[e]=t}),r.setDSN(e),n.ignoreErrors.push(/^Script error\.?$/),n.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),n.ignoreErrors=ae(n.ignoreErrors),n.ignoreUrls=!!n.ignoreUrls.length&&ae(n.ignoreUrls),n.whitelistUrls=!!n.whitelistUrls.length&&ae(n.whitelistUrls),n.includePaths=ae(n.includePaths),n.maxBreadcrumbs=Math.max(0,Math.min(n.maxBreadcrumbs||100,100));var i={xhr:!0,console:!0,dom:!0,location:!0,sentry:!0},o=n.autoBreadcrumbs;"[object Object]"==={}.toString.call(o)?o=re(i,o):!1!==o&&(o=i),n.autoBreadcrumbs=o;var a={tryCatch:!0},s=n.instrument;return"[object Object]"==={}.toString.call(s)?s=re(a,s):!1!==s&&(s=a),n.instrument=s,R.collectWindowErrors=!!n.collectWindowErrors,r},install:function(){var e=this;return e.isSetup()&&!e._isRavenInstalled&&(R.report.subscribe(function(){e._handleOnErrorStackInfo.apply(e,arguments)}),e._globalOptions.captureUnhandledRejections&&e._attachPromiseRejectionHandler(),e._patchFunctionToString(),e._globalOptions.instrument&&e._globalOptions.instrument.tryCatch&&e._instrumentTryCatch(),e._globalOptions.autoBreadcrumbs&&e._instrumentBreadcrumbs(),e._drainPlugins(),e._isRavenInstalled=!0),Error.stackTraceLimit=e._globalOptions.stackTraceLimit,this},setDSN:function(e){var t=this._parseDSN(e),r=t.path.lastIndexOf("/"),n=t.path.substr(1,r);this._dsn=e,this._globalKey=t.user,this._globalSecret=t.pass&&t.pass.substr(1),this._globalProject=t.path.substr(r+1),this._globalServer=this._getGlobalServer(t),this._globalEndpoint=this._globalServer+"/"+n+"api/"+this._globalProject+"/store/",this._resetBackoff()},context:function(e,t,r){return Y(e)&&(r=t||[],t=e,e=void 0),this.wrap(e,t).apply(this,r)},wrap:function(e,t,r){var n=this;if(G(t)&&!Y(e))return e;if(Y(e)&&(t=e,e=void 0),!Y(t))return t;try{if(t.__raven__)return t;if(t.__raven_wrapper__)return t.__raven_wrapper__}catch(e){return t}function i(){var i=[],o=arguments.length,a=!e||e&&!1!==e.deep;for(r&&Y(r)&&r.apply(this,arguments);o--;)i[o]=a?n.wrap(e,arguments[o]):arguments[o];try{return t.apply(this,i)}catch(t){throw n._ignoreNextOnError(),n.captureException(t,e),t}}for(var o in t)oe(t,o)&&(i[o]=t[o]);return i.prototype=t.prototype,t.__raven_wrapper__=i,i.__raven__=!0,i.__orig__=t,i},uninstall:function(){return R.report.uninstall(),this._detachPromiseRejectionHandler(),this._unpatchFunctionToString(),this._restoreBuiltIns(),this._restoreConsole(),Error.stackTraceLimit=this._originalErrorStackTraceLimit,this._isRavenInstalled=!1,this},_promiseRejectionHandler:function(e){this._logDebug("debug","Raven caught unhandled promise rejection:",e),this.captureException(e.reason)},_attachPromiseRejectionHandler:function(){return this._promiseRejectionHandler=this._promiseRejectionHandler.bind(this),ke.addEventListener&&ke.addEventListener("unhandledrejection",this._promiseRejectionHandler),this},_detachPromiseRejectionHandler:function(){return ke.removeEventListener&&ke.removeEventListener("unhandledrejection",this._promiseRejectionHandler),this},captureException:function(e,t){if(t=re({trimHeadFrames:0},t||{}),X(e)&&e.error)e=e.error;else if(V(e))e=e;else{if(!J(e))return this.captureMessage(e,re(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}));t=this._getCaptureExceptionOptionsFromPlainObject(t,e),e=new Error(t.message)}this._lastCapturedException=e;try{var r=R.computeStackTrace(e);this._handleStackInfo(r,t)}catch(t){if(e!==t)throw t}return this},_getCaptureExceptionOptionsFromPlainObject:function(e,t){var r=Object.keys(t).sort(),n=re(e,{message:"Non-Error exception captured with keys: "+_e(r),fingerprint:[q(r)],extra:e.extra||{}});return n.extra.__serialized__=ve(t),n},captureMessage:function(e,t){if(!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(e)){var r,n=re({message:e+=""},t=t||{});try{throw new Error(e)}catch(e){r=e}r.name=null;var i=R.computeStackTrace(r),o=Q(i.stack)&&i.stack[1],a=o&&o.url||"";if((!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(a))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(a))){if(this._globalOptions.stacktrace||t&&t.stacktrace){n.fingerprint=null==n.fingerprint?e:n.fingerprint,(t=re({trimHeadFrames:0},t)).trimHeadFrames+=1;var s=this._prepareFrames(i,t);n.stacktrace={frames:s.reverse()}}return n.fingerprint&&(n.fingerprint=Q(n.fingerprint)?n.fingerprint:[n.fingerprint]),this._send(n),this}}},captureBreadcrumb:function(e){var t=re({timestamp:we()/1e3},e);if(Y(this._globalOptions.breadcrumbCallback)){var r=this._globalOptions.breadcrumbCallback(t);if($(r)&&!ee(r))t=r;else if(!1===r)return this}return this._breadcrumbs.push(t),this._breadcrumbs.length>this._globalOptions.maxBreadcrumbs&&this._breadcrumbs.shift(),this},addPlugin:function(e){var t=[].slice.call(arguments,1);return this._plugins.push([e,t]),this._isRavenInstalled&&this._drainPlugins(),this},setUserContext:function(e){return this._globalContext.user=e,this},setExtraContext:function(e){return this._mergeContext("extra",e),this},setTagsContext:function(e){return this._mergeContext("tags",e),this},clearContext:function(){return this._globalContext={},this},getContext:function(){return JSON.parse(r(this._globalContext))},setEnvironment:function(e){return this._globalOptions.environment=e,this},setRelease:function(e){return this._globalOptions.release=e,this},setDataCallback:function(e){var t=this._globalOptions.dataCallback;return this._globalOptions.dataCallback=Oe(t,e),this},setBreadcrumbCallback:function(e){var t=this._globalOptions.breadcrumbCallback;return this._globalOptions.breadcrumbCallback=Oe(t,e),this},setShouldSendCallback:function(e){var t=this._globalOptions.shouldSendCallback;return this._globalOptions.shouldSendCallback=Oe(t,e),this},setTransport:function(e){return this._globalOptions.transport=e,this},lastException:function(){return this._lastCapturedException},lastEventId:function(){return this._lastEventId},isSetup:function(){return!!this._hasJSON&&(!!this._globalServer||(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this._logDebug("error","Error: Raven has not been configured.")),!1))},afterLoad:function(){var e=ke.RavenConfig;e&&this.config(e.dsn,e.config).install()},showReportDialog:function(e){if(xe){var t=(e=e||{}).eventId||this.lastEventId();if(!t)throw new K("Missing eventId");var r=e.dsn||this._dsn;if(!r)throw new K("Missing DSN");var n=encodeURIComponent,i="";i+="?eventId="+n(t),i+="&dsn="+n(r);var o=e.user||this._globalContext.user;o&&(o.name&&(i+="&name="+n(o.name)),o.email&&(i+="&email="+n(o.email)));var a=this._getGlobalServer(this._parseDSN(r)),s=xe.createElement("script");s.async=!0,s.src=a+"/api/embed/error-page/"+i,(xe.head||xe.body).appendChild(s)}},_ignoreNextOnError:function(){var e=this;this._ignoreOnError+=1,setTimeout(function(){e._ignoreOnError-=1})},_triggerEvent:function(e,t){var r,n;if(this._hasDocument){for(n in t=t||{},e="raven"+e.substr(0,1).toUpperCase()+e.substr(1),xe.createEvent?(r=xe.createEvent("HTMLEvents")).initEvent(e,!0,!0):(r=xe.createEventObject()).eventType=e,t)oe(t,n)&&(r[n]=t[n]);if(xe.createEvent)xe.dispatchEvent(r);else try{xe.fireEvent("on"+r.eventType.toLowerCase(),r)}catch(e){}}},_breadcrumbEventHandler:function(e){var t=this;return function(r){if(t._keypressTimeout=null,t._lastCapturedEvent!==r){var n;t._lastCapturedEvent=r;try{n=le(r.target)}catch(e){n=""}t.captureBreadcrumb({category:"ui."+e,message:n})}}},_keypressEventHandler:function(){var e=this;return function(t){var r;try{r=t.target}catch(e){return}var n=r&&r.tagName;if(n&&("INPUT"===n||"TEXTAREA"===n||r.isContentEditable)){var i=e._keypressTimeout;i||e._breadcrumbEventHandler("input")(t),clearTimeout(i),e._keypressTimeout=setTimeout(function(){e._keypressTimeout=null},1e3)}}},_captureUrlChange:function(e,t){var r=pe(this._location.href),n=pe(t),i=pe(e);this._lastHref=t,r.protocol===n.protocol&&r.host===n.host&&(t=n.relative),r.protocol===i.protocol&&r.host===i.host&&(e=i.relative),this.captureBreadcrumb({category:"navigation",data:{to:t,from:e}})},_patchFunctionToString:function(){var e=this;e._originalFunctionToString=Function.prototype.toString,Function.prototype.toString=function(){return"function"==typeof this&&this.__raven__?e._originalFunctionToString.apply(this.__orig__,arguments):e._originalFunctionToString.apply(this,arguments)}},_unpatchFunctionToString:function(){this._originalFunctionToString&&(Function.prototype.toString=this._originalFunctionToString)},_instrumentTryCatch:function(){var e=this,t=e._wrappedBuiltIns;function r(t){return function(r,n){for(var i=new Array(arguments.length),o=0;o2?arguments[2]:void 0;return r&&e._captureUrlChange(e._lastHref,r+""),t.apply(this,arguments)}};fe(history,"pushState",c,r),fe(history,"replaceState",c,r)}if(t.console&&"console"in ke&&console.log){var l=function(t,r){e.captureBreadcrumb({message:t,level:r.level,category:"console"})};te(["debug","info","warn","error","log"],function(e,t){be(console,t,l)})}},_restoreBuiltIns:function(){for(var e;this._wrappedBuiltIns.length;){var t=(e=this._wrappedBuiltIns.shift())[0],r=e[1],n=e[2];t[r]=n}},_restoreConsole:function(){for(var e in this._originalConsoleMethods)this._originalConsole[e]=this._originalConsoleMethods[e]},_drainPlugins:function(){var e=this;te(this._plugins,function(t,r){var n=r[0],i=r[1];n.apply(e,[e].concat(i))})},_parseDSN:function(e){var t=Ee.exec(e),r={},n=7;try{for(;n--;)r[ye[n]]=t[n]||""}catch(t){throw new K("Invalid DSN: "+e)}if(r.pass&&!this._globalOptions.allowSecretKey)throw new K("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");return r},_getGlobalServer:function(e){var t="//"+e.host+(e.port?":"+e.port:"");return e.protocol&&(t=e.protocol+":"+t),t},_handleOnErrorStackInfo:function(){this._ignoreOnError||this._handleStackInfo.apply(this,arguments)},_handleStackInfo:function(e,t){var r=this._prepareFrames(e,t);this._triggerEvent("handle",{stackInfo:e,options:t}),this._processException(e.name,e.message,e.url,e.lineno,r,t)},_prepareFrames:function(e,t){var r=this,n=[];if(e.stack&&e.stack.length&&(te(e.stack,function(t,i){var o=r._normalizeFrame(i,e.url);o&&n.push(o)}),t&&t.trimHeadFrames))for(var i=0;i0&&(e.breadcrumbs={values:[].slice.call(this._breadcrumbs,0)}),this._globalContext.user&&(e.user=this._globalContext.user),t.environment&&(e.environment=t.environment),t.release&&(e.release=t.release),t.serverName&&(e.server_name=t.serverName),e=this._sanitizeData(e),Object.keys(e).forEach(function(t){(null==e[t]||""===e[t]||ee(e[t]))&&delete e[t]}),Y(t.dataCallback)&&(e=t.dataCallback(e)||e),e&&!ee(e)&&(Y(t.shouldSendCallback)&&!t.shouldSendCallback(e)||(this._shouldBackoff()?this._logDebug("warn","Raven dropped error due to backoff: ",e):"number"==typeof t.sampleRate?Math.random()0){var s=r(n,this);~s?n.splice(s+1):n.push(this),~s?o.splice(s,1/0,i):o.push(i),~r(n,a)&&(a=t.call(this,i,a))}else n.push(a);return null==e?a instanceof Error?function(e){var t={stack:e.stack,message:e.message,name:e.name};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(a):a:e.call(this,i,a)}}(e.exports=function(e,t,r,o){return JSON.stringify(e,n(t,o),r)}).getSerialize=n}(t={exports:{}},t.exports),t.exports),n=(r.getSerialize,"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{});function o(e){return void 0===e}function i(e){return"[object Object]"===Object.prototype.toString.call(e)}function a(e){return"[object String]"===Object.prototype.toString.call(e)}function s(e){return"[object Array]"===Object.prototype.toString.call(e)}function c(){try{return new ErrorEvent(""),!0}catch(e){return!1}}function l(){if(!("fetch"in n))return!1;try{return new Headers,new Request(""),new Response,!0}catch(e){return!1}}function u(e,t){var r,n;if(o(e.length))for(r in e)p(e,r)&&t.call(null,r,e[r]);else if(n=e.length)for(r=0;r ".length;e&&n++<5&&!("html"===(t=d(e))||n>1&&o+r.length*i+t.length>=80);)r.push(t),o+=t.length,e=e.parentNode;return r.reverse().join(" > ")},htmlElementAsString:d,isSameException:function(e,t){return!g(e,t)&&(e=e.values[0],t=t.values[0],e.type===t.type&&e.value===t.value&&(r=e.stacktrace,n=t.stacktrace,(!o(r)||!o(n))&&_(e.stacktrace,t.stacktrace)));var r,n},isSameStacktrace:_,parseUrl:function(e){if("string"!=typeof e)return{};var t=e.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/),r=t[6]||"",n=t[8]||"";return{protocol:t[2],host:t[4],path:t[5],relative:t[5]+r+n}},fill:function(e,t,r,n){if(null!=e){var o=e[t];e[t]=r(o),e[t].__raven__=!0,e[t].__orig__=o,n&&n.push([e,t,o])}},safeJoin:function(e,t){if(!s(e))return"";for(var r=[],n=0;no?e(t,n-1):a},serializeKeysForMessage:function(e,t){if("number"==typeof e||"string"==typeof e)return e.toString();if(!Array.isArray(e))return"";if(0===(e=e.filter(function(e){return"string"==typeof e})).length)return"[object has no keys]";if(t="number"!=typeof t?b:t,e[0].length>=t)return e[0];for(var r=e.length;r>0;r--){var n=e.slice(0,r).join(", ");if(!(n.length>t))return r===e.length?n:n+"…"}return""},sanitize:function(e,t){if(!s(t)||s(t)&&0===t.length)return e;var n,o=f(t),a="********";try{n=JSON.parse(r(e))}catch(t){return e}return function e(t){return s(t)?t.map(function(t){return e(t)}):i(t)?Object.keys(t).reduce(function(r,n){return o.test(n)?r[n]=a:r[n]=e(t[n]),r},{}):t}(n)}},k={collectWindowErrors:!0,debug:!1},x="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},S=[].slice,O="?",C=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;function R(){return"undefined"==typeof document||null==document.location?"":document.location.href}k.report=function(){var e,t,r=[],n=null,o=null,i=null;function a(e,t){var n=null;if(!t||k.collectWindowErrors){for(var o in r)if(r.hasOwnProperty(o))try{r[o].apply(null,[e].concat(S.call(arguments,2)))}catch(e){n=e}if(n)throw n}}function s(t,r,n,o,s){var l=w.isErrorEvent(s)?s.error:s,u=w.isErrorEvent(t)?t.message:t;if(i)k.computeStackTrace.augmentStackTraceWithInitialElement(i,r,n,u),c();else if(l&&w.isError(l))a(k.computeStackTrace(l),!0);else{var h,p={url:r,line:n,column:o},f=void 0;if("[object String]"==={}.toString.call(u))(h=u.match(C))&&(f=h[1],u=h[2]);p.func=O,a({name:f,message:u,url:R(),stack:[p]},!0)}return!!e&&e.apply(this,arguments)}function c(){var e=i,t=n;n=null,i=null,o=null,a.apply(null,[e,!1].concat(t))}function l(e,t){var r=S.call(arguments,1);if(i){if(o===e)return;c()}var a=k.computeStackTrace(e);if(i=a,o=e,n=r,setTimeout(function(){o===e&&c()},a.incomplete?2e3:0),!1!==t)throw e}return l.subscribe=function(n){t||(e=x.onerror,x.onerror=s,t=!0),r.push(n)},l.unsubscribe=function(e){for(var t=r.length-1;t>=0;--t)r[t]===e&&r.splice(t,1)},l.uninstall=function(){t&&(x.onerror=e,t=!1,e=void 0),r=[]},l}(),k.computeStackTrace=function(){function e(e){if(void 0!==e.stack&&e.stack){for(var t,r,n,o=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,i=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,a=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i,s=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,c=/\((\S*)(?::(\d+))(?::(\d+))\)/,l=e.stack.split("\n"),u=[],h=(/^(.*) is undefined$/.exec(e.message),0),p=l.length;h eval")>-1&&(t=s.exec(r[3]))?(r[3]=t[1],r[4]=t[2],r[5]=null):0!==h||r[5]||void 0===e.columnNumber||(u[0].column=e.columnNumber+1),n={url:r[3],func:r[1]||O,args:r[2]?r[2].split(","):[],line:r[4]?+r[4]:null,column:r[5]?+r[5]:null}}!n.func&&n.line&&(n.func=O),u.push(n)}return u.length?{name:e.name,message:e.message,url:R(),stack:u}:null}}function t(e,t,r,n){var o={url:t,line:r};if(o.url&&o.line){if(e.incomplete=!1,o.func||(o.func=O),e.stack.length>0&&e.stack[0].url===o.url){if(e.stack[0].line===o.line)return!1;if(!e.stack[0].line&&e.stack[0].func===o.func)return e.stack[0].line=o.line,!1}return e.stack.unshift(o),e.partial=!0,!0}return e.incomplete=!0,!1}function r(e,o){for(var i,a,s=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,c=[],l={},u=!1,h=r.caller;h&&!u;h=h.caller)if(h!==n&&h!==k.report){if(a={url:null,func:O,line:null,column:null},h.name?a.func=h.name:(i=s.exec(h.toString()))&&(a.func=i[1]),void 0===a.func)try{a.func=i.input.substring(0,i.input.indexOf("{"))}catch(e){}l[""+h]?u=!0:l[""+h]=!0,c.push(a)}o&&c.splice(0,o);var p={name:e.name,message:e.message,url:R(),stack:c};return t(p,e.sourceURL||e.fileName,e.line||e.lineNumber,e.message||e.description),p}function n(t,n){var o=null;n=null==n?0:+n;try{if(o=e(t))return o}catch(e){if(k.debug)throw e}try{if(o=r(t,n+1))return o}catch(e){if(k.debug)throw e}return{name:t.name,message:t.message,url:R()}}return n.augmentStackTraceWithInitialElement=t,n.computeStackTraceFromStackProp=e,n}();var j=k;function T(e,t){var r=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(r>>16)<<16|65535&r}function F(e,t,r,n,o,i){return T((a=T(T(t,e),T(n,i)))<<(s=o)|a>>>32-s,r);var a,s}function A(e,t,r,n,o,i,a){return F(t&r|~t&n,e,t,o,i,a)}function B(e,t,r,n,o,i,a){return F(t&n|r&~n,e,t,o,i,a)}function D(e,t,r,n,o,i,a){return F(t^r^n,e,t,o,i,a)}function H(e,t,r,n,o,i,a){return F(r^(t|~n),e,t,o,i,a)}function L(e,t){var r,n,o,i,a;e[t>>5]|=128<>>9<<4)]=t;var s=1732584193,c=-271733879,l=-1732584194,u=271733878;for(r=0;r>5]>>>t%32&255);return r}function I(e){var t,r=[];for(r[(e.length>>2)-1]=void 0,t=0;t>5]|=(255&e.charCodeAt(t/8))<>>4&15)+"0123456789abcdef".charAt(15&t);return n}function N(e){return unescape(encodeURIComponent(e))}function M(e){return function(e){return P(L(I(e),8*e.length))}(N(e))}function q(e,t){return function(e,t){var r,n,o=I(e),i=[],a=[];for(i[15]=a[15]=void 0,o.length>16&&(o=L(o,8*e.length)),r=0;r<16;r+=1)i[r]=909522486^o[r],a[r]=1549556828^o[r];return n=L(i.concat(I(t)),512+8*t.length),P(L(a.concat(n),640))}(N(e),N(t))}var z=function(e,t,r){return t?r?q(t,e):U(q(t,e)):r?M(e):U(M(e))};function K(e){this.name="RavenConfigError",this.message=e}K.prototype=new Error,K.prototype.constructor=K;var W=K,V=function(e,t,r){var n=e[t],o=e;if(t in e){var i="warn"===t?"warning":t;e[t]=function(){var e=[].slice.call(arguments),a=w.safeJoin(e," "),s={level:i,logger:"console",extra:{arguments:e}};"assert"===t?!1===e[0]&&(a="Assertion failed: "+(w.safeJoin(e.slice(1)," ")||"console.assert"),s.extra.arguments=e.slice(1),r&&r(a,s)):r&&r(a,s),n&&Function.prototype.apply.call(n,o,e)}}},$=w.isError,J=w.isObject,X=w.isPlainObject,G=w.isErrorEvent,Y=w.isUndefined,Z=w.isFunction,Q=w.isString,ee=w.isArray,te=w.isEmptyObject,re=w.each,ne=w.objectMerge,oe=w.truncate,ie=w.objectFrozen,ae=w.hasKey,se=w.joinRegExp,ce=w.urlencode,le=w.uuid4,ue=w.htmlTreeAsString,he=w.isSameException,pe=w.isSameStacktrace,fe=w.parseUrl,de=w.fill,ge=w.supportsFetch,_e=w.supportsReferrerPolicy,ve=w.serializeKeysForMessage,me=w.serializeException,be=w.sanitize,ye=V,Ee="source protocol user pass host port path".split(" "),we=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;function ke(){return+new Date}var xe="undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{},Se=xe.document,Oe=xe.navigator;function Ce(e,t){return Z(t)?function(r){return t(r,e)}:t}function Re(){for(var e in this._hasJSON=!("object"!=typeof JSON||!JSON.stringify),this._hasDocument=!Y(Se),this._hasNavigator=!Y(Oe),this._lastCapturedException=null,this._lastData=null,this._lastEventId=null,this._globalServer=null,this._globalKey=null,this._globalProject=null,this._globalContext={},this._globalOptions={release:xe.SENTRY_RELEASE&&xe.SENTRY_RELEASE.id,logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],headers:null,collectWindowErrors:!0,captureUnhandledRejections:!0,maxMessageLength:0,maxUrlLength:250,stackTraceLimit:50,autoBreadcrumbs:!0,instrument:!0,sampleRate:1,sanitizeKeys:[]},this._fetchDefaults={method:"POST",keepalive:!0,referrerPolicy:_e()?"origin":""},this._ignoreOnError=0,this._isRavenInstalled=!1,this._originalErrorStackTraceLimit=Error.stackTraceLimit,this._originalConsole=xe.console||{},this._originalConsoleMethods={},this._plugins=[],this._startTime=ke(),this._wrappedBuiltIns=[],this._breadcrumbs=[],this._lastCapturedEvent=null,this._keypressTimeout,this._location=xe.location,this._lastHref=this._location&&this._location.href,this._resetBackoff(),this._originalConsole)this._originalConsoleMethods[e]=this._originalConsole[e]}Re.prototype={VERSION:"3.24.2",debug:!1,TraceKit:j,config:function(e,t){var r=this;if(r._globalServer)return this._logDebug("error","Error: Raven has already been configured"),r;if(!e)return r;var n=r._globalOptions;t&&re(t,function(e,t){"tags"===e||"extra"===e||"user"===e?r._globalContext[e]=t:n[e]=t}),r.setDSN(e),n.ignoreErrors.push(/^Script error\.?$/),n.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),n.ignoreErrors=se(n.ignoreErrors),n.ignoreUrls=!!n.ignoreUrls.length&&se(n.ignoreUrls),n.whitelistUrls=!!n.whitelistUrls.length&&se(n.whitelistUrls),n.includePaths=se(n.includePaths),n.maxBreadcrumbs=Math.max(0,Math.min(n.maxBreadcrumbs||100,100));var o={xhr:!0,console:!0,dom:!0,location:!0,sentry:!0},i=n.autoBreadcrumbs;"[object Object]"==={}.toString.call(i)?i=ne(o,i):!1!==i&&(i=o),n.autoBreadcrumbs=i;var a={tryCatch:!0},s=n.instrument;return"[object Object]"==={}.toString.call(s)?s=ne(a,s):!1!==s&&(s=a),n.instrument=s,j.collectWindowErrors=!!n.collectWindowErrors,r},install:function(){var e=this;return e.isSetup()&&!e._isRavenInstalled&&(j.report.subscribe(function(){e._handleOnErrorStackInfo.apply(e,arguments)}),e._globalOptions.captureUnhandledRejections&&e._attachPromiseRejectionHandler(),e._patchFunctionToString(),e._globalOptions.instrument&&e._globalOptions.instrument.tryCatch&&e._instrumentTryCatch(),e._globalOptions.autoBreadcrumbs&&e._instrumentBreadcrumbs(),e._drainPlugins(),e._isRavenInstalled=!0),Error.stackTraceLimit=e._globalOptions.stackTraceLimit,this},setDSN:function(e){var t=this._parseDSN(e),r=t.path.lastIndexOf("/"),n=t.path.substr(1,r);this._dsn=e,this._globalKey=t.user,this._globalSecret=t.pass&&t.pass.substr(1),this._globalProject=t.path.substr(r+1),this._globalServer=this._getGlobalServer(t),this._globalEndpoint=this._globalServer+"/"+n+"api/"+this._globalProject+"/store/",this._resetBackoff()},context:function(e,t,r){return Z(e)&&(r=t||[],t=e,e=void 0),this.wrap(e,t).apply(this,r)},wrap:function(e,t,r){var n=this;if(Y(t)&&!Z(e))return e;if(Z(e)&&(t=e,e=void 0),!Z(t))return t;try{if(t.__raven__)return t;if(t.__raven_wrapper__)return t.__raven_wrapper__}catch(e){return t}function o(){var o=[],i=arguments.length,a=!e||e&&!1!==e.deep;for(r&&Z(r)&&r.apply(this,arguments);i--;)o[i]=a?n.wrap(e,arguments[i]):arguments[i];try{return t.apply(this,o)}catch(t){throw n._ignoreNextOnError(),n.captureException(t,e),t}}for(var i in t)ae(t,i)&&(o[i]=t[i]);return o.prototype=t.prototype,t.__raven_wrapper__=o,o.__raven__=!0,o.__orig__=t,o},uninstall:function(){return j.report.uninstall(),this._detachPromiseRejectionHandler(),this._unpatchFunctionToString(),this._restoreBuiltIns(),this._restoreConsole(),Error.stackTraceLimit=this._originalErrorStackTraceLimit,this._isRavenInstalled=!1,this},_promiseRejectionHandler:function(e){this._logDebug("debug","Raven caught unhandled promise rejection:",e),this.captureException(e.reason,{extra:{unhandledPromiseRejection:!0}})},_attachPromiseRejectionHandler:function(){return this._promiseRejectionHandler=this._promiseRejectionHandler.bind(this),xe.addEventListener&&xe.addEventListener("unhandledrejection",this._promiseRejectionHandler),this},_detachPromiseRejectionHandler:function(){return xe.removeEventListener&&xe.removeEventListener("unhandledrejection",this._promiseRejectionHandler),this},captureException:function(e,t){if(t=ne({trimHeadFrames:0},t||{}),G(e)&&e.error)e=e.error;else if($(e))e=e;else{if(!X(e))return this.captureMessage(e,ne(t,{stacktrace:!0,trimHeadFrames:t.trimHeadFrames+1}));t=this._getCaptureExceptionOptionsFromPlainObject(t,e),e=new Error(t.message)}this._lastCapturedException=e;try{var r=j.computeStackTrace(e);this._handleStackInfo(r,t)}catch(t){if(e!==t)throw t}return this},_getCaptureExceptionOptionsFromPlainObject:function(e,t){var r=Object.keys(t).sort(),n=ne(e,{message:"Non-Error exception captured with keys: "+ve(r),fingerprint:[z(r)],extra:e.extra||{}});return n.extra.__serialized__=me(t),n},captureMessage:function(e,t){if(!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(e)){var r,n=ne({message:e+=""},t=t||{});try{throw new Error(e)}catch(e){r=e}r.name=null;var o=j.computeStackTrace(r),i=ee(o.stack)&&o.stack[1];i&&"Raven.captureException"===i.func&&(i=o.stack[2]);var a=i&&i.url||"";if((!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(a))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(a))){if(this._globalOptions.stacktrace||t&&t.stacktrace){n.fingerprint=null==n.fingerprint?e:n.fingerprint,(t=ne({trimHeadFrames:0},t)).trimHeadFrames+=1;var s=this._prepareFrames(o,t);n.stacktrace={frames:s.reverse()}}return n.fingerprint&&(n.fingerprint=ee(n.fingerprint)?n.fingerprint:[n.fingerprint]),this._send(n),this}}},captureBreadcrumb:function(e){var t=ne({timestamp:ke()/1e3},e);if(Z(this._globalOptions.breadcrumbCallback)){var r=this._globalOptions.breadcrumbCallback(t);if(J(r)&&!te(r))t=r;else if(!1===r)return this}return this._breadcrumbs.push(t),this._breadcrumbs.length>this._globalOptions.maxBreadcrumbs&&this._breadcrumbs.shift(),this},addPlugin:function(e){var t=[].slice.call(arguments,1);return this._plugins.push([e,t]),this._isRavenInstalled&&this._drainPlugins(),this},setUserContext:function(e){return this._globalContext.user=e,this},setExtraContext:function(e){return this._mergeContext("extra",e),this},setTagsContext:function(e){return this._mergeContext("tags",e),this},clearContext:function(){return this._globalContext={},this},getContext:function(){return JSON.parse(r(this._globalContext))},setEnvironment:function(e){return this._globalOptions.environment=e,this},setRelease:function(e){return this._globalOptions.release=e,this},setDataCallback:function(e){var t=this._globalOptions.dataCallback;return this._globalOptions.dataCallback=Ce(t,e),this},setBreadcrumbCallback:function(e){var t=this._globalOptions.breadcrumbCallback;return this._globalOptions.breadcrumbCallback=Ce(t,e),this},setShouldSendCallback:function(e){var t=this._globalOptions.shouldSendCallback;return this._globalOptions.shouldSendCallback=Ce(t,e),this},setTransport:function(e){return this._globalOptions.transport=e,this},lastException:function(){return this._lastCapturedException},lastEventId:function(){return this._lastEventId},isSetup:function(){return!!this._hasJSON&&(!!this._globalServer||(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this._logDebug("error","Error: Raven has not been configured.")),!1))},afterLoad:function(){var e=xe.RavenConfig;e&&this.config(e.dsn,e.config).install()},showReportDialog:function(e){if(Se){var t=(e=e||{}).eventId||this.lastEventId();if(!t)throw new W("Missing eventId");var r=e.dsn||this._dsn;if(!r)throw new W("Missing DSN");var n=encodeURIComponent,o="";o+="?eventId="+n(t),o+="&dsn="+n(r);var i=e.user||this._globalContext.user;i&&(i.name&&(o+="&name="+n(i.name)),i.email&&(o+="&email="+n(i.email)));var a=this._getGlobalServer(this._parseDSN(r)),s=Se.createElement("script");s.async=!0,s.src=a+"/api/embed/error-page/"+o,(Se.head||Se.body).appendChild(s)}},_ignoreNextOnError:function(){var e=this;this._ignoreOnError+=1,setTimeout(function(){e._ignoreOnError-=1})},_triggerEvent:function(e,t){var r,n;if(this._hasDocument){for(n in t=t||{},e="raven"+e.substr(0,1).toUpperCase()+e.substr(1),Se.createEvent?(r=Se.createEvent("HTMLEvents")).initEvent(e,!0,!0):(r=Se.createEventObject()).eventType=e,t)ae(t,n)&&(r[n]=t[n]);if(Se.createEvent)Se.dispatchEvent(r);else try{Se.fireEvent("on"+r.eventType.toLowerCase(),r)}catch(e){}}},_breadcrumbEventHandler:function(e){var t=this;return function(r){if(t._keypressTimeout=null,t._lastCapturedEvent!==r){var n;t._lastCapturedEvent=r;try{n=ue(r.target)}catch(e){n=""}t.captureBreadcrumb({category:"ui."+e,message:n})}}},_keypressEventHandler:function(){var e=this;return function(t){var r;try{r=t.target}catch(e){return}var n=r&&r.tagName;if(n&&("INPUT"===n||"TEXTAREA"===n||r.isContentEditable)){var o=e._keypressTimeout;o||e._breadcrumbEventHandler("input")(t),clearTimeout(o),e._keypressTimeout=setTimeout(function(){e._keypressTimeout=null},1e3)}}},_captureUrlChange:function(e,t){var r=fe(this._location.href),n=fe(t),o=fe(e);this._lastHref=t,r.protocol===n.protocol&&r.host===n.host&&(t=n.relative),r.protocol===o.protocol&&r.host===o.host&&(e=o.relative),this.captureBreadcrumb({category:"navigation",data:{to:t,from:e}})},_patchFunctionToString:function(){var e=this;e._originalFunctionToString=Function.prototype.toString,Function.prototype.toString=function(){return"function"==typeof this&&this.__raven__?e._originalFunctionToString.apply(this.__orig__,arguments):e._originalFunctionToString.apply(this,arguments)}},_unpatchFunctionToString:function(){this._originalFunctionToString&&(Function.prototype.toString=this._originalFunctionToString)},_instrumentTryCatch:function(){var e=this,t=e._wrappedBuiltIns;function r(t){return function(r,n){for(var o=new Array(arguments.length),i=0;i2?arguments[2]:void 0;return r&&e._captureUrlChange(e._lastHref,r+""),t.apply(this,arguments)}};de(history,"pushState",c,r),de(history,"replaceState",c,r)}if(t.console&&"console"in xe&&console.log){var l=function(t,r){e.captureBreadcrumb({message:t,level:r.level,category:"console"})};re(["debug","info","warn","error","log"],function(e,t){ye(console,t,l)})}},_restoreBuiltIns:function(){for(var e;this._wrappedBuiltIns.length;){var t=(e=this._wrappedBuiltIns.shift())[0],r=e[1],n=e[2];t[r]=n}},_restoreConsole:function(){for(var e in this._originalConsoleMethods)this._originalConsole[e]=this._originalConsoleMethods[e]},_drainPlugins:function(){var e=this;re(this._plugins,function(t,r){var n=r[0],o=r[1];n.apply(e,[e].concat(o))})},_parseDSN:function(e){var t=we.exec(e),r={},n=7;try{for(;n--;)r[Ee[n]]=t[n]||""}catch(t){throw new W("Invalid DSN: "+e)}if(r.pass&&!this._globalOptions.allowSecretKey)throw new W("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");return r},_getGlobalServer:function(e){var t="//"+e.host+(e.port?":"+e.port:"");return e.protocol&&(t=e.protocol+":"+t),t},_handleOnErrorStackInfo:function(){this._ignoreOnError||this._handleStackInfo.apply(this,arguments)},_handleStackInfo:function(e,t){var r=this._prepareFrames(e,t);this._triggerEvent("handle",{stackInfo:e,options:t}),this._processException(e.name,e.message,e.url,e.lineno,r,t)},_prepareFrames:function(e,t){var r=this,n=[];if(e.stack&&e.stack.length&&(re(e.stack,function(t,o){var i=r._normalizeFrame(o,e.url);i&&n.push(i)}),t&&t.trimHeadFrames))for(var o=0;o0&&(e.breadcrumbs={values:[].slice.call(this._breadcrumbs,0)}),this._globalContext.user&&(e.user=this._globalContext.user),t.environment&&(e.environment=t.environment),t.release&&(e.release=t.release),t.serverName&&(e.server_name=t.serverName),e=this._sanitizeData(e),Object.keys(e).forEach(function(t){(null==e[t]||""===e[t]||te(e[t]))&&delete e[t]}),Z(t.dataCallback)&&(e=t.dataCallback(e)||e),e&&!te(e)&&(Z(t.shouldSendCallback)&&!t.shouldSendCallback(e)||(this._shouldBackoff()?this._logDebug("warn","Raven dropped error due to backoff: ",e):"number"==typeof t.sampleRate?Math.random() 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch ({}.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n return !max || str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n var maxLength = 40;\n\n if (typeof value === 'string') {\n return value.length <= maxLength ? value : value.substr(0, maxLength - 1) + '\\u2026';\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n return document.location.href;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isErrorEvent = utils.isErrorEvent;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n keepalive: true,\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.24.0',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = undefined;\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} func A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason);\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(originalCallback);\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(fn.handleEvent);\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(fn, undefined, before),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(self.wrap(cb));\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(orig);\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(orig, undefined, onreadystatechangeHandler);\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch.apply(this, args).then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n history.pushState &&\n history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function() {\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo.apply(this, arguments);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n culprit: fileurl\n },\n options\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.culprit !== last.culprit // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n if (this._originalConsoleMethods[level] && this.debug) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const isLive = window.location.host === 'plyr.io';\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (isLive) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n /* 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 'fullscreen',\n ], */\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi – “It All Began With A Burst”',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (isLive) {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]}
\ No newline at end of file
+{"version":3,"sources":["../../../node_modules/raven-js/vendor/json-stringify-safe/stringify.js","../../../node_modules/raven-js/src/utils.js","../../../node_modules/raven-js/vendor/TraceKit/tracekit.js","../../../node_modules/raven-js/vendor/md5/md5.js","../../../node_modules/raven-js/src/configError.js","../../../node_modules/raven-js/src/console.js","../../../node_modules/raven-js/src/raven.js","../../../node_modules/raven-js/src/singleton.js","demo.js"],"names":["indexOf","haystack","needle","i","length","serializer","replacer","cycleReplacer","stack","keys","key","value","slice","join","thisPos","this","splice","push","Infinity","call","Error","err","message","name","Object","prototype","hasOwnProperty","stringifyError","module","exports","obj","spaces","JSON","stringify","getSerialize","_window","window","global","self","isUndefined","what","isPlainObject","toString","isString","isArray","supportsErrorEvent","ErrorEvent","e","supportsFetch","Headers","Request","Response","each","callback","j","hasKey","truncate","str","max","substr","object","joinRegExp","patterns","pattern","sources","len","replace","source","RegExp","htmlElementAsString","elem","className","classes","attr","out","tagName","toLowerCase","id","split","attrWhitelist","getAttribute","isOnlyOneTruthy","a","b","isSameStacktrace","stack1","stack2","frames1","frames","frames2","filename","lineno","colno","MAX_SERIALIZE_EXCEPTION_DEPTH","MAX_SERIALIZE_EXCEPTION_SIZE","MAX_SERIALIZE_KEYS_LENGTH","jsonSize","encodeURI","utf8Length","serializeValue","type","utils","isObject","isError","isErrorEvent","isFunction","isEmptyObject","_","supportsReferrerPolicy","referrerPolicy","supportsPromiseRejectionEvent","PromiseRejectionEvent","wrappedCallback","data","original","normalizedData","objectMerge","obj1","obj2","objectFrozen","isFrozen","urlencode","o","pairs","encodeURIComponent","uuid4","crypto","msCrypto","getRandomValues","arr","Uint16Array","pad","num","v","c","r","Math","random","htmlTreeAsString","nextStr","height","sepLength","parentNode","reverse","isSameException","ex1","ex2","values","stacktrace","parseUrl","url","match","query","fragment","protocol","host","path","relative","fill","replacement","track","orig","__raven__","__orig__","safeJoin","input","delimiter","output","String","serializeException","ex","depth","maxSize","serialized","serializeObject","reduce","acc","Array","map","val","serializeKeysForMessage","maxLength","filter","usedKeys","sanitize","sanitizeKeys","safeInput","sanitizeRegExp","sanitizeMask","parse","o_O","sanitizeWorker","workerInput","k","test","TraceKit","collectWindowErrors","debug","_slice","UNKNOWN_FUNCTION","ERROR_TYPES_RE","getLocationHref","document","location","href","report","_oldOnerrorHandler","_onErrorHandlerInstalled","handlers","lastArgs","lastException","lastExceptionStack","notifyHandlers","isWindowError","exception","apply","concat","arguments","inner","traceKitWindowOnError","msg","lineNo","colNo","error","computeStackTrace","augmentStackTraceWithInitialElement","processLastException","groups","line","column","undefined","func","_lastExceptionStack","_lastArgs","rethrow","args","setTimeout","incomplete","subscribe","handler","onerror","unsubscribe","uninstall","computeStackTraceFromStackProp","submatch","parts","element","chrome","winjs","gecko","geckoEval","chromeEval","lines","exec","isNative","columnNumber","stackInfo","initial","unshift","partial","computeStackTraceByWalkingCallerChain","item","functionName","funcs","recursion","curr","caller","substring","result","sourceURL","fileName","lineNumber","description","tracekit","safeAdd","x","y","lsw","md5cmn","q","s","t","cnt","md5ff","d","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","length32","fromCharCode","rstr2binl","length8","charCodeAt","rstr2hex","charAt","str2rstrUTF8","unescape","rawMD5","rstrMD5","rawHMACMD5","hash","bkey","ipad","opad","rstrHMACMD5","md5_1","string","raw","RavenConfigError","constructor","configError","console$1","console","level","originalConsoleLevel","originalConsole","sentryLevel","logger","extra","Function","wrapConsoleMethod","require$$0","dsnKeys","dsnPattern","now","Date","_document","_navigator","navigator","keepOriginalCallback","Raven","method","_hasJSON","_hasDocument","_hasNavigator","_lastCapturedException","_lastData","_lastEventId","_globalServer","_globalKey","_globalProject","_globalContext","_globalOptions","release","SENTRY_RELEASE","ignoreErrors","ignoreUrls","whitelistUrls","includePaths","headers","captureUnhandledRejections","maxMessageLength","maxUrlLength","stackTraceLimit","autoBreadcrumbs","instrument","sampleRate","_fetchDefaults","keepalive","_ignoreOnError","_isRavenInstalled","_originalErrorStackTraceLimit","_originalConsole","_originalConsoleMethods","_plugins","_startTime","_wrappedBuiltIns","_breadcrumbs","_lastCapturedEvent","_keypressTimeout","_location","_lastHref","_resetBackoff","VERSION","config","dsn","options","_logDebug","globalOptions","setDSN","maxBreadcrumbs","min","autoBreadcrumbDefaults","xhr","dom","sentry","instrumentDefaults","tryCatch","install","isSetup","_handleOnErrorStackInfo","_attachPromiseRejectionHandler","_patchFunctionToString","_instrumentTryCatch","_instrumentBreadcrumbs","_drainPlugins","uri","_parseDSN","lastSlash","lastIndexOf","_dsn","user","_globalSecret","pass","_getGlobalServer","_globalEndpoint","context","wrap","_before","__raven_wrapper__","wrapped","deep","_ignoreNextOnError","captureException","property","_detachPromiseRejectionHandler","_unpatchFunctionToString","_restoreBuiltIns","_restoreConsole","_promiseRejectionHandler","event","reason","unhandledPromiseRejection","bind","addEventListener","removeEventListener","trimHeadFrames","captureMessage","_getCaptureExceptionOptionsFromPlainObject","_handleStackInfo","currentOptions","exKeys","sort","fingerprint","md5","__serialized__","initialCall","fileurl","_prepareFrames","_send","captureBreadcrumb","crumb","timestamp","breadcrumbCallback","shift","addPlugin","plugin","pluginArgs","setUserContext","setExtraContext","_mergeContext","setTagsContext","tags","clearContext","getContext","setEnvironment","environment","setRelease","setDataCallback","dataCallback","setBreadcrumbCallback","setShouldSendCallback","shouldSendCallback","setTransport","transport","lastEventId","ravenNotConfiguredError","afterLoad","RavenConfig","showReportDialog","eventId","encode","qs","email","globalServer","script","createElement","async","src","head","body","appendChild","_triggerEvent","eventType","evt","toUpperCase","createEvent","initEvent","createEventObject","dispatchEvent","fireEvent","_breadcrumbEventHandler","evtName","target","category","_keypressEventHandler","isContentEditable","timeout","clearTimeout","_captureUrlChange","from","to","parsedLoc","parsedTo","parsedFrom","_originalFunctionToString","wrappedBuiltIns","wrapTimeFn","fn","originalCallback","wrapEventTarget","proto","capture","secure","handleEvent","before","clickHandler","keypressHandler","requestAnimationFrame","cb","eventTargets","wrapProp","prop","xhrproto","XMLHttpRequest","origOpen","__raven_xhr","status_code","origSend","onreadystatechangeHandler","readyState","status","props","onreadystatechange","origFetch","fetchInput","fetchData","then","response","attachEvent","hasPushAndReplaceState","app","runtime","history","pushState","replaceState","oldOnPopState","onpopstate","currentHref","historyReplacementFunction","origHistFunction","log","consoleMethodCallback","builtin","installer","m","allowSecretKey","port","_processException","frame","_normalizeFrame","in_app","stackInfoUrl","normalized","function","prefixedMessage","culprit","_trimPacket","request","Referer","breadcrumbs","_trimBreadcrumbs","urlProp","urlProps","_getHttpData","httpData","userAgent","User-Agent","referrer","_backoffDuration","_backoffStart","_shouldBackoff","_isRepeatData","current","last","_setBackoffState","retry","get","getResponseHeader","parseInt","baseData","project","platform","serverName","server_name","_sanitizeData","forEach","_sendProcessedPayload","_getUuid","allowDuplicates","event_id","auth","sentry_version","sentry_client","sentry_key","sentry_secret","_makeRequest","onSuccess","onError","opts","evaluatedHeaders","evaluatedFetchParameters","_evaluateHash","fetchParameters","defaultFetchOptions","fetchOptions","fetch","ok","XDomainRequest","onload","open","setRequestHeader","send","evaluated","setUser","setReleaseContext","raven","_Raven","RavenConstructor","noConflict","isLive","singleton","Client","shr","setup","classList","remove","keyCode","activeElement","add","player","Plyr","buttons","querySelectorAll","types","currentType","historySupport","toggleClass","state","newSource","init","video","audio","youtube","vimeo","button","parentElement","querySelector","cite","setAttribute","removeAttribute","GoogleAnalyticsObject","l","getElementsByTagName","insertBefore","ga"],"mappings":"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","file":"demo.min.js","sourcesContent":["/*\n json-stringify-safe\n Like JSON.stringify, but doesn't throw on circular references.\n\n Originally forked from https://github.com/isaacs/json-stringify-safe\n version 5.0.1 on 3/8/2017 and modified to handle Errors serialization\n and IE8 compatibility. Tests for this are in test/vendor.\n\n ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE\n*/\n\nexports = module.exports = stringify;\nexports.getSerialize = serializer;\n\nfunction indexOf(haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) return i;\n }\n return -1;\n}\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);\n}\n\n// https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106\nfunction stringifyError(value) {\n var err = {\n // These properties are implemented as magical getters and don't show up in for in\n stack: value.stack,\n message: value.message,\n name: value.name\n };\n\n for (var i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n err[i] = value[i];\n }\n }\n\n return err;\n}\n\nfunction serializer(replacer, cycleReplacer) {\n var stack = [];\n var keys = [];\n\n if (cycleReplacer == null) {\n cycleReplacer = function(key, value) {\n if (stack[0] === value) {\n return '[Circular ~]';\n }\n return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']';\n };\n }\n\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = indexOf(stack, this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n\n if (~indexOf(stack, value)) {\n value = cycleReplacer.call(this, key, value);\n }\n } else {\n stack.push(value);\n }\n\n return replacer == null\n ? value instanceof Error ? stringifyError(value) : value\n : replacer.call(this, key, value);\n };\n}\n","var stringify = require('../vendor/json-stringify-safe/stringify');\n\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction isObject(what) {\n return typeof what === 'object' && what !== null;\n}\n\n// Yanked from https://git.io/vS8DV re-used under CC0\n// with some tiny modifications\nfunction isError(value) {\n switch ({}.toString.call(value)) {\n case '[object Error]':\n return true;\n case '[object Exception]':\n return true;\n case '[object DOMException]':\n return true;\n default:\n return value instanceof Error;\n }\n}\n\nfunction isErrorEvent(value) {\n return supportsErrorEvent() && {}.toString.call(value) === '[object ErrorEvent]';\n}\n\nfunction isUndefined(what) {\n return what === void 0;\n}\n\nfunction isFunction(what) {\n return typeof what === 'function';\n}\n\nfunction isPlainObject(what) {\n return Object.prototype.toString.call(what) === '[object Object]';\n}\n\nfunction isString(what) {\n return Object.prototype.toString.call(what) === '[object String]';\n}\n\nfunction isArray(what) {\n return Object.prototype.toString.call(what) === '[object Array]';\n}\n\nfunction isEmptyObject(what) {\n if (!isPlainObject(what)) return false;\n\n for (var _ in what) {\n if (what.hasOwnProperty(_)) {\n return false;\n }\n }\n return true;\n}\n\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent(''); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsFetch() {\n if (!('fetch' in _window)) return false;\n\n try {\n new Headers(); // eslint-disable-line no-new\n new Request(''); // eslint-disable-line no-new\n new Response(); // eslint-disable-line no-new\n return true;\n } catch (e) {\n return false;\n }\n}\n\n// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n// https://caniuse.com/#feat=referrer-policy\n// It doesn't. And it throw exception instead of ignoring this parameter...\n// REF: https://github.com/getsentry/raven-js/issues/1233\nfunction supportsReferrerPolicy() {\n if (!supportsFetch()) return false;\n\n try {\n // eslint-disable-next-line no-new\n new Request('pickleRick', {\n referrerPolicy: 'origin'\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction supportsPromiseRejectionEvent() {\n return typeof PromiseRejectionEvent === 'function';\n}\n\nfunction wrappedCallback(callback) {\n function dataCallback(data, original) {\n var normalizedData = callback(data) || data;\n if (original) {\n return original(normalizedData) || normalizedData;\n }\n return normalizedData;\n }\n\n return dataCallback;\n}\n\nfunction each(obj, callback) {\n var i, j;\n\n if (isUndefined(obj.length)) {\n for (i in obj) {\n if (hasKey(obj, i)) {\n callback.call(null, i, obj[i]);\n }\n }\n } else {\n j = obj.length;\n if (j) {\n for (i = 0; i < j; i++) {\n callback.call(null, i, obj[i]);\n }\n }\n }\n}\n\nfunction objectMerge(obj1, obj2) {\n if (!obj2) {\n return obj1;\n }\n each(obj2, function(key, value) {\n obj1[key] = value;\n });\n return obj1;\n}\n\n/**\n * This function is only used for react-native.\n * react-native freezes object that have already been sent over the\n * js bridge. We need this function in order to check if the object is frozen.\n * So it's ok that objectFrozen returns false if Object.isFrozen is not\n * supported because it's not relevant for other \"platforms\". See related issue:\n * https://github.com/getsentry/react-native-sentry/issues/57\n */\nfunction objectFrozen(obj) {\n if (!Object.isFrozen) {\n return false;\n }\n return Object.isFrozen(obj);\n}\n\nfunction truncate(str, max) {\n if (typeof max !== 'number') {\n throw new Error('2nd argument to `truncate` function should be a number');\n }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + '\\u2026';\n}\n\n/**\n * hasKey, a better form of hasOwnProperty\n * Example: hasKey(MainHostObject, property) === true/false\n *\n * @param {Object} host object to check property\n * @param {string} key to check\n */\nfunction hasKey(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction joinRegExp(patterns) {\n // Combine an array of regular expressions and strings into one large regexp\n // Be mad.\n var sources = [],\n i = 0,\n len = patterns.length,\n pattern;\n\n for (; i < len; i++) {\n pattern = patterns[i];\n if (isString(pattern)) {\n // If it's a string, we need to escape it\n // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n sources.push(pattern.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'));\n } else if (pattern && pattern.source) {\n // If it's a regexp already, we want to extract the source\n sources.push(pattern.source);\n }\n // Intentionally skip other cases\n }\n return new RegExp(sources.join('|'), 'i');\n}\n\nfunction urlencode(o) {\n var pairs = [];\n each(o, function(key, value) {\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n });\n return pairs.join('&');\n}\n\n// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n// intentionally using regex and not href parsing trick because React Native and other\n// environments where DOM might not be available\nfunction parseUrl(url) {\n if (typeof url !== 'string') return {};\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n var query = match[6] || '';\n var fragment = match[8] || '';\n return {\n protocol: match[2],\n host: match[4],\n path: match[5],\n relative: match[5] + query + fragment // everything minus origin\n };\n}\nfunction uuid4() {\n var crypto = _window.crypto || _window.msCrypto;\n\n if (!isUndefined(crypto) && crypto.getRandomValues) {\n // Use window.crypto API if available\n // eslint-disable-next-line no-undef\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n\n // set 4 in byte 7\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n var pad = function(num) {\n var v = num.toString(16);\n while (v.length < 4) {\n v = '0' + v;\n }\n return v;\n };\n\n return (\n pad(arr[0]) +\n pad(arr[1]) +\n pad(arr[2]) +\n pad(arr[3]) +\n pad(arr[4]) +\n pad(arr[5]) +\n pad(arr[6]) +\n pad(arr[7])\n );\n } else {\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (Math.random() * 16) | 0,\n v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @param elem\n * @returns {string}\n */\nfunction htmlTreeAsString(elem) {\n /* eslint no-extra-parens:0*/\n var MAX_TRAVERSE_HEIGHT = 5,\n MAX_OUTPUT_LEN = 80,\n out = [],\n height = 0,\n len = 0,\n separator = ' > ',\n sepLength = separator.length,\n nextStr;\n\n while (elem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = htmlElementAsString(elem);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n // (ignore this limit if we are on the first iteration)\n if (\n nextStr === 'html' ||\n (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)\n ) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n elem = elem.parentNode;\n }\n\n return out.reverse().join(separator);\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @param HTMLElement\n * @returns {string}\n */\nfunction htmlElementAsString(elem) {\n var out = [],\n className,\n classes,\n key,\n attr,\n i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push('#' + elem.id);\n }\n\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push('.' + classes[i]);\n }\n }\n var attrWhitelist = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < attrWhitelist.length; i++) {\n key = attrWhitelist[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push('[' + key + '=\"' + attr + '\"]');\n }\n }\n return out.join('');\n}\n\n/**\n * Returns true if either a OR b is truthy, but not both\n */\nfunction isOnlyOneTruthy(a, b) {\n return !!(!!a ^ !!b);\n}\n\n/**\n * Returns true if both parameters are undefined\n */\nfunction isBothUndefined(a, b) {\n return isUndefined(a) && isUndefined(b);\n}\n\n/**\n * Returns true if the two input exception interfaces have the same content\n */\nfunction isSameException(ex1, ex2) {\n if (isOnlyOneTruthy(ex1, ex2)) return false;\n\n ex1 = ex1.values[0];\n ex2 = ex2.values[0];\n\n if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false;\n\n // in case both stacktraces are undefined, we can't decide so default to false\n if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false;\n\n return isSameStacktrace(ex1.stacktrace, ex2.stacktrace);\n}\n\n/**\n * Returns true if the two input stack trace interfaces have the same content\n */\nfunction isSameStacktrace(stack1, stack2) {\n if (isOnlyOneTruthy(stack1, stack2)) return false;\n\n var frames1 = stack1.frames;\n var frames2 = stack2.frames;\n\n // Exit early if frame count differs\n if (frames1.length !== frames2.length) return false;\n\n // Iterate through every frame; bail out if anything differs\n var a, b;\n for (var i = 0; i < frames1.length; i++) {\n a = frames1[i];\n b = frames2[i];\n if (\n a.filename !== b.filename ||\n a.lineno !== b.lineno ||\n a.colno !== b.colno ||\n a['function'] !== b['function']\n )\n return false;\n }\n return true;\n}\n\n/**\n * Polyfill a method\n * @param obj object e.g. `document`\n * @param name method name present on object e.g. `addEventListener`\n * @param replacement replacement function\n * @param track {optional} record instrumentation to an array\n */\nfunction fill(obj, name, replacement, track) {\n if (obj == null) return;\n var orig = obj[name];\n obj[name] = replacement(orig);\n obj[name].__raven__ = true;\n obj[name].__orig__ = orig;\n if (track) {\n track.push([obj, name, orig]);\n }\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns {string}\n */\nfunction safeJoin(input, delimiter) {\n if (!isArray(input)) return '';\n\n var output = [];\n\n for (var i = 0; i < input.length; i++) {\n try {\n output.push(String(input[i]));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n// Default Node.js REPL depth\nvar MAX_SERIALIZE_EXCEPTION_DEPTH = 3;\n// 50kB, as 100kB is max payload size, so half sounds reasonable\nvar MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024;\nvar MAX_SERIALIZE_KEYS_LENGTH = 40;\n\nfunction utf8Length(value) {\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nfunction serializeValue(value) {\n if (typeof value === 'string') {\n var maxLength = 40;\n return truncate(value, maxLength);\n } else if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'undefined'\n ) {\n return value;\n }\n\n var type = Object.prototype.toString.call(value);\n\n // Node.js REPL notation\n if (type === '[object Object]') return '[Object]';\n if (type === '[object Array]') return '[Array]';\n if (type === '[object Function]')\n return value.name ? '[Function: ' + value.name + ']' : '[Function]';\n\n return value;\n}\n\nfunction serializeObject(value, depth) {\n if (depth === 0) return serializeValue(value);\n\n if (isPlainObject(value)) {\n return Object.keys(value).reduce(function(acc, key) {\n acc[key] = serializeObject(value[key], depth - 1);\n return acc;\n }, {});\n } else if (Array.isArray(value)) {\n return value.map(function(val) {\n return serializeObject(val, depth - 1);\n });\n }\n\n return serializeValue(value);\n}\n\nfunction serializeException(ex, depth, maxSize) {\n if (!isPlainObject(ex)) return ex;\n\n depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth;\n maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize;\n\n var serialized = serializeObject(ex, depth);\n\n if (jsonSize(stringify(serialized)) > maxSize) {\n return serializeException(ex, depth - 1);\n }\n\n return serialized;\n}\n\nfunction serializeKeysForMessage(keys, maxLength) {\n if (typeof keys === 'number' || typeof keys === 'string') return keys.toString();\n if (!Array.isArray(keys)) return '';\n\n keys = keys.filter(function(key) {\n return typeof key === 'string';\n });\n if (keys.length === 0) return '[object has no keys]';\n\n maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength;\n if (keys[0].length >= maxLength) return keys[0];\n\n for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) {\n var serialized = keys.slice(0, usedKeys).join(', ');\n if (serialized.length > maxLength) continue;\n if (usedKeys === keys.length) return serialized;\n return serialized + '\\u2026';\n }\n\n return '';\n}\n\nfunction sanitize(input, sanitizeKeys) {\n if (!isArray(sanitizeKeys) || (isArray(sanitizeKeys) && sanitizeKeys.length === 0))\n return input;\n\n var sanitizeRegExp = joinRegExp(sanitizeKeys);\n var sanitizeMask = '********';\n var safeInput;\n\n try {\n safeInput = JSON.parse(stringify(input));\n } catch (o_O) {\n return input;\n }\n\n function sanitizeWorker(workerInput) {\n if (isArray(workerInput)) {\n return workerInput.map(function(val) {\n return sanitizeWorker(val);\n });\n }\n\n if (isPlainObject(workerInput)) {\n return Object.keys(workerInput).reduce(function(acc, k) {\n if (sanitizeRegExp.test(k)) {\n acc[k] = sanitizeMask;\n } else {\n acc[k] = sanitizeWorker(workerInput[k]);\n }\n return acc;\n }, {});\n }\n\n return workerInput;\n }\n\n return sanitizeWorker(safeInput);\n}\n\nmodule.exports = {\n isObject: isObject,\n isError: isError,\n isErrorEvent: isErrorEvent,\n isUndefined: isUndefined,\n isFunction: isFunction,\n isPlainObject: isPlainObject,\n isString: isString,\n isArray: isArray,\n isEmptyObject: isEmptyObject,\n supportsErrorEvent: supportsErrorEvent,\n supportsFetch: supportsFetch,\n supportsReferrerPolicy: supportsReferrerPolicy,\n supportsPromiseRejectionEvent: supportsPromiseRejectionEvent,\n wrappedCallback: wrappedCallback,\n each: each,\n objectMerge: objectMerge,\n truncate: truncate,\n objectFrozen: objectFrozen,\n hasKey: hasKey,\n joinRegExp: joinRegExp,\n urlencode: urlencode,\n uuid4: uuid4,\n htmlTreeAsString: htmlTreeAsString,\n htmlElementAsString: htmlElementAsString,\n isSameException: isSameException,\n isSameStacktrace: isSameStacktrace,\n parseUrl: parseUrl,\n fill: fill,\n safeJoin: safeJoin,\n serializeException: serializeException,\n serializeKeysForMessage: serializeKeysForMessage,\n sanitize: sanitize\n};\n","var utils = require('../../src/utils');\n\n/*\n TraceKit - Cross brower stack traces\n\n This was originally forked from github.com/occ/TraceKit, but has since been\n largely re-written and is now maintained as part of raven-js. Tests for\n this are in test/vendor.\n\n MIT license\n*/\n\nvar TraceKit = {\n collectWindowErrors: true,\n debug: false\n};\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types\nvar ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;\n\nfunction getLocationHref() {\n if (typeof document === 'undefined' || document.location == null) return '';\n\n return document.location.href;\n}\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Remove all crash handlers.\n */\n function unsubscribeAll() {\n uninstallGlobalHandler();\n handlers = [];\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (handlers.hasOwnProperty(i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} msg Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} colNo The column number at which the error\n * occurred.\n * @param {?Error} ex The actual Error object.\n */\n function traceKitWindowOnError(msg, url, lineNo, colNo, ex) {\n var stack = null;\n // If 'ex' is ErrorEvent, get real Error from inside\n var exception = utils.isErrorEvent(ex) ? ex.error : ex;\n // If 'msg' is ErrorEvent, get real message from inside\n var message = utils.isErrorEvent(msg) ? msg.message : msg;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(\n lastExceptionStack,\n url,\n lineNo,\n message\n );\n processLastException();\n } else if (exception && utils.isError(exception)) {\n // non-string `exception` arg; attempt to extract stack trace\n\n // New chrome and blink send along a real error object\n // Let's just report that like a normal error.\n // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n stack = TraceKit.computeStackTrace(exception);\n notifyHandlers(stack, true);\n } else {\n var location = {\n url: url,\n line: lineNo,\n column: colNo\n };\n\n var name = undefined;\n var groups;\n\n if ({}.toString.call(message) === '[object String]') {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n\n location.func = UNKNOWN_FUNCTION;\n\n stack = {\n name: name,\n message: message,\n url: getLocationHref(),\n stack: [location]\n };\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler() {\n if (_onErrorHandlerInstalled) {\n return;\n }\n _oldOnerrorHandler = _window.onerror;\n _window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function uninstallGlobalHandler() {\n if (!_onErrorHandlerInstalled) {\n return;\n }\n _window.onerror = _oldOnerrorHandler;\n _onErrorHandlerInstalled = false;\n _oldOnerrorHandler = undefined;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n * @param {?boolean} rethrow If false, do not re-throw the exception.\n * Only used for window.onerror to not cause an infinite loop of\n * rethrowing.\n */\n function report(ex, rethrow) {\n var args = _slice.call(arguments, 1);\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = args;\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n setTimeout(function() {\n if (lastException === ex) {\n processLastException();\n }\n }, stack.incomplete ? 2000 : 0);\n\n if (rethrow !== false) {\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n report.uninstall = unsubscribeAll;\n return report;\n})();\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (typeof ex.stack === 'undefined' || !ex.stack) return;\n\n var chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n var winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n // NOTE: blob urls are now supposed to always have an origin, therefore it's format\n // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\\/` as well\n var gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*bundle)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n // Used to additionally parse URL/line/column from eval frames\n var geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n var chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n var lines = ex.stack.split('\\n');\n var stack = [];\n var submatch;\n var parts;\n var element;\n var reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n url: !isNative ? parts[2] : null,\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = null; // no column when eval\n } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n }\n\n /**\n * Adds information about the first frame to incomplete stack traces.\n * Safari and IE require this to get complete data on the first frame.\n * @param {Object.} stackInfo Stack trace information from\n * one of the compute* methods.\n * @param {string} url The URL of the script that caused an error.\n * @param {(number|string)} lineNo The line number of the script that\n * caused an error.\n * @param {string=} message The error generated by the browser, which\n * hopefully contains the name of the object that caused the error.\n * @return {boolean} Whether or not the stack information was\n * augmented.\n */\n function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {\n var initial = {\n url: url,\n line: lineNo\n };\n\n if (initial.url && initial.line) {\n stackInfo.incomplete = false;\n\n if (!initial.func) {\n initial.func = UNKNOWN_FUNCTION;\n }\n\n if (stackInfo.stack.length > 0) {\n if (stackInfo.stack[0].url === initial.url) {\n if (stackInfo.stack[0].line === initial.line) {\n return false; // already in stack trace\n } else if (\n !stackInfo.stack[0].line &&\n stackInfo.stack[0].func === initial.func\n ) {\n stackInfo.stack[0].line = initial.line;\n return false;\n }\n }\n }\n\n stackInfo.stack.unshift(initial);\n stackInfo.partial = true;\n return true;\n } else {\n stackInfo.incomplete = true;\n }\n\n return false;\n }\n\n /**\n * Computes stack trace information by walking the arguments.caller\n * chain at the time the exception occurred. This will cause earlier\n * frames to be missed but is the only way to get any stack trace in\n * Safari and IE. The top frame is restored by\n * {@link augmentStackTraceWithInitialElement}.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceByWalkingCallerChain(ex, depth) {\n var functionName = /function\\s+([_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*)?\\s*\\(/i,\n stack = [],\n funcs = {},\n recursion = false,\n parts,\n item,\n source;\n\n for (\n var curr = computeStackTraceByWalkingCallerChain.caller;\n curr && !recursion;\n curr = curr.caller\n ) {\n if (curr === computeStackTrace || curr === TraceKit.report) {\n // console.log('skipping internal function');\n continue;\n }\n\n item = {\n url: null,\n func: UNKNOWN_FUNCTION,\n line: null,\n column: null\n };\n\n if (curr.name) {\n item.func = curr.name;\n } else if ((parts = functionName.exec(curr.toString()))) {\n item.func = parts[1];\n }\n\n if (typeof item.func === 'undefined') {\n try {\n item.func = parts.input.substring(0, parts.input.indexOf('{'));\n } catch (e) {}\n }\n\n if (funcs['' + curr]) {\n recursion = true;\n } else {\n funcs['' + curr] = true;\n }\n\n stack.push(item);\n }\n\n if (depth) {\n // console.log('depth is ' + depth);\n // console.log('stack is ' + stack.length);\n stack.splice(0, depth);\n }\n\n var result = {\n name: ex.name,\n message: ex.message,\n url: getLocationHref(),\n stack: stack\n };\n augmentStackTraceWithInitialElement(\n result,\n ex.sourceURL || ex.fileName,\n ex.line || ex.lineNumber,\n ex.message || ex.description\n );\n return result;\n }\n\n /**\n * Computes a stack trace for an exception.\n * @param {Error} ex\n * @param {(string|number)=} depth\n */\n function computeStackTrace(ex, depth) {\n var stack = null;\n depth = depth == null ? 0 : +depth;\n\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n\n try {\n stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);\n if (stack) {\n return stack;\n }\n } catch (e) {\n if (TraceKit.debug) {\n throw e;\n }\n }\n return {\n name: ex.name,\n message: ex.message,\n url: getLocationHref()\n };\n }\n\n computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;\n computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp;\n\n return computeStackTrace;\n})();\n\nmodule.exports = TraceKit;\n","/*\n * JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n* Add integers, wrapping at 2^32. This uses 16-bit operations internally\n* to work around bugs in some JS interpreters.\n*/\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xffff);\n}\n\n/*\n* Bitwise rotate a 32-bit number to the left.\n*/\nfunction bitRotateLeft(num, cnt) {\n return (num << cnt) | (num >>> (32 - cnt));\n}\n\n/*\n* These functions implement the four basic operations the algorithm uses.\n*/\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn((b & c) | (~b & d), a, b, x, s, t);\n}\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t);\n}\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/*\n* Calculate the MD5 of an array of little-endian words, and a bit length.\n*/\nfunction binlMD5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << (len % 32);\n x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n var i;\n var olda;\n var oldb;\n var oldc;\n var oldd;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (i = 0; i < x.length; i += 16) {\n olda = a;\n oldb = b;\n oldc = c;\n oldd = d;\n\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n return [a, b, c, d];\n}\n\n/*\n* Convert an array of little-endian words to a string\n*/\nfunction binl2rstr(input) {\n var i;\n var output = '';\n var length32 = input.length * 32;\n for (i = 0; i < length32; i += 8) {\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);\n }\n return output;\n}\n\n/*\n* Convert a raw string to an array of little-endian words\n* Characters >255 have their high-byte silently ignored.\n*/\nfunction rstr2binl(input) {\n var i;\n var output = [];\n output[(input.length >> 2) - 1] = undefined;\n for (i = 0; i < output.length; i += 1) {\n output[i] = 0;\n }\n var length8 = input.length * 8;\n for (i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);\n }\n return output;\n}\n\n/*\n* Calculate the MD5 of a raw string\n*/\nfunction rstrMD5(s) {\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));\n}\n\n/*\n* Calculate the HMAC-MD5, of a key and some data (raw strings)\n*/\nfunction rstrHMACMD5(key, data) {\n var i;\n var bkey = rstr2binl(key);\n var ipad = [];\n var opad = [];\n var hash;\n ipad[15] = opad[15] = undefined;\n if (bkey.length > 16) {\n bkey = binlMD5(bkey, key.length * 8);\n }\n for (i = 0; i < 16; i += 1) {\n ipad[i] = bkey[i] ^ 0x36363636;\n opad[i] = bkey[i] ^ 0x5c5c5c5c;\n }\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));\n}\n\n/*\n* Convert a raw string to a hex string\n*/\nfunction rstr2hex(input) {\n var hexTab = '0123456789abcdef';\n var output = '';\n var x;\n var i;\n for (i = 0; i < input.length; i += 1) {\n x = input.charCodeAt(i);\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);\n }\n return output;\n}\n\n/*\n* Encode a string as utf-8\n*/\nfunction str2rstrUTF8(input) {\n return unescape(encodeURIComponent(input));\n}\n\n/*\n* Take string arguments and return either raw or hex encoded strings\n*/\nfunction rawMD5(s) {\n return rstrMD5(str2rstrUTF8(s));\n}\nfunction hexMD5(s) {\n return rstr2hex(rawMD5(s));\n}\nfunction rawHMACMD5(k, d) {\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));\n}\nfunction hexHMACMD5(k, d) {\n return rstr2hex(rawHMACMD5(k, d));\n}\n\nfunction md5(string, key, raw) {\n if (!key) {\n if (!raw) {\n return hexMD5(string);\n }\n return rawMD5(string);\n }\n if (!raw) {\n return hexHMACMD5(key, string);\n }\n return rawHMACMD5(key, string);\n}\n\nmodule.exports = md5;\n","function RavenConfigError(message) {\n this.name = 'RavenConfigError';\n this.message = message;\n}\nRavenConfigError.prototype = new Error();\nRavenConfigError.prototype.constructor = RavenConfigError;\n\nmodule.exports = RavenConfigError;\n","var utils = require('./utils');\n\nvar wrapMethod = function(console, level, callback) {\n var originalConsoleLevel = console[level];\n var originalConsole = console;\n\n if (!(level in console)) {\n return;\n }\n\n var sentryLevel = level === 'warn' ? 'warning' : level;\n\n console[level] = function() {\n var args = [].slice.call(arguments);\n\n var msg = utils.safeJoin(args, ' ');\n var data = {level: sentryLevel, logger: 'console', extra: {arguments: args}};\n\n if (level === 'assert') {\n if (args[0] === false) {\n // Default browsers message\n msg =\n 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert');\n data.extra.arguments = args.slice(1);\n callback && callback(msg, data);\n }\n } else {\n callback && callback(msg, data);\n }\n\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n // IE9 doesn't allow calling apply on console functions directly\n // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193\n Function.prototype.apply.call(originalConsoleLevel, originalConsole, args);\n }\n };\n};\n\nmodule.exports = {\n wrapMethod: wrapMethod\n};\n","/*global XDomainRequest:false */\n\nvar TraceKit = require('../vendor/TraceKit/tracekit');\nvar stringify = require('../vendor/json-stringify-safe/stringify');\nvar md5 = require('../vendor/md5/md5');\nvar RavenConfigError = require('./configError');\n\nvar utils = require('./utils');\nvar isError = utils.isError;\nvar isObject = utils.isObject;\nvar isPlainObject = utils.isPlainObject;\nvar isErrorEvent = utils.isErrorEvent;\nvar isUndefined = utils.isUndefined;\nvar isFunction = utils.isFunction;\nvar isString = utils.isString;\nvar isArray = utils.isArray;\nvar isEmptyObject = utils.isEmptyObject;\nvar each = utils.each;\nvar objectMerge = utils.objectMerge;\nvar truncate = utils.truncate;\nvar objectFrozen = utils.objectFrozen;\nvar hasKey = utils.hasKey;\nvar joinRegExp = utils.joinRegExp;\nvar urlencode = utils.urlencode;\nvar uuid4 = utils.uuid4;\nvar htmlTreeAsString = utils.htmlTreeAsString;\nvar isSameException = utils.isSameException;\nvar isSameStacktrace = utils.isSameStacktrace;\nvar parseUrl = utils.parseUrl;\nvar fill = utils.fill;\nvar supportsFetch = utils.supportsFetch;\nvar supportsReferrerPolicy = utils.supportsReferrerPolicy;\nvar serializeKeysForMessage = utils.serializeKeysForMessage;\nvar serializeException = utils.serializeException;\nvar sanitize = utils.sanitize;\n\nvar wrapConsoleMethod = require('./console').wrapMethod;\n\nvar dsnKeys = 'source protocol user pass host port path'.split(' '),\n dsnPattern = /^(?:(\\w+):)?\\/\\/(?:(\\w+)(:\\w+)?@)?([\\w\\.-]+)(?::(\\d+))?(\\/.*)/;\n\nfunction now() {\n return +new Date();\n}\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _document = _window.document;\nvar _navigator = _window.navigator;\n\nfunction keepOriginalCallback(original, callback) {\n return isFunction(callback)\n ? function(data) {\n return callback(data, original);\n }\n : callback;\n}\n\n// First, check for JSON support\n// If there is no JSON, we no-op the core features of Raven\n// since JSON is required to encode the payload\nfunction Raven() {\n this._hasJSON = !!(typeof JSON === 'object' && JSON.stringify);\n // Raven can run in contexts where there's no document (react-native)\n this._hasDocument = !isUndefined(_document);\n this._hasNavigator = !isUndefined(_navigator);\n this._lastCapturedException = null;\n this._lastData = null;\n this._lastEventId = null;\n this._globalServer = null;\n this._globalKey = null;\n this._globalProject = null;\n this._globalContext = {};\n this._globalOptions = {\n // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin\n release: _window.SENTRY_RELEASE && _window.SENTRY_RELEASE.id,\n logger: 'javascript',\n ignoreErrors: [],\n ignoreUrls: [],\n whitelistUrls: [],\n includePaths: [],\n headers: null,\n collectWindowErrors: true,\n captureUnhandledRejections: true,\n maxMessageLength: 0,\n // By default, truncates URL values to 250 chars\n maxUrlLength: 250,\n stackTraceLimit: 50,\n autoBreadcrumbs: true,\n instrument: true,\n sampleRate: 1,\n sanitizeKeys: []\n };\n this._fetchDefaults = {\n method: 'POST',\n keepalive: true,\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n };\n this._ignoreOnError = 0;\n this._isRavenInstalled = false;\n this._originalErrorStackTraceLimit = Error.stackTraceLimit;\n // capture references to window.console *and* all its methods first\n // before the console plugin has a chance to monkey patch\n this._originalConsole = _window.console || {};\n this._originalConsoleMethods = {};\n this._plugins = [];\n this._startTime = now();\n this._wrappedBuiltIns = [];\n this._breadcrumbs = [];\n this._lastCapturedEvent = null;\n this._keypressTimeout;\n this._location = _window.location;\n this._lastHref = this._location && this._location.href;\n this._resetBackoff();\n\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsole) {\n this._originalConsoleMethods[method] = this._originalConsole[method];\n }\n}\n\n/*\n * The core Raven singleton\n *\n * @this {Raven}\n */\n\nRaven.prototype = {\n // Hardcode version string so that raven source can be loaded directly via\n // webpack (using a build step causes webpack #1617). Grunt verifies that\n // this value matches package.json during build.\n // See: https://github.com/getsentry/raven-js/issues/465\n VERSION: '3.24.2',\n\n debug: false,\n\n TraceKit: TraceKit, // alias to TraceKit\n\n /*\n * Configure Raven with a DSN and extra options\n *\n * @param {string} dsn The public Sentry DSN\n * @param {object} options Set of global options [optional]\n * @return {Raven}\n */\n config: function(dsn, options) {\n var self = this;\n\n if (self._globalServer) {\n this._logDebug('error', 'Error: Raven has already been configured');\n return self;\n }\n if (!dsn) return self;\n\n var globalOptions = self._globalOptions;\n\n // merge in options\n if (options) {\n each(options, function(key, value) {\n // tags and extra are special and need to be put into context\n if (key === 'tags' || key === 'extra' || key === 'user') {\n self._globalContext[key] = value;\n } else {\n globalOptions[key] = value;\n }\n });\n }\n\n self.setDSN(dsn);\n\n // \"Script error.\" is hard coded into browsers for errors that it can't read.\n // this is the result of a script being pulled in from an external domain and CORS.\n globalOptions.ignoreErrors.push(/^Script error\\.?$/);\n globalOptions.ignoreErrors.push(/^Javascript error: Script error\\.? on line 0$/);\n\n // join regexp rules into one big rule\n globalOptions.ignoreErrors = joinRegExp(globalOptions.ignoreErrors);\n globalOptions.ignoreUrls = globalOptions.ignoreUrls.length\n ? joinRegExp(globalOptions.ignoreUrls)\n : false;\n globalOptions.whitelistUrls = globalOptions.whitelistUrls.length\n ? joinRegExp(globalOptions.whitelistUrls)\n : false;\n globalOptions.includePaths = joinRegExp(globalOptions.includePaths);\n globalOptions.maxBreadcrumbs = Math.max(\n 0,\n Math.min(globalOptions.maxBreadcrumbs || 100, 100)\n ); // default and hard limit is 100\n\n var autoBreadcrumbDefaults = {\n xhr: true,\n console: true,\n dom: true,\n location: true,\n sentry: true\n };\n\n var autoBreadcrumbs = globalOptions.autoBreadcrumbs;\n if ({}.toString.call(autoBreadcrumbs) === '[object Object]') {\n autoBreadcrumbs = objectMerge(autoBreadcrumbDefaults, autoBreadcrumbs);\n } else if (autoBreadcrumbs !== false) {\n autoBreadcrumbs = autoBreadcrumbDefaults;\n }\n globalOptions.autoBreadcrumbs = autoBreadcrumbs;\n\n var instrumentDefaults = {\n tryCatch: true\n };\n\n var instrument = globalOptions.instrument;\n if ({}.toString.call(instrument) === '[object Object]') {\n instrument = objectMerge(instrumentDefaults, instrument);\n } else if (instrument !== false) {\n instrument = instrumentDefaults;\n }\n globalOptions.instrument = instrument;\n\n TraceKit.collectWindowErrors = !!globalOptions.collectWindowErrors;\n\n // return for chaining\n return self;\n },\n\n /*\n * Installs a global window.onerror error handler\n * to capture and report uncaught exceptions.\n * At this point, install() is required to be called due\n * to the way TraceKit is set up.\n *\n * @return {Raven}\n */\n install: function() {\n var self = this;\n if (self.isSetup() && !self._isRavenInstalled) {\n TraceKit.report.subscribe(function() {\n self._handleOnErrorStackInfo.apply(self, arguments);\n });\n\n if (self._globalOptions.captureUnhandledRejections) {\n self._attachPromiseRejectionHandler();\n }\n\n self._patchFunctionToString();\n\n if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) {\n self._instrumentTryCatch();\n }\n\n if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs();\n\n // Install all of the plugins\n self._drainPlugins();\n\n self._isRavenInstalled = true;\n }\n\n Error.stackTraceLimit = self._globalOptions.stackTraceLimit;\n return this;\n },\n\n /*\n * Set the DSN (can be called multiple time unlike config)\n *\n * @param {string} dsn The public Sentry DSN\n */\n setDSN: function(dsn) {\n var self = this,\n uri = self._parseDSN(dsn),\n lastSlash = uri.path.lastIndexOf('/'),\n path = uri.path.substr(1, lastSlash);\n\n self._dsn = dsn;\n self._globalKey = uri.user;\n self._globalSecret = uri.pass && uri.pass.substr(1);\n self._globalProject = uri.path.substr(lastSlash + 1);\n\n self._globalServer = self._getGlobalServer(uri);\n\n self._globalEndpoint =\n self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/';\n\n // Reset backoff state since we may be pointing at a\n // new project/server\n this._resetBackoff();\n },\n\n /*\n * Wrap code within a context so Raven can capture errors\n * reliably across domains that is executed immediately.\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The callback to be immediately executed within the context\n * @param {array} args An array of arguments to be called with the callback [optional]\n */\n context: function(options, func, args) {\n if (isFunction(options)) {\n args = func || [];\n func = options;\n options = undefined;\n }\n\n return this.wrap(options, func).apply(this, args);\n },\n\n /*\n * Wrap code within a context and returns back a new function to be executed\n *\n * @param {object} options A specific set of options for this context [optional]\n * @param {function} func The function to be wrapped in a new context\n * @param {function} func A function to call before the try/catch wrapper [optional, private]\n * @return {function} The newly wrapped functions with a context\n */\n wrap: function(options, func, _before) {\n var self = this;\n // 1 argument has been passed, and it's not a function\n // so just return it\n if (isUndefined(func) && !isFunction(options)) {\n return options;\n }\n\n // options is optional\n if (isFunction(options)) {\n func = options;\n options = undefined;\n }\n\n // At this point, we've passed along 2 arguments, and the second one\n // is not a function either, so we'll just return the second argument.\n if (!isFunction(func)) {\n return func;\n }\n\n // We don't wanna wrap it twice!\n try {\n if (func.__raven__) {\n return func;\n }\n\n // If this has already been wrapped in the past, return that\n if (func.__raven_wrapper__) {\n return func.__raven_wrapper__;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return func;\n }\n\n function wrapped() {\n var args = [],\n i = arguments.length,\n deep = !options || (options && options.deep !== false);\n\n if (_before && isFunction(_before)) {\n _before.apply(this, arguments);\n }\n\n // Recursively wrap all of a function's arguments that are\n // functions themselves.\n while (i--) args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];\n\n try {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means Raven caught an error invoking your application code. This is\n // expected behavior and NOT indicative of a bug with Raven.js.\n return func.apply(this, args);\n } catch (e) {\n self._ignoreNextOnError();\n self.captureException(e, options);\n throw e;\n }\n }\n\n // copy over properties of the old function\n for (var property in func) {\n if (hasKey(func, property)) {\n wrapped[property] = func[property];\n }\n }\n wrapped.prototype = func.prototype;\n\n func.__raven_wrapper__ = wrapped;\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n wrapped.__raven__ = true;\n wrapped.__orig__ = func;\n\n return wrapped;\n },\n\n /**\n * Uninstalls the global error handler.\n *\n * @return {Raven}\n */\n uninstall: function() {\n TraceKit.report.uninstall();\n\n this._detachPromiseRejectionHandler();\n this._unpatchFunctionToString();\n this._restoreBuiltIns();\n this._restoreConsole();\n\n Error.stackTraceLimit = this._originalErrorStackTraceLimit;\n this._isRavenInstalled = false;\n\n return this;\n },\n\n /**\n * Callback used for `unhandledrejection` event\n *\n * @param {PromiseRejectionEvent} event An object containing\n * promise: the Promise that was rejected\n * reason: the value with which the Promise was rejected\n * @return void\n */\n _promiseRejectionHandler: function(event) {\n this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);\n this.captureException(event.reason, {\n extra: {\n unhandledPromiseRejection: true\n }\n });\n },\n\n /**\n * Installs the global promise rejection handler.\n *\n * @return {raven}\n */\n _attachPromiseRejectionHandler: function() {\n this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this);\n _window.addEventListener &&\n _window.addEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Uninstalls the global promise rejection handler.\n *\n * @return {raven}\n */\n _detachPromiseRejectionHandler: function() {\n _window.removeEventListener &&\n _window.removeEventListener('unhandledrejection', this._promiseRejectionHandler);\n return this;\n },\n\n /**\n * Manually capture an exception and send it over to Sentry\n *\n * @param {error} ex An exception to be logged\n * @param {object} options A specific set of options for this error [optional]\n * @return {Raven}\n */\n captureException: function(ex, options) {\n options = objectMerge({trimHeadFrames: 0}, options ? options : {});\n\n if (isErrorEvent(ex) && ex.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n ex = ex.error;\n } else if (isError(ex)) {\n // we have a real Error object\n ex = ex;\n } else if (isPlainObject(ex)) {\n // If it is plain Object, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);\n ex = new Error(options.message);\n } else {\n // If none of previous checks were valid, then it means that\n // it's not a plain Object\n // it's not a valid ErrorEvent (one with an error property)\n // it's not an Error\n // So bail out and capture it as a simple message:\n return this.captureMessage(\n ex,\n objectMerge(options, {\n stacktrace: true, // if we fall back to captureMessage, default to attempting a new trace\n trimHeadFrames: options.trimHeadFrames + 1\n })\n );\n }\n\n // Store the raw exception object for potential debugging and introspection\n this._lastCapturedException = ex;\n\n // TraceKit.report will re-raise any exception passed to it,\n // which means you have to wrap it in try/catch. Instead, we\n // can wrap it here and only re-raise if TraceKit.report\n // raises an exception different from the one we asked to\n // report on.\n try {\n var stack = TraceKit.computeStackTrace(ex);\n this._handleStackInfo(stack, options);\n } catch (ex1) {\n if (ex !== ex1) {\n throw ex1;\n }\n }\n\n return this;\n },\n\n _getCaptureExceptionOptionsFromPlainObject: function(currentOptions, ex) {\n var exKeys = Object.keys(ex).sort();\n var options = objectMerge(currentOptions, {\n message:\n 'Non-Error exception captured with keys: ' + serializeKeysForMessage(exKeys),\n fingerprint: [md5(exKeys)],\n extra: currentOptions.extra || {}\n });\n options.extra.__serialized__ = serializeException(ex);\n\n return options;\n },\n\n /*\n * Manually send a message to Sentry\n *\n * @param {string} msg A plain message to be captured in Sentry\n * @param {object} options A specific set of options for this message [optional]\n * @return {Raven}\n */\n captureMessage: function(msg, options) {\n // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an\n // early call; we'll error on the side of logging anything called before configuration since it's\n // probably something you should see:\n if (\n !!this._globalOptions.ignoreErrors.test &&\n this._globalOptions.ignoreErrors.test(msg)\n ) {\n return;\n }\n\n options = options || {};\n msg = msg + ''; // Make sure it's actually a string\n\n var data = objectMerge(\n {\n message: msg\n },\n options\n );\n\n var ex;\n // Generate a \"synthetic\" stack trace from this point.\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative\n // of a bug with Raven.js. Sentry generates synthetic traces either by configuration,\n // or if it catches a thrown object without a \"stack\" property.\n try {\n throw new Error(msg);\n } catch (ex1) {\n ex = ex1;\n }\n\n // null exception name so `Error` isn't prefixed to msg\n ex.name = null;\n var stack = TraceKit.computeStackTrace(ex);\n\n // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1]\n var initialCall = isArray(stack.stack) && stack.stack[1];\n\n // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call\n // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd\n // initialCall => captureException(string) => captureMessage(string)\n if (initialCall && initialCall.func === 'Raven.captureException') {\n initialCall = stack.stack[2];\n }\n\n var fileurl = (initialCall && initialCall.url) || '';\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n if (this._globalOptions.stacktrace || (options && options.stacktrace)) {\n // fingerprint on msg, not stack trace (legacy behavior, could be revisited)\n data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;\n\n options = objectMerge(\n {\n trimHeadFrames: 0\n },\n options\n );\n // Since we know this is a synthetic trace, the top frame (this function call)\n // MUST be from Raven.js, so mark it for trimming\n // We add to the trim counter so that callers can choose to trim extra frames, such\n // as utility functions.\n options.trimHeadFrames += 1;\n\n var frames = this._prepareFrames(stack, options);\n data.stacktrace = {\n // Sentry expects frames oldest to newest\n frames: frames.reverse()\n };\n }\n\n // Make sure that fingerprint is always wrapped in an array\n if (data.fingerprint) {\n data.fingerprint = isArray(data.fingerprint)\n ? data.fingerprint\n : [data.fingerprint];\n }\n\n // Fire away!\n this._send(data);\n\n return this;\n },\n\n captureBreadcrumb: function(obj) {\n var crumb = objectMerge(\n {\n timestamp: now() / 1000\n },\n obj\n );\n\n if (isFunction(this._globalOptions.breadcrumbCallback)) {\n var result = this._globalOptions.breadcrumbCallback(crumb);\n\n if (isObject(result) && !isEmptyObject(result)) {\n crumb = result;\n } else if (result === false) {\n return this;\n }\n }\n\n this._breadcrumbs.push(crumb);\n if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) {\n this._breadcrumbs.shift();\n }\n return this;\n },\n\n addPlugin: function(plugin /*arg1, arg2, ... argN*/) {\n var pluginArgs = [].slice.call(arguments, 1);\n\n this._plugins.push([plugin, pluginArgs]);\n if (this._isRavenInstalled) {\n this._drainPlugins();\n }\n\n return this;\n },\n\n /*\n * Set/clear a user to be sent along with the payload.\n *\n * @param {object} user An object representing user data [optional]\n * @return {Raven}\n */\n setUserContext: function(user) {\n // Intentionally do not merge here since that's an unexpected behavior.\n this._globalContext.user = user;\n\n return this;\n },\n\n /*\n * Merge extra attributes to be sent along with the payload.\n *\n * @param {object} extra An object representing extra data [optional]\n * @return {Raven}\n */\n setExtraContext: function(extra) {\n this._mergeContext('extra', extra);\n\n return this;\n },\n\n /*\n * Merge tags to be sent along with the payload.\n *\n * @param {object} tags An object representing tags [optional]\n * @return {Raven}\n */\n setTagsContext: function(tags) {\n this._mergeContext('tags', tags);\n\n return this;\n },\n\n /*\n * Clear all of the context.\n *\n * @return {Raven}\n */\n clearContext: function() {\n this._globalContext = {};\n\n return this;\n },\n\n /*\n * Get a copy of the current context. This cannot be mutated.\n *\n * @return {object} copy of context\n */\n getContext: function() {\n // lol javascript\n return JSON.parse(stringify(this._globalContext));\n },\n\n /*\n * Set environment of application\n *\n * @param {string} environment Typically something like 'production'.\n * @return {Raven}\n */\n setEnvironment: function(environment) {\n this._globalOptions.environment = environment;\n\n return this;\n },\n\n /*\n * Set release version of application\n *\n * @param {string} release Typically something like a git SHA to identify version\n * @return {Raven}\n */\n setRelease: function(release) {\n this._globalOptions.release = release;\n\n return this;\n },\n\n /*\n * Set the dataCallback option\n *\n * @param {function} callback The callback to run which allows the\n * data blob to be mutated before sending\n * @return {Raven}\n */\n setDataCallback: function(callback) {\n var original = this._globalOptions.dataCallback;\n this._globalOptions.dataCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the breadcrumbCallback option\n *\n * @param {function} callback The callback to run which allows filtering\n * or mutating breadcrumbs\n * @return {Raven}\n */\n setBreadcrumbCallback: function(callback) {\n var original = this._globalOptions.breadcrumbCallback;\n this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /*\n * Set the shouldSendCallback option\n *\n * @param {function} callback The callback to run which allows\n * introspecting the blob before sending\n * @return {Raven}\n */\n setShouldSendCallback: function(callback) {\n var original = this._globalOptions.shouldSendCallback;\n this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback);\n return this;\n },\n\n /**\n * Override the default HTTP transport mechanism that transmits data\n * to the Sentry server.\n *\n * @param {function} transport Function invoked instead of the default\n * `makeRequest` handler.\n *\n * @return {Raven}\n */\n setTransport: function(transport) {\n this._globalOptions.transport = transport;\n\n return this;\n },\n\n /*\n * Get the latest raw exception that was captured by Raven.\n *\n * @return {error}\n */\n lastException: function() {\n return this._lastCapturedException;\n },\n\n /*\n * Get the last event id\n *\n * @return {string}\n */\n lastEventId: function() {\n return this._lastEventId;\n },\n\n /*\n * Determine if Raven is setup and ready to go.\n *\n * @return {boolean}\n */\n isSetup: function() {\n if (!this._hasJSON) return false; // needs JSON support\n if (!this._globalServer) {\n if (!this.ravenNotConfiguredError) {\n this.ravenNotConfiguredError = true;\n this._logDebug('error', 'Error: Raven has not been configured.');\n }\n return false;\n }\n return true;\n },\n\n afterLoad: function() {\n // TODO: remove window dependence?\n\n // Attempt to initialize Raven on load\n var RavenConfig = _window.RavenConfig;\n if (RavenConfig) {\n this.config(RavenConfig.dsn, RavenConfig.config).install();\n }\n },\n\n showReportDialog: function(options) {\n if (\n !_document // doesn't work without a document (React native)\n )\n return;\n\n options = options || {};\n\n var lastEventId = options.eventId || this.lastEventId();\n if (!lastEventId) {\n throw new RavenConfigError('Missing eventId');\n }\n\n var dsn = options.dsn || this._dsn;\n if (!dsn) {\n throw new RavenConfigError('Missing DSN');\n }\n\n var encode = encodeURIComponent;\n var qs = '';\n qs += '?eventId=' + encode(lastEventId);\n qs += '&dsn=' + encode(dsn);\n\n var user = options.user || this._globalContext.user;\n if (user) {\n if (user.name) qs += '&name=' + encode(user.name);\n if (user.email) qs += '&email=' + encode(user.email);\n }\n\n var globalServer = this._getGlobalServer(this._parseDSN(dsn));\n\n var script = _document.createElement('script');\n script.async = true;\n script.src = globalServer + '/api/embed/error-page/' + qs;\n (_document.head || _document.body).appendChild(script);\n },\n\n /**** Private functions ****/\n _ignoreNextOnError: function() {\n var self = this;\n this._ignoreOnError += 1;\n setTimeout(function() {\n // onerror should trigger before setTimeout\n self._ignoreOnError -= 1;\n });\n },\n\n _triggerEvent: function(eventType, options) {\n // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it\n var evt, key;\n\n if (!this._hasDocument) return;\n\n options = options || {};\n\n eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1);\n\n if (_document.createEvent) {\n evt = _document.createEvent('HTMLEvents');\n evt.initEvent(eventType, true, true);\n } else {\n evt = _document.createEventObject();\n evt.eventType = eventType;\n }\n\n for (key in options)\n if (hasKey(options, key)) {\n evt[key] = options[key];\n }\n\n if (_document.createEvent) {\n // IE9 if standards\n _document.dispatchEvent(evt);\n } else {\n // IE8 regardless of Quirks or Standards\n // IE9 if quirks\n try {\n _document.fireEvent('on' + evt.eventType.toLowerCase(), evt);\n } catch (e) {\n // Do nothing\n }\n }\n },\n\n /**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param evtName the event name (e.g. \"click\")\n * @returns {Function}\n * @private\n */\n _breadcrumbEventHandler: function(evtName) {\n var self = this;\n return function(evt) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n self._keypressTimeout = null;\n\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (self._lastCapturedEvent === evt) return;\n\n self._lastCapturedEvent = evt;\n\n // try/catch both:\n // - accessing evt.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // can throw an exception in some circumstances.\n var target;\n try {\n target = htmlTreeAsString(evt.target);\n } catch (e) {\n target = '';\n }\n\n self.captureBreadcrumb({\n category: 'ui.' + evtName, // e.g. ui.click, ui.input\n message: target\n });\n };\n },\n\n /**\n * Wraps addEventListener to capture keypress UI events\n * @returns {Function}\n * @private\n */\n _keypressEventHandler: function() {\n var self = this,\n debounceDuration = 1000; // milliseconds\n\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function(evt) {\n var target;\n try {\n target = evt.target;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (\n !tagName ||\n (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)\n )\n return;\n\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n var timeout = self._keypressTimeout;\n if (!timeout) {\n self._breadcrumbEventHandler('input')(evt);\n }\n clearTimeout(timeout);\n self._keypressTimeout = setTimeout(function() {\n self._keypressTimeout = null;\n }, debounceDuration);\n };\n },\n\n /**\n * Captures a breadcrumb of type \"navigation\", normalizing input URLs\n * @param to the originating URL\n * @param from the target URL\n * @private\n */\n _captureUrlChange: function(from, to) {\n var parsedLoc = parseUrl(this._location.href);\n var parsedTo = parseUrl(to);\n var parsedFrom = parseUrl(from);\n\n // because onpopstate only tells you the \"new\" (to) value of location.href, and\n // not the previous (from) value, we need to track the value of the current URL\n // state ourselves\n this._lastHref = to;\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host)\n to = parsedTo.relative;\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host)\n from = parsedFrom.relative;\n\n this.captureBreadcrumb({\n category: 'navigation',\n data: {\n to: to,\n from: from\n }\n });\n },\n\n _patchFunctionToString: function() {\n var self = this;\n self._originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = function() {\n if (typeof this === 'function' && this.__raven__) {\n return self._originalFunctionToString.apply(this.__orig__, arguments);\n }\n return self._originalFunctionToString.apply(this, arguments);\n };\n },\n\n _unpatchFunctionToString: function() {\n if (this._originalFunctionToString) {\n // eslint-disable-next-line no-extend-native\n Function.prototype.toString = this._originalFunctionToString;\n }\n },\n\n /**\n * Wrap timer functions and event targets to catch errors and provide\n * better metadata.\n */\n _instrumentTryCatch: function() {\n var self = this;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapTimeFn(orig) {\n return function(fn, t) {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n var originalCallback = args[0];\n if (isFunction(originalCallback)) {\n args[0] = self.wrap(originalCallback);\n }\n\n // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it\n // also supports only two arguments and doesn't care what this is, so we\n // can just call the original function directly.\n if (orig.apply) {\n return orig.apply(this, args);\n } else {\n return orig(args[0], args[1]);\n }\n };\n }\n\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n function wrapEventTarget(global) {\n var proto = _window[global] && _window[global].prototype;\n if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {\n fill(\n proto,\n 'addEventListener',\n function(orig) {\n return function(evtName, fn, capture, secure) {\n // preserve arity\n try {\n if (fn && fn.handleEvent) {\n fn.handleEvent = self.wrap(fn.handleEvent);\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`\n // so that we don't have more than one wrapper function\n var before, clickHandler, keypressHandler;\n\n if (\n autoBreadcrumbs &&\n autoBreadcrumbs.dom &&\n (global === 'EventTarget' || global === 'Node')\n ) {\n // NOTE: generating multiple handlers per addEventListener invocation, should\n // revisit and verify we can just use one (almost certainly)\n clickHandler = self._breadcrumbEventHandler('click');\n keypressHandler = self._keypressEventHandler();\n before = function(evt) {\n // need to intercept every DOM event in `before` argument, in case that\n // same wrapped method is re-used for different events (e.g. mousemove THEN click)\n // see #724\n if (!evt) return;\n\n var eventType;\n try {\n eventType = evt.type;\n } catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n if (eventType === 'click') return clickHandler(evt);\n else if (eventType === 'keypress') return keypressHandler(evt);\n };\n }\n return orig.call(\n this,\n evtName,\n self.wrap(fn, undefined, before),\n capture,\n secure\n );\n };\n },\n wrappedBuiltIns\n );\n fill(\n proto,\n 'removeEventListener',\n function(orig) {\n return function(evt, fn, capture, secure) {\n try {\n fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn);\n } catch (e) {\n // ignore, accessing __raven_wrapper__ will throw in some Selenium environments\n }\n return orig.call(this, evt, fn, capture, secure);\n };\n },\n wrappedBuiltIns\n );\n }\n }\n\n fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);\n fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);\n if (_window.requestAnimationFrame) {\n fill(\n _window,\n 'requestAnimationFrame',\n function(orig) {\n return function(cb) {\n return orig(self.wrap(cb));\n };\n },\n wrappedBuiltIns\n );\n }\n\n // event targets borrowed from bugsnag-js:\n // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666\n var eventTargets = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload'\n ];\n for (var i = 0; i < eventTargets.length; i++) {\n wrapEventTarget(eventTargets[i]);\n }\n },\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - XMLHttpRequests\n * - DOM interactions (click/typing)\n * - window.location changes\n * - console\n *\n * Can be disabled or individually configured via the `autoBreadcrumbs` config option\n */\n _instrumentBreadcrumbs: function() {\n var self = this;\n var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;\n\n var wrappedBuiltIns = self._wrappedBuiltIns;\n\n function wrapProp(prop, xhr) {\n if (prop in xhr && isFunction(xhr[prop])) {\n fill(xhr, prop, function(orig) {\n return self.wrap(orig);\n }); // intentionally don't track filled methods on XHR instances\n }\n }\n\n if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {\n var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;\n fill(\n xhrproto,\n 'open',\n function(origOpen) {\n return function(method, url) {\n // preserve arity\n\n // if Sentry key appears in URL, don't capture\n if (isString(url) && url.indexOf(self._globalKey) === -1) {\n this.__raven_xhr = {\n method: method,\n url: url,\n status_code: null\n };\n }\n\n return origOpen.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n\n fill(\n xhrproto,\n 'send',\n function(origSend) {\n return function() {\n // preserve arity\n var xhr = this;\n\n function onreadystatechangeHandler() {\n if (xhr.__raven_xhr && xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhr.__raven_xhr.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'xhr',\n data: xhr.__raven_xhr\n });\n }\n }\n\n var props = ['onload', 'onerror', 'onprogress'];\n for (var j = 0; j < props.length; j++) {\n wrapProp(props[j], xhr);\n }\n\n if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {\n fill(\n xhr,\n 'onreadystatechange',\n function(orig) {\n return self.wrap(orig, undefined, onreadystatechangeHandler);\n } /* intentionally don't track this instrumentation */\n );\n } else {\n // if onreadystatechange wasn't actually set by the page on this xhr, we\n // are free to set our own and capture the breadcrumb\n xhr.onreadystatechange = onreadystatechangeHandler;\n }\n\n return origSend.apply(this, arguments);\n };\n },\n wrappedBuiltIns\n );\n }\n\n if (autoBreadcrumbs.xhr && supportsFetch()) {\n fill(\n _window,\n 'fetch',\n function(origFetch) {\n return function() {\n // preserve arity\n // Make a copy of the arguments to prevent deoptimization\n // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; ++i) {\n args[i] = arguments[i];\n }\n\n var fetchInput = args[0];\n var method = 'GET';\n var url;\n\n if (typeof fetchInput === 'string') {\n url = fetchInput;\n } else if ('Request' in _window && fetchInput instanceof _window.Request) {\n url = fetchInput.url;\n if (fetchInput.method) {\n method = fetchInput.method;\n }\n } else {\n url = '' + fetchInput;\n }\n\n // if Sentry key appears in URL, don't capture, as it's our own request\n if (url.indexOf(self._globalKey) !== -1) {\n return origFetch.apply(this, args);\n }\n\n if (args[1] && args[1].method) {\n method = args[1].method;\n }\n\n var fetchData = {\n method: method,\n url: url,\n status_code: null\n };\n\n return origFetch\n .apply(this, args)\n .then(function(response) {\n fetchData.status_code = response.status;\n\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData\n });\n\n return response;\n })\n ['catch'](function(err) {\n // if there is an error performing the request\n self.captureBreadcrumb({\n type: 'http',\n category: 'fetch',\n data: fetchData,\n level: 'error'\n });\n\n throw err;\n });\n };\n },\n wrappedBuiltIns\n );\n }\n\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n if (autoBreadcrumbs.dom && this._hasDocument) {\n if (_document.addEventListener) {\n _document.addEventListener('click', self._breadcrumbEventHandler('click'), false);\n _document.addEventListener('keypress', self._keypressEventHandler(), false);\n } else if (_document.attachEvent) {\n // IE8 Compatibility\n _document.attachEvent('onclick', self._breadcrumbEventHandler('click'));\n _document.attachEvent('onkeypress', self._keypressEventHandler());\n }\n }\n\n // record navigation (URL) changes\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var chrome = _window.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasPushAndReplaceState =\n !isChromePackagedApp &&\n _window.history &&\n history.pushState &&\n history.replaceState;\n if (autoBreadcrumbs.location && hasPushAndReplaceState) {\n // TODO: remove onpopstate handler on uninstall()\n var oldOnPopState = _window.onpopstate;\n _window.onpopstate = function() {\n var currentHref = self._location.href;\n self._captureUrlChange(self._lastHref, currentHref);\n\n if (oldOnPopState) {\n return oldOnPopState.apply(this, arguments);\n }\n };\n\n var historyReplacementFunction = function(origHistFunction) {\n // note history.pushState.length is 0; intentionally not declaring\n // params to preserve 0 arity\n return function(/* state, title, url */) {\n var url = arguments.length > 2 ? arguments[2] : undefined;\n\n // url argument is optional\n if (url) {\n // coerce to string (this is what pushState does)\n self._captureUrlChange(self._lastHref, url + '');\n }\n\n return origHistFunction.apply(this, arguments);\n };\n };\n\n fill(history, 'pushState', historyReplacementFunction, wrappedBuiltIns);\n fill(history, 'replaceState', historyReplacementFunction, wrappedBuiltIns);\n }\n\n if (autoBreadcrumbs.console && 'console' in _window && console.log) {\n // console\n var consoleMethodCallback = function(msg, data) {\n self.captureBreadcrumb({\n message: msg,\n level: data.level,\n category: 'console'\n });\n };\n\n each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) {\n wrapConsoleMethod(console, level, consoleMethodCallback);\n });\n }\n },\n\n _restoreBuiltIns: function() {\n // restore any wrapped builtins\n var builtin;\n while (this._wrappedBuiltIns.length) {\n builtin = this._wrappedBuiltIns.shift();\n\n var obj = builtin[0],\n name = builtin[1],\n orig = builtin[2];\n\n obj[name] = orig;\n }\n },\n\n _restoreConsole: function() {\n // eslint-disable-next-line guard-for-in\n for (var method in this._originalConsoleMethods) {\n this._originalConsole[method] = this._originalConsoleMethods[method];\n }\n },\n\n _drainPlugins: function() {\n var self = this;\n\n // FIX ME TODO\n each(this._plugins, function(_, plugin) {\n var installer = plugin[0];\n var args = plugin[1];\n installer.apply(self, [self].concat(args));\n });\n },\n\n _parseDSN: function(str) {\n var m = dsnPattern.exec(str),\n dsn = {},\n i = 7;\n\n try {\n while (i--) dsn[dsnKeys[i]] = m[i] || '';\n } catch (e) {\n throw new RavenConfigError('Invalid DSN: ' + str);\n }\n\n if (dsn.pass && !this._globalOptions.allowSecretKey) {\n throw new RavenConfigError(\n 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'\n );\n }\n\n return dsn;\n },\n\n _getGlobalServer: function(uri) {\n // assemble the endpoint from the uri pieces\n var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');\n\n if (uri.protocol) {\n globalServer = uri.protocol + ':' + globalServer;\n }\n return globalServer;\n },\n\n _handleOnErrorStackInfo: function() {\n // if we are intentionally ignoring errors via onerror, bail out\n if (!this._ignoreOnError) {\n this._handleStackInfo.apply(this, arguments);\n }\n },\n\n _handleStackInfo: function(stackInfo, options) {\n var frames = this._prepareFrames(stackInfo, options);\n\n this._triggerEvent('handle', {\n stackInfo: stackInfo,\n options: options\n });\n\n this._processException(\n stackInfo.name,\n stackInfo.message,\n stackInfo.url,\n stackInfo.lineno,\n frames,\n options\n );\n },\n\n _prepareFrames: function(stackInfo, options) {\n var self = this;\n var frames = [];\n if (stackInfo.stack && stackInfo.stack.length) {\n each(stackInfo.stack, function(i, stack) {\n var frame = self._normalizeFrame(stack, stackInfo.url);\n if (frame) {\n frames.push(frame);\n }\n });\n\n // e.g. frames captured via captureMessage throw\n if (options && options.trimHeadFrames) {\n for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) {\n frames[j].in_app = false;\n }\n }\n }\n frames = frames.slice(0, this._globalOptions.stackTraceLimit);\n return frames;\n },\n\n _normalizeFrame: function(frame, stackInfoUrl) {\n // normalize the frames data\n var normalized = {\n filename: frame.url,\n lineno: frame.line,\n colno: frame.column,\n function: frame.func || '?'\n };\n\n // Case when we don't have any information about the error\n // E.g. throwing a string or raw object, instead of an `Error` in Firefox\n // Generating synthetic error doesn't add any value here\n //\n // We should probably somehow let a user know that they should fix their code\n if (!frame.url) {\n normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler\n }\n\n normalized.in_app = !// determine if an exception came from outside of our app\n // first we check the global includePaths list.\n (\n (!!this._globalOptions.includePaths.test &&\n !this._globalOptions.includePaths.test(normalized.filename)) ||\n // Now we check for fun, if the function name is Raven or TraceKit\n /(Raven|TraceKit)\\./.test(normalized['function']) ||\n // finally, we do a last ditch effort and check for raven.min.js\n /raven\\.(min\\.)?js$/.test(normalized.filename)\n );\n\n return normalized;\n },\n\n _processException: function(type, message, fileurl, lineno, frames, options) {\n var prefixedMessage = (type ? type + ': ' : '') + (message || '');\n if (\n !!this._globalOptions.ignoreErrors.test &&\n (this._globalOptions.ignoreErrors.test(message) ||\n this._globalOptions.ignoreErrors.test(prefixedMessage))\n ) {\n return;\n }\n\n var stacktrace;\n\n if (frames && frames.length) {\n fileurl = frames[0].filename || fileurl;\n // Sentry expects frames oldest to newest\n // and JS sends them as newest to oldest\n frames.reverse();\n stacktrace = {frames: frames};\n } else if (fileurl) {\n stacktrace = {\n frames: [\n {\n filename: fileurl,\n lineno: lineno,\n in_app: true\n }\n ]\n };\n }\n\n if (\n !!this._globalOptions.ignoreUrls.test &&\n this._globalOptions.ignoreUrls.test(fileurl)\n ) {\n return;\n }\n\n if (\n !!this._globalOptions.whitelistUrls.test &&\n !this._globalOptions.whitelistUrls.test(fileurl)\n ) {\n return;\n }\n\n var data = objectMerge(\n {\n // sentry.interfaces.Exception\n exception: {\n values: [\n {\n type: type,\n value: message,\n stacktrace: stacktrace\n }\n ]\n },\n culprit: fileurl\n },\n options\n );\n\n // Fire away!\n this._send(data);\n },\n\n _trimPacket: function(data) {\n // For now, we only want to truncate the two different messages\n // but this could/should be expanded to just trim everything\n var max = this._globalOptions.maxMessageLength;\n if (data.message) {\n data.message = truncate(data.message, max);\n }\n if (data.exception) {\n var exception = data.exception.values[0];\n exception.value = truncate(exception.value, max);\n }\n\n var request = data.request;\n if (request) {\n if (request.url) {\n request.url = truncate(request.url, this._globalOptions.maxUrlLength);\n }\n if (request.Referer) {\n request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength);\n }\n }\n\n if (data.breadcrumbs && data.breadcrumbs.values)\n this._trimBreadcrumbs(data.breadcrumbs);\n\n return data;\n },\n\n /**\n * Truncate breadcrumb values (right now just URLs)\n */\n _trimBreadcrumbs: function(breadcrumbs) {\n // known breadcrumb properties with urls\n // TODO: also consider arbitrary prop values that start with (https?)?://\n var urlProps = ['to', 'from', 'url'],\n urlProp,\n crumb,\n data;\n\n for (var i = 0; i < breadcrumbs.values.length; ++i) {\n crumb = breadcrumbs.values[i];\n if (\n !crumb.hasOwnProperty('data') ||\n !isObject(crumb.data) ||\n objectFrozen(crumb.data)\n )\n continue;\n\n data = objectMerge({}, crumb.data);\n for (var j = 0; j < urlProps.length; ++j) {\n urlProp = urlProps[j];\n if (data.hasOwnProperty(urlProp) && data[urlProp]) {\n data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);\n }\n }\n breadcrumbs.values[i].data = data;\n }\n },\n\n _getHttpData: function() {\n if (!this._hasNavigator && !this._hasDocument) return;\n var httpData = {};\n\n if (this._hasNavigator && _navigator.userAgent) {\n httpData.headers = {\n 'User-Agent': navigator.userAgent\n };\n }\n\n // Check in `window` instead of `document`, as we may be in ServiceWorker environment\n if (_window.location && _window.location.href) {\n httpData.url = _window.location.href;\n }\n\n if (this._hasDocument && _document.referrer) {\n if (!httpData.headers) httpData.headers = {};\n httpData.headers.Referer = _document.referrer;\n }\n\n return httpData;\n },\n\n _resetBackoff: function() {\n this._backoffDuration = 0;\n this._backoffStart = null;\n },\n\n _shouldBackoff: function() {\n return this._backoffDuration && now() - this._backoffStart < this._backoffDuration;\n },\n\n /**\n * Returns true if the in-process data payload matches the signature\n * of the previously-sent data\n *\n * NOTE: This has to be done at this level because TraceKit can generate\n * data from window.onerror WITHOUT an exception object (IE8, IE9,\n * other old browsers). This can take the form of an \"exception\"\n * data object with a single frame (derived from the onerror args).\n */\n _isRepeatData: function(current) {\n var last = this._lastData;\n\n if (\n !last ||\n current.message !== last.message || // defined for captureMessage\n current.culprit !== last.culprit // defined for captureException/onerror\n )\n return false;\n\n // Stacktrace interface (i.e. from captureMessage)\n if (current.stacktrace || last.stacktrace) {\n return isSameStacktrace(current.stacktrace, last.stacktrace);\n } else if (current.exception || last.exception) {\n // Exception interface (i.e. from captureException/onerror)\n return isSameException(current.exception, last.exception);\n }\n\n return true;\n },\n\n _setBackoffState: function(request) {\n // If we are already in a backoff state, don't change anything\n if (this._shouldBackoff()) {\n return;\n }\n\n var status = request.status;\n\n // 400 - project_id doesn't exist or some other fatal\n // 401 - invalid/revoked dsn\n // 429 - too many requests\n if (!(status === 400 || status === 401 || status === 429)) return;\n\n var retry;\n try {\n // If Retry-After is not in Access-Control-Expose-Headers, most\n // browsers will throw an exception trying to access it\n if (supportsFetch()) {\n retry = request.headers.get('Retry-After');\n } else {\n retry = request.getResponseHeader('Retry-After');\n }\n\n // Retry-After is returned in seconds\n retry = parseInt(retry, 10) * 1000;\n } catch (e) {\n /* eslint no-empty:0 */\n }\n\n this._backoffDuration = retry\n ? // If Sentry server returned a Retry-After value, use it\n retry\n : // Otherwise, double the last backoff duration (starts at 1 sec)\n this._backoffDuration * 2 || 1000;\n\n this._backoffStart = now();\n },\n\n _send: function(data) {\n var globalOptions = this._globalOptions;\n\n var baseData = {\n project: this._globalProject,\n logger: globalOptions.logger,\n platform: 'javascript'\n },\n httpData = this._getHttpData();\n\n if (httpData) {\n baseData.request = httpData;\n }\n\n // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload\n if (data.trimHeadFrames) delete data.trimHeadFrames;\n\n data = objectMerge(baseData, data);\n\n // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge\n data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags);\n data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra);\n\n // Send along our own collected metadata with extra\n data.extra['session:duration'] = now() - this._startTime;\n\n if (this._breadcrumbs && this._breadcrumbs.length > 0) {\n // intentionally make shallow copy so that additions\n // to breadcrumbs aren't accidentally sent in this request\n data.breadcrumbs = {\n values: [].slice.call(this._breadcrumbs, 0)\n };\n }\n\n if (this._globalContext.user) {\n // sentry.interfaces.User\n data.user = this._globalContext.user;\n }\n\n // Include the environment if it's defined in globalOptions\n if (globalOptions.environment) data.environment = globalOptions.environment;\n\n // Include the release if it's defined in globalOptions\n if (globalOptions.release) data.release = globalOptions.release;\n\n // Include server_name if it's defined in globalOptions\n if (globalOptions.serverName) data.server_name = globalOptions.serverName;\n\n data = this._sanitizeData(data);\n\n // Cleanup empty properties before sending them to the server\n Object.keys(data).forEach(function(key) {\n if (data[key] == null || data[key] === '' || isEmptyObject(data[key])) {\n delete data[key];\n }\n });\n\n if (isFunction(globalOptions.dataCallback)) {\n data = globalOptions.dataCallback(data) || data;\n }\n\n // Why??????????\n if (!data || isEmptyObject(data)) {\n return;\n }\n\n // Check if the request should be filtered or not\n if (\n isFunction(globalOptions.shouldSendCallback) &&\n !globalOptions.shouldSendCallback(data)\n ) {\n return;\n }\n\n // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests),\n // so drop requests until \"cool-off\" period has elapsed.\n if (this._shouldBackoff()) {\n this._logDebug('warn', 'Raven dropped error due to backoff: ', data);\n return;\n }\n\n if (typeof globalOptions.sampleRate === 'number') {\n if (Math.random() < globalOptions.sampleRate) {\n this._sendProcessedPayload(data);\n }\n } else {\n this._sendProcessedPayload(data);\n }\n },\n\n _sanitizeData: function(data) {\n return sanitize(data, this._globalOptions.sanitizeKeys);\n },\n\n _getUuid: function() {\n return uuid4();\n },\n\n _sendProcessedPayload: function(data, callback) {\n var self = this;\n var globalOptions = this._globalOptions;\n\n if (!this.isSetup()) return;\n\n // Try and clean up the packet before sending by truncating long values\n data = this._trimPacket(data);\n\n // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback,\n // but this would require copying an un-truncated copy of the data packet, which can be\n // arbitrarily deep (extra_data) -- could be worthwhile? will revisit\n if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) {\n this._logDebug('warn', 'Raven dropped repeat event: ', data);\n return;\n }\n\n // Send along an event_id if not explicitly passed.\n // This event_id can be used to reference the error within Sentry itself.\n // Set lastEventId after we know the error should actually be sent\n this._lastEventId = data.event_id || (data.event_id = this._getUuid());\n\n // Store outbound payload after trim\n this._lastData = data;\n\n this._logDebug('debug', 'Raven about to send:', data);\n\n var auth = {\n sentry_version: '7',\n sentry_client: 'raven-js/' + this.VERSION,\n sentry_key: this._globalKey\n };\n\n if (this._globalSecret) {\n auth.sentry_secret = this._globalSecret;\n }\n\n var exception = data.exception && data.exception.values[0];\n\n // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy\n if (\n this._globalOptions.autoBreadcrumbs &&\n this._globalOptions.autoBreadcrumbs.sentry\n ) {\n this.captureBreadcrumb({\n category: 'sentry',\n message: exception\n ? (exception.type ? exception.type + ': ' : '') + exception.value\n : data.message,\n event_id: data.event_id,\n level: data.level || 'error' // presume error unless specified\n });\n }\n\n var url = this._globalEndpoint;\n (globalOptions.transport || this._makeRequest).call(this, {\n url: url,\n auth: auth,\n data: data,\n options: globalOptions,\n onSuccess: function success() {\n self._resetBackoff();\n\n self._triggerEvent('success', {\n data: data,\n src: url\n });\n callback && callback();\n },\n onError: function failure(error) {\n self._logDebug('error', 'Raven transport failed to send: ', error);\n\n if (error.request) {\n self._setBackoffState(error.request);\n }\n\n self._triggerEvent('failure', {\n data: data,\n src: url\n });\n error = error || new Error('Raven send failed (no additional details provided)');\n callback && callback(error);\n }\n });\n },\n\n _makeRequest: function(opts) {\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests\n var url = opts.url + '?' + urlencode(opts.auth);\n\n var evaluatedHeaders = null;\n var evaluatedFetchParameters = {};\n\n if (opts.options.headers) {\n evaluatedHeaders = this._evaluateHash(opts.options.headers);\n }\n\n if (opts.options.fetchParameters) {\n evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters);\n }\n\n if (supportsFetch()) {\n evaluatedFetchParameters.body = stringify(opts.data);\n\n var defaultFetchOptions = objectMerge({}, this._fetchDefaults);\n var fetchOptions = objectMerge(defaultFetchOptions, evaluatedFetchParameters);\n\n if (evaluatedHeaders) {\n fetchOptions.headers = evaluatedHeaders;\n }\n\n return _window\n .fetch(url, fetchOptions)\n .then(function(response) {\n if (response.ok) {\n opts.onSuccess && opts.onSuccess();\n } else {\n var error = new Error('Sentry error code: ' + response.status);\n // It's called request only to keep compatibility with XHR interface\n // and not add more redundant checks in setBackoffState method\n error.request = response;\n opts.onError && opts.onError(error);\n }\n })\n ['catch'](function() {\n opts.onError &&\n opts.onError(new Error('Sentry error code: network unavailable'));\n });\n }\n\n var request = _window.XMLHttpRequest && new _window.XMLHttpRequest();\n if (!request) return;\n\n // if browser doesn't support CORS (e.g. IE7), we are out of luck\n var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined';\n\n if (!hasCORS) return;\n\n if ('withCredentials' in request) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4) {\n return;\n } else if (request.status === 200) {\n opts.onSuccess && opts.onSuccess();\n } else if (opts.onError) {\n var err = new Error('Sentry error code: ' + request.status);\n err.request = request;\n opts.onError(err);\n }\n };\n } else {\n request = new XDomainRequest();\n // xdomainrequest cannot go http -> https (or vice versa),\n // so always use protocol relative\n url = url.replace(/^https?:/, '');\n\n // onreadystatechange not supported by XDomainRequest\n if (opts.onSuccess) {\n request.onload = opts.onSuccess;\n }\n if (opts.onError) {\n request.onerror = function() {\n var err = new Error('Sentry error code: XDomainRequest');\n err.request = request;\n opts.onError(err);\n };\n }\n }\n\n request.open('POST', url);\n\n if (evaluatedHeaders) {\n each(evaluatedHeaders, function(key, value) {\n request.setRequestHeader(key, value);\n });\n }\n\n request.send(stringify(opts.data));\n },\n\n _evaluateHash: function(hash) {\n var evaluated = {};\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n var value = hash[key];\n evaluated[key] = typeof value === 'function' ? value() : value;\n }\n }\n\n return evaluated;\n },\n\n _logDebug: function(level) {\n // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change\n if (\n this._originalConsoleMethods[level] &&\n (this.debug || this._globalOptions.debug)\n ) {\n // In IE<10 console methods do not have their own 'apply' method\n Function.prototype.apply.call(\n this._originalConsoleMethods[level],\n this._originalConsole,\n [].slice.call(arguments, 1)\n );\n }\n },\n\n _mergeContext: function(key, context) {\n if (isUndefined(context)) {\n delete this._globalContext[key];\n } else {\n this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context);\n }\n }\n};\n\n// Deprecations\nRaven.prototype.setUser = Raven.prototype.setUserContext;\nRaven.prototype.setReleaseContext = Raven.prototype.setRelease;\n\nmodule.exports = Raven;\n","/**\n * Enforces a single instance of the Raven client, and the\n * main entry point for Raven. If you are a consumer of the\n * Raven library, you SHOULD load this file (vs raven.js).\n **/\n\nvar RavenConstructor = require('./raven');\n\n// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)\nvar _window =\n typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\nvar _Raven = _window.Raven;\n\nvar Raven = new RavenConstructor();\n\n/*\n * Allow multiple versions of Raven to be installed.\n * Strip Raven from the global context and returns the instance.\n *\n * @return {Raven}\n */\nRaven.noConflict = function() {\n _window.Raven = _Raven;\n return Raven;\n};\n\nRaven.afterLoad();\n\nmodule.exports = Raven;\n\n/**\n * DISCLAIMER:\n *\n * Expose `Client` constructor for cases where user want to track multiple \"sub-applications\" in one larger app.\n * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it.\n * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug.\n *\n * It's called `Client' to be in-line with Raven Node implementation.\n *\n * HOWTO:\n *\n * import Raven from 'raven-js';\n *\n * const someAppReporter = new Raven.Client();\n * const someOtherAppReporter = new Raven.Client();\n *\n * someAppReporter.config('__DSN__', {\n * ...config goes here\n * });\n *\n * someOtherAppReporter.config('__OTHER_DSN__', {\n * ...config goes here\n * });\n *\n * someAppReporter.captureMessage(...);\n * someAppReporter.captureException(...);\n * someAppReporter.captureBreadcrumb(...);\n *\n * someOtherAppReporter.captureMessage(...);\n * someOtherAppReporter.captureException(...);\n * someOtherAppReporter.captureBreadcrumb(...);\n *\n * It should \"just work\".\n */\nmodule.exports.Client = RavenConstructor;\n","// ==========================================================================\n// Plyr.io demo\n// This code is purely for the https://plyr.io website\n// Please see readme.md in the root or github.com/sampotts/plyr\n// ==========================================================================\n\nimport Raven from 'raven-js';\n\n(() => {\n const isLive = window.location.host === 'plyr.io';\n\n // Raven / Sentry\n // For demo site (https://plyr.io) only\n if (isLive) {\n Raven.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install();\n }\n\n document.addEventListener('DOMContentLoaded', () => {\n Raven.context(() => {\n if (window.shr) {\n window.shr.setup({\n count: {\n classname: 'button__count',\n },\n });\n }\n\n // Setup tab focus\n const tabClassName = 'tab-focus';\n\n // Remove class on blur\n document.addEventListener('focusout', event => {\n event.target.classList.remove(tabClassName);\n });\n\n // Add classname to tabbed elements\n document.addEventListener('keydown', event => {\n if (event.keyCode !== 9) {\n return;\n }\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n setTimeout(() => {\n document.activeElement.classList.add(tabClassName);\n }, 0);\n });\n\n // Setup the player\n const player = new Plyr('#player', {\n debug: true,\n title: 'View From A Blue Moon',\n iconUrl: '../dist/plyr.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n /* 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 'fullscreen',\n ], */\n captions: {\n active: true,\n },\n keys: {\n google: 'AIzaSyDrNwtN3nLH_8rjCmu5Wq3ZCm4MNAVdc0c',\n },\n ads: {\n enabled: true,\n publisherId: '918848828995742',\n },\n });\n\n // Expose for tinkering in the console\n window.player = player;\n\n // Setup type toggle\n const buttons = document.querySelectorAll('[data-source]');\n const types = {\n video: 'video',\n audio: 'audio',\n youtube: 'youtube',\n vimeo: 'vimeo',\n };\n let currentType = window.location.hash.replace('#', '');\n const historySupport = window.history && window.history.pushState;\n\n // Toggle class on an element\n function toggleClass(element, className, state) {\n if (element) {\n element.classList[state ? 'add' : 'remove'](className);\n }\n }\n\n // Set a new source\n function newSource(type, init) {\n // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video\n if (!(type in types) || (!init && type === currentType) || (!currentType.length && type === types.video)) {\n return;\n }\n\n switch (type) {\n case types.video:\n player.source = {\n type: 'video',\n title: 'View From A Blue Moon',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n type: 'video/mp4',\n size: 576,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n type: 'video/mp4',\n size: 720,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n type: 'video/mp4',\n size: 1080,\n },\n {\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n type: 'video/mp4',\n size: 1440,\n },\n ],\n poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n tracks: [\n {\n kind: 'captions',\n label: 'English',\n srclang: 'en',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n default: true,\n },\n {\n kind: 'captions',\n label: 'French',\n srclang: 'fr',\n src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt',\n },\n ],\n };\n\n break;\n\n case types.audio:\n player.source = {\n type: 'audio',\n title: 'Kishi Bashi – “It All Began With A Burst”',\n sources: [\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n type: 'audio/mp3',\n },\n {\n src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n type: 'audio/ogg',\n },\n ],\n };\n\n break;\n\n case types.youtube:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n }],\n };\n\n break;\n\n case types.vimeo:\n player.source = {\n type: 'video',\n sources: [{\n src: 'https://vimeo.com/76979871',\n provider: 'vimeo',\n }],\n };\n\n break;\n\n default:\n break;\n }\n\n // Set the current type for next time\n currentType = type;\n\n // Remove active classes\n Array.from(buttons).forEach(button => toggleClass(button.parentElement, 'active', false));\n\n // Set active on parent\n toggleClass(document.querySelector(`[data-source=\"${type}\"]`), 'active', true);\n\n // Show cite\n Array.from(document.querySelectorAll('.plyr__cite')).forEach(cite => {\n cite.setAttribute('hidden', '');\n });\n document.querySelector(`.plyr__cite--${type}`).removeAttribute('hidden');\n }\n\n // Bind to each button\n Array.from(buttons).forEach(button => {\n button.addEventListener('click', () => {\n const type = button.getAttribute('data-source');\n\n newSource(type);\n\n if (historySupport) {\n window.history.pushState({ type }, '', `#${type}`);\n }\n });\n });\n\n // List for backwards/forwards\n window.addEventListener('popstate', event => {\n if (event.state && 'type' in event.state) {\n newSource(event.state.type);\n }\n });\n\n // On load\n if (historySupport) {\n const video = !currentType.length;\n\n // If there's no current type set, assume video\n if (video) {\n currentType = types.video;\n }\n\n // Replace current history state\n if (currentType in types) {\n window.history.replaceState(\n {\n type: currentType,\n },\n '',\n video ? '' : `#${currentType}`,\n );\n }\n\n // If it's not video, load the source\n if (currentType !== types.video) {\n newSource(currentType, true);\n }\n }\n });\n });\n\n // Google analytics\n // For demo site (https://plyr.io) only\n /* eslint-disable */\n if (isLive) {\n (function(i, s, o, g, r, a, m) {\n i.GoogleAnalyticsObject = r;\n i[r] =\n i[r] ||\n function() {\n (i[r].q = i[r].q || []).push(arguments);\n };\n i[r].l = 1 * new Date();\n a = s.createElement(o);\n m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n window.ga('create', 'UA-40881672-11', 'auto');\n window.ga('send', 'pageview');\n }\n /* eslint-enable */\n})();\n"]}
\ No newline at end of file
diff --git a/dist/plyr.css b/dist/plyr.css
index 586538ab..f5400d09 100644
--- a/dist/plyr.css
+++ b/dist/plyr.css
@@ -1 +1 @@
-@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transform:translateY(-40px);transition:transform .4s ease-in-out;width:100%}.plyr__captions span{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions span div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr--hide-controls .plyr__captions{transform:translateY(-15px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__control[aria-pressed=false] .icon--pressed,.plyr__control[aria-pressed=false] .label--pressed,.plyr__control[aria-pressed=true] .icon--not-pressed,.plyr__control[aria-pressed=true] .label--not-pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{height:20px;left:2px;position:relative;width:20px}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu:first-child,.plyr__controls .plyr__menu:first-child+[data-plyr=pause],.plyr__controls .plyr__progress:first-child,.plyr__controls .plyr__progress:first-child+[data-plyr=pause],.plyr__controls .plyr__time:first-child,.plyr__controls .plyr__time:first-child+[data-plyr=pause],.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0}.plyr__controls .plyr__volume{margin-left:5px}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:10px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:5px}}.plyr--video .plyr__controls{background:linear-gradient(transparent,rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:35px 10px 10px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:2}.plyr--video .plyr__controls .plyr__control svg{-webkit-filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15));filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__controls .plyr__control.plyr__tab-focus,.plyr--video .plyr__controls .plyr__control:hover,.plyr--video .plyr__controls .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed iframe{pointer-events:none}.plyr--full-ui .plyr__video-embed>div{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container ul{list-style:none;margin:0;overflow:hidden;padding:7px}.plyr__menu__container ul li{margin-top:2px}.plyr__menu__container ul li:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:14px;padding:4px 14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container label.plyr__control{padding-left:7px}.plyr__menu__container label.plyr__control input[type=radio]+span{background:rgba(0,0,0,.1);border-radius:100%;display:block;flex-shrink:0;height:16px;margin-right:10px;position:relative;transition:all .3s ease;width:16px}.plyr__menu__container label.plyr__control input[type=radio]+span::after{background:#fff;border-radius:100%;content:'';height:6px;left:5px;opacity:0;position:absolute;top:5px;transform:scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container label.plyr__control input[type=radio]:checked+span{background:#1aafff}.plyr__menu__container label.plyr__control input[type=radio]:checked+span::after{opacity:1;transform:scale(1)}.plyr__menu__container label.plyr__control input[type=radio]:focus+span{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__menu__container label.plyr__control.plyr__tab-focus input[type=radio]+span,.plyr__menu__container label.plyr__control:hover input[type=radio]+span{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-7px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr__progress{display:flex;flex:1;position:relative}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress--buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin:-3px 0 0;padding:0;position:absolute;top:50%;width:100%}.plyr__progress--buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress--buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress--buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress--buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress--buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress--buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress--buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress--buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress--buffer{background-color:rgba(183,197,205,.66)}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:14px;font-weight:500;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__volume{flex:1;position:relative}.plyr__volume input[type=range]{position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:50px}}@media (min-width:768px){.plyr__volume{max-width:80px}}.plyr--is-ios .plyr__volume,.plyr--is-ios [data-plyr=mute]{display:none!important}.plyr--has-error{pointer-events:none}.plyr--has-error::after{align-items:center;background:#000;color:#fff;content:attr(data-plyr-error);display:flex;font-size:16px;height:100%;justify-content:center;left:0;position:absolute;text-align:center;text-shadow:0 1px 1px #000;top:0;width:100%;z-index:10}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}
\ No newline at end of file
+@keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4f5b5f;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transform:translateY(-40px);transition:transform .4s ease-in-out;width:100%}.plyr__captions span{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions span div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr--hide-controls .plyr__captions{transform:translateY(-15px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__control[aria-pressed=false] .icon--pressed,.plyr__control[aria-pressed=false] .label--pressed,.plyr__control[aria-pressed=true] .icon--not-pressed,.plyr__control[aria-pressed=true] .label--not-pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr__control--overlaid{background:rgba(26,175,255,.8);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15);color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{height:20px;left:2px;position:relative;width:20px}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#1aafff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;text-align:center}.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:5px}.plyr__controls .plyr__menu:first-child,.plyr__controls .plyr__menu:first-child+[data-plyr=pause],.plyr__controls .plyr__progress:first-child,.plyr__controls .plyr__progress:first-child+[data-plyr=pause],.plyr__controls .plyr__time:first-child,.plyr__controls .plyr__time:first-child+[data-plyr=pause],.plyr__controls>.plyr__control:first-child,.plyr__controls>.plyr__control:first-child+[data-plyr=pause]{margin-left:0}.plyr__controls .plyr__volume{margin-left:5px}@media (min-width:480px){.plyr__controls .plyr__menu,.plyr__controls .plyr__progress,.plyr__controls .plyr__time,.plyr__controls>.plyr__control{margin-left:10px}.plyr__controls .plyr__menu+.plyr__control,.plyr__controls>.plyr__control+.plyr__control,.plyr__controls>.plyr__control+.plyr__menu{margin-left:5px}}.plyr--video .plyr__controls{background:linear-gradient(transparent,rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:35px 10px 10px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:2}.plyr--video .plyr__controls .plyr__control svg{-webkit-filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15));filter:drop-shadow(0 1px 1px rgba(0, 0, 0, .15))}.plyr--video .plyr__controls .plyr__control.plyr__tab-focus,.plyr--video .plyr__controls .plyr__control:hover,.plyr--video .plyr__controls .plyr__control[aria-expanded=true]{background:#1aafff;color:#fff}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4f5b5f;padding:10px}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__video-embed{height:0;padding-bottom:56.25%;position:relative}.plyr__video-embed iframe{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed iframe{pointer-events:none}.plyr--full-ui .plyr__video-embed>div{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container ul{list-style:none;margin:0;overflow:hidden;padding:7px}.plyr__menu__container ul li{margin-top:2px}.plyr__menu__container ul li:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4f5b5f;display:flex;font-size:14px;padding:4px 14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(79,91,95,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(79,91,95,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#b7c5cd;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container label.plyr__control{padding-left:7px}.plyr__menu__container label.plyr__control input[type=radio]+span{background:rgba(0,0,0,.1);border-radius:100%;display:block;flex-shrink:0;height:16px;margin-right:10px;position:relative;transition:all .3s ease;width:16px}.plyr__menu__container label.plyr__control input[type=radio]+span::after{background:#fff;border-radius:100%;content:'';height:6px;left:5px;opacity:0;position:absolute;top:5px;transform:scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container label.plyr__control input[type=radio]:checked+span{background:#1aafff}.plyr__menu__container label.plyr__control input[type=radio]:checked+span::after{opacity:1;transform:scale(1)}.plyr__menu__container label.plyr__control input[type=radio]:focus+span{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr__menu__container label.plyr__control.plyr__tab-focus input[type=radio]+span,.plyr__menu__container label.plyr__control:hover input[type=radio]+span{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-7px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr__progress{display:flex;flex:1;position:relative}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress--buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:6px;left:0;margin:-3px 0 0;padding:0;position:absolute;top:50%;width:100%}.plyr__progress--buffer::-webkit-progress-bar{background:0 0;transition:width .2s ease}.plyr__progress--buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:6px}.plyr__progress--buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:6px;transition:width .2s ease}.plyr__progress--buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress--buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress--buffer{color:rgba(183,197,205,.66)}.plyr--loading .plyr__progress--buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(47,52,61,.6) 25%,transparent 25%,transparent 50%,rgba(47,52,61,.6) 50%,rgba(47,52,61,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress--buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress--buffer{background-color:rgba(183,197,205,.66)}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:28px;color:#1aafff;display:block;height:20px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:3px;height:6px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:3px;height:6px;transition:all .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2);box-sizing:border-box;height:14px;position:relative;transition:all .2s ease;width:14px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 3px rgba(26,175,255,.35);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(183,197,205,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(47,52,61,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4f5b5f;font-size:14px;font-weight:500;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__volume{flex:1;position:relative}.plyr__volume input[type=range]{position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:50px}}@media (min-width:768px){.plyr__volume{max-width:80px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr--has-error{pointer-events:none}.plyr--has-error::after{align-items:center;background:#000;color:#fff;content:attr(data-plyr-error);display:flex;font-size:16px;height:100%;justify-content:center;left:0;position:absolute;text-align:center;text-shadow:0 1px 1px #000;top:0;width:100%;z-index:10}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:fullscreen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-moz-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-webkit-full-screen .plyr__video-embed{overflow:visible}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;width:100%}.plyr:-moz-full-screen .plyr__video-embed{overflow:visible}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;width:100%}.plyr:-ms-fullscreen .plyr__video-embed{overflow:visible}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;width:100%}.plyr--fullscreen-fallback .plyr__video-embed{overflow:visible}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(47,52,61,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:6px;left:0;margin:-3px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}
\ No newline at end of file
diff --git a/dist/plyr.js b/dist/plyr.js
index f2b0da4c..a6842ffd 100644
--- a/dist/plyr.js
+++ b/dist/plyr.js
@@ -77,7 +77,7 @@ var defaults = {
// Sprite (for icons)
loadSprite: true,
iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.2.2/plyr.svg',
+ iconUrl: 'https://cdn.plyr.io/3.2.3/plyr.svg',
// Blank video (used to prevent errors on source change)
blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
@@ -1200,8 +1200,8 @@ var utils = {
// Display
this.elements.display = {
buffer: utils.getElement.call(this, this.config.selectors.display.buffer),
- duration: utils.getElement.call(this, this.config.selectors.display.duration),
- currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime)
+ currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),
+ duration: utils.getElement.call(this, this.config.selectors.display.duration)
};
// Seek tooltip
@@ -1973,7 +1973,7 @@ var Fullscreen = function () {
// Fullscreen toggle on double click
utils.on(this.player.elements.container, 'dblclick', function (event) {
// Ignore double click in controls
- if (_this.player.elements.controls.contains(event.target)) {
+ if (utils.is.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
return;
}
@@ -2486,11 +2486,6 @@ var ui = {
this.listeners.controls();
}
- // If there's no controls, bail
- if (!utils.is.element(this.elements.controls)) {
- return;
- }
-
// Remove native controls
ui.toggleNativeControls.call(this);
@@ -2731,10 +2726,10 @@ var ui = {
}
// Always display hours if duration is over an hour
- var displayHours = utils.getHours(this.duration) > 0;
+ var forceHours = utils.getHours(this.duration) > 0;
// eslint-disable-next-line no-param-reassign
- target.textContent = utils.formatTime(time, displayHours, inverted);
+ target.textContent = utils.formatTime(time, forceHours, inverted);
},
@@ -3132,7 +3127,6 @@ var controls = {
// Add aria attributes
attributes['aria-pressed'] = false;
- attributes['aria-label'] = i18n.get(label, this.config);
} else {
button.appendChild(controls.createIcon.call(this, icon));
button.appendChild(controls.createLabel.call(this, label));
@@ -3234,16 +3228,14 @@ var controls = {
// Create time display
createTime: function createTime(type) {
- var container = utils.createElement('div', {
- class: 'plyr__time'
- });
+ var attributes = utils.getAttributesFromSelector(this.config.selectors.display[type]);
- container.appendChild(utils.createElement('span', {
- class: this.config.classNames.hidden
- }, i18n.get(type, this.config)));
-
- container.appendChild(utils.createElement('span', utils.getAttributesFromSelector(this.config.selectors.display[type]), '00:00'));
+ var container = utils.createElement('div', utils.extend(attributes, {
+ class: 'plyr__time ' + attributes.class,
+ 'aria-label': i18n.get(type, this.config)
+ }), '0:00');
+ // Reference for updates
this.elements.display[type] = container;
return container;
@@ -4091,17 +4083,21 @@ var controls = {
var container = null;
this.elements.controls = null;
- // HTML or Element passed as the option
+ // Set template properties
+ var props = {
+ id: this.id,
+ seektime: this.config.seekTime,
+ title: this.config.title
+ };
+ var update = true;
+
if (utils.is.string(this.config.controls) || utils.is.element(this.config.controls)) {
+ // String or HTMLElement passed as the option
container = this.config.controls;
} else if (utils.is.function(this.config.controls)) {
// A custom function to build controls
// The function can return a HTMLElement or String
- container = this.config.controls({
- id: this.id,
- seektime: this.config.seekTime,
- title: this.config.title
- });
+ container = this.config.controls.call(this, props);
} else {
// Create controls
container = controls.create.call(this, {
@@ -4113,6 +4109,31 @@ var controls = {
// TODO: Looping
// loop: 'None',
});
+ update = false;
+ }
+
+ // Replace props with their value
+ var replace = function replace(input) {
+ var result = input;
+
+ Object.entries(props).forEach(function (_ref) {
+ var _ref2 = slicedToArray(_ref, 2),
+ key = _ref2[0],
+ value = _ref2[1];
+
+ result = utils.replaceAll(result, '{' + key + '}', value);
+ });
+
+ return result;
+ };
+
+ // Update markup
+ if (update) {
+ if (utils.is.string(this.config.controls)) {
+ container = replace(container);
+ } else if (utils.is.element(container)) {
+ container.innerHTML = replace(container.innerHTML);
+ }
}
// Controls container
@@ -4414,7 +4435,7 @@ var Listeners = function () {
});
// Display duration
- utils.on(this.player.media, 'durationchange loadedmetadata', function (event) {
+ utils.on(this.player.media, 'durationchange loadeddata loadedmetadata', function (event) {
return ui.durationUpdate.call(_this3.player, event);
});
diff --git a/dist/plyr.js.map b/dist/plyr.js.map
index bf14ce90..bd453039 100644
--- a/dist/plyr.js.map
+++ b/dist/plyr.js.map
@@ -1 +1 @@
-{"version":3,"sources":["types.js","defaults.js","../../node_modules/loadjs/dist/loadjs.umd.js","utils.js","support.js","console.js","fullscreen.js","i18n.js","captions.js","ui.js","html5.js","controls.js","listeners.js","storage.js","plugins/ads.js","plugins/youtube.js","plugins/vimeo.js","media.js","source.js","plyr.js"],"names":["providers","types","defaults","navigator","language","userLanguage","split","define","this","utils","input","instanceof","window","Plyr","getConstructor","Object","Number","isNaN","String","Boolean","Function","nullOrUndefined","Array","isArray","WeakMap","NodeList","Element","Text","Event","TextTrackCue","VTTCue","TextTrack","string","kind","test","array","nodeList","length","object","keys","constructor","document","documentMode","documentElement","style","userAgent","platform","url","responseType","Promise","resolve","reject","request","XMLHttpRequest","addEventListener","JSON","parse","responseText","e","response","Error","statusText","open","send","id","is","prefix","hasId","isCached","exists","querySelectorAll","injectSprite","data","innerHTML","body","insertBefore","childNodes","container","createElement","toggleHidden","setAttribute","support","storage","cached","localStorage","getItem","call","content","fetch","then","empty","result","setItem","stringify","catch","Math","floor","random","elements","wrapper","targets","from","reverse","forEach","element","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","type","attributes","text","setAttributes","textContent","target","removeElement","removeChild","lastChild","newChild","oldChild","replaceChild","entries","key","value","sel","existingAttributes","existing","selector","s","trim","className","replace","stripped","parts","start","charAt","class","hidden","hide","boolean","hasAttribute","removeAttribute","toggle","contains","classList","prototype","match","includes","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","querySelector","controls","getElement","config","selectors","buttons","getElements","play","pause","restart","rewind","fastForward","mute","pip","airplay","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","currentTime","seekTooltip","classNames","tooltip","error","debug","warn","toggleNativeControls","focused","activeElement","focusable","first","last","trap","event","keyCode","getFocusElement","shiftKey","focus","preventDefault","on","off","callback","passive","capture","function","Node","toggleListener","events","options","passiveListeners","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","toggleState","pressed","getAttribute","state","current","max","toFixed","parseInt","time","displayHours","inverted","number","formatTime","format","slice","hours","getHours","mins","getMinutes","secs","getSeconds","find","RegExp","toString","toUpperCase","substr","toLowerCase","replaceAll","toTitleCase","toPascalCase","sources","source","shift","extend","filter","item","indexOf","reduce","prev","curr","abs","youtube","vimeo","regex","$2","parser","href","search","startsWith","parseUrl","hashes","params","hash","val","decodeURIComponent","map","encodeURIComponent","join","fragment","createDocumentFragment","firstChild","innerText","width","height","getRatio","w","h","ratio","transitionEndEvent","undefined","offsetHeight","provider","playsinline","api","ui","browser","getBrowser","canPlayInline","isIPhone","video","rangeInput","audio","webkitSetPresentationMode","WebKitPlaybackTargetAvailabilityEvent","media","isHTML5","canPlayType","isVideo","isAudio","supported","defineProperty","range","matchMedia","noop","Console","enabled","console","log","bind","onChange","button","player","active","isIos","trapFocus","toggleFallback","scrollPosition","scrollX","scrollY","scrollTo","x","y","overflow","toggleClass","fallback","Fullscreen","property","update","native","iosNative","playing","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","exitFullscreen","action","enter","exit","hasClass","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","some","pre","i18n","seekTime","title","stored","get","isYouTube","textTracks","setCaptionsMenu","getAttributesFromSelector","insertAfter","getTracks","tracks","isIE","URL","src","track","hostname","location","protocol","createObjectURL","blob","setLanguage","show","setCue","mode","currentTrack","getCurrentTrack","activeCues","isVimeo","embed","enableTextTrack","label","cue","setText","getCueAsHTML","emptyElement","caption","uiSupported","listeners","inject","setup","muted","speed","loop","quality","updateVolume","timeUpdate","checkPlaying","ready","setTitle","isEmbed","iframe","stopped","paused","toggleControls","loading","timers","setTimeout","failed","networkState","setRange","updateRangeFill","getElementsByTagName","nodeValue","getPercentage","setProgress","buffered","invert","invertTime","updateTimeDisplay","seeking","updateProgress","hasDuration","displayDuration","updateSeekTooltip","html5","getSources","sizes","dedupe","mime","load","blankVideo","isWebkit","setProperty","iconUrl","svg4everybody","namespace","getIconUrl","iconPath","absolute","iconPrefix","icon","createElementNS","use","path","setAttributeNS","attr","badge","menu","buttonType","toCamelCase","labelPressed","iconPressed","control","createIcon","createLabel","push","suffix","list","checked","radio","faux","insertAdjacentHTML","tooltips","percent","clientRect","getBoundingClientRect","visible","touch","pageX","left","parseFloat","setting","tabs","panes","toggleTab","checkMenu","getBadge","createBadge","sort","a","b","sorting","getLabel","createMenuItem","updateSetting","pane","lang","default","unshift","values","tab","form","isMenuItem","isButton","stopPropagation","clone","position","opacity","name","scrollWidth","scrollHeight","getElementById","isTab","transitions","reducedMotion","size","getTabSize","restore","propertyName","createButton","createRange","createProgress","createTime","inner","home","back","setQualityMenu","getQualityOptions","setSpeedMenu","loadSprite","create","findElements","repaint","labels","Listeners","lastKey","handleKey","toggleMenu","firstTouch","code","which","repeat","altKey","ctrlKey","metaKey","seekByKey","editable","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","isTouch","keyboard","global","tabFocus","hideControls","durationUpdate","hasAudio","showPosterOnEnd","checkLoading","ads","initialized","managerPromise","clickToPlay","ended","disableContextMenu","set","concat","inputEvent","proxy","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","showTab","toggleInvert","hover","webkitDirectionInvertedFromDevice","step","direction","deltaY","deltaX","Storage","store","json","removeItem","Ads","publisherId","manager","loader","cuePoints","safetyTimer","countdownTimer","google","ima","loadScript","urls","googleIMA","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","displayContainer","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","getRemainingTime","setInterval","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","cues","setVolume","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","args","handlers","handler","apply","Date","now","base","buildUrlParams","mapQualityUnit","mapQualityUnits","levels","level","setAspectRatio","YT","Player","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","videoId","getVideoData","items","snippet","paddingBottom","currentId","parseYouTubeId","generateId","replaceElement","autoplay","message","instance","playbackRate","getPlaybackRate","getTitle","playVideo","pauseVideo","stop","stopVideo","getDuration","getCurrentTime","seekTo","setPlaybackRate","getPlaybackQuality","setPlaybackQuality","getVideoUrl","getAvailablePlaybackRates","buffering","getVideoLoadedFraction","lastBuffered","build","getAvailableQualityLevels","Vimeo","padding","offset","transform","parseVimeoId","disableTextTrack","setCurrentTime","selected","setLoop","currentSrc","all","getVideoWidth","getVideoHeight","getAspectRatio","dimensions","setAutopause","autopause","getVideoTitle","getTextTracks","stripHTML","frame","seconds","wrap","insertElement","attribute","cancelRequests","check","crossorigin","poster","addStyleHook","insertElements","jQuery","original","tagName","getProviderByUrl","getUrlParams","truthy","webkitShowPlaybackTargetPicker","delay","isEnterFullscreen","showEvents","delayEvents","noTransition","toggled","soft","done","clear","unload","readyState","targetTime","end","fauxDuration","realDuration","min","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","closest","change","states","inline","webkitPresentationMode"],"mappings":"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","file":"plyr.js","sourcesContent":["// ==========================================================================\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\nexport default { providers, types };\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 // Default time to skip when rewind/fast forward\n seekTime: 10,\n\n // Default volume\n volume: 1,\n muted: false,\n\n // Pass a custom duration\n duration: null,\n\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n\n // Invert the current time to be a countdown\n invertTime: true,\n\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n\n // Aspect ratio (for embeds)\n ratio: '16:9',\n\n // Click video container to play/pause\n clickToPlay: true,\n\n // Auto hide the controls\n hideControls: true,\n\n // Revert to poster on finish (HTML5 - will cause reload)\n showPosterOnEnd: 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.2.2/plyr.svg',\n\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n // Quality default\n quality: {\n default: 576,\n options: [\n 4320,\n 2880,\n 2160,\n 1440,\n 1080,\n 720,\n 576,\n 480,\n 360,\n 240,\n 'default', // YouTube's \"auto\"\n ],\n },\n\n // Set loops\n loop: {\n active: false,\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n options: [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ],\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: (navigator.language || navigator.userLanguage).split('-')[0],\n },\n\n // Fullscreen settings\n fullscreen: {\n enabled: true, // Allow fullscreen?\n fallback: true, // Fallback for vintage browsers\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr',\n },\n\n // Default controls\n controls: [\n 'play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress',\n 'current-time',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n 'fullscreen',\n ],\n settings: [\n 'captions',\n 'quality',\n 'speed',\n ],\n\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime} secs',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime} secs',\n seek: 'Seek',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n 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 },\n\n // URLs\n urls: {\n vimeo: {\n api: 'https://player.vimeo.com/api/player.js',\n },\n youtube: {\n api: 'https://www.youtube.com/iframe_api',\n },\n googleIMA: {\n api: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n },\n },\n\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null,\n },\n\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended',\n 'progress',\n 'stalled',\n 'playing',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'loadstart',\n 'loadeddata',\n 'loadedmetadata',\n 'timeupdate',\n 'volumechange',\n 'play',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'emptied',\n 'ratechange',\n 'cuechange',\n\n // Custom events\n 'enterfullscreen',\n 'exitfullscreen',\n 'captionsenabled',\n 'captionsdisabled',\n 'languagechange',\n 'controlshidden',\n 'controlsshown',\n 'ready',\n\n // YouTube\n 'statechange',\n 'qualitychange',\n 'qualityrequested',\n\n // Ads\n 'adsloaded',\n 'adscontentpause',\n 'adscontentresume',\n 'adstarted',\n 'adsmidpoint',\n 'adscomplete',\n 'adsallcomplete',\n 'adsimpression',\n 'adsclick',\n ],\n\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls',\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]',\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]',\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress--buffer',\n played: '.plyr__progress--played',\n loop: '.plyr__progress--loop',\n volume: '.plyr__volume--display',\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n menu: {\n quality: '.js-plyr__menu__list--quality',\n },\n },\n\n // Class hooks added to the player in different states\n classNames: {\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n ads: 'plyr__ads',\n control: 'plyr__control',\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n stopped: 'plyr--stopped',\n playing: 'plyr--playing',\n loading: 'plyr--loading',\n error: 'plyr--has-error',\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 menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open',\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active',\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback',\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active',\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active',\n },\n tabFocus: 'plyr__tab-focus',\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\n },\n\n // API keys\n keys: {\n google: null,\n },\n\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n },\n};\n\nexport default defaults;\n","(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.loadjs = factory();\n }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {success: args};\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathStripped = path.replace(/^(css|img)!/, ''),\n isCss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(path)) {\n isCss = true;\n\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; //.replace(/^css!/, ''); // remove \"css!\" prefix\n } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped; \n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // Note: The following code isolates IE using `hideFocus` and treats empty\n // stylesheets as failures to get around lack of onerror support\n if (isCss && 'hideFocus' in e) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText`\n result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);\n else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n var bundleId,\n args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n // load scripts\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n\n return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Plyr utils\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nimport support from './support';\nimport { providers } from './types';\n\nconst utils = {\n // Check variable types\n is: {\n plyr(input) {\n return this.instanceof(input, window.Plyr);\n },\n object(input) {\n return this.getConstructor(input) === Object;\n },\n number(input) {\n return this.getConstructor(input) === Number && !Number.isNaN(input);\n },\n string(input) {\n return this.getConstructor(input) === String;\n },\n boolean(input) {\n return this.getConstructor(input) === Boolean;\n },\n function(input) {\n return this.getConstructor(input) === Function;\n },\n array(input) {\n return !this.nullOrUndefined(input) && Array.isArray(input);\n },\n weakMap(input) {\n return this.instanceof(input, window.WeakMap);\n },\n nodeList(input) {\n return this.instanceof(input, window.NodeList);\n },\n element(input) {\n return this.instanceof(input, window.Element);\n },\n textNode(input) {\n return this.getConstructor(input) === Text;\n },\n event(input) {\n return this.instanceof(input, window.Event);\n },\n cue(input) {\n return this.instanceof(input, window.TextTrackCue) || this.instanceof(input, window.VTTCue);\n },\n track(input) {\n return this.instanceof(input, TextTrack) || (!this.nullOrUndefined(input) && this.string(input.kind));\n },\n url(input) {\n return !this.nullOrUndefined(input) && /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-/]))?/.test(input);\n },\n nullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n },\n empty(input) {\n return (\n this.nullOrUndefined(input) ||\n ((this.string(input) || this.array(input) || this.nodeList(input)) && !input.length) ||\n (this.object(input) && !Object.keys(input).length)\n );\n },\n instanceof(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n },\n getConstructor(input) {\n return !this.nullOrUndefined(input) ? input.constructor : null;\n },\n },\n\n // Unfortunately, due to mixed support, UA sniffing is required\n getBrowser() {\n return {\n isIE: /* @cc_on!@ */ false || !!document.documentMode,\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n };\n },\n\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n 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.statusText);\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 // Load an external script\n loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs(url, {\n success: resolve,\n error: reject,\n });\n });\n },\n\n // Load an external SVG sprite\n loadSprite(url, id) {\n if (!utils.is.string(url)) {\n return;\n }\n\n const prefix = 'cache-';\n const hasId = utils.is.string(id);\n let isCached = false;\n\n const exists = () => document.querySelectorAll(`#${id}`).length;\n\n function injectSprite(data) {\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject content\n this.innerHTML = data;\n\n // Inject the SVG to the body\n document.body.insertBefore(this, document.body.childNodes[0]);\n }\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n // Create container\n const container = document.createElement('div');\n utils.toggleHidden(container, true);\n\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (support.storage) {\n const cached = window.localStorage.getItem(prefix + id);\n isCached = cached !== null;\n\n if (isCached) {\n const data = JSON.parse(cached);\n injectSprite.call(container, data.content);\n return;\n }\n }\n\n // Get the sprite\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.empty(result)) {\n return;\n }\n\n if (support.storage) {\n window.localStorage.setItem(\n prefix + id,\n JSON.stringify({\n content: result,\n }),\n );\n }\n\n injectSprite.call(container, result);\n })\n .catch(() => {});\n }\n },\n\n // Generate a random ID\n generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n },\n\n // Wrap an element\n wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets)\n .reverse()\n .forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n },\n\n // Create a DocumentFragment\n createElement(type, attributes, text) {\n // Create a new \n const element = document.createElement(type);\n\n // Set all passed attributes\n if (utils.is.object(attributes)) {\n utils.setAttributes(element, attributes);\n }\n\n // Add text node\n if (utils.is.string(text)) {\n element.textContent = text;\n }\n\n // Return built element\n return element;\n },\n\n // Inaert an element after another\n insertAfter(element, target) {\n target.parentNode.insertBefore(element, target.nextSibling);\n },\n\n // Insert a DocumentFragment\n insertElement(type, parent, attributes, text) {\n // Inject the new \n parent.appendChild(utils.createElement(type, attributes, text));\n },\n\n // Remove an element\n removeElement(element) {\n if (!utils.is.element(element) || !utils.is.element(element.parentNode)) {\n return;\n }\n\n if (utils.is.nodeList(element) || utils.is.array(element)) {\n Array.from(element).forEach(utils.removeElement);\n return;\n }\n\n element.parentNode.removeChild(element);\n },\n\n // Remove all child elements\n emptyElement(element) {\n let { length } = element.childNodes;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n },\n\n // Replace element\n replaceElement(newChild, oldChild) {\n if (!utils.is.element(oldChild) || !utils.is.element(oldChild.parentNode) || !utils.is.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n\n return newChild;\n },\n\n // Set attributes\n setAttributes(element, attributes) {\n if (!utils.is.element(element) || utils.is.empty(attributes)) {\n return;\n }\n\n Object.entries(attributes).forEach(([\n key,\n value,\n ]) => {\n element.setAttribute(key, value);\n });\n },\n\n // Get an attribute object from a string selector\n 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 (!utils.is.string(sel) || utils.is.empty(sel)) {\n return {};\n }\n\n const attributes = {};\n const existing = existingAttributes;\n\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n\n // Get the parts and value\n const parts = stripped.split('=');\n const key = parts[0];\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n // Get the first character\n const start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (utils.is.object(existing) && utils.is.string(existing.class)) {\n existing.class += ` ${className}`;\n }\n\n attributes.class = className;\n break;\n\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n\n case '[':\n // Attribute selector\n attributes[key] = value;\n\n break;\n\n default:\n break;\n }\n });\n\n return attributes;\n },\n\n // Toggle hidden\n toggleHidden(element, hidden) {\n if (!utils.is.element(element)) {\n return;\n }\n\n let hide = hidden;\n\n if (!utils.is.boolean(hide)) {\n hide = !element.hasAttribute('hidden');\n }\n\n if (hide) {\n element.setAttribute('hidden', '');\n } else {\n element.removeAttribute('hidden');\n }\n },\n\n // Toggle class on an element\n toggleClass(element, className, toggle) {\n if (utils.is.element(element)) {\n const contains = element.classList.contains(className);\n\n element.classList[toggle ? 'add' : 'remove'](className);\n\n return (toggle && !contains) || (!toggle && contains);\n }\n\n return null;\n },\n\n // Has class name\n hasClass(element, className) {\n return utils.is.element(element) && element.classList.contains(className);\n },\n\n // Element matches selector\n matches(element, selector) {\n const prototype = { Element };\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n const matches = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\n return matches.call(element, selector);\n },\n\n // Find all elements\n getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n },\n\n // Find a single element\n getElement(selector) {\n return this.elements.container.querySelector(selector);\n },\n\n // Find the UI controls and store references in custom controls\n // TODO: Allow settings menus with custom controls\n findElements() {\n try {\n this.elements.controls = utils.getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: utils.getElements.call(this, this.config.selectors.buttons.play),\n pause: utils.getElement.call(this, this.config.selectors.buttons.pause),\n restart: utils.getElement.call(this, this.config.selectors.buttons.restart),\n rewind: utils.getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: utils.getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: utils.getElement.call(this, this.config.selectors.buttons.mute),\n pip: utils.getElement.call(this, this.config.selectors.buttons.pip),\n airplay: utils.getElement.call(this, this.config.selectors.buttons.airplay),\n settings: utils.getElement.call(this, this.config.selectors.buttons.settings),\n captions: utils.getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: utils.getElement.call(this, this.config.selectors.buttons.fullscreen),\n };\n\n // Progress\n this.elements.progress = utils.getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: utils.getElement.call(this, this.config.selectors.inputs.seek),\n volume: utils.getElement.call(this, this.config.selectors.inputs.volume),\n };\n\n // Display\n this.elements.display = {\n buffer: utils.getElement.call(this, this.config.selectors.display.buffer),\n duration: utils.getElement.call(this, this.config.selectors.display.duration),\n currentTime: utils.getElement.call(this, this.config.selectors.display.currentTime),\n };\n\n // Seek tooltip\n if (utils.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 // Get the focused element\n getFocusElement() {\n let focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n },\n\n // Trap focus inside container\n trapFocus(element = null, toggle = false) {\n if (!utils.is.element(element)) {\n return;\n }\n\n const focusable = utils.getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n const trap = event => {\n // Bail if not tab key or not fullscreen\n if (event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = utils.getFocusElement();\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 if (toggle) {\n utils.on(this.elements.container, 'keydown', trap, false);\n } else {\n utils.off(this.elements.container, 'keydown', trap, false);\n }\n },\n\n // Toggle event listener\n toggleListener(elements, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no elemetns, event, or callback\n if (utils.is.empty(elements) || utils.is.empty(event) || !utils.is.function(callback)) {\n return;\n }\n\n // If a nodelist is passed, call itself on each node\n if (utils.is.nodeList(elements) || utils.is.array(elements)) {\n // Create listener for each node\n Array.from(elements).forEach(element => {\n if (element instanceof Node) {\n utils.toggleListener.call(null, element, event, callback, toggle, passive, capture);\n }\n });\n\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (support.passiveListeners) {\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 elements[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n },\n\n // Bind event handler\n on(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, true, passive, capture);\n },\n\n // Unbind event handler\n off(element, events = '', callback, passive = true, capture = false) {\n utils.toggleListener(element, events, callback, false, passive, capture);\n },\n\n // Trigger event\n dispatchEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!utils.is.element(element) || utils.is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: Object.assign({}, detail, {\n plyr: utils.is.plyr(this) ? this : null,\n }),\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n },\n\n // Toggle aria-pressed state on a toggle button\n // http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\n toggleState(element, input) {\n // If multiple elements passed\n if (utils.is.array(element) || utils.is.nodeList(element)) {\n Array.from(element).forEach(target => utils.toggleState(target, input));\n return;\n }\n\n // Bail if no target\n if (!utils.is.element(element)) {\n return;\n }\n\n // Get state\n const pressed = element.getAttribute('aria-pressed') === 'true';\n const state = utils.is.boolean(input) ? input : !pressed;\n\n // Set the attribute on target\n element.setAttribute('aria-pressed', state);\n },\n\n // Get percentage\n 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 // Time helpers\n getHours(value) {\n return parseInt((value / 60 / 60) % 60, 10);\n },\n getMinutes(value) {\n return parseInt((value / 60) % 60, 10);\n },\n getSeconds(value) {\n return parseInt(value % 60, 10);\n },\n\n // Format time to UI friendly string\n formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!utils.is.number(time)) {\n return this.formatTime(null, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n\n // Breakdown to hours, mins, secs\n let hours = this.getHours(time);\n const mins = this.getMinutes(time);\n const secs = this.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 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n },\n\n // Replace all occurances of a string in a string\n replaceAll(input = '', find = '', replace = '') {\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n },\n\n // Convert to title case\n toTitleCase(input = '') {\n return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n },\n\n // Convert string to pascalCase\n toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = utils.replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = utils.replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = utils.toTitleCase(string);\n\n // Convert to pascal case\n return utils.replaceAll(string, ' ', '');\n },\n\n // Convert string to pascalCase\n toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = utils.toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n },\n\n // Deep extend destination object with N more objects\n extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n\n const source = sources.shift();\n\n if (!utils.is.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(key => {\n if (utils.is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, { [key]: {} });\n }\n\n utils.extend(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n });\n\n return utils.extend(target, ...sources);\n },\n\n // Remove duplicates in an array\n dedupe(array) {\n if (!utils.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\n closest(array, value) {\n if (!utils.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 // Get the provider for a given URL\n getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{8,}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n },\n\n // Parse YouTube ID from URL\n parseYouTubeId(url) {\n if (utils.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 // Parse Vimeo ID from URL\n parseVimeoId(url) {\n if (utils.is.empty(url)) {\n return null;\n }\n\n if (utils.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 // Convert a URL to a location object\n parseUrl(url) {\n const parser = document.createElement('a');\n parser.href = url;\n return parser;\n },\n\n // Get URL query parameters\n getUrlParams(input) {\n let search = input;\n\n // Parse URL if needed\n if (input.startsWith('http://') || input.startsWith('https://')) {\n ({ search } = this.parseUrl(input));\n }\n\n if (this.is.empty(search)) {\n return null;\n }\n\n const hashes = search.slice(search.indexOf('?') + 1).split('&');\n\n return hashes.reduce((params, hash) => {\n const [\n key,\n val,\n ] = hash.split('=');\n\n return Object.assign(params, { [key]: decodeURIComponent(val) });\n }, {});\n },\n\n // Convert object to URL parameters\n buildUrlParams(input) {\n if (!utils.is.object(input)) {\n return '';\n }\n\n return Object.keys(input)\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(input[key])}`)\n .join('&');\n },\n\n // Remove HTML from a string\n 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 // Get aspect ratio for dimensions\n getAspectRatio(width, height) {\n const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n const ratio = getRatio(width, height);\n return `${width / ratio}:${height / ratio}`;\n },\n\n // Get the transition end event\n get 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 utils.is.string(type) ? events[type] : false;\n },\n\n // Force repaint of element\n repaint(element) {\n setTimeout(() => {\n utils.toggleHidden(element, true);\n element.offsetHeight; // eslint-disable-line\n utils.toggleHidden(element, false);\n }, 0);\n },\n};\n\nexport default utils;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport utils from './utils';\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 let api = false;\n let ui = false;\n const browser = utils.getBrowser();\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\n switch (`${provider}:${type}`) {\n case 'html5:video':\n api = support.video;\n ui = api && support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n case 'html5:audio':\n api = support.audio;\n ui = api && support.rangeInput;\n break;\n\n case 'youtube:video':\n case 'vimeo:video':\n api = true;\n ui = support.rangeInput && (!browser.isIPhone || canPlayInline);\n break;\n\n default:\n api = support.audio && support.video;\n ui = api && support.rangeInput;\n }\n\n return {\n api,\n ui,\n };\n },\n\n // Picture-in-picture support\n // Safari only currently\n pip: (() => {\n const browser = utils.getBrowser();\n return !browser.isIPhone && utils.is.function(utils.createElement('video').webkitSetPresentationMode);\n })(),\n\n // Airplay support\n // Safari only currently\n airplay: utils.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(type) {\n const { media } = this;\n\n try {\n // Bail if no checking function\n if (!this.isHTML5 || !utils.is.function(media.canPlayType)) {\n return false;\n }\n\n // Check directly if codecs specified\n if (type.includes('codecs=')) {\n return media.canPlayType(type).replace(/no/, '');\n }\n\n // Type specific checks\n if (this.isVideo) {\n switch (type) {\n case 'video/webm':\n return media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, '');\n\n case 'video/mp4':\n return media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, '');\n\n case 'video/ogg':\n return media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, '');\n\n default:\n return false;\n }\n } else if (this.isAudio) {\n switch (type) {\n case 'audio/mpeg':\n return media.canPlayType('audio/mpeg;').replace(/no/, '');\n\n case 'audio/ogg':\n return media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, '');\n\n case 'audio/wav':\n return media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, '');\n\n default:\n return false;\n }\n }\n } catch (e) {\n return false;\n }\n\n // If we got this far, we're stuffed\n return false;\n },\n\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\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\n passiveListeners: (() => {\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 } catch (e) {\n // Do nothing\n }\n\n return supported;\n })(),\n\n // 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: utils.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// 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 get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// ==========================================================================\n\nimport utils from './utils';\n\nconst browser = utils.getBrowser();\n\nfunction onChange() {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (utils.is.element(button)) {\n utils.toggleState(button, this.active);\n }\n\n // Trigger an event\n utils.dispatchEvent(this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Trap focus in container\n if (!browser.isIos) {\n utils.trapFocus.call(this.player, this.target, this.active);\n }\n}\n\nfunction toggleFallback(toggle = false) {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0,\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n utils.toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Toggle button and fire events\n onChange.call(this);\n}\n\nclass Fullscreen {\n constructor(player) {\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = { x: 0, y: 0 };\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n utils.on(document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n onChange.call(this);\n });\n\n // Fullscreen toggle on double click\n utils.on(this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n this.toggle();\n });\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (utils.is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = [\n 'webkit',\n 'moz',\n 'ms',\n ];\n\n prefixes.some(pre => {\n if (utils.is.function(document[`${pre}ExitFullscreen`]) || utils.is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n\n return value;\n }\n\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (\n (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n this.player.config.fullscreen.enabled &&\n this.player.supported.ui &&\n this.player.isVideo\n );\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native) {\n return utils.hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n return element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;\n }\n\n // Update UI\n update() {\n if (this.enabled) {\n this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n utils.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.playing) {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, true);\n } else if (!this.prefix) {\n this.target.requestFullscreen();\n } else if (!utils.is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n }\n\n // Bail from fullscreen\n exit() {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n this.player.play();\n } else if (!Fullscreen.native) {\n toggleFallback.call(this, false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!utils.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// Plyr internationalization\n// ==========================================================================\n\nimport utils from './utils';\n\nconst i18n = {\n get(key = '', config = {}) {\n if (utils.is.empty(key) || utils.is.empty(config) || !Object.keys(config.i18n).includes(key)) {\n return '';\n }\n\n let string = config.i18n[key];\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([\n key,\n value,\n ]) => {\n string = utils.replaceAll(string, key, value);\n });\n\n return string;\n },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport support from './support';\nimport utils from './utils';\nimport controls from './controls';\nimport i18n from './i18n';\n\nconst captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Set default language if not set\n const stored = this.storage.get('language');\n\n if (!utils.is.empty(stored)) {\n this.captions.language = stored;\n }\n\n if (utils.is.empty(this.captions.language)) {\n this.captions.language = this.config.captions.language.toLowerCase();\n }\n\n // Set captions enabled state if not set\n if (!utils.is.boolean(this.captions.active)) {\n const active = this.storage.get('captions');\n\n if (utils.is.boolean(active)) {\n this.captions.active = active;\n } else {\n this.captions.active = this.config.captions.active;\n }\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 (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n }\n\n // Inject the container\n if (!utils.is.element(this.elements.captions)) {\n this.elements.captions = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.captions));\n\n utils.insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Set the class hook\n utils.toggleClass(this.elements.container, this.config.classNames.captions.enabled, !utils.is.empty(captions.getTracks.call(this)));\n\n // Get tracks\n const tracks = captions.getTracks.call(this);\n\n // If no caption file exists, hide container for caption text\n if (utils.is.empty(tracks)) {\n return;\n }\n\n // Get browser info\n const browser = utils.getBrowser();\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 href = utils.parseUrl(src);\n\n if (href.hostname !== window.location.href.hostname && [\n 'http:',\n 'https:',\n ].includes(href.protocol)) {\n utils\n .fetch(src, 'blob')\n .then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n })\n .catch(() => {\n utils.removeElement(track);\n });\n }\n });\n }\n\n // Set language\n captions.setLanguage.call(this);\n\n // Enable UI\n captions.show.call(this);\n\n // Set available languages in list\n if (utils.is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n\n // Set the captions language\n setLanguage() {\n // Setup HTML5 track rendering\n if (this.isHTML5 && this.isVideo) {\n captions.getTracks.call(this).forEach(track => {\n // Show track\n utils.on(track, 'cuechange', event => captions.setCue.call(this, event));\n\n // Turn off native caption rendering to avoid double captions\n // eslint-disable-next-line\n track.mode = 'hidden';\n });\n\n // Get current track\n const currentTrack = captions.getCurrentTrack.call(this);\n\n // Check if suported kind\n if (utils.is.track(currentTrack)) {\n // If we change the active track while a cue is already displayed we need to update it\n if (Array.from(currentTrack.activeCues || []).length) {\n captions.setCue.call(this, currentTrack);\n }\n }\n } else if (this.isVimeo && this.captions.active) {\n this.embed.enableTextTrack(this.language);\n }\n },\n\n // Get the tracks\n getTracks() {\n // Return empty array at least\n if (utils.is.nullOrUndefined(this.media)) {\n return [];\n }\n\n // Only get accepted kinds\n return Array.from(this.media.textTracks || []).filter(track => [\n 'captions',\n 'subtitles',\n ].includes(track.kind));\n },\n\n // Get the current track for the current language\n getCurrentTrack() {\n const tracks = captions.getTracks.call(this);\n\n if (!tracks.length) {\n return null;\n }\n\n // Get track based on current language\n let track = tracks.find(track => track.language.toLowerCase() === this.language);\n\n // Get the with default attribute\n if (!track) {\n track = utils.getElement.call(this, 'track[default]');\n }\n\n // Get the first track\n if (!track) {\n [track] = tracks;\n }\n\n return track;\n },\n\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n\n if (!utils.is.track(currentTrack) && support.textTracks && this.captions.active) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (utils.is.track(currentTrack)) {\n if (!utils.is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!utils.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 // Display active caption if it contains text\n setCue(input) {\n // Get the track from the event if needed\n const track = utils.is.event(input) ? input.target : input;\n const { activeCues } = track;\n const active = activeCues.length && activeCues[0];\n const currentTrack = captions.getCurrentTrack.call(this);\n\n // Only display current track\n if (track !== currentTrack) {\n return;\n }\n\n // Display a cue, if there is one\n if (utils.is.cue(active)) {\n captions.setText.call(this, active.getCueAsHTML());\n } else {\n captions.setText.call(this, null);\n }\n\n utils.dispatchEvent.call(this, this.media, 'cuechange');\n },\n\n // Set the current caption\n setText(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (utils.is.element(this.elements.captions)) {\n const content = utils.createElement('span');\n\n // Empty the container\n utils.emptyElement(this.elements.captions);\n\n // Default to empty\n const caption = !utils.is.nullOrUndefined(input) ? input : '';\n\n // Set the span content\n if (utils.is.string(caption)) {\n content.textContent = caption.trim();\n } else {\n content.appendChild(caption);\n }\n\n // Set new caption text\n this.elements.captions.appendChild(content);\n } else {\n this.debug.warn('No captions element to render to');\n }\n },\n\n // Display captions container and button (for initialization)\n show() {\n // Try to load the value from storage\n let active = this.storage.get('captions');\n\n // Otherwise fall back to the default config\n if (!utils.is.boolean(active)) {\n ({ active } = this.config.captions);\n } else {\n this.captions.active = active;\n }\n\n if (active) {\n utils.toggleClass(this.elements.container, this.config.classNames.captions.active, true);\n utils.toggleState(this.elements.buttons.captions, true);\n }\n },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport utils from './utils';\nimport captions from './captions';\nimport controls from './controls';\nimport i18n from './i18n';\n\nconst ui = {\n addStyleHook() {\n utils.toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n utils.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 (!utils.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 // If there's no controls, bail\n if (!utils.is.element(this.elements.controls)) {\n return;\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Captions\n captions.setup.call(this);\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset volume display\n ui.updateVolume.call(this);\n\n // Reset time display\n ui.timeUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n utils.dispatchEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\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 (utils.is.string(this.config.title) && !utils.is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n\n // Set container label\n this.elements.container.setAttribute('aria-label', this.config.title);\n }\n\n // If there's a play button, set label\n if (utils.is.nodeList(this.elements.buttons.play)) {\n Array.from(this.elements.buttons.play).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = utils.getElement.call(this, 'iframe');\n\n if (!utils.is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !utils.is.empty(this.config.title) ? this.config.title : 'video';\n\n iframe.setAttribute('title', i18n.get('frameTitle', this.config));\n }\n },\n\n // Check playing state\n checkPlaying() {\n // Class hooks\n utils.toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n utils.toggleClass(this.elements.container, this.config.classNames.stopped, this.paused);\n\n // Set ARIA state\n utils.toggleState(this.elements.buttons.play, this.playing);\n\n // Toggle controls\n this.toggleControls(!this.playing);\n },\n\n // Check if media is loading\n checkLoading(event) {\n this.loading = [\n 'stalled',\n 'waiting',\n ].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 // Toggle container class hook\n utils.toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Show controls if loading, hide if done\n this.toggleControls(this.loading);\n }, this.loading ? 250 : 0);\n },\n\n // Check if media failed to load\n checkFailed() {\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/networkState\n this.failed = this.media.networkState === 3;\n\n if (this.failed) {\n utils.toggleClass(this.elements.container, this.config.classNames.loading, false);\n utils.toggleClass(this.elements.container, this.config.classNames.error, true);\n }\n\n // Clear timer\n clearTimeout(this.timers.failed);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Toggle container class hook\n utils.toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Show controls if loading, hide if done\n this.toggleControls(this.loading);\n }, this.loading ? 250 : 0);\n },\n\n // Update volume UI and storage\n updateVolume() {\n if (!this.supported.ui) {\n return;\n }\n\n // Update range\n if (utils.is.element(this.elements.inputs.volume)) {\n ui.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n }\n\n // Update mute state\n if (utils.is.element(this.elements.buttons.mute)) {\n utils.toggleState(this.elements.buttons.mute, this.muted || this.volume === 0);\n }\n },\n\n // Update seek value and lower fill\n setRange(target, value = 0) {\n if (!utils.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 // Set value\n setProgress(target, input) {\n const value = utils.is.number(input) ? input : 0;\n const progress = utils.is.element(target) ? target : this.elements.display.buffer;\n\n // Update value and label\n if (utils.is.element(progress)) {\n progress.value = value;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (utils.is.element(label)) {\n label.childNodes[0].nodeValue = value;\n }\n }\n },\n\n // Update elements\n updateProgress(event) {\n if (!this.supported.ui || !utils.is.event(event)) {\n return;\n }\n\n let value = 0;\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n value = utils.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 ui.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n ui.setProgress.call(this, this.elements.display.buffer, this.buffered * 100);\n\n break;\n\n default:\n break;\n }\n }\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 (!utils.is.element(target) || !utils.is.number(time)) {\n return;\n }\n\n // Always display hours if duration is over an hour\n const displayHours = utils.getHours(this.duration) > 0;\n\n // eslint-disable-next-line no-param-reassign\n target.textContent = utils.formatTime(time, displayHours, inverted);\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 = !utils.is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n ui.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n ui.updateProgress.call(this, event);\n },\n\n // Show the duration on metadataloaded\n durationUpdate() {\n if (!this.supported.ui) {\n return;\n }\n\n // If there's a spot to display duration\n const hasDuration = utils.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 ui.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n ui.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\nexport default ui;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport utils from './utils';\n\nconst html5 = {\n getSources() {\n if (!this.isHTML5) {\n return null;\n }\n\n return this.media.querySelectorAll('source');\n },\n\n // Get quality levels\n getQualityOptions() {\n if (!this.isHTML5) {\n return null;\n }\n\n // Get sources\n const sources = html5.getSources.call(this);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n // Get with size attribute\n const sizes = Array.from(sources).filter(source => !utils.is.empty(source.getAttribute('size')));\n\n // If none, bail\n if (utils.is.empty(sizes)) {\n return null;\n }\n\n // Reduce to unique list\n return utils.dedupe(sizes.map(source => Number(source.getAttribute('size'))));\n },\n\n extend() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return null;\n }\n\n const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);\n\n if (utils.is.empty(matches)) {\n return null;\n }\n\n return Number(matches[0].getAttribute('size'));\n },\n set(input) {\n // Get sources\n const sources = html5.getSources.call(player);\n\n if (utils.is.empty(sources)) {\n return;\n }\n\n // Get matches for requested size\n const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);\n\n // No matches for requested size\n if (utils.is.empty(matches)) {\n return;\n }\n\n // Get supported sources\n const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));\n\n // No supported sources\n if (utils.is.empty(supported)) {\n return;\n }\n\n // Trigger change event\n utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {\n quality: input,\n });\n\n // Get current state\n const { currentTime, playing } = player;\n\n // Set new source\n player.media.src = supported[0].getAttribute('src');\n\n // Load new source\n player.media.load();\n\n // Resume playing\n if (playing) {\n player.play();\n }\n\n // Restore time\n player.currentTime = currentTime;\n\n // Trigger change event\n utils.dispatchEvent.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 utils.removeElement(html5.getSources());\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// Plyr controls\n// ==========================================================================\n\nimport support from './support';\nimport utils from './utils';\nimport ui from './ui';\nimport i18n from './i18n';\nimport captions from './captions';\nimport html5 from './html5';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nconst controls = {\n // Webkit polyfill for lower fill range\n updateRangeFill(target) {\n // Get range from event if event passed\n const range = utils.is.event(target) ? target.target : target;\n\n // Needs to be a valid \n if (!utils.is.element(range) || range.getAttribute('type') !== 'range') {\n return;\n }\n\n // Set aria value for https://github.com/sampotts/plyr/issues/905\n range.setAttribute('aria-valuenow', range.value);\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 // Get icon URL\n getIconUrl() {\n return {\n url: this.config.iconUrl,\n absolute: this.config.iconUrl.indexOf('http') === 0 || (browser.isIE && !window.svg4everybody),\n };\n },\n\n // Create 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.absolute ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n // Create \n const icon = document.createElementNS(namespace, 'svg');\n utils.setAttributes(\n icon,\n utils.extend(attributes, {\n role: 'presentation',\n focusable: 'false',\n }),\n );\n\n // Create the to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } else {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n }\n\n // Add to \n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(type, attr) {\n let text = i18n.get(type, this.config);\n const attributes = Object.assign({}, attr);\n\n switch (type) {\n case 'pip':\n text = 'PIP';\n break;\n\n case 'airplay':\n text = 'AirPlay';\n break;\n\n default:\n break;\n }\n\n if ('class' in attributes) {\n attributes.class += ` ${this.config.classNames.hidden}`;\n } else {\n attributes.class = this.config.classNames.hidden;\n }\n\n return utils.createElement('span', attributes, text);\n },\n\n // Create a badge\n createBadge(text) {\n if (utils.is.empty(text)) {\n return null;\n }\n\n const badge = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n badge.appendChild(\n utils.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 \n createButton(buttonType, attr) {\n const button = utils.createElement('button');\n const attributes = Object.assign({}, attr);\n let type = utils.toCamelCase(buttonType);\n\n let toggle = false;\n let label;\n let icon;\n let labelPressed;\n let iconPressed;\n\n if (!('type' in attributes)) {\n attributes.type = 'button';\n }\n\n if ('class' in attributes) {\n if (attributes.class.includes(this.config.classNames.control)) {\n attributes.class += ` ${this.config.classNames.control}`;\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n toggle = true;\n label = 'play';\n labelPressed = 'pause';\n icon = 'play';\n iconPressed = 'pause';\n break;\n\n case 'mute':\n toggle = true;\n label = 'mute';\n labelPressed = 'unmute';\n icon = 'volume';\n iconPressed = 'muted';\n break;\n\n case 'captions':\n toggle = true;\n label = 'enableCaptions';\n labelPressed = 'disableCaptions';\n icon = 'captions-off';\n iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n toggle = true;\n label = 'enterFullscreen';\n labelPressed = 'exitFullscreen';\n icon = 'enter-fullscreen';\n iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n label = 'play';\n icon = 'play';\n break;\n\n default:\n label = type;\n icon = buttonType;\n }\n\n // Setup toggle icon and labels\n if (toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, iconPressed, { class: 'icon--pressed' }));\n button.appendChild(controls.createIcon.call(this, icon, { class: 'icon--not-pressed' }));\n\n // Label/Tooltip\n button.appendChild(controls.createLabel.call(this, labelPressed, { class: 'label--pressed' }));\n button.appendChild(controls.createLabel.call(this, label, { class: 'label--not-pressed' }));\n\n // Add aria attributes\n attributes['aria-pressed'] = false;\n attributes['aria-label'] = i18n.get(label, this.config);\n } else {\n button.appendChild(controls.createIcon.call(this, icon));\n button.appendChild(controls.createLabel.call(this, label));\n }\n\n // Merge attributes\n utils.extend(attributes, utils.getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\n utils.setAttributes(button, attributes);\n\n // We have multiple play buttons\n if (type === 'play') {\n if (!utils.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 \n createRange(type, attributes) {\n // Seek label\n const label = utils.createElement(\n 'label',\n {\n for: attributes.id,\n id: `${attributes.id}-label`,\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n );\n\n // Seek input\n const input = utils.createElement(\n 'input',\n utils.extend(\n utils.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-labelledby': `${attributes.id}-label`,\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': 0,\n },\n attributes,\n ),\n );\n\n this.elements.inputs[type] = input;\n\n // Set the fill for webkit now\n controls.updateRangeFill.call(this, input);\n\n return {\n label,\n input,\n };\n },\n\n // Create a \n createProgress(type, attributes) {\n const progress = utils.createElement(\n 'progress',\n utils.extend(\n utils.getAttributesFromSelector(this.config.selectors.display[type]),\n {\n min: 0,\n max: 100,\n value: 0,\n role: 'presentation',\n 'aria-hidden': true,\n },\n attributes,\n ),\n );\n\n // Create the label inside\n if (type !== 'volume') {\n progress.appendChild(utils.createElement('span', null, '0'));\n\n let suffix = '';\n switch (type) {\n case 'played':\n suffix = i18n.get('played', this.config);\n break;\n\n case 'buffer':\n suffix = i18n.get('buffered', this.config);\n break;\n\n default:\n break;\n }\n\n progress.textContent = `% ${suffix.toLowerCase()}`;\n }\n\n this.elements.display[type] = progress;\n\n return progress;\n },\n\n // Create time display\n createTime(type) {\n const container = utils.createElement('div', {\n class: 'plyr__time',\n });\n\n container.appendChild(\n utils.createElement(\n 'span',\n {\n class: this.config.classNames.hidden,\n },\n i18n.get(type, this.config),\n ),\n );\n\n container.appendChild(utils.createElement('span', utils.getAttributesFromSelector(this.config.selectors.display[type]), '00:00'));\n\n this.elements.display[type] = container;\n\n return container;\n },\n\n // Create a settings menu item\n createMenuItem(value, list, type, title, badge = null, checked = false) {\n const item = utils.createElement('li');\n\n const label = utils.createElement('label', {\n class: this.config.classNames.control,\n });\n\n const radio = utils.createElement(\n 'input',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.inputs[type]), {\n type: 'radio',\n name: `plyr-${type}`,\n value,\n checked,\n class: 'plyr__sr-only',\n }),\n );\n\n const faux = utils.createElement('span', { hidden: '' });\n\n label.appendChild(radio);\n label.appendChild(faux);\n label.insertAdjacentHTML('beforeend', title);\n\n if (utils.is.element(badge)) {\n label.appendChild(badge);\n }\n\n item.appendChild(label);\n list.appendChild(item);\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 !utils.is.element(this.elements.inputs.seek) ||\n !utils.is.element(this.elements.display.seekTooltip) ||\n this.duration === 0\n ) {\n return;\n }\n\n // Calculate percentage\n let percent = 0;\n const clientRect = this.elements.inputs.seek.getBoundingClientRect();\n const visible = `${this.config.classNames.tooltip}--visible`;\n\n const toggle = toggle => {\n utils.toggleClass(this.elements.display.seekTooltip, visible, toggle);\n };\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n if (utils.is.event(event)) {\n percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n } else if (utils.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 ui.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 (utils.is.event(event) && [\n 'mouseenter',\n 'mouseleave',\n ].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n\n // Hide/show a tab\n toggleTab(setting, toggle) {\n utils.toggleHidden(this.elements.settings.tabs[setting], !toggle);\n },\n\n // Set the quality menu\n // TODO: Vimeo support\n setQualityMenu(options) {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.quality)) {\n return;\n }\n\n const type = 'quality';\n const list = this.elements.settings.panes.quality.querySelector('ul');\n\n // Set options if passed and filter based on config\n if (utils.is.array(options)) {\n this.options.quality = options.filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 // Empty the menu\n utils.emptyElement(list);\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n let label = '';\n\n switch (quality) {\n case 2160:\n label = '4K';\n break;\n\n case 1440:\n case 1080:\n case 720:\n label = 'HD';\n break;\n\n case 576:\n label = 'SD';\n break;\n\n default:\n break;\n }\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 const label = controls.getLabel.call(this, 'quality', quality);\n controls.createMenuItem.call(this, quality, list, type, label, getBadge(quality));\n });\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Translate a value into a nice label\n // TODO: Localisation\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n\n case 'quality':\n if (utils.is.number(value)) {\n return `${value}p`;\n }\n\n return utils.toTitleCase(value);\n\n case 'captions':\n return captions.getLabel.call(this);\n\n default:\n return null;\n }\n },\n\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panes[setting];\n let value = null;\n let list = container;\n\n switch (setting) {\n case 'captions':\n if (this.captions.active) {\n if (this.options.captions.length > 2 || !this.options.captions.some(lang => lang === 'enabled')) {\n value = this.captions.language;\n } else {\n value = 'enabled';\n }\n } else {\n value = '';\n }\n\n break;\n\n default:\n value = !utils.is.empty(input) ? input : this[setting];\n\n // Get default\n if (utils.is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!utils.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 break;\n }\n\n // Get the list if we need to\n if (!utils.is.element(list)) {\n list = pane && pane.querySelector('ul');\n }\n\n // If there's no list it means it's not been rendered...\n if (!utils.is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.tabs[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(`input[value=\"${value}\"]`);\n\n if (utils.is.element(target)) {\n target.checked = true;\n }\n },\n\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.loop)) {\n return;\n }\n\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panes.loop.querySelector('ul');\n\n // Show the pane and tab\n utils.toggleHidden(this.elements.settings.tabs.loop, false);\n utils.toggleHidden(this.elements.settings.panes.loop, false);\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.loop.options);\n controls.toggleTab.call(this, 'loop', toggle);\n\n // Empty the menu\n utils.emptyElement(list);\n\n options.forEach(option => {\n const item = utils.createElement('li');\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.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 // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panes.captions.querySelector('ul');\n\n // Toggle the pane and tab\n const toggle = captions.getTracks.call(this).length;\n controls.toggleTab.call(this, type, toggle);\n\n // Empty the menu\n utils.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 // Re-map the tracks into just the data we need\n const tracks = captions.getTracks.call(this).map(track => ({\n language: !utils.is.empty(track.language) ? track.language : 'enabled',\n label: captions.getLabel.call(this, track),\n }));\n\n // Add the \"Disabled\" option to turn off captions\n tracks.unshift({\n language: '',\n label: i18n.get('disabled', this.config),\n });\n\n // Generate options\n tracks.forEach(track => {\n controls.createMenuItem.call(\n this,\n track.language,\n list,\n 'language',\n track.label,\n track.language !== 'enabled' ? controls.createBadge.call(this, track.language.toUpperCase()) : null,\n track.language.toLowerCase() === this.captions.language.toLowerCase(),\n );\n });\n\n // Store reference\n this.options.captions = tracks.map(track => track.language);\n\n controls.updateSetting.call(this, type, list);\n },\n\n // Set a list of available captions languages\n setSpeedMenu(options) {\n // Do nothing if not selected\n if (!this.config.controls.includes('settings') || !this.config.settings.includes('speed')) {\n return;\n }\n\n // Menu required\n if (!utils.is.element(this.elements.settings.panes.speed)) {\n return;\n }\n\n const type = 'speed';\n\n // Set the speed options\n if (utils.is.array(options)) {\n this.options.speed = options;\n } else if (this.isHTML5 || this.isVimeo) {\n this.options.speed = [\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 1.75,\n 2,\n ];\n }\n\n // Set options if passed and filter based on config\n this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n // Toggle the pane and tab\n const toggle = !utils.is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleTab.call(this, type, toggle);\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 list to populate\n const list = this.elements.settings.panes.speed.querySelector('ul');\n\n // Empty the menu\n utils.emptyElement(list);\n\n // Create items\n this.options.speed.forEach(speed => {\n const label = controls.getLabel.call(this, 'speed', speed);\n controls.createMenuItem.call(this, speed, list, type, label);\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 { tabs } = this.elements.settings;\n const visible = !utils.is.empty(tabs) && Object.values(tabs).some(tab => !tab.hidden);\n\n utils.toggleHidden(this.elements.settings.menu, !visible);\n },\n\n // Show/hide menu\n toggleMenu(event) {\n const { form } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!utils.is.element(form) || !utils.is.element(button)) {\n return;\n }\n\n const show = utils.is.boolean(event) ? event : utils.is.element(form) && form.hasAttribute('hidden');\n\n if (utils.is.event(event)) {\n const isMenuItem = utils.is.element(form) && form.contains(event.target);\n const isButton = event.target === this.elements.buttons.settings;\n\n // If the click was inside the form 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 && !isButton && show)) {\n return;\n }\n\n // Prevent the toggle being caught by the doc listener\n if (isButton) {\n event.stopPropagation();\n }\n }\n\n // Set form and button attributes\n if (utils.is.element(button)) {\n button.setAttribute('aria-expanded', show);\n }\n\n if (utils.is.element(form)) {\n utils.toggleHidden(form, !show);\n utils.toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n if (show) {\n form.removeAttribute('tabindex');\n } else {\n form.setAttribute('tabindex', -1);\n }\n }\n },\n\n // Get the natural size of a tab\n getTabSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Prevent input's being unchecked due to the name being identical\n Array.from(clone.querySelectorAll('input[name]')).forEach(input => {\n const name = input.getAttribute('name');\n input.setAttribute('name', `${name}-clone`);\n });\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 utils.removeElement(clone);\n\n return {\n width,\n height,\n };\n },\n\n // Toggle Menu\n showTab(event) {\n const { menu } = this.elements.settings;\n const tab = event.target;\n const show = tab.getAttribute('aria-expanded') === 'false';\n const pane = document.getElementById(tab.getAttribute('aria-controls'));\n\n // Nothing to show, bail\n if (!utils.is.element(pane)) {\n return;\n }\n\n // Are we targetting a tab? If not, bail\n const isTab = pane.getAttribute('role') === 'tabpanel';\n if (!isTab) {\n return;\n }\n\n // Hide all other tabs\n // Get other tabs\n const current = menu.querySelector('[role=\"tabpanel\"]:not([hidden])');\n const container = current.parentNode;\n\n // Set other toggles to be expanded false\n Array.from(menu.querySelectorAll(`[aria-controls=\"${current.getAttribute('id')}\"]`)).forEach(toggle => {\n toggle.setAttribute('aria-expanded', false);\n });\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.getTabSize.call(this, pane);\n\n // Restore auto height/width\n const restore = e => {\n // We're only bothered about height and width on the container\n if (e.target !== container || ![\n 'width',\n 'height',\n ].includes(e.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n utils.off(container, utils.transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n utils.on(container, utils.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 utils.toggleHidden(current, true);\n current.setAttribute('tabindex', -1);\n\n // Set attributes on target\n utils.toggleHidden(pane, !show);\n tab.setAttribute('aria-expanded', show);\n pane.removeAttribute('tabindex');\n\n // Focus the first item\n pane.querySelectorAll('button:not(:disabled), input:not(:disabled), [tabindex]')[0].focus();\n },\n\n // Build the default HTML\n // TODO: Set order based on order in the config.controls array?\n create(data) {\n // Do nothing if we want no controls\n if (utils.is.empty(this.config.controls)) {\n return null;\n }\n\n // Create the container\n const container = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n // Restart button\n if (this.config.controls.includes('restart')) {\n container.appendChild(controls.createButton.call(this, 'restart'));\n }\n\n // Rewind button\n if (this.config.controls.includes('rewind')) {\n container.appendChild(controls.createButton.call(this, 'rewind'));\n }\n\n // Play/Pause button\n if (this.config.controls.includes('play')) {\n container.appendChild(controls.createButton.call(this, 'play'));\n }\n\n // Fast forward button\n if (this.config.controls.includes('fast-forward')) {\n container.appendChild(controls.createButton.call(this, 'fast-forward'));\n }\n\n // Progress\n if (this.config.controls.includes('progress')) {\n const progress = utils.createElement('div', utils.getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n const seek = controls.createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n });\n progress.appendChild(seek.label);\n progress.appendChild(seek.input);\n\n // Buffer progress\n progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = utils.createElement(\n 'span',\n {\n role: 'tooltip',\n class: this.config.classNames.tooltip,\n },\n '00:00',\n );\n\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n\n this.elements.progress = progress;\n container.appendChild(this.elements.progress);\n }\n\n // Media current time display\n if (this.config.controls.includes('current-time')) {\n container.appendChild(controls.createTime.call(this, 'currentTime'));\n }\n\n // Media duration display\n if (this.config.controls.includes('duration')) {\n container.appendChild(controls.createTime.call(this, 'duration'));\n }\n\n // Toggle mute button\n if (this.config.controls.includes('mute')) {\n container.appendChild(controls.createButton.call(this, 'mute'));\n }\n\n // Volume range control\n if (this.config.controls.includes('volume')) {\n const volume = utils.createElement('div', {\n class: 'plyr__volume',\n });\n\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 const range = controls.createRange.call(\n this,\n 'volume',\n utils.extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n );\n volume.appendChild(range.label);\n volume.appendChild(range.input);\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle captions button\n if (this.config.controls.includes('captions')) {\n container.appendChild(controls.createButton.call(this, 'captions'));\n }\n\n // Settings button / menu\n if (this.config.controls.includes('settings') && !utils.is.empty(this.config.settings)) {\n const menu = utils.createElement('div', {\n class: 'plyr__menu',\n hidden: '',\n });\n\n menu.appendChild(\n controls.createButton.call(this, 'settings', {\n id: `plyr-settings-toggle-${data.id}`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false,\n }),\n );\n\n const form = utils.createElement('form', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tablist',\n tabindex: -1,\n });\n\n const inner = utils.createElement('div');\n\n const home = utils.createElement('div', {\n id: `plyr-settings-${data.id}-home`,\n 'aria-labelled-by': `plyr-settings-toggle-${data.id}`,\n role: 'tabpanel',\n });\n\n // Create the tab list\n const tabs = utils.createElement('ul', {\n role: 'tablist',\n });\n\n // Build the tabs\n this.config.settings.forEach(type => {\n const tab = utils.createElement('li', {\n role: 'tab',\n hidden: '',\n });\n\n const button = utils.createElement(\n 'button',\n utils.extend(utils.getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n id: `plyr-settings-${data.id}-${type}-tab`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-${type}`,\n 'aria-expanded': false,\n }),\n i18n.get(type, this.config),\n );\n\n const value = utils.createElement('span', {\n class: this.config.classNames.menu.value,\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n\n button.appendChild(value);\n tab.appendChild(button);\n tabs.appendChild(tab);\n\n this.elements.settings.tabs[type] = tab;\n });\n\n home.appendChild(tabs);\n inner.appendChild(home);\n\n // Build the panes\n this.config.settings.forEach(type => {\n const pane = utils.createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: '',\n 'aria-labelled-by': `plyr-settings-${data.id}-${type}-tab`,\n role: 'tabpanel',\n tabindex: -1,\n });\n\n const back = utils.createElement(\n 'button',\n {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}-home`,\n 'aria-expanded': false,\n },\n i18n.get(type, this.config),\n );\n\n pane.appendChild(back);\n\n const options = utils.createElement('ul');\n\n pane.appendChild(options);\n inner.appendChild(pane);\n\n this.elements.settings.panes[type] = pane;\n });\n\n form.appendChild(inner);\n menu.appendChild(form);\n container.appendChild(menu);\n\n this.elements.settings.form = form;\n this.elements.settings.menu = menu;\n }\n\n // Picture in picture button\n if (this.config.controls.includes('pip') && support.pip) {\n container.appendChild(controls.createButton.call(this, 'pip'));\n }\n\n // Airplay button\n if (this.config.controls.includes('airplay') && support.airplay) {\n container.appendChild(controls.createButton.call(this, 'airplay'));\n }\n\n // Toggle fullscreen button\n if (this.config.controls.includes('fullscreen')) {\n container.appendChild(controls.createButton.call(this, 'fullscreen'));\n }\n\n // Larger overlaid play button\n if (this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n }\n\n this.elements.controls = container;\n\n if (this.isHTML5) {\n controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n controls.setSpeedMenu.call(this);\n\n return container;\n },\n\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.absolute) {\n utils.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 // HTML or Element passed as the option\n if (utils.is.string(this.config.controls) || utils.is.element(this.config.controls)) {\n container = this.config.controls;\n } else if (utils.is.function(this.config.controls)) {\n // A custom function to build controls\n // The function can return a HTMLElement or String\n container = this.config.controls({\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title,\n });\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 }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (utils.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 (!utils.is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML\n if (utils.is.element(container)) {\n target.appendChild(container);\n } else if (container) {\n target.insertAdjacentHTML('beforeend', container);\n }\n\n // Find the elements if need be\n if (!utils.is.element(this.elements.controls)) {\n utils.findElements.call(this);\n }\n\n // Edge sometimes doesn't finish the paint so force a redraw\n if (window.navigator.userAgent.includes('Edge')) {\n utils.repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const labels = utils.getElements.call(\n this,\n [\n this.config.selectors.controls.wrapper,\n ' ',\n this.config.selectors.labels,\n ' .',\n this.config.classNames.hidden,\n ].join(''),\n );\n\n Array.from(labels).forEach(label => {\n utils.toggleClass(label, this.config.classNames.hidden, false);\n utils.toggleClass(label, this.config.classNames.tooltip, true);\n label.setAttribute('role', 'tooltip');\n });\n }\n },\n};\n\nexport default controls;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport utils from './utils';\nimport controls from './controls';\nimport ui from './ui';\n\n// Sniff out the browser\nconst browser = utils.getBrowser();\n\nclass Listeners {\n constructor(player) {\n this.player = player;\n this.lastKey = null;\n\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\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 (!utils.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 this.player.currentTime = this.player.duration / 10 * (code - 48);\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n const preventDefault = [\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 56,\n 57,\n 32,\n 75,\n 38,\n 40,\n 77,\n 39,\n 37,\n 70,\n 67,\n 73,\n 76,\n 79,\n ];\n\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 = utils.getFocusElement();\n if (utils.is.element(focused) && utils.matches(focused, this.player.config.selectors.editable)) {\n return;\n }\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 this.player.togglePlay();\n }\n break;\n\n case 38:\n // Arrow up\n this.player.increaseVolume(0.1);\n break;\n\n case 40:\n // Arrow down\n this.player.decreaseVolume(0.1);\n break;\n\n case 77:\n // M key\n if (!repeat) {\n this.player.muted = !this.player.muted;\n }\n break;\n\n case 39:\n // Arrow forward\n this.player.forward();\n break;\n\n case 37:\n // Arrow back\n this.player.rewind();\n break;\n\n case 70:\n // F key\n this.player.fullscreen.toggle();\n break;\n\n case 67:\n // C key\n if (!repeat) {\n this.player.toggleCaptions();\n }\n break;\n\n case 76:\n // L key\n this.player.loop = !this.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 (!this.player.fullscreen.enabled && this.player.fullscreen.active && code === 27) {\n this.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 this.player.touch = true;\n\n // Add touch class\n utils.toggleClass(this.player.elements.container, this.player.config.classNames.isTouch, true);\n\n // Clean up\n utils.off(document.body, 'touchstart', this.firstTouch);\n }\n\n // Global window & document listeners\n global(toggle = true) {\n // Keyboard shortcuts\n if (this.player.config.keyboard.global) {\n utils.toggleListener(window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n utils.toggleListener(document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n utils.on(document.body, 'touchstart', this.firstTouch);\n }\n\n // Container listeners\n container() {\n // Keyboard shortcuts\n if (!this.player.config.keyboard.global && this.player.config.keyboard.focused) {\n utils.on(this.player.elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Detect tab focus\n // Remove class on blur/focusout\n utils.on(this.player.elements.container, 'focusout', event => {\n utils.toggleClass(event.target, this.player.config.classNames.tabFocus, false);\n });\n\n // Add classname to tabbed elements\n utils.on(this.player.elements.container, '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 utils.toggleClass(utils.getFocusElement(), this.player.config.classNames.tabFocus, true);\n }, 0);\n });\n\n // Toggle controls visibility based on mouse movement\n if (this.player.config.hideControls) {\n // Toggle controls on mouse events and entering fullscreen\n utils.on(this.player.elements.container, 'mouseenter mouseleave mousemove touchstart touchend touchmove enterfullscreen exitfullscreen', event => {\n this.player.toggleControls(event);\n });\n }\n }\n\n // Listen for media events\n media() {\n // Time change on media\n utils.on(this.player.media, 'timeupdate seeking', event => ui.timeUpdate.call(this.player, event));\n\n // Display duration\n utils.on(this.player.media, 'durationchange loadedmetadata', event => ui.durationUpdate.call(this.player, event));\n\n // Check for audio tracks on load\n // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n utils.on(this.player.media, 'loadeddata', () => {\n utils.toggleHidden(this.player.elements.volume, !this.player.hasAudio);\n utils.toggleHidden(this.player.elements.buttons.mute, !this.player.hasAudio);\n });\n\n // Handle the media finishing\n utils.on(this.player.media, 'ended', () => {\n // Show poster on end\n if (this.player.isHTML5 && this.player.isVideo && this.player.config.showPosterOnEnd) {\n // Restart\n this.player.restart();\n\n // Re-load media\n this.player.media.load();\n }\n });\n\n // Check for buffer progress\n utils.on(this.player.media, 'progress playing', event => ui.updateProgress.call(this.player, event));\n\n // Handle volume changes\n utils.on(this.player.media, 'volumechange', event => ui.updateVolume.call(this.player, event));\n\n // Handle play/pause\n utils.on(this.player.media, 'playing play pause ended emptied', event => ui.checkPlaying.call(this.player, event));\n\n // Loading state\n utils.on(this.player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(this.player, event));\n\n // Check if media failed to load\n // utils.on(this.player.media, 'play', event => ui.checkFailed.call(this.player, event));\n\n // If autoplay, then load advertisement if required\n // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n utils.on(this.player.media, 'playing', () => {\n if (!this.player.ads) {\n return;\n }\n\n // If ads are enabled, wait for them first\n if (this.player.ads.enabled && !this.player.ads.initialized) {\n // Wait for manager response\n this.player.ads.managerPromise.then(() => this.player.ads.play()).catch(() => this.player.play());\n }\n });\n\n // Click video\n if (this.player.supported.ui && this.player.config.clickToPlay && !this.player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = utils.getElement.call(this.player, `.${this.player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!utils.is.element(wrapper)) {\n return;\n }\n\n // On click play, pause ore restart\n utils.on(wrapper, 'click', () => {\n // Touch devices will just show controls (if we're hiding controls)\n if (this.player.config.hideControls && this.player.touch && !this.player.paused) {\n return;\n }\n\n if (this.player.paused) {\n this.player.play();\n } else if (this.player.ended) {\n this.player.restart();\n this.player.play();\n } else {\n this.player.pause();\n }\n });\n }\n\n // Disable right click\n if (this.player.supported.ui && this.player.config.disableContextMenu) {\n utils.on(\n this.player.elements.wrapper,\n 'contextmenu',\n event => {\n event.preventDefault();\n },\n false,\n );\n }\n\n // Volume change\n utils.on(this.player.media, 'volumechange', () => {\n // Save to storage\n this.player.storage.set({ volume: this.player.volume, muted: this.player.muted });\n });\n\n // Speed change\n utils.on(this.player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'speed');\n\n // Save to storage\n this.player.storage.set({ speed: this.player.speed });\n });\n\n // Quality request\n utils.on(this.player.media, 'qualityrequested', event => {\n // Save to storage\n this.player.storage.set({ quality: event.detail.quality });\n });\n\n // Quality change\n utils.on(this.player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(this.player, 'quality', null, event.detail.quality);\n });\n\n // Caption language change\n utils.on(this.player.media, 'languagechange', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ language: this.player.language });\n });\n\n // Captions toggle\n utils.on(this.player.media, 'captionsenabled captionsdisabled', () => {\n // Update UI\n controls.updateSetting.call(this.player, 'captions');\n\n // Save to storage\n this.player.storage.set({ captions: this.player.captions.active });\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n utils.on(this.player.media, this.player.config.events.concat([\n 'keyup',\n 'keydown',\n ]).join(' '), event => {\n let detail = {};\n\n // Get error details from media\n if (event.type === 'error') {\n detail = this.player.media.error;\n }\n\n utils.dispatchEvent.call(this.player, this.player.elements.container, event.type, true, detail);\n });\n }\n\n // Listen for control events\n controls() {\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Run default and custom handlers\n const proxy = (event, defaultHandler, customHandlerKey) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(this.player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned && utils.is.function(defaultHandler)) {\n defaultHandler.call(this.player, event);\n }\n };\n\n // Trigger custom and default handlers\n const on = (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const customHandler = this.player.config.listeners[customHandlerKey];\n const hasCustomHandler = utils.is.function(customHandler);\n\n utils.on(element, type, event => proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n };\n\n // Play/pause toggle\n on(this.player.elements.buttons.play, 'click', this.player.togglePlay, 'play');\n\n // Pause\n on(this.player.elements.buttons.restart, 'click', this.player.restart, 'restart');\n\n // Rewind\n on(this.player.elements.buttons.rewind, 'click', this.player.rewind, 'rewind');\n\n // Rewind\n on(this.player.elements.buttons.fastForward, 'click', this.player.forward, 'fastForward');\n\n // Mute toggle\n on(\n this.player.elements.buttons.mute,\n 'click',\n () => {\n this.player.muted = !this.player.muted;\n },\n 'mute',\n );\n\n // Captions toggle\n on(this.player.elements.buttons.captions, 'click', this.player.toggleCaptions);\n\n // Fullscreen toggle\n on(\n this.player.elements.buttons.fullscreen,\n 'click',\n () => {\n this.player.fullscreen.toggle();\n },\n 'fullscreen',\n );\n\n // Picture-in-Picture\n on(\n this.player.elements.buttons.pip,\n 'click',\n () => {\n this.player.pip = 'toggle';\n },\n 'pip',\n );\n\n // Airplay\n on(this.player.elements.buttons.airplay, 'click', this.player.airplay, 'airplay');\n\n // Settings menu\n on(this.player.elements.buttons.settings, 'click', event => {\n controls.toggleMenu.call(this.player, event);\n });\n\n // Settings menu\n on(this.player.elements.settings.form, 'click', event => {\n event.stopPropagation();\n\n // Settings menu items - use event delegation as items are added/removed\n if (utils.matches(event.target, this.player.config.selectors.inputs.language)) {\n proxy(\n event,\n () => {\n this.player.language = event.target.value;\n },\n 'language',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.quality)) {\n proxy(\n event,\n () => {\n this.player.quality = event.target.value;\n },\n 'quality',\n );\n } else if (utils.matches(event.target, this.player.config.selectors.inputs.speed)) {\n proxy(\n event,\n () => {\n this.player.speed = parseFloat(event.target.value);\n },\n 'speed',\n );\n } else {\n controls.showTab.call(this.player, event);\n }\n });\n\n // Seek\n on(\n this.player.elements.inputs.seek,\n inputEvent,\n event => {\n this.player.currentTime = event.target.value / event.target.max * this.player.duration;\n },\n 'seek',\n );\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (this.player.config.toggleInvert && !utils.is.element(this.player.elements.display.duration)) {\n on(this.player.elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (this.player.currentTime === 0) {\n return;\n }\n\n this.player.config.invertTime = !this.player.config.invertTime;\n ui.timeUpdate.call(this.player);\n });\n }\n\n // Volume\n on(\n this.player.elements.inputs.volume,\n inputEvent,\n event => {\n this.player.volume = event.target.value;\n },\n 'volume',\n );\n\n // Polyfill for lower fill in for webkit\n if (browser.isWebkit) {\n on(utils.getElements.call(this.player, 'input[type=\"range\"]'), 'input', event => {\n controls.updateRangeFill.call(this.player, event.target);\n });\n }\n\n // Seek tooltip\n on(this.player.elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(this.player, event));\n\n // Toggle controls visibility based on mouse movement\n if (this.player.config.hideControls) {\n // Watch for cursor over controls so they don't hide when trying to interact\n on(this.player.elements.controls, 'mouseenter mouseleave', event => {\n this.player.elements.controls.hover = !this.player.touch && event.type === 'mouseenter';\n });\n\n // Watch for cursor over controls so they don't hide when trying to interact\n on(this.player.elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n this.player.elements.controls.pressed = [\n 'mousedown',\n 'touchstart',\n ].includes(event.type);\n });\n\n // Focus in/out on controls\n on(this.player.elements.controls, 'focusin focusout', event => {\n this.player.toggleControls(event);\n });\n }\n\n // Mouse wheel for volume\n on(\n this.player.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 const step = 1 / 50;\n let direction = 0;\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n this.player.decreaseVolume(step);\n direction = -1;\n } else {\n this.player.increaseVolume(step);\n direction = 1;\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n this.player.increaseVolume(step);\n direction = 1;\n } else {\n this.player.decreaseVolume(step);\n direction = -1;\n }\n }\n\n // Don't break page scrolling at max and min\n if ((direction === 1 && this.player.media.volume < 1) || (direction === -1 && this.player.media.volume > 0)) {\n event.preventDefault();\n }\n },\n 'volume',\n false,\n );\n }\n\n // Reset on destroy\n clear() {\n this.global(false);\n }\n}\n\nexport default Listeners;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport utils from './utils';\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) {\n return null;\n }\n\n const store = window.localStorage.getItem(this.key);\n\n if (utils.is.empty(store)) {\n return null;\n }\n\n const json = JSON.parse(store);\n\n return utils.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 (!utils.is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (utils.is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n utils.extend(storage, object);\n\n // Update storage\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n}\n\nexport default Storage;\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 utils from '../utils';\nimport i18n from '../i18n';\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.publisherId = player.config.ads.publisherId;\n this.enabled = player.isHTML5 && player.isVideo && player.config.ads.enabled && utils.is.string(this.publisherId) && this.publisherId.length;\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 /**\n * Load the IMA SDK\n */\n load() {\n if (this.enabled) {\n // Check if the Google IMA3 SDK is loaded or load it ourselves\n if (!utils.is.object(window.google) || !utils.is.object(window.google.ima)) {\n utils\n .loadScript(this.player.config.urls.googleIMA.api)\n .then(() => {\n this.ready();\n })\n .catch(() => {\n // Script failed to load or is blocked\n this.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n }\n\n /**\n * Get the ads instance ready\n */\n ready() {\n // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n this.startSafetyTimer(12000, 'ready()');\n\n // Clear the safety timer\n this.managerPromise.then(() => {\n this.clearSafetyTimer('onAdsManagerLoaded()');\n });\n\n // Set listeners on the Plyr instance\n this.listeners();\n\n // Setup the IMA SDK\n this.setupIMA();\n }\n\n // Build the default tag URL\n get tagUrl() {\n const params = {\n AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n AV_CHANNELID: '5a0458dc28a06145e4519d21',\n AV_URL: location.hostname,\n cb: Date.now(),\n AV_WIDTH: 640,\n AV_HEIGHT: 480,\n AV_CDIM2: this.publisherId,\n };\n\n const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n return `${base}?${utils.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 = utils.createElement('div', {\n class: this.player.config.classNames.ads,\n });\n this.player.elements.container.appendChild(this.elements.container);\n\n // So we can run VPAID2\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n // Set language\n google.ima.settings.setLocale(this.player.config.ads.language);\n\n // We assume the adContainer is the video container of the plyr element\n // that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n // Request video ads to be pre-loaded\n this.requestAds();\n }\n\n /**\n * Request advertisements\n */\n requestAds() {\n const { container } = this.player.elements;\n\n try {\n // Create ads loader\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n // Listen and respond to ads loaded and error events\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, event => this.onAdsManagerLoaded(event), false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n // Request video ads\n const request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl;\n\n // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight;\n\n // We only overlay ads as we only support video.\n request.forceNonLinearFullSlot = false;\n\n 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 = utils.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 // Get the ads manager\n const settings = new google.ima.AdsRenderingSettings();\n\n // Tell the SDK to save and restore content video state on our behalf\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true;\n\n // The SDK is polling currentTime on the contentPlayback. And needs a duration\n // so it can determine when to start the mid- and post-roll\n this.manager = event.getAdsManager(this.player, settings);\n\n // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n this.cuePoints = this.manager.getCuePoints();\n\n // Add advertisement cue's within the time line if available\n if (!utils.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 (utils.is.element(seekElement)) {\n const cuePercentage = 100 / this.player.duration * cuePoint;\n const cue = utils.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 // Get skippable state\n // TODO: Skip button\n // this.manager.getAdSkippableState();\n\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\n // Add listeners to the required events\n // Advertisement error events\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n // Advertisement regular events\n Object.keys(google.ima.AdEvent.Type).forEach(type => {\n this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n /**\n * This is where all the event handling takes place. Retrieve the ad from the event. Some\n * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n * @param {Event} event\n */\n onAdEvent(event) {\n const { container } = this.player.elements;\n\n // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n const ad = event.getAd();\n\n // Proxy event\n const dispatchEvent = type => {\n const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n utils.dispatchEvent.call(this.player, this.player.media, event);\n };\n\n switch (event.type) {\n case google.ima.AdEvent.Type.LOADED:\n // This is the first event sent for an ad - it is possible to determine whether the\n // ad is a video ad or an overlay\n this.trigger('loaded');\n\n // Bubble event\n dispatchEvent(event.type);\n\n // Start countdown\n this.pollCountdown(true);\n\n if (!ad.isLinear()) {\n // Position AdDisplayContainer correctly for overlay\n ad.width = container.offsetWidth;\n ad.height = container.offsetHeight;\n }\n\n // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n break;\n\n case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n // All ads for the current videos are done. We can now request new advertisements\n // in case the video is re-played\n\n // Fire event\n dispatchEvent(event.type);\n\n // TODO: Example for what happens when a next video in a playlist would be loaded.\n // So here we load a new video when all ads are done.\n // Then we load new ads within a new adsManager. When the video\n // Is started - after - the ads are loaded, then we get ads.\n // You can also easily test cancelling and reloading by running\n // player.ads.cancel() and player.ads.play from the console I guess.\n // this.player.source = {\n // type: 'video',\n // title: 'View From A Blue Moon',\n // sources: [{\n // src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n // 'video/mp4', }], poster:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n // };\n\n // TODO: So there is still this thing where a video should only be allowed to start\n // playing when the IMA SDK is ready or has failed\n\n this.loadAds();\n break;\n\n case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n // This event indicates the ad has started - the video player can adjust the UI,\n // for example display a pause button and remaining time. Fired when content should\n // be paused. This usually happens right before an ad is about to cover the content\n\n dispatchEvent(event.type);\n\n this.pauseContent();\n\n break;\n\n case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n // This event indicates the ad has finished - the video player can perform\n // appropriate UI actions, such as removing the timer for remaining time detection.\n // Fired when content should be resumed. This usually happens when an ad finishes\n // or collapses\n\n dispatchEvent(event.type);\n\n this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n case google.ima.AdEvent.Type.MIDPOINT:\n case google.ima.AdEvent.Type.COMPLETE:\n case google.ima.AdEvent.Type.IMPRESSION:\n case google.ima.AdEvent.Type.CLICK:\n dispatchEvent(event.type);\n break;\n\n default:\n break;\n }\n }\n\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\n }\n\n /**\n * Setup hooks for Plyr and window events. This ensures\n * the mid- and post-roll launch at the correct time. And\n * resize the advertisement when the player resizes\n */\n listeners() {\n const { container } = this.player.elements;\n let time;\n\n // Add listeners to the required events\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('seeking', () => {\n time = this.player.currentTime;\n return time;\n });\n\n this.player.on('seeked', () => {\n const seekedTime = this.player.currentTime;\n\n if (utils.is.empty(this.cuePoints)) {\n return;\n }\n\n this.cuePoints.forEach((cuePoint, index) => {\n if (time < cuePoint && cuePoint < seekedTime) {\n this.manager.discardAdBreak();\n this.cuePoints.splice(index, 1);\n }\n });\n });\n\n // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n window.addEventListener('resize', () => {\n if (this.manager) {\n this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n\n /**\n * Initialize the adsManager and start playing advertisements\n */\n play() {\n const { container } = this.player.elements;\n\n if (!this.managerPromise) {\n this.resumeContent();\n }\n\n // Play the requested advertisement whenever the adsManager is ready\n this.managerPromise\n .then(() => {\n // Initialize the container. Must be done via a user action on mobile devices\n this.elements.displayContainer.initialize();\n\n try {\n if (!this.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n // Call play to start showing the ad. Single video and overlay ads will\n // start at this time; the call will be ignored for ad rules\n this.manager.start();\n }\n\n this.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n this.onAdError(adError);\n }\n })\n .catch(() => {});\n }\n\n /**\n * Resume our video\n */\n resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = '';\n\n // Ad is stopped\n this.playing = false;\n\n // Play our video\n if (this.player.currentTime < this.player.duration) {\n this.player.play();\n }\n }\n\n /**\n * Pause our video\n */\n pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3;\n\n // Ad is playing.\n this.playing = true;\n\n // Pause our video.\n this.player.pause();\n }\n\n /**\n * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n * allowed to call new ads based on google policies, as they interpret this as an accidental\n * video requests. https://developers.google.com/interactive-\n * media-ads/docs/sdks/android/faq#8\n */\n cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n }\n\n // Tell our instance that we're done for now\n this.trigger('error');\n\n // Re-create our adsManager\n this.loadAds();\n }\n\n /**\n * Re-create our adsManager\n */\n loadAds() {\n // Tell our adsManager to go bye bye\n this.managerPromise\n .then(() => {\n // Destroy our adsManager\n if (this.manager) {\n this.manager.destroy();\n }\n\n // Re-set our adsManager promises\n this.managerPromise = new Promise(resolve => {\n this.on('loaded', resolve);\n this.player.debug.log(this.manager);\n });\n\n // Now request some new advertisements\n this.requestAds();\n })\n .catch(() => {});\n }\n\n /**\n * Handles callbacks after an ad event was invoked\n * @param {string} event - Event type\n */\n trigger(event, ...args) {\n const handlers = this.events[event];\n\n if (utils.is.array(handlers)) {\n handlers.forEach(handler => {\n if (utils.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 (!utils.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 (!utils.is.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n}\n\nexport default Ads;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport utils from './../utils';\nimport controls from './../controls';\nimport ui from './../ui';\n\n// Standardise YouTube quality unit\nfunction mapQualityUnit(input) {\n switch (input) {\n case 'hd2160':\n return 2160;\n\n case 2160:\n return 'hd2160';\n\n case 'hd1440':\n return 1440;\n\n case 1440:\n return 'hd1440';\n\n case 'hd1080':\n return 1080;\n\n case 1080:\n return 'hd1080';\n\n case 'hd720':\n return 720;\n\n case 720:\n return 'hd720';\n\n case 'large':\n return 480;\n\n case 480:\n return 'large';\n\n case 'medium':\n return 360;\n\n case 360:\n return 'medium';\n\n case 'small':\n return 240;\n\n case 240:\n return 'small';\n\n default:\n return 'default';\n }\n}\n\nfunction mapQualityUnits(levels) {\n if (utils.is.empty(levels)) {\n return levels;\n }\n\n return utils.dedupe(levels.map(level => mapQualityUnit(level)));\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n utils.toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Set aspect ratio\n youtube.setAspectRatio.call(this);\n\n // Setup API\n if (utils.is.object(window.YT) && utils.is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Load the API\n utils.loadScript(this.config.urls.youtube.api).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n\n // Setup callback for the API\n // YouTube has it's own system of course...\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(() => {\n youtube.ready.call(this);\n });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n window.onYouTubeReadyCallbacks.forEach(callback => {\n callback();\n });\n };\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n // Try via undocumented API method first\n // This method disappears now and then though...\n // https://github.com/sampotts/plyr/issues/709\n if (utils.is.function(this.embed.getVideoData)) {\n const { title } = this.embed.getVideoData();\n\n if (utils.is.empty(title)) {\n this.config.title = title;\n ui.setTitle.call(this);\n return;\n }\n }\n\n // Or via Google API\n const key = this.config.keys.google;\n if (utils.is.string(key) && !utils.is.empty(key)) {\n const url = `https://www.googleapis.com/youtube/v3/videos?id=${videoId}&key=${key}&fields=items(snippet(title))&part=snippet`;\n\n utils\n .fetch(url)\n .then(result => {\n if (utils.is.object(result)) {\n this.config.title = result.items[0].snippet.title;\n ui.setTitle.call(this);\n }\n })\n .catch(() => {});\n }\n },\n\n // Set aspect ratio\n setAspectRatio() {\n const ratio = this.config.ratio.split(':');\n this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n },\n\n // API ready\n ready() {\n const player = this;\n\n // Ignore already setup (race condition)\n const currentId = player.media.getAttribute('id');\n if (!utils.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 if needed\n if (utils.is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the