{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./player/config/translations.js","webpack:///./player/config.js","webpack:///./player/config/jw-keys.js","webpack:///./player/config/production.js","webpack:///./player/playback/config/status-codes.js","webpack:///./utils/server-time.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_root.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_getNative.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isArray.js","webpack:///./utils/script-loader.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseGetTag.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isObject.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/get.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_castPath.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_Symbol.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isObjectLike.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_nativeCreate.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_assocIndexOf.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_getMapData.js","webpack:///./icons/chevron-right.svg","webpack:///./utils/module-loader.js","webpack:///./icons/close.svg","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isSymbol.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_toKey.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isArguments.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isLength.js","webpack:///./player/plugins/anti-adblock/icons/pause.svg","webpack:///./icons/audio.svg","webpack:///./icons/audio-half.svg","webpack:///./icons/audio-muted.svg","webpack:///./icons/captions.svg","webpack:///./icons/fullscreen-off.svg","webpack:///./icons/fullscreen-on.svg","webpack:///./icons/info.svg","webpack:///./icons/pause.svg","webpack:///./icons/play.svg","webpack:///./icons/settings.svg","webpack:///./icons/share.svg","webpack:///./icons/progress.svg","webpack:///./icons/buffering.svg","webpack:///./icons/replay.svg","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_freeGlobal.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isFunction.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_toSource.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/eq.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_Map.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_defineProperty.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_isIndex.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_isPrototype.js","webpack:///(webpack)/buildin/module.js","webpack:///./icons/audio/audio-half.svg","webpack:///./icons/audio/audio-off.svg","webpack:///./icons/audio/audio-on.svg","webpack:///./icons/audio/forward-30.svg","webpack:///./icons/audio/pause.svg","webpack:///./icons/audio/play.svg","webpack:///./icons/audio/replay.svg","webpack:///./icons/audio/rewind-10.svg","webpack:///./icons/audio/playback-rate.svg","webpack:///./icons/error.svg","webpack:///./player/plugins/pause.html","webpack:///./player/plugins/countdown.html","webpack:///./player/plugins/recommended/recommended.html","webpack:///./player/plugins/recommended/next-asset.html","webpack:///./player/plugins/recommended/grid.html","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/pick.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isEmpty.js","webpack:///./player/plugins/anti-adblock/homad/lib.js","webpack:///./player/plugins/anti-adblock/icons/play.svg","webpack:///./player/plugins/anti-adblock/icons/speaker.svg","webpack:///./player/plugins/anti-adblock/icons/speaker-muted.svg","webpack:///./player/plugins/anti-adblock/icons/link.svg","webpack:///./player/plugins/anti-adblock/icons/fullscreen.svg","webpack:///./svp-player.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_basePick.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_basePickBy.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_isKey.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_getRawTag.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_objectToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_stringToPath.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_memoizeCapped.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/memoize.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_MapCache.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_mapCacheClear.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_Hash.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_hashClear.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseIsNative.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_isMasked.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_coreJsData.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_getValue.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_hashDelete.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_hashGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_hashHas.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_hashSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_ListCache.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_listCacheClear.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_listCacheDelete.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_listCacheGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_listCacheHas.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_listCacheSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_mapCacheDelete.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_isKeyable.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_mapCacheGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_mapCacheHas.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_mapCacheSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/toString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_arrayMap.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_assignValue.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseAssignValue.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/hasIn.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseHasIn.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_hasPath.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseIsArguments.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_flatRest.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/flatten.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseFlatten.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_arrayPush.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_isFlattenable.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_overRest.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_apply.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_setToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseSetToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/constant.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/identity.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_shortOut.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseKeys.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_nativeKeys.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_overArg.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_getTag.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_DataView.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_Promise.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_Set.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_WeakMap.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isArrayLike.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isBuffer.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/stubFalse.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/isTypedArray.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseIsTypedArray.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_baseUnary.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.47.0/node_modules/lodash/_nodeUtil.js","webpack:///./utils/underscore.js","webpack:///./utils/backbone.events.js","webpack:///./utils/device.js","webpack:///./utils/merge.js","webpack:///./utils/utils.js","webpack:///./utils/logger.js","webpack:///./player/model/locale.js","webpack:///./player/services/api.js","webpack:///./utils/model.js","webpack:///./player/model/category.js","webpack:///./player/model/asset.js","webpack:///./utils/image.js","webpack:///./utils/string.js","webpack:///./player/model/domain.js","webpack:///./player/model/token.js","webpack:///./player/model/stream.js","webpack:///./player/playback/ads/appnexus-tag-builder.js","webpack:///./player/playback/ads/appnexus-jw-config.js","webpack:///./player/playback/ads/appnexus.js","webpack:///./player/playback/config/playlist.js","webpack:///./player/playback/config/sharing.js","webpack:///./player/playback/config/playback.js","webpack:///./player/playback/config/chromecast.js","webpack:///./player/plugins/anti-adblock/dom.js","webpack:///./player/playback/skin/tts-skin.js","webpack:///./player/playback/youbora.js","webpack:///./player/playback/config.js","webpack:///./player/playback/config/captions.js","webpack:///./player/playback/config/jw-youbora.js","webpack:///./player/playback/config/keys.js","webpack:///./player/services/api/related.js","webpack:///./player/services/api/asset/mock.js","webpack:///./player/services/api/asset.js","webpack:///./player/model/next-asset.js","webpack:///./player/model/recommended/list.js","webpack:///./player/model/recommended.js","webpack:///./player/plugins/pulse-stats/tracker.js","webpack:///./utils/video-preview.js","webpack:///./player/events/error.js","webpack:///./player/playback/ads/appnexus-ast.js","webpack:///./utils/eventable.js","webpack:///./utils/mixin.js","webpack:///./player/plugins/model.js","webpack:///./player/plugins/pause.js","webpack:///./player/plugins/age-limit.js","webpack:///./player/plugins/sponsor-label.js","webpack:///./player/plugins/podcast-experiment.js","webpack:///./player/plugins/countdown.js","webpack:///./player/plugins/recommended.js","webpack:///./player/plugins/svp-stats/tracker.js","webpack:///./player/plugins/svp-stats.js","webpack:///./player/plugins/pulse-stats/ad-events.js","webpack:///./player/plugins/pulse-stats/session.js","webpack:///./player/plugins/pulse-stats/playback-events.js","webpack:///./player/plugins/pulse-stats/helpers.js","webpack:///./player/plugins/pulse-stats/ui-events.js","webpack:///./player/model/category-tree.js","webpack:///./player/plugins/pulse-stats.js","webpack:///./player/plugins/podcast-native-link.js","webpack:///./player/plugins/anti-adblock/homad/eventbus.js","webpack:///./player/plugins/anti-adblock/homad/config.js","webpack:///./player/plugins/anti-adblock/homad/global.js","webpack:///./player/plugins/anti-adblock/homad/proxy.js","webpack:///./player/plugins/anti-adblock/homad.js","webpack:///./player/plugins/anti-adblock/homad/utils.js","webpack:///./player/plugins/anti-adblock/index.js","webpack:///./player/plugins/anti-adblock/tracking.js","webpack:///./player/events/playlist.js","webpack:///./player/events/complete.js","webpack:///./player/events/helpers.js","webpack:///./player/events/asset.js","webpack:///./player/playback/config/autoplay.js","webpack:///./player/playback/ads/prevent-seeking.js","webpack:///./utils/style-loader.js","webpack:///./player/playback/skin/jw-controls.js","webpack:///./player/playback/skin/audioSkinResolver.js","webpack:///./player/playback/skin/icons-loader.js","webpack:///./player/playback/skin/settings-menu.js","webpack:///./player/playback/skin/config-button.js","webpack:///./utils/clipboard.js","webpack:///./player/playback/skin/sharing-box.js","webpack:///./player/playback/skin/container-class.js","webpack:///./player/playback/skin/levels-icon.js","webpack:///./player/playback/skin/nextUp.js","webpack:///./player/playback/skin.js","webpack:///./player/playback/provider.js","webpack:///./player/plugins.js","webpack:///./player/events/config.js","webpack:///./player/player.js","webpack:///./index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","translations","en","months","Sharing","en_GB","es_ES","nb_NO","sv_SE","ads","admessage","cuetext","skipmessage","skiptext","podmessage","player","listen","playback","loginToListen","subscribeToListen","seconds","minutes","hours","tts","play","playing","continue","remaining","minute","second","no","pause","volume","prev","next","cast","airplay","fullscreen","playlist","hd","cc","audioTracks","playbackRates","replay","buffer","more","liveBroadcast","loadingAd","rewind","nextUp","nextUpClose","related","close","settings","unmute","copied","forward","se","version","keys","default","ab","adressa","adressabrandstudio","altaposten","ap","bt","brandstudio","folkebladet","fvn","harstad","itromso","podcast","rbnett","riks","ridenews","sa","schibsted","smp","svd","tronderavisa","vgtv","vgtvs","tvnu","tvh","steinkjer","avisast","bladet","banett","innherred","fosnafolket","opp","tronderbladet","stjordalsnytt","mn24","hitrafroya","framtidinord","vaganavisa","vol","nyttiuka","vikebladet","fjt","vestlandsnytt","fjuken","vigga","dolen","fjordabladet","morenytt","fjordingen","driva","andalsnes","nyss","agderposten","lindesnes","farsund","varden","lp","venneslatidende","gat","bomlonytt","sunnhordland","klaebuposten","gauldalsposten","froya","bnytt","vnytt","stri","avavis","bareasane","e24","op","r24","stord","marsteinen","aptts","vgtvexternal","api","url","tokenUrl","thumbnailsUrl","relatedApiUrl","vmapUrl","vendor","identifier","endpoint","joiner","indexOf","this","cb","Math","random","appnexus","vmap","ptv","cr","ast","debug","cdn","svp","pollyfils","youbora","time","images","servers","sizes","poster","autoHeight","autoWidth","liveVideoPreview","videoPreview","skins","about","link","text","sharing","global","sites","code","domains","blacklist","whitelist","preview","vendors","locale","ACTIVE","ACTIVE_PREVIEW","NOT_ACTIVE","NOT_ACTIVE_GEOBLOCKED","NOT_ACTIVE_TOKEN","NOT_FOUND","NOT_ACTIVE_PAST","GENERAL_ERROR","NETWORK_ERROR","TOKEN_FETCH_ERROR","statusMessages","ServerTime","responseTime","fetched","fetch","Promise","resolve","resolveRequest","Date","getTime","then","result","serverTime","parseInt","Number","isNaN","freeGlobal","freeSelf","self","root","Function","baseIsNative","getValue","undefined","isArray","Array","path","onSuccess","onError","script","document","createElement","done","callback","type","src","async","onreadystatechange","onload","readyState","onerror","body","appendChild","getRawTag","objectToString","symToStringTag","baseGet","defaultValue","isKey","stringToPath","toString","nativeCreate","getNative","eq","array","length","isKeyable","map","data","__data__","moduleSrc","window","define","amd","require","baseGetTag","isObjectLike","isSymbol","baseIsArguments","objectProto","propertyIsEnumerable","isArguments","arguments","castPath","toKey","index","isObject","tag","funcToString","func","e","other","Map","reIsUint","test","Ctor","constructor","webpackPolyfill","deprecate","paths","children","basePick","pick","flatRest","baseKeys","getTag","isArrayLike","isBuffer","isPrototype","isTypedArray","splice","size","isLoaded","exportz","k","b","u","g","a","round","String","fromCharCode","floor","A","h","f","q","charCodeAt","push","toLowerCase","j","charAt","fireEvent","createEvent","state","initCustomEvent","dispatchEvent","track","homad","M","isEnabled","T","encodeURIComponent","homad_url_prefix_alias","homad_track_key","homad_track_value","P","setTimeout","v","w","S","message","V","C","O","F","J","G","I","K","H","B","U","R","D","L","N","X","W","z","abs","now","navigator","appCodeName","appName","appVersion","userAgent","platform","language","reverse","match","y","conf","startPlayer","eval","fp_error","hd_ready","head","firstChild","insertBefore","setInterval","addEventListener","clearTimeout","getElementsByTagName","parentNode","removeChild","getElementsByClassName","top","hasChildNodes","lastChild","homad_url_suffix_base64","homad_url_suffix","homad_hash_guessed","x","enabled","server","replace","config","XMLHttpRequest","status","JSON","parse","responseText","open","substr","setRequestHeader","send","location","hostname","onFailure","globalConfig","clientConfig","clearInterval","loadJwPlayer","PLAYER_LIB","jwplayer","onReady","onSvpPlayerReady","all","library","SVP","preInitialize","postInitialize","event","initEvent","basePickBy","hasIn","baseSet","predicate","reIsDeepProp","reIsPlainProp","nativeObjectToString","isOwn","unmasked","memoizeCapped","rePropName","reEscapeChar","string","number","quote","subString","memoize","cache","clear","MapCache","resolver","TypeError","memoized","args","apply","has","set","Cache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","entries","entry","Hash","ListCache","hashClear","hashDelete","hashGet","hashHas","hashSet","isFunction","isMasked","toSource","reIsHostCtor","funcProto","reIsNative","RegExp","uid","coreJsData","maskSrcKey","exec","IE_PROTO","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","assocIndexOf","pop","getMapData","baseToString","arrayMap","symbolProto","symbolToString","iteratee","assignValue","isIndex","customizer","lastIndex","nested","newValue","objValue","baseAssignValue","baseHasIn","hasPath","isLength","hasFunc","flatten","overRest","setToString","baseFlatten","arrayPush","isFlattenable","depth","isStrict","values","offset","spreadableSymbol","isConcatSpreadable","nativeMax","max","start","transform","otherArgs","thisArg","baseSetToString","shortOut","constant","identity","nativeNow","count","lastCalled","stamp","nativeKeys","overArg","arg","DataView","Set","WeakMap","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","ctorString","stubFalse","freeExports","nodeType","freeModule","Buffer","baseIsTypedArray","baseUnary","nodeUtil","nodeIsTypedArray","typedArrayTags","freeProcess","process","types","binding","idCounter","_","MAX_ARRAY_INDEX","pow","getLength","obj","isEmpty","isString","uniqueId","prefix","id","Events","eventSplitter","eventsApi","events","opts","names","context","split","onApi","options","handlers","ctx","listening","internalOn","_events","_listeners","on","listenTo","_listenId","listeningTo","_listeningTo","thisId","objId","offApi","listeners","ids","handler","_callback","off","stopListening","onceMap","offer","once","listenToOnce","triggerEvents","ev","a1","a2","a3","triggerApi","objEvents","allEvents","slice","concat","trigger","unbind","userAgentMatch","regex","lazyUserAgentMatch","isIETrident","isIPad","maxTouchPoints","isEdge","isAndroid","isTablet","isMobile","isIOS","isAppleIOS","isIPhone","isSafari","isIE","isFirefox","isDesktop","isSamsungInternet","isHermesApp","isBot","getChromeVersion","raw","getPixelRatio","devicePixelRatio","getDeviceType","canAutoplay","isMergeableObject","val","cloneIfNecessary","optionsArgument","clone","deepmerge","defaultArrayMerge","target","source","destination","forEach","arrayMerge","mergeObject","Error","reduce","jwUtils","utils","jwUnderscore","extend","merge","ajax","each","isUndefined","isNumber","createNode","addStyleSheet","addClass","removeClass","template","tmpl","str","fn","join","getElementById","innerHTML","device","shareTimeToSeconds","compact","zeroPad","getTimeFormatted","timestamp","getScrollSnapPrefix","scrollSnapSupport","documentElement","style","loadScript","reject","jsonToUrl","counters","log","counter","console","error","block","itemKey","localStorage","getItem","unshift","translate","substitute","setTranslations","getMonthName","date","getMonth","getTranslations","handleErrors","response","ok","makeFetch","json","assetAdditionalData","getUrl","attr","attributes","oldVal","Category","initialize","additional","background","main","image","logo","playerLogo","playerLogoImage","Asset","getVendor","unifyTimestamp","startIndexPoint","ageLimit","sourceFiles","series","season","seasonNumber","episode","episodeNumber","flightTimes","end","created","published","updated","category","chapters","chapter","timeline","nextAsset","tags","_embedded","assign","metadata","isSponsored","sponsored","title","chapterIndex","getChapters","requestNumber","currentServerId","serversAmount","getServer","imageId","getImageQuality","pixelRatio","getImageTransform","width","height","min","cacheKey","transformSizes","transformType","maxDimension","dimensions","normalizeTransformSize","curr","getClosestSize","getImageSrc","extension","prop","stringify","capitalizeFirstLetter","toUpperCase","isDomainInArray","origin","domain","pos","domainBeginning","len","inherit","parent","child","na","item","fetchToken","params","isFetching","expire","assetId","assetAccess","maxBitrate","request","configuration","isValid","query","expiry","Stream","streams","hls","streamUrls","mp4","streamType","mediaType","assetType","streamConfiguration","snapshots","captions","begin","externalId","duration","disableNextVideo","chunkDuration","isPodcast","hasSubtitlesInHls","Boolean","tts_articleId","videoPreviews","metadataKey","metadataValue","includes","showAds","cuePoints","properties","hasProperty","isPast","getTimeToStart","isActive","isOnHttp","protocol","startsWith","streamUrl","getId","position","supplyType","buildUrlString","getVmapTag","stream","overriddenParams","urlParams","URLSearchParams","search","slotName","creativeId","tagId","getOverriddenParams","adSlotConfig","adLabel","adConfig","overriddenId","format","isAudio","getParams","memberId","member","parseAdPlacements","adPlacements","globalParams","placements","placementId","tagOptions","globalOptions","getJwAdSchedule","adSlots","adsConfig","hasNext","startTime","getPlaybackTime","setParams","add","preroll","getCuePoints","cuePoint","isSecure","midroll","postroll","getConfig","getAdsConfig","schedule","getAdPlacements","getClientConfig","adn","hasAdsDisabled","svpAdConfig","publisherName","countryCode","slotIds","svpPlayer","logger","adSchedule","adOptions","getLiveMidrollTag","maxDuration","vmaxduration","createMidroll","hasEntered","onEnterCallback","setTime","onEnter","description","minDvrWindow","addPlaylistMetadata","playlistItem","mediaId","getExternalId","mediaid","starttime","addSnapshots","hasSnapshots","tracks","file","getSnapshots","kind","addCaptions","getCaptions","caption","label","hasMp4Streams","sources","isMock","preload","advertising","client","autoplayMuted","autoplayadsmuted","vpaidcontrols","preloadAds","adschedule","addAppnexusAds","getVmapApiUrl","globals","defaults","heading","canAutostart","autoplay","hasPlayableSource","autostart","mute","skin","some","slot","hasPreroll","isFuture","autopause","autoPause","viewability","pauseAds","repeat","chromecastApps","CB3CFFEE","C6559D78","E43A13ED","B6C9EA8E","E64998E3","A7738716","A5965089","tagName","element","attribute","setAttribute","createTextNode","HTMLElement","classNames","pluralize","singular","plural","timeToText","formatTime","padStart","ttsSkinResolver","useTextSpeechSkin","shouldApplyTextToSpeechSkin","elements","radius","updateSliderOffset","arcLength","PI","progressValue","progressBar","strokeDashoffset","updateDetailTexts","durationText","textContent","playbackText","remainingText","container","getContainer","classList","bufferingIcon","class","pauseIcon","playIcon","replayIcon","slider","querySelector","idleText","pauseText","playingText","controls","createControls","onclick","seek","getAttribute","getCurrentTime","getStream","getDuration","forceLoad","Plugin","setAdapter","adapters","JWPlayer","Config","node","env","token","disableCountdownPlugin","jwDefaults","base","horizontalVolumeSlider","getMaxBitrate","rawOptions","getSettings","getRaw","playerContainer","getPoster","clientWidth","clientHeight","ttsSkinOption","currentStream","hasTextSpeech","isCustomMetadataKey","isLive","getVideoPreviewMetadataKey","getVideoPreviewUrl","isAudioWithoutCustomTitle","getCategory","getChunkDuration","getToken","isGeoblocked","getStreamUrl","catch","playlistStreams","asset","vendorEntry","find","abouttext","aboutlink","localization","plugins","customAppId","getChromecastAppId","getLiveSyncDuration","liveSyncDuration","jwConfig","getPlaylistItems","promise","setStream","playlistSettings","getPlaylistSettings","playlistOptions","getTitle","getDescription","applyPlaylistAdding","addSharing","applyTtsOption","native","renderCaptionsNatively","content_id","owner","jw","hasRecommended","getRecommended","getPermissions","permissions","freeze","writable","getRelatedAssets","limit","relatedApi","VIDEO","Blob","Uint8Array","URL","createObjectURL","createResponse","hasPlayNext","assets","fetchNextFromRelatedEngine","getNext","reason","fetchFromRelated","mapResponse","fetchNextById","fetchNext","PulseTrackerLoader","trackers","pulse","provider","load","getTracker","storedTracker","PROVIDER_TRACKER_ID","tracker","queryVideoPreviewElements","previewContainer","previewElement","removeVideoPreviewElement","remove","createPreviewElement","loop","muted","addVideoPreviewElement","model","previewUrl","clearError","previousErrorNode","displayError","posterSrc","errorNode","details","translatedMessage","errorDetails","stop","onAssetError","apntag","firstLoad","tagConfig","targetId","defineTag","loadTags","onEvent","showTag","refresh","dimmensions","resizeAd","offEvent","Eventable","copyProperties","Reflect","ownKeys","desc","getOwnPropertyDescriptor","super","el","setup","maxDisplays","displayCounter","withAdTag","sourceMethod","adPlacement","withCounter","getName","getBoundingClientRect","resizeTag","containerId","appnexusAdId","adId","adData","isAdTagLoaded","show","getState","pauseReason","getViewable","refreshTag","hide","onPause","timerId","onSeek","render","adTagOptions","appnexusAdContainerId","closeIcon","playButton","closeButton","onResumeClick","stopPropagation","hideAfter","sponsor","pluginName","adFrom","assertUppercased","actual","expected","chooseVariant","variants","rangeNumber","winner","Percentage","percentage","prepareVariantsForExperiment","variantIds","filter","current","isLoginVariantType","variant","Type","loginUrl","subscriptionUrl","articleUrl","OfferButton","isSubscriptionVariantType","jwPlayer","useExtendedVariant","getHeight","buttonText","getButtonText","uiElementId","getUiElementId","pulseStatsPlugin","PulseStats","playbackEvents","productType","Offer","OfferHeader","OfferPreamble","redirectUrl","linkAnchor","linkSpan","experimentInfo","experimentOverlay","leadingZeros","numValue","numLen","num","streamStart","liveDOM","countdownDOM","isPlaylistRegenerated","intervalId","diff","getDiff","isCountdownActive","currentState","getDate","getHours","getMinutes","newDiff","shouldRegeneratePlaylist","regeneratePlaylist","ceil","playNext","nextAssetSource","disableNext","getThumbnailUrl","initSnapScroll","scrollSnapPrefix","gridItem","getByClass","onGridItemClicked","dataset","onPlaybackStart","recommended","getAsset","gridItemsReady","grid","getItems","items","getNextAsset","onInitialize","fetchDuration","countdownTime","isDisabledNextVideo","hasPlaylist","isAssetFromPlaylist","onPlaybackComplete","onTimeNextVisible","onPlayNextVisible","timeout","transitionDuration","Image","getThumbnail","countdown","nextIcon","onGridItemsReady","onGridVisible","onAssetReplay","className","previousEl","sendRequest","queryString","apiUrl","getApiUrl","hypen","trackingInterval","getTrackingInterval","initialStartTime","currentTime","trackMediaEvent","playerTime","trackStreamEvent","adSlot","adSequenceDuration","beforeUnload","onAdSlotComplete","onPlaylistItem","onAdSlotStart","onAdStarted","onAdProgress","onAdFinished","onAdPause","onAdPlay","onPauseAdVisible","slotData","sendStopEvent","removeEventListener","meta","sequence","podcount","watchData","previousTime","session","createSession","beforeStreamStart","onBeforeUnload","playMethod","vodInterval","liveInterval","onAssetPlay","onPlay","onPlayNext","onLiveTime","onTime","playbackSource","onRecommendedPlay","jwRelatedPlugin","onComplete","playReason","previousAssetId","getPlugin","defaultInterval","customInterval","eventInterval","isCustomIntervalFalsy","eventData","wasViewed","viewable","eventTime","trackTimeEvent","getPosition","onRecommendedVisible","ui","categories","categoryId","parentId","instances","getMediaAssetId","experiment","decorator","intervals","engagementIntervals","embed","playerAsset","accessControl","access","getTags","stories","getStories","originAssetId","categoryPath","categoryTree","getPath","eventName","experiments","getCategoryPath","resolveTracker","adEvents","vod","live","uiEvents","init","onAdEvent","onPlaybackEvent","onUiEvent","intent","trackingData","getMute","getFullscreen","isAutoplay","adSequenceCount","adblock","getAdBlock","mediaAssetId","adSequencePosition","toLocaleLowerCase","destroy","overlay","parseHomadEvent","detail","videoTag","videoTagId","getTagUrl","potOffset","getPlaylist","getAdPotTag","homadDefaultConfig","skipable","skipAdOnContextChange","runInsideContainer","adjustAdVolumeToContentPlayer","postrollUseCompleteEvent","clickthrough_target","zIndex","prerollAdTag","midrollAdTag","postrollAdTag","initializeHomadLib","SvpPlayer","Player","isHomadLoaded","homadConfig","aabConfig","createProxyMethods","onFirstFrameLoad","playlistItemId","adPlaying","adPlayerLoading","playerId","overrides","applyPlayerMixin","onContentPlayerPlay","onAdStart","onContinueContent","onAdTime","onPlayerAdError","onPlayerAdBreakStart","onPlayerPlaylistItem","onPlayerAdPlay","forwardEventToPlayer","videoElements","querySelectorAll","video","controlsContainer","nextElementSibling","muteButton","childNodes","dom","adPosition","hasAdBlocked","adposition","handleAdLabelClick","handlePlayPauseClick","handleMuteClick","handleFullscreenClick","aab","initializeHomad","adIds","resetSequence","onHomadAdStart","adID","homadImpressionAdId","onHomadAdPause","onHomadAdTime","homadAdTracker","onHomadReady","hideHomadNativeControls","attachEventListeners","onMuteToggle","setAdPlaying","setAdComplete","getPlaybackState","detachEventListeners","mainDiv","cssText","fullscreenButton","labelText","iconPlaceholder","href","rel","err","innerText","click","preventDefault","playerClassList","adStarted","useClasses","setFullscreen","playNextFromPlaylist","masterAsset","nextAssetData","assetData","setAsset","icon","videoElement","isCompleted","destroyPlugin","plugin","onPlayerEvent","callFunction","onAssetReady","setMasterAsset","addPlugin","getChapter","getAgeLimit","getCategoryTitle","isExperiment","experimentId","experimentRange","sessionStorage","setItem","userStatus","loggedIn","hasProduct","pulseConfig","isStreamPlayable","canDeviceAutoplay","supposedCurrentTime","onSeeking","onTimeUpdate","seeking","handle","loadedStylesheets","ensureIfControlsLoaded","checkIfControlsLoaded","requestAnimationFrame","waitForControls","PLAYBACK_RATES","forwardIcon","audioSkinResolver","useAudioSkin","seekForward","changePlaybackRate","rate","getPlaybackRate","nextRateIndex","findIndex","currentRate","setPlaybackRate","playbackRate","getControls","toFixed","forwardTooltip","displayControl","cover","forwardButton","durationInfo","playbackRateButton","addButton","displayStyle","translatePlayerConfig","display","iconsMap","info","audioIconsMap","loadIcons","isAudioStream","replaceableIconsMap","customIcon","selector","replaceableIcons","replaceableIcon","svpIcon","replaceChild","contains","submenu","right","offsetWidth","offsetLeft","submenuHandler","infoNode","tip","dump","left","focus","select","execCommand","copyToClipboard","hasMediaId","getSharingLink","updateElement","replaceElement","sourceEl","newEl","cloneNode","updateSharingBox","svpPlayerModel","handleAppnexusClass","levels","handleLevelSettingsIcon","getTitleNode","skinLoader","loader","svpSkin","itemsShown","PlayerModel","isInitalized","isStopped","adBreaks","forwardEvent","bindJwMethod","method","warn","getAdPosition","slotId","pre","mid","post","onPlaybackEndAvailable","playbackEnd","adjustAudioVolumeOnMobile","isTextSpeech","isMobileAudio","setVolume","youboraRatio","isPreviewMode","hasAccess","accountCode","enableAnalytics","onPlaylistItemLoad","onViewable","onAutostartNotAllowed","onMeta","onMetadataCueParsed","getCaptionsList","xml","adSelector","parseAdData","adbreaks","nextAd","ad","disableAutoplay","complete","getVolume","setMute","nextStream","getJwConfig","loadStream","force","isAdPlaying","playerCaptions","newIndex","captionsIndex","setCurrentCaptions","hasValidToken","playbackEndTime","slotDuration","onTimeChange","adTag","playAd","content","skipAd","TXXX","insertAd","cancelAd","methods","forwardedMethods","CustomPluginModel","scripts","pluginSrc","onceConfigReady","handleReady","handleError","pluginConfig","isBlacklisted","relatedUrl","isPlayNextAvailable","onNextAssetReady","getCurrentCaptions","getPlayer","getServerTime","recommendedPlugin","setPlayer","Plugins","__defaults","configurable","receivedAt","setLocale","svpYoubora","loadYoubora"],"mappings":"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EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,EAAG,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,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","file":"player.next.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 71);\n","/* eslint-disable max-len */\nimport codeToString, * as STATUS_CODES from '../playback/config/status-codes';\n\n// translation configuration for different locales\nconst translations = {\n en: {\n // Countdown plugin\n 'Video will start at': 'Video will start at',\n 'Video will start in': 'Video will start in',\n\n 'ageLimit-0': 'A',\n\n // SponsorOverlay plugin\n 'Ad from': 'Ad from',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Sorry. An error occured. Try again later.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'The video failed to play due to geoblock restrictions.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_TOKEN)]: 'This video can not be played because it is protected. Try again later.',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Sorry. This video is unavailable.',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Sorry. This video is not active.',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Sorry. This video is unavailable.',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Network issues. Please check your internet connection',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: 'Sorry. An error occured. Try again later.',\n\n // sharing box heading\n Sharing: 'Share this video',\n 'Live button': 'Live',\n\n // error message\n 'Error code': 'Error code',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n sv_SE: 'Swedish',\n\n 'Audio video switch': 'Audio video switch',\n 'Playing audio only': 'Playing audio only',\n\n ads: {\n // jw ad messages\n admessage: 'The ad will end in xx seconds',\n cuetext: 'Advertisement',\n skipmessage: 'Skip ad in xx',\n skiptext: 'Skip',\n podmessage: 'Ad __AD_POD_CURRENT__ of __AD_POD_LENGTH__'\n },\n\n player: {\n listen: 'Listen',\n playback: 'Start playback',\n loginToListen: 'Sign in to listen',\n subscribeToListen: 'Subscribe to listen',\n seconds: 'sec',\n minutes: 'min',\n hours: 'h'\n },\n tts: {\n play: 'Play the case',\n playing: 'Playing off',\n continue: 'Finish listening',\n remaining: 'remaining',\n minute: 'minute',\n minutes: 'minutes',\n second: 'second',\n seconds: 'seconds'\n }\n },\n no: {\n // Countdown plugin\n 'Video will start at': 'Videoen starter',\n 'Video will start in': 'Videoen starter om',\n\n 'ageLimit-0': 'A',\n\n // SponsorOverlay plugin\n 'Ad from': 'Annonse fra',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'Denne videoen er kun tilgjengelig i Norge',\n // token for stream is incorrect\n [codeToString(STATUS_CODES.NOT_ACTIVE_TOKEN)]: 'Denne videoen kan dessverre ikke spilles av da den er beskyttet. Prøv igjen senere.',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Beklager, videoen er ikke tilgjengelig',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Beklager, videoen er ikke tilgjengelig',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Beklager, vi har ikke rettigheter til å vise videoen lenger',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Kunne ikke spille av video, venligst sjekk internettforbindelsen din',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: 'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n\n // jw player error messages\n 'This video cannot be played because of a technical error.': 'Kunne ikke spille av video på grunn av en teknisk feil',\n 'Sorry, the video player failed to load.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video file cannot be played.': 'Kunne ikke spille av video',\n 'The live stream is either down or has ended.': 'Livesendingen er nede eller er avsluttet',\n 'There was a problem providing access to protected content.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video cannot be played because of a problem with your internet connection.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n\n // sharing box heading\n Sharing: 'Del denne videoen',\n 'Live button': 'Direkte',\n\n // error message\n 'Error code': 'Feilkode',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n sv_SE: 'Svensk',\n\n ads: {\n admessage: 'Annonsen slutter om xx',\n cuetext: 'Annonse',\n skipmessage: 'Hopp over om xx',\n skiptext: 'Hopp over',\n podmessage: 'Annonse __AD_POD_CURRENT__ av __AD_POD_LENGTH__'\n },\n player: {\n player: 'Videospiller',\n play: 'Spill',\n playback: 'Start avspilling',\n pause: 'Pause',\n volume: 'Volum',\n prev: 'Forrige',\n next: 'Neste',\n cast: 'Chromecast',\n airplay: 'AirPlay',\n fullscreen: 'Fullskjerm',\n playlist: 'Spilleliste',\n hd: 'Kvalitet',\n cc: 'Undertekster',\n audioTracks: 'Lydspor',\n playbackRates: 'Avspillingshastighet',\n replay: 'Spill igjen',\n buffer: 'Laster inn',\n more: 'Mer',\n liveBroadcast: 'Live',\n loadingAd: 'Laster annonse',\n rewind: 'Spol tilbake 10 sekunder',\n nextUp: \"Neste' video\",\n nextUpClose: 'Lukk neste',\n related: 'Relaterte videoer',\n close: 'Lukk',\n settings: ' Innstillinger',\n unmute: 'Slå på lyd',\n copied: 'Kopiert',\n forward: 'Spol fram 30 sekunder',\n loginToListen: 'Logg inn for å lytte',\n subscribeToListen: 'Abonner for å lytte',\n listen: 'Lytt',\n seconds: 'sek',\n minutes: 'min',\n hours: 't'\n },\n tts: {\n play: 'Spill av saken',\n playing: 'Spiller av',\n continue: 'Lytt ferdig',\n remaining: 'gjenstår',\n minute: 'minutt',\n minutes: 'minutter',\n second: 'sekund',\n seconds: 'sekunder'\n }\n },\n\n se: {\n // Countdown plugin\n 'Video will start at': 'Videon är tillgänglig',\n 'Video will start in': 'Videon är tillgänglig om',\n\n 'ageLimit-0': 'A',\n\n // SponsorOverlay plugin\n 'Ad from': 'Annons från',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Något gick fel. Försök igen senare.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'Vi har tyvärr endast rättigheter att spela detta innehåll i Sverige',\n // token for stream is incorrect\n [codeToString(STATUS_CODES.NOT_ACTIVE_TOKEN)]: 'Denna video kan inte spelas upp eftersom den är skyddad. Försök igen senare.',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Videon är inte tillgänglig',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Videon är inte tillgänglig',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Videon är inte tillgänglig',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: 'Token kunde inte hämtas',\n\n // jw player error messages\n 'This video cannot be played because of a technical error.': 'Den här videon kan inte spelas på grund av ett tekniskt fel',\n 'Sorry, the video player failed to load.': 'Något gick fel. Försök igen senare',\n 'This video file cannot be played.': 'Det gick inte att spela videon',\n 'The live stream is either down or has ended.': 'Live överföring är antingen nere eller har slutat',\n 'There was a problem providing access to protected content.': 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n 'This video cannot be played because of a problem with your internet connection.': 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n\n // sharing box heading\n Sharing: 'Dela',\n 'Live button': 'Live',\n\n // error message\n 'Error code': 'Felkod',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n sv_SE: 'Sverige',\n\n ads: {\n admessage: 'Annonsen tar slut om xx sekunder',\n cuetext: 'Annons',\n skipmessage: 'Skippa annons om xx',\n skiptext: 'Skippa',\n podmessage: 'Annons __AD_POD_CURRENT__ av __AD_POD_LENGTH__'\n },\n player: {\n player: 'Videospelare',\n play: 'Spela',\n playback: 'Spela video',\n pause: 'Pausa',\n volume: 'Volym',\n prev: 'Förra',\n next: 'Nästa',\n cast: 'Chromecast',\n airplay: 'AirPlay',\n fullscreen: 'Fullskärm',\n playlist: 'Spellista',\n hd: 'Kvalitet',\n cc: 'Undertexter',\n audioTracks: 'Ljudspår',\n playbackRates: 'Uppspelningshastighet',\n replay: 'Spela igen',\n buffer: 'Laddar',\n more: 'Mer',\n liveBroadcast: 'Live',\n loadingAd: 'Laddar annons',\n rewind: 'Spola tillbaka 10 sekunder',\n nextUp: 'Nästa',\n nextUpClose: 'Stäng',\n related: 'Fler videos',\n close: 'Stäng',\n settings: 'Inställningar',\n unmute: 'Slå på ljud',\n copied: 'Kopierad',\n forward: 'Spola framåt 30 sekunder',\n loginToListen: 'Logga in för att lyssna',\n subscribeToListen: 'Prenumerera för att lyssna',\n listen: 'Lyssna',\n seconds: 'sek',\n minutes: 'min',\n hours: 't'\n }\n }\n};\n\n/**\n * Get single locale translations hash map\n */\nexport default function (locale) {\n return translations[locale];\n}\n","/* global __BUILD_VERSION__ */\nimport translations from './config/translations';\nimport jwKeys from './config/jw-keys';\n\nconst VERSION = __BUILD_VERSION__;\n\nconst config = {\n version: VERSION,\n player: {\n keys: jwKeys\n },\n /**\n * SVP API configuration\n */\n api: {\n url: '//svp.vg.no/svp/api/v1/',\n tokenUrl: '//svp.vg.no/svp/token/v1/',\n thumbnailsUrl: '//svp.vg.no/svp/thumbnails/v1/',\n relatedApiUrl: 'https://related.stream.schibsted.media',\n vmapUrl: 'https://vmap.stream.schibsted.media',\n\n vendor: null,\n /**\n * API identifier\n */\n identifier: 'svp-player',\n\n /**\n * Get full endpoint url to requested resource\n *\n * @param {string} vendor\n * @param {string} endpoint\n * @returns {string}\n */\n getUrl(vendor, endpoint) {\n const joiner = (endpoint.indexOf('?') > -1) ? '&' : '?';\n let url = `${this.url + vendor + endpoint + joiner}appName=${this.identifier}`;\n\n // enable cachebreaking in preview mode\n if (this.cb === true) {\n url += `&cb=${Math.random() * 10000}`;\n }\n\n return url;\n }\n },\n\n ads: {\n appnexus: {\n vmap: 'https://ib.adnxs.com/vmap',\n ptv: 'https://ib.adnxs.com/ptv',\n cr: 'https://ib.adnxs.com/cr',\n ast: 'https://acdn.adnxs.com/ast/ast.js',\n debug: false\n }\n },\n\n cdn: {\n svp: `//cdn.stream.schibsted.media/player/${VERSION}`,\n player: '//cdn.stream.schibsted.media/jw/jwplayer-8.26.4',\n pollyfils: '//svp.vgc.no/pollyfils/es6-promise.min.js',\n youbora: 'https://smartplugin.youbora.com/v6/js/adapters/jwplayer/6.8.1/sp.min.js'\n },\n\n time: '//time.akamai.com',\n\n /**\n * Imbo images server\n */\n images: {\n servers: ['imbo', 'imbo01', 'imbo02', 'imbo03'],\n\n sizes: {\n poster: {\n autoHeight: [\n 380, 480, 580, 680, 780, 800, 980, 1080, 1440, 2048\n ],\n autoWidth: [\n 452, 613, 740, 900, 1080, 1440\n ]\n }\n\n }\n },\n\n liveVideoPreview: 'livepreview',\n videoPreview: {\n default: 'preview_360p',\n vgtv: 'preview_vivi_category'\n },\n\n /**\n * Default skins for providers\n */\n skins: {\n default: {\n url: `//cdn.stream.schibsted.media/player/${VERSION}/css/player.css`,\n name: 'svp-default jw-skin-seven'\n }\n },\n\n about: {\n vgtv: {\n link: 'http://www.vgtv.no/',\n text: 'VGTV'\n }\n },\n\n sharing: {\n global: {\n sites: ['facebook', 'twitter']\n },\n\n vgtv: {\n link: 'http://www.vgtv.no/#!/MEDIAID',\n // eslint-disable-next-line max-len\n code: ''\n }\n },\n\n domains: {\n blacklist: {\n global: [],\n ab: ['*avpixlat.info', '*exponerat.net']\n },\n\n whitelist: {\n global: [\n '*localhost', '*schibsted.io', '*schibsted.media', '*schibsted.ws', '*schibsted.se', '*smp.no',\n '*plan3dev.se', '*plan3.se',\n '*vg.no', '*vgtv.no', '*vgnett.no',\n '*aftonbladet.se',\n '*aftenposten.no', '*ap.no',\n '*sa.no', '*aftenbladet.no',\n '*vglive.no',\n '*e24.no',\n\n // brandstudio cms\n '*vev.design',\n // stream cluster\n '*pubops.net',\n\n '*adresseavisen.no',\n '*polarismedia.no',\n '*adressa.no',\n '*bt.no',\n '*fvn.no',\n\n '*htmlinstant.com',\n '*ht.no',\n '*rbnett.no',\n '*itromso.no',\n '*folkebladet.no',\n '*framtidinord.no',\n '*osloby.no',\n '*av-avis.no',\n '*medianorge.no',\n '*herokuapp.com',\n '*bergenstidende.no',\n '*bonansa.no',\n '*sysla.no',\n '*bygdanytt.no',\n '*vestnytt.no',\n '*strilen.no',\n '*snd.no', '*fedrelandsvennen.no', '*lister24.no', '*l-a.no', '*lindesnesfyr.no',\n\n // Polaris related newspapers\n // addressa.no\n '*adressa.no', '*avisa-st.no', '*banett.no', '*fosna-folket.no', '*hitra-froya.no', '*innherred.no',\n '*mb.no', '*bladet.no', '*opdalingen.no', '*tronderbladet.no',\n // rbnett\n '*rbnett.no', '*andalsnes-avis.no', '*driva.no',\n // smp newspaper\n '*smp.no', '*dolen.no', '*fjordabladet.no', '*fjt.no', '*fjordingen.no', '*fjuken.no', '*heroynytt.no',\n '*morenytt.no', '*sunnmoringen.no', '*vigga.no', '*vikebladet.no',\n // itromso.no\n '*itromso.no', '*framtidinord.no',\n // ht.no\n '*ht.no', '*vol.no',\n // t-a.no\n '*t-a.no', '*namdalsavisa.no',\n // other polaris newspapers\n '*altaposten.no', '*folkebladet.no',\n '*svd.se',\n // marketplaces\n '*finn.no',\n '*familieklubben.no',\n '*tek.no',\n\n // testing env\n '*mylocal.com'\n ]\n },\n\n preview: {\n global: [\n '*vgnett.no',\n '*svp.schibsted.io',\n '*cms.schibsted.media',\n '*localhost',\n '*pubops.net',\n '*stream.schibsted.media'\n ]\n }\n },\n\n vendors: {\n se: ['ab', 'svd']\n },\n\n translations: translations\n};\n\nexport default config;\n","export default {\n default: 'OjqkBWp9VpYP8utpWdzBZ+eZIJhcfOW5U9g4/w==',\n //\n '100sport': 'Uq5GO7mRz+oxp7pVh3bZEvDEBzEYRTG4h3sr1Q==',\n ab: 'qK+optxkJTV2KblAIiLdoWze6AAGxX5Qxeb57A==',\n adressa: 'BQs7m1EiK0wlK8xAZQgJwU1a4OskbKgoYRSEfA==',\n adressabrandstudio: 'fuz93B3kwPfLDZv+opQh6xasO9nRkraYSbQP0A==',\n altaposten: 'Y0grkUQ6BaCat409fP7mPqr1SbDS+LntWrQIpg==',\n ap: 'ElscszbjUK+A0En7My3UPpJ/4MlOUOn+fiU2/w==',\n bt: 'wgmdmAfgbneZjUBt8ZxqiKTxVCpriTwcC06hzQ==',\n brandstudio: 'uXOJWRxZaxOSRhIisAGWsEbzn3PIhbTlCn99IQ==',\n folkebladet: 'kGoJc75y4Uq1r2kw2n883oYzGk+SrEJ2GEDQUQ==',\n fvn: '88vcnFV8g4crXq1P8jrGz8D7XqMwawGvwFmhJg==',\n harstad: 'C8hK/HIbIL3k9h4dN4xY3lHAPdjLyx7B4WGM/w==',\n itromso: 'QAPvDWM3mHi3lYOZCLqOwHZMstixgFefhc/d1Q==',\n podcast: 'X2K7i+dwWXsIR0BKyX+3C+8s4y9VOWcYgtjeJA==',\n rbnett: 'y7Z4M5Ah6dOyDH7/ZrCQjHZPb3E3xnctwkixbw==',\n riks: 'a5kTQmkeGHV+P2wOaTQvAuXEdivj2lbXoAxTbw==',\n ridenews: '6s5IkHj1LiODLxDOaYr1ze6F7F1Cun92UFuOpA==',\n sa: 'dWpue+L8nJKbDFqh9Ps3o2mxqr92MY2G9tQohg==',\n schibsted: 'Cn+pnRPeR7dlwUgy+QwoSwyu0NXoGUtxD/LVqA==',\n smp: 'eZ34FUhLc6cW3MypHSgtbYwRgbDxKLV/iaABmQ==',\n svd: 'Olwljnb5W0VdUf38yWyv3kjowR9JamQYw4RndA==',\n tronderavisa: '7azVhGsMlCm9EuRPr4EJ8RY6cyVbmAgeS1MkKw==',\n vgtv: 'edF0bFyKcM68omCq24JsMWw/CO/f6cAgS91oiQ==',\n vgtvs: 'D/kRElM9UDSgZxbEqPBESxIKamNBql5PeIabpg==',\n tvnu: 'D3dYmVFYpKAvLGpVd8pGy5WaK2ENvBtw/Ckcpg==',\n tvh: 'ruSROpB1eB80YOC8rhSGsPtRYOuyY3dVgvuENA==',\n steinkjer: '6R+PbNB3P4oBInKbvaTZ43gQ2ytS033VqoeXCw==',\n avisast: 'QcZcFVTVlh+UzfQwef0geS5SG8kfbuqpSbpBeA==',\n bladet: '1kmygQh66fY6JQRpflRV7+YGryfifrMtVFP3Yg==',\n banett: 's4vq0YvNHbJwTC4xIWv8gKbwgBhuk8lVzyOT8w==',\n innherred: '0yUhyfky20/BmQ0m34/m5xjUj7jZ+hbs6NGbaQ==',\n fosnafolket: 'URfW4iMX1EXaAMNIfXQMH4vFM45poWC3w/exaA==',\n opp: 'ZPPMwo4Hi2zY83ujh8eKtEZyLbnIDiiZ6FmM/A==',\n tronderbladet: 'QvkL/hGUNa8LhqWMWf0BBO5KIxtrY6tM/V9YzA==',\n stjordalsnytt: 'Vrr3fuhtCbYFD65BiG71D7LG85GJGbhJtsG0gg==',\n mn24: '/C0MEydhFzj2pHNF2s/sCJxSqmT10BN44TwB7g==',\n hitrafroya: 'dKm1wQ/c9wb8RUV17DcB0BcnWu6LwWOVwIwdOg==',\n framtidinord: 'kK2ipLqdfYIbhGdvjOthFN4jGIvUi8N40xzn4Q==',\n vaganavisa: 'EmRtKKUtomHJbI3SoSaGcUFmTH09+P1RWQJhFA==',\n vol: '5uns40a+PtZHBW63Js08tgiKxoLP9lvKzeSQhg==',\n nyttiuka: 'y3FqylNKM83/cm/EWqK8VMXaAlhZ8SugNLbLUA==',\n vikebladet: 'wjNCSWk5Pa+NP3himjg5l3SP6zJiwtfcio6Q4Q==',\n fjt: 'fwjuzLToVU9Ge7szNfMQjku/mrHv+rHKmnDWIw==',\n vestlandsnytt: 'eeXBMlgZz3eV1P40G2n8w5xNj6I26P6uPqGXrw==',\n fjuken: 'yJRnk09dbww1J8o1ZcttIz6JEWIbKQEVc2dBWA==',\n vigga: 'CVPhE9cnKo/qCEYsnKY4srRPlUX5nIkpgaYmmA==',\n dolen: '0pwgbRB6x1e0lopRdq63Z4dr9dWmCJv+y6lDjA==',\n fjordabladet: 'GSaj2C8vTpEIBol7cv22nushv81P41JejaYAYQ==',\n morenytt: 'y/F1oPTks00zkuYbKzS/J5nv1kj3F7bzP9mYyA==',\n fjordingen: 'qKK3mb0M6WSP0x2m6tivcPISciI3XcrXbQ6Ahg==',\n driva: 'UrdUWdGCy1fRuOhiW73+OquZdf4X4pEQt+wWAg==',\n andalsnes: '1R1UB8uyMZTD2ktpNUGmWwQ1rRJqdddbTr35hA==',\n nyss: 'KtxtrKsDnYN56mQzwJR0yQrt3v6txf5deJbU4Q==',\n agderposten: '1ddblFxmHMTjY92s/n4MW4UOarEg8Y0YdxnTLA==',\n lindesnes: 'BCo2euu9kUoY98D325ELxqI6xM2YkdZyg7/muQ==',\n farsund: 'qCM539Tebp04kUVjiaLyL7pkGCCDJamyVyu/zA==',\n varden: 'rKy6/CASIAoRtm+px2g9c78jIoqfW8zNaOlHMg==',\n lp: 'kKDr8twymQP1JZL6JSr+1+dnov/tgzOdcrg1TA==',\n venneslatidende: 'ssbp/U5E/VpJfjG1iKiRn4s1aEcmSJJVUvArHg==',\n gat: 'lsDEJw9LYcQHNSW7z1ANuZlP1az9SYVeVLz9nQ==',\n bomlonytt: 'JWrUR1BR1BDEvlk1D4zTVACUVUpSRmaHNPc3Ug==',\n sunnhordland: 'YNBOeqC8eCInTQKL6AAj3bUxvOBovPqzUIoGcQ==',\n klaebuposten: 'C4qzXiBP17SXr/vE8xhg24JOWtyoGDeDp5r6PQ==',\n gauldalsposten: 'eckuy2Y+Q1Ix2uLPX/mVUMHjfZGihqYYFbr9lg==',\n froya: '0hMWIeKp57C5kpW/SZZ1wt4UkFJHwmWYaCd25A==',\n bnytt: 'DZ3T3Pf0i7D5z/HvohVc0O7Nd+uA/NIaNWaWFA==',\n vnytt: 'LIf2gdiGI3pQ3xNFRA4VyY0Rw1m8Zt8INsG59w==',\n stri: 'gsS6gkjzxZM0HbwrApKOQptgKWAhLWjQiGKBqQ==',\n avavis: 'VKgcw+6bkoouV5F8wq3m3INf0/vnoAYm9A+iKw==',\n bareasane: 'EWqdeFg2tvV34V0/8Y8xPYs7nSJqhBca7YE9nA==',\n e24: 'EKxf/lgWjKyDmxngUI9GCHYadRPzPqJZ61eGsw==',\n op: 'D+Ha6SLZGzk9rTYF73CZVauhRaxcOWQJ1DcA7A==',\n r24: 'MCwzsnqjZ7mxAZIhFUaqLc9Jb6DJz16u19cJgw==',\n stord: '/XmpYhCtUCXEGxdg7Sx8uDV4H9B/S7pcoHFshw==',\n marsteinen: 'mgxyPEPhFgqBsXWID7XMFehHRtcmSV0NYBgtkQ==',\n aptts: 'iHIdsWq1mtMGYlPjI4bdBAv/Mi67voL7GPFxzQ==',\n vgtvexternal: '0CwPuvNeSfovbd5Z9E2BxESNFd0uCQuKGua/EQ=='\n};\n","import config from '../config';\n\nconfig.env = 'production';\nexport default config;\n","export const ACTIVE = 12000;\nexport const ACTIVE_PREVIEW = 12001;\n\nexport const NOT_ACTIVE = 14001;\nexport const NOT_ACTIVE_GEOBLOCKED = 14002;\nexport const NOT_ACTIVE_TOKEN = 14005;\nexport const NOT_FOUND = 14003;\nexport const NOT_ACTIVE_PAST = 14004;\n\nexport const GENERAL_ERROR = 15000;\nexport const NETWORK_ERROR = 15101;\nexport const TOKEN_FETCH_ERROR = 15102;\n\nconst statusMessages = {\n [ACTIVE]: 'Stream active',\n [ACTIVE_PREVIEW]: 'Preview mode',\n [NOT_ACTIVE]: 'Stream is not active',\n [NOT_ACTIVE_GEOBLOCKED]: 'Stream failed to play due to geoblock restrictions',\n [NOT_ACTIVE_TOKEN]: 'Stream failed to play due to unauthorized access',\n [NOT_FOUND]: 'Stream not found',\n [NOT_ACTIVE_PAST]: 'Stream has been unpublished',\n [GENERAL_ERROR]: 'General error',\n [NETWORK_ERROR]: 'Network error',\n [TOKEN_FETCH_ERROR]: 'Token fetch error'\n};\n\n/**\n * Get localized messages\n *\n * @param {number} errorCode\n */\nexport default (errorCode) => statusMessages[errorCode] || statusMessages[GENERAL_ERROR];\n","/**\n * Server time helper required for syncing browser time with stream vendors servers (SMP Stream)\n */\nconst ServerTime = {\n time: null,\n responseTime: null,\n fetched: false,\n\n /**\n * @param {string} url\n * @returns {Promise}\n */\n fetch: function(url) {\n return new Promise((resolve) => {\n /**\n * @param {number} time\n */\n const resolveRequest = (time) => {\n this.time = time;\n this.responseTime = new Date().getTime();\n resolve();\n };\n\n fetch(url).then((result) => result.text()).then((text) => {\n const serverTime = parseInt(text, 10);\n\n if (Number.isNaN(Number(serverTime))) {\n // set current microtime if server will return value different than int\n resolveRequest(new Date().getTime());\n } else {\n // adjust to miliseconds\n resolveRequest(serverTime * 1000);\n ServerTime.fetched = true;\n }\n }, function() {\n resolveRequest(new Date().getTime());\n });\n });\n },\n\n /**\n * @returns {number}\n */\n getTime: function() {\n return this.time + (new Date().getTime() - this.responseTime);\n }\n};\n\nexport default ServerTime;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/* eslint-disable no-multi-assign */\n\n/**\n * @param {string} path\n * @param {(value: *) => void} onSuccess\n * @param {(reason?: *) => void} onError\n */\nfunction loadScript(path, onSuccess, onError) {\n var script = document.createElement('script'),\n done = false;\n\n const callback = onSuccess || function () {};\n\n script.type = 'text/javascript';\n script.src = path;\n script.async = true;\n script.onreadystatechange = script.onload = function() {\n if (!done && (!this.readyState\n || this.readyState === 'loaded' || this.readyState === 'complete')) {\n done = true;\n callback();\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n }\n };\n\n script.onerror = onError;\n\n document.body.appendChild(script);\n}\n\n/**\n * @param {string} path\n */\nexport default (path) => new Promise((resolve, reject) => loadScript(path, resolve, reject));\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","module.exports = \"\"","import scriptLoader from './script-loader';\n\n/**\n * @param {string} moduleSrc\n * @return {Promise<*>}\n */\nconst loadModule = (moduleSrc) => {\n const root = window;\n\n if (root.define && root.define.amd) {\n return new Promise((resolve) => {\n root.require([moduleSrc], resolve);\n });\n }\n\n return scriptLoader(moduleSrc);\n};\n\nexport default loadModule;\n","module.exports = \"\"","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"
\\n
\\\">
\\n\\n
\\n \\n \\n \\n
\\n\\n \\n
\"","module.exports = \"
\\n
\\n
\\n \\n \\n
\\n
\\n \\n
\\n
\\n
\\n\"","module.exports = \"\\n\"","module.exports = \"\\n <%= closeIcon %>\\n\\n\\n <%= next.getTitle() %>\\n ');\\\">\\n s\\\">\\n Next <%= nextIcon %>\\n );\\\">\\n \\n\\n\"","module.exports = \"\\n\"","var basePick = require('./_basePick'),\n flatRest = require('./_flatRest');\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n});\n\nmodule.exports = pick;\n","var baseKeys = require('./_baseKeys'),\n getTag = require('./_getTag'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLike = require('./isArrayLike'),\n isBuffer = require('./isBuffer'),\n isPrototype = require('./_isPrototype'),\n isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = isEmpty;\n","/* jshint ignore:start */\n/* eslint-disable */\n\nvar isLoaded = false;\nvar exportz = {};\n\nexport default function (conf) {\n if (!isLoaded) {\n isLoaded = true;\n\n (function(k) {\n k = k || {}; (function(l) {\n function b() { this.u = 'setup'; }l.g = b; b.prototype = {\n c: function(a) { a = a && typeof a === 'number' && a > 0 ? Math.round(a) : 10; for (var g = '', e = 0; e < a; e++)g += String.fromCharCode((Math.random() < 0.5 ? 65 : 97) + Math.floor(26 * Math.random())); return g; },\n A: function(a) {\n function g(d) {\n var a = '';\n var c;\n var g;\n for (c = 7; c >= 0; c--)g = d >>> 4 * c & 15, a += g.toString(16);return a;\n }function e(d, a) { return d << a | d >>> 32 - a; }\n var c;\n var h;\n var b = Array(80);\n var l = 1732584193;\n var q = 4023233417;\n var p = 2562383102;\n var k = 271733878;\n var t = 3285377520;\n var f;\n var m;\n var n;\n var r;\n var d;\n a = a && typeof a === 'string'\n ? a : '';f = a.length;var u = [];for (c = 0; c < f - 3; c += 4)h = a.charCodeAt(c) << 24 | a.charCodeAt(c + 1) << 16 | a.charCodeAt(c + 2) << 8 | a.charCodeAt(c + 3), u.push(h);switch (f % 4) { case 0: c = 2147483648; break; case 1: c = a.charCodeAt(f - 1) << 24 | 8388608; break; case 2: c = a.charCodeAt(f - 2) << 24 | a.charCodeAt(f - 1) << 16 | 32768; break; case 3: c = a.charCodeAt(f - 3) << 24 | a.charCodeAt(f - 2) << 16 | a.charCodeAt(f - 1) << 8 | 128; }for (u.push(c); u.length % 16 != 14;)u.push(0);u.push(f >>> 29);u.push(f << 3 & 4294967295);for (a = 0; a < u.length; a += 16) {\n for (c = 0; c < 16; c++)b[c] = u[a + c]; for (c = 16; c <= 79; c++)b[c] = e(b[c - 3] ^ b[c - 8] ^ b[c - 14] ^ b[c - 16], 1); h = l; f = q; m = p; n = k; r = t; for (c = 0; c <= 19; c++)d = e(h, 5) + (f & m | ~f & n) + r + b[c] + 1518500249 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 20; c <= 39; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 1859775393 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 40; c <= 59; c++)d = e(h, 5) + (f & m | f & n | m & n) + r + b[c] + 2400959708 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 60; c <= 79; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 3395469782 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; l = l + h & 4294967295; q = q + f & 4294967295; p = p + m & 4294967295; k = k + n\n & 4294967295; t = t + r & 4294967295;\n }return (g(l) + g(q) + g(p) + g(k) + g(t)).toLowerCase();\n },\n j: function(a) {\n for (var g = '', e, c, b, l, k, q, p = 0; p < a.length;) {\n e = a.charCodeAt(p++), c = a.charCodeAt(p++), b = a.charCodeAt(p++), l = e >> 2, e = (e & 3) << 4 | c >> 4, k = (c & 15) << 2 | b >> 6, q = b & 63, isNaN(c) ? k = q = 64 : isNaN(b) && (q = 64), g = g + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(l) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(e) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(k)\n + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(q);\n } return g;\n },\n fireEvent: function(a, g, b) {\n var c = this.u;\n var h = document.createEvent('CustomEvent');\n b.state = c;h.initCustomEvent(g, !1, !1, b);a.dispatchEvent(h);\n },\n l: function(a, g, b) { g || (g = 'hdEvent'); b || (b = window); this.fireEvent(b, g, a); },\n track: function(a, b, e) {\n if (e) {\n if (!homad || !homad.M)window.setTimeout(function() { this.track(a, b, e); }.bind(this), 500); else if (homad.isEnabled) {\n var c = `${homad.T()}?homad_track_key=${encodeURIComponent(a)}&homad_track_value=${\n encodeURIComponent(b)}`; homad.o(c, !0); c = homad.o(c, !0); c.data.homad_url_prefix_alias = ''; c.data.homad_track_key = encodeURIComponent(a); c.data.homad_track_value = encodeURIComponent(b); homad.P(c, function() {});\n }\n }\n }\n };\n }(k)); var v = k.g || v; new v(); var w = new v(); (function(l) {\n function b(a) { this.data = a || {}; }l.f = b; b.S = function(a, b) {\n var e = {};\n var c;\n for (c in b)e[c] = b[c];for (c in a)e[c] = a[c];return e;\n }; b.w = { code: '1000', type: 'penalty', message: '' }; b.V = { code: '1001', type: 'mediaerror', message: '' }; b.C = { code: '1002', type: 'vpaid', message: '' };\n b.O = { code: '1003', type: 'emptyVast', message: '' }; b.F = { code: '1004', type: 'malformattedXML' }; b.J = { code: '1005', type: 'adStart' }; b.G = { code: '1006', type: 'adFirstQuartile' }; b.I = { code: '1007', type: 'adMidPoint' }; b.K = { code: '1008', type: 'adThirdQuartile' }; b.i = { code: '1009', type: 'adComplete' }; b.H = { code: '1010', type: 'adImpressionsCalled' }; b.B = { code: '1011', type: 'vastLoadingFailed' }; b.U = { code: '1012', type: 'noCreative' }; b.R = { code: '1013', type: 'emptyVastFromHomadServerEvent', message: '' }; b.D = {\n code: '1014',\n type: 'wrapperLimitReached',\n message: ''\n }; b.L = { code: '1015', type: 'clickthrough', message: '' }; b.N = { code: '1016', type: 'continueContent', message: '' }; b.X = { code: '1017', type: 'variableDeletedEvent', message: '' }; b.W = { code: '1018', type: 'noVariableSettingEvent', message: '' }; b.prototype = {};\n }(k)); var z = k.f || z; (function(l) {\n function b() {}l.h = b; b.prototype = {\n s: function(a) {\n var b = 0;\n var e;\n var c;\n var h;\n if (a.length == 0) return b;e = 0;for (h = a.length; e < h; e++)c = a.charCodeAt(e), b = (b << 5) - b + c, b |= 0;return Math.abs(b);\n },\n m: function() {\n return Math.round(Date.now() / 1E3 / 3600 / 24) + navigator.appCodeName\n + navigator.appName + navigator.appVersion + navigator.userAgent + navigator.platform + (navigator.language || navigator.i || 'x');\n },\n a: function(a) { a = parseInt(a); if (a >= 65 && a <= 90 || a >= 97 && a <= 122) return String.fromCharCode(a); if (a <= 0) return ''; if (a < 65) return this.a(a + 65); if (a > 90) return this.a(Math.round(a / 2)); },\n reverse: function(a) { for (var b = '', e = a.length - 1, b = ''; e >= 0; b += a[e--]);return b; },\n b: function() {\n for (var a = this.s(`${this.m()}`), a = (`${a}${this.reverse(`${a}`)}`).match(/.{1,2}/g), b = '', e = 0; e < a.length; e++)b += this.a(a[e]); b.length == 0\n && (b = 'zork'); return b;\n },\n v: function() { return `${this.b()}2`; }\n };\n }(k)); var y = k.h || y; (function() {\n function l() {\n if (p)conf.startPlayer && eval(conf.startPlayer), document.fp_error = !0, document.hd_ready = !0; else {\n var d = document.createElement('script');d.type = 'text/javascript';d.src = `https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=${w.c(10)}`;d.onerror = e;document.head.firstChild ? document.head.insertBefore(d, document.head.firstChild) : document.head.appendChild(d);\n var d = new y();\n var a = document.createEvent('CustomEvent');\n conf.version = '20170704_0930_802';a.initCustomEvent(d.b(), !1, !1, conf);window.setInterval(function() { window.dispatchEvent(a); }, 500);b();\n }\n }function b() { var d = new y(); r = window.setTimeout(function() { a(); }, 15E3); window.addEventListener(d.v(), function() { window.clearTimeout(r); }); }function a() {\n for (var d = document.getElementsByTagName('video'), a = 0; a < d.length; a++) { try { d[a] && d[a].pause && typeof d[a].pause === 'function' && d[a].pause(); } catch (b) {}d[a].parentNode.removeChild(d[a]); }d = document.getElementsByTagName('object'); for (a = 0; a < d.length; a++)d[a].parentNode.removeChild(d[a]);\n d = document.getElementsByClassName('video-wrapper'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); d = document.getElementsByClassName('videoplayer'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); if (window.self != window.top) for (d = window.document; d.hasChildNodes();)d.removeChild(d.lastChild);\n }function g() {\n if (t) {\n var d = `fail-init-100.gif${v()}`; k(t, function() {}, function() {}, {\n homad_url_prefix_alias: f,\n homad_url_suffix_base64: w.j(d),\n homad_url_suffix: d,\n homad_hash_guessed: 'true'\n });\n }w.l(z.w); x && typeof x === 'function' ? x() : (a(), window.setInterval(a, 500), window.setTimeout(a, 1500));\n }function e() { var a = document.createElement('script'); a.type = 'text/javascript'; a.src = `https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/hd-main.js?cache=${w.c(10)}`; a.onerror = g; document.head.firstChild ? document.head.insertBefore(a, document.head.firstChild) : document.head.appendChild(a); }function c(a) { p || (p = !q(a.enabled)); l(); }function h(a) {\n a && a.server && a.server[0]\n && (t = (`${a.server[1]}`).replace('[hash]', w.A(`${(new Date()).getTime()}`)), f = 'homadvastimpressions'); p ? l() : (p = !q(a.enabled)) ? l() : k(a.config, c, l);\n }function k(a, b, c, e) {\n var f = new XMLHttpRequest(); f.onreadystatechange = function() { if (b && f.readyState == 4 && f.status == 200) { var a = {}; try { a = JSON.parse(f.responseText); } catch (d) { a.enabled = 'false'; }b(a); }c && f.readyState == 4 && f.status != 200 && c(f); }; try {\n if (e) {\n f.open('POST', a, !0); a = e; e = ''; for (var g in a)e += `&${g}=${encodeURIComponent(a[g])}`; e = e.substr(1); f.setRequestHeader('Content-type',\n 'application/x-www-form-urlencoded'); f.send(e);\n } else f.open('GET', a, !0), f.send();\n } catch (h) { c && c(f); }\n }function v() { var a = '?c=unknown'; window && window.location && window.location.hostname && (a = `?c=${window.location.hostname}`); return a; }function q(a) { return a == 'True' || a == 'true' || a == 1 || a == '1' || a == 1; }\n var p = !1;\n var x = conf.onFailure;\n var t = '';\n var f = '';\n var m = !1;\n var n = 0;\n var r = !1;\n k(conf.globalConfig, function(a) { p ? l() : p = !q(a.enabled); });typeof conf.clientConfig === 'string' ? k(conf.clientConfig, h, function() {\n window.setTimeout(function() {\n k(conf.clientConfig,\n h, function() { window.setTimeout(g, 1500); });\n }, 500);\n }) : m = window.setInterval(function() { var a = ''; try { a = conf.clientConfig(), n++, a ? (h(a), window.clearInterval(m)) : n >= 50 && (window.clearInterval(m), g()); } catch (b) {} }, 100);\n }());\n }).call(exportz, exportz);\n }\n}\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","import config from 'player/config';\nimport moduleLoader from 'utils/module-loader';\nimport ServerTime from 'utils/server-time';\n\n// eslint-disable-next-line\nconst loadSvpLibrary = () => {\n return import(/* webpackMode: \"eager\" */ './index').then((SVP) => [\n SVP.default,\n SVP.preInitialize,\n SVP.postInitialize\n ]);\n};\n\n/**\n * @param {Window} root\n */\nconst loadJwPlayer = async (root) => {\n const PLAYER_LIB = `${config.cdn.player}/jwplayer.js`;\n\n return moduleLoader(PLAYER_LIB).then((jwplayer = root.jwplayer) => {\n root.jwplayer = jwplayer;\n });\n};\n\n(async function (root) {\n // onSvpPlayerReady is required callback to handle due to SDK async loading\n const onReady = root.onSvpPlayerReady;\n\n const [serverTime] = await Promise.all([ServerTime.fetch(config.time), loadJwPlayer(root)]);\n const library = await loadSvpLibrary();\n const [SVP, preInitialize, postInitialize] = library || [];\n\n if ((root && !root.SVP) || (root.SVP && root.SVP.isLoaded !== true)) {\n root.SVP = SVP;\n root.SVP.isLoaded = true;\n\n preInitialize({ serverTime });\n\n if (window.dispatchEvent) {\n const event = document.createEvent('Event');\n event.initEvent('onSvpPlayerReady', false, true);\n window.dispatchEvent(event);\n }\n\n if (onReady) {\n onReady();\n }\n\n postInitialize();\n }\n}(window));\n","var basePickBy = require('./_basePickBy'),\n hasIn = require('./hasIn');\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n}\n\nmodule.exports = basePick;\n","var baseGet = require('./_baseGet'),\n baseSet = require('./_baseSet'),\n castPath = require('./_castPath');\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nmodule.exports = basePickBy;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var assignValue = require('./_assignValue'),\n castPath = require('./_castPath'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nmodule.exports = baseSet;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var flatten = require('./flatten'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/* eslint-disable no-plusplus, no-restricted-properties */\n\nvar idCounter = 0;\n\n// we do not include underscore as it is our hard dependency\nconst { _ } = jwplayer;\n\n/**\n * @param {string|number} key\n * @return {(obj: Object|Array|null) => *}\n */\nconst property = function (key) {\n return function (obj) {\n return obj == null ? undefined : obj[key];\n };\n};\nconst MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\nconst getLength = property('length');\nconst isArrayLike = function (collection) {\n var length = getLength(collection);\n return typeof length === 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n};\n\n/**\n * @param {*} obj\n * @returns {boolean}\n */\n_.isEmpty = function (obj) {\n if (obj == null) return true;\n if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n return _.keys(obj).length === 0;\n};\n\n/**\n * @param {string} prefix\n * @returns {string}\n */\n_.uniqueId = function(prefix) {\n var id = `${++idCounter}`;\n return prefix ? prefix + id : id;\n};\n\nexport default _;\n","/* eslint-disable no-plusplus, no-param-reassign, no-underscore-dangle, no-mixed-operators, no-multi-assign */\nimport _ from './underscore';\n\n// Backbone.Events\n// ---------------\n\n// A module that can be mixed in to *any object* in order to provide it with\n// a custom event channel. You may bind a callback to an event with `on` or\n// remove with `off`; `trigger`-ing an event fires all callbacks in\n// succession.\n//\n// var object = {};\n// _.extend(object, Backbone.Events);\n// object.on('expand', function(){ alert('expanded'); });\n// object.trigger('expand');\n//\nconst Events = {};\n\n// Regular expression used to split event strings.\nconst eventSplitter = /\\s+/;\n\n// Iterates over the standard `event, callback` (as well as the fancy multiple\n// space-separated events `\"change blur\", callback` and jQuery-style event\n// maps `{event: callback}`).\nconst eventsApi = function(iteratee, events, name, callback, opts) {\n var i = 0,\n names;\n if (name && typeof name === 'object') {\n // Handle event maps.\n if (callback !== undefined && 'context' in opts && opts.context === undefined) opts.context = callback;\n for (names = _.keys(name); i < names.length; i++) {\n events = eventsApi(iteratee, events, names[i], name[names[i]], opts);\n }\n } else if (name && eventSplitter.test(name)) {\n // Handle space separated event names by delegating them individually.\n for (names = name.split(eventSplitter); i < names.length; i++) {\n events = iteratee(events, names[i], callback, opts);\n }\n } else {\n // Finally, standard events.\n events = iteratee(events, name, callback, opts);\n }\n return events;\n};\n\n// The reducing API that adds a callback to the `events` object.\nconst onApi = function(events, name, callback, options) {\n if (callback) {\n const handlers = events[name] || (events[name] = []);\n const { context, ctx, listening } = options;\n if (listening) listening.count++;\n\n handlers.push({\n callback: callback, context: context, ctx: context || ctx, listening: listening\n });\n }\n return events;\n};\n\n// Guard the `listening` argument from the public API.\nconst internalOn = function(obj, name, callback, context, listening) {\n obj._events = eventsApi(onApi, obj._events || {}, name, callback, {\n context: context,\n ctx: obj,\n listening: listening\n });\n\n if (listening) {\n const listeners = obj._listeners || (obj._listeners = {});\n listeners[listening.id] = listening;\n }\n\n return obj;\n};\n\n// Bind an event to a `callback` function. Passing `\"all\"` will bind\n// the callback to all events fired.\nEvents.on = function(name, callback, context) {\n return internalOn(this, name, callback, context);\n};\n\n// Inversion-of-control versions of `on`. Tell *this* object to listen to\n// an event in another object... keeping track of what it's listening to\n// for easier unbinding later.\nEvents.listenTo = function(obj, name, callback) {\n if (!obj) return this;\n const id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n const listeningTo = this._listeningTo || (this._listeningTo = {});\n let listening = listeningTo[id];\n\n // This object is not listening to any other events on `obj` yet.\n // Setup the necessary references to track the listening callbacks.\n if (!listening) {\n const thisId = this._listenId || (this._listenId = _.uniqueId('l'));\n listening = listeningTo[id] = {\n obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0\n };\n }\n\n // Bind callbacks on obj, and keep track of them on listening.\n internalOn(obj, name, callback, this, listening);\n return this;\n};\n\n// The reducing API that removes a callback from the `events` object.\nconst offApi = function(events, name, callback, options) {\n if (!events) return;\n\n let i = 0;\n let listening;\n const { context, listeners } = options;\n\n // Delete all events listeners and \"drop\" events.\n if (!name && !callback && !context) {\n const ids = _.keys(listeners);\n for (; i < ids.length; i++) {\n listening = listeners[ids[i]];\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n return;\n }\n\n const names = name ? [name] : _.keys(events);\n for (; i < names.length; i++) {\n name = names[i];\n const handlers = events[name];\n\n // Bail out if there are no events stored.\n if (!handlers) break;\n\n // Replace events if there are any remaining. Otherwise, clean up.\n const remaining = [];\n for (let j = 0; j < handlers.length; j++) {\n const handler = handlers[j];\n if (\n callback && callback !== handler.callback\n && callback !== handler.callback._callback\n || context && context !== handler.context\n ) {\n remaining.push(handler);\n } else {\n listening = handler.listening;\n if (listening && --listening.count === 0) {\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n }\n }\n\n // Update tail event if the list has any events. Otherwise, clean up.\n if (remaining.length) {\n events[name] = remaining;\n } else {\n delete events[name];\n }\n }\n if (_.size(events)) {\n // eslint-disable-next-line consistent-return\n return events;\n }\n};\n\n// Remove one or many callbacks. If `context` is null, removes all\n// callbacks with that function. If `callback` is null, removes all\n// callbacks for the event. If `name` is null, removes all bound\n// callbacks for all events.\nEvents.off = function(name, callback, context) {\n if (!this._events) return this;\n this._events = eventsApi(offApi, this._events, name, callback, {\n context: context,\n listeners: this._listeners\n });\n return this;\n};\n\n// Tell this object to stop listening to either specific events ... or\n// to every object it's currently listening to.\nEvents.stopListening = function(obj, name, callback) {\n var listeningTo = this._listeningTo;\n if (!listeningTo) return this;\n\n const ids = obj ? [obj._listenId] : _.keys(listeningTo);\n\n for (let i = 0; i < ids.length; i++) {\n const listening = listeningTo[ids[i]];\n\n // If listening doesn't exist, this object is not currently\n // listening to obj. Break out early.\n if (!listening) break;\n\n listening.obj.off(name, callback, this);\n }\n if (_.isEmpty(listeningTo)) this._listeningTo = undefined;\n\n return this;\n};\n\n// Reduces the event callbacks into a map of `{event: onceWrapper}`.\n// `offer` unbinds the `onceWrapper` after it has been called.\nconst onceMap = function(map, name, callback, offer) {\n if (callback) {\n const once = map[name] = _.once(function() {\n offer(name, once);\n callback.apply(this, arguments);\n });\n once._callback = callback;\n }\n return map;\n};\n\n// Bind an event to only be triggered a single time. After the first time\n// the callback is invoked, its listener will be removed. If multiple events\n// are passed in using the space-separated syntax, the handler will fire\n// once for each event, not once for a combination of all events.\nEvents.once = function(name, callback, context) {\n // Map the event into a `{event: once}` object.\n var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this));\n return this.on(events, undefined, context);\n};\n\n// Inversion-of-control versions of `once`.\nEvents.listenToOnce = function(obj, name, callback) {\n // Map the event into a `{event: once}` object.\n var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj));\n return this.listenTo(obj, events);\n};\n\n// A difficult-to-believe, but optimized internal dispatch function for\n// triggering events. Tries to keep the usual cases speedy (most internal\n// Backbone events have 3 arguments).\nconst triggerEvents = function(events, args) {\n let ev;\n let i = -1;\n const l = events.length;\n const [a1, a2, a3] = args;\n switch (args.length) {\n case 0:\n while (++i < l) (ev = events[i]).callback.call(ev.ctx);\n return;\n case 1:\n while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1);\n return;\n case 2:\n while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2);\n return;\n case 3:\n while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3);\n return;\n default:\n while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);\n }\n};\n\n// Handles triggering the appropriate event callbacks.\nconst triggerApi = function(objEvents, name, cb, args) {\n if (objEvents) {\n const events = objEvents[name];\n let allEvents = objEvents.all;\n if (events && allEvents) allEvents = allEvents.slice();\n if (events) triggerEvents(events, args);\n if (allEvents) triggerEvents(allEvents, [name].concat(args));\n }\n return objEvents;\n};\n\n// Trigger one or many events, firing all bound callbacks. Callbacks are\n// passed the same arguments as `trigger` is, apart from the event name\n// (unless you're listening on `\"all\"`, which will cause your callback to\n// receive the true name of the event as the first argument).\nEvents.trigger = function(name) {\n if (!this._events) return this;\n\n const length = Math.max(0, arguments.length - 1);\n const args = Array(length);\n for (let i = 0; i < length; i++) args[i] = arguments[i + 1];\n\n eventsApi(triggerApi, this._events, name, undefined, args);\n return this;\n};\n\n// Aliases for backwards compatibility.\nEvents.bind = Events.on;\nEvents.unbind = Events.off;\n\nexport default Events;\n","const { userAgent } = navigator;\n\n/**\n * @param {RegExp} regex\n * @returns {boolean}\n */\nfunction userAgentMatch(regex) {\n return userAgent.match(regex) !== null;\n}\n\n/**\n * @param {RegExp} regex\n * @returns {boolean}\n */\nfunction lazyUserAgentMatch(regex) {\n return function () {\n return userAgentMatch(regex);\n };\n}\n\nconst isIETrident = lazyUserAgentMatch(/trident\\/.+rv:\\s*11/i);\nconst isIPad = () => lazyUserAgentMatch(/iPad/i)()\n || (userAgentMatch(/Macintosh/i, userAgent)\n && navigator.maxTouchPoints !== undefined\n && navigator.maxTouchPoints > 1);\nconst isIPhone = lazyUserAgentMatch(/iPhone/i);\n// Check for spiders/bots\n/**\n * @returns {boolean}\n */\nfunction isBot() {\n return userAgentMatch(/bot|google|baidu|bing|msn|teoma|slurp|yandex|yeti/i);\n}\n// Check for Facebook App Version to see if it's Facebook\n\n/**\n * @returns {boolean}\n */\nfunction isEdge() {\n return userAgentMatch(/\\sEdge\\/\\d+/i);\n}\n\n/**\n * @returns {boolean}\n */\nfunction isMSIE() {\n return userAgentMatch(/msie/i);\n}\n\n/**\n * @returns {boolean|*}\n */\nfunction isIE() {\n return isEdge() || isIETrident() || isMSIE();\n}\n\n/**\n * @returns {boolean}\n */\nfunction isSafari() {\n return (\n userAgentMatch(/safari/i)\n && !userAgentMatch(/(?:Chrome|CriOS|chromium|android)/i)\n );\n}\n\n/**\n * @returns {boolean}\n */\nfunction isFirefox() {\n return userAgentMatch(/\\sFirefox\\/\\d+/i);\n}\n\n/**\n * Matches iOS devices\n *\n * @param version\n * @returns {boolean}\n */\nfunction isIOS(version) {\n var isAppleIOS = userAgentMatch(/iP(hone|ad|od)/i),\n result = null;\n\n // check if version matches\n if (isAppleIOS && version) {\n result = /OS ([._\\d]+)/.exec(userAgent);\n\n // get version and parse it\n if (result && parseInt(result[1], 10) === version) {\n return true;\n }\n // didn't match version\n return false;\n }\n\n return isAppleIOS;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isAndroid() {\n return userAgentMatch(/Android/i);\n}\n\n/**\n * @returns {boolean}\n */\nfunction isTablet() {\n let result = isIPad() || false;\n\n // android tables are when\n if (isAndroid() && userAgent.indexOf('Mobile') === -1) {\n result = true;\n }\n\n return result;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isMobile() {\n return (\n userAgent.match(\n // eslint-disable-next-line max-len\n /(iPhone|iPod|Android(?=.*Mobile).*|HTC|Fennec|IEMobile|BlackBerry|SymbianOS(?=.*AppleWebKit).*|Opera Mobi|Symbian|SonyEricsson|Nokia|SAMSUNG|LG)/i\n ) !== null\n );\n}\n\n/**\n * @returns {boolean}\n */\nfunction isDesktop() {\n return !isMobile() && !isTablet();\n}\n\n/**\n * @returns {boolean}\n */\nfunction isSamsungInternet() {\n return userAgent.indexOf('SamsungBrowser') !== -1;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isHermesApp() {\n return userAgentMatch(/hermes/i);\n}\n\n/**\n * @returns {number|boolean}\n */\nfunction getChromeVersion() {\n var raw = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n\n return raw ? parseInt(raw[2], 10) : false;\n}\n\n/**\n * @returns {number}\n */\nfunction getPixelRatio() {\n var devicePixelRatio = window.devicePixelRatio || 1;\n\n if (devicePixelRatio > 1) {\n devicePixelRatio = 2;\n }\n\n return devicePixelRatio;\n}\n\n/**\n * Tracking is divided by device type\n *\n * @returns {'tablet'|'phone'|'desktop'}\n */\nfunction getDeviceType() {\n if (isTablet()) {\n return 'tablet';\n }\n\n if (isMobile()) {\n return 'phone';\n }\n\n return 'desktop';\n}\n\n/**\n * @returns {'always'|'muted'|'never'}\n */\nfunction canAutoplay() {\n let result = 'always';\n\n // default is muted for never ios systems\n if (this.isIOS()) {\n result = 'muted';\n }\n\n // iOS 8 and 9 can not autoplay any kind of stream\n // also Android Devices are lacking this\n if (this.isIOS(9) || this.isIOS(8) || this.isAndroid()) {\n result = 'never';\n }\n\n // chrome android can autoplay muted\n if (\n this.isAndroid()\n && !this.isSamsungInternet()\n && this.getChromeVersion() >= 53\n ) {\n result = 'muted';\n }\n\n return result;\n}\n\nexport default {\n isIOS,\n isIPhone,\n isIPad,\n isSafari,\n isAndroid,\n isEdge,\n isIE,\n isFirefox,\n isDesktop,\n isSamsungInternet,\n isTablet,\n isMobile,\n isHermesApp,\n isBot,\n getChromeVersion,\n getPixelRatio,\n getDeviceType,\n canAutoplay\n};\n","/* eslint-disable no-use-before-define */\nfunction isMergeableObject(val) {\n var nonNullObject = val && typeof val === 'object';\n\n return nonNullObject\n && Object.prototype.toString.call(val) !== '[object RegExp]'\n && Object.prototype.toString.call(val) !== '[object Date]';\n}\n\nfunction emptyTarget(val) {\n return Array.isArray(val) ? [] : {};\n}\n\nfunction cloneIfNecessary(value, optionsArgument) {\n var clone = optionsArgument && optionsArgument.clone === true;\n return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value;\n}\n\nfunction defaultArrayMerge(target, source, optionsArgument) {\n var destination = target.slice();\n source.forEach(function(e, i) {\n if (typeof destination[i] === 'undefined') {\n destination[i] = cloneIfNecessary(e, optionsArgument);\n } else if (isMergeableObject(e)) {\n destination[i] = deepmerge(target[i], e, optionsArgument);\n } else if (target.indexOf(e) === -1) {\n destination.push(cloneIfNecessary(e, optionsArgument));\n }\n });\n return destination;\n}\n\nfunction mergeObject(target, source, optionsArgument) {\n var destination = {};\n if (isMergeableObject(target)) {\n Object.keys(target).forEach(function(key) {\n destination[key] = cloneIfNecessary(target[key], optionsArgument);\n });\n }\n Object.keys(source).forEach(function(key) {\n if (!isMergeableObject(source[key]) || !target[key]) {\n destination[key] = cloneIfNecessary(source[key], optionsArgument);\n } else {\n destination[key] = deepmerge(target[key], source[key], optionsArgument);\n }\n });\n return destination;\n}\n\nfunction deepmerge(target, source, optionsArgument) {\n var array = Array.isArray(source);\n var options = optionsArgument || { arrayMerge: defaultArrayMerge };\n var arrayMerge = options.arrayMerge || defaultArrayMerge;\n\n if (array) {\n return Array.isArray(target)\n ? arrayMerge(target, source, optionsArgument)\n : cloneIfNecessary(source, optionsArgument);\n }\n return mergeObject(target, source, optionsArgument);\n}\n\ndeepmerge.all = function deepmergeAll(array, optionsArgument) {\n if (!Array.isArray(array) || array.length < 2) {\n throw new Error('first argument should be an array with at least two elements');\n }\n\n // we are sure there are at least 2 values, so it is safe to have no initial value\n return array.reduce(function(prev, next) {\n return deepmerge(prev, next, optionsArgument);\n });\n};\n\nwindow.deepmerge = deepmerge;\n\nexport default deepmerge;\n","/* eslint-disable no-param-reassign, no-multi-assign */\n\nimport Events from './backbone.events';\nimport device from './device';\nimport merge from './merge';\n\nconst jwUtils = jwplayer.utils;\nconst jwUnderscore = jwplayer._;\n// jwplayer is hard dependecy here\nconst utils = {\n Events: Events,\n // methods reused from jwplayer core\n extend: jwUtils.extend,\n // merge with deep copy, similar to jQuery extend\n merge: merge,\n ajax: jwUtils.ajax,\n each: jwUnderscore.each,\n isUndefined: jwUnderscore.isUndefined,\n isNumber: jwUnderscore.isNumber,\n isString: jwUnderscore.isString,\n isArray: jwUnderscore.isArray,\n createNode: jwUtils.createElement,\n addStyleSheet: jwUtils.addStyleSheet,\n addClass: jwUtils.addClass,\n removeClass: jwUtils.removeClass,\n\n /**\n * Template system borrowed from http://ejohn.org/blog/javascript-micro-templating/\n */\n template: (function () {\n var cache = {};\n\n return function tmpl(str, data) {\n // Figure out if we're getting a template, or if we need to\n // load the template - and be sure to cache the result.\n var fn = !/\\W/.test(str)\n ? cache[str] = cache[str]\n || tmpl(document.getElementById(str).innerHTML)\n\n // Generate a reusable function that will serve as a template\n // generator (and which will be cached).\n // eslint-disable-next-line no-new-func\n : new Function('obj',\n `${'var p=[],print=function(){p.push.apply(p,arguments);};'\n\n // Introduce the data as local variables using with(){}\n + \"with(obj){p.push('\"}${\n\n // Convert the template into pure JavaScript\n str\n .replace(/[\\r\\t\\n]/g, ' ')\n .split('<%').join('\\t')\n .replace(/((^|%>)[^\\t]*)'/g, '$1\\r')\n .replace(/\\t=(.*?)%>/g, \"',$1,'\")\n .split('\\t')\n .join(\"');\")\n .split('%>')\n .join(\"p.push('\")\n .split('\\r')\n .join(\"\\\\'\")\n }');}return p.join('');`);\n\n // Provide some basic currying to the user\n return data ? fn(data) : fn({});\n };\n }()),\n /* jshint ignore:end */\n\n device: device,\n\n time: {\n shareTimeToSeconds: function (time) {\n var hours,\n minutes,\n seconds,\n length;\n\n time = jwUnderscore.compact(time.split(/[msh]/));\n length = time.length; // last is empty\n\n seconds = parseInt(time[length - 1], 10);\n minutes = time[length - 2];\n hours = time[length - 3];\n\n return seconds + (minutes ? parseInt(minutes, 10) * 60 : 0) + (hours ? parseInt(hours, 10) * 3600 : 0);\n }\n },\n\n number: {\n zeroPad: function (number) {\n number = parseInt(number, 10);\n return number < 10 ? `0${number}` : number.toString();\n }\n },\n\n string: {\n // timestamp [s]\n getTimeFormatted: function (timestamp) {\n var hours = Math.floor(timestamp / 3600),\n minutes = Math.floor((timestamp % 3600) / 60),\n seconds = timestamp % 60;\n\n return `${(hours > 0 ? `${hours}:` : '') + utils.number.zeroPad(minutes)}:${utils.number.zeroPad(seconds)}`;\n }\n },\n\n /**\n * Check snap points support\n * @returns {boolean}\n */\n getScrollSnapPrefix: function () {\n var scrollSnapSupport = false;\n\n if ('webkitScrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '-webkit-';\n } else if ('msScrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '-ms-';\n } else if ('scrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '';\n }\n\n return scrollSnapSupport;\n },\n\n /**\n * @param {string} path\n */\n loadScript: function (path) {\n return new Promise(function (resolve, reject) {\n var script = document.createElement('script'),\n done = false;\n\n script.type = 'text/javascript';\n script.src = path;\n script.async = true;\n script.onreadystatechange = script.onload = function() {\n if (!done && (!this.readyState\n || this.readyState === 'loaded' || this.readyState === 'complete')) {\n done = true;\n resolve();\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n }\n };\n script.onerror = reject;\n\n document.body.appendChild(script);\n });\n },\n\n jsonToUrl: function (obj) {\n return Object.keys(obj).map(function(key) {\n return `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`;\n }).join('&');\n }\n};\n\nexport default utils;\n","const counters = {};\n\nconst log = function(...args) {\n const counter = counters[args[0]] || 0;\n counters[args[0]] = counter + 1;\n\n args[0] = `${args[0]}: ${counter} %c\"${args[1]}\"`;\n args[1] = 'color: #ca2117;';\n\n // eslint-disable-next-line no-console\n console.log(...args);\n};\n\n/**\n * @param {string} block\n * @returns {boolean}\n */\nconst isEnabled = function(block) {\n const itemKey = `logSvpPlayer${block}`;\n\n // check global first\n if (window[itemKey] === true) {\n return true;\n }\n\n // fix Safari errors when cookies are disabled\n try {\n if (!window.localStorage) {\n return false;\n }\n\n return window.localStorage.getItem(itemKey) === 'true';\n } catch (error) {\n return false;\n }\n};\n\n/**\n * @param {string} [block='SVP']\n * @return {{log: (...[*]) => void, error: ((...[*]) => void)}}\n */\nexport default function(block = 'SVP') {\n // eslint-disable-next-line no-console\n const error = (...args) => console.error('SVP Player:', ...args);\n\n if (isEnabled(block)) {\n return {\n log(...args) {\n if (typeof args[0] === 'function') {\n args[0](log.bind(this, block));\n } else {\n args.unshift(block);\n log.apply(this, args);\n }\n },\n error\n };\n }\n\n return {\n log() {},\n error\n };\n}\n","/**\n * @type {Record}\n */\nlet translations = {};\n\n/**\n * @param {Record} data\n */\nconst setTranslations = (data) => {\n translations = data;\n};\n\n/**\n * @returns {Record}\n */\nconst getTranslations = () => translations;\n\n/**\n * @param {string} key\n * @param {string} [substitute]\n * @returns {string}\n */\n// eslint-disable-next-line arrow-body-style\nconst translate = (key, substitute) => {\n // typeof to check keys like \"0\"\n return translations[key] || (typeof substitute === 'undefined' ? key : substitute);\n};\n\n/**\n * @param {Date} date\n * @returns {string|undefined}\n */\nconst getMonthName = (date) => {\n const months = translations.months || [];\n return months[date.getMonth()] || date.getMonth();\n};\n\nexport default {\n translate,\n setTranslations,\n getMonthName,\n getTranslations\n};\n","import config from 'player/config';\n\n/**\n * @param {Response} response\n * @returns {Response}\n */\nfunction handleErrors(response) {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response;\n}\n\n/**\n * @param {string} url\n * @returns {Promise<*>}\n */\nfunction makeFetch(url) {\n return fetch(url)\n .then(handleErrors)\n .then((response) => response.json());\n}\n\nexport const APPNEXUS_PROVIDER_ID = 'appnexus';\n\nexport const assetAdditionalData = [\n 'settings', 'chapters', 'cuePoints', 'externalId', 'barrels',\n 'externalCategoryId', 'nextAsset', 'sourceFiles', 'subtitles',\n 'metadata', 'access', 'tags', 'stories', 'playlist'\n].join('|');\n\n/**\n * @param {string} vendor\n * @param {string} endpoint\n * @returns {Promise<*>}\n */\nconst api = (vendor, endpoint) => makeFetch(config.api.getUrl(vendor, endpoint));\n\n/**\n * @param {string} path\n * @param {string} query\n * @returns {Promise}\n */\nexport const relatedApi = ({ path, query }) => {\n const relatedApiUrl = config.api.relatedApiUrl.replace(/\\/$/, '');\n\n return makeFetch(`${relatedApiUrl}/${path}?${query}`);\n};\n\nexport default api;\n","import _ from './underscore';\nimport Events from './backbone.events';\n\nconst SimpleModel = _.extend({\n /**\n * @param {string} attr\n */\n get: function (attr) {\n this.attributes = this.attributes || {};\n return this.attributes[attr];\n },\n /**\n * @param {string} attr\n * @param {*} val\n */\n set: function (attr, val) {\n this.attributes = this.attributes || {};\n\n if (this.attributes[attr] === val) {\n return;\n }\n const oldVal = this.attributes[attr];\n this.attributes[attr] = val;\n this.trigger(`change:${attr}`, this, val, oldVal);\n },\n clone: function () {\n return _.clone(this.attributes);\n }\n}, Events);\n\nexport default SimpleModel;\n","/* eslint-disable no-param-reassign */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\n\n/**\n * @param {SvpCategory} data\n */\nconst Category = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nCategory.prototype = {\n /**\n * @param {SvpCategory} data\n */\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n /**\n * @param {SvpCategory} data\n * @returns {ParsedCategory}\n */\n parse(data) {\n if (data.additional) {\n utils.each(data.additional, (value, key) => {\n if (typeof data[key] === 'undefined') {\n data[key] = value;\n }\n });\n\n data.images = utils.extend({}, data.images || {}, {\n background: data.background,\n main: data.image,\n logo: data.logo,\n playerLogo: data.playerLogoImage\n });\n\n delete data.additional;\n delete data.background;\n delete data.image;\n delete data.logo;\n delete data.playerLogoImage;\n }\n\n return data;\n }\n};\n\nutils.extend(Category.prototype, Model);\n\nexport default Category;\n","/* eslint-disable no-param-reassign */\nimport { assetAdditionalData } from 'player/services/api';\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport config from 'player/config';\nimport Category from './category';\n\n/**\n * @typedef AssetChapter\n * @property {string|null} description\n * @property {boolean} featured\n * @property {number} timeline\n * @property {string} title\n */\n\n/**\n * @param {Response} response\n * @returns {Response}\n */\nfunction handleErrors(response) {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response;\n}\n\nconst Asset = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nAsset.prototype = {\n /**\n * @param {SvpAsset} data\n */\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n /**\n * @returns {string}\n */\n url() {\n return config.api.getUrl(\n this.getVendor(),\n `/assets/${this.get('id')}?additional=${assetAdditionalData}`\n );\n },\n\n /**\n * @param {SvpAsset} data\n * @returns {ParsedAsset}\n */\n parse(data) {\n data = data || {};\n\n function unifyTimestamp(time) {\n if (!time) {\n return null;\n }\n\n if (time.toString().length === 10) {\n return time * 1000;\n }\n\n return time;\n }\n\n // rewrite additional fields\n if (data.additional) {\n utils.each(data.additional, (value, key) => {\n // featured chapters are fetched on the lists\n // merge them\n if (key === 'featuredChapters') {\n key = 'chapters';\n }\n\n if (key === 'subtitles') {\n key = 'captions';\n }\n\n if (typeof data[key] === 'undefined') {\n data[key] = value;\n }\n });\n\n if (data.additional.settings) {\n if (data.additional.settings.startIndexPoint) {\n data.startIndexPoint = data.additional.settings.startIndexPoint;\n }\n\n if (!utils.isUndefined(data.additional.settings.ageLimit)) {\n data.ageLimit = data.additional.settings.ageLimit;\n }\n }\n\n if (data.additional.sourceFiles) {\n data.sourceFiles = data.additional.sourceFiles;\n }\n }\n\n if (data.series) {\n data.season = parseInt(data.series.seasonNumber, 10);\n data.episode = parseInt(data.series.episodeNumber, 10);\n\n delete data.series;\n }\n\n // multiply timestamps by 1000 to use ms instead of s\n if (data.flightTimes) {\n data.flightTimes = {\n start: (data.flightTimes.start ? unifyTimestamp(data.flightTimes.start) : null),\n end: (data.flightTimes.end ? unifyTimestamp(data.flightTimes.end) : null)\n };\n }\n\n data.created = (data.created ? unifyTimestamp(data.created) : null);\n data.published = (data.published ? unifyTimestamp(data.published) : null);\n data.updated = (data.updated ? unifyTimestamp(data.updated) : null);\n\n if (data.category && !(data.category instanceof Category)) {\n data.category = new Category(data.category);\n }\n\n if (data.chapters) {\n utils.each(data.chapters, (chapter, index) => {\n chapter.time = utils.string.getTimeFormatted(chapter.timeline);\n chapter.index = (index + 1);\n });\n }\n\n // next asset is optional, fill with basic object to avoid undefined errors\n if (!data.nextAsset) {\n data.nextAsset = {};\n }\n\n data.tags = data.tags || [];\n\n // eslint-disable-next-line no-underscore-dangle\n if (data._embedded && data._embedded.tags) {\n // eslint-disable-next-line no-underscore-dangle\n data.tags = data._embedded.tags;\n }\n\n data.playlist = [];\n\n // eslint-disable-next-line no-underscore-dangle\n if (data._embedded && data._embedded.playlist) {\n // eslint-disable-next-line no-underscore-dangle\n data.playlist = data._embedded.playlist;\n }\n\n return data;\n },\n\n /**\n * @returns {Promise}\n */\n fetch() {\n return fetch(this.url())\n .then(handleErrors)\n .then((response) => response.json())\n .then((json) => {\n Object.assign(this.attributes, this.parse(json));\n });\n },\n\n /**\n * @returns {string}\n */\n getVendor() {\n return this.get('vendor');\n },\n\n destroy() {\n // in case of any cleanup\n },\n\n /**\n * @returns {number}\n */\n getAgeLimit() {\n return utils.isNumber(this.get('ageLimit')) ? this.get('ageLimit') : -1;\n },\n\n /**\n * @returns {boolean}\n */\n isSponsored() {\n const metadata = this.get('metadata');\n\n let isSponsored = false;\n\n /**\n * SVP API metadata values are always strings. There can be different structures serialized to string though.\n */\n if (metadata && metadata.sponsored) {\n try {\n isSponsored = JSON.parse(metadata.sponsored.toLowerCase()) === true;\n } catch (e) {\n // All the cases that fail to be json decoded are treated as false\n }\n }\n\n return isSponsored;\n },\n\n /**\n * @returns {string|undefined}\n */\n getCategoryTitle() {\n const category = this.get('category');\n const {\n attributes: {\n title\n } = {}\n } = category || {};\n return title;\n },\n\n /**\n * Get chapter by its index (numbered from 1)\n *\n * @param chapterIndex\n * @returns {*} or undefined if not found\n */\n getChapter(chapterIndex) {\n return this.getChapters()[chapterIndex - 1];\n },\n\n /**\n * Get chapters for single stream\n *\n * @returns {AssetChapter[]}\n */\n getChapters() {\n return this.get('chapters') || [];\n },\n\n /**\n * @returns {string}\n */\n getThumbnail() {\n return this.get('images').main;\n },\n\n /**\n * @returns {string}\n */\n getTitle() {\n return this.get('title');\n },\n\n /**\n * @returns {Category}\n */\n getCategory() {\n return this.get('category');\n },\n\n /**\n * @returns {boolean}\n */\n isAudio() {\n return this.get('assetType') === 'audio';\n }\n};\n\nutils.extend(Asset.prototype, Model);\n\nexport default Asset;\n","/* eslint-disable no-plusplus,import/no-mutable-exports */\n\n/**\n * @type {number}\n */\nvar requestNumber;\n/**\n * @type {number}\n */\nvar currentServerId;\n/**\n * @type {*}\n */\nvar config;\n/**\n * @type {number}\n */\nvar serversAmount;\n\nconst getServer = (function() {\n var MAX_REQUEST_PER_SERVER = 6;\n\n return function(imageId) {\n if (!imageId) {\n return '';\n }\n\n if (requestNumber === MAX_REQUEST_PER_SERVER) {\n if (currentServerId === serversAmount) {\n currentServerId = -1;\n }\n\n requestNumber = 0;\n currentServerId++;\n }\n\n requestNumber++;\n\n return imageId.replace('imbo', config.servers[currentServerId]);\n };\n}());\n\n/**\n * @param {number} pixelRatio\n * @returns {number}\n */\nfunction getImageQuality(pixelRatio) {\n return (pixelRatio >= 2) ? 50 : 80;\n}\n\n/**\n * @param {number} size\n * @param {number} pixelRatio\n * @returns [number, number]\n */\nfunction normalizeTransformSize(size, pixelRatio) {\n // return default value\n return [\n size,\n getImageQuality(pixelRatio)\n ];\n}\n\n/**\n * @param {number[]} transformSizes\n * @param {number} maxDimension\n * @returns {number|undefined}\n */\nfunction getClosestSize(transformSizes, maxDimension) {\n return transformSizes.reduce(function (prev, curr) {\n return (Math.abs(curr - maxDimension) < Math.abs(prev - maxDimension) ? curr : prev);\n });\n}\n\n/**\n * @returns {number}\n */\nfunction getPixelRatio() {\n // we do not support px lower than 1 and bigger than 2\n return Math.max(1, Math.min(2, config.getPixelRatio()));\n}\n\n/**\n * Returns transformation for given image key and width\n * Adjusts the best\n */\nconst getImageTransform = (function() {\n /**\n * @type {Record}\n */\n var cache = {};\n\n /**\n * @param {string} key\n * @param {number} width\n * @param {number} height\n * @returns {string}\n */\n function imageTransform(key, width, height) {\n const pixelRatio = getPixelRatio();\n const cacheKey = key + width + height + pixelRatio;\n\n // first check if there is cached object\n if (cache[cacheKey]) {\n return cache[cacheKey];\n }\n\n const id = key.split('.');\n let transformSizes = config.sizes;\n\n let i = 0;\n while (i < id.length) {\n transformSizes = transformSizes[id[i]];\n\n if (!transformSizes) {\n throw new Error(`Image transformation missing for key ${key}`);\n }\n\n i++;\n }\n\n const transformType = (height > width) ? 'autoWidth' : 'autoHeight';\n transformSizes = transformSizes[transformType];\n\n // transformation is adjusted to not 'auto' side\n let maxDimension = (transformType === 'autoHeight') ? width : height;\n maxDimension *= pixelRatio;\n\n const dimensions = normalizeTransformSize(getClosestSize(transformSizes, maxDimension), pixelRatio);\n\n // auto width transform starts with 'x'\n // http://svp.vg.no/svp/api/v1/docs/\n let transform = (transformType === 'autoWidth') ? 'x' : '';\n transform = `${transform}${dimensions[0]}q${dimensions[1]}`;\n\n cache[cacheKey] = transform;\n\n return transform;\n }\n\n return imageTransform;\n}());\n\nconst image = {\n /**\n * @param {*} options\n */\n initialize: function(options) {\n config = options;\n serversAmount = options.servers.length - 1;\n requestNumber = 0;\n currentServerId = 0;\n },\n /**\n * @param {string} imageId\n * @param {string} key\n * @param {number} width\n * @param {number} height\n * @returns {string|null}\n */\n getImageSrc: function(imageId, key, width, height) {\n if (imageId) {\n const extension = (imageId.indexOf('.jpg') === -1 && imageId.indexOf('.png') === -1 ? '.jpg' : '');\n return `${getServer(imageId) + extension}?t[]=${getImageTransform(key, width, height)}`;\n }\n return null;\n }\n};\n\nexport default image;\n","/* eslint-disable no-restricted-syntax, guard-for-in */\n\n/**\n * @param {Object} obj\n * @return {string}\n */\nconst objectToString = (obj) => {\n // create an array that will later be joined into a string.\n const string = [];\n\n // is object\n // Both arrays and objects seem to return \"object\"\n // when typeof(obj) is applied to them. So instead\n // I am checking to see if they have the property\n // join, which normal objects don't have but\n // arrays do.\n if (obj === undefined) {\n return String(obj);\n } if (typeof (obj) === 'object' && obj !== null && (obj.join === undefined)) {\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n string.push(`${prop}: ${objectToString(obj[prop])}`);\n }\n }\n\n return `{${string.join(',')}}`;\n\n // is array\n } if (typeof (obj) === 'object' && obj !== null && !(obj.join === undefined)) {\n for (const prop in obj) {\n string.push(objectToString(obj[prop]));\n }\n return `[${string.join(',')}]`;\n\n // is function\n } if (typeof (obj) === 'function') {\n string.push(obj.toString());\n\n // all other values can be done with JSON.stringify\n } else {\n string.push(JSON.stringify(obj));\n }\n\n return string.join(',');\n};\n\n/**\n * @param {string} string\n * @return {string}\n */\nconst capitalizeFirstLetter = (string) => {\n try {\n return string.charAt(0).toUpperCase() + string.slice(1);\n } catch (e) {\n // return what was sent\n return string;\n }\n};\n\nexport {\n objectToString,\n capitalizeFirstLetter\n};\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\n/**\n * @param {string} origin\n * @param {string[]} domains\n * @returns {boolean}\n */\nfunction isDomainInArray(origin, domains) {\n let domain;\n let pos;\n let domainBeginning;\n\n // check if domain has access for given provider\n // otherwise deny it\n // allow all dev builds set settings\n if (config.version === 'dev') {\n return true;\n }\n\n // list is not provided\n if (!utils.isArray(domains)) {\n return false;\n }\n\n const len = domains.length;\n\n for (let i = 0; i < len; i += 1) {\n domain = domains[i];\n\n // subdomain parsing, subdomain has to end with domain\n if (domain[0] === '*') {\n // remove asterisk\n domain = domain.slice(1);\n pos = origin.indexOf(domain);\n\n domainBeginning = origin[origin.length - domain.length - 1];\n\n // check if origin has exactly the same ending of domain\n if (pos > -1 && origin.length - pos === domain.length\n && (domainBeginning === undefined || domainBeginning === '.')) {\n return true;\n }\n\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (domain.indexOf(origin) > -1) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Inherit data from parent array to child\n * Prevents undefined to persist if one of given array is empty\n *\n * @param {string[]} parent\n * @param {string[]} child\n * @returns {string[]}\n */\nfunction inherit(parent, child) {\n return (parent || []).concat(child || []);\n}\n\nconst Domain = {\n /**\n * @type {string|null}\n */\n domain: null,\n\n // default settings configuration\n settings: {\n // boolean Preview of not published videos\n preview: false,\n // completely turn off all ads\n na: false\n },\n\n /**\n * @type {Record>}\n */\n vendors: {},\n\n /**\n * @param {string} domain\n */\n initialize(domain) {\n this.domain = domain;\n },\n\n /**\n * Fetch permissions for extended settings\n *\n * @param {string} vendor\n * @returns {Promise<*>}\n */\n fetch(vendor) {\n if (!this.vendors[vendor]) {\n this.vendors[vendor] = Promise.resolve(config.domains);\n }\n\n return this.vendors[vendor];\n },\n\n /**\n * Check whatever custom settings may be used on current domain or not\n *\n * @param vendor - api key vendor\n * @returns {Promise>}\n */\n getPermissions(vendor) {\n return this.fetch(vendor).then((data) => {\n const result = {};\n\n utils.each(data, (item, key) => {\n result[key] = isDomainInArray(\n this.domain,\n inherit(item.global, item[vendor])\n );\n });\n\n return result;\n });\n },\n\n /**\n * Check if current domain is blacklisted\n *\n * @param {string} vendor - api vendor key\n * @returns {boolean}\n */\n isBlacklisted(vendor) {\n const { blacklist } = config.domains;\n\n // check if domain has access for given provider\n // otherwise deny it\n // allow all dev builds set settings\n if (config.version === 'dev') {\n return false;\n }\n\n return isDomainInArray(this.domain, inherit(blacklist.global, blacklist[vendor]));\n }\n};\n\nexport default Domain;\n","import utils from 'utils/utils';\nimport config from 'player/config';\n\nimport { TOKEN_FETCH_ERROR } from '../playback/config/status-codes';\n\n/**\n * @param {{expiry: number, value: string}} params\n * @returns {Promise}\n */\nconst fetchToken = function(params) {\n this.isFetching = true;\n\n return new Promise((resolve, reject) => {\n // fetch new token\n utils.ajax(this.url(params), (response) => {\n this.expire = +new Date() + 1000;\n this.value = response.responseText;\n this.isFetching = false;\n resolve(this.value);\n }, () => {\n this.isFetching = false;\n reject(TOKEN_FETCH_ERROR);\n }, true);\n });\n};\n\nclass Token {\n /**\n * @param {number} assetId\n * @param {string} [assetAccess]\n * @param {number} [maxBitrate]\n */\n constructor(assetId, assetAccess, maxBitrate) {\n /**\n * Id of SVP related asset\n *\n * @type {number}\n */\n this.assetId = assetId;\n\n /**\n * An access level key string\n * See https://svp.vg.no/svp/api/v1/vgtv/assets/access-definitions?appName=docs for available levels\n *\n * @type {string}\n */\n this.assetAccess = assetAccess;\n\n /**\n * Akamai token value retrieved from SVP api\n * @type {string|null}\n */\n this.value = null;\n /**\n * Expiration time, timestamp\n * @type {number|null}\n */\n this.expire = null;\n\n /**\n * Maximum allowed bitrate for stream\n * @type {number|null}\n */\n this.maxBitrate = maxBitrate || null;\n\n /**\n * @type {Promise|null}\n */\n this.request = null;\n this.isFetching = false;\n }\n\n /**\n * @param {((assetId: number, assetAccess: string) => Promise)} [configuration]\n * @returns {Promise|null}\n */\n fetch(configuration) {\n if (!this.isValid()) {\n if (this.request && this.isFetching) {\n return this.request;\n }\n\n if (typeof configuration === 'function') {\n this.request = configuration(this.assetId, this.assetAccess).then(fetchToken.bind(this));\n } else {\n this.request = fetchToken.call(this);\n }\n }\n\n return this.request;\n }\n\n /**\n * @param {{expiry: number, value: string}} params\n *\n * @returns {string}\n */\n url(params) {\n const query = [\n `vendor=${config.api.vendor}`\n ];\n\n if (params && params.expiry && params.value) {\n query.push(`assetId=${this.assetId}`);\n query.push(`expires=${params.expiry}`);\n query.push(`hmac=${params.value}`);\n } else {\n query.push('acl=/*');\n }\n\n if (this.maxBitrate) {\n query.push(`maxBitrate=${this.maxBitrate}`);\n }\n\n return `${config.api.tokenUrl}?${query.join('&')}`;\n }\n\n /**\n * @returns {string|null}\n */\n getValue() {\n return this.value;\n }\n\n /**\n * @returns {boolean}\n */\n isValid() {\n // on load expire is null therefore it will always return false\n return (+new Date() < this.expire);\n }\n}\n\nutils.extend(Token.prototype, utils.Events);\n\nexport default Token;\n","import utils from 'utils/utils';\nimport Model from 'utils/model';\nimport device from 'utils/device';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\n\n/**\n * @param {SvpAsset} options\n * @constructor\n */\nconst Stream = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nStream.prototype = {\n /**\n * @param {SvpAsset} data\n */\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n /**\n * Parse data from asset\n * Be aware, data went through Asset.parse method\n *\n * @param {SvpAsset} data\n * @returns {ParsedStream}\n */\n parse(data) {\n const result = {\n id: data.id,\n vendor: data.vendor,\n title: data.title,\n\n streams: {\n hls: data.streamUrls.hls,\n mp4: data.streamUrls.mp4 ? [data.streamUrls.mp4] : []\n },\n status: data.status,\n type: data.streamType,\n mediaType: data.assetType,\n streamConfiguration: data.streamConfiguration,\n\n images: {\n main: data.images.main,\n snapshots: data.images.snapshots || null\n },\n\n captions: data.captions || [],\n\n flightTimes: {\n start: null,\n end: null\n },\n\n playback: {\n begin: null,\n end: null\n },\n\n sourceFiles: data.sourceFiles || [],\n externalId: data.externalId || null,\n category: data.category\n };\n\n if (data.duration) {\n result.duration = data.duration / 1000;\n }\n\n if (data.additional && data.additional.metadata) {\n result.disableNextVideo = data.additional.metadata.disableNextVideo;\n result.chunkDuration = Number(data.additional.metadata.chunkDuration);\n result.isPodcast = data.additional.metadata.isPodcast === 'true';\n result.hasSubtitlesInHls = data.additional.metadata.hasSubtitlesInHls;\n result.tts = Boolean(data.additional.metadata.tts_articleId);\n\n result.videoPreviews = Object.entries(data.additional.metadata)\n .reduce((videoPreviews, [metadataKey, metadataValue]) => {\n if (!metadataKey.includes('preview')) {\n return videoPreviews;\n }\n return {\n ...videoPreviews,\n [metadataKey]: metadataValue\n };\n }, {});\n }\n\n // override start and end if set in api\n if (data.flightTimes) {\n result.flightTimes = {\n start: (data.flightTimes.start ? data.flightTimes.start : null),\n end: (data.flightTimes.end ? data.flightTimes.end : null)\n };\n }\n\n if (data.playback) {\n result.playback = {\n begin: data.playback.begin,\n end: data.playback.end\n };\n }\n\n // additional stream settings\n if (data.settings) {\n result.showAds = data.settings.showAds;\n }\n\n // cue points, empty array if nothing set\n result.cuePoints = data.cuePoints;\n\n // playlist, empty array if nothing set\n result.playlist = data.playlist || [];\n\n // add midroll in 10s TODO remove after tests\n // result.cuePoints = [31];\n return result;\n },\n\n /**\n * @returns {number}\n */\n getId() {\n return this.get('id');\n },\n\n /**\n * @returns {string}\n */\n getVendor() {\n return this.get('vendor');\n },\n\n /**\n * @returns {Category}\n */\n getCategory() {\n return this.get('category');\n },\n\n /**\n * @param {string} property\n * @return {boolean}\n */\n hasProperty(property) {\n return this.get('streamConfiguration').properties.indexOf(property) > -1;\n },\n\n /**\n * @returns {boolean}\n */\n hasSubtitlesInHls() {\n return this.get('hasSubtitlesInHls') === 'true';\n },\n\n /**\n * Get duration stored in API\n *\n * @returns {number}\n */\n getDuration() {\n return this.get('duration');\n },\n\n /**\n * @returns {number[]}\n */\n getCuePoints() {\n return this.get('cuePoints');\n },\n\n /**\n * Check if stream has Akamai Secure Token\n * @returns {boolean}\n */\n isSecure() {\n return this.hasProperty('tokenSecured');\n },\n\n /**\n * Check if stream is behind paywall\n * @returns {boolean}\n */\n hasAccess() {\n return !!this.get('access');\n },\n\n /**\n * Check wheter give stream contains mock data to allow embedding player without asset id\n * @returns {boolean}\n */\n isMock() {\n return this.get('type') === 'mock';\n },\n\n /**\n * Check if stream is available only in certain areas\n * @returns {boolean}\n */\n isGeoblocked() {\n return this.hasProperty('geoblocked');\n },\n\n /**\n * @returns {boolean}\n */\n isLive() {\n return this.get('type') === 'live';\n },\n\n /**\n * @returns {boolean}\n */\n wasLive() {\n return this.get('type') === 'wasLive';\n },\n\n /**\n * @returns {boolean}\n */\n isActive() {\n return this.get('status') === 'active' && !this.isPast();\n },\n\n /**\n * @returns {boolean}\n */\n isFuture() {\n return (this.get('flightTimes') && this.get('flightTimes').start\n ? this.get('flightTimes').start > ServerTime.getTime() : false);\n },\n\n /**\n * @returns {boolean}\n */\n isPast() {\n return (this.get('flightTimes') && this.get('flightTimes').end\n ? (this.get('flightTimes').end < ServerTime.getTime()) : false);\n },\n\n /**\n * @returns {boolean}\n */\n hasPlaylist() {\n return this.get('playlist').length > 0;\n },\n\n /**\n * @returns {boolean}\n */\n isDisabledNextVideo() {\n return !!this.get('disableNextVideo');\n },\n /**\n * Streams might not be available while asset is created\n *\n * @returns {boolean}\n */\n hasPlayableSource() {\n if (this.getTimeToStart() > 0 || !this.isActive()) {\n return false;\n }\n\n return true;\n },\n\n getUrl(streamType) {\n const isOnHttp = window.location.protocol.toLowerCase().startsWith('http:');\n const type = streamType.toLowerCase();\n\n let streamUrl = this.get('streams')[type];\n\n if (utils.device.isIE() && isOnHttp) {\n streamUrl = streamUrl.replace('https', 'http');\n }\n\n return streamUrl;\n },\n\n /**\n * @returns {string}\n */\n getPoster() {\n return this.get('images').main;\n },\n\n /**\n * Returns preview video URL\n * @param {string} metadataKey\n * @returns {string|undefined}\n */\n getVideoPreviewUrl(metadataKey) {\n const videoPreviews = this.get('videoPreviews');\n return videoPreviews ? videoPreviews[metadataKey] : undefined;\n },\n\n /**\n * Get chunk duration of live video\n *\n * @returns {number}\n */\n getChunkDuration() {\n return this.get('chunkDuration');\n },\n\n /**\n * Get snapshots url\n * @returns {string|null} - url string or null if snapshots not found\n */\n getSnapshots() {\n return `${config.api.thumbnailsUrl + this.getVendor()}/assets/${this.getId()}`;\n },\n\n /**\n * Not every asset has snapshot (lives, wasLives)\n *\n * @returns {boolean}\n */\n hasSnapshots() {\n return this.get('images').snapshots !== null;\n },\n\n /**\n * Get captions associated with stream\n *\n * @returns {boolean}\n */\n getCaptions() {\n return this.get('captions') || [];\n },\n\n /**\n * Check if mp4 streams are available\n *\n * @returns {boolean}\n */\n hasMp4Streams() {\n return this.get('streams').mp4.length > 0;\n },\n\n /**\n * Check if asset is published\n * Method relay on server time to avoid timezone differences\n *\n * @returns {number} seconds to live\n */\n getTimeToStart() {\n return (this.get('flightTimes').start - ServerTime.getTime()) / 1000;\n },\n\n /**\n * Asset can be virually sliced into small chunks\n * These are only indicators and do not slice stream\n *\n * @param position\n *\n * @returns {number|null}\n */\n getPlaybackTime(position) {\n const playback = this.get('playback');\n\n if (position === 'begin') {\n if (this.get('playAhead') > 0) {\n return this.get('playAhead');\n }\n\n return (playback.begin > 0) ? playback.begin : null;\n }\n\n if (position === 'end' && playback.end > 0) {\n return playback.end;\n }\n\n return null;\n },\n\n /**\n * External id\n * Used for JW Player statistics\n *\n * @returns {string|undefined}\n */\n getExternalId() {\n return this.get('externalId');\n },\n\n /**\n * Check wethever stream has ads disabled\n *\n * @returns {boolean}\n */\n hasAdsDisabled() {\n return this.get('showAds') === false;\n },\n\n /**\n * @returns {boolean}\n */\n isAudio() {\n return this.get('mediaType') === 'audio';\n },\n\n /**\n * @returns {boolean}\n */\n hasTextSpeech() {\n return this.get('tts');\n },\n\n /**\n * Check if stream is podcast\n * @returns {boolean}\n */\n isPodcast() {\n return this.get('isPodcast') === true;\n },\n\n /**\n * Get VMAP API URL for ads schedule\n * @returns {string}\n */\n getVmapApiUrl() {\n let supplyType = 'web_desktop';\n\n if (device.isMobile()) {\n supplyType = 'web_phone';\n } else if (device.isTablet()) {\n supplyType = 'web_tablet';\n }\n\n return `${config.api.vmapUrl}/${this.getVendor()}/${this.getId()}?supplyType=${supplyType}`;\n }\n};\n\nutils.extend(Stream.prototype, Model);\n\nexport default Stream;\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\n/**\n * @param {string} url\n * @param {Object} params\n * @returns {string}\n */\nfunction buildUrlString(url, params) {\n const cb = Math.round(Math.random() * 100000000000);\n const queryParams = utils.jsonToUrl(utils.extend({ cb }, params));\n return `${url}?${queryParams}`;\n}\n\n/**\n * This is only for overriding/preview ads live on the page\n * @see https://github.schibsted.io/svp/web-player/issues/833\n * @param {string|number} overriddenId\n * @returns {string}\n */\nexport function getOverriddenCrTag(overriddenId) {\n const overriddenParams = { id: overriddenId, format: 'vast' };\n return buildUrlString(config.ads.appnexus.cr, overriddenParams);\n}\n\n/**\n * @param {Record} params\n * @returns {string}\n */\nexport function getPtvTag(params) {\n return buildUrlString(config.ads.appnexus.ptv, params);\n}\n\n/**\n * @param {Record} params\n * @returns {string}\n */\nexport function getVmapTag(params) {\n return buildUrlString(config.ads.appnexus.vmap, params);\n}\n\n/**\n * @param {Object} tagOptions\n * @param {Object} globalOptions\n * @returns {Object}\n */\nexport function getAstConfig(tagOptions, globalOptions) {\n return utils.extend({}, utils.merge(globalOptions, tagOptions));\n}\n\n/**\n * @param {Stream & Eventable} stream\n * @returns {Object}\n */\nexport function getDefaultParams(stream) {\n const publisherName = stream.getVendor();\n const countryCode = config.vendors.se.includes(publisherName) ? 'se' : 'no';\n const supplyType = `web_${utils.device.getDeviceType()}`;\n return {\n countryCode,\n supplyType,\n publisherName,\n slotIds: { preroll: 1, midroll: 2, postroll: 3 }\n };\n}\n","import utils from 'utils/utils';\nimport * as appnexusTag from './appnexus-tag-builder';\n\nconst OVERRIDE_SEPARATOR = ':';\nconst OVERRIDE_SLOT_PARAM = 'ast_override_slot';\nconst OVERRIDE_SLOT_TAG_ID = 'ast_override_tag_id';\n\n/**\n * @returns {Record|undefined}\n */\nexport function getOverriddenParams() {\n const urlParams = new URLSearchParams(window.location.search);\n\n if (urlParams.has(OVERRIDE_SLOT_PARAM)) {\n const [slotName, creativeId] = urlParams.get(OVERRIDE_SLOT_PARAM).split(OVERRIDE_SEPARATOR);\n return { [slotName]: creativeId };\n }\n\n if (urlParams.has(OVERRIDE_SLOT_TAG_ID)) {\n const [tagId, creativeId] = urlParams.get(OVERRIDE_SLOT_TAG_ID).split(OVERRIDE_SEPARATOR);\n return { [tagId]: creativeId };\n }\n\n return undefined;\n}\n\nexport default class JwAdsConfig {\n /**\n * @param {Stream & Eventable} stream\n */\n constructor(stream) {\n this.stream = stream;\n this.config = {};\n this.params = [];\n this.overriddenParams = getOverriddenParams();\n }\n\n /**\n * @param {Object} params\n */\n setParams(params) {\n this.params = params;\n }\n\n /**\n * @param {Object} adSlotConfig\n * @param {string} adLabel\n * @return {string}\n */\n getTag(adSlotConfig, adLabel) {\n const adConfig = utils.merge(this.params, adSlotConfig);\n const overriddenId = this.overriddenParams && (\n this.overriddenParams[adLabel] || (adConfig.id && this.overriddenParams[adConfig.id])\n );\n if (overriddenId) {\n return appnexusTag.getOverriddenCrTag(overriddenId);\n }\n\n if (this.stream.isAudio()) {\n return appnexusTag.getPtvTag(adConfig);\n }\n\n return appnexusTag.getVmapTag(adConfig);\n }\n\n /**\n * @param {Object} adSlotConfig\n * @param {string} offset\n * @param {string} adLabel\n */\n add(adSlotConfig, offset, adLabel) {\n // do not add tag when id is empty\n if (adSlotConfig) {\n this.config[adLabel + Math.floor(Math.random() * 100) + 1] = {\n offset: offset,\n tag: this.getTag(adSlotConfig, adLabel)\n };\n }\n }\n\n getConfig() {\n return this.config;\n }\n}\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport device from 'utils/device';\nimport * as appnexusTagBuilder from './appnexus-tag-builder';\nimport JwAdsConfig from './appnexus-jw-config';\n\n/**\n * @param {{adSlots, params: ({member: string}|Object)}} adConfig\n * @param {Stream&Eventable} stream\n * @param {*} settings\n * @returns {*}\n */\n// move to appnexus jw\nfunction getAdsConfig(adConfig, stream, settings) {\n const adSlots = adConfig.adSlots || {};\n const params = adConfig.params || [];\n const adsConfig = new JwAdsConfig(stream);\n const { hasNext } = (settings || {});\n const startTime = stream.getPlaybackTime('begin') || 0;\n\n adsConfig.setParams(params);\n adsConfig.add(adSlots.preroll, 'pre', 'preroll');\n\n utils.each(stream.getCuePoints(), function (cuePoint) {\n if (\n cuePoint\n && cuePoint.timeline\n && cuePoint.timeline > startTime\n && !(device.isSafari() && stream.isSecure())\n ) {\n adsConfig.add(adSlots.midroll, cuePoint.timeline, 'midroll');\n }\n });\n\n // postroll is disabled when playnext is available\n if (hasNext === false || (hasNext !== true && stream.get('hasNext') === false)) {\n adsConfig.add(adSlots.postroll, 'post', 'postroll');\n }\n\n return adsConfig.getConfig();\n}\n\n/**\n * @param {Params} params\n * @param {string} memberId\n * @returns {Params & { member: string }}\n * @template Params\n */\nfunction getParams(params, memberId) {\n if (memberId) {\n return { member: memberId, ...params };\n }\n\n return params;\n}\n\n/**\n * @param {*} adPlacements\n * @param {*} globalParams\n */\nfunction parseAdPlacements(adPlacements, globalParams) {\n const placements = {};\n\n utils.each(adPlacements, function (values, placementId) {\n placements[placementId] = appnexusTagBuilder.getAstConfig(values, globalParams);\n });\n\n return placements;\n}\n\n/**\n * @param {*} clientConfig\n * @param {Stream} stream\n * @param {*} settings\n * @returns {*}\n */\nfunction getJwAdSchedule(clientConfig, stream, settings) {\n const { adSlots } = clientConfig;\n\n if (adSlots) {\n return getAdsConfig({\n adSlots: adSlots.schedule,\n params: getParams(adSlots.params, clientConfig.member)\n }, stream, settings);\n }\n\n return {};\n}\n\n/**\n * @param {*} clientConfig\n * @returns {*}\n */\nfunction getAdPlacements(clientConfig) {\n const { adPlacements } = clientConfig;\n\n if (clientConfig.member && adPlacements) {\n return parseAdPlacements(\n adPlacements.schedule,\n getParams(adPlacements.params, clientConfig.member)\n );\n }\n\n return {};\n}\n\n/**\n * @param {Stream} stream\n * @param {*} settings\n * @returns {Promise<*>}\n */\nconst getClientConfig = async (stream, settings) => {\n // ads are disabled\n // check stream config also\n const { na, adn } = settings;\n\n if (na === true || !adn || stream.hasAdsDisabled()) {\n return null;\n }\n\n let svpAdConfig = {};\n\n if (typeof adn === 'function') {\n svpAdConfig = await adn(stream, appnexusTagBuilder.getDefaultParams(stream), adn.svpPlayer);\n }\n\n logger('SVP').log('adsConfig', svpAdConfig);\n\n return svpAdConfig;\n};\n\n/**\n * Handle midroll scheduling in player\n *\n * @param {string} tag\n * @param {number|'NOW'} startTime\n * @returns {{onEnter: (cb: () => void) => void, setTime: (time: number) => void, onReady: (cb: () => void) => void}}\n */\nfunction createMidroll({ tag, startTime }) {\n let hasEntered = false;\n let onEnterCallback = () => {};\n\n /**\n * @param {() => void} callback\n */\n const onEnter = (callback) => {\n onEnterCallback = callback;\n };\n\n /**\n * @param {() => void} callback\n */\n const onReady = (callback) => {\n if (tag) {\n callback();\n }\n };\n\n /**\n * @param {number} time\n */\n const setTime = (time) => {\n if (hasEntered === false && (time >= startTime || startTime === 'NOW')) {\n onEnterCallback(tag);\n hasEntered = true;\n }\n };\n\n return {\n setTime,\n onEnter,\n onReady\n };\n}\n\n/**\n * @typedef AppnexusConfig\n * @property {*} adSchedule\n * @property {*} adPlacements\n * @property {*} adOptions\n */\n\n/**\n * @param {Stream} stream\n * @param {*} settings\n * @returns {Promise}\n */\nfunction getConfig(stream, settings) {\n return getClientConfig(stream, settings).then(function (clientConfig) {\n // null equals to empty ads\n if (clientConfig === null) {\n return {};\n }\n\n return {\n adSchedule: getJwAdSchedule(clientConfig, stream, settings),\n adPlacements: getAdPlacements(clientConfig),\n adOptions: clientConfig.options || {}\n };\n });\n}\n\n/**\n * @param {number} maxDuration\n * @param {Stream} stream\n * @param {Object} settings\n * @returns {Promise}\n */\nfunction getLiveMidrollTag(maxDuration, stream, settings) {\n return getClientConfig(stream, settings).then(function (clientConfig) {\n if (!clientConfig) {\n return undefined;\n }\n\n const { adSlots } = clientConfig;\n const midroll = adSlots && adSlots.schedule && adSlots.schedule.midroll;\n if (!midroll) {\n return undefined;\n }\n\n const params = getParams((adSlots || {}).params, clientConfig.member);\n params.vmaxduration = maxDuration;\n\n return appnexusTagBuilder.getVmapTag(utils.merge(params, midroll));\n });\n}\n\nexport default {\n getConfig,\n getLiveMidrollTag,\n createMidroll\n};\n","import utils from 'utils/utils';\nimport appnexus from 'player/playback/ads/appnexus';\n\n/**\n * @param {string} streamUrl\n * @param {Stream} stream\n * @param {*} options\n * @param {*} settings\n * @returns {(config: Config) => Config}\n * @template Config\n */\nfunction getPlaylist(streamUrl, stream, options, settings) {\n const {\n locale, poster, title, description, minDvrWindow\n } = options;\n\n /**\n * @param {PlaylistItem} playlistItem\n * @returns {PlaylistItem}\n */\n function addPlaylistMetadata(playlistItem) {\n const mediaId = stream.getExternalId();\n const startTime = stream.getPlaybackTime('begin');\n\n // set media id only if it exists\n if (mediaId) {\n playlistItem.mediaid = mediaId;\n }\n\n // add title\n if (title) {\n playlistItem.title = title;\n }\n\n if (description) {\n playlistItem.description = description;\n }\n\n // seek stream if play ahead time is set\n if (startTime) {\n playlistItem.starttime = startTime;\n }\n\n if (minDvrWindow) {\n playlistItem.minDvrWindow = minDvrWindow;\n }\n return playlistItem;\n }\n\n /**\n * @param {PlaylistItem} playlistItem\n * @returns {PlaylistItem}\n */\n function addSnapshots(playlistItem) {\n if (stream.hasSnapshots()) {\n // add snapshots for each stream\n playlistItem.tracks.push({\n file: stream.getSnapshots(),\n kind: 'thumbnails'\n });\n }\n\n return playlistItem;\n }\n\n /**\n * @param {PlaylistItem} playlistItem\n * @returns {PlaylistItem}\n */\n function addCaptions(playlistItem) {\n if (stream.getCaptions().length > 0 && !stream.hasSubtitlesInHls()) {\n utils.each(stream.getCaptions(), function (caption) {\n playlistItem.tracks.push({\n file: caption.url,\n label: locale.translate(caption.language),\n kind: 'captions',\n default: caption.default === true\n });\n });\n }\n\n return playlistItem;\n }\n\n /**\n * @param {*} adConfig\n * @param {PlaylistItem} playlistItem\n * @returns {PlaylistItem & { adPlacements?: *, adschedule?: * }}\n */\n function addAppnexusAds(adConfig, playlistItem) {\n const { adSchedule, adPlacements } = (adConfig || {});\n\n // check if there are ads\n if (adSchedule && Object.keys(adSchedule).length > 0) {\n utils.extend(playlistItem, {\n adschedule: adSchedule\n });\n }\n\n // check if there are ads\n if (adPlacements) {\n playlistItem.adPlacements = adPlacements;\n }\n\n return playlistItem;\n }\n\n return function (config) {\n const type = stream.isAudio() && stream.hasMp4Streams() ? 'mp4' : 'hls';\n return Promise.resolve({\n id: stream.getId(),\n image: poster,\n sources: [{\n file: type === 'mp4' ? stream.getUrl(type) : streamUrl,\n // force stream type for mock stream which contains mp4 blob\n type: stream.isMock() ? 'video/mp4' : type,\n default: true,\n preload: type === 'mp4' ? 'none' : 'auto'\n }],\n mediaType: stream.get('mediaType'),\n tracks: []\n })\n .then(addPlaylistMetadata)\n .then(addCaptions)\n .then(addSnapshots)\n .then(function (playlistItem) {\n return appnexus.getConfig(stream, settings).then(function (adConfig) {\n const adOptions = adConfig.adOptions || {};\n\n config.advertising = utils.extend({\n client: 'vast'\n }, locale.translate('ads', true));\n\n if (typeof adOptions.autoplayMuted !== 'undefined') {\n config.advertising.autoplayadsmuted = adOptions.autoplayMuted;\n }\n\n if (adOptions.vpaidcontrols === true) {\n config.advertising.vpaidcontrols = true;\n }\n\n if (adOptions.preloadAds === true) {\n config.advertising.preloadAds = true;\n }\n\n // do not add any ads to playlist when it is in preload mode\n if (stream.isMock() && stream.getVendor() !== 'appnexus') {\n return playlistItem;\n }\n\n // add svp vmap schedule for podcasts\n if (stream.isPodcast() && !stream.hasAdsDisabled() && !settings.na) {\n return utils.extend(playlistItem, {\n adschedule: stream.getVmapApiUrl()\n });\n }\n\n return addAppnexusAds(adConfig, playlistItem);\n });\n })\n .then(function (playlistItem) {\n if (!config.playlist) {\n config.playlist = [];\n }\n config.playlist.push(playlistItem);\n\n playlistItem.svp = {\n stream: stream,\n settings: settings\n };\n\n return config;\n });\n };\n}\n\nexport default getPlaylist;\n","import configuration from 'player/config';\nimport locale from 'player/model/locale';\n/**\n * Create sharing config based on passed options\n *\n * @param {*} options\n * @param {Stream} stream\n * @param {*} globals\n * @return {config.sharing|null}\n */\nconst getConfig = ({\n options, stream, globals = {\n sharing: configuration.sharing,\n title: locale.translate('Sharing')\n }\n}) => {\n if (options === false) {\n return null;\n }\n\n const defaults = globals.sharing || {};\n const vendor = stream.getVendor();\n\n const sharing = Object.assign({}, defaults.global);\n\n // use provider specific sharing info\n if (defaults[vendor]) {\n Object.assign(sharing, defaults[vendor]);\n }\n\n // extend sharing options when object is provided as param for it\n if (typeof options === 'object') {\n Object.assign(sharing, options);\n } else if (typeof options === 'function') {\n Object.assign(sharing, options(stream.attributes));\n }\n\n // add uri encoding to prevent sharing problems\n if (sharing.code) {\n sharing.code = encodeURIComponent(sharing.code);\n }\n\n if (!sharing.heading) {\n sharing.heading = globals.title;\n }\n\n return sharing;\n};\n\n/**\n * JW configuration adapter\n *\n * @param args\n * @return {function(config: Config): Config}\n * @template Config\n */\nconst addSharing = (...args) => function (config) {\n const sharing = getConfig(...args);\n\n if (sharing === null) {\n delete config.sharing;\n } else {\n config.sharing = sharing;\n }\n\n return config;\n};\n\nexport {\n getConfig,\n addSharing\n};\n","/**\n * Check if preroll is scheduled in configuration\n *\n * @param {*} config\n * @returns {boolean}\n */\nconst hasPreroll = (config) => {\n const playlistItem = config && config.playlist[0];\n\n // check if preroll exists in array\n if (playlistItem.adschedule) {\n return Object.values(playlistItem.adschedule)\n .some((slot) => slot.offset === 'pre');\n }\n\n return false;\n};\n\n/**\n * @param {Stream} stream\n * @param {*} options\n */\nexport default function (stream, options) {\n // additional config options required for playback\n return function (config) {\n let canAutostart = options.autoplay;\n\n // stream is not available yet, display countdown\n if (!stream.hasPlayableSource()) {\n // disable autoplay if stream is not available\n config.preload = 'none';\n config.autostart = false;\n }\n\n // force sound mute when configuration is set\n if (options.mute === true) {\n config.mute = true;\n }\n\n // load skin if available\n if (options.skin) {\n config.skin = options.skin;\n }\n\n // fix jw bug\n // by default you can't play muted ads\n if (hasPreroll(config) && config.advertising.autoplayadsmuted !== true) {\n try {\n if (config.mute === true || localStorage.getItem('jwplayer.mute') === 'true') {\n canAutostart = false;\n // unmute player when autostart is not available\n config.mute = false;\n }\n } catch (error) {\n // for private browsing\n }\n }\n\n // disable autostart for future streams\n if (stream.isFuture()) {\n canAutostart = false;\n }\n\n if (typeof canAutostart !== 'undefined') {\n config.autostart = canAutostart;\n }\n\n // set autopause to viewable\n if (options.autopause === 'viewable') {\n config.autoPause = {\n viewability: true,\n pauseAds: true\n };\n }\n\n // set repeat mode\n if (options.repeat === true) {\n config.repeat = options.repeat;\n }\n\n return config;\n };\n}\n","export const fallbackChromecastApp = 'A753C1FE';\nexport const chromecastApps = {\n CB3CFFEE: ['ab'],\n '96E78488': ['svd'],\n C6559D78: ['ridenws'],\n E43A13ED: ['brandstudio'],\n '8AE3CE4D': ['riks'],\n '9E7A477E': ['100sport'],\n '35E82475': ['sa'],\n B6C9EA8E: ['bt'],\n E64998E3: ['ap'],\n '615D672F': ['schibsted'],\n A7738716: ['tvnu'],\n A5965089: ['vgtv', 'vgtvexternal', 'vgtvs'],\n '06A55D09': [\n 'fvn',\n 'adressa',\n 'altaposten',\n 'folkebladet',\n 'harstad',\n 'itromso',\n 'rbnett',\n 'tronderavisa',\n 'adressabrandstudio',\n 'smp',\n 'steinkjer',\n 'avisast',\n 'bladet',\n 'banett',\n 'innherred',\n 'fosnafolket',\n 'opp',\n 'tronderbladet',\n 'stjordalsnytt',\n 'mn24',\n 'hitrafroya',\n 'framtidinord',\n 'vaganavisa',\n 'vol',\n 'nyttiuka',\n 'vikebladet',\n 'fjt',\n 'vestlandsnytt',\n 'fjuken',\n 'vigga',\n 'dolen',\n 'fjordabladet',\n 'morenytt',\n 'fjordingen',\n 'driva',\n 'andalsnes',\n 'nyss',\n 'agderposten',\n 'lindesnes',\n 'farsund',\n 'varden',\n 'lp',\n 'venneslatidende',\n 'gat',\n 'bomlonytt',\n 'sunnhordland'\n ]\n};\n","/**\n * @param {HTMLElement} parent\n * @param {string | HTMLElement | Object} child\n * @returns {HTMLElement}\n */\nexport function appendChild(parent, child) {\n if (Array.isArray(child)) {\n child.forEach((c) => appendChild(parent, c));\n } else if (typeof child === 'string') {\n parent.appendChild(document.createTextNode(child));\n } else if (child instanceof HTMLElement) {\n parent.appendChild(child);\n } else {\n throw new Error('Invalid child type');\n }\n\n return parent;\n}\n\n/**\n * @param {string} tagName\n * @param {Object} attributes\n * @param {string | HTMLElement | Object | (string | HTMLElement | Object)[]} children\n * @returns {HTMLElement}\n */\nexport function createElement(tagName, attributes = {}, children = []) {\n const element = document.createElement(tagName);\n Object.keys(attributes).forEach((attribute) => {\n element.setAttribute(attribute, attributes[attribute]);\n });\n appendChild(element, children);\n\n return element;\n}\n","import {\n buffering, pause, play, replay, progress\n} from 'icons';\nimport { createElement } from 'player/plugins/anti-adblock/dom';\nimport locale from 'player/model/locale';\nimport logger from 'utils/logger';\n\nconst TTS_SKIN_CLASS_NAME = 'jw-skin-svp-tts';\n\n/**\n * Extends JW Player config with a particular height and no controls\n * @param {Object} jwConfig\n * @param {Stream} stream\n * @param {Config} config - playback config\n */\nexport function applyTtsOption(jwConfig, stream, config) {\n if (!config.shouldApplyTextToSpeechSkin(stream)) {\n return jwConfig;\n }\n\n // extend config with no controls and height for text to speech\n const { height = '32' } = config.getRaw();\n config.set('height', height);\n return {\n ...jwConfig,\n controls: false,\n height\n };\n}\n\n/**\n * @param {...string} names - class names without text-to-speech skin prefixes\n */\nfunction classNames(...names) {\n return names.map((name) => `svp-tts-${name}`).join(' ');\n}\n\n/**\n *\n * @param {HTMLDivElement} container\n * @param {Object} translate\n */\nfunction createControls(container, translate) {\n const bufferingIcon = createElement('div', { class: classNames('icon', 'buffering-icon') });\n const pauseIcon = createElement('div', { class: classNames('icon', 'pause-icon') });\n const playIcon = createElement('div', { class: classNames('icon', 'play-icon') });\n const replayIcon = createElement('div', { class: classNames('icon', 'replay-icon') });\n const slider = createElement('div', { class: classNames('slider') });\n bufferingIcon.innerHTML = buffering;\n pauseIcon.innerHTML = pause;\n playIcon.innerHTML = play;\n replayIcon.innerHTML = replay;\n slider.innerHTML = progress;\n\n const progressBar = slider.querySelector('.progress');\n const durationText = createElement('span', { class: classNames('duration') });\n const remainingText = createElement('span', { class: classNames('remaining') });\n const playbackText = createElement('span', { class: classNames('playback') });\n\n const idleText = createElement('div', { class: classNames('text', 'idle-text') }, [\n createElement('strong', {}, [translate.play]),\n ' ',\n '•',\n ' ',\n durationText\n ]);\n\n const pauseText = createElement('div', { class: classNames('text', 'pause-text') }, [\n createElement('strong', {}, [translate.continue]),\n ' ',\n '•',\n ' ',\n remainingText,\n ' ',\n translate.remaining\n ]);\n\n const playingText = createElement('div', { class: classNames('text', 'playing-text') }, [\n createElement('strong', {}, [translate.playing]),\n ' ',\n '•',\n ' ',\n playbackText\n ]);\n\n const controls = createElement('div', { class: classNames('controls') }, [\n createElement('div', { class: classNames('control-elements') }, [\n slider,\n bufferingIcon,\n pauseIcon,\n playIcon,\n replayIcon\n ]),\n createElement('div', { class: classNames('details') }, [\n idleText,\n pauseText,\n playingText\n ])\n ]);\n\n container.querySelector('.jw-wrapper').appendChild(controls);\n\n return {\n pauseIcon,\n playIcon,\n replayIcon,\n progressBar,\n idleText,\n pauseText,\n playingText,\n durationText,\n remainingText,\n playbackText\n };\n}\n\n/**\n * @param {number} n\n * @param {string} singular\n * @param {string} plural\n */\nfunction pluralize(n, singular, plural) {\n return n === 1 ? singular : plural;\n}\n\n/**\n * @param {number} duration\n * @param {Object} translate\n */\nfunction timeToText(duration, translate) {\n const minutes = Math.floor(duration / 60);\n if (minutes) {\n return `${minutes} ${pluralize(minutes, translate.minute, translate.minutes)}`;\n }\n\n const seconds = Math.floor(duration - minutes * 60);\n return `${seconds} ${pluralize(seconds, translate.second, translate.seconds)}`;\n}\n\n/**\n * @param {number} duration - duration in seconds\n */\nfunction formatTime(duration) {\n const minutes = Math.floor(duration / 60);\n const seconds = Math.floor(duration - minutes * 60);\n return [minutes, seconds].map((val) => val.toString().padStart(2, '0')).join(':');\n}\n\n/**\n * Resolves whether the player needs a text-to-speech skin or not and replaces UI elements\n * @param {PlayerModel} svpPlayer\n */\nexport function ttsSkinResolver(svpPlayer) {\n const useTextSpeechSkin = svpPlayer.config.shouldApplyTextToSpeechSkin();\n logger('TTS').log(useTextSpeechSkin ? 'on' : 'off');\n\n if (!useTextSpeechSkin) {\n return;\n }\n\n const translate = locale.translate('tts');\n let elements;\n let radius;\n\n const updateSliderOffset = (time, duration) => {\n const arcLength = Math.PI * (radius * 2);\n const progressValue = (time * 100) / duration;\n const value = Math.max(Math.min(progressValue, 100), 0);\n\n elements.progressBar.style.strokeDashoffset = ((100 - value) / 100) * arcLength;\n };\n\n const updateDetailTexts = (time, duration) => {\n if (!elements.durationText.textContent.length) {\n elements.durationText.textContent = timeToText(duration, translate);\n }\n\n elements.playbackText.textContent = `${formatTime(time)} / ${formatTime(duration)}`;\n elements.remainingText.textContent = `${timeToText(duration - time, translate)}`;\n };\n\n svpPlayer.on('playlistItem', async () => {\n const container = svpPlayer.getContainer();\n container.classList.add(TTS_SKIN_CLASS_NAME);\n\n if (!elements) {\n elements = createControls(container, translate);\n\n elements.pauseIcon.onclick = () => {\n svpPlayer.pause();\n };\n elements.playIcon.onclick = () => {\n svpPlayer.play();\n };\n elements.replayIcon.onclick = () => {\n svpPlayer.seek(0);\n };\n }\n\n radius = elements.progressBar.getAttribute('r');\n\n const time = svpPlayer.getCurrentTime();\n const duration = svpPlayer.getStream().getDuration();\n updateDetailTexts(time, duration);\n });\n\n svpPlayer.on('time', (time, duration) => {\n updateSliderOffset(time, duration);\n updateDetailTexts(time, duration);\n });\n\n svpPlayer.on('complete', () => {\n const duration = svpPlayer.getStream().getDuration();\n updateSliderOffset(0, duration);\n });\n}\n","import config from 'player/config';\nimport moduleLoader from 'utils/module-loader';\n\nlet request = null;\n\nconst youboraSdk = {\n state: 'UNLOADED',\n options: {},\n forceLoad: false,\n\n load(options = {}, forceLoad = false) {\n this.options = options;\n this.forceLoad = forceLoad;\n if (request === null) {\n this.state = 'LOADING';\n\n request = moduleLoader(config.cdn.youbora);\n request.then((youbora = window.youbora) => {\n this.state = 'READY';\n window.youbora = youbora;\n });\n }\n\n return request;\n },\n\n /**\n * @param {JWPlayer} player\n * @param {*} options\n */\n initialize(player, options = {}) {\n // skip when library is not loaded\n if (this.state !== 'READY' || this.state === 'LOADED') {\n return;\n }\n\n const { youbora } = window;\n\n // skip if youbora sdk does not exist\n if (!youbora) {\n return;\n }\n\n try {\n const plugin = new youbora.Plugin({\n ...options,\n ...this.options\n });\n\n plugin.setAdapter(new youbora.adapters.JWPlayer(player));\n\n this.state = 'LOADED';\n } catch (e) {\n console.error('Could not load youbora plugin', e);\n }\n }\n};\n\nexport default youboraSdk;\n","import _ from 'utils/underscore';\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport image from 'utils/image';\nimport { objectToString } from 'utils/string';\nimport ServerTime from 'utils/server-time';\n\nimport config from 'player/config';\nimport Domain from 'player/model/domain';\nimport Token from 'player/model/token';\nimport Asset from 'player/model/asset';\nimport Stream from 'player/model/stream';\n\nimport locale from 'player/model/locale';\n\nimport appnexus from './ads/appnexus';\nimport addPlaylistFactory from './config/playlist';\nimport { addSharing } from './config/sharing';\nimport setPlaybackOptions from './config/playback';\nimport addYoubora from './config/jw-youbora';\nimport setKey from './config/keys';\nimport setCaptions from './config/captions';\nimport { chromecastApps, fallbackChromecastApp } from './config/chromecast';\nimport { applyTtsOption } from './skin/tts-skin';\n\nimport * as STATUS_CODES from './config/status-codes';\nimport youbora from './youbora';\n\n/**\n * Config instance for player\n * Contains SVP Player options\n * Parses config\n *\n * @constructor\n */\nconst Config = function () {\n this.attributes = {\n // DOM node\n node: null,\n // API vendor\n vendor: null,\n // player environment\n env: 'production',\n // stream object (extracted from asset)\n stream: null,\n // if not provided width will be read from node element\n width: '100%',\n // if not provided height will be read from node element\n height: '100%',\n // start playing from chapter time\n chapter: null,\n // start stream automatically on capable devices (does not work on iPhone and iPad, Android)\n autoplay: false,\n // player poster (image), mixed string (http src)|true|false\n poster: true,\n // display title on poster or change to provided string (default false)\n title: null,\n // play ahead time, format XXhYYmZZs, for example: 02h09m10s\n time: null,\n // repeat mode\n repeat: false,\n // minimum dvr window\n minDvrWindow: null,\n // url to css file with skin\n skin: config.skins.default,\n // right click defualt text and link\n about: {\n text: 'Stream',\n link: ''\n },\n /**\n * Token function for secured streams\n * @type {Token|null}\n */\n token: null,\n // disable default countdown plugin\n disableCountdownPlugin: false\n };\n\n /**\n * JW Player Config\n */\n this.jwDefaults = {\n base: config.cdn.player,\n key: config.player.keys.default,\n preload: 'auto',\n horizontalVolumeSlider: true\n };\n\n this.token = null;\n};\n\nConfig.prototype = {\n /**\n * Calculates bitrate value based on given limit\n *\n * maxBitrate is increased by 15% due to VBR encoding\n * @returns {number}\n */\n getMaxBitrate() {\n return this.get('maxBitrate') * 1.15;\n },\n\n /**\n * @param {Stream} stream\n */\n setStream(stream) {\n this.stream = stream;\n\n this.token = new Token(stream.get('id'), stream.get('access'), this.getMaxBitrate());\n },\n\n /**\n * Get config passed to SVP Player constructor\n * @returns {*|{}}\n */\n getRaw() {\n return _.clone(this.rawOptions) || {};\n },\n\n /**\n * @returns {boolean}\n */\n isPreviewMode() {\n const settings = this.getSettings();\n return settings.preview || false;\n },\n\n /**\n * Dump Javascript config to a string\n * @returns {string}\n */\n dump() {\n return objectToString(this.getRaw());\n },\n\n /**\n * TODO add tests\n *\n * @param {Stream} stream\n * @param {HTMLElement} playerContainer\n * @returns {string|null}\n */\n getPoster(stream, playerContainer) {\n // disable poster in TTS mode\n if (this.shouldApplyTextToSpeechSkin(stream)) {\n return null;\n }\n\n const container = playerContainer || document.getElementById(this.get('node'));\n\n const width = this.get('width');\n const height = this.get('height');\n\n if (utils.isString(this.get('poster'))) {\n return this.get('poster');\n }\n\n if (container && stream) {\n return image.getImageSrc(\n stream.getPoster(),\n 'poster',\n // use width and height if it's set as a number\n utils.isNumber(width) ? width : container.clientWidth,\n utils.isNumber(height) ? height : container.clientHeight\n );\n }\n\n return null;\n },\n\n /**\n * @param {Stream} [stream]\n * @returns {boolean}\n */\n shouldApplyTextToSpeechSkin(stream) {\n const ttsSkinOption = this.get('ttsSkin');\n if (typeof ttsSkinOption === 'boolean') {\n return ttsSkinOption;\n }\n\n const currentStream = stream || this.stream;\n return Boolean(currentStream) && currentStream.hasTextSpeech();\n },\n\n /**\n * @returns {string|undefined}\n */\n getVideoPreviewMetadataKey() {\n const { videoPreview } = this.getRaw();\n const isCustomMetadataKey = typeof videoPreview === 'string';\n\n if (!(videoPreview === true || isCustomMetadataKey)) {\n return undefined;\n }\n\n if (isCustomMetadataKey) {\n return videoPreview;\n }\n\n if (this.stream.isLive()) {\n return config.liveVideoPreview;\n }\n\n return config.videoPreview[this.get('vendor')] || config.videoPreview.default;\n },\n\n /**\n * @param {Stream} stream\n * @param {HTMLElement} [playerContainer]\n * @returns {HTMLElement|undefined}\n */\n getVideoPreviewUrl(stream, playerContainer) {\n const container = playerContainer || document.getElementById(this.get('node'));\n if (!container || !stream || stream.isAudio()) {\n return undefined;\n }\n\n const metadataKey = this.getVideoPreviewMetadataKey(stream);\n return metadataKey ? stream.getVideoPreviewUrl(metadataKey) : undefined;\n },\n\n /**\n * @param {Stream} stream\n * @returns {string}\n */\n getTitle(stream) {\n const title = this.get('title');\n const isAudioWithoutCustomTitle = stream.isAudio() && !utils.isString(title);\n\n if (title === true || isAudioWithoutCustomTitle) {\n return stream.get('title');\n }\n\n return title;\n },\n\n /**\n * @param {Stream} stream\n * @returns {string|undefined}\n */\n getDescription(stream) {\n if (stream.isAudio()) {\n return stream.getCategory().get('title');\n }\n\n return undefined;\n },\n\n /**\n * @param {Stream} stream\n * @returns {number|undefined}\n */\n getLiveSyncDuration(stream) {\n const chunkDuration = stream.getChunkDuration();\n if (chunkDuration) {\n // https://github.com/video-dev/hls.js/blob/master/docs/API.md#livesyncduration\n return chunkDuration * 2 + 1;\n }\n return undefined;\n },\n\n /**\n * Retrieve token required for secure streams\n * Token expiry has to match API\n *\n * @returns {Promise}\n */\n getToken() {\n if (this.stream.isSecure()) {\n return this.token.fetch(this.get('token'));\n }\n\n return Promise.resolve(null);\n },\n\n /**\n * Token is required only for secure streams so for all other types it's valid\n *\n * @returns {boolean}\n */\n hasValidToken() {\n return !this.stream.isSecure() || this.token.isValid();\n },\n\n getStreamUrl(type) {\n // stream not set yet\n if (!this.stream) {\n // eslint-disable-next-line no-console\n console.error('SVP SDK: getStreamUrl() called before stream set');\n return null;\n }\n\n return this.getToken().then((token) => {\n const streamUrl = this.stream.getUrl(type);\n const maxBitrate = this.getMaxBitrate();\n const params = [];\n\n if (type === 'hls' && token) {\n params.push(`hdnea=${encodeURIComponent(token)}`);\n }\n\n if (maxBitrate) {\n params.push(`b=0-${maxBitrate}`);\n }\n\n return streamUrl + ((params.length > 0) ? `?${params.join('&')}` : '');\n });\n },\n\n /**\n * Check if user is eligible to play stream in his geolocation\n *\n * @returns {Promise}\n */\n isStreamPlayable() {\n const { stream } = this;\n const settings = this.getSettings();\n\n return new Promise((resolve, reject) => {\n if (settings.preview === true) {\n resolve(STATUS_CODES.ACTIVE_PREVIEW);\n } else if (!ServerTime.fetched) {\n reject(STATUS_CODES.NETWORK_ERROR);\n } else if (stream.isActive()) {\n if (stream.isGeoblocked() && !stream.isFuture()) {\n this.getStreamUrl('hls').then((streamUrl) => {\n // fetch manifest to check user access\n utils.ajax(streamUrl, resolve, function (...args) {\n const response = args[2] || {};\n\n if (response.status === 403) {\n return reject(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED);\n }\n if (response.status === 401) {\n return reject(STATUS_CODES.NOT_ACTIVE_TOKEN);\n }\n\n return reject(STATUS_CODES.NETWORK_ERROR);\n }, true);\n }).catch(reject);\n } else {\n resolve(STATUS_CODES.ACTIVE);\n }\n } else if (stream.isPast()) {\n reject(STATUS_CODES.NOT_ACTIVE_PAST);\n } else {\n reject(STATUS_CODES.NOT_ACTIVE);\n }\n });\n },\n\n /**\n * @param {Stream} stream\n * @returns {Stream[]}\n */\n getPlaylistItems(stream) {\n if (!stream) {\n return [];\n }\n const vendor = this.get('vendor');\n const playlistStreams = stream.get('playlist')\n .map((data) => {\n const asset = new Asset(data);\n asset.set('vendor', vendor);\n return asset;\n })\n .map((asset) => new Stream(asset.attributes));\n return [stream].concat(playlistStreams);\n },\n\n getChromecastAppId() {\n const vendorEntry = Object.entries(chromecastApps).find((entry) => entry[1].includes(this.stream.getVendor()));\n return (vendorEntry && vendorEntry[0]) || fallbackChromecastApp;\n },\n\n getJwConfig(stream) {\n const settings = this.getSettings();\n\n return Promise\n .resolve({\n width: this.get('width'),\n height: this.get('height'),\n abouttext: this.get('about').text,\n aboutlink: this.get('about').link,\n sharing: utils.extend({}, config.sharing.global),\n localization: locale.translate('player', true),\n plugins: {},\n cast: {\n customAppId: this.getChromecastAppId()\n },\n playlist: [],\n ...(this.getLiveSyncDuration(stream) ? { liveSyncDuration: this.getLiveSyncDuration(stream) } : {})\n })\n .then((jwConfig) => {\n const playlistItems = this.getPlaylistItems(stream);\n const addPlaylistItemsPromise = playlistItems.reduce((promise, currentStream) => {\n const streamUrlPromise = promise.then(() => {\n // change to the current stream object to prepare a valid stream url\n this.setStream(currentStream);\n return this.getStreamUrl('hls');\n });\n\n return streamUrlPromise.then((streamUrl) => {\n const playlistSettings = this.getPlaylistSettings();\n const playlistOptions = {\n poster: this.getPoster(currentStream),\n preview: this.getVideoPreviewUrl(currentStream),\n title: this.getTitle(currentStream),\n description: this.getDescription(currentStream),\n locale: locale,\n minDvrWindow: this.get('minDvrWindow')\n };\n\n const applyPlaylistAdding = addPlaylistFactory(\n streamUrl,\n currentStream,\n playlistOptions,\n playlistSettings\n );\n\n return applyPlaylistAdding(jwConfig);\n });\n }, Promise.resolve());\n\n return addPlaylistItemsPromise.then(() => {\n // revert to the origin stream object\n this.setStream(stream);\n return jwConfig;\n });\n })\n .then(addSharing({\n options: this.get('sharing'),\n stream\n }))\n .then((jwConfig) => applyTtsOption(jwConfig, stream, this))\n .then(setCaptions(this.get('captions')))\n // setPlaybackOptions has to be invoked in the closure to inject the current values of mute, skin, etc.\n // otherwise it will get values when getJwConfig was called\n .then((jwConfig) => setPlaybackOptions(stream, {\n mute: this.get('mute'),\n skin: this.get('skin'),\n autoplay: this.get('autoplay'),\n autopause: this.get('autopause'),\n repeat: this.get('repeat')\n })(jwConfig))\n .then(addYoubora(\n stream,\n youbora.state === 'READY'\n ))\n .then(setKey(this.get('vendor')))\n .then((jwConfig) => utils.merge(utils.extend({}, this.jwDefaults, jwConfig), settings.jw || {}));\n },\n\n /**\n * Check if recommended is available\n */\n hasRecommended() {\n // recommended truned on and repeat truned off\n return this.get('recommended') !== false && this.get('repeat') === false;\n },\n\n getRecommended() {\n return this.get('recommended');\n },\n\n getAgeLimit() {\n return this.get('ageLimit');\n },\n\n hasNext() {\n if (!this.hasRecommended()) {\n return false;\n }\n\n if (this.getRecommended() && (this.getRecommended().next === false\n || typeof this.getRecommended().next === 'undefined')) {\n return false;\n }\n\n return true;\n },\n\n getPlaylistSettings() {\n return utils.extend({\n adn: this.get('adn'),\n hasNext: this.hasNext()\n }, this.getSettings());\n },\n\n getLiveMidrollTag(time) {\n return appnexus.getLiveMidrollTag(\n time,\n this.stream,\n this.getPlaylistSettings()\n );\n },\n\n parse(options) {\n const asset = (options.asset || options.id);\n const about = config.about[options.vendor];\n const skin = utils.extend({}, (config.skins[options.vendor] || config.skins.default));\n\n // set default skin for player if nothing is provided\n if (typeof options.skin === 'object') {\n if (options.skin.name) {\n skin.name += ` ${options.skin.name}`;\n }\n\n if (options.skin.url) {\n skin.url = options.skin.url;\n }\n } else {\n // remove if not valid\n delete options.skin;\n }\n\n options.skin = skin;\n\n // override about link/text\n if (!options.about && about) {\n options.about = about;\n }\n\n // delete asset\n if (asset) {\n delete options.asset;\n }\n\n // check if user passed chapter or time\n if (utils.isString(options.chapter) && options.chapter.match(/^\\d+$/)) {\n options.chapter = parseInt(options.chapter, 10);\n }\n\n // legacy support\n if (options.time) {\n options.time = utils.time.shareTimeToSeconds(options.time);\n }\n\n if (options.settings) {\n delete options.settings;\n }\n\n return options;\n }\n};\n\n// Immutable method for restricted settings like preview or na\nObject.defineProperty(Config.prototype, 'initialize', {\n value(options) {\n const { vendor } = options;\n const rawOptions = utils.extend({}, options);\n\n this.rawOptions = rawOptions;\n\n Domain.getPermissions(vendor).then((permissions) => {\n const settings = {};\n\n if (permissions.whitelist === true && options.settings) {\n utils.extend(settings, options.settings);\n } else if (permissions.whitelist === false && options.settings && options.settings.jw) {\n settings.jw = {};\n utils.extend(settings.jw, options.settings.jw);\n }\n\n if (permissions.preview === false) {\n delete settings.preview;\n }\n\n // turn off ads for certain provider\n if (config.ads[vendor] === false) {\n settings.na = true;\n }\n\n Object.defineProperty(this, 'settings', {\n value: Object.freeze(settings),\n writable: false\n });\n\n utils.extend(this.attributes, this.parse(options));\n this.trigger('ready', rawOptions, settings);\n });\n },\n writable: false\n});\n\n// Immutable method for restricted settings like preview or na\nObject.defineProperty(Config.prototype, 'getSettings', {\n value() {\n return this.settings;\n },\n writable: false\n});\n\nutils.extend(Config.prototype, Model);\n\nexport default Config;\n","export default function (options = {}) {\n // additional config options required for playback\n return function (jwConfig) {\n if (options.native === true) {\n jwConfig.renderCaptionsNatively = true;\n delete options.native;\n }\n\n if (Object.keys(options).length > 0) {\n jwConfig.captions = options;\n }\n\n return jwConfig;\n };\n}\n","/**\n * @param {Stream} stream\n * @param {boolean} isEnabled\n * @returns {(config: Config) => Config}\n * @template Config\n */\nexport default function (stream, isEnabled) {\n // additional config options required for playback\n return function (config) {\n // allow only when account config is available\n if (isEnabled) {\n if (config.playlist && config.playlist[0]) {\n const streamConfiguration = stream.get('streamConfiguration')\n && stream.get('streamConfiguration').properties;\n\n const category = stream.getCategory();\n\n config.playlist[0].youbora = {\n 'content.resource': stream.getUrl('hls'),\n 'content.isLive': stream.isLive(),\n 'content.title': stream.get('title'),\n 'content.duration': stream.getDuration(),\n 'content.cdn': 'AKAMAI',\n 'content.metadata': {\n content_id: stream.getId(),\n owner: stream.getVendor()\n },\n\n 'extraparam.1': stream.getId(),\n 'extraparam.2': stream.getVendor(),\n 'extraparam.3': streamConfiguration.join(','),\n 'extraparam.4': category && category.get('id')\n };\n }\n }\n\n return config;\n };\n}\n","import config from 'player/config';\n\n/**\n * @param {string} vendor\n * @returns {(config: JWConfig) => JWConfig}\n * @template JWConfig\n */\nexport default function (vendor) {\n // additional config options required for playback\n return function (jwConfig) {\n const { keys } = config.player;\n\n jwConfig.key = keys[vendor] || keys.default;\n\n return jwConfig;\n };\n}\n","import { assetAdditionalData, relatedApi } from '../api';\n\n/**\n * @param {string} vendor\n * @param {number} assetId\n * @param {number} [limit]\n * @returns {Promise}\n */\nasync function getRelatedAssets({ vendor, assetId, limit }) {\n const query = [`additional=${assetAdditionalData}`];\n if (limit) {\n query.push(`limit=${limit}`);\n }\n\n return relatedApi({ path: `${vendor}/${assetId}`, query: query.join('&') });\n}\n\nexport default {\n getRelatedAssets\n};\n","// eslint-disable-next-line max-len\nconst VIDEO = new Blob([new Uint8Array([0, 0, 0, 28, 102, 116, 121, 112, 105, 115, 111, 109, 0, 0, 2, 0, 105, 115, 111, 109, 105, 115, 111, 50, 109, 112, 52, 49, 0, 0, 0, 8, 102, 114, 101, 101, 0, 0, 2, 239, 109, 100, 97, 116, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 2, 194, 109, 111, 111, 118, 0, 0, 0, 108, 109, 118, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 232, 0, 0, 0, 47, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 236, 116, 114, 97, 107, 0, 0, 0, 92, 116, 107, 104, 100, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 101, 100, 116, 115, 0, 0, 0, 28, 101, 108, 115, 116, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 100, 109, 100, 105, 97, 0, 0, 0, 32, 109, 100, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 68, 0, 0, 8, 0, 85, 196, 0, 0, 0, 0, 0, 45, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 115, 111, 117, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 111, 117, 110, 100, 72, 97, 110, 100, 108, 101, 114, 0, 0, 0, 1, 15, 109, 105, 110, 102, 0, 0, 0, 16, 115, 109, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 100, 105, 110, 102, 0, 0, 0, 28, 100, 114, 101, 102, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 117, 114, 108, 32, 0, 0, 0, 1, 0, 0, 0, 211, 115, 116, 98, 108, 0, 0, 0, 103, 115, 116, 115, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 87, 109, 112, 52, 97, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 0, 172, 68, 0, 0, 0, 0, 0, 51, 101, 115, 100, 115, 0, 0, 0, 0, 3, 128, 128, 128, 34, 0, 2, 0, 4, 128, 128, 128, 20, 64, 21, 0, 0, 0, 0, 1, 244, 0, 0, 1, 243, 249, 5, 128, 128, 128, 2, 18, 16, 6, 128, 128, 128, 1, 2, 0, 0, 0, 24, 115, 116, 116, 115, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 28, 115, 116, 115, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 28, 115, 116, 115, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 115, 0, 0, 1, 116, 0, 0, 0, 20, 115, 116, 99, 111, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 44, 0, 0, 0, 98, 117, 100, 116, 97, 0, 0, 0, 90, 109, 101, 116, 97, 0, 0, 0, 0, 0, 0, 0, 33, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 109, 100, 105, 114, 97, 112, 112, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 105, 108, 115, 116, 0, 0, 0, 37, 169, 116, 111, 111, 0, 0, 0, 29, 100, 97, 116, 97, 0, 0, 0, 1, 0, 0, 0, 0, 76, 97, 118, 102, 53, 54, 46, 52, 48, 46, 49, 48, 49])], { type: 'video/mp4' });\n\n/**\n * @returns {SvpAsset}\n */\nconst getMockAsset = () => ({\n id: 1,\n status: 'active',\n streamType: 'mock',\n streamUrls: {\n hls: URL.createObjectURL(VIDEO)\n },\n\n images: {\n main: null\n },\n\n streamConfiguration: {\n properties: []\n },\n category: {}\n});\n\nexport {\n getMockAsset\n};\n","import api, { assetAdditionalData } from '../api';\nimport { getMockAsset } from './asset/mock';\n\n/**\n * @param {number} id\n * @returns {string}\n */\nconst getAssetEndpoint = (id) => `/assets/${id}?additional=${assetAdditionalData}`;\n\n/**\n * @param {string} vendor\n * @param {number} assetId\n * @returns {Promise}\n */\nconst getById = async ({ vendor, assetId }) => api(\n vendor,\n getAssetEndpoint(assetId)\n);\n\nexport default {\n getById,\n getMockAsset\n};\n","/* eslint-disable no-underscore-dangle */\n\nimport relatedService from 'player/services/api/related';\nimport assetService from 'player/services/api/asset';\nimport utils from 'utils/utils';\nimport Stream from './stream';\nimport Asset from './asset';\n\nconst createResponse = ({ nextAsset, source }) => ({\n nextAsset: nextAsset ? new Asset(nextAsset) : null,\n source\n});\n\nconst handlers = {\n /**\n * Check if given asset has next stream\n * Used for setting/disabling postrolls\n *\n * @param asset\n * @returns {boolean}\n */\n hasPlayNext(asset) {\n if (asset.get('streamType') === 'live') {\n return false;\n }\n\n if (asset.get('nextAsset').id) {\n return true;\n }\n\n return false;\n },\n\n /**\n * Fetch next asset by providing it's id\n *\n * @param {string} vendor\n * @param {number} assetId\n * @returns {Promise<{nextAsset: SvpAsset, source: 'byId'}>}\n */\n async fetchNextById({ vendor, assetId }) {\n const nextAsset = await assetService.getById({\n vendor,\n assetId\n });\n\n return createResponse({\n source: 'byId',\n nextAsset\n });\n },\n\n /**\n * @param {string} vendor\n * @param {number} assetId\n * @returns {Promise<{nextAsset: SvpAsset|undefined, source: 'related'}>}\n */\n async fetchNextFromRelatedEngine({ vendor, assetId }) {\n const assets = await relatedService.getRelatedAssets({\n vendor,\n assetId,\n limit: 1\n });\n\n return createResponse({\n nextAsset: utils.isArray(assets) && assets.length > 0 ? assets[0] : undefined,\n source: 'related'\n });\n },\n\n /**\n * Fetch next for given asset\n * Cascade lookup from direct linkage (nextAsset.id) to retrieving from category\n * Rejected when nextAsset is not found\n *\n * @param {SvpAsset} asset\n * @returns {Promise<{nextAsset: SvpAsset|undefined, source: string}>}\n */\n async getNext(asset) {\n const vendor = asset.getVendor();\n const assetId = asset.get('id');\n\n return this.fetchNextFromRelatedEngine({\n vendor,\n assetId\n });\n },\n\n /**\n * Fetch next for given asset\n * Cascade lookup from direct linkage (nextAsset.id) to retrieving from category\n * Rejected when nextAsset is not found\n *\n * @param {SvpAsset} asset\n * @returns {Promise<{nextAsset: SvpAsset, source: string}>}\n */\n async fetchNext(asset) {\n const { nextAsset, source } = await this.getNext(asset);\n\n if (!nextAsset) {\n return Promise.reject({\n reason: 'nextAssetNotFound',\n source\n });\n }\n\n const stream = new Stream(nextAsset.attributes);\n\n if (!stream.isActive()) {\n return Promise.reject({\n reason: 'nextAssetNotActive',\n source\n });\n }\n\n return {\n nextAsset,\n source\n };\n }\n};\n\nexport default handlers;\n","import relatedService from 'player/services/api/related';\nimport Asset from '../asset';\n\n/**\n * Add vendor to assets\n *\n * @param {string} vendor\n * @param {Asset[]} assets\n * @returns {(Asset & {vendor: string})[]}\n * @template Asset\n */\nconst mapResponse = (vendor, assets) => assets.map((asset) => new Asset({\n vendor,\n ...asset\n}));\n\n/**\n * @param {string} vendor\n * @param {number} assetId\n * @returns {Promise}\n */\nasync function fetchFromRelated({ vendor, assetId }) {\n const assets = await relatedService.getRelatedAssets({ vendor, assetId });\n return mapResponse(vendor, assets);\n}\n\nexport default {\n fetchFromRelated\n};\n","import nextAsset from './next-asset';\nimport recommendedList from './recommended/list';\n\nclass Recommended {\n /**\n * @param {Asset} asset\n */\n constructor({ asset }) {\n /**\n * @type {Asset}\n */\n this.asset = asset;\n }\n\n /**\n * Fetch next asset\n *\n * @returns {Promise}\n */\n getNextAsset(options = {}) {\n const { asset } = this;\n\n // next asset can be provided in player configuration\n if (options.asset) {\n return nextAsset.fetchNextById({\n // set vendor is specified or use main asset as default\n vendor: options.asset.vendor || asset.getVendor(),\n // asset can be object or number with asset id\n assetId: options.asset.id || options.asset\n });\n }\n\n return nextAsset.fetchNext(asset);\n }\n\n /**\n * Fetch recommended asset list\n *\n * @returns {*}\n */\n async getItems() {\n const vendor = this.asset.getVendor();\n const assetId = this.asset.get('id');\n\n return recommendedList.fetchFromRelated({\n vendor,\n assetId\n });\n }\n}\n\nexport default Recommended;\n","import scriptLoader from 'utils/script-loader';\n\nconst TRACKER_ID = 'svp-tracker';\n\nconst PulseTrackerLoader = {\n request: null,\n\n trackers: {},\n\n /**\n * Load pulse library only once per page\n *\n * @returns {null}\n */\n load() {\n if (!this.request) {\n if (!window.pulse) {\n // a global pulse object has to be present to avoid autoloader errors\n window.pulse = window.pulse || function() {\n window.pulse.q = window.pulse.q || [];\n window.pulse.q.push(arguments);\n };\n\n this.request = scriptLoader('//sdk.pulse.schibsted.com/pulse.min.js');\n } else {\n // pulse is already available\n this.request = Promise.resolve();\n }\n }\n\n return this.request;\n },\n\n init(provider) {\n return this.load()\n .then(() => this.getTracker(provider))\n .then((storedTracker) => {\n const PROVIDER_TRACKER_ID = `${TRACKER_ID}-${provider}`;\n\n // initialize pulse only once per page per provider\n if (!storedTracker) {\n // we need to name the tracker to avoid tracking conflicts when embedding the player\n window.pulse('init', provider, null, null, PROVIDER_TRACKER_ID);\n\n const promise = new Promise((resolve) => {\n window.pulse(PROVIDER_TRACKER_ID, (tracker) => resolve(tracker));\n });\n\n PulseTrackerLoader.trackers[provider] = promise;\n\n return promise;\n }\n\n return storedTracker;\n });\n },\n\n getTracker(provider) {\n return PulseTrackerLoader.trackers[provider] || Promise.resolve(null);\n }\n};\n\nexport default PulseTrackerLoader;\n","const PLAYER_CONTAINER_CLASS_NAME = 'svp-flag-video-preview';\nconst PREVIEW_CONTAINER_CLASS_NAME = 'jw-preview';\nconst PREVIEW_ELEMENT_CLASS_NAME = 'svp-video-preview';\n\n/**\n * @param {HTMLElement} container\n * @return {{previewContainer: HTMLDivElement, previewElement?: HTMLVideoElement}}\n */\nfunction queryVideoPreviewElements(container) {\n const previewContainer = container.querySelector(`.${PREVIEW_CONTAINER_CLASS_NAME}`);\n const previewElement = previewContainer.querySelector(`.${PREVIEW_ELEMENT_CLASS_NAME}`) || undefined;\n return { previewContainer, previewElement };\n}\n\n/**\n * @this Player\n */\nfunction removeVideoPreviewElement() {\n const container = this.getContainer();\n container.classList.remove(PLAYER_CONTAINER_CLASS_NAME);\n\n const { previewContainer, previewElement } = queryVideoPreviewElements(container);\n if (!previewElement) {\n return;\n }\n\n previewContainer.removeChild(previewElement);\n}\n\n/**\n * @param {HTMLDivElement} previewContainer\n * @return {HTMLVideoElement}\n */\nfunction createPreviewElement(previewContainer) {\n const previewElement = document.createElement('video');\n previewElement.loop = true;\n previewElement.autoplay = true;\n previewElement.muted = true;\n previewElement.classList.add(PREVIEW_ELEMENT_CLASS_NAME);\n ['autoplay', 'disableremoteplayback', 'muted', 'playsinline'].forEach((attr) => {\n previewElement.setAttribute(attr, '');\n });\n previewContainer.appendChild(previewElement);\n return previewElement;\n}\n\n/**\n * @this Player\n */\nasync function addVideoPreviewElement() {\n const stream = this.model.getStream();\n const previewUrl = this.config.getVideoPreviewUrl(stream);\n const autoplay = this.config.get('autoplay');\n if (!previewUrl || autoplay) {\n return removeVideoPreviewElement.call(this);\n }\n\n const container = this.getContainer();\n container.classList.add(PLAYER_CONTAINER_CLASS_NAME);\n\n const {\n previewContainer,\n previewElement = createPreviewElement(previewContainer)\n } = queryVideoPreviewElements(container);\n\n previewElement.src = previewUrl;\n previewElement.load();\n return previewElement.play();\n}\n\nexport default {\n addVideoPreviewElement,\n removeVideoPreviewElement\n};\n","import logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport config from 'player/config';\nimport errorIcon from 'icons/error.svg';\nimport videoPreviewHelper from 'utils/video-preview';\nimport locale from '../model/locale';\nimport statusCode, { NOT_FOUND, GENERAL_ERROR, NOT_ACTIVE } from '../playback/config/status-codes';\n\n/**\n * Clear error message\n */\nexport function clearError(node) {\n const previousErrorNode = node.getElementsByClassName('svp-player-error-wrapper');\n\n // clear old node\n if (previousErrorNode.length > 0) {\n utils.removeClass(node, ['svp-player-error', 'svp-player-error-hasImage']);\n\n if (previousErrorNode[0].parentNode) {\n previousErrorNode[0].parentNode.removeChild(previousErrorNode[0]);\n }\n }\n}\n\n/**\n * Display error message in given node\n */\nfunction displayError(node, message, code = null) {\n let template = `
${errorIcon}${message}`;\n\n if (code) {\n template += `
${locale.translate('Error code')}: ${code}
`;\n }\n\n template += '
';\n\n const posterSrc = this.model && this.model.getStream() && this.model.getPoster(this.model.getStream(), node);\n\n clearError(node);\n utils.addClass(node, 'svp-player-error');\n\n // add image\n if (posterSrc) {\n utils.addClass(node, 'svp-player-error-hasImage');\n template += `
`;\n }\n\n const errorNode = utils.createNode(`
${template}
`);\n\n node.appendChild(errorNode);\n\n this.once('complete', function () {\n utils.removeClass(node, ['svp-player-error', 'svp-player-error-hasImage']);\n\n if (errorNode.parentNode) {\n errorNode.parentNode.removeChild(errorNode);\n }\n }, this);\n}\n\n/**\n * Display error message\n */\nexport function onError(details) {\n logger('SVP').error(details);\n const node = document.getElementById(this.config.get('node'));\n const { code, message } = details || {};\n\n let translatedMessage = locale.translate(message);\n\n // translation not found\n if (translatedMessage === message) {\n translatedMessage = locale.translate(statusCode(GENERAL_ERROR));\n }\n\n // details - message in english\n // message - localized, displayed message\n const errorDetails = {\n code,\n details: message,\n message: translatedMessage\n };\n\n if (details.type) {\n errorDetails.type = details.type;\n }\n\n displayError.call(this, node, translatedMessage, code);\n\n if (this.model.player) {\n this.model.player.stop();\n }\n\n this.trigger('error', errorDetails);\n}\n\n/**\n * Asset fetch failed. Usually happens when network issue occurred\n */\nexport function onAssetError(error) {\n let code = GENERAL_ERROR;\n\n videoPreviewHelper.removeVideoPreviewElement.call(this);\n\n if (error) {\n if (error.status === 404) {\n code = NOT_FOUND;\n } else if (error.status === 401) {\n code = NOT_ACTIVE;\n }\n }\n\n const details = {\n message: statusCode(code),\n code\n };\n\n this.trigger('assetError', details);\n\n // load stylesheet as player is not attached\n onError.call(this, Object.assign({\n type: 'assetFetchError'\n }, details));\n\n logger('SVP').error('error', error);\n\n // display errors in development mode\n if (config.env === 'development') {\n throw error;\n }\n}\n","/* global apntag */\nimport config from 'player/config';\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\n\nexport default utils.extend({\n /**\n * @type {boolean|null}\n */\n isLoaded: null,\n\n /**\n * @returns {Promise}\n */\n load() {\n if (window.apntag) {\n this.isLoaded = true;\n return Promise.resolve();\n }\n if (this.isLoaded === false) {\n // after loading fail we do not retry\n return Promise.reject({\n firstLoad: false\n });\n }\n\n // load this only once\n return utils.loadScript(config.ads.appnexus.ast).then(() => {\n // check if object really exist\n this.isLoaded = typeof window.apntag === 'object';\n }).catch((error) => {\n // appnexus can be blocked by adblock\n this.isLoaded = false;\n\n return Promise.reject({\n firstLoad: true,\n error\n });\n });\n },\n\n /**\n * @param {string} tagId\n * @param {*} tagOptions\n * @returns {Promise}\n */\n defineTag(tagId, tagOptions) {\n return this.load().then(() => {\n const tagConfig = {\n targetId: tagId,\n ...tagOptions\n };\n\n apntag.debug = config.ads.appnexus.debug;\n // apntag tag overriden by reference\n apntag.defineTag(utils.extend({}, tagConfig));\n\n apntag.loadTags([tagId]);\n apntag.onEvent('adLoaded', tagId, this.trigger.bind(this, 'adLoaded', tagId));\n }).catch((error) => {\n if (error.firstLoad) {\n logger('SVP').log('Could not load AST tag');\n }\n });\n },\n\n /**\n * @param {string} tagId\n */\n showTag(tagId) {\n if (this.isLoaded) {\n apntag.showTag(tagId);\n }\n },\n\n /**\n * @param {string} tagId\n */\n refreshTag(tagId) {\n if (this.isLoaded) {\n apntag.refresh([tagId]);\n }\n },\n\n /**\n * @param {string} tagId\n * @param {(string|number)[]} dimmensions\n */\n resizeTag(tagId, dimmensions) {\n const size = [\n parseInt(dimmensions[0], 10),\n parseInt(dimmensions[1], 10)\n ];\n\n if (this.isLoaded) {\n apntag.resizeAd(tagId, size);\n }\n },\n\n /**\n * @param {string} targetId\n */\n off(targetId) {\n if (this.isLoaded) {\n apntag.offEvent('adLoaded', targetId);\n }\n }\n}, utils.Events);\n","import BackboneEvents from './backbone.events';\n\n/**\n * Simple syntactic sugar for easier extending objects with events\n */\nclass Eventable {}\nObject.assign(Eventable.prototype, BackboneEvents);\n\nexport default Eventable;\n","/* eslint-disable no-restricted-syntax */\nfunction copyProperties(target, source) {\n for (const key of Reflect.ownKeys(source)) {\n if (key !== 'constructor' && key !== 'prototype' && key !== 'name') {\n const desc = Object.getOwnPropertyDescriptor(source, key);\n Object.defineProperty(target, key, desc);\n }\n }\n}\n\nfunction mix(...mixins) {\n class Mix {}\n\n // Programmatically add all the methods and accessors\n // of the mixins to class Mix.\n for (const mixin of mixins) {\n copyProperties(Mix, mixin);\n copyProperties(Mix.prototype, mixin.prototype);\n }\n\n return Mix;\n}\n\nexport {\n mix,\n copyProperties\n};\n","/* eslint-disable max-classes-per-file */\nimport Eventable from 'utils/eventable';\nimport { copyProperties } from 'utils/mixin';\n\nclass PluginModel extends Eventable {\n constructor(options) {\n super();\n\n this.player = null;\n this.el = null;\n\n if (typeof this.initialize === 'function') {\n this.initialize(options);\n }\n }\n\n // eslint-disable-next-line\n getName() {\n throw new Error('getName() method has to be implemented');\n }\n\n // eslint-disable-next-line\n initialize() {}\n // eslint-disable-next-line\n setup() {}\n // eslint-disable-next-line\n destroy() {}\n\n /**\n * @param {Player} player\n */\n setPlayer(player) {\n this.player = player;\n this.setup(player);\n }\n}\n\n/**\n * @param {Object} plugin\n * @return {PluginModel}\n */\nconst createClass = (plugin) => {\n class CustomPluginModel extends PluginModel {}\n copyProperties(CustomPluginModel.prototype, plugin);\n return CustomPluginModel;\n};\n\nexport {\n createClass\n};\n\nexport default PluginModel;\n","import utils from 'utils/utils';\nimport closeIcon from 'icons/close.svg';\nimport appnexus from 'player/playback/ads/appnexus-ast';\nimport pauseTemplate from './pause.html';\nimport PluginModel from './model';\n\nclass PausePlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n this.maxDisplays = -1;\n this.displayCounter = 0;\n }\n}\n/**\n * Check if ad is loaded\n *\n * @param sourceMethod\n * @returns {Function}\n */\nfunction withAdTag(sourceMethod) {\n // eslint-disable-next-line consistent-return\n return function () {\n if (this.adPlacement) {\n return sourceMethod.apply(this, Array.prototype.slice.call(arguments));\n }\n };\n}\n\nfunction withCounter(sourceMethod) {\n // eslint-disable-next-line consistent-return\n return function () {\n if (this.maxDisplays === -1 || this.displayCounter < this.maxDisplays) {\n return sourceMethod.apply(this, Array.prototype.slice.call(arguments));\n }\n };\n}\n\nutils.extend(PausePlugin.prototype, {\n counter: 0,\n getName() {\n return 'PausePlugin';\n },\n\n resizeAd: withAdTag(function (width, height) {\n let size = (width && height) ? [width, height] : null;\n\n if (!size) {\n size = this.player.getContainer().querySelector('.jw-wrapper').getBoundingClientRect();\n size = [size.width, size.height];\n }\n\n appnexus.resizeTag(this.containerId, size);\n }),\n\n load: withAdTag(function (appnexusAdId) {\n this.listenTo(appnexus, 'adLoaded', function (adId, adData) {\n // different adId\n if (appnexusAdId !== adId) {\n return;\n }\n\n this.resizeAd();\n utils.addClass(this.el, 'svp-pause-view--visible');\n\n this.trigger('adVisible', {\n adId,\n creativeId: adData.creativeId\n });\n\n this.isAdTagLoaded = true;\n }, this);\n\n appnexus.defineTag(\n appnexusAdId,\n this.adPlacement\n ).then(() => {\n appnexus.showTag(appnexusAdId);\n });\n }),\n\n show: withCounter(withAdTag(function (data) {\n if (this.player.getState() === 'playing') return;\n const { pauseReason } = data;\n\n // undefined is returned on ie11 win7\n // settingsInteraction is triggered on mobile phones while using quality or share button\n if (pauseReason !== undefined && pauseReason !== 'external' && pauseReason !== 'settingsInteraction'\n && this.player.model.player.getViewable() === 1) {\n this.displayCounter += 1;\n\n if (this.isAdTagLoaded === true) {\n appnexus.refreshTag(this.containerId);\n } else {\n this.load(this.containerId);\n }\n }\n })),\n\n hide: withAdTag(function () {\n utils.removeClass(this.el, 'svp-pause-view--visible');\n }),\n\n /**\n * Fixing pause event triggered while interacting with scrub bar\n * @param data\n */\n onPause: withCounter(function (data) {\n let timerId = null;\n\n function onSeek() {\n if (timerId) {\n clearTimeout(timerId);\n timerId = null;\n }\n }\n\n timerId = setTimeout(() => {\n // cleanup seek listener when seek wasn't performed\n // eg regular pause button click\n this.stopListening(this.player.model, 'seek', onSeek);\n // display pause ad\n this.show(data);\n }, 50);\n\n // prevent to display pause ad when user seeked stream\n this.listenToOnce(this.player.model, 'seek', onSeek);\n }),\n\n onResumeClick() {\n this.player.play();\n utils.removeClass(this.el, 'svp-pause-view--visible');\n },\n\n setup() {\n PausePlugin.prototype.counter += 1;\n this.containerId = `svpPauseContainer${PausePlugin.prototype.counter}`;\n\n this.listenTo(this.player.model, 'playlistItem', function (item) {\n const { adPlacements } = item;\n\n if (adPlacements && adPlacements.pause) {\n // eslint-disable-next-line max-len\n this.maxDisplays = (typeof adPlacements.pause.maxDisplays === 'undefined') ? -1 : parseInt(adPlacements.pause.maxDisplays, 10);\n\n this.displayCounter = 0;\n this.render(adPlacements.pause);\n }\n }, this);\n\n this.listenTo(this.player.model, 'pause', this.onPause, this);\n this.listenTo(this.player, 'play', this.hide, this);\n },\n\n render(adTagOptions) {\n const appnexusAdContainerId = this.containerId;\n\n this.adPlacement = adTagOptions;\n this.el = utils.createNode(utils.template(pauseTemplate, {\n appnexusAdContainerId: appnexusAdContainerId,\n closeIcon: closeIcon\n }));\n\n const playButton = this.el.querySelector('.jw-icon-playback');\n const closeButton = this.el.querySelector('.svp-pause-close');\n\n if (playButton) {\n playButton.addEventListener('click', this.onResumeClick.bind(this), true);\n }\n\n if (closeButton) {\n closeButton.addEventListener('click', (event) => {\n event.stopPropagation();\n this.hide();\n }, true);\n }\n this.player.getContainer().querySelector('.jw-wrapper').appendChild(this.el);\n\n this.listenTo(this.player.model.player, 'resize', function (width, height) {\n if (this.player.getState() === 'paused') {\n this.resizeAd(width, height);\n }\n }, this);\n\n this.trigger('render');\n },\n\n destroy() {\n appnexus.off(this.containerId);\n\n this.stopListening(this.player);\n this.stopListening(this.player.model);\n this.stopListening(appnexus);\n\n this.adPlacement = null;\n this.isAdTagLoaded = false;\n\n if (this.el) {\n this.player.getContainer().querySelector('.jw-wrapper').removeChild(this.el);\n this.el = null;\n }\n }\n\n});\n\nexport default PausePlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\n/**\n * Displays Age Limit labels in player\n *\n * @param options\n * @constructor\n */\nclass AgeLimitPlugin extends PluginModel {\n constructor(options) {\n super(options);\n this.ageLimit = options.ageLimit;\n this.hideAfter = options.settings && options.settings.hideAfter != null ? options.settings.hideAfter : 3000;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'AgeLimitPlugin';\n }\n\n setup() {\n this.listenToOnce(this.player, 'assetPlay', this.render, this);\n\n this.once('render', this.show, this);\n }\n\n render() {\n // return number when there is no translation available\n const ageLimit = locale.translate(`ageLimit-${this.ageLimit}`, this.ageLimit);\n\n this.el = utils.createNode(`\n
\n \n \n \n \n\n ${ageLimit}\n
\n `);\n this.player.getContainer().appendChild(this.el);\n\n this.trigger('render');\n }\n\n destroy() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n\n show () {\n if (this.ageLimit !== null) {\n utils.addClass(this.player.getContainer(), 'svp-display-age-limit');\n\n if (this.hideAfter) {\n this.listenToOnce(this.player, 'time', setTimeout.bind(null, this.hide.bind(this), this.hideAfter));\n }\n }\n }\n\n hide () {\n utils.removeClass(this.player.getContainer(), 'svp-display-age-limit');\n }\n}\n\nexport default AgeLimitPlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\n/**\n * Displays sponsor label in top left corner of player\n *\n * @param options\n * @constructor\n */\nclass SponsorLabelPlugin extends PluginModel {\n constructor(options) {\n super(options);\n this.sponsor = options.sponsor;\n this.pluginName = 'SponsorLabelPlugin';\n }\n\n getName() {\n return this.pluginName;\n }\n\n setup() {\n this.listenToOnce(this.player, 'viewable', this.render, this);\n }\n\n render() {\n const adFrom = locale.translate('Ad from');\n\n if (this.sponsor) {\n this.el = utils.createNode(`
${adFrom} ${this.sponsor}
`);\n this.player.getContainer().appendChild(this.el);\n }\n }\n\n destroy() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n}\n\nexport default SponsorLabelPlugin;\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\nconst SVP_FLAG_EXPERIMENT = 'svp-flag-experiment';\nconst SVP_FLAG_EXPERIMENT_EXTENDED = 'svp-flag-experiment-extended';\nconst SVP_LOGIN_OVERLAY = 'svp-login-overlay';\nconst SVP_EXPERIMENT = 'svp-experiment';\n\n/**\n * @param {String} actual\n * @param {String} expected\n */\nfunction assertUppercased(actual, expected) {\n return actual && actual.toUpperCase() === expected;\n}\n\nexport function chooseVariant({ variants = {}, rangeNumber }) {\n const winner = Object.values(variants)\n .reduce((prev, { id, Percentage }, index) => {\n const percentage = Number(Percentage);\n if (index) {\n return prev.concat({ id, min: prev[index - 1].max, max: prev[index - 1].max + percentage });\n }\n return [{ id, min: 0, max: percentage }];\n }, []).find(({ min, max }) => rangeNumber > min && rangeNumber < max);\n return winner && variants[winner.id];\n}\n\nexport function prepareVariantsForExperiment(metadata = {}) {\n const variantIds = metadata.variants && metadata.variants.split(',');\n const experimentMetadataKeys = Object.keys(metadata)\n .filter((key) => key.match(/^\\d+variant/g));\n\n return experimentMetadataKeys.reduce((prev, current) => {\n const [, id, , key] = /^(\\d+)(variant)(\\D+)/g.exec(current);\n if (variantIds.includes(id)) {\n prev[id] = Object.assign(prev[id] || {}, { id, [key]: metadata[current] });\n }\n return prev;\n }, {});\n}\n\nfunction isLoginVariantType(variant = {}) {\n return assertUppercased(variant.Type, 'LOGIN');\n}\n\nfunction isSubscriptionVariantType(variant = {}) {\n return assertUppercased(variant.Type, 'SUBSCRIPTION');\n}\n\nconst getUiElementId = (provider, articleUrl, assetId) => `sdrn:${provider}:article:${articleUrl}:element:${assetId}`;\n\nclass PodcastExperimentPlugin extends PluginModel {\n constructor({ id, variant }, { loginUrl, subscriptionUrl, articleUrl }) {\n super({ id, variant });\n this.id = id;\n this.variant = variant;\n this.loginUrl = loginUrl;\n this.subscriptionUrl = subscriptionUrl;\n this.articleUrl = articleUrl;\n this.pluginName = 'PodcastExperimentPlugin';\n }\n\n getName() {\n return this.pluginName;\n }\n\n setup() {\n logger('ExperimentPlugin').log('setup', this);\n this.listenToOnce(this.player, 'viewable', this.render, this);\n }\n\n /**\n * @returns {string}\n */\n getButtonText() {\n const { variant = {} } = this;\n const translate = locale.translate('player');\n\n if (variant.OfferButton) {\n return variant.OfferButton;\n }\n if (isLoginVariantType(variant)) {\n return translate.loginToListen;\n }\n if (isSubscriptionVariantType(variant)) {\n return translate.subscribeToListen;\n }\n return translate.listen;\n }\n\n render() {\n const {\n variant, loginUrl, subscriptionUrl, articleUrl, player\n } = this;\n const { id, provider } = player.asset.attributes;\n const jwPlayer = player.model.player;\n const useExtendedVariant = jwPlayer.getHeight() > 300;\n const container = jwPlayer.getContainer();\n const buttonText = this.getButtonText();\n const uiElementId = getUiElementId(provider, encodeURIComponent(articleUrl), id);\n const pulseStatsPlugin = player.plugins.PulseStats;\n\n function trackEngagement() {\n if (pulseStatsPlugin) {\n pulseStatsPlugin.track('Engagement podcast experiment', {\n provider: { productType: 'Web' },\n type: 'Engagement',\n object: { '@id': uiElementId, type: 'UIElement', name: buttonText }\n });\n }\n }\n\n if (pulseStatsPlugin) {\n pulseStatsPlugin.playbackEvents.once('Load', () => {\n pulseStatsPlugin.track('View podcast experiment', {\n provider: { productType: 'Web' },\n type: 'View',\n object: { '@id': uiElementId, type: 'UIElement', name: buttonText }\n });\n });\n }\n\n if (!variant) {\n player.once('initialPlay', () => {\n trackEngagement();\n });\n return;\n }\n\n const isOffer = assertUppercased(variant.Offer, 'TRUE');\n if (isOffer) {\n if (useExtendedVariant) {\n utils.addClass(container, SVP_FLAG_EXPERIMENT_EXTENDED);\n }\n utils.addClass(container, SVP_FLAG_EXPERIMENT);\n container.appendChild(\n utils.createNode(`\n
\n
\n ${variant.OfferHeader || ''}\n
\n
\n ${variant.OfferPreamble || ''}\n
\n
\n `)\n );\n }\n\n const redirectUrl = isLoginVariantType(variant) ? loginUrl : subscriptionUrl;\n\n const linkAnchor = document.createElement('a');\n const linkSpan = document.createElement('span');\n linkSpan.classList.add('svp-login-button');\n linkSpan.appendChild(document.createTextNode(buttonText));\n linkAnchor.appendChild(linkSpan);\n linkAnchor.classList.add(SVP_LOGIN_OVERLAY);\n linkAnchor.setAttribute('href', redirectUrl);\n\n container.appendChild(linkAnchor);\n }\n\n destroy() {\n this.stopListening(this.player);\n const jwPlayer = this.player.model.player;\n const container = jwPlayer.getContainer();\n\n utils.removeClass(container, SVP_FLAG_EXPERIMENT);\n utils.removeClass(container, SVP_FLAG_EXPERIMENT_EXTENDED);\n\n const experimentInfo = container.querySelector(`.${SVP_EXPERIMENT}`);\n if (experimentInfo) {\n experimentInfo.parentNode.removeChild(experimentInfo);\n }\n\n const experimentOverlay = container.querySelector(`.${SVP_LOGIN_OVERLAY}`);\n if (experimentOverlay) {\n experimentOverlay.parentNode.removeChild(experimentOverlay);\n }\n\n logger('ExperimentPlugin').log('destroy', this);\n }\n}\n\nexport default PodcastExperimentPlugin;\n","import utils from 'utils/utils';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\nimport locale from 'player/model/locale';\n\nimport countdownTemplate from './countdown.html';\nimport PluginModel from './model';\n\nconst PLAYLIST_REGENERATION_THRESHOLD = 5; // in seconds\n\n/**\n * Format number by adding leading zeros eg 7 -> 07\n *\n * @param numValue\n * @param numLen\n * @returns {string}\n */\nconst leadingZeros = (numValue, numLen) => {\n const length = numLen || 2;\n let num = String(numValue);\n\n while (num.length < length) {\n num = `0${num}`;\n }\n\n return num;\n};\n\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nclass CountdownPlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n /**\n * Start date for stream (flightTime.start)\n * Javascript Date object\n */\n this.streamStart = options.streamStart;\n\n this.liveDOM = null;\n this.countdownDOM = null;\n\n this.isPlaylistRegenerated = false;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'countdown';\n }\n\n setup() {\n this.listenTo(this.player, 'playlistItem', this.render, this);\n }\n\n /**\n * Cleanup old node\n */\n destroy() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n\n /**\n * Render countdown\n */\n render() {\n try {\n this.player.getContainer();\n } catch (error) {\n return;\n }\n\n this.el = utils.createNode(utils.template(countdownTemplate));\n this.player.getContainer().appendChild(this.el);\n\n utils.addClass(this.player.getContainer(), 'svp-countdown-loaded');\n\n // cached live label dom element\n // eslint-disable-next-line prefer-destructuring\n this.liveDOM = this.el.getElementsByClassName('svp-live-label')[0];\n // eslint-disable-next-line prefer-destructuring\n this.countdownDOM = this.el.getElementsByClassName('svp-countdown-live-timer')[0];\n\n // countdown is ready\n this.trigger('ready');\n // start event runs on first change of countdown\n this.once('change', () => this.trigger('start'));\n\n // interval has to be initialized on\n this.intervalId = setInterval(() => this.refresh(), 1000);\n this.refresh();\n }\n\n /**\n * Refresh state and repaint\n */\n async refresh() {\n if (!this.diff) {\n this.diff = this.getDiff();\n }\n\n if (this.diff <= 0) {\n this.stop();\n }\n\n const string = [];\n\n if (this.isCountdownActive()) {\n const minutes = Math.floor(this.diff / 60) % 60;\n const seconds = this.diff % 60;\n\n string.push(`${leadingZeros(minutes)}:`);\n string.push(`${leadingZeros(seconds)}s`);\n\n if (this.currentState !== 'timer') {\n this.currentState = 'timer';\n this.liveDOM.innerHTML = locale.translate('Video will start in');\n\n utils.addClass(this.player.getContainer(), 'svp-countdown-active');\n }\n } else if (this.currentState !== 'date') {\n this.currentState = 'date';\n\n string.push(`${this.streamStart.getDate()}. ${locale.getMonthName(this.streamStart).toLowerCase()} `);\n string.push(`${leadingZeros(this.streamStart.getHours())}:`);\n string.push((leadingZeros(this.streamStart.getMinutes())));\n\n this.liveDOM.innerHTML = locale.translate('Video will start at');\n }\n\n if (string.length > 0) {\n this.countdownDOM.innerHTML = (string.join(''));\n this.trigger('change', this.streamStart);\n }\n\n // sync server time every 60s\n if (this.diff % 60 === 0) {\n await ServerTime.fetch(config.time);\n const newDiff = this.getDiff();\n if (Math.abs(newDiff - newDiff) > 1) {\n this.diff = newDiff;\n }\n }\n\n if (this.shouldRegeneratePlaylist()) {\n setTimeout(this.regeneratePlaylist.bind(this), 0);\n }\n\n this.diff -= 1;\n }\n\n shouldRegeneratePlaylist() {\n return this.player.model.getStream().isSecure()\n && this.diff <= PLAYLIST_REGENERATION_THRESHOLD\n && !this.isPlaylistRegenerated;\n }\n\n /**\n * Regenerate playlist to update tokens for secured streams\n * @return {Promise}\n */\n async regeneratePlaylist() {\n this.isPlaylistRegenerated = true;\n const { model } = this.player;\n const { playlist } = await model.getConfig();\n model.player.load(playlist);\n }\n\n /**\n * End of countdown\n */\n stop() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n\n this.intervalId = null;\n this.el.parentNode.removeChild(this.el);\n this.el = null;\n\n utils.removeClass(this.player.getContainer(), ['svp-countdown-active', 'svp-countdown-loaded']);\n\n this.trigger('end');\n }\n\n /**\n * Get difference between stream start and current server time\n * @returns {number}\n */\n getDiff() {\n return Math.ceil((this.streamStart.getTime() - ServerTime.getTime()) / 1000);\n }\n\n /**\n * Check whatever countdown or date should be displayed\n * Countdown is active when less than 1 hour reminded to start\n * @returns {boolean}\n */\n isCountdownActive() {\n // less than 1 hour\n return this.diff < 60 * 60 - 1;\n }\n}\n\nexport default CountdownPlugin;\n","import utils from 'utils/utils';\nimport image from 'utils/image';\nimport Recommended from 'player/model/recommended';\nimport closeIcon from 'icons/close.svg';\nimport nextIcon from 'icons/chevron-right.svg';\nimport recommendedTemplate from './recommended/recommended.html';\nimport nextAssetTemplate from './recommended/next-asset.html';\nimport gridTemplate from './recommended/grid.html';\nimport PluginModel from './model';\n\n/**\n * Play next asset from the list\n *\n * @param {number} assetId - SVP Asset id\n * @param {string} source - source of playnext (auto - when autoplay next, single, grid)\n */\nfunction playNext(assetId, source) {\n const clear = () => {\n utils.removeClass(this.el, ['is-grid-visible', 'is-next-visible', 'is-counting', 'is-next-closing']);\n };\n\n this.stopListening(this.player, 'complete');\n\n // autoplay of asset can be turned off from config\n if (this.settings.autoplay !== false) {\n this.player.playNext(assetId);\n }\n\n // nextAsset case, triggered by autoplay or user\n if (source === 'single' || source === 'auto') {\n this.trigger('nextAssetPlay', this.nextAsset, (source === 'auto') ? 'auto' : 'click', {\n source: this.nextAssetSource\n });\n\n utils.addClass(this.el, 'is-next-closing');\n setTimeout(clear, 700);\n } else {\n // grid click\n this.trigger('playRecommended', assetId);\n clear();\n }\n}\n\n/**\n * Turn off autoplay of recommended next asset\n */\nfunction disableNext() {\n this.trigger('nextAssetClose', this.nextAsset);\n this.nextAsset = null;\n utils.removeClass(this.el, 'is-next-visible is-counting is-next-visible');\n}\n\n/**\n * Retrieve full url for play next and grid assets thumbnails\n *\n * @param {string} key\n * @returns {string|null}\n */\nfunction getThumbnailUrl(key) {\n return image.getImageSrc(key, 'poster', 200);\n}\n\n/**\n * Add snap scroll for mobile grid\n */\nfunction initSnapScroll() {\n const scrollSnapPrefix = utils.getScrollSnapPrefix();\n const gridItem = this.getByClass('svp-player-recommended-item')[0];\n\n // check if snap points are supported\n if (scrollSnapPrefix !== false) {\n this.el.style[`${scrollSnapPrefix}scroll-snap-type`] = 'mandatory';\n this.el.style[`${scrollSnapPrefix}scroll-snap-points-x`] = `repeat(${gridItem.clientWidth}px)`;\n }\n}\n\n/**\n * Click handler for recommended grid\n *\n * @param {HTMLElement} node\n */\nfunction onGridItemClicked(node) {\n utils.addClass(node, 'svp-to-active');\n\n this.listenToOnce(this.player, 'assetPlay', function() {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n }, this);\n\n setTimeout(() => {\n playNext.call(this, parseInt(node.dataset.id, 10), 'grid');\n utils.removeClass(this.el, 'is-grid-visible');\n }, 500);\n}\n\n/**\n * Fetch recommended assets when player is ready\n */\nfunction onPlaybackStart() {\n const recommended = new Recommended({\n asset: this.player.getAsset()\n });\n\n // restore default state for each new asset\n this.gridItemsReady = false;\n\n // turn off option for grid\n if (this.settings.grid !== false) {\n recommended.getItems().then((items) => {\n if (utils.isArray(items) && items.length > 0) {\n this.gridItemsReady = true;\n this.trigger('gridItemsReady', items);\n } else {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n }\n }).catch(() => {\n try {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n } catch (e) {\n // player container not available\n }\n });\n }\n\n // next asset is available by default but can be turned off\n if (this.settings.next !== false) {\n if (this.nextAsset) {\n this.trigger('nextAssetReady', this.nextAsset, {\n source: this.nextAssetSource\n });\n return;\n }\n\n recommended.getNextAsset(this.settings.next).then(({ nextAsset, source }) => {\n this.nextAsset = nextAsset;\n this.nextAssetSource = source;\n\n this.trigger('nextAssetReady', this.nextAsset, {\n source\n });\n }).catch(() => {\n if (this.el) {\n utils.removeClass(this.el, ['is-next-visible', 'is-counting', 'is-next-closing']);\n }\n });\n }\n}\n\n/**\n * Initialize lazy fetching\n */\nfunction onInitialize() {\n // fetch recommended 5s before countdown time\n let fetchDuration = this.player.getDuration() - this.countdownTime - 5;\n\n // for streams shorter than 15s load next in 2s\n if (fetchDuration < 0) {\n fetchDuration = 2;\n }\n const stream = this.player.model.getStream();\n const isLive = stream.isLive();\n const isDisabledNextVideo = stream.isDisabledNextVideo();\n const hasPlaylist = stream.hasPlaylist();\n const isAssetFromPlaylist = this.player.model.isAssetFromPlaylist(stream.getId());\n\n // do not enable recommended for live streams and asset with metadata.disableNextVideo set to true\n if (!isLive && !isDisabledNextVideo && !hasPlaylist && !isAssetFromPlaylist) {\n this.listenTo(this.player, 'time', function (time) {\n if (fetchDuration > 0 && time > fetchDuration) {\n fetchDuration = -1;\n onPlaybackStart.call(this);\n }\n }, this);\n }\n}\n\n/**\n * Handler for stream end (countdown end) event\n * Stream complete can't be used due to circular events triggering\n * @param {string} reason\n */\nfunction onPlaybackComplete(reason) {\n const stream = this.player.model.getStream();\n const isAssetFromPlaylist = this.player.model.isAssetFromPlaylist(stream.getId());\n\n // do not take any action if complete is triggered by playNext\n if (\n stream.hasPlaylist()\n || isAssetFromPlaylist\n || reason === 'manualNext'\n || reason === 'stop'\n ) {\n return;\n }\n\n if (this.nextAsset) {\n this.trigger('nextAssetComplete', this.nextAsset);\n playNext.call(this, this.nextAsset.get('id'), 'auto');\n } else if (this.gridItemsReady) {\n // display grid only when items are available\n utils.addClass(this.el, 'is-grid-visible');\n utils.addClass(this.player.getContainer(), 'is-recommended-grid-visible');\n\n initSnapScroll.call(this);\n this.trigger('gridVisible');\n }\n}\n\n/**\n * Handler for checking time in which playNext should be available\n * @param {number} time\n * @param {number} duration\n */\nfunction onTimeNextVisible(time, duration) {\n if (duration - time < this.countdownTime) {\n this.trigger('playNextVisible', Math.floor(duration - time));\n }\n}\n\n/**\n * Display play next in given time\n *\n * @param {number} timeout - duration of countdown\n */\nfunction onPlayNextVisible(timeout) {\n // Don't present play next for audio assets as it isn't prepared\n const asset = this.player.getAsset();\n if (asset.isAudio()) {\n return;\n }\n\n utils.addClass(this.el, 'is-next-visible is-counting');\n\n this.stopListening(this.player, 'time', onTimeNextVisible);\n // update transition duration as it may be smaller than default due to seek\n this.getByClass('svp-player-recommended-countdown')[0].style.transitionDuration = `${timeout}s`;\n}\n\n/**\n * Handler triggered when nextAsset is available for current stream\n */\nfunction onNextAssetReady() {\n const img = new Image();\n // prefetch image\n img.src = getThumbnailUrl(this.nextAsset.getThumbnail());\n\n this.listenTo(this.player, 'time', onTimeNextVisible, this);\n\n this.getByClass('svp-player-recommended-next')[0].innerHTML = utils.template(nextAssetTemplate, {\n next: this.nextAsset,\n countdown: this.countdownTime, // default countdown\n getThumbnail: getThumbnailUrl,\n closeIcon: closeIcon,\n nextIcon: nextIcon\n });\n\n this.getByClass('svp-player-recommended-image')[0]\n .addEventListener('click', playNext.bind(this, this.nextAsset.get('id'), 'single'));\n\n this.getByClass('svp-player-recommended-close')[0]\n .addEventListener('click', disableNext.bind(this));\n}\n\n/**\n * Triggered when grid items are available\n * @param {Asset[]} recommended\n */\nfunction onGridItemsReady(recommended) {\n this.getByClass('svp-player-recommended-grid')[0].innerHTML = utils.template(gridTemplate, {\n recommended: recommended,\n getThumbnail: getThumbnailUrl,\n utils: utils\n });\n\n utils.each(this.getByClass('svp-player-recommended-item'), (item) => {\n item.addEventListener('click', onGridItemClicked.bind(this, item));\n });\n}\n\n/**\n * Triggered when recommended grid is displayed\n */\nfunction onGridVisible() {\n // replay asset triggers play\n // clicking on grid not intersects with this\n this.listenToOnce(this.player, 'play', this.trigger.bind(this, 'assetReplay'));\n}\n\n/**\n * Event fired when user decided to restart video\n */\nfunction onAssetReplay() {\n // attach events to allow again display of grid\n this.setup();\n // cleanup state\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n utils.removeClass(this.el, ['is-grid-visible', 'is-next-visible', 'is-counting', 'is-next-closing']);\n}\n\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nclass RecommendedPlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n // time in seconds from end of stream\n this.countdownTime = (options.settings && options.settings.next && options.settings.next.countdown) || 10;\n this.nextAsset = null;\n this.settings = utils.extend({\n grid: true,\n next: {}\n }, options.settings);\n\n // check if grid items are available\n this.gridItemsReady = false;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'RecommendedPlugin';\n }\n\n setup() {\n // assetPlay\n this.stopListening(this.player);\n this.listenToOnce(this.player, 'assetPlay', this.render, this);\n this.listenToOnce(this.player, 'assetPlay', onInitialize, this);\n this.listenToOnce(this.player, 'complete', onPlaybackComplete, this);\n\n this.once('playNextVisible', onPlayNextVisible, this);\n this.once('nextAssetReady', onNextAssetReady, this);\n this.once('gridItemsReady', onGridItemsReady, this);\n this.once('gridVisible', onGridVisible, this);\n this.once('assetReplay', onAssetReplay, this);\n }\n\n /**\n * Get current element child node by class name\n *\n * @param className\n * @returns {NodeList|*}\n */\n getByClass(className) {\n return this.el.getElementsByClassName(className);\n }\n\n /**\n * Render default view holder for play next and recommended\n *\n */\n render() {\n const container = this.player.getContainer();\n const previousEl = container.getElementsByClassName('svp-player-recommended-box');\n\n // clean if previously grid was displayed\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n\n // cleanup old element\n // recommended is \"async\" so it can't be destroyed like normal plugin\n if (previousEl.length > 0) {\n container.removeChild(previousEl[0]);\n }\n\n this.el = utils.createNode(utils.template(recommendedTemplate));\n\n container.appendChild(this.el);\n }\n}\n\nexport default RecommendedPlugin;\n","import utils from 'utils/utils';\n\nconst ClickTracker = {\n vendor: null,\n\n mode: 'TRACK',\n url: '//click.vgnett.no/svp.gif?s=',\n\n trackMediaEvent(data) {\n const query = [];\n\n query.push(`d=${this.getDeviceType()}`);\n query.push(`v=${data.assetId}`);\n\n this.sendRequest(query.join('&'));\n },\n\n trackStreamEvent(data) {\n const query = [];\n\n query.push(`d=${this.getDeviceType()}`);\n query.push(`v=${data.assetId}`);\n query.push(`p=${data.time}`);\n\n // randomize request time for avoiding api peaks\n setTimeout(this.sendRequest.bind(this, query.join('&')), Math.floor((Math.random() * 100) + 1));\n },\n\n /**\n * Send API request using 1x1px image\n *\n * @param queryString\n */\n sendRequest(queryString) {\n const image = new Image();\n const apiUrl = this.getApiUrl();\n const hypen = apiUrl.indexOf('?') > -1 ? '&' : '?';\n\n // track only if tracker is initialized\n if (this.vendor) {\n if (this.mode === 'LOG') {\n // eslint-disable-next-line no-console\n console.log('SVP STATS: ', [\n queryString,\n `${apiUrl + hypen + queryString}&cb=${Math.random() * 10000}`\n ]);\n }\n\n image.src = `${apiUrl + hypen + queryString}&cb=${Math.random() * 10000}`;\n }\n\n return image;\n },\n\n getApiUrl() {\n return this.url + this.vendor;\n },\n\n getDeviceType() {\n if (utils.device.isTablet()) {\n return 'tablet';\n }\n\n if (utils.device.isMobile()) {\n return 'mobile';\n }\n\n return 'desktop';\n }\n};\n\nexport default ClickTracker;\n","import ClickTracker from './svp-stats/tracker';\nimport PluginModel from './model';\n\n/**\n * Seconds intervals for tracking\n * @returns {number}\n */\nfunction getTrackingInterval(duration) {\n // if duration is not set then do not track it\n if (duration > 0) {\n // for streams shorter than 250s tracking interval is 5seconds\n if (duration < 250) {\n return 5;\n }\n\n // otherwise it's every 2% of stream\n return Math.floor(duration * 0.02);\n }\n\n return -1;\n}\n\n/**\n * Basic SVP statistics tool\n *\n * @param options\n * @constructor\n */\nclass SvpStatsPlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n this.env = options.env;\n this.vendor = options.vendor;\n this.mode = options.mode;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'SvpStatsPlugin';\n }\n\n setup() {\n // stats can be turned off only on non production env\n if (this.mode === 'OFF' && this.env !== 'production') {\n return;\n }\n // https://github.schibsted.io/svp/web-player/issues/1043\n if (this.vendor === 'vgtv') {\n return;\n }\n\n ClickTracker.mode = this.mode;\n ClickTracker.vendor = this.vendor;\n\n this.listenTo(this.player, 'assetPlay', function (startTime) {\n const asset = this.player.getAsset();\n const assetId = asset.get('id');\n const duration = this.player.getDuration();\n const trackingInterval = getTrackingInterval(duration);\n\n let initialStartTime = startTime || -1;\n let currentTime = -1;\n\n ClickTracker.trackMediaEvent({\n assetId: assetId\n });\n\n // tracking interval maybe invalid when stream is live or do not have proper duration\n if (trackingInterval > 0 && asset.get('streamType') !== 'live') {\n // assetPlay prevents from sending events when it has start time\n this.listenTo(this.player, 'time', (playerTime) => {\n const time = Math.floor(playerTime);\n\n // engagement tracking\n if (time !== currentTime && time % trackingInterval === 0 && time > initialStartTime) {\n currentTime = time;\n // reset start time counter for tracking seek before start point in indexed stream\n initialStartTime = -1;\n\n // prevent requests outside stream size\n if (time > -1 && time <= duration) {\n ClickTracker.trackStreamEvent({\n assetId: assetId,\n time: time\n });\n }\n }\n });\n }\n });\n\n this.listenTo(this.player, 'adSlotStart', function (adSlot) {\n if (adSlot.position === 'preroll') {\n ClickTracker.trackStreamEvent({\n assetId: this.player.getAsset().get('id'),\n time: -1\n });\n }\n });\n\n this.listenTo(this.player, 'adSlotComplete', function (adSlot) {\n if (adSlot.position === 'preroll') {\n ClickTracker.trackStreamEvent({\n assetId: this.player.getAsset().get('id'),\n time: -2\n });\n }\n });\n }\n\n destroy() {\n ClickTracker.vendor = null;\n this.stopListening(this.player);\n }\n}\n\nexport default SvpStatsPlugin;\n","import Eventable from 'utils/eventable';\nimport get from 'lodash/get';\n\n/**\n * @typedef AdEventsAdData\n * @property {string} id\n * @property {false|number[]} adSequenceDuration\n * @property {number} duration integer\n * @property {number} position integer\n * @property {number} sequence ad sequence position\n * @property {number} count\n * @property {boolean} start\n * @property {string} type\n */\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop\n */\nclass AdEvents extends Eventable {\n constructor(player) {\n super();\n this.player = player;\n /**\n * @type {AdEventsAdData}\n */\n this.adData = { adSequenceDuration: false };\n this.beforeUnload = ['onpagehide' in window.self\n ? 'pagehide' : 'beforeunload', this.onAdSlotComplete.bind(this), true];\n\n this.listenTo(this.player, 'playlistItem', this.onPlaylistItem, this);\n this.listenTo(this.player, 'adSlotStart', this.onAdSlotStart, this);\n this.listenTo(this.player, 'adStarted', this.onAdStarted, this);\n this.listenTo(this.player, 'adProgress', this.onAdProgress, this);\n this.listenTo(this.player, 'adSlotComplete', this.onAdSlotComplete, this);\n this.listenTo(this.player, 'adFinished', this.onAdFinished, this);\n\n this.listenTo(this.player, 'adPause', this.onAdPause, this);\n this.listenTo(this.player, 'adPlay', this.onAdPlay, this);\n\n this.listenTo(this.player, 'PausePlugin:adVisible', this.onPauseAdVisible, this);\n\n this.listenTo(this.player, 'playlistItem', () => {\n this.adData.adSequenceDuration = false;\n });\n\n window.addEventListener(...this.beforeUnload);\n }\n\n onPlaylistItem() {\n this.listenToOnce(this.player, 'complete', this.onAdSlotComplete, this);\n }\n\n onAdSlotStart(slotData) {\n Object.assign(this.adData, {\n type: slotData.position\n });\n }\n\n onAdProgress(time) {\n if (!this.adData.id) {\n return;\n }\n\n const position = Math.floor(time);\n\n Object.assign(this.adData, {\n position\n });\n }\n\n onAdSlotComplete() {\n this.sendStopEvent();\n window.removeEventListener(...this.beforeUnload);\n }\n\n onAdFinished() {\n this.sendStopEvent();\n }\n\n onAdStarted({ meta: adData }) {\n Object.assign(this.adData, {\n start: true\n });\n\n // adData is missing from homad events\n if (!adData) {\n return;\n }\n\n Object.assign(this.adData, {\n id: adData.adId,\n sequence: adData.sequence,\n count: adData.podcount,\n position: 0\n });\n\n if (!this.adData.adSequenceDuration) {\n this.adData.adSequenceDuration = Array(adData.podcount);\n }\n\n const adType = get(adData, 'adschedule.offset');\n // Preroll ads only\n if (adType === 'pre' && adData.duration) {\n this.adData.adSequenceDuration[adData.sequence - 1] = adData.duration;\n }\n }\n\n onAdPlay() {\n this.trigger('Play', this.adData);\n // start indicates first play of ad\n this.adData.start = false;\n }\n\n onAdPause() {\n this.trigger('Pause', this.adData);\n }\n\n onPauseAdVisible(data) {\n this.trigger('View', {\n id: data.creativeId,\n type: 'Pausead'\n });\n }\n\n sendStopEvent() {\n if (this.adData.id) {\n this.trigger('Stop', Object.assign({}, this.adData, { duration: this.adData.position }));\n // keep adSequenceDuration for playback tracking purposes\n this.adData = { adSequenceDuration: this.adData.adSequenceDuration };\n }\n }\n\n destroy() {\n window.removeEventListener(...this.beforeUnload);\n this.stopListening();\n }\n}\n\nexport default AdEvents;\n","export default {};\n","import Eventable from 'utils/eventable';\nimport utils from 'utils/utils';\nimport get from 'lodash/get';\nimport session from './session';\nimport { isCustomIntervalFalsy } from './helpers';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass PlaybackEvents extends Eventable {\n constructor(player, options) {\n super();\n this.player = player;\n this.watchData = {\n time: 0,\n duration: -1\n };\n\n this.previousTime = -1;\n\n this.session = this.createSession();\n this.beforeStreamStart = true;\n this.beforeUnload = ['onpagehide' in window.self\n ? 'pagehide' : 'beforeunload', this.onBeforeUnload.bind(this), true];\n this.playMethod = null;\n\n this.vodInterval = get(options, 'vodInterval');\n this.liveInterval = get(options, 'liveInterval');\n\n this.listenTo(this.player, 'playlistItem', this.onPlaylistItem, this);\n this.listenTo(this.player, 'assetPlay', this.onAssetPlay, this);\n this.listenTo(this.player, 'pause', this.onPause, this);\n this.listenTo(this.player, 'play', this.onPlay, this);\n this.listenTo(this.player, 'playNext', this.onPlayNext, this);\n\n if (this.stream.isLive()) {\n this.listenTo(this.player, 'time', this.onLiveTime, this);\n } else {\n this.listenTo(this.player, 'time', this.onTime, this);\n }\n\n this.listenTo(this.player, 'RecommendedPlugin:nextAssetPlay', (asset, mode, opts) => {\n let playbackSource = mode === 'auto' ? 'autoplayNext' : 'manualNext';\n if (opts.source && opts.source !== 'byId') {\n playbackSource += `-${opts.source}`;\n }\n return this.onRecommendedPlay(playbackSource);\n });\n\n this.listenTo(this.player, 'nextAutoAdvance', () => (\n this.onRecommendedPlay('autoplayNext-playlist')\n ));\n\n this.listenTo(this.player, 'nextClick', () => (\n this.onRecommendedPlay('manualNext-playlist')\n ));\n\n this.listenTo(this.player, 'relatedReady', () => {\n if (!this.jwRelatedPlugin) {\n return;\n }\n this.jwRelatedPlugin.on('feedClick', () => {\n this.beforeStreamStart = false;\n this.onComplete();\n this.onRecommendedPlay('manualNext-playlist');\n });\n });\n\n this.listenTo(this.player, 'playlistComplete', () => {\n this.listenToOnce(this.player, 'displayClick', () => (\n this.onRecommendedPlay('manualNext-playlist')\n ));\n });\n\n this.listenTo(this.player, 'RecommendedPlugin:playRecommended', () => {\n this.onRecommendedPlay('manualNext-grid');\n });\n\n this.listenToOnce(this.player, 'play', ({ playReason }) => {\n this.playMethod = playReason;\n });\n\n window.addEventListener(...this.beforeUnload);\n }\n\n get eventData() {\n const data = {\n playMethod: this.playMethod\n };\n const { previousAssetId } = this.session;\n\n if (previousAssetId) {\n data.previousAssetId = previousAssetId;\n data.playbackSource = this.session.playbackSource;\n }\n\n data.duration = this.watchData.duration;\n\n try {\n data.position = Math.floor(this.player.getCurrentTime());\n } catch (e) {\n // could not parse time\n // do not set any value in this case\n }\n\n return data;\n }\n\n get stream() {\n try {\n return this.player.config.stream || {};\n } catch (e) {\n return {};\n }\n }\n\n get jw() {\n try {\n return this.player.model.player || {};\n } catch (e) {\n return {};\n }\n }\n\n get jwRelatedPlugin() {\n try {\n return this.jw.getPlugin('related') || null;\n } catch (e) {\n return null;\n }\n }\n\n getPosition() {\n try {\n return Math.floor(this.player.getCurrentTime());\n } catch (e) {\n return 0;\n }\n }\n\n createSession() {\n // node is unique player identifier\n const node = this.player.config.get('node');\n const id = node.id || node;\n\n /**\n * Initialize session object to keep reference\n */\n if (!session[id]) {\n session[id] = {};\n }\n\n return session[id];\n }\n\n trackTimeEvent({ time, defaultInterval = 1, customInterval }) {\n const eventInterval = utils.isNumber(customInterval) ? customInterval : defaultInterval;\n\n // track event data with one second interval\n if (time % 1 === 0 && this.previousTime !== time) {\n this.watchData.duration += 1;\n this.previousTime = time;\n }\n\n if (time % eventInterval === 0 && this.watchData.time !== time) {\n this.watchData.time = time;\n\n // skip when custom interval is turned off\n if (isCustomIntervalFalsy(customInterval)) {\n return;\n }\n\n this.trigger('Watch', Object.assign(this.eventData, {\n position: time\n }));\n }\n }\n\n onBeforeUnload() {\n if (this.beforeStreamStart === false) {\n this.onComplete();\n }\n }\n\n onPlaylistItem() {\n this.listenToOnce(this.player, 'complete nextClick', this.onComplete, this);\n const track = this.trigger.bind(this, 'Load', Object.assign(this.eventData, {\n position: this.stream.getPlaybackTime('begin') || 0,\n duration: 0\n }));\n\n /**\n * Only first playback has to wait for viewable event\n * Playnext/grid will work without it\n */\n if (this.session.wasViewed === true) {\n track();\n } else {\n // wait for player to be viewable\n this.listenTo(this.player.model.player, 'viewable', (data) => {\n if (data.viewable) {\n track();\n this.stopListening(this.player.model.player, 'viewable');\n this.session.wasViewed = true;\n }\n });\n }\n\n this.previousAssetId = null;\n }\n\n onAssetPlay() {\n this.beforeStreamStart = false;\n\n return this.trigger('Play', Object.assign(this.eventData, {\n start: true,\n duration: 0\n }));\n }\n\n onPause() {\n this.trigger('Pause', this.eventData);\n }\n\n onPlay() {\n // play can't be triggered before assetPlay\n if (!this.beforeStreamStart) {\n this.trigger('Play', this.eventData);\n }\n }\n\n /**\n * Intervals for VOD are defined as follow\n *\n * every 5s - during the first 10 seconds of content playback (no matter of where playback has started)\n * every 10s - for the range (10-60s) of content playback, after seeking intervals should be triggered in same time\n * every 30s - for the rest\n * seek 42, then first trigger should be in 50\n */\n onTime(eventTime) {\n const time = Math.floor(eventTime);\n let eventInterval;\n\n if (eventTime <= 10) {\n eventInterval = 5;\n } else if (eventTime <= 120) {\n eventInterval = 10;\n } else {\n eventInterval = 30;\n }\n this.trackTimeEvent({ time, defaultInterval: eventInterval, customInterval: this.vodInterval });\n }\n\n /**\n * Track live events by checking time from flight time to current date\n * DVR seek is also included in calculations\n */\n onLiveTime() {\n // after playback stars time to start will be negative\n // add DVR shift from playback\n const eventTime = Math.floor((this.stream.getTimeToStart() * -1) + this.jw.getPosition());\n // constant tracking interval\n this.trackTimeEvent({ time: eventTime, defaultInterval: 30, customInterval: this.liveInterval });\n }\n\n onComplete(reason) {\n if (reason === 'manualNext') {\n this.onRecommendedPlay('manualNext');\n }\n\n /**\n * Track stop event only when playback has started\n */\n if (this.beforeStreamStart === false) {\n this.trigger('Stop', this.eventData);\n // store asset id in memory to attach it to play next video\n this.session.previousAssetId = this.stream.getId();\n }\n this.beforeStreamStart = true;\n }\n\n /**\n * @param {Number} id\n * @param {Object} [options]\n * @param {Object} [options.pulse]\n * @param {String} [options.source] - A source that will be added as a playback source for pulse metrics\n */\n onPlayNext(id, options) {\n if (options && options.pulse) {\n Object.assign(this.session, options.pulse);\n }\n }\n\n onRecommendedPlay(playbackSource) {\n this.session.playbackSource = playbackSource;\n }\n\n destroy() {\n window.removeEventListener(...this.beforeUnload);\n this.stopListening();\n }\n}\n\nexport default PlaybackEvents;\n","/**\n * Returns true when custom interval is set to false, null or 0\n * @param customInterval\n * @return {boolean}\n */\nexport function isCustomIntervalFalsy(customInterval) {\n return customInterval !== undefined && !customInterval;\n}\n","import Eventable from 'utils/eventable';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass UiEvents extends Eventable {\n constructor(player) {\n super();\n this.player = player;\n this.listenTo(this.player, 'ready', this.onReady, this);\n\n this.listenTo(\n this.player,\n 'RecommendedPlugin:playNextVisible',\n this.onRecommendedVisible,\n this\n );\n\n this.listenTo(this.player, 'nextShown', this.onRecommendedVisible, this);\n }\n\n onRecommendedVisible(event) {\n if (event.ui === 'nextup') {\n this.trigger('UiElement', {\n id: this.player.getAsset().get('id'),\n name: 'nextAssetCountdown'\n });\n }\n }\n\n destroy() {\n this.stopListening();\n }\n}\n\nexport default UiEvents;\n","import config from 'player/config';\n\nclass CategoryTree {\n /**\n * @param {string} vendor\n */\n constructor(vendor) {\n this.vendor = vendor;\n }\n\n /**\n * @returns {Promise>}\n */\n fetch() {\n if (!this.request) {\n this.request = fetch(config.api.getUrl(this.vendor, '/categories'))\n .then((response) => response.json())\n .then((response) => {\n // eslint-disable-next-line\n if (response && response._embedded.categories) {\n // eslint-disable-next-line\n return response._embedded.categories;\n }\n\n return [];\n })\n .then((categories) => {\n this.categories = new Map(categories.map((category) => [category.id, category]));\n });\n }\n return this.request;\n }\n\n /**\n * @param {number} categoryId\n * @returns {SvpCategory[]}\n */\n getPath(categoryId) {\n const path = [];\n let category = this.categories.get(categoryId);\n\n if (category) {\n path.push(category);\n\n while (category.parentId !== 0) {\n category = this.categories.get(category.parentId);\n path.unshift(category);\n }\n }\n\n return path;\n }\n}\n\n/**\n * @type {Record}\n */\nconst instances = {};\n\n/**\n * @param {string} vendor\n * @returns {CategoryTree}\n */\nexport default (vendor) => {\n if (!instances[vendor]) {\n instances[vendor] = new CategoryTree(vendor);\n }\n\n return instances[vendor];\n};\n","import { capitalizeFirstLetter } from 'utils/string';\nimport logger from 'utils/logger';\nimport pick from 'lodash/pick';\nimport isObject from 'lodash/isObject';\nimport isEmpty from 'lodash/isEmpty';\nimport configuration from 'player/config';\nimport PluginModel from './model';\nimport PulseTracker from './pulse-stats/tracker';\nimport AdEvents from './pulse-stats/ad-events';\nimport PlaybackEvents from './pulse-stats/playback-events';\nimport UiEvents from './pulse-stats/ui-events';\nimport CategoryTree from '../model/category-tree';\n\n/**\n * Retrieve tags from asset\n * @param asset\n */\nconst getTags = (asset) => (asset.get('tags') || [])\n .filter((tag) => isObject(tag) || !isEmpty(tag.tag))\n .map(({ tag }) => tag);\n\n/**\n * Get array of plan3 stories ids\n *\n * @param asset\n * @returns {*|Array}\n */\nconst getStories = (asset) => (asset.get('stories') || []);\n\nexport const getMediaAssetId = (provider, mediaId) => `sdrn:${provider}:mediaasset:${mediaId}`;\n\n/**\n * Integration with Pulse Tracker\n * https://github.schibsted.io/spt-dataanalytics/pulse-autotracker\n *\n * @param options\n * @constructor\n */\nclass PulseStatsPlugin extends PluginModel {\n constructor(options, experiment) {\n super(options);\n this.provider = options.provider;\n this.decorator = options.decorator || ((data) => data);\n this.intervals = pick(options.engagementIntervals, 'live', 'vod');\n this.embed = options.embed === true;\n this.previousAssetId = options.previousAssetId;\n this.tracker = null;\n this.experiment = experiment;\n }\n // eslint-disable-next-line\n getName() {\n return 'PulseStats';\n }\n\n get jw() {\n try {\n return this.player.model.player || {};\n } catch (e) {\n return {};\n }\n }\n\n get asset() {\n const asset = this.playerAsset;\n const additional = asset.get('additional') || {};\n const accessControl = Object.keys(additional.access || {});\n const tags = getTags(asset);\n const stories = getStories(asset);\n\n const data = {\n assetType: asset.get('assetType') === 'video' ? 'Video' : 'Audio',\n title: asset.get('title'),\n // duration should be in seconds\n duration: Math.round(asset.get('duration') / 1000)\n };\n\n if (accessControl.length > 0) {\n data.accessControl = accessControl.join(',');\n }\n\n if (tags.length > 0) {\n data.tags = tags;\n }\n\n if (stories.length > 0) {\n // disable stories until there is not id->title translation\n // data.stories = stories;\n }\n\n // check if stream has category\n if (asset.getCategory()) {\n data.category = asset.getCategory().get('id');\n }\n\n // delete duration from live assets\n if (asset.get('streamType') === 'live') {\n delete data.duration;\n }\n\n if (additional.originAssetId) {\n data.originAssetId = additional.originAssetId;\n }\n\n return data;\n }\n\n get apiUrl() {\n const { url } = configuration.api;\n const asset = this.playerAsset;\n const protocol = !url.startsWith('http') ? 'https:' : '';\n return `${protocol}${url}${asset.getVendor()}/assets/${asset.get('id')}?appName=linkpulse`;\n }\n\n get isAutoplay() {\n const autoplay = this.player.config.get('autoplay');\n return autoplay === true || autoplay === 'viewable';\n }\n\n getCategoryPath(categoryId) {\n if (typeof categoryId !== 'number') {\n return null;\n }\n\n // check if id exist and create category path\n if (!this.categoryPath) {\n this.categoryPath = this.categoryTree.getPath(categoryId)\n .map((category) => (category.title.toLowerCase()))\n .join(' > ');\n }\n\n return this.categoryPath;\n }\n\n /**\n * Track Pulse event\n * Defer tracking when Pulse library is not loaded yet\n */\n async track(eventName, eventData) {\n const tracker = await this.getTracker();\n const data = {};\n Object.assign(data, eventData, this.experiment && {\n experiments: [{\n id: this.experiment.id,\n variant: this.experiment.variant ? this.experiment.variant.id : '0',\n platform: this.provider\n }]\n });\n logger('Pulse').log(JSON.stringify(data, null, 4));\n tracker.track(eventName, data);\n }\n\n async trackMediaEvent(data) {\n try {\n await this.categoryTree.fetch();\n\n // category data is available on ready event\n const categoryPath = this.getCategoryPath(data.object.category);\n\n if (categoryPath) {\n // eslint-disable-next-line\n data.object.category = categoryPath;\n }\n await this.track('engagementEvent', this.decorator(data, this.playerAsset));\n } catch (e) {\n // nothing to do\n logger('Pulse').log('Could not track event');\n }\n }\n\n getTracker() {\n return new Promise((resolve) => {\n const resolveTracker = () => resolve(this.tracker);\n\n if (this.tracker === null) {\n this.once('ready', resolveTracker);\n } else {\n resolveTracker();\n }\n });\n }\n\n setup() {\n // prevent asset to be changed with playnext before stream completes\n this.playerAsset = this.player.getAsset();\n\n this.categoryTree = CategoryTree(this.playerAsset.getVendor());\n\n this.adEvents = new AdEvents(this.player);\n this.playbackEvents = new PlaybackEvents(this.player, {\n vodInterval: this.intervals.vod,\n liveInterval: this.intervals.live\n });\n this.uiEvents = new UiEvents(this.player);\n\n // initialize only once\n Promise.all([\n PulseTracker.init(this.provider),\n this.categoryTree.fetch()\n ]).then((data) => this.onReady(data));\n\n this.listenTo(this.adEvents, 'all', this.onAdEvent, this);\n this.listenTo(this.playbackEvents, 'all', this.onPlaybackEvent, this);\n this.listenTo(this.uiEvents, 'all', this.onUiEvent, this);\n }\n\n onReady(data) {\n const [tracker] = data;\n\n this.tracker = tracker;\n this.trigger('ready');\n }\n\n onPlaybackEvent(intent, data = {}) {\n const asset = this.playerAsset;\n\n /**\n * Autoplay is not set for load method thus we use value set in player constructor\n * For other events method of playback start is checked\n * Autoplay is set to true when player actually autostarts or when its started with external call (.play())\n */\n const trackingData = {\n intent,\n '@type': 'Engagement',\n position: data.position,\n // duration is in ms\n duration: data.duration * 1000,\n object: Object.assign({\n '@id': getMediaAssetId(this.provider, asset.get('id')),\n '@type': 'MediaAsset',\n name: asset.getTitle(),\n muted: this.jw.getMute(),\n fullscreen: this.jw.getFullscreen(),\n accessControl: asset.accessControl || 'free',\n autoplay: data.playMethod === null\n ? this.isAutoplay\n : (data.playMethod === 'autostart'\n || data.playMethod === 'external' || data.playMethod === 'viewable'),\n adSequenceCount: data.count,\n embed: this.embed,\n streamType: asset.get('streamType'),\n adblock: this.player.model.player.getAdBlock(),\n apiUrl: this.apiUrl,\n preview: Boolean(this.player.config.get('videoPreview'))\n }, this.asset)\n };\n\n const { adSequenceDuration } = this.adEvents.adData;\n if (adSequenceDuration) {\n trackingData.object.adSequenceDuration = adSequenceDuration;\n trackingData.object.adSequenceCount = adSequenceDuration.length;\n }\n\n if (data.start === true) {\n trackingData.start = true;\n }\n\n if (data.previousAssetId) {\n trackingData.object.previousAssetId = getMediaAssetId(this.provider, data.previousAssetId);\n trackingData.object.playbackSource = data.playbackSource;\n } else if (this.previousAssetId) {\n trackingData.object.previousAssetId = getMediaAssetId(this.provider, this.previousAssetId);\n trackingData.object.playbackSource = 'config';\n }\n\n this.trackMediaEvent(trackingData);\n }\n\n onAdEvent(intent, data) {\n const asset = this.playerAsset;\n const trackingData = {\n intent,\n '@type': 'Engagement',\n position: data.position,\n // position and duration are equal because ads does not allow to seek through content\n // duration is in ms\n duration: data.position && data.position * 1000,\n object: {\n '@id': `sdrn:${this.provider}:mediaad:${data.id}`,\n '@type': 'MediaAd',\n assetType: capitalizeFirstLetter(data.type),\n muted: this.jw.getMute(),\n fullscreen: this.jw.getFullscreen(),\n autoplay: this.isAutoplay,\n mediaAssetId: getMediaAssetId(this.provider, asset.get('id')),\n adSequenceCount: data.count,\n adblock: this.player.model.player.getAdBlock(),\n apiUrl: this.apiUrl\n }\n };\n\n if (data.adSequenceDuration) {\n trackingData.object.adSequenceDuration = data.adSequenceDuration;\n trackingData.object.adSequenceCount = data.adSequenceDuration.length;\n }\n\n if (data.sequence) {\n trackingData.object.adSequencePosition = data.sequence;\n if (data.adSequenceDuration && data.adSequenceDuration[data.sequence - 1]) {\n trackingData.object.duration = data.adSequenceDuration[data.sequence - 1];\n }\n }\n\n if (data.start === true) {\n trackingData.start = true;\n }\n\n if (asset.getCategory()) {\n trackingData.object.category = this.categoryTree.getPath(asset.getCategory().attributes.id)\n .map((i) => i.title)\n .join(' > ')\n .toLocaleLowerCase();\n }\n\n return this.trackMediaEvent(trackingData);\n }\n\n async onUiEvent(eventName, data) {\n const trackingData = {\n '@type': 'View',\n object: Object.assign(data, {\n '@id': getMediaAssetId(this.provider, data.id),\n '@type': 'UIElement',\n apiUrl: this.apiUrl\n })\n };\n\n this.track('viewEvent', trackingData);\n }\n\n destroy() {\n this.stopListening();\n\n this.adEvents.destroy();\n this.playbackEvents.destroy();\n }\n}\n\nexport default PulseStatsPlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\nconst SVP_FLAG_NATIVE_LINK = 'svp-flag-native-link';\nconst SVP_NATIVE_LINK_OVERLAY = 'svp-native-link-overlay';\nconst SVP_NATIVE_LINK_BUTTON = 'svp-native-link-button';\nconst SVP_LOGIN_OVERLAY = 'svp-login-overlay';\n\n/**\n * Allowing using native link for playing podcasts on hermes apps\n *\n * @param options\n * @constructor\n */\nclass PodcastNativeLinkPlugin extends PluginModel {\n constructor(options) {\n super(options);\n this.link = null;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'PodcastNativeLinkPlugin';\n }\n\n setup() {\n const asset = this.player.getAsset();\n\n if (utils.device.isHermesApp()) {\n if (utils.device.isIOS()) {\n this.link = `audio:${asset.getVendor()}:${asset.get('id')}`;\n } else if (utils.device.isAndroid()) {\n // TODO: Android support\n }\n }\n\n this.listenToOnce(this.player, 'viewable', this.render, this);\n }\n\n render() {\n if (!this.link) {\n return;\n }\n\n const translations = locale.getTranslations();\n const container = this.player.getContainer();\n\n // do not show when there is login overlay\n const loginOverlay = container.querySelector(`.${SVP_LOGIN_OVERLAY}`);\n if (loginOverlay) {\n return;\n }\n\n // Native link has unsupported format and cannot be created using JW utils.createElement\n // @see https://github.schibsted.io/svp/web-player/issues/1003\n const linkAnchor = document.createElement('a');\n const linkSpan = document.createElement('span');\n linkSpan.classList.add(SVP_NATIVE_LINK_BUTTON);\n linkSpan.appendChild(document.createTextNode(translations.player.listen));\n linkAnchor.appendChild(linkSpan);\n linkAnchor.classList.add(SVP_NATIVE_LINK_OVERLAY);\n linkAnchor.setAttribute('href', this.link);\n\n this.el = linkAnchor;\n\n utils.addClass(container, SVP_FLAG_NATIVE_LINK);\n container.appendChild(this.el);\n }\n\n destroy() {\n if (this.el) {\n const container = this.player.getContainer();\n\n utils.removeClass(container, SVP_FLAG_NATIVE_LINK);\n\n const overlay = container.querySelector(`.${SVP_NATIVE_LINK_OVERLAY}`);\n if (overlay) {\n overlay.parentNode.removeChild(overlay);\n }\n }\n }\n}\n\nexport default PodcastNativeLinkPlugin;\n","import logger from 'utils/logger';\n\n/**\n * events hashmap playerId -> eventBus\n * each player has its own events bus\n *\n * @type Record\n */\nexport const events = {};\n\n/**\n * Homad AAB ads have single event bus for all players\n *\n * @param {CustomEvent} event\n */\nfunction parseHomadEvent(event) {\n const details = event && event.detail;\n // skip parsing when there is missing data or player is not registered\n if (!details || !events[details.containerId]) {\n return;\n }\n\n const {\n name, container, containerId, player, videoTag, videoTagId, ...data\n } = details;\n\n logger('Homad').log(details.name, data);\n\n events[details.containerId].trigger(details.name, data);\n}\n\nexport function translateHomadEvents() {\n window.addEventListener('hdEvent', parseHomadEvent);\n}\n","/* eslint-disable max-len */\n\n/**\n * @typedef {'pre'|'mid'|'post'} PotOffset\n */\n/**\n * @typedef {Record} AdSchedule\n */\n\n/**\n * @param {PotOffset} offset\n * @param {AdSchedule} adschedule\n * @returns {null|string}\n */\nfunction getAdPotTag(offset, adschedule) {\n const keys = Object.keys(adschedule);\n let tag;\n\n keys.forEach(function (key) {\n if (key.indexOf(offset) > -1) {\n tag = adschedule[key].tag;\n }\n });\n\n return tag;\n}\n\n/**\n * @param {PotOffset} potOffset\n * @returns {string|false}\n */\nfunction getTagUrl(potOffset) {\n return function (player) {\n const playlistItem = player.getPlaylist()[0];\n\n let tag;\n if (playlistItem.adschedule) {\n tag = getAdPotTag(potOffset, playlistItem.adschedule);\n }\n\n /**\n * @see https://docs.xandr.com/bundle/monetize_monetize-standard/page/topics/target-video-attributes-via-query-string-parameters.html\n */\n if (tag) {\n return tag.replace('vmap', 'ssvmap');\n }\n return false;\n };\n}\n\n/**\n * @typedef HomadConfig\n * @property {string} innerWarpper.style (yes, there is a typo)\n * @property {string} container.style\n * @property {string} video.style\n * @property {string} video.style.position\n * @property {*} video.attributes\n * @property {boolean} noClickThroughOnVideoTag\n * @property {*} outstream\n * @property {*} bypass\n * @property {*} tcf_config\n * @property {*} gdpr\n * @property {*} iqfix\n * @property {*} runInsideContainer\n * @property {*} use_videotag_as_container\n * @property {boolean} throwVideoTag\n * @property {*} vpaid\n * @property {*} takeover_ratio\n * @property {*} verticalizr\n * @property {*} ad_fallback\n * @property {*} ad_fallback_config\n * @property {*} skipOffset\n * @property {*} viewableImporession\n * @property {string} clickthrough_target\n * @property {*} welectPlacementTitle (yes, there is a typo)\n * @property {*} clickThroughBox\n * @property {string} globalConfig\n * @property {string} clientConfig\n * @property {boolean} skipable\n * @property {boolean} skipAdOnContextChange\n * @property {boolean} runInsideContainer\n * @property {boolean} adjustAdVolumeToContentPlayer\n * @property {boolean} postrollUseCompleteEvent\n * @property {number} zIndex\n * @property {string|((JWPlayer) => string)} prerollAdTag\n * @property {string|((JWPlayer) => string)} midrollAdTag\n * @property {string|((JWPlayer) => string)} postrollAdTag\n */\n\n/**\n * @type {HomadConfig}\n */\nexport const homadDefaultConfig = {\n globalConfig: 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n clientConfig: '/homad-config.json',\n skipable: true,\n skipAdOnContextChange: true,\n runInsideContainer: true,\n adjustAdVolumeToContentPlayer: true,\n postrollUseCompleteEvent: false,\n // by default the ad opens in the same tab. _blank is often blocked\n clickthrough_target: '_target',\n zIndex: 200,\n prerollAdTag: getTagUrl('pre'),\n midrollAdTag: getTagUrl('mid'),\n postrollAdTag: getTagUrl('post')\n};\n","import { homadDefaultConfig } from './config';\nimport { translateHomadEvents } from './eventbus';\nimport homadLib from './lib';\n\nexport function initializeHomadLib() {\n const SvpPlayer = (window.SVP && window.SVP.Player) || {};\n if (SvpPlayer.isHomadLoaded) {\n return;\n }\n\n SvpPlayer.isHomadLoaded = true;\n\n const homadConfig = { ...homadDefaultConfig };\n\n // override aab config url\n if (SvpPlayer.defaults && SvpPlayer.defaults.aabConfig) {\n homadConfig.clientConfig = SvpPlayer.defaults.aabConfig;\n }\n\n translateHomadEvents();\n homadLib(homadConfig);\n}\n","/**\n * @param {Homad} homad\n */\nconst createProxyMethods = (homad) => ({\n /**\n * @this {PlayerModel}\n */\n onFirstFrameLoad(onFirstFrameLoad) {\n this.player.once('play', function () {\n this.player.once('providerFirstFrame', function () {\n onFirstFrameLoad.call(this, this.playlistItemId);\n }, this);\n }, this);\n },\n\n /**\n * @this {PlayerModel}\n */\n onTime(onTime, args) {\n if (!this.adPlaying && !this.adPlayerLoading) {\n onTime.apply(this, args);\n }\n },\n\n /**\n * @this {PlayerModel}\n */\n // eslint-disable-next-line consistent-return\n onPlay(onPlay, args) {\n if (!this.adPlayerLoading) {\n onPlay.apply(this, args);\n }\n },\n /**\n * @this {PlayerModel}\n */\n onPause(onPause, args) {\n if (this.adPlaying === false && !this.adPlayerLoading) {\n onPause.apply(this, args);\n }\n },\n /**\n * @this {PlayerModel}\n */\n onComplete(onComplete, args) {\n if (this.adPlaying === false && !this.adPlayerLoading) {\n onComplete.apply(this, args);\n } else {\n this.listenToOnce(homad, 'continueContent', function () {\n onComplete.apply(this, args);\n }, this);\n }\n }\n});\n\n/**\n * Override player methods to play well with Homad\n * @param {PlayerModel} player\n * @param {Homad} homad\n */\nexport const applyPlayerMixin = (player, homad) => {\n const overrides = createProxyMethods(homad);\n Object.keys(overrides).forEach((name) => {\n const sourceMethod = player[name];\n\n player[name] = function (...args) {\n return overrides[name].call(player, sourceMethod, args);\n };\n });\n};\n","/* eslint-disable max-len */\nimport utils from 'utils/utils';\n\nimport { events } from './homad/eventbus';\nimport { initializeHomadLib } from './homad/global';\nimport { applyPlayerMixin } from './homad/proxy';\nimport { waitForAdPlayer } from './homad/utils';\n\nclass Homad {\n /**\n * @param {PlayerModel} player\n */\n constructor(player) {\n initializeHomadLib();\n\n this.player = player;\n this.playerId = player.config.get('node');\n\n // Proxy Homad global events related to current player instance\n utils.extend(this, utils.Events);\n if (!events[this.playerId]) {\n events[this.playerId] = { ...utils.Events };\n }\n this.listenTo(events[this.playerId], 'all', this.trigger, this);\n\n // Override SVP Player's methods\n applyPlayerMixin(player, this);\n\n this.on('contentPlayerPlay', this.onContentPlayerPlay, player);\n this.on('adStart', this.onAdStart, player);\n this.on('continueContent', this.onContinueContent, player);\n this.on('adTime', this.onAdTime, player);\n player.on('adError', this.onPlayerAdError, player);\n player.on('adBreakStart', this.onPlayerAdBreakStart, player);\n player.on('playlistItem', this.onPlayerPlaylistItem, player);\n player.on('adPlay', this.onPlayerAdPlay, player);\n\n this.on('adComplete adSkipped adPause adPlay', this.forwardEventToPlayer, this);\n\n // Find Ad player's container and video elements\n const node = player.getContainer();\n waitForAdPlayer(node).then((dom) => {\n this.container = dom.container;\n this.video = dom.video;\n this.playButton = dom.playButton;\n this.muteButton = dom.muteButton;\n this.trigger('initialize');\n });\n }\n\n /**\n * Remove player events from messaging bus\n * Prevents memory leaks\n */\n destroy() {\n this.off();\n this.stopListening();\n if (events[this.playerId]) {\n events[this.playerId].off();\n events[this.playerId].stopListening();\n\n events[this.playerId] = null;\n delete events[this.playerId];\n }\n }\n\n /**\n * @this {PlayerModel}\n */\n onContentPlayerPlay() {\n this.getContainer().classList.remove('svp-homad-loading');\n }\n\n /**\n * @this {PlayerModel}\n * @param {string} state\n */\n onAdStart({ state }) {\n this.adPosition = state;\n\n if (this.adPlaying === false) {\n this.trigger('adSlotStart', {\n position: this.adPosition\n });\n\n this.adPlaying = true;\n }\n\n this.trigger('adStarted', {\n position: this.adPosition\n });\n }\n\n /**\n * @this {PlayerModel}\n */\n onContinueContent() {\n this.getContainer().classList.remove('jw-flag-ads');\n\n if (this.adPlaying === true) {\n this.trigger('adSlotComplete', {\n position: this.adPosition\n });\n\n this.adPlaying = false;\n }\n }\n\n /**\n * @this {PlayerModel}\n * @param {number} currentTime\n * @param {number} duration\n */\n onAdTime({ currentTime, duration }) {\n if (currentTime && this.adPlaying) {\n this.trigger('adProgress', currentTime, duration);\n }\n }\n\n /**\n * Forward Homad event only if an ad is playing\n * @param {string} eventName\n */\n forwardEventToPlayer(eventName) {\n this.on(eventName, () => {\n if (this.player.adPlaying) {\n this.player.trigger(eventName);\n }\n });\n }\n\n /**\n * @this {PlayerModel}\n */\n onPlayerAdError() {\n const jw = this.player;\n const container = this.getContainer();\n\n this.hasAdBlocked = true;\n\n // just to be sure\n this.once('adStarted', function () {\n this.adPlayerLoading = false;\n }, this);\n\n this.once('adSlotComplete', function () {\n container.classList.remove('svp-homad-loading');\n }, this);\n\n this.listenToOnce(jw, 'play', function () {\n this.adPlayerLoading = true;\n }, this);\n\n this.listenToOnce(jw, 'pause', function (options) {\n // first external pause is triggered by homad\n // this equals to ad tag loaded and parsed\n if (options && options.pauseReason === 'external') {\n this.adPlayerLoading = false;\n }\n }, this);\n }\n\n /**\n * @this {PlayerModel}\n * @param {string} adposition\n */\n onPlayerAdBreakStart({ adposition } = {}) {\n const duration = this.getDuration();\n const currentTime = this.getCurrentTime();\n const container = this.getContainer();\n\n // homad has strange constraints for midroll\n if ((adposition !== 'mid') || (currentTime > 30 && duration - currentTime > 30)) {\n container.classList.add('svp-homad-loading');\n\n // clean loading in case of any error\n setTimeout(function () {\n container.classList.remove('svp-homad-loading');\n }, 5000);\n\n this.listenToOnce(this.player, 'adPlay', () => {\n container.classList.remove('svp-homad-loading');\n });\n }\n }\n\n // turn off ad player loading when there is no ads\n /**\n * @this {PlayerModel}\n * @param playlistItem\n */\n onPlayerPlaylistItem(playlistItem) {\n if (playlistItem.item && !playlistItem.item.adschedule) {\n this.adPlaying = false;\n this.adPlayerLoading = false;\n }\n }\n\n /**\n * @this {PlayerModel}\n */\n onPlayerAdPlay() {\n this.adPlaying = true;\n this.adPlayerLoading = false;\n }\n}\n\nexport default Homad;\n","/**\n * @typedef HomadDOM\n * @property {HTMLVideoElement} video\n * @property {HTMLDivElement} container\n * @property {HTMLImageElement} playButton\n * @property {HTMLImageElement} muteButton\n */\n\n/**\n * Get Ad Player from player container\n *\n * This function awaits for the HOMAD system to bootstrap in the DOM,\n * then finds the appropriate video tag and HOMAD's main container\n *\n * @param {HTMLDivElement} playerContainer\n * @return {Promise}\n */\nexport function waitForAdPlayer(playerContainer) {\n return new Promise((resolve) => {\n const handler = (event) => {\n if (event.detail && event.detail.container === playerContainer) {\n const videoElements = playerContainer.querySelectorAll('video');\n const [video] = [...videoElements].filter((v) => !v.className);\n if (video) {\n /**\n * [div] homad main container\n * └─ [div]\n * ├─ [video] click event goes to the advertiser\n * ├─ [div] time label\n * ├─ [div] controls container\n * │ ├─ [img] play button\n * │ └─ [img] mute button\n * └─ [div] overlay (to unpause)\n */\n const container = video.parentNode.parentNode;\n const controlsContainer = video.nextElementSibling.nextElementSibling;\n const [playButton, muteButton] = controlsContainer.childNodes;\n\n window.removeEventListener('hdEvent', handler);\n resolve({\n video, container, playButton, muteButton\n });\n }\n }\n };\n\n window.addEventListener('hdEvent', handler);\n });\n}\n","import utils from 'utils/utils';\nimport PluginModel from '../model';\nimport Homad from './homad';\n\nimport iconPause from './icons/pause.svg';\nimport iconPlay from './icons/play.svg';\nimport iconSpeaker from './icons/speaker.svg';\nimport iconSpeakerMuted from './icons/speaker-muted.svg';\nimport iconLink from './icons/link.svg';\nimport iconFullscreen from './icons/fullscreen.svg';\nimport { createElement } from './dom';\nimport { homadAdTracker } from './tracking';\n\n/**\n *\n * @param {number} duration duration in seconds\n */\nfunction formatTime(duration) {\n const minutes = Math.floor(duration / 60);\n const seconds = Math.floor(duration - minutes * 60);\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nclass AABPlugin extends PluginModel {\n // eslint-disable-next-line class-methods-use-this\n getName() {\n return 'AABPlugin';\n }\n\n initialize() {\n this.elements = {};\n\n this.handleAdLabelClick = this.handleAdLabelClick.bind(this);\n this.handlePlayPauseClick = this.handlePlayPauseClick.bind(this);\n this.handleMuteClick = this.handleMuteClick.bind(this);\n this.handleFullscreenClick = this.handleFullscreenClick.bind(this);\n }\n\n setup() {\n // anti adblock works only for desktops\n if (utils.device.getDeviceType() !== 'desktop') {\n return;\n }\n\n this.player.once('ready', () => {\n const { aab } = window.SVP.Player.defaults;\n if (aab === true) {\n // force loading when mode is set to \"true\"\n this.initializeHomad();\n } else if (aab === 'auto') {\n // detect if adblock exist for \"auto\" mode\n this.player.model.player.once('adBlock', () => {\n this.initializeHomad();\n });\n }\n });\n }\n\n initializeHomad() {\n const pulse = this.player.getPlugin('PulseStats');\n this.homad = new Homad(this.player.model);\n homadAdTracker(this.player.model, this.homad, pulse);\n this.homad.once('initialize', this.onHomadReady, this);\n }\n\n /**\n * Initialize ad player\n */\n onHomadReady() {\n this.createControls(this.homad.container);\n\n this.hideHomadNativeControls();\n\n this.player.getContainer().classList.remove('jw-state-buffering');\n\n this.attachEventListeners();\n this.onMuteToggle({ type: this.homad.video.muted ? 'mute' : 'unmute' });\n\n const { setAdPlaying, setAdComplete } = this.getPlaybackState();\n this.player.model.once('adSlotStart', setAdPlaying);\n this.player.model.once('adSlotComplete', setAdComplete);\n }\n\n destroy() {\n if (this.homad) {\n this.homad.destroy();\n }\n this.detachEventListeners();\n super.destroy();\n }\n\n hideHomadNativeControls() {\n const { container } = this.homad;\n const [mainDiv] = [...container.childNodes].filter((c) => c.childNodes.length > 0);\n [...mainDiv.childNodes].forEach((element) => {\n if (element.tagName.toLowerCase() !== 'video') {\n element.style.cssText = 'display: none !important; z-index: unset !important';\n }\n });\n }\n\n /**\n * @param {HTMLDivElement} container Homad main element\n */\n createControls(container) {\n const muteButton = createElement('button', {});\n const playButton = createElement('button', {});\n const fullscreenButton = createElement('button', {});\n\n playButton.innerHTML = iconPause;\n fullscreenButton.innerHTML = iconFullscreen;\n\n const labelText = createElement('strong', {}, 'ANNONSE (00:00)');\n const iconPlaceholder = createElement('div', {});\n iconPlaceholder.innerHTML = iconLink;\n\n const label = createElement('a', {\n href: '#',\n target: '_blank',\n rel: 'noopener'\n }, [\n iconPlaceholder,\n createElement('div', { class: 'aab-labels' }, [\n labelText,\n createElement('span', {}, 'Gå til annonsør')\n ])\n ]);\n\n // Controlbar\n const controls = createElement('div', {\n class: 'aab-layout'\n }, [\n createElement('div', { class: 'aab-controls' }, [\n muteButton\n ]),\n createElement('div', { class: 'aab-spacer' }),\n createElement('div', { class: 'aab-controls' }, [\n playButton,\n label,\n createElement('div', {\n class: 'aab-spacer'\n }),\n fullscreenButton\n ])\n ]);\n\n this.elements = {\n muteButton,\n playButton,\n fullscreenButton,\n labelText,\n label,\n controls\n };\n\n // Append the whole controls' container to the DOM\n container.appendChild(controls);\n }\n\n attachEventListeners() {\n const {\n label, muteButton, fullscreenButton, playButton\n } = this.elements;\n\n label.addEventListener('click', this.handleAdLabelClick);\n muteButton.addEventListener('click', this.handleMuteClick);\n fullscreenButton.addEventListener('click', this.handleFullscreenClick);\n playButton.addEventListener('click', this.handlePlayPauseClick);\n\n this.listenTo(this.homad, 'adPlay', this.onAdPlay, this);\n this.listenTo(this.homad, 'adPause', this.onAdPause, this);\n this.listenTo(this.homad, 'adTime', this.onAdTime, this);\n this.listenTo(this.homad, 'mute unmute', this.onMuteToggle, this);\n }\n\n detachEventListeners() {\n try {\n const {\n label, muteButton, fullscreenButton, playButton\n } = this.elements;\n label.removeEventListener('click', this.handleAdLabelClick);\n muteButton.removeEventListener('click', this.handleMuteClick);\n fullscreenButton.removeEventListener('click', this.handleFullscreenClick);\n playButton.removeEventListener('click', this.handlePlayPauseClick);\n } catch (err) {\n // noop\n }\n }\n\n onAdPlay() {\n this.elements.playButton.innerHTML = iconPause;\n }\n\n onAdPause() {\n this.elements.playButton.innerHTML = iconPlay;\n }\n\n onAdTime() {\n const { duration, currentTime } = this.homad.video;\n const { labelText } = this.elements;\n labelText.innerText = `ANNONSE (${formatTime(duration - currentTime)})`;\n }\n\n handleAdLabelClick(event) {\n const { video } = this.homad;\n video.click();\n video.pause();\n event.preventDefault();\n }\n\n handlePlayPauseClick() {\n this.homad.playButton.click();\n }\n\n onMuteToggle({ type }) {\n const { muteButton } = this.elements;\n muteButton.innerHTML = type === 'mute' ? iconSpeakerMuted : iconSpeaker;\n }\n\n getPlaybackState() {\n const playerClassList = this.player.getContainer().classList;\n const adStarted = ['jw-flag-ads', 'svp-homad-playing'];\n\n const useClasses = (add, remove) => {\n playerClassList.add(...add);\n playerClassList.remove(...remove);\n };\n\n return {\n setAdPlaying: () => useClasses(adStarted, ['svp-homad-loading']),\n setAdComplete: () => useClasses([], adStarted)\n };\n }\n\n handleFullscreenClick() {\n try {\n const jwplayer = this.player.model.player;\n jwplayer.setFullscreen();\n } catch (e) {\n // fullscreen did not work\n }\n }\n\n handleMuteClick() {\n this.homad.muteButton.click();\n }\n}\n\nexport default AABPlugin;\n","/**\n * @param {PlayerModel} player\n * @param {Homad} homad\n * @param {PulseStatsPlugin} pulse\n */\nexport function homadAdTracker(player, homad, pulse) {\n let adSequencePosition = 0;\n let adSequenceCount = 0;\n let adIds = [];\n\n if (pulse) {\n const resetSequence = () => {\n adSequencePosition = 0;\n adSequenceCount = 0;\n };\n\n /**\n * @param {Object} data Homad event details\n * @param {{ adID: string }[]} data.adIds\n * @param {'preroll'|'midroll'|'postroll'} data.state\n * @param {number} data.duration\n * @param {number} data.currentTime\n */\n const onHomadAdStart = (data) => {\n const { adEvents } = pulse;\n\n if (!adSequencePosition) {\n adSequenceCount = data.adIds.length;\n }\n\n adSequencePosition += 1;\n adIds = [...data.adIds];\n const { adID } = adIds[adIds.length - 1];\n\n Object.assign(adEvents.adData, {\n type: data.state,\n // duration in milliseconds\n duration: data.duration * 1000,\n // Both Homad and JWplayer can't seem to poroperly extract adId value from VAST response\n // This bug prevents Watch and Complete tracking events from being dispatched\n // We're going to use homadImpressionAdId until this is fixed for Homad\n id: adID || data.homadImpressionAdId,\n sequence: adSequencePosition,\n podcount: adSequenceCount,\n position: 0\n });\n\n // Simulate 'adEvents.onAdMeta' call\n if (!adEvents.adData.adSequenceDuration) {\n adEvents.adData.adSequenceDuration = Array(adSequenceCount);\n }\n\n if (data.state === 'preroll') {\n // duration in seconds\n adEvents.adData.adSequenceDuration[adSequencePosition - 1] = data.duration;\n }\n\n // Trigger Pulse MediaAd:Play event\n adEvents.onAdPlay();\n };\n\n const onHomadAdPause = () => {\n pulse.adEvents.onAdPause();\n };\n\n const onHomadAdTime = (data) => {\n pulse.adEvents.onAdProgress(data.currentTime);\n };\n\n // MediaAd.Watch\n homad.on('adTime', onHomadAdTime);\n\n // MediaAd.Play\n homad.on('adStart', onHomadAdStart);\n\n // MediaAd.Pause\n homad.on('adPause', onHomadAdPause);\n\n // MediaAd.Stop\n homad.on('adComplete', pulse.adEvents.onAdFinished, pulse.adEvents);\n\n player.on('playlistItem', resetSequence);\n homad.on('adRequest', resetSequence);\n }\n}\n","import utils from 'utils/utils';\nimport videoPreviewHelper from 'utils/video-preview';\nimport locale from '../model/locale';\n\n/**\n * @param {Object} playlistItem\n * @param {number} playlistItem.id\n */\nfunction playNextFromPlaylist(playlistItem) {\n const { asset } = this;\n const { masterAsset } = this.model;\n\n if (!asset || !masterAsset || asset.get('id') === playlistItem.id) {\n return;\n }\n\n const nextAssetData = masterAsset.get('id') === playlistItem.id\n ? utils.extend({}, masterAsset.attributes)\n : masterAsset.get('playlist').find((assetData) => assetData.id === playlistItem.id);\n\n if (!nextAssetData) {\n return;\n }\n\n this.setAsset(nextAssetData);\n}\n\n/**\n* Player initialized and single playlistItem is laoded\n* @param {Object} playlistItem\n*/\nexport function onPlaylistItem(playlistItem) {\n const container = this.getContainer();\n // add class for live streams\n\n utils.removeClass(container, 'svp-player-live');\n\n if (this.model.getStream().isLive()) {\n utils.addClass(container, 'svp-player-live');\n\n const icon = container.getElementsByClassName('jw-icon-display')[0];\n\n if (icon) {\n // add translation for live button via data-label\n icon.setAttribute('data-label', locale.translate('Live button'));\n }\n }\n\n const videoElement = container.querySelector('video.jw-video');\n\n if (videoElement) {\n videoElement.loop = this.config.get('repeat');\n }\n\n if (!this.model.config.shouldApplyTextToSpeechSkin() && !this.model.stream.isAudio()) {\n videoPreviewHelper.addVideoPreviewElement.call(this);\n }\n\n playNextFromPlaylist.call(this, playlistItem);\n\n this.trigger('playlistItem');\n}\n","/**\n * Stream completed, fired for every item in playlist\n * Clear settings which are only for one stream\n * @param {string} reason\n */\nexport function onComplete(reason) {\n if (!this.isCompleted) {\n this.isCompleted = true;\n\n this.config.set('time', null);\n this.config.set('chapter', null);\n\n this.trigger('complete', reason);\n }\n}\n","import { onPlaylistItem } from './playlist';\nimport { onComplete } from './complete';\nimport { onError } from './error';\n\n/**\n * Remove single plugin instance\n * Clear all listeners\n * Remove from plugins hashmap\n *\n * @param {PluginModel} plugin\n */\nexport function destroyPlugin(plugin) {\n if (plugin.off) {\n plugin.off();\n }\n plugin.destroy();\n\n this.stopListening(plugin);\n delete this.plugins[plugin.getName()];\n}\n\n/**\n * Proxy player events\n */\nexport function onPlayerEvent(event, ...args) {\n let callFunction;\n\n switch (event) {\n case 'playlistItem':\n callFunction = onPlaylistItem.bind(this, ...args);\n break;\n case 'complete':\n callFunction = onComplete.bind(this, ...args);\n break;\n case 'error':\n callFunction = onError.bind(this, ...args);\n break;\n default:\n callFunction = this.trigger.bind(this, event, ...args);\n }\n\n callFunction();\n}\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport Asset from '../model/asset';\nimport NextAsset from '../model/next-asset';\nimport Stream from '../model/stream';\nimport PausePlugin from '../plugins/pause';\nimport AgeLimitPlugin from '../plugins/age-limit';\nimport SponsorLabelPlugin from '../plugins/sponsor-label';\nimport PodcastExperimentPlugin, { prepareVariantsForExperiment, chooseVariant } from '../plugins/podcast-experiment';\nimport CountdownPlugin from '../plugins/countdown';\nimport RecommendedPlugin from '../plugins/recommended';\nimport SvpStatsPlugin from '../plugins/svp-stats';\nimport PulseStatsPlugin from '../plugins/pulse-stats';\nimport PodcastNativeLinkPlugin from '../plugins/podcast-native-link';\nimport AABPlugin from '../plugins/anti-adblock';\nimport statusCode from '../playback/config/status-codes';\n\nimport { clearError, onError } from './error';\nimport { destroyPlugin } from './helpers';\n\n/**\n * this always points to Player object\n * @memberOf {Player}\n */\nexport async function onAssetReady() {\n const { config: configuration } = this;\n\n const stream = new Stream(this.asset.attributes);\n const settings = configuration.getSettings();\n const node = document.getElementById(configuration.get('node'));\n const hasPlaylist = stream.hasPlaylist();\n\n if (node) {\n clearError(node);\n }\n\n // turn off recommended plugin for all tts assets\n if (this.model.config.shouldApplyTextToSpeechSkin(stream)) {\n this.config.set('recommended', false);\n }\n\n const isAssetFromPlaylist = this.model.isAssetFromPlaylist(stream.getId());\n\n if (!isAssetFromPlaylist) {\n const masterAsset = hasPlaylist ? new Asset(utils.extend({}, this.asset.attributes)) : null;\n this.model.setMasterAsset(masterAsset);\n }\n\n // add hasNext checking\n stream.set(\n 'hasNext',\n !hasPlaylist || !isAssetFromPlaylist || !stream.isDisabledNextVideo() || NextAsset.hasPlayNext(this.asset)\n );\n\n if (this.asset.get('access')) {\n const access = Object.keys(this.asset.get('access'))[0] || null;\n stream.set('access', access);\n }\n\n configuration.setStream(stream);\n\n // cleanup plugins as they maybe not required for new stream\n utils.each(this.plugins, destroyPlugin, this);\n\n this.addPlugin(new AABPlugin());\n\n // set start time if chapter is provided (not applicable for playlists)\n if (!hasPlaylist && !isAssetFromPlaylist && configuration.get('chapter')) {\n const chapter = this.asset.getChapter(configuration.get('chapter'));\n\n if (chapter) {\n stream.set('playAhead', chapter.timeline);\n }\n }\n\n // set playahead time\n if (!isAssetFromPlaylist && configuration.get('time')) {\n stream.set('playAhead', configuration.get('time'));\n }\n\n if (configuration.hasRecommended()) {\n this.addPlugin(new RecommendedPlugin({\n settings: configuration.getRecommended()\n }));\n }\n\n // stream is not available yet, display countdown\n if (stream.getTimeToStart() > 0 && !configuration.get('disableCountdownPlugin')) {\n // countdown is disable in preview mode on non live streams\n if (settings.preview !== true || stream.isLive()) {\n this.addPlugin(new CountdownPlugin({\n streamStart: new Date((ServerTime.getTime()) + stream.getTimeToStart() * 1000)\n }));\n\n // play stream after countdown ends\n this.on('countdown:end', this.play, this);\n }\n }\n\n if (this.asset.getAgeLimit() > -1) {\n this.addPlugin(new AgeLimitPlugin({\n ageLimit: this.asset.getAgeLimit(),\n settings: configuration.getAgeLimit()\n }));\n }\n\n if (configuration.get('showSponsorLabel') && this.asset.isSponsored()) {\n this.addPlugin(new SponsorLabelPlugin({\n sponsor: this.asset.getCategoryTitle()\n }));\n }\n\n const metadata = this.asset.get('metadata') || {};\n\n let experiment;\n let isExperiment;\n // do not load an experiment feature when the player is in preview mode\n const isPodcastWithExperiment = settings.preview !== true && metadata.experimentId && metadata.isPodcast === 'true';\n\n if (isPodcastWithExperiment) {\n try {\n let experimentRange = JSON.parse(sessionStorage.getItem('svpExperimentRange'));\n if (!experimentRange) {\n experimentRange = Math.random() * 100;\n sessionStorage.setItem('svpExperimentRange', JSON.stringify(experimentRange));\n }\n experiment = {\n id: metadata.experimentId,\n variant:\n chooseVariant({ variants: prepareVariantsForExperiment(metadata), rangeNumber: experimentRange })\n };\n\n const userStatus = await (configuration.get('userStatus') || {});\n if (userStatus.loggedIn && !userStatus.hasProduct && experiment.variant.Type === 'Subscription') {\n isExperiment = true;\n } else if (userStatus.loggedIn) {\n isExperiment = false;\n } else {\n isExperiment = true;\n }\n\n if (isExperiment) {\n this.addPlugin(new PodcastExperimentPlugin(\n experiment,\n {\n loginUrl: await configuration.get('loginUrl'),\n subscriptionUrl: await configuration.get('subscriptionUrl'),\n articleUrl: await configuration.get('articleUrl')\n }\n ));\n }\n } catch (error) {\n logger('ExperimentPlugin').error('An error occur while initializing experiment', error);\n }\n }\n\n /**\n * Disable Pulse tracking for mock/ads only playback\n */\n\n const pulseConfig = configuration.get('pulse');\n if (pulseConfig && pulseConfig.provider && stream.isMock() === false) {\n this.addPlugin(new PulseStatsPlugin(pulseConfig, isExperiment ? experiment : null));\n }\n\n /**\n * Disable SVP Stats for mock\n */\n if (stream.isMock() === false) {\n this.addPlugin(new SvpStatsPlugin({\n vendor: configuration.get('vendor'),\n mode: configuration.get('stats'),\n env: configuration.get('env')\n }));\n }\n\n this.addPlugin(new PausePlugin());\n\n if (stream.isPodcast() && configuration.get('nativeLink') !== false) {\n this.addPlugin(new PodcastNativeLinkPlugin());\n }\n\n // set stream to display error\n this.model.setStream(stream);\n\n configuration.isStreamPlayable().then(() => {\n // restart asset state\n // this.isCompleted = false;\n this.trigger('assetReady');\n }).catch((code) => {\n this.trigger('assetError', {\n message: statusCode(code),\n code\n });\n\n onError.call(this, {\n type: 'assetError',\n // message is translated in next functions\n message: statusCode(code),\n code\n });\n });\n}\n","import utils from 'utils/utils';\n/**\n * Check if preroll is scheduled in configuration\n *\n * @param {*} config\n * @returns {boolean}\n */\nfunction hasPreroll(config) {\n const playlistItem = config && config.playlist[0];\n let result = false;\n\n if (playlistItem.adschedule) {\n utils.each(playlistItem.adschedule, function (slot) {\n if (slot && slot.offset === 'pre') {\n result = true;\n }\n });\n }\n\n return result;\n}\n\n/**\n * Check if given stream can be autoplayed\n * Rules for autoplay depends on device but also on flags given to playback\n *\n * @deprecated new autoplay policies require starting of video to detect if autoplay will work\n * @param {*} config - JW Configuration\n * @returns {boolean}\n */\nfunction canAutoplay(config) {\n var canDeviceAutoplay = utils.device.canAutoplay();\n\n // enable autoplay for devices with disabled ads and at least muted autoplay ability ios10\n var result = (canDeviceAutoplay === 'always');\n\n if (canDeviceAutoplay === 'muted' && !hasPreroll(config)) {\n result = true;\n }\n\n return result;\n}\n\nexport default {\n canAutoplay: canAutoplay\n};\n","/**\n * @returns {{init: (el: HTMLVideoElement|null) => void, remove: () => void}}\n */\nconst handle = () => {\n let supposedCurrentTime = 0;\n let video = null;\n\n const onSeeking = () => {\n // guard against infinite recursion:\n // user seeks, seeking is fired, currentTime is modified, seeking is fired, current time is modified, ....\n if (Math.abs(video.currentTime - supposedCurrentTime) > 0.01) {\n video.currentTime = supposedCurrentTime;\n }\n };\n\n const onTimeUpdate = () => {\n if (!video.seeking) {\n supposedCurrentTime = video.currentTime;\n }\n };\n\n /**\n * @param {HTMLVideoElement|null} videoElement\n */\n const init = (videoElement) => {\n video = videoElement;\n\n if (video) {\n // prevent user from seeking\n video.addEventListener('seeking', onSeeking);\n video.addEventListener('timeupdate', onTimeUpdate);\n }\n };\n\n const remove = () => {\n if (video) {\n video.removeEventListener('seeking', onSeeking);\n video.removeEventListener('timeupdate', onTimeUpdate);\n }\n };\n\n return {\n init, remove\n };\n};\n\n/**\n * @param {SvpPlayer} svpPlayer\n */\nconst load = (svpPlayer) => {\n const handler = handle();\n\n /**\n * Get video tag from SVP Player\n * Use class selector to avoid grabbing preview or homad video elements\n *\n * @param {Player} player\n * @returns {Element|null}\n */\n const getVideo = (player) => player.getContainer().querySelector('video.jw-video');\n\n /**\n * Add prevent seeking handler for every adslot\n */\n const onAdSlotStart = () => {\n handler.init(getVideo(svpPlayer));\n };\n\n /**\n * Remove it when ad completes\n */\n const onAdSlotComplete = () => {\n handler.remove();\n };\n\n svpPlayer.on('adSlotStart', onAdSlotStart);\n svpPlayer.on('adError adSlotComplete', onAdSlotComplete);\n};\n\nexport { handle };\nexport default load;\n","/* eslint-disable no-multi-assign */\n\nconst loadedStylesheets = [];\n\n/**\n * @param {string} href\n * @param {() => void} onSuccess\n * @param {() => void} onError\n */\n// eslint-disable-next-line consistent-return\nfunction loadStylesheet(href, onSuccess, onError) {\n if (loadedStylesheets.indexOf(href) > -1) {\n return onSuccess();\n }\n\n const callback = onSuccess || function () {};\n const head = document.getElementsByTagName('head')[0];\n const link = document.createElement('link');\n\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = href;\n\n let done = false;\n\n link.onreadystatechange = link.onload = function() {\n if (!done && (!this.readyState\n || this.readyState === 'loaded' || this.readyState === 'complete')) {\n done = true;\n callback();\n\n // Handle memory leak in IE\n link.onload = link.onreadystatechange = null;\n }\n };\n\n link.onerror = function () {\n loadedStylesheets.splice(loadedStylesheets.indexOf(href), 1);\n onError();\n };\n\n loadedStylesheets.push(href);\n head.appendChild(link);\n}\n\n/**\n * @param {string} path\n */\nexport default (path) => new Promise((resolve, reject) => loadStylesheet(path, resolve, reject));\n","/**\n * @param {HTMLElement} container\n * @return {Promise}\n */\nconst waitForControls = (container) => new Promise((resolve) => {\n const checkIfControlsLoaded = () => {\n const hasControlsLoaded = container.querySelector('.jw-controlbar');\n\n if (hasControlsLoaded) {\n resolve();\n } else {\n window.requestAnimationFrame(checkIfControlsLoaded);\n }\n };\n\n window.requestAnimationFrame(checkIfControlsLoaded);\n});\n\n/**\n * If jwplayer chooses to use bundle without embedded controls, it can load them asynchronously later,\n * in that case, we must ensure their presence when e.g. resolving audio skin.\n *\n * @param {HTMLElement} container\n * @return {Promise}\n */\nexport const ensureIfControlsLoaded = async (container) => {\n const controlsLoaded = Boolean(container.querySelector('.jw-controlbar'));\n\n if (controlsLoaded) {\n return;\n }\n\n await waitForControls(container);\n};\n","import logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport { forward30Icon, playbackRateIcon } from 'icons/audio';\nimport { ensureIfControlsLoaded } from './jw-controls';\n\nconst DEFAULT_USE_AUDIO_SKIN = true;\n\nconst CN_FORWARD_BUTTON = 'jw-icon-forward';\nconst CN_DURATION_INFO = 'svp-duration';\nconst CN_PLAYBACK_RATE = 'svp-playback-rate';\n\nconst PLAYBACK_RATES = [1.0, 1.2, 1.5, 1.7, 2.0];\n\n/** {string} An icon with proper class names */\nconst forwardIcon = forward30Icon.replace(' {\n const position = jwPlayer.getPosition();\n const duration = jwPlayer.getDuration();\n svpPlayer.seek(Math.min(duration, position + 30));\n };\n\n const changePlaybackRate = () => {\n const rate = jwPlayer.getPlaybackRate();\n const nextRateIndex = PLAYBACK_RATES.findIndex((currentRate) => currentRate === rate);\n jwPlayer.setPlaybackRate(PLAYBACK_RATES[nextRateIndex >= PLAYBACK_RATES.length - 1 ? 0 : nextRateIndex + 1]);\n };\n\n svpPlayer.on('playbackRateChanged', ({ playbackRate }) => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n const container = svpPlayer.getContainer();\n const playbackRateButtonText = container.querySelector(`.jw-controlbar .${CN_PLAYBACK_RATE} text`);\n playbackRateButtonText.textContent = playbackRate.toFixed(1);\n });\n\n svpPlayer.on('playlistItem', async () => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n const container = svpPlayer.getContainer();\n const stream = svpPlayer.getStream();\n const isAudio = stream.isAudio();\n const duration = stream.getDuration();\n const forwardTooltip = translate.forward;\n\n const addOrRemoveClass = isAudio ? utils.addClass : utils.removeClass;\n addOrRemoveClass(container, 'svp-flag-media-audio');\n\n await ensureIfControlsLoaded(container);\n\n const displayControl = container.querySelector('.jw-display-icon-display .jw-icon-display');\n const cover = container.querySelector('.jw-preview .svp-cover');\n let forwardButton = container.querySelector(`.jw-controlbar .${CN_FORWARD_BUTTON}`);\n let durationInfo = container.querySelector(`.jw-title .${CN_DURATION_INFO}`);\n let playbackRateButton = container.querySelector(`.jw-controlbar .${CN_PLAYBACK_RATE}`);\n\n if (!cover) {\n container.querySelector('.jw-preview').appendChild(\n utils.createNode('
')\n );\n }\n\n if (!forwardButton) {\n jwPlayer.addButton(forwardIcon, forwardTooltip, seekForward, 'forward', CN_FORWARD_BUTTON);\n forwardButton = container.querySelector(`.jw-controlbar .${CN_FORWARD_BUTTON}`);\n }\n\n if (!durationInfo) {\n const title = container.querySelector('.jw-title');\n durationInfo = utils.createNode(`
`);\n title.appendChild(durationInfo);\n }\n\n if (!playbackRateButton) {\n jwPlayer.addButton(playbackRateIcon, '', changePlaybackRate, 'playback-rate', CN_PLAYBACK_RATE);\n const playbackRateButtonText = container.querySelector(`.jw-controlbar .${CN_PLAYBACK_RATE} text`);\n playbackRateButtonText.textContent = jwPlayer.getPlaybackRate().toFixed(1);\n\n playbackRateButton = container.querySelector(`.jw-controlbar .${CN_PLAYBACK_RATE}`);\n }\n\n const displayStyle = isAudio ? null : 'none';\n displayControl.setAttribute('aria-label', isAudio ? translate.listen : translate.playback);\n forwardButton.style.display = displayStyle;\n durationInfo.style.display = displayStyle;\n playbackRateButton.style.display = displayStyle;\n durationInfo.innerText = isAudio ? timeToText(duration, translate) : '';\n });\n}\n","import utils from 'utils/utils';\nimport * as icons from 'icons';\nimport * as audioIcons from 'icons/audio';\n\n/** @type {object} */\nconst iconsMap = {\n '.jw-svg-icon-play': icons.play,\n '.jw-svg-icon-pause': icons.pause,\n '.jw-skip-icon .jw-svg-icon-next': icons.chevronRight,\n '.jw-svg-icon-settings': icons.settings,\n '.jw-svg-icon-sharing': icons.share,\n\n '.jw-svg-icon-cc-on': icons.captions,\n '.jw-svg-icon-cc-off': icons.captions,\n\n '.jw-svg-icon-volume-0': icons.audioMuted,\n '.jw-svg-icon-volume-50': icons.audioHalf,\n '.jw-svg-icon-volume-100': icons.audio,\n\n '.jw-svg-icon-fullscreen-on': icons.fullscreenOn,\n '.jw-svg-icon-fullscreen-off': icons.fullscreenOff,\n\n info: icons.info\n};\n\n/** @type {object} */\nconst audioIconsMap = Object.freeze({\n '.jw-svg-icon-play': audioIcons.playIcon,\n '.jw-svg-icon-pause': audioIcons.pauseIcon,\n '.jw-svg-icon-replay': audioIcons.replayIcon,\n '.jw-svg-icon-rewind': audioIcons.rewind10Icon,\n\n '.jw-svg-icon-volume-0': audioIcons.audioOffIcon,\n '.jw-svg-icon-volume-50': audioIcons.audioHalfIcon,\n '.jw-svg-icon-volume-100': audioIcons.audioOnIcon\n});\n\n/**\n * @param {string} name\n */\nexport function getIcon(name) {\n return iconsMap[name];\n}\n\n/**\n * @param withAudioIcons\n * @return {object}\n */\nfunction getReplaceableIconsMap(withAudioIcons) {\n if (!withAudioIcons) {\n return iconsMap;\n }\n\n return utils.merge(iconsMap, audioIconsMap);\n}\n\n/**\n * @param {PlayerModel} svpPlayer\n */\nexport default function loadIcons(svpPlayer) {\n const jwPlayer = svpPlayer.player;\n const stream = svpPlayer.getStream();\n const isAudioStream = stream ? stream.isAudio() : false;\n const replaceableIconsMap = getReplaceableIconsMap(isAudioStream);\n\n jwPlayer.once('playlist', () => {\n const container = svpPlayer.getContainer();\n\n utils.each(replaceableIconsMap, (customIcon, selector) => {\n const replaceableIcons = Array.prototype.slice.call(container.querySelectorAll(selector));\n\n if (!replaceableIcons.length) {\n return;\n }\n\n utils.each(replaceableIcons, (replaceableIcon) => {\n if (!replaceableIcon) {\n return;\n }\n\n const svpIcon = utils.createNode(customIcon);\n svpIcon.setAttribute('class', replaceableIcon.getAttribute('class'));\n replaceableIcon.parentNode.replaceChild(svpIcon, replaceableIcon);\n });\n });\n });\n}\n","import { ensureIfControlsLoaded } from './jw-controls';\n\nconst submenuHandler = async (container) => {\n await ensureIfControlsLoaded(container);\n\n container.querySelector('.jw-controlbar .jw-button-container').addEventListener('click', (event) => {\n const { target } = event;\n\n // eslint-disable-next-line no-console\n if (target.classList.contains('jw-settings-submenu-button')\n || target.classList.contains('jw-settings-sharing')) {\n const submenu = container.querySelector('.jw-settings-menu');\n\n // eslint-disable-next-line max-len\n const right = Math.round(\n (container.offsetWidth - (target.offsetLeft + target.offsetWidth / 2)) - submenu.offsetWidth / 2\n );\n\n submenu.style.right = `${right}px`;\n }\n });\n};\n\nexport default (svpPlayer) => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n svpPlayer.on('ready', () => submenuHandler(svpPlayer.getContainer()));\n};\n","import { copyToClipboard } from 'utils/clipboard';\n\nexport default (svpPlayer, { icon }) => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n let isLoaded = false;\n\n svpPlayer.once('ready', () => {\n const container = svpPlayer.getContainer();\n\n container.addEventListener('contextmenu', () => {\n if (isLoaded === false) {\n const item = container.querySelectorAll('.jw-rightclick-list .jw-rightclick-item')[0];\n if (!item) {\n return;\n }\n\n item.classList.add('svp-config-link');\n\n const infoNode = document.createElement('span');\n infoNode.innerHTML = icon;\n infoNode.classList.add('jw-icon', 'svp-config-info');\n infoNode.dataset.tip = 'Click to copy';\n\n item.appendChild(infoNode);\n\n infoNode.addEventListener('click', async () => {\n const config = svpPlayer.config.dump();\n\n infoNode.classList.add('svp-link-tip');\n infoNode.dataset.tip = 'Copied';\n\n copyToClipboard(config);\n\n setTimeout(() => {\n infoNode.classList.remove('svp-link-tip');\n }, 300);\n }, false);\n\n isLoaded = true;\n }\n }, false);\n });\n};\n","/**\n * Audio video switching button\n *\n */\nconst copyToClipboard = (data) => {\n const el = document.createElement('textarea');\n el.value = data;\n el.setAttribute('readonly', '');\n el.style.position = 'absolute';\n el.style.left = '-9999px';\n document.body.appendChild(el);\n el.focus();\n el.select();\n\n try {\n document.execCommand('copy');\n } catch (err) {\n console.log('Unable to copy');\n }\n\n document.body.removeChild(el);\n};\n\n\nexport {\n copyToClipboard\n};\n","import { getConfig } from '../config/sharing';\n\nconst FACEBOOK_SHARE_URL = 'http://www.facebook.com/sharer/sharer.php?u=';\nconst TWITTER_SHARE_URL = 'https://twitter.com/intent/tweet?url=';\n\n/**\n * Check if link uses JW MEDIAID replacement\n * @param link\n * @return {*|boolean}\n */\nconst hasMediaId = (link) => link && link.indexOf('MEDIAID') > -1;\n\n/**\n * Create sharing url to services like twitter or facebook\n *\n * @param root\n * @param link\n * @return {string}\n */\nconst getSharingLink = (root, link = window.location.href) => `${root}${encodeURIComponent(link)}`;\n\n/**\n * Update node element only if exists and value is correctly set\n * @param el\n * @param value\n */\nconst updateElement = (el, value) => {\n if (el && value) {\n el.value = value;\n }\n};\n\n/**\n * Replace JW Sharing button event listener\n *\n * @param sourceEl\n * @param link\n */\nconst replaceElement = (sourceEl, link) => {\n if (sourceEl) {\n const newEl = sourceEl.cloneNode(true);\n sourceEl.parentNode.replaceChild(newEl, sourceEl);\n\n newEl.addEventListener('click', () => {\n window.open(link, '_blank');\n }, true);\n }\n};\n\n/**\n * Update JW sharing box to work with our playnext\n *\n * @param container\n * @param stream\n * @param options\n */\nconst updateSharingBox = (container, stream, options) => {\n const { link, code } = getConfig({\n stream,\n options\n }) || { };\n\n // mediaid is supported natively so we do not touch anything when it's passed\n if (code && hasMediaId(code) === false) {\n updateElement(\n container.querySelector('.jw-sharing-copy[aria-label=embed] .jw-sharing-textarea'),\n code\n );\n }\n\n // link can be undefined\n if (link && hasMediaId(link) === false) {\n updateElement(\n container.querySelector('.jw-sharing-copy[aria-label=link] .jw-sharing-textarea'),\n link\n );\n\n // this is tricky way to replace JW sharing buttons\n // facebook and twitter are replaced with custom sharing elements\n // this allows dynamic configuration via function\n replaceElement(\n container.querySelector('.jw-sharing-link[aria-label=facebook]'),\n getSharingLink(FACEBOOK_SHARE_URL, link)\n );\n replaceElement(\n container.querySelector('.jw-sharing-link[aria-label=twitter]'),\n getSharingLink(TWITTER_SHARE_URL, link)\n );\n }\n};\n\nexport default (svpPlayer) => {\n svpPlayer.on('initialPlay', () => updateSharingBox(\n svpPlayer.getContainer(),\n svpPlayer.getStream(),\n svpPlayer.config.get('sharing')\n ));\n};\n","import utils from 'utils/utils';\nimport { APPNEXUS_PROVIDER_ID } from 'player/services/api';\n\nconst APPNEXUS_CLASS_NAME = 'svp-appnxs';\nconst SVP_FLAG_STOPPED = 'svp-flag-stopped';\n\nconst handleAppnexusClass = (container, vendor) => {\n // handle ads only playback\n // class name is scrambled to avoid adblockers\n if (vendor === APPNEXUS_PROVIDER_ID) {\n utils.addClass(container, APPNEXUS_CLASS_NAME);\n } else {\n utils.removeClass(container, APPNEXUS_CLASS_NAME);\n }\n};\n\nexport {\n APPNEXUS_CLASS_NAME,\n SVP_FLAG_STOPPED,\n handleAppnexusClass\n};\n\nexport default function (svpPlayerModel) {\n svpPlayerModel.on('playlistItem', () => {\n const container = svpPlayerModel.getContainer();\n\n handleAppnexusClass(\n container,\n svpPlayerModel.getStream().getVendor()\n );\n\n container.classList.remove(SVP_FLAG_STOPPED);\n });\n\n svpPlayerModel.on('complete', (reason) => {\n const container = svpPlayerModel.getContainer();\n\n if (reason === 'stop') {\n container.classList.add(SVP_FLAG_STOPPED);\n }\n });\n}\n","const getLevelSettingsIcon = (container) => container.querySelector('.jw-icon-settings');\n\nconst handleLevelSettingsIcon = (data, icon) => {\n if (icon) {\n icon.style.display = '';\n\n // hide settings icon when there is only one level available\n // usually this is a case for iOS or when hls has limited bitrate\n if (data && data.levels && data.levels.length === 1) {\n icon.style.display = 'none';\n }\n }\n};\n\nexport default (svpPlayer) => {\n svpPlayer.on('playlistItem', function () {\n this.listenToOnce(\n svpPlayer.player,\n 'levels',\n (levels) => handleLevelSettingsIcon(levels, getLevelSettingsIcon(svpPlayer.getContainer()))\n );\n }, this);\n};\n","/**\n * @param {PlayerModel & Eventable} svpPlayerModel\n * @returns {HTMLDivElement}\n */\nfunction getTitleNode(svpPlayerModel) {\n const container = svpPlayerModel.getContainer();\n return container.getElementsByClassName('jw-nextup-title')[0];\n}\n\n/**\n * @param {PlayerModel & Eventable} svpPlayerModel\n */\nexport default function (svpPlayerModel) {\n const { player: jwPlayer } = svpPlayerModel;\n\n jwPlayer.on('nextShown', (playlistItem) => {\n const nextUpTitle = getTitleNode(svpPlayerModel);\n nextUpTitle.innerHTML = playlistItem.itemsShown[0].svp.stream.get('title');\n });\n\n jwPlayer.on('nextAutoAdvance', () => {\n const nextUpTitle = getTitleNode(svpPlayerModel);\n nextUpTitle.innerHTML = '';\n });\n\n jwPlayer.on('nextClick', () => {\n const nextUpTitle = getTitleNode(svpPlayerModel);\n nextUpTitle.innerHTML = '';\n });\n}\n","import styleLoader from 'utils/style-loader';\n\nimport audioSkinResolver from './skin/audioSkinResolver';\nimport loadIcons, { getIcon } from './skin/icons-loader';\nimport settingsMenu from './skin/settings-menu';\nimport configButton from './skin/config-button';\nimport sharingBox from './skin/sharing-box';\nimport { ttsSkinResolver } from './skin/tts-skin';\n\nimport containerClass from './skin/container-class';\nimport levelsIcon from './skin/levels-icon';\nimport nextUp from './skin/nextUp';\n\n/**\n * @param {object} jwConfig\n * @param {function} loader\n * @return {object}\n */\nexport function skinLoader(jwConfig, loader = styleLoader) {\n // disable multiple loading of JW skin\n if (jwConfig.skin && jwConfig.skin.url) {\n loader(jwConfig.skin.url);\n\n if (jwConfig.skin.name) {\n jwConfig.skin = {\n name: jwConfig.skin.name\n };\n } else {\n delete jwConfig.skin;\n }\n }\n\n return jwConfig;\n}\n\n/**\n * Load SVP Skin\n *\n * @param {PlayerModel} svpPlayerModel\n */\nexport default function svpSkin(svpPlayerModel) {\n ttsSkinResolver(svpPlayerModel);\n audioSkinResolver(svpPlayerModel);\n settingsMenu(svpPlayerModel);\n configButton(svpPlayerModel, {\n icon: getIcon('info')\n });\n loadIcons(svpPlayerModel);\n sharingBox(svpPlayerModel);\n containerClass(svpPlayerModel);\n levelsIcon(svpPlayerModel);\n nextUp(svpPlayerModel);\n}\n","import utils from 'utils/utils';\nimport device from 'utils/device';\nimport logger from 'utils/logger';\nimport autoplay from './config/autoplay';\nimport appnexus from './ads/appnexus';\nimport preventAdSeeking from './ads/prevent-seeking';\n\nimport youbora from './youbora';\nimport svpSkin, { skinLoader } from './skin';\n\n/**\n * TODO: Incomplete type?\n * @typedef AdBreak\n * @prtoperty {string} type\n * @property {number} offset\n * @property {Object} vmap\n */\n\n/**\n * @param {Config} config\n */\nconst PlayerModel = function (config) {\n /**\n * JW Player instance\n * @type {JWPlayer}\n */\n this.player = null;\n /**\n * @type {Stream}\n */\n this.stream = null;\n /**\n * @type {Config}\n */\n this.config = config;\n\n this.isInitalized = false;\n\n /**\n * Indicates whenever stream was was stopped\n * @type {boolean}\n */\n this.isStopped = false;\n\n /**\n * Current playlist item\n *\n * @type {PlaylistItem|null}\n */\n this.playlistItem = null;\n\n /**\n * Current time holder for seek and seeked events\n * Fix for JW getPosition bug\n * @type {number|null}\n */\n this.currentTime = null;\n\n /**\n * Store an asset with playlist to allow load pulse data properly on replay whole playlist\n * @type {Asset|null}\n */\n this.masterAsset = null;\n\n /**\n * Indicates if ads are currently playing\n * @type {boolean}\n */\n this.adPlaying = false;\n\n /**\n * Adposition\n *\n * @type {null} preroll|midroll|postroll\n */\n this.adPosition = null;\n\n /**\n * Ad Breaks - stores the list of all ad breaks\n *\n * @type {AdBreak[]}\n */\n this.adBreaks = [];\n};\n\n/**\n * Forward JW Events without any change of them as they fits our needs\n *\n * List of proxied events\n * 'play', 'pause'\n *\n * @param {string} event\n */\nfunction forwardEvent(event) {\n this.listenTo(this.player, event, this.trigger.bind(this, event));\n}\n\n/**\n * Simple proxy for JW Methods\n *\n * @param {string} method\n * @returns {Function}\n */\nfunction bindJwMethod(method) {\n return function () {\n const args = Array.prototype.slice.call(arguments);\n\n if (!this.player) {\n // eslint-disable-next-line no-console\n console.warn(`Method ${method} called before player has been initialised`);\n return null;\n }\n\n return this.player[method].apply(this, args);\n };\n}\n\n/**\n * Proxy methods from JW\n * @param {string[]} methods\n * @returns {Record}\n */\nfunction forwardMethods(methods) {\n const forwardedMethods = {};\n\n utils.each(methods, function (method) {\n forwardedMethods[method] = bindJwMethod.call(this, method);\n }, this);\n\n return forwardedMethods;\n}\n\n/**\n * @param {'pre'|'mid'|'post'} slotId\n * @returns {'preroll'|'midroll'|'postroll'}\n */\nfunction getAdPosition(slotId) {\n const slotKeys = { pre: 'preroll', mid: 'midroll', post: 'postroll' };\n\n return slotKeys[slotId];\n}\n\n/**\n * @typedef AdData\n * @property {number} sequence\n * @property {number} count\n * @property {Object} meta\n */\n\n/**\n * Parse adresponse for each adslot\n *\n * @param {{response?: XMLDocument}} data\n * @returns {AdData & { source: string; raw?: Element }}\n */\nfunction parseAdData(data) {\n const { sequence } = data;\n const xml = data && data.response;\n\n let source = 'WRAPPER';\n let adSelector = 'Ad';\n let adData = null;\n\n if (xml) {\n // only when additional data is given we set source to appnexus\n if (xml.URL === data.tag) {\n source = 'INLINE';\n adSelector = `Ad[sequence=\"${sequence}\"]`;\n }\n\n adData = Array.prototype.slice.call(xml.querySelectorAll(adSelector));\n // get first element if available\n adData = adData && adData[0] ? adData[0] : null;\n }\n\n return {\n sequence: sequence,\n count: data.podcount,\n raw: adData,\n source: source,\n meta: data\n };\n}\n\n/**\n * Initialize playback end method\n * Clear after each completion of stream or playbackEnd reached\n *\n * @param {number} playbackEnd\n */\nfunction onPlaybackEndAvailable(playbackEnd) {\n const onTime = (position) => {\n if (position > playbackEnd) { //\n this.trigger('playbackEnd', Math.round(position));\n }\n };\n\n this.on('time', onTime);\n\n this.once('playbackEnd complete', function () {\n this.off('time', onTime);\n });\n}\n\n/**\n * Adjusts player volume to 100% for audio assets under mobile devices or text to speech assets\n * @this {PlayerModel}\n */\nfunction adjustAudioVolumeOnMobile() {\n const isTextSpeech = this.config.shouldApplyTextToSpeechSkin();\n const isMobileAudio = device.isMobile() && this.stream.isAudio();\n if ((isTextSpeech || isMobileAudio) && !this.player.getMute()) {\n this.player.setVolume(100);\n }\n}\n\n/**\n * Extended ready event with info about device autoplay ability\n * @param {*} options\n * @param {*} eventData\n */\nfunction onReady(options, eventData) {\n this.trigger('ready', utils.extend(options, eventData));\n\n adjustAudioVolumeOnMobile.call(this);\n}\n\nPlayerModel.prototype = {\n initialize() {\n this.player = jwplayer(this.config.get('node'));\n this.trigger('initialize');\n },\n\n setup() {\n this.initialize();\n\n // player could not be setup\n if (!this.player.setup) {\n // eslint-disable-next-line no-console\n console.error(`SVP Player initialization error. DOM ${this.config.get('node')} not found`);\n return;\n }\n\n this.getConfig().then((config) => {\n // speedup lookup\n const { player } = this;\n\n // load youbora only for non-mock streams and 1% traffic\n let youboraRatio = Math.random() < 0.01;\n player.setup(config);\n\n svpSkin(this);\n preventAdSeeking(this);\n\n // set 1% of views for muted autoplayed videos\n if (player.getMute() === true && (config.autostart === true || config.autostart === 'viewable')) {\n youboraRatio = Math.random() < 0.005;\n }\n\n if (this.stream && !this.stream.isMock() && !this.config.isPreviewMode()\n && (youboraRatio || this.stream.hasAccess() || youbora.forceLoad)) {\n youbora.initialize(this.player, {\n accountCode: 'schibsted',\n enableAnalytics: true\n });\n }\n logger('JW').log('config', config);\n\n // forward native JW events without changing their behaviour\n utils.each([\n 'seek', 'displayClick', 'captionsChanged', 'adPause', 'adPlay', 'autostartNotAllowed', 'adClick',\n 'fullscreen', 'volume', 'mute', 'nextShown', 'nextAutoAdvance', 'nextClick', 'relatedReady',\n 'playlistComplete', 'playbackRateChanged', 'cast'\n ], forwardEvent, this);\n\n this.listenTo(player, 'error setupError', this.onError, this);\n this.listenTo(player, 'playlistItem', this.onPlaylistItemLoad, this);\n\n this.listenTo(player, 'play', this.onPlay, this);\n this.listenTo(player, 'pause', this.onPause, this);\n this.listenTo(player, 'complete', this.onComplete, this);\n this.listenTo(player, 'ready', onReady.bind(this, {\n canAutoplay: autoplay.canAutoplay(config)\n }));\n\n this.listenTo(player, 'mute', () => {\n adjustAudioVolumeOnMobile.call(this);\n });\n\n this.listenTo(player, 'time', this.onTime, this);\n this.listenTo(player, 'viewable', this.onViewable, this);\n this.listenTo(player, 'autostartNotAllowed', this.onAutostartNotAllowed, this);\n\n this.listenTo(player, 'meta', this.onMeta, this);\n this.listenTo(player, 'metadataCueParsed', this.onMetadataCueParsed, this);\n\n this.listenTo(player, 'seek', function (data) {\n this.currentTime = data.offset;\n }, this);\n this.listenTo(player, 'seeked', function () {\n this.trigger('seeked', this.currentTime);\n // clearing has to occur after seekend event as getCurrentTime needs it\n this.currentTime = null;\n }, this);\n\n this.once('initialPlay', function () {\n this.listenToOnce(player, 'captionsList', function () {\n this.trigger('captionsList', this.getCaptionsList());\n }, this);\n }, this);\n\n this.on('initialPlay', () => {\n this.isStopped = false;\n });\n\n this.listenTo(player, 'adImpression', function (data) {\n if (data && data.adposition) {\n this.adPosition = getAdPosition(data.adposition);\n }\n\n if (this.adPlaying === false) {\n this.trigger('adSlotStart', {\n position: this.adPosition,\n response: data && data.response,\n meta: data\n });\n\n this.adPlaying = true;\n }\n\n this.trigger('adStarted', {\n position: this.adPosition,\n response: data && data.response,\n meta: data\n });\n\n if (data && data.response) {\n this.trigger('adData', parseAdData(data));\n }\n }, this);\n\n this.listenTo(player, 'adError', function (data) {\n if (data && data.adposition) {\n this.adPosition = getAdPosition(data.adposition);\n }\n }, this);\n\n this.listenTo(player, 'adTime', function (data) {\n if (data.position && data.duration) {\n this.trigger('adProgress', data.position, data.duration);\n }\n }, this);\n\n this.on('adSlotStart', function () {\n this.listenToOnce(player, 'adBreakEnd', function () {\n if (this.adPlaying === true) {\n this.trigger('adSlotComplete', {\n position: this.adPosition\n });\n\n this.adPlaying = false;\n }\n }, this);\n }, this);\n\n this.listenTo(player, 'adSkipped', function () {\n this.trigger('adSkipped');\n }, this);\n\n this.listenTo(player, 'adComplete', function () {\n this.trigger('adFinished');\n }, this);\n\n this.listenTo(player, 'adSchedule', function (data) {\n this.adBreaks = data.adbreaks || [];\n }, this);\n\n this.listenTo(player, 'adBreakEnd', function ({ offset }) {\n // find the next ad with the distance less or equal 1s to the current one\n const nextAd = this.adBreaks.find((ad) => ad.offset > offset && ad.offset - offset <= 1);\n if (nextAd) {\n // workaround: using setTimeout to make seek work\n setTimeout(() => this.player.seek(nextAd.offset));\n }\n }, this);\n\n this.listenTo(player, 'adLoadedXML', function (data) {\n if (data && data.xml) {\n this.trigger('adLoadedXML', data.xml);\n }\n }, this);\n\n this.isInitalized = true;\n\n logger('JW').log((log) => {\n this.listenTo(player, 'all', function (event) {\n if (['bufferChange'].indexOf(event) < 0) {\n log(event, Array.prototype.slice.call(arguments, 1));\n }\n });\n });\n\n this.trigger('setup');\n });\n },\n\n /**\n * @param {Stream} stream\n * @param {boolean} [disableAutoplay]\n */\n playNext(stream, { disableAutoplay }) {\n // clear time\n this.stream = stream;\n\n this.complete('playNext');\n\n if (!this.isInitalized) {\n this.setup();\n } else {\n this.getConfig(stream).then((config) => {\n this.player.load(config.playlist);\n\n if (disableAutoplay) {\n return;\n }\n\n // stream is not available yet, display countdown\n if (stream.getTimeToStart() < 0) {\n // enable autoplay if stream is not available\n this.player.play(true);\n } else {\n this.player.stop();\n }\n });\n }\n },\n\n /**\n * @param {Asset|null} [asset=null]\n */\n setMasterAsset(asset = null) {\n this.masterAsset = asset;\n },\n\n /**\n * Checks if the current playlist contains a given asset\n * @param {number} assetId\n * @returns {boolean}\n */\n isAssetFromPlaylist(assetId) {\n return (\n this.masterAsset != null\n && (this.masterAsset.get('id') === assetId\n || this.masterAsset.get('playlist').some((assetData) => assetData.id === assetId))\n );\n },\n\n /**\n * Immediately completes currently playing stream\n */\n complete() {\n this.adPlaying = false;\n\n // trigger complete event only when stream is not finished to prevent double 'complete' event triggering\n if (this.getCurrentTime() > 0 && this.getCurrentTime() !== this.getDuration()) {\n this.trigger('complete');\n }\n },\n\n /**\n * Get DOM Node where player is inserted\n * @returns {HTMLElement}\n */\n getContainer() {\n return this.player.getContainer();\n },\n\n /**\n * @returns {jwplayer.JWPlayer}\n */\n getPlayer() {\n return this.player;\n },\n\n /**\n * Get playback volume\n * @returns {number}\n */\n getVolume() {\n return this.player.getVolume();\n },\n\n /**\n * Set playback volume\n * @param {number} volume\n */\n setVolume(volume) {\n this.player.setVolume(volume);\n },\n\n /**\n * Get mute flag\n * @returns {boolean}\n */\n getMute() {\n return this.player.getMute();\n },\n\n /**\n * Set mute param in player\n * @param {boolean} [value]\n */\n setMute(value) {\n this.player.setMute(value);\n },\n\n /**\n * Seek\n * @param {number} time\n */\n seek(time) {\n this.player.seek(time);\n },\n\n /**\n * Get player config. Method is asynchronous due to loading info from api\n *\n * @param {Stream} stream\n */\n getConfig(stream) {\n const nextStream = stream || this.getStream();\n\n return this.config\n .getJwConfig(nextStream)\n .then(skinLoader)\n .catch((reason) => {\n this.trigger('error', reason);\n });\n },\n\n /**\n * Set stream data\n *\n * @param {Stream} stream\n */\n setStream(stream) {\n this.stream = stream;\n },\n\n /**\n * Get current stream loaded with player\n *\n * @returns {Stream|null}\n */\n getStream() {\n return this.stream;\n },\n\n /**\n * Check is ad is playing or not\n * @returns {boolean}\n */\n isAdPlaying() {\n return this.adPlaying;\n },\n\n /**\n * Load given stream\n * Perform all required checks before stream playback\n *\n * @returns {Promise}\n */\n loadStream() {\n return new Promise((resolve) => {\n // for lazy loaded player\n if (!this.isInitalized) {\n this.setup();\n this.player.on('ready', resolve);\n } else {\n resolve();\n }\n });\n },\n\n /**\n * Play stream\n */\n play() {\n // ensure stream is loaded properly\n this.loadStream()\n .then(this.player.play.bind(this.player));\n },\n\n /**\n * Pause stream\n * @param force state\n */\n pause(force) {\n this.player.pause(force);\n },\n\n /**\n * Stop playback\n * @returns {Promise}\n */\n async stop() {\n // playlistitemId is set when first frame is shown\n // stop shouldn't change stream when it was not played\n if (this.isStopped === false) {\n this.trigger('complete', 'stop');\n\n const { playlist } = await this.getConfig();\n\n this.player.load(playlist);\n this.player.stop();\n\n // reset playlist item to allow replaying this stream\n this.playlistItem = null;\n\n this.isStopped = true;\n }\n },\n\n /**\n * Destroy the player instance, reset DOM, clean up listeners\n */\n remove() {\n this.trigger('remove');\n this.off();\n\n if (this.player) {\n this.pause(true);\n\n this.player.remove();\n this.player.off();\n }\n },\n\n /**\n * Get stream duration\n *\n * @returns {number}\n */\n getDuration() {\n const duration = this.player.getDuration();\n\n if (duration < 0) {\n return -duration;\n }\n\n return duration;\n },\n\n /**\n * Get current playback time\n *\n * @returns {number}\n */\n getCurrentTime() {\n let { currentTime } = this;\n\n if (currentTime) {\n return currentTime;\n }\n\n // player not initialized (error/geoblock)\n // return 0\n if (!this.player) {\n return 0;\n }\n\n currentTime = this.player.getPosition();\n\n if (currentTime < 0) {\n return (this.getDuration() + currentTime);\n }\n\n return this.player.getPosition();\n },\n\n /**\n * @returns {string}\n */\n getState() {\n if (this.isAdPlaying()) {\n return 'adPlaying';\n }\n\n return this.player.getState();\n },\n\n /**\n * @returns {boolean|undefined}\n */\n // eslint-disable-next-line consistent-return\n getAdBlock() {\n if (this.player) {\n return this.player.getAdBlock();\n }\n },\n\n /**\n * Get poster for current stream\n * Poster may be changed in config\n *\n * @param {Stream} stream\n * @param {HTMLElement} container\n * @returns {string|null}\n */\n getPoster(stream, container) {\n return this.config.getPoster(stream, container);\n },\n\n /**\n * Get list of captions extended by data from api\n *\n * @returns {{ id: string; label: string; language?: string; default?: boolean }[]}\n */\n getCaptionsList() {\n const playerCaptions = this.player.getCaptionsList();\n const captions = this.getStream().getCaptions();\n\n // merge player captions data with result from api\n utils.each(playerCaptions, (caption) => {\n utils.each(captions, (item) => {\n if (caption.id === item.url) {\n caption.language = item.language;\n caption.default = item.default;\n }\n });\n });\n\n return playerCaptions;\n },\n\n /**\n * Set current captions\n * @param {number|string} index string is language key, number is index in array\n */\n setCurrentCaptions(index) {\n let newIndex = index || 0;\n\n if (!utils.isNumber(index)) {\n utils.each(this.getCaptionsList(), (caption, captionsIndex) => {\n if (caption && caption.language === index) {\n newIndex = captionsIndex;\n }\n });\n\n // fallback to off in case index is not found in captions array\n if (!utils.isNumber(newIndex)) {\n newIndex = 0;\n }\n }\n\n // set captions in player\n this.player.setCurrentCaptions(newIndex);\n },\n\n /**\n * Handle all errors from player\n */\n onError(data) {\n logger('SVP').error(data);\n const { code } = data;\n const message = data.message ? data.message.toString() : '';\n\n /**\n * Some errors do not prevent playback to play\n * thus they should be omitted\n */\n const skipErrors = [\n 'Captions failed to load', // could not load\n 'Casting failed to load' // chrome disabled\n ];\n\n // skip errors\n if (skipErrors.indexOf(message) > -1) {\n return;\n }\n\n this.trigger('error', {\n message,\n code\n });\n },\n\n /**\n * Event triggered before first stream play\n * Useful for statistics\n * @param {PlaylistItem} playlistItem\n */\n onPlaylistItemLoad(playlistItem) {\n // cleanup any previous beforePlay event (playnext after countdown or error)\n this.stopListening(this.player, 'beforePlay');\n\n // trigger this event every time new playlist item is loaded\n this.listenToOnce(this.player, 'beforePlay', function () {\n if (this.stream.getTimeToStart() < 0) {\n this.trigger('initialPlay');\n }\n }, this);\n\n // ads should not if stream has future start time\n // attach event only for secure streams\n if (this.stream.isSecure()) {\n // reload playlist only if token expired\n // play method do this out of the box\n this.listenToOnce(this.player, 'displayClick', function () {\n if (!this.config.hasValidToken() && this.player.getState() !== 'playing') {\n this.play();\n }\n }, this);\n }\n\n this.trigger('playlistItem', playlistItem.item);\n\n // clear ad playing flag for current content\n // important when changing stream while adslot is playing\n this.adPlaying = false;\n\n this.listenToOnce(this.player, 'firstFrame', () => {\n this.playlistItemId = playlistItem.item.id;\n this.onFirstFrameLoad(this.playlistItemId);\n });\n\n this.playlistItem = playlistItem.item;\n\n // for streams which end time is not equal to video length\n const playbackEndTime = this.stream.getPlaybackTime('end');\n\n // attach playback listener\n if (playbackEndTime > 0) {\n onPlaybackEndAvailable.call(this, playbackEndTime);\n }\n },\n\n /**\n * Time\n *\n * @param {number} position - current playback time\n * @param {number} duration - current stream duration\n */\n onTime({ position, duration }) {\n if (position < 0) {\n this.trigger('time', -(duration - position), -duration);\n } else {\n this.trigger('time', position, duration);\n }\n },\n\n /**\n * Triggered on first frame of content playback - after ads\n * @param {number} playlistItemId\n */\n onFirstFrameLoad(playlistItemId) {\n // first play of stream\n const mediaType = this.stream.get('mediaType');\n const startTime = this.stream.getPlaybackTime('begin') || 0;\n\n /**\n * Remove \"jw-flag-media-audio\" class when media type is video\n * but was not recognized properly to fix poster image issues\n */\n if (mediaType === 'video') {\n utils.removeClass(this.getContainer(), 'jw-flag-media-audio');\n }\n\n this.once('time', () => {\n // check if currently set video id is the same as played one\n // it can happen when playnext is called before assetPlay\n if (playlistItemId === this.stream.getId()) {\n this.trigger('assetPlay', startTime);\n }\n });\n },\n\n onViewable(eventData) {\n const { viewable } = eventData;\n\n this.trigger('viewable', {\n viewable\n });\n },\n\n /**\n * @param {string} data.reason\n */\n onAutostartNotAllowed(data) {\n const { reason } = data;\n\n if (reason === 'autoplayDisabled') {\n this.player.setMute(false);\n }\n },\n\n /**\n * Schedule midroll to\n * @param {number} slotDuration\n * @param {number|'NOW'} startTime\n * @returns {Promise}\n */\n async createMidroll(slotDuration, startTime) {\n const midroll = appnexus.createMidroll({\n tag: await this.config.getLiveMidrollTag(slotDuration),\n startTime\n });\n\n const onTimeChange = () => midroll.setTime(this.player.getCurrentTime());\n\n midroll.onReady(() => {\n this.on('time', onTimeChange);\n // cleanup when stream has changed or finished\n this.on('complete', () => this.off('time', onTimeChange));\n });\n\n midroll.onEnter(function (adTag) {\n const position = -(Math.abs(this.player.getPosition()));\n this.off('time', onTimeChange);\n\n this.once('adSlotComplete', () => {\n this.listenToOnce(this.player, 'providerFirstFrame', () => {\n this.player.seek(position);\n });\n });\n\n this.player.playAd(adTag);\n }.bind(this));\n },\n\n /**\n * Handling midrolls with scte35 tags in HLS live\n * @param data\n */\n onMetadataCueParsed(data) {\n if (!this.stream.isLive()) {\n return;\n }\n\n const { tag, content, start } = data.metadata || {};\n\n if (tag === 'EXT-X-CUE-OUT') {\n this.createMidroll(parseInt(content, 10), start);\n } else if (tag === 'EXT-X-CUE-IN') {\n this.player.skipAd();\n }\n },\n\n /**\n * Handling midrolls in RTMP live streams\n * @param data\n */\n onMeta(data) {\n if (!this.stream.isLive()) {\n return;\n }\n\n const params = data.metadata && data.metadata.TXXX;\n\n if (params) {\n // Workaround for live midrolls SCTE-35 tags in Safari\n // @see https://github.schibsted.io/svp/platform/issues/328\n if (params.insertAd && device.isSafari()) {\n const duration = parseInt(params.insertAd, 10);\n this.createMidroll(duration, 'NOW');\n }\n\n // Workaround for live midrolls SCTE-35 tags in Safari\n // @see https://github.schibsted.io/svp/platform/issues/328\n if (params.cancelAd === 'now' && device.isSafari()) {\n this.player.skipAd();\n }\n }\n },\n\n onPlay(data) {\n this.trigger('play', {\n playReason: data.playReason\n });\n },\n onPause(data) {\n utils.removeClass(this.getContainer(), 'jw-state-buffering');\n\n this.trigger('pause', data);\n },\n\n /**\n * Correct event flow for end of streaming\n */\n onComplete() {\n // wait until postroll will finish\n this.trigger('complete');\n }\n};\n\n/**\n * Extend player with events\n * Add methods from JW which are used without any rewriting\n */\nutils.extend(PlayerModel.prototype, utils.Events, forwardMethods.call(PlayerModel.prototype, [\n 'getCurrentCaptions'\n]));\n\n/* jshint newcap: false */\nexport default PlayerModel;\n","import scriptLoader from 'utils/script-loader';\nimport logger from 'utils/logger';\nimport { createClass as createPluginClass } from 'player/plugins/model';\n\n/**\n * @type {Record}\n */\nconst plugins = {};\n\nconst Plugins = {\n /**\n * @param {PluginModel} plugin\n */\n register(plugin) {\n const name = plugin.getName();\n\n // register the same plugin only once\n if (!plugins[name]) {\n plugins[name] = createPluginClass(plugin);\n }\n },\n\n load(options) {\n // no plugins provided, complete immediately\n if (!options) {\n // timeout for proper event listener fire\n return Promise.resolve();\n }\n\n const scripts = Object.keys(options);\n\n // do not change this to an arrow function - it breaks iOS playback\n async function loadPlugin(pluginSrc) {\n try {\n await scriptLoader(pluginSrc);\n } catch (error) {\n logger().error(`An error occur while loading ${pluginSrc}`);\n }\n\n return pluginSrc;\n }\n\n return Promise.all(scripts.map(loadPlugin));\n },\n\n /**\n * @param {string} name\n * @returns {PluginModel|undefined}\n */\n get(name) {\n return plugins[name];\n }\n};\n\nexport default Plugins;\n","import utils from 'utils/utils';\nimport config from 'player/config';\nimport Provider from '../playback/provider';\nimport SvpPlugins from '../plugins';\n\nimport { onPlayerEvent } from './helpers';\n\n/**\n * @param {Object} options - Caution, param is bound in constructor\n * @param {Object} settings\n */\nexport function onceConfigReady(options, settings) {\n this.model = new Provider(this.config);\n\n // important listeners has to be attached before setup\n this.listenTo(this.model, 'all', onPlayerEvent, this);\n\n this.listenTo(this.model, 'play', function () {\n this.isCompleted = false;\n }, this);\n\n // turn on cachebreaker for preview mode\n if (settings && settings.preview === true) {\n config.api.cb = true;\n }\n\n // once per player instance error append stylesheet\n this.once('error', function () {\n utils.addStyleSheet(this.config.get('skin').url);\n }, this);\n\n Promise.all([\n new Promise((resolve) => {\n const handleReady = () => {\n resolve();\n this.off('assetError', handleError); // eslint-disable-line no-use-before-define\n };\n\n const handleError = (error) => {\n resolve(error);\n this.off('assetError', handleReady);\n };\n\n this.once('assetReady', handleReady);\n this.once('assetError', handleError);\n }),\n SvpPlugins.load(options.plugins)\n ]).then(([error]) => {\n utils.each(options.plugins, (pluginConfig, plugin) => {\n const Plugin = SvpPlugins.get(pluginConfig.name || plugin);\n\n if (Plugin) {\n // support for new loading method\n this.addPlugin(new Plugin(pluginConfig.config || pluginConfig));\n }\n });\n\n if (!error) {\n this.model.setup();\n }\n });\n\n // asset can be passed as id or an object\n this.setAsset((options.asset || options.id));\n}\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\nimport locale from './model/locale';\nimport Asset from './model/asset';\nimport Config from './playback/config';\nimport Domain from './model/domain';\nimport Recommended from './model/recommended';\nimport { APPNEXUS_PROVIDER_ID } from './services/api';\nimport assetService from './services/api/asset';\nimport PulseTracker from './plugins/pulse-stats/tracker';\n\nimport { onAssetError } from './events/error';\nimport { onAssetReady } from './events/asset';\nimport { onComplete } from './events/complete';\nimport { onceConfigReady } from './events/config';\nimport { destroyPlugin } from './events/helpers';\n\n/**\n * @constructor\n * @param {Config} configuration\n */\nconst Player = function (configuration) {\n const options = Object.assign({}, configuration);\n\n // sync browser time with server\n if (!options.serverTime) {\n ServerTime.fetch(config.time);\n }\n\n // Little bit of monkey patching\n config.api.vendor = options.vendor || 'vgtv';\n config.env = (config.env === 'production') ? 'production' : (options.env || config.env || 'production');\n\n // Restrict player on blacklisted domains\n if (Domain.isBlacklisted(options.vendor)) {\n return;\n }\n\n logger('SVP').log('config', utils.extend({}, options));\n\n /**\n * Allow to embed player without asset\n * This can be useful for preloading player\n * Appnexus vendor is for displaying ads only playback\n */\n if (options.vendor === APPNEXUS_PROVIDER_ID || options.id === -1 || (!options.id && !options.asset)) {\n options.asset = assetService.getMockAsset();\n delete options.id;\n }\n\n // load locales for player\n // norwegian by default\n if (typeof options.locale === 'string') {\n locale.setTranslations(config.translations(options.locale));\n }\n\n // bind player api to pass it as last argument in adn function\n if (options.adn) {\n options.adn.svpPlayer = this;\n }\n\n // create configuration for SVP player\n this.config = new Config();\n this.listenToOnce(this.config, 'ready', onceConfigReady, this);\n\n this.config.initialize(options);\n\n // set dynamic api url\n if (options.api) {\n config.api.url = options.api;\n }\n\n // set dynamic related api url\n if (options.relatedUrl) {\n config.api.relatedApiUrl = options.relatedUrl;\n }\n\n // allow to override token api url\n if (options.tokenUrl) {\n config.api.tokenUrl = options.tokenUrl;\n } else if (options.api) {\n config.api.tokenUrl = options.api.replace('api/v1/', 'token/v1/');\n }\n\n // allow to override thumbnails api url\n if (options.thumbnailsUrl) {\n config.api.thumbnailsUrl = options.thumbnailsUrl;\n } else if (options.api) {\n config.api.thumbnailsUrl = options.api.replace('api/v1', 'thumbnails/v1');\n }\n\n if (options.vmapUrl) {\n config.api.vmapUrl = options.vmapUrl;\n }\n\n /**\n * Available plugins\n * PausePlugin, EndposterPlugin, ChaptersPlugin, ContinuePlayingPlugin\n *\n * Plugins registered by default (can not be removed)\n * CountdownPlugin, AgeLimitPlugin\n * @type {Object}\n */\n this.plugins = {};\n\n /**\n * Check if stream has completed playback\n * @type {boolean}\n */\n this.isCompleted = false;\n\n this.isPlayNextAvailable = true;\n\n // fetch config for privileged settings to speedup setup\n if (options.settings) {\n Domain.fetch(options.vendor);\n }\n\n /**\n * Prefetch Pulse tracking library\n */\n if (options.pulse && options.pulse.provider) {\n PulseTracker.load();\n }\n\n logger('SVP').log(function (message) {\n this.on('all', function (event) {\n message(event, Array.prototype.slice.call(arguments, 1));\n });\n }.bind(this));\n};\n\n/**\n * Player public API\n */\nPlayer.prototype = {\n /**\n * Play\n * @param {number} position - seconds\n */\n play(position) {\n // stream will play only if publication date is valid\n const stream = this.model.getStream();\n if (stream.getTimeToStart() < 0 && !stream.isPast()) {\n if (position) {\n this.once('play', this.seek.bind(this, position));\n }\n\n this.model.play();\n }\n },\n\n /**\n * Pause playback\n * @param {boolean} [force] - toggle playback when param is omitted\n */\n pause(force) {\n // pause with force can start stream which is wrong\n if (this.model.getStream().getTimeToStart() < 0) {\n this.model.pause(!force);\n }\n },\n\n /**\n * Seek in seconds\n * @param {number} time\n */\n seek(time) {\n this.model.seek(time);\n },\n\n /**\n * Destroy the player instance, reset DOM, clean up listeners\n */\n remove() {\n utils.each(this.plugins, destroyPlugin, this);\n this.stopListening();\n\n if (this.model) {\n this.model.remove();\n }\n },\n\n /**\n * Play next asset by given id\n *\n * @param {number} id\n * @param {Object} [options]\n * @param {Object} [options.pulse]\n * @param {number} [options.time]\n * @param {boolean} [options.disableAutoplay]\n */\n playNext(id, options = {}) {\n const onNextAssetReady = function () {\n const stream = this.model.getStream();\n const { disableAutoplay, time } = options;\n\n if (time) {\n stream.set('playAhead', time);\n }\n\n // trick to avoid create of new stream as it's set in assetReady\n this.model.playNext(stream, { disableAutoplay });\n this.isPlayNextAvailable = true;\n }.bind(this);\n\n if (this.isPlayNextAvailable) {\n const reason = (options.pulse && options.pulse.playbackSource) || 'manualNext';\n // complete current stream\n onComplete.call(this, reason);\n\n // block multiple occurences\n this.isPlayNextAvailable = false;\n\n this.once('assetReady', onNextAssetReady, this);\n\n this.once('assetError', function () {\n if (this.model && this.model.player) {\n this.pause();\n }\n\n this.isPlayNextAvailable = true;\n this.off('assetReady', onNextAssetReady);\n }, this);\n\n // trigger play next always after complete to keep event order the same\n // for videos which completed or has been interrupted with play next\n this.trigger('playNext', id, options);\n this.setAsset(id);\n }\n },\n\n /**\n * Set playback volume\n *\n * @param {number} volume - number between 0 and 100\n */\n setVolume(volume) {\n this.model.setVolume(volume);\n },\n\n /**\n * Get playback volume\n * @returns {number}\n */\n getVolume() {\n return this.model.getVolume();\n },\n\n /**\n * Set mute value for playback\n * Toggling this param will preserve volume value\n *\n * @param {boolean} [value=true]\n */\n setMute(value = true) {\n this.model.setMute(value);\n },\n\n /**\n * Get playback muted state\n * @returns {boolean}\n */\n getMute() {\n return this.model.getMute();\n },\n\n /**\n * Get player state\n * @returns {string}\n */\n getState() {\n return this.model.getState();\n },\n\n /**\n * Get stream duration\n *\n * @returns {number}\n */\n getDuration() {\n return this.model.getDuration();\n },\n\n /**\n * Get current playback time\n * @returns {number}\n */\n getCurrentTime() {\n return this.model.getCurrentTime();\n },\n\n /**\n * Get current captions list\n * @returns {{ id: string; label: string; language?: string; default?: boolean }[]}\n */\n getCaptionsList() {\n return this.model.getCaptionsList();\n },\n\n /**\n * Get currently playing captions\n * @returns {number}\n */\n getCurrentCaptions() {\n return this.model.getCurrentCaptions();\n },\n\n /**\n * Set current captions by passing its index\n * Setting 0 will hide all captions\n * @param {number} index\n */\n setCurrentCaptions(index) {\n return this.model.setCurrentCaptions(index);\n },\n\n /**\n * Get Player DOM Node\n *\n * @returns {HTMLElement|null}\n */\n getContainer() {\n return this.model.getContainer();\n },\n\n /**\n * @returns {jwplayer.JWPlayer}\n */\n getJWPlayer() {\n return this.model.getPlayer();\n },\n\n getRawConfig() {\n return this.config.getRaw();\n },\n\n /**\n * Get current server time\n *\n * @return {number}\n */\n getServerTime() {\n return ServerTime.getTime();\n },\n\n /**\n * @returns {Promise}\n */\n stop() {\n return this.model.stop();\n },\n\n /**\n * Set asset resource\n * @param {Asset|number} asset - Asset model or stream id\n */\n async setAsset(asset) {\n // cleanup old asset\n if (this.asset) {\n this.stopListening(this.asset);\n this.asset.destroy();\n this.asset = null;\n }\n\n // change asset to object if it is a number\n if (utils.isNumber(asset)) {\n // eslint-disable-next-line no-param-reassign\n asset = {\n id: asset\n };\n }\n\n this.asset = (asset instanceof Asset) ? asset : new Asset(asset);\n\n // set vendor for player's default if nothing has been passed\n if (!this.asset.get('vendor')) {\n this.asset.set('vendor', this.config.get('vendor'));\n }\n\n // asset is ready if status field is in response\n if (this.asset.get('status')) {\n onAssetReady.call(this);\n } else {\n try {\n await this.asset.fetch();\n onAssetReady.call(this);\n } catch (error) {\n onAssetError.call(this, error);\n }\n }\n },\n\n /**\n * Get currently loaded asset\n * @returns {Asset|null}\n */\n getAsset() {\n return this.asset;\n },\n\n /**\n * Get next asset\n * @return {Promise}\n */\n async getNextAsset() {\n const { next } = this.config.getRecommended() || {};\n if (next === false) {\n return null;\n }\n\n const recommendedPlugin = this.getPlugin('RecommendedPlugin');\n if (!recommendedPlugin) {\n return null;\n }\n if (recommendedPlugin.nextAsset) {\n return recommendedPlugin.nextAsset;\n }\n\n const recommended = new Recommended({\n asset: this.getAsset()\n });\n const { nextAsset, source } = await recommended.getNextAsset(next);\n recommendedPlugin.nextAsset = nextAsset;\n recommendedPlugin.nextAssetSource = source;\n\n return recommendedPlugin.nextAsset;\n },\n\n /**\n * Add plugin to the player\n *\n * @param {PluginModel} plugin\n */\n addPlugin(plugin) {\n const proxyPluginEvent = function (event, ...args) {\n this.trigger(`${plugin.getName()}:${event}`, ...args);\n };\n\n plugin.setPlayer(this);\n this.listenTo(plugin, 'all', proxyPluginEvent, this);\n\n this.plugins[plugin.getName()] = plugin;\n },\n\n /**\n * Get plugin by name\n *\n * @param {string} plugin - name of the plugin\n * @returns {PluginModel|undefined}\n */\n getPlugin(plugin) {\n return this.plugins[plugin];\n }\n};\n\n/**\n * Checks if device can autoplay stream\n * @deprecated new autoplay policies require starting of video to detect if autoplay will work\n * @returns {boolean}\n */\nPlayer.canDeviceAutoplay = function () {\n // eslint-disable-next-line no-console\n if (console && console.warn) {\n // eslint-disable-next-line no-console\n console.warn('SVP Player SKD deprecation warning. '\n + 'Due to changes in browser policies, player will detect itself if it can autoplay.');\n }\n\n return utils.device.canAutoplay();\n};\n\nutils.extend(Player.prototype, utils.Events);\n\nexport default Player;\n","import config from 'player/config';\nimport Player from 'player/player';\nimport image from 'utils/image';\nimport utils from 'utils/utils';\nimport ServerTime from 'utils/server-time';\n\nimport locale from 'player/model/locale';\nimport Domain from 'player/model/domain';\n\nimport youbora from 'player/playback/youbora';\nimport SvpPlugins from './player/plugins';\n\nconst SVP = {};\nSVP.Player = Player;\nSVP.Player.Plugins = SvpPlugins;\nSVP.Player.version = config.version;\n\n// by default antiadblock is turned off\nObject.defineProperty(SVP.Player, 'defaults', {\n get() {\n // eslint-disable-next-line no-underscore-dangle\n return this.__defaults || {};\n },\n set(value) {\n // if params are not object then\n // override and force to object\n if (value !== Object(value)) {\n // eslint-disable-next-line no-param-reassign\n value = {};\n }\n\n Object.defineProperty(SVP.Player, '__defaults', {\n value: value,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n});\n\n/**\n * Load youbora plugin unless it is turn off in SVP.default\n * @type {boolean}\n */\nconst loadYoubora = (options) => {\n // youbora plugin can be disabled completely\n try {\n const forceLoad = localStorage.svpYoubora === 'true';\n if (!utils.device.isBot() && (forceLoad || options !== false)) {\n youbora.load(options, forceLoad);\n }\n } catch (e) {\n // could not load youbora plugin\n }\n};\n\nconst setLocale = (language = 'no') => {\n locale.setTranslations(config.translations(language));\n};\n\n/**\n * @param {Object} [options]\n * @param {Object} [options.serverTime]\n * @param {number} [options.serverTime.time]\n * @param {number} [options.serverTime.receivedAt]\n */\nconst preInitialize = (options) => {\n const { serverTime } = options || {};\n\n if (serverTime) {\n ServerTime.time = serverTime.time;\n ServerTime.responseTime = serverTime.receivedAt;\n }\n\n image.initialize(utils.extend(config.images, {\n getPixelRatio: utils.device.getPixelRatio\n }));\n\n Domain.initialize(window.location.hostname);\n};\n\nconst postInitialize = () => {\n // set locale for all players\n setLocale(SVP.Player.defaults.locale);\n\n loadYoubora(SVP.Player.defaults.youbora);\n};\n\nexport default SVP;\nexport { preInitialize, postInitialize };\n"],"sourceRoot":""}