{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./player/playback/config/status-codes.js","webpack:///./player/config/translations.js","webpack:///./player/config.js","webpack:///./player/config/jw-keys.js","webpack:///./player/config/production.js","webpack:///./utils/module-loader.js","webpack:///./utils/script-loader.js","webpack:///./icons/play.svg","webpack:///./icons/pause.svg","webpack:///./icons/audio.svg","webpack:///./icons/audio-muted.svg","webpack:///./icons/chevron-right.svg","webpack:///./icons/close.svg","webpack:///./icons/captions.svg","webpack:///./icons/error.svg","webpack:///./player/playback/ads/homad-lib.js","webpack:///./icons/audio-half.svg","webpack:///./icons/fullscreen-off.svg","webpack:///./icons/fullscreen-on.svg","webpack:///./icons/settings.svg","webpack:///./icons/share.svg","webpack:///./icons/info.svg","webpack:///./icons/av-button.svg","webpack:///./icons/defs.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:///./svp-player.js","webpack:///./icons/playlist.svg","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:///./utils/server-time.js","webpack:///./utils/model.js","webpack:///./player/model/category.js","webpack:///./player/model/asset.js","webpack:///./player/services/api.js","webpack:///./player/services/api/series.js","webpack:///./player/services/api/related.js","webpack:///./player/services/api/asset/mock.js","webpack:///./player/services/api/asset.js","webpack:///./utils/image.js","webpack:///./player/model/stream.js","webpack:///./player/model/excluded-assets.js","webpack:///./player/model/recommended/related.js","webpack:///./player/model/next-asset.js","webpack:///./player/model/locale.js","webpack:///./utils/string.js","webpack:///./player/model/domain.js","webpack:///./player/model/token.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/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/playback/viewport.js","webpack:///./player/playback/ads/homad.js","webpack:///./player/playback/ads/homad-skin.js","webpack:///./player/playback/ads/homad-jw.js","webpack:///./player/playback/config/autoplay.js","webpack:///./player/playback/ads/prevent-seeking.js","webpack:///./utils/style-loader.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.js","webpack:///./player/playback/skin/fullscreen-button.js","webpack:///./player/playback/provider.js","webpack:///./utils/eventable.js","webpack:///./utils/mixin.js","webpack:///./player/plugins/model.js","webpack:///./player/plugins.js","webpack:///./player/playback/ads/appnexus-ast.js","webpack:///./player/plugins/pause.js","webpack:///./player/plugins/age-limit.js","webpack:///./player/plugins/sponsor-label.js","webpack:///./player/plugins/countdown.js","webpack:///./player/model/recommended/list.js","webpack:///./player/model/recommended.js","webpack:///./player/plugins/recommended.js","webpack:///./player/plugins/svp-stats/tracker.js","webpack:///./player/plugins/svp-stats.js","webpack:///./player/plugins/pulse-stats/tracker.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/ui-events.js","webpack:///./player/model/category-tree.js","webpack:///./player/plugins/pulse-stats.js","webpack:///./player/player.js","webpack:///./utils/adblock-detect.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","__webpack_exports__","ACTIVE","ACTIVE_PREVIEW","NOT_ACTIVE","NOT_ACTIVE_GEOBLOCKED","NOT_FOUND","NOT_ACTIVE_PAST","GENERAL_ERROR","NETWORK_ERROR","TOKEN_FETCH_ERROR","statusMessages","[object Object]","errorCode","translations","en","Video will start at","Video will start in","ageLimit-0","Ad from","months","status_codes","Sharing","Live button","Error code","en_GB","es_ES","nb_NO","sv_SE","Audio video switch","Playing audio only","ads","admessage","cuetext","skipmessage","skiptext","podmessage","adblock","player","no","This video cannot be played because of a technical error.","Sorry, the video player failed to load.","This video file cannot be played.","The live stream is either down or has ended.","There was a problem providing access to protected content.","This video cannot be played because of a problem with your internet connection.","play","playback","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","se","player_config","version","keys","default","100sport","ab","adressa","adressabrandstudio","altaposten","ap","bt","brandstudio","folkebladet","fvn","harstad","itromso","podcast","rbnett","riks","ridenews","sa","schibsted","smp","svd","tronderavisa","vgtv","vgtvs","api","url","tokenUrl","thumbnailsUrl","vendor","identifier","endpoint","joiner","indexOf","this","cb","Math","random","homad","global","client","appnexus","vmap","ast","debug","cdn","svp","pollyfils","youbora","time","images","servers","sizes","poster","autoHeight","autoWidth","skins","about","link","text","sharing","sites","code","domains","blacklist","whitelist","preview","locale","env","_script_loader__WEBPACK_IMPORTED_MODULE_0__","moduleSrc","root","window","define","amd","Promise","resolve","require","path","reject","onSuccess","onError","script","document","createElement","done","callback","type","src","async","onreadystatechange","onload","readyState","onerror","body","appendChild","loadScript","isLoaded","exportz","conf","k","b","u","g","a","round","e","String","fromCharCode","floor","A","toString","h","f","Array","q","length","charCodeAt","push","toLowerCase","j","isNaN","charAt","fireEvent","createEvent","state","initCustomEvent","dispatchEvent","track","M","isEnabled","T","encodeURIComponent","data","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","Date","now","navigator","appCodeName","appName","appVersion","userAgent","platform","language","parseInt","reverse","match","y","startPlayer","eval","fp_error","hd_ready","head","firstChild","insertBefore","setInterval","addEventListener","clearTimeout","getElementsByTagName","parentNode","removeChild","getElementsByClassName","self","top","hasChildNodes","lastChild","homad_url_suffix_base64","homad_url_suffix","homad_hash_guessed","x","enabled","server","replace","getTime","config","XMLHttpRequest","status","JSON","parse","responseText","open","substr","setRequestHeader","send","location","hostname","onFailure","globalConfig","clientConfig","clearInterval","player_config__WEBPACK_IMPORTED_MODULE_0__","utils_module_loader__WEBPACK_IMPORTED_MODULE_1__","loadSvpLibrary","then","SVP","preInitialize","postInitialize","onReady","onSvpPlayerReady","PLAYER_LIB","jwplayer","loadJwPlayer","library","event","initEvent","idCounter","_","MAX_ARRAY_INDEX","pow","getLength","obj","isEmpty","collection","isArrayLike","isArray","isString","isArguments","uniqueId","prefix","id","underscore","Events","eventSplitter","eventsApi","iteratee","events","opts","names","context","test","split","on","internalOn","listening","_events","onApi","ctx","_listeners","listenTo","_listenId","listeningTo","_listeningTo","thisId","objId","count","options","handlers","off","offApi","listeners","stopListening","ids","remaining","handler","_callback","size","once","onceMap","listenToOnce","map","offer","apply","arguments","trigger","max","args","triggerApi","objEvents","allEvents","all","slice","triggerEvents","concat","ev","a1","a2","a3","unbind","backbone_events","userAgentMatch","regex","lazyUserAgentMatch","isFF","isIETrident","isIPad","isEdge","isAndroid","device","isIOS","isAppleIOS","result","exec","isIPhone","isSafari","isAndroidNative","isChrome","isFirefox","isIE","isDesktop","isMobile","isTablet","isSamsungInternet","isWindowsPhone","getChromeVersion","raw","getPixelRatio","devicePixelRatio","getFlashVersion","flash","plugins","description","parseFloat","ActiveXObject","GetVariable","getDeviceType","canAutoplay","isMergeableObject","val","cloneIfNecessary","optionsArgument","clone","deepmerge","emptyTarget","defaultArrayMerge","target","source","destination","forEach","array","arrayMerge","mergeObject","Error","reduce","merge","jwUtils","utils","jwUnderscore","extend","ajax","each","isUndefined","isNumber","omit","memoize","createNode","addStyleSheet","addClass","removeClass","throttle","template","cache","tmpl","str","fn","Function","join","getElementById","innerHTML","shareTimeToSeconds","hours","minutes","seconds","compact","hasFlash","number","zeroPad","escape","escapeMap","&","<",">","\"","'","`","tag","string","getTimeFormatted","timestamp","inherit","model","protoProps","staticProps","parent","child","Surrogate","constructor","__super__","getScrollSnapPrefix","scrollSnapSupport","documentElement","style","jsonToUrl","startsWith","searchString","position","utils_utils","counters","log","counter","console","logger","block","error","itemKey","localStorage","getItem","unshift","server_time","_time","_responseTime","fetch","resolveRequest","attr","attributes","set","oldVal","Category","initialize","additional","background","main","image","logo","playerLogo","playerLogoImage","relatedExperiments","start","experiment","traffic","end","item","parseRelatedExperiments","metadata","model_category","handleErrors","response","ok","Asset","production","getUrl","getVendor","unifyTimestamp","startIndexPoint","ageLimit","sourceFiles","series","season","seasonNumber","episode","episodeNumber","flightTimes","created","published","updated","category","chapters","chapter","index","timeline","nextAsset","tags","_embedded","json","assign","sponsored","title","chapterIndex","getChapters","model_asset","api_handleErrors","services_api","assetId","categoryId","getEndpoint","assets","findIndex","getNextFromEpisodeList","limit","engine","related_getEndpoint","VIDEO","Blob","Uint8Array","getListEndpoint","params","filters","queryParams","requestNumber","currentServerId","image_config","getServer","getImageTransform","serversAmount","api_asset","getAssetEndpoint","order","publishedDate","streamType","streamUrls","hls","URL","createObjectURL","streamConfiguration","properties","imageId","width","height","pixelRatio","min","cacheKey","transform","maxDimension","idLen","transformType","transformSizes","dimensions","getImageQuality","normalizeTransformSize","curr","getClosestSize","utils_image","getImageSrc","extension","Stream","streams","hds","mp4","mediaType","assetType","snapshots","captions","begin","externalId","duration","is360","pseudostreaming","audioStream","audio","disableNextVideo","showAds","cuePoints","hasProperty","isPast","getTimeToStart","isActive","isOnHttp","protocol","streamUrl","containerWidth","getPoster","getId","hasMp4Streams","stream","streamData","pop","bitrate","model_stream","getKey","excluded_assets","getAll","splice","getStorage","setItem","stringify","recommended_related","excludedAssets","add","useMlEngine","experimentsList","seed","experimentVariant","experimentName","randomIndex","element","find","getExperimentName","createResponse","next_asset","asset","includeCategory","hasNextInCategory","getCategory","isSeries","nextAssetId","getNextAssetId","fetchNextParams","fetchNextFromSeries","experiments","getRelatedExperiments","fetchNextById","fetchNextFromRelatedEngine","getNext","reason","model_locale","translate","substitute","setTranslations","getMonthName","date","getMonth","objectToString","undefined","prop","capitalizeFirstLetter","toUpperCase","isDomainInArray","origin","domain","pos","domainBeginning","len","model_domain","na","vendors","fetchToken","isFetching","expire","token_Token","maxBitrate","request","configuration","isValid","query","expiry","token","appnexus_tag_builder","queryObject","getAstConfig","tagOptions","globalOptions","countryCode","getCountryCode","supplyType","publisherName","slotIds","preroll","midroll","postroll","JwAdsConfig","adSlotConfig","offset","adLabel","getVmapTag","appnexus_jw_config","getParams","memberId","member","getJwAdSchedule","adSlots","adConfig","adsConfig","hasNext","setParams","getCuePoints","cuePoint","getConfig","getAdsConfig","schedule","getAdPlacements","adPlacements","globalParams","placements","values","placementId","parseAdPlacements","getClientConfig","adn","hasAdsDisabled","svpAdConfig","getDefaultParams","svpPlayer","adSchedule","adOptions","getLiveMidrollTag","maxDuration","vmaxduration","createMidroll","startTime","hasEntered","onEnterCallback","setTime","onEnter","minDvrWindow","addPlaylistMetadata","playlistItem","mediaId","getExternalId","getPlaybackTime","mediaid","starttime","addProgressiveMediaSources","getMp4Streams","mp4Stream","sources","label","file","addSnapshots","hasSnapshots","tracks","getSnapshots","kind","addCaptions","getCaptions","caption","add3dSupport","getDisplayType","stereomode","isMock","advertising","autoplayMuted","autoplayadsmuted","vpaidcontrols","preloadAds","adschedule","addAppnexusAds","globals","defaults","heading","canAutostart","autoplay","isSecure","withCredentials","hasPlayableSource","preload","autostart","mute","skin","some","slot","hasPreroll","isFuture","autopause","autoPause","viewability","repeat","module_loader","Plugin","setAdapter","adapters","JWPlayer","Config","node","jwDefaults","primary","hlshtml","base","flashplayer","wmode","getMaxBitrate","rawOptions","js_beautify","getRaw","playerContainer","container","clientWidth","clientHeight","getToken","isLive","getSettings","isGeoblocked","getStreamUrl","catch","abouttext","aboutlink","localization","jwConfig","getPlaylistSettings","addSharing","native","renderCaptionsNatively","config_captions","content.resource","content.isLive","content.title","content.duration","getDuration","content.cdn","content.metadata","content_id","owner","extraparam.1","extraparam.2","extraparam.3","extraparam.4","jw_youbora","config_keys","jw","hasRecommended","getRecommended","getPermissions","permissions","freeze","writable","playback_config","Viewport","current","labels","newIndex","arr","compare","comp","binarySearch","newBreakpoint","getViewportByIndex","currentBreakpoint","viewport","getTagUrl","potOffset","getPlaylist","getAdPotTag","SvpPlayer","Player","isHomadLoaded","homadConfig","skipable","skipAdOnContextChange","runInsideContainer","adjustAdVolumeToContentPlayer","postrollUseCompleteEvent","muteButton","audio_default","unmuteButton","audio_muted_default","playButton","play_default","pauseButton","pause_default","skipableButton","adMessages","skipButton","innerWarpper.style","prerollAdTag","midrollAdTag","postrollAdTag","aabConfig","homad_lib","details","detail","containerId","playerId","createHomadSkin","adPlayer","adPlayerContainer","getContainer","appendControl","controlsContainer","querySelector","domNode","getControlsContainer","fullScreenButton","fullscreenButton","cloneNode","onClick","handleClick","createFullscreenButton","jwPlayer","setFullscreen","toggleFullscreen","seekBar","remove","progressLoader","setProgress","reset","createProgressBar","currentTime","setAdPlaying","setAdComplete","playerClassList","classList","adStarted","useClasses","getPlaybackState","volumeBtn","float","adjustVolumePosition","getEvents","adPosition","adPlaying","adId","impression","impressionURL","eventName","removeEvents","hasAdBlocked","adPlayerLoading","pauseReason","getCurrentTime","adposition","MutationObserver","mutations","mutation","nodes","addedNodes","video","observe","childList","characterData","getAdPlayer","initializeAdPlayer","canDeviceAutoplay","autoplay_hasPreroll","prevent_seeking","supposedCurrentTime","onSeeking","onTimeUpdate","seeking","init","videoElement","removeEventListener","handle","getVideo","loadedStylesheets","style_loader","href","rel","loadStylesheet","iconsMap",".jw-svg-icon-play",".jw-svg-icon-pause",".jw-skip-icon .jw-svg-icon-next","chevron_right_default",".jw-svg-icon-settings","settings_default",".jw-svg-icon-sharing","share_default",".jw-svg-icon-cc-on","captions_default",".jw-svg-icon-cc-off",".jw-svg-icon-volume-0",".jw-svg-icon-volume-50","audio_half_default",".jw-svg-icon-volume-100",".jw-svg-icon-fullscreen-on","fullscreen_on_default",".jw-svg-icon-fullscreen-off","fullscreen_off_default","info","info_default","avButton","av_button_default","defsLoaded","icons_loader","customIcon","selector","icons","querySelectorAll","icon","svpIcon","setAttribute","getAttribute","replaceChild","loadIcons","settings_menu","contains","submenu","right","offsetWidth","offsetLeft","submenuHandler","config_button","infoNode","dataset","tip","isPrettierLoaded","dump","el","left","focus","select","execCommand","err","copyToClipboard","hasMediaId","getSharingLink","updateElement","previousSibling","innerText","replaceElement","sourceEl","newEl","sharing_box","updateSharingBox","getStream","container_class","svpPlayerModel","handleAppnexusClass","levels_icon","levels","display","handleLevelSettingsIcon","getLevelSettingsIcon","loader","skinLoader","playback_skin","defs_default","loadDefs","getIcon","fullscreen_button","PlayerModel","isInitalized","isStopped","onViewportChange","provider_forwardEvent","getAdPosition","slotId","pre","mid","post","setup","accountCode","enableAnalytics","onPlaylistItemLoad","onPlay","onPause","onComplete","eventData","onTime","onPlayerResize","onViewable","onAutostartNotAllowed","onMeta","onMetadataCueParsed","getCaptionsList","meta","sequence","xml","adSelector","adData","podcount","parseAdData","complete","load","stop","streamPoster","playbackType","getVolume","setVolume","getMute","setMute","getState","seek","nextStream","getJwConfig","loadStream","force","getPosition","isAdPlaying","getAdBlock","provider","getProvider","playerCaptions","captionsIndex","setCurrentCaptions","hasValidToken","playlistItemId","onFirstFrameLoad","playbackEndTime","playbackEnd","update","viewable","currentViewport","previousViewport","slotDuration","onTimeChange","adTag","playAd","content","skipAd","TXXX","insertAd","cancelAd","playReason","methods","forwardedMethods","method","warn","proxyMethod","sourceMethod","Eventable","eventable","copyProperties","Reflect","ownKeys","desc","getOwnPropertyDescriptor","model_PluginModel","super","plugins_model","player_plugins","plugin","getName","CustomPluginModel","createClass","scripts","script_loader","pluginSrc","appnexus_ast","apntag","firstLoad","tagId","tagConfig","targetId","defineTag","loadTags","onEvent","showTag","refresh","dimmensions","resizeAd","offEvent","pause_PausePlugin","maxDisplays","displayCounter","withAdTag","adPlacement","withCounter","getBoundingClientRect","resizeTag","appnexusAdId","creativeId","isAdTagLoaded","show","getViewable","refreshTag","hide","timerId","onSeek","render","adTagOptions","appnexusAdContainerId","plugins_pause_default","closeIcon","close_default","closeButton","onResumeClick","stopPropagation","player_plugins_pause","age_limit","sponsor_label","sponsor","pluginName","adFrom","leadingZeros","numValue","numLen","num","plugins_countdown","liveDOM","countdownDOM","countdown_default","intervalId","getDateData","repaint","liveDate","isCountdownActive","sec","currentState","getDate","getHours","getMinutes","endDate","diff","dateData","years","days","mapResponse","getEngine","list","fetchByIds","fetchFromRelatedEngine","model_recommended","ml","fetchNext","items","playNext","clear","nextAssetSource","getThumbnailUrl","onInitialize","fetchDuration","isDisabledNextVideo","recommended","getAsset","gridItemsReady","grid","getItems","getNextAsset","onPlaybackComplete","scrollSnapPrefix","gridItem","getByClass","onTimeNextVisible","countdownTime","onPlayNextVisible","timeout","transitionDuration","onNextAssetReady","Image","getThumbnail","next_asset_default","countdown","nextIcon","onGridItemsReady","grid_default","onGridVisible","onAssetReplay","plugins_recommended","className","previousEl","recommended_default","svp_stats_tracker","sendRequest","queryString","apiUrl","getApiUrl","hypen","svp_stats","trackingInterval","getTrackingInterval","initialStartTime","trackMediaEvent","playerTime","trackStreamEvent","adSlot","PulseTrackerLoader","trackers","pulse","getTracker","storedTracker","PROVIDER_TRACKER_ID","promise","tracker","pulse_stats_tracker","ad_events","beforeUnload","onAdSlotComplete","onAdSlotStart","onAdStarted","onAdProgress","onAdPause","onAdPlay","onPauseAdVisible","slotData","previousPosition","session","playback_events","watchData","previousTime","createSession","beforePlaybackStarted","onBeforeUnload","playMethod","onPlaylistItem","onInitialPlay","onAssetPlay","onPlayNext","onLiveTime","onRecommendedPlay","previousAssetId","playbackSource","eventInterval","beforeStreamStart","wasViewed","eventTime","trackTimeEvent","ui_events","onRecommendedVisible","instances","category_tree","categories","Map","parentId","getTags","getStories","getMediaAssetId","pulse_stats","decorator","embed","playerAsset","accessControl","access","stories","originAssetId","categoryPath","categoryTree","getPath","getCategoryPath","resolveTracker","adEvents","playbackEvents","uiEvents","onAdEvent","onPlaybackEvent","onUiEvent","intent","trackingData","@type","@id","getTitle","muted","fullScreen","getFullscreen","mediaAssetId","slotNumber","destroy","destroyPlugin","clearError","previousErrorNode","translatedMessage","errorDetails","error_default","posterSrc","errorNode","isCompleted","onPlayerEvent","callFunction","onceConfigReady","handleReady","handleError","pluginConfig","addPlugin","setAsset","onAssetReady","hasPlayNext","setStream","getChapter","getAgeLimit","isSponsored","getCategoryTitle","pulseConfig","isStreamPlayable","player_Player","isBlacklisted","isPlayNextAvailable","serverTime","ceil","getCurrentCaptions","styles","setCaptionsStyles","setPlayer","player_player","adblock_detect","detected","bait","offsetParent","offsetHeight","offsetTop","getComputedStyle","baitTemp","getPropertyValue","index_SVP","Plugins","__defaults","configurable","aab","setLocale","svpYoubora","loadYoubora"],"mappings":"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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 = \"//cdn.svp.schibsted.io/player/3.15.11/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 26);\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_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_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 */\nexport default (errorCode) => statusMessages[errorCode] || statusMessages[GENERAL_ERROR];\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 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 adblock: {\n admessage: 'The ad will end in [time]s'\n },\n player: {}\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 // 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 // av button\n 'Audio video switch': 'Kun lyd',\n 'Playing audio only': 'Spiller kun lyd',\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\n adblock: {\n admessage: 'Annonsen slutter om [time]'\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 }\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 // 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 // av button\n 'Audio video switch': 'Endas ljud',\n 'Playing audio only': 'Spelar bara ljud',\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\n adblock: {\n admessage: 'Annonsen tar slut om [time] sekunder'\n },\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 }\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\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 vendor\n * @param 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 homad: {\n global: 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n client: '/homad-config.json'\n },\n\n appnexus: {\n vmap: 'https://ib.adnxs.com/vmap',\n ast: 'https://acdn.adnxs.com/ast/ast.js',\n debug: false\n }\n },\n\n cdn: {\n svp: `//cdn.svp.schibsted.io/player/${VERSION}`,\n player: '//cdn.svp.schibsted.io/jw/jwplayer-8.9.4',\n pollyfils: '//svp.vgc.no/pollyfils/es6-promise.min.js',\n youbora: 'https://smartplugin.youbora.com/v6/js/adapters/jwplayer/6.5.0/sp.min.js'\n },\n\n time: '//svp.vg.no/svp/api/v1/time',\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 /**\n * Default skins for providers\n */\n skins: {\n default: {\n url: `//cdn.svp.schibsted.io/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 // 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', '*svp.schibsted.io', '*cms.schibsted.media', '*localhost', '*pubops.net'\n ]\n }\n },\n\n translations: translations\n};\n\nexport default config;\n","\nexport 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};\n","import config from '../config';\n\nconfig.env = 'production';\nexport default config;\n","import scriptLoader from './script-loader';\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","function 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\nexport default (path) => {\n return new Promise((resolve, reject) => loadScript(path, resolve, reject));\n}","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","/* 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 = \"\"","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\"","import config from 'player/config';\nimport moduleLoader from 'utils/module-loader';\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\nconst loadJwPlayer = (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 const onReady = root.onSvpPlayerReady;\n\n // onSvpPlayerReady is required callback to handle due to SDK async loading\n loadJwPlayer(root)\n .then(loadSvpLibrary)\n .then((library) => {\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();\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 });\n}(window));\n","module.exports = \"\"","/* jshint ignore:start */\n\n var idCounter = 0;\n\n // we do not include underscore as it is our hard dependency\n var _ = jwplayer._,\n property = function (key) {\n return function (obj) {\n return obj == null ? void 0 : obj[key];\n };\n },\n MAX_ARRAY_INDEX = Math.pow(2, 53) - 1,\n getLength = property('length'),\n isArrayLike = function (collection) {\n var length = getLength(collection);\n return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n };\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 _.uniqueId = function(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n };\n\n export default _;\n\n/* jshint ignore:end */\n","/* jshint ignore:start */\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 //\n var Events = {};\n\n // Regular expression used to split event strings.\n var 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}`).\n var eventsApi = function(iteratee, events, name, callback, opts) {\n var i = 0, names;\n if (name && typeof name === 'object') {\n // Handle event maps.\n if (callback !== void 0 && 'context' in opts && opts.context === void 0) 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 // Bind an event to a `callback` function. Passing `\"all\"` will bind\n // the callback to all events fired.\n Events.on = function(name, callback, context) {\n return internalOn(this, name, callback, context);\n };\n\n // Guard the `listening` argument from the public API.\n var 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 var listeners = obj._listeners || (obj._listeners = {});\n listeners[listening.id] = listening;\n }\n\n return obj;\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.\n Events.listenTo = function(obj, name, callback) {\n if (!obj) return this;\n var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n var listeningTo = this._listeningTo || (this._listeningTo = {});\n var 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 var thisId = this._listenId || (this._listenId = _.uniqueId('l'));\n listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0};\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 adds a callback to the `events` object.\n var onApi = function(events, name, callback, options) {\n if (callback) {\n var handlers = events[name] || (events[name] = []);\n var context = options.context, ctx = options.ctx, listening = options.listening;\n if (listening) listening.count++;\n\n handlers.push({ callback: callback, context: context, ctx: context || ctx, listening: listening });\n }\n return events;\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.\n Events.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.\n Events.stopListening = function(obj, name, callback) {\n var listeningTo = this._listeningTo;\n if (!listeningTo) return this;\n\n var ids = obj ? [obj._listenId] : _.keys(listeningTo);\n\n for (var i = 0; i < ids.length; i++) {\n var 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 = void 0;\n\n return this;\n };\n\n // The reducing API that removes a callback from the `events` object.\n var offApi = function(events, name, callback, options) {\n if (!events) return;\n\n var i = 0, listening;\n var context = options.context, listeners = options.listeners;\n\n // Delete all events listeners and \"drop\" events.\n if (!name && !callback && !context) {\n var 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 var names = name ? [name] : _.keys(events);\n for (; i < names.length; i++) {\n name = names[i];\n var 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 var remaining = [];\n for (var j = 0; j < handlers.length; j++) {\n var 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)) return events;\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.\n Events.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, void 0, context);\n };\n\n // Inversion-of-control versions of `once`.\n Events.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 // Reduces the event callbacks into a map of `{event: onceWrapper}`.\n // `offer` unbinds the `onceWrapper` after it has been called.\n var onceMap = function(map, name, callback, offer) {\n if (callback) {\n var 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 // 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).\n Events.trigger = function(name) {\n if (!this._events) return this;\n\n var length = Math.max(0, arguments.length - 1);\n var args = Array(length);\n for (var i = 0; i < length; i++) args[i] = arguments[i + 1];\n\n eventsApi(triggerApi, this._events, name, void 0, args);\n return this;\n };\n\n // Handles triggering the appropriate event callbacks.\n var triggerApi = function(objEvents, name, cb, args) {\n if (objEvents) {\n var events = objEvents[name];\n var 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 // 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).\n var triggerEvents = function(events, args) {\n var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n switch (args.length) {\n case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n }\n };\n\n // Aliases for backwards compatibility.\n Events.bind = Events.on;\n Events.unbind = Events.off;\n\n export default Events;\n\n","\n \n var userAgent = navigator.userAgent;\n\n function userAgentMatch(regex) {\n return userAgent.match(regex) !== null;\n }\n\n function lazyUserAgentMatch(regex) {\n return function () {\n return userAgentMatch(regex);\n };\n }\n\n var isFF = lazyUserAgentMatch(/gecko\\//i);\n var isIETrident = lazyUserAgentMatch(/trident\\/.+rv:\\s*11/i);\n var isIPad = lazyUserAgentMatch(/iPad/i);\n var isIPhone = lazyUserAgentMatch(/iPhone/i);\n// Check for Facebook App Version to see if it's Facebook\n\n function isEdge() {\n return userAgentMatch(/\\sEdge\\/\\d+/i);\n }\n\n function isMSIE() {\n return userAgentMatch(/msie/i);\n }\n\n function isChrome() {\n return userAgentMatch(/\\s(?:Chrome|CriOS)\\//i) && !isEdge();\n }\n\n function isIE() {\n return isEdge() || isIETrident() || isMSIE();\n }\n\n function isSafari() {\n return userAgentMatch(/safari/i) && !userAgentMatch(/(?:Chrome|CriOS|chromium|android)/i);\n }\n\n /** Matches iOS devices **/\n function 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 } else {\n // didn't match version\n return false;\n }\n }\n\n return isAppleIOS;\n }\n\n function isAndroid() {\n return userAgentMatch(/Android/i);\n }\n\n /** Matches Android devices **/\n function isAndroidNative() {\n // Android Browser appears to include a user-agent string for Chrome/18\n if (userAgentMatch(/chrome\\/[123456789]/i) && !userAgentMatch(/chrome\\/18/i) && !isFF()) {\n return false;\n }\n return isAndroid();\n }\n\n /**\n * If the browser has flash capabilities, return the flash version\n */\n function flashVersion() {\n if (isAndroid()) {\n return 0;\n }\n\n var plugins = navigator.plugins;\n var flash;\n\n if (plugins) {\n flash = plugins['Shockwave Flash'];\n if (flash && flash.description) {\n return parseFloat(flash.description.replace(/\\D+(\\d+\\.?\\d*).*/, '$1'));\n }\n }\n\n if (typeof window.ActiveXObject !== 'undefined') {\n try {\n flash = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n if (flash) {\n return parseFloat(flash.GetVariable('$version').split(' ')[1].replace(/\\s*,\\s*/, '.'));\n }\n } catch (e) {\n return 0;\n }\n\n return flash;\n }\n return 0;\n }\n\n export default {\n isIOS: isIOS,\n isIPhone: isIPhone,\n isIPad: isIPad,\n isSafari: isSafari,\n\n isAndroid: isAndroid,\n isAndroidNative: isAndroidNative,\n isChrome: isChrome,\n\n isFirefox: isFF,\n\n isEdge: isEdge,\n isIE: isIE,\n\n isDesktop: function () {\n return !this.isMobile() && !this.isTablet();\n },\n\n isSamsungInternet: function () {\n return userAgent.indexOf('SamsungBrowser') !== -1;\n },\n\n isTablet: function () {\n var isTablet = isIPad() || false;\n\n // android tables are when\n if (this.isAndroid() && (userAgent.indexOf('Mobile') === -1)) {\n isTablet = true;\n }\n\n return isTablet;\n },\n\n isMobile: function () {\n return userAgent.match(/(iPhone|iPod|Android(?=.*Mobile).*|HTC|Fennec|IEMobile|BlackBerry|SymbianOS(?=.*AppleWebKit).*|Opera Mobi|Symbian|SonyEricsson|Nokia|SAMSUNG|LG)/i) === null ? false : true;\n },\n\n isWindowsPhone: function () {\n return userAgent.match(/Windows Phone/i) !== null;\n },\n\n getChromeVersion: function () {\n var raw = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n\n return raw ? parseInt(raw[2], 10) : false;\n },\n\n getPixelRatio: function () {\n var devicePixelRatio = window.devicePixelRatio || 1;\n\n if (devicePixelRatio > 1) {\n devicePixelRatio = 2;\n }\n\n return devicePixelRatio;\n },\n\n getFlashVersion: flashVersion,\n\n\n /**\n * Tracking is divided by device type\n *\n * @returns {*}\n */\n getDeviceType: function () {\n if (this.isTablet()) {\n return 'tablet';\n }\n\n if (this.isMobile()) {\n return 'phone';\n }\n\n return 'desktop';\n },\n\n canAutoplay: function () {\n var canAutoplay = 'always';\n\n // default is muted for never ios systems\n if (this.isIOS()) {\n canAutoplay = '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 canAutoplay = 'never';\n }\n\n // chrome android can autoplay muted\n if (this.isAndroid() && !this.isSamsungInternet() && this.getChromeVersion() >= 53) {\n canAutoplay = 'muted';\n }\n\n return canAutoplay;\n }\n };\n\n","/* jshint ignore:start */\n\n function 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\n function emptyTarget(val) {\n return Array.isArray(val) ? [] : {}\n }\n\n function cloneIfNecessary(value, optionsArgument) {\n var clone = optionsArgument && optionsArgument.clone === true\n return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value\n }\n\n function 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\n function 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\n function 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) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument)\n } else {\n return mergeObject(target, source, optionsArgument)\n }\n }\n\n deepmerge.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\n window.deepmerge = deepmerge;\n\n export default deepmerge;\n\n","/* global jwplayer */\nimport Events from './backbone.events';\nimport device from './device';\nimport merge from './merge';\n var jwUtils = jwplayer.utils,\n jwUnderscore = jwplayer._,\n // jwplayer is hard dependecy here\n utils = {\n Events: Events,\n\n // methods reused from jwplayer core\n extend: jwUtils.extend,\n // merge with deep copy, similar to jQuery extend\n merge: merge,\n\n ajax: jwUtils.ajax,\n\n each: jwUnderscore.each,\n isUndefined: jwUnderscore.isUndefined,\n isNumber: jwUnderscore.isNumber,\n isString: jwUnderscore.isString,\n isArray: jwUnderscore.isArray,\n omit: jwUnderscore.omit,\n memoize: jwUnderscore.memoize,\n\n createNode: jwUtils.createElement,\n addStyleSheet: jwUtils.addStyleSheet,\n addClass: jwUtils.addClass,\n removeClass: jwUtils.removeClass,\n throttle: jwUnderscore.throttle,\n\n /* jshint ignore:start */\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 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\").join(\"');\")\n .split(\"%>\").join(\"p.push('\")\n .split(\"\\r\").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, minutes, seconds, 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\n hasFlash: function () {\n return device.getFlashVersion() > 0;\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 escape: function (str) {\n var escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n\n return str.replace(/[&<>\"'`]/g, function replaceTag(tag) {\n return escapeMap[tag] || tag;\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 inherit: function (o) {\n function F() {\n } // Dummy constructor\n\n F.prototype = o;\n return new F();\n },\n\n model: {\n // Helper function to correctly set up the prototype chain, for subclasses.\n // Similar to `goog.inherits`, but uses a hash of prototype properties and\n // class properties to be extended.\n extend: function (protoProps, staticProps) {\n var parent = this;\n var child = function () {\n return parent.apply(this, arguments);\n };\n\n // Add static properties to the constructor function, if supplied.\n utils.extend(child, parent, staticProps);\n\n // Set the prototype chain to inherit from `parent`, without calling\n // `parent`'s constructor function.\n var Surrogate = function () {\n this.constructor = child;\n };\n Surrogate.prototype = parent.prototype;\n child.prototype = new Surrogate();\n\n // Add prototype properties (instance properties) to the subclass,\n // if supplied.\n if (protoProps) {\n utils.extend(child.prototype, protoProps);\n }\n\n // Set a convenience property in case the parent's prototype is needed\n // later.\n child.__super__ = parent.prototype;\n\n return child;\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 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\n /**\n * Polyfill for String.startsWith\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n */\n (function() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(searchString, position) {\n position = position || 0;\n return this.indexOf(searchString, position) === position;\n };\n }\n })();\n\n export default utils;\n\n","/* global console */\nconst 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 console.log(...args);\n};\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);\n } catch (error) {\n return false;\n }\n};\n\nexport default function(block = 'SVP') {\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","import utils from './utils';\n /**\n * Server time helper required for syncing browser time with stream vendors servers (SMP Stream)\n * @type {{_time: null, _responseTime: null, fetch: Function, getTime: Function}}\n */\n var ServerTime = {\n _time: null,\n _responseTime: null,\n\n fetch: function(url) {\n var resolveRequest = function (time) {\n this._time = time;\n this._responseTime = new Date().getTime();\n }.bind(this);\n\n // TODO server url?\n utils.ajax(url, function(result) {\n // set current microtime if server will return value different than int\n if(isNaN(parseInt(result, 10))) {\n result = (new Date().getTime());\n } else {\n // adjust to miliseconds\n result = result * 1000;\n }\n resolveRequest(result);\n }.bind(this), function() {\n resolveRequest(new Date().getTime());\n }.bind(this), true);\n },\n\n getTime: function() {\n return this._time + (new Date().getTime() - this._responseTime);\n }\n };\n\n export default ServerTime;\n\n","import _ from './underscore';\nimport Events from './backbone.events';\n\nconst SimpleModel = _.extend({\n 'get': function (attr) {\n this.attributes = this.attributes || {};\n return this.attributes[attr];\n },\n 'set': function (attr, val) {\n this.attributes = this.attributes || {};\n\n if (this.attributes[attr] === val) {\n return;\n }\n var 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 * Parse related experiments\n * @param data\n */\nfunction parseRelatedExperiments(data) {\n let start = 0;\n\n return data.split(',').map((experiment) => {\n const [name, traffic] = experiment.split(':');\n\n if (!traffic) {\n throw new Error('could not parse related experiments');\n }\n\n const end = parseInt(traffic, 10);\n const item = { name, start, end: start + end };\n\n start += end;\n\n return item;\n });\n}\n\nconst Category = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nCategory.prototype = {\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\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 data = utils.omit(data, ['additional', 'background', 'image', 'logo', 'playerLogoImage']);\n\n try {\n data.relatedExperiments = parseRelatedExperiments(data.metadata.relatedExperiments.value);\n } catch (e) {\n data.relatedExperiments = [];\n }\n }\n\n return data;\n },\n\n getRelatedExperiments() {\n return this.get('relatedExperiments') || [];\n },\n\n isSeries() {\n return this.get('isSeries') === true;\n },\n\n getLastAsset() {\n return this.get('lastAsset') || {}; // cant be object because of circular dependency\n }\n};\n\nutils.extend(Category.prototype, Model);\n\nexport default Category;\n","/* eslint-disable no-param-reassign */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport config from 'player/config';\nimport Category from './category';\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 initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n url() {\n const additional = [\n 'settings', 'chapters', 'cuePoints', 'externalId', 'barrels',\n 'externalCategoryId', 'nextAsset', 'sourceFiles', 'subtitles',\n 'metadata', 'access', 'tags', 'stories'\n ];\n\n return config.api.getUrl(this.getVendor(), `/assets/${this.get('id')}?additional=${additional.join('|')}`);\n },\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 data = utils.omit(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) {\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\n if (data._embedded && data._embedded.tags) {\n // eslint-disable-next-line\n data.tags = data._embedded.tags;\n }\n\n return data;\n },\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 getVendor() {\n return this.get('vendor');\n },\n\n destroy() {\n // in case of any cleanup\n },\n\n getAgeLimit() {\n return utils.isNumber(this.get('ageLimit')) ? this.get('ageLimit') : -1;\n },\n\n isSponsored() {\n const metadata = this.get('metadata');\n\n return metadata\n && metadata.sponsored\n && JSON.parse(metadata.sponsored) === true;\n },\n\n getCategoryTitle() {\n const category = this.get('category');\n const {\n attributes: {\n title\n } = {}\n } = category || {};\n return title;\n },\n\n getNextAssetId() {\n return (this.get('nextAsset') && this.get('nextAsset').id) || null;\n },\n\n getNextAssetSource() {\n const metadataKey = 'relatedExperiments';\n const metadata = this.get('metadata');\n\n if (metadata && metadata[metadataKey]) {\n // byId manually set\n if (metadata[metadataKey] === 'byId') {\n return 'manual';\n }\n\n return metadata[metadataKey];\n }\n\n return null;\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 {*|Array}\n */\n getChapters() {\n return this.get('chapters') || [];\n },\n\n getThumbnail() {\n return this.get('images').main;\n },\n\n getTitle() {\n return this.get('title');\n },\n\n getCategory() {\n return this.get('category');\n }\n};\n\nutils.extend(Asset.prototype, Model);\n\nexport default Asset;\n","import config from 'player/config';\n\nfunction handleErrors(response) {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response;\n}\n\nconst APPNEXUS_PROVIDER_ID = 'appnexus';\n\nconst api = (vendor, endpoint) => fetch(config.api.getUrl(vendor, endpoint))\n .then(handleErrors)\n .then((response) => response.json());\n\n\nexport {\n APPNEXUS_PROVIDER_ID\n};\n\nexport default api;\n","import api from '../api';\n\nconst getEndpoint = (categoryId, seasonNumber) => `/categories/${categoryId}/seasons/${seasonNumber}/assets`;\n\nconst getNextFromEpisodeList = (assetId, assets) => {\n if (!assets) {\n return null;\n }\n\n return assets[assets.findIndex((item) => item.id === assetId) - 1];\n};\n\nconst getNextEpisode = async ({\n vendor, assetId, categoryId, season\n}) => {\n const response = await api(\n vendor,\n getEndpoint(categoryId, season)\n );\n\n const assets = (response && response.assets);\n\n // empty assetId, get first episode from series which is last in list\n if (assetId === null) {\n return assets[assets.length - 1] || null;\n }\n\n return getNextFromEpisodeList(assetId, assets);\n};\n\n\nexport default {\n getNextEpisode\n};\n","import api from '../api';\n\nconst getEndpoint = (assetId, limit = 20, engine) => {\n if (engine.indexOf('related-exprmnts') > -1) {\n return `/assets/${engine}/${assetId}`;\n }\n return `/assets/${assetId}/${engine}?limit=${limit}`;\n};\n\n/**\n * Fetch related list from related endpoint\n *\n * @param vendor\n * @param assetId\n * @param limit\n * @param engine - curently supported engines related (tags); related-ml (machine learning related);\n * related-exprmnts build on top of ML engine with additional adjustments\n *\n * @returns {Promise<*>}\n */\nconst getList = async ({\n vendor, assetId, limit = 20, engine = 'related'\n}) => {\n const data = await api(\n vendor,\n getEndpoint(assetId, limit, engine)\n );\n\n // eslint-disable-next-line\n return data && data._embedded && data._embedded.assets;\n};\n\n\nexport default {\n getList\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\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 from '../api';\nimport { getMockAsset } from './asset/mock';\n\nconst getAssetEndpoint = (id) => {\n const additional = [\n 'settings', 'chapters', 'cuePoints', 'externalId', 'barrels',\n 'externalCategoryId', 'nextAsset', 'sourceFiles', 'subtitles',\n 'metadata', 'access', 'tags', 'stories'\n ];\n\n return `/assets/${id}?additional=${additional.join('|')}`;\n};\n\nconst getListEndpoint = ({ params = [], filters = [] }) => {\n const queryParams = [...params];\n\n if (filters.length > 0) {\n queryParams.push(`filters=${filters.join('|')}`);\n }\n\n return `/assets${queryParams.length > 0 ? `?${queryParams.join('&')}` : ''}`;\n};\n\nconst getById = async ({ vendor, assetId }) => api(\n vendor,\n getAssetEndpoint(assetId)\n);\n\nconst getByIds = async ({ vendor, ids }) => {\n const response = await api(\n vendor,\n getListEndpoint({\n params: [`limit=${ids.length}`],\n filters: [`assetId::${ids.join(',')}`]\n })\n );\n\n // eslint-disable-next-line\n return response._embedded && response._embedded.assets || [];\n};\n\nconst getClosestAsset = async ({\n vendor, order, categoryId, assetId, publishedDate\n}) => {\n const endpoint = getListEndpoint({\n params: [\n 'limit=1',\n 'sort=-published',\n // depending on from which \"side\" we're asking\n (order === 'next' ? `after=${publishedDate + 1}` : `before=${publishedDate - 1}`)\n ],\n\n filters: [\n `categoryId::${categoryId}`\n ]\n });\n\n const response = await api(\n vendor,\n endpoint\n );\n\n // parse response\n // eslint-disable-next-line\n if (response && response._embedded && response._embedded.assets) {\n // eslint-disable-next-line\n const [nextAsset] = response._embedded.assets;\n\n if (nextAsset && nextAsset.id !== assetId) {\n return nextAsset;\n }\n }\n\n return null;\n};\n\nexport default {\n getById,\n getByIds,\n getClosestAsset,\n getMockAsset\n};\n","\n var requestNumber, currentServerId, image, config, getServer, getImageTransform, serversAmount;\n\n 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 function getImageQuality(pixelRatio) {\n return (pixelRatio >= 2) ? 50 : 80;\n }\n\n function normalizeTransformSize(size, pixelRatio) {\n // return default value\n return [\n size,\n getImageQuality(pixelRatio)\n ];\n }\n\n function 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 function 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 */\n getImageTransform = (function() {\n var cache = {};\n\n return function(key, width, height) {\n var pixelRatio = getPixelRatio(),\n 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 var id = key.split('.'),\n i = 0,\n idLen = id.length,\n transformType = (height > width) ? 'autoWidth' : 'autoHeight',\n transformSizes = config.sizes, transform, maxDimension;\n\n while(i < idLen) {\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 transformSizes = transformSizes[transformType];\n\n // transformation is adjusted to not 'auto' side\n maxDimension = (transformType === 'autoHeight') ? width : height;\n maxDimension = maxDimension * pixelRatio;\n\n var dimensions = normalizeTransformSize(getClosestSize(transformSizes, maxDimension), pixelRatio);\n\n // auto width transform starts with 'x'\n // http://svp.vg.no/svp/api/v1/docs/\n transform = (transformType === 'autoWidth') ? 'x' : '';\n transform = transform + dimensions[0] + 'q' + dimensions[1];\n\n cache[cacheKey] = transform;\n\n return transform;\n };\n }());\n\n image = {\n initialize: function(options) {\n config = options;\n serversAmount = options.servers.length - 1;\n requestNumber = 0;\n currentServerId = 0;\n },\n getImageSrc: function(imageId, key, width, height) {\n if(imageId) {\n var 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\n export default image;\n\n","import utils from 'utils/utils';\nimport image from 'utils/image';\nimport Model from 'utils/model';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\n\nconst Stream = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nStream.prototype = {\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 data\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 hds: data.streamUrls.hds,\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.metadata) {\n result.is360 = data.metadata.is360 === 'true';\n }\n\n // this array contains other mp4 streams but without main mp4\n if (data.streamUrls.pseudostreaming) {\n result.streams.mp4 = result.streams.mp4.concat(data.streamUrls.pseudostreaming);\n }\n\n if (data.additional && data.additional.metadata) {\n if (data.additional.metadata.audioStream) {\n result.streams.audio = data.additional.metadata.audioStream;\n }\n result.disableNextVideo = data.additional.metadata.disableNextVideo;\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 // add midroll in 10s TODO remove after tests\n // result.cuePoints = [31];\n return result;\n },\n\n getId() {\n return this.get('id');\n },\n\n getVendor() {\n return this.get('vendor');\n },\n\n getCategory() {\n return this.get('category');\n },\n\n hasProperty(property) {\n return this.get('streamConfiguration').properties.indexOf(property) > -1;\n },\n\n /**\n * Get duration stored in API\n *\n * @returns {*}\n */\n getDuration() {\n return this.get('duration');\n },\n\n getCuePoints() {\n return this.get('cuePoints');\n },\n\n /**\n * Check if stream has Akamai Secure Token\n * @returns {*}\n */\n isSecure() {\n return this.hasProperty('tokenSecured');\n },\n\n /**\n * Check wheter give stream contains mock data to allow embedding player without asset id\n * @return {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 {*}\n */\n isGeoblocked() {\n return this.hasProperty('geoblocked');\n },\n\n isLive() {\n return this.get('type') === 'live';\n },\n\n wasLive() {\n return this.get('type') === 'wasLive';\n },\n\n isActive() {\n return this.get('status') === 'active' && !this.isPast();\n },\n\n isFuture() {\n return (this.get('flightTimes') && this.get('flightTimes').start\n ? this.get('flightTimes').start > new Date().getTime() : false);\n },\n\n isPast() {\n return (this.get('flightTimes') && this.get('flightTimes').end\n ? (this.get('flightTimes').end < new Date().getTime()) : false);\n },\n\n hasHds() {\n return this.getUrl('HDS').indexOf('f4m') > -1;\n },\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 getPoster() {\n return this.get('images').main;\n },\n\n /**\n * Get poster src adjusted to given width\n *\n * @param containerWidth\n * @returns {*}\n */\n getPosterSrc(containerWidth) {\n return image.getImageSrc(this.getPoster(), 'poster', containerWidth);\n },\n\n /**\n * Get snapshots url\n * @returns {*} - 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 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 hasAudioOnlyStream() {\n return typeof this.get('streams').audio === 'string';\n },\n\n getMp4Streams() {\n const streams = [];\n\n // mp4 streams are not available on live and secure hd\n if (this.hasMp4Streams()) {\n utils.each(this.get('streams').mp4, (stream) => {\n const streamData = stream.split('/').pop().replace('.mp4', '').split('_');\n\n streams.push({\n source: stream,\n width: streamData[0],\n height: streamData[1],\n bitrate: streamData[2]\n });\n });\n }\n\n return streams;\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 /**\n * Asset can be virually sliced into small chunks\n * These are only indicators and do not slice stream\n *\n * @param position\n * @returns {*}\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 * Check if ads are turned on\n *\n * @returns {boolean}\n */\n hasCreatives() {\n return this.get('na') !== true;\n },\n\n /**\n * External id\n * Used for JW Player statistics\n */\n getExternalId() {\n return this.get('externalId');\n },\n\n /**\n * Stream display mode\n *\n * @returns {*}\n */\n getDisplayType() {\n if (this.is360()) {\n return '360';\n }\n\n return '2d';\n },\n\n /**\n * Check if stream is 360 video\n */\n is360() {\n return this.get('is360') === true;\n },\n\n /**\n * Check wethever stream has ads disabled\n */\n hasAdsDisabled() {\n return this.get('showAds') === false;\n }\n};\n\nutils.extend(Stream.prototype, Model);\n\nexport default Stream;\n","const EXCLUDED_ASSETS_KEY = 'svp-excludedAssets';\n\n/**\n * Each vendor has own storage for excluded keys\n *\n * @param vendor\n * @returns {string}\n */\nconst getKey = function(vendor) {\n return `${EXCLUDED_ASSETS_KEY}-${vendor}`;\n};\n\nconst ExcludedAssets = {\n add(vendor, id) {\n let assets = this.getAll(vendor);\n\n if (id) {\n if (assets.indexOf(id) === -1) {\n // put at top as the older stream will be removed first\n assets.unshift(id);\n // limit only to 10 restricted streams\n assets = assets.splice(0, 10);\n }\n\n this.getStorage().setItem(getKey(vendor), JSON.stringify(assets));\n }\n },\n\n getAll(vendor) {\n return JSON.parse(this.getStorage().getItem(getKey(vendor))) || [];\n },\n\n getStorage() {\n return window.localStorage;\n }\n};\n\nexport default ExcludedAssets;\n","import ExcludedAssets from '../excluded-assets';\n\nconst omitRecurring = (vendor, assetId, assets) => {\n const excludedAssets = ExcludedAssets.getAll(vendor);\n\n // parse response\n if (!assets) {\n return null;\n }\n\n let nextAsset = null;\n\n for (let i = 0; i < assets.length; i += 1) {\n nextAsset = assets[i] || {};\n\n if (nextAsset.id !== assetId && excludedAssets.indexOf(nextAsset.id) === -1) {\n // exclude asset from recommended list\n ExcludedAssets.add(vendor, nextAsset.id);\n return nextAsset;\n }\n }\n\n return null;\n};\n\n/**\n *\n * @param array\n * @param randomIndex\n * @returns {*}\n */\nconst getExperimentName = (array, randomIndex) => {\n const element = array.find((item) => randomIndex >= item.start && randomIndex < item.end);\n\n if (element && element.name) {\n return element.name;\n }\n\n // fallback to default state\n return null;\n};\n\nconst getSource = (useMlEngine, experimentsList, seed) => {\n const experimentVariant = Math.floor(seed * 100);\n\n if (useMlEngine === false) {\n return 'related';\n }\n\n if (experimentsList.length > 0) {\n const experimentName = getExperimentName(experimentsList, experimentVariant);\n\n if (experimentName) {\n return `related-exprmnts/${experimentName}`;\n }\n }\n\n return 'related-ml';\n};\n\n\nexport default {\n omitRecurring,\n getSource\n};\n","/* eslint-disable no-underscore-dangle */\n\nimport seriesService from 'player/services/api/series';\nimport relatedService from 'player/services/api/related';\nimport assetService from 'player/services/api/asset';\nimport Stream from './stream';\nimport Asset from './asset';\n\nimport relatedHelpers from './recommended/related';\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, includeCategory) {\n if (asset.get('streamType') === 'live') {\n return false;\n }\n\n if (asset.get('nextAsset').id) {\n return true;\n }\n\n if (includeCategory === true) {\n return this.hasNextInCategory(asset);\n }\n\n return false;\n },\n\n /**\n * Check if given asset has next stream\n *\n * @param asset\n * @returns {boolean}\n */\n hasNextInCategory(asset) {\n const category = asset.getCategory();\n\n if (category) {\n if (category.isSeries()) {\n return true;\n }\n\n if (category.get('autoPlayNextAsset')) {\n return true;\n }\n }\n\n return false;\n },\n\n\n /**\n * Fetch next asset from asset series\n * Rejected when next asset is not found\n *\n * @param asset\n */\n async fetchNextFromSeries({\n vendor, assetId, season, categoryId\n }) {\n const nextAsset = await seriesService.getNextEpisode({\n vendor,\n assetId,\n categoryId,\n season\n });\n\n return createResponse({\n source: 'series',\n nextAsset\n });\n },\n\n /**\n * Fetch next asset from parent category\n * Rejected when next asset is not found\n *\n * @param asset object\n * @param settings\n */\n async fetchNextFromCategory ({\n vendor, published, categoryId, order\n }) {\n const nextAsset = await assetService.getClosestAsset({\n vendor,\n published,\n order,\n categoryId\n });\n\n return createResponse({\n source: `category-${order}`,\n nextAsset\n });\n },\n\n /**\n * Fetch next asset by providing it's id\n *\n * @param vendor\n * @param assetId\n * @param source\n * @returns {Promise<{nextAsset, source}>}\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 async fetchNextFromRelatedEngine({ vendor, assetId, source = 'related' }) {\n const assets = await relatedService.getList({\n engine: source,\n vendor,\n assetId\n });\n\n let nextAsset = null;\n\n if (source === 'related-exprmnts/getbyid') {\n // eslint-disable-next-line\n nextAsset = assets[0];\n } else {\n nextAsset = relatedHelpers.omitRecurring(vendor, assetId, assets);\n }\n\n return createResponse({\n nextAsset,\n source\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 asset\n * @returns {Promise}\n */\n async getNext(asset, { useMlEngine }) {\n const vendor = asset.getVendor();\n const assetId = asset.get('id');\n const category = asset.getCategory();\n const nextAssetId = asset.getNextAssetId();\n\n const categoryId = category.get('id');\n const season = parseInt(asset.get('season'), 10);\n\n // fetch next from series as user expects next episode to be played\n // when there is no next episode then we just display recommended grid\n if (category.isSeries() && season > 0) {\n const fetchNextParams = {\n season,\n categoryId,\n vendor,\n assetId\n };\n\n const result = await this.fetchNextFromSeries(fetchNextParams);\n\n // fetch next episode from following season\n if (!result.nextAsset) {\n return this.fetchNextFromSeries(Object.assign(fetchNextParams, {\n season: fetchNextParams.season + 1,\n assetId: null\n }));\n }\n return result;\n }\n\n const experiments = category.getRelatedExperiments();\n\n // no experiments set\n if (experiments.length === 0 && nextAssetId) {\n return this.fetchNextById({\n assetId: nextAssetId,\n vendor\n });\n }\n\n // with fallback to category related when there is no video from ml engine\n try {\n return await this.fetchNextFromRelatedEngine({\n source: relatedHelpers.getSource(\n useMlEngine,\n experiments,\n Math.random()\n ),\n vendor,\n assetId\n });\n } catch (e) {\n return this.fetchNextFromRelatedEngine({\n source: relatedHelpers.getSource(\n useMlEngine,\n [{ name: 'related-ml', begin: 0, end: 100 }],\n 0\n ),\n vendor,\n assetId\n });\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 asset\n * @param options\n * @returns {Promise}\n */\n async fetchNext(asset, options) {\n const { nextAsset, source } = await this.getNext(asset, options);\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","let translations = {};\n\nconst setTranslations = (data) => {\n translations = data;\n};\n\n// eslint-disable-next-line\nconst translate = (key, substitute) => {\n // typeof to check keys like \"0\"\n return translations[key] || (typeof substitute === 'undefined' ? key : substitute);\n};\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};\n","import moduleLoader from './module-loader';\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 (obj.hasOwnProperty(prop)) string.push(`${prop}: ${objectToString(obj[prop])}`);\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\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\nconst prettyObject = () => moduleLoader('https://cdn.svp.schibsted.io/tools/beautify.min.js')\n .then((module) => {\n if (module && typeof module.js_beautify === 'function') {\n return module.js_beautify;\n }\n return window.js_beautify;\n });\n\nexport {\n objectToString,\n prettyObject,\n capitalizeFirstLetter\n};\n","import config from 'player/config';\nimport utils from 'utils/utils';\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 parent\n * @param child\n * @returns {Array.}\n */\nfunction inherit(parent, child) {\n return (parent || []).concat(child || []);\n}\n\nconst Domain = {\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 vendors: {},\n\n initialize(domain) {\n this.domain = domain;\n },\n\n /**\n * Fetch permissions for extended settings\n *\n * @param vendor\n * @returns {*}\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 vendor - api vendor key\n * @returns {*}\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\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 constructor(assetId, maxBitrate) {\n /**\n * Id of SVP related asset\n */\n this.assetId = assetId;\n\n /**\n * Akamai token value retrieved from SVP api\n * @type {null}\n */\n this.value = null;\n /**\n * Expiration time, timestamp\n * @type {null}\n */\n this.expire = null;\n\n /**\n * Maximum allowed bitrate for stream\n * @type {null}\n */\n this.maxBitrate = maxBitrate || null;\n\n this.request = null;\n this.isFetching = false;\n }\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).then(fetchToken.bind(this));\n } else {\n this.request = fetchToken.call(this);\n }\n }\n\n return this.request;\n }\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 getValue() {\n return this.value;\n }\n\n isValid() {\n // on load expire is null therefore it will always return false\n return (+new Date() < this.expire);\n }\n}\n\n\nutils.extend(Token.prototype, utils.Events);\n\nexport default Token;\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\nfunction getDeviceType() {\n return utils.device.getDeviceType();\n}\n\nfunction getCountryCode(vendor) {\n return (vendor === 'ab' || vendor === 'svd') ? 'se' : 'no';\n}\n\nexport default {\n getVmapTag(params) {\n const queryObject = utils.extend({\n cb: (Math.round(Math.random() * 100000000000))\n }, params);\n\n return `${config.ads.appnexus.vmap}?${utils.jsonToUrl(queryObject)}`;\n },\n\n getAstConfig(tagOptions, globalOptions) {\n return utils.extend({}, utils.merge(globalOptions, tagOptions));\n },\n\n getDefaultParams(stream) {\n const vendor = stream.getVendor();\n\n return {\n countryCode: getCountryCode(vendor),\n supplyType: `web_${getDeviceType()}`,\n publisherName: vendor,\n slotIds: {\n preroll: 1,\n midroll: 2,\n postroll: 3\n }\n };\n }\n};\n","import utils from 'utils/utils';\nimport appnexusTag from './appnexus-tag-builder';\n\nconst JwAdsConfig = function (stream) {\n this.stream = stream;\n this.config = {};\n this.params = [];\n};\n\nJwAdsConfig.prototype = {\n setParams(params) {\n this.params = params;\n },\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: appnexusTag.getVmapTag(utils.merge(this.params, adSlotConfig))\n };\n }\n },\n\n getConfig() {\n return this.config;\n }\n};\n\nexport default JwAdsConfig;\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport appnexusTagBuilder from './appnexus-tag-builder';\nimport JwAdsConfig from './appnexus-jw-config';\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\n adsConfig.setParams(params);\n adsConfig.add(adSlots.preroll, 'pre', 'preroll');\n\n utils.each(stream.getCuePoints(), function (cuePoint) {\n if (cuePoint && cuePoint.timeline) {\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\nfunction getParams(params, memberId) {\n if (memberId) {\n return utils.extend({}, {\n member: memberId\n }, params);\n }\n\n return params;\n}\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\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\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\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 tag\n * @param startTime\n * @returns {{onEnter: onEnter, setTime: setTime, onReady: onReady}}\n */\nconst createMidroll = ({ tag, startTime }) => {\n let hasEntered = false;\n let onEnterCallback = () => {};\n\n const onEnter = (callback) => {\n onEnterCallback = callback;\n };\n\n const onReady = (callback) => {\n if (tag) {\n callback();\n }\n };\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\nexport default {\n 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 getLiveMidrollTag(maxDuration, stream, settings) {\n // eslint-disable-next-line consistent-return\n return getClientConfig(stream, settings).then(function (clientConfig) {\n if (clientConfig) {\n const { adSlots } = clientConfig;\n const midroll = adSlots && adSlots.schedule && adSlots.schedule.midroll;\n\n if (midroll) {\n const params = getParams((adSlots || {}).params, clientConfig.member);\n params.vmaxduration = maxDuration;\n\n return appnexusTagBuilder.getVmapTag(utils.merge(params, midroll));\n }\n }\n });\n },\n createMidroll\n};\n","import utils from 'utils/utils';\nimport appnexus from 'player/playback/ads/appnexus';\n\nfunction getPlaylist(streamUrl, stream, options, settings) {\n const {\n locale, poster, title, minDvrWindow\n } = options;\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 // 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 function addProgressiveMediaSources(playlistItem) {\n utils.each(stream.getMp4Streams(), function (mp4Stream) {\n playlistItem.sources.push({\n label: `${mp4Stream.height}p`,\n file: mp4Stream.source\n });\n });\n\n return playlistItem;\n }\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 function addCaptions(playlistItem) {\n if (stream.getCaptions().length > 0) {\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 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 function add3dSupport(playlistItem) {\n if (stream.getDisplayType() === '360') {\n playlistItem.stereomode = 'monoscopic';\n }\n\n return playlistItem;\n }\n\n return function (config) {\n return Promise.resolve({\n id: stream.getId(),\n image: poster,\n sources: [{\n file: streamUrl,\n // force stream type for mock stream which contains mp4 blob\n type: stream.isMock() ? 'video/mp4' : 'hls',\n default: true\n }],\n mediaType: stream.get('mediaType'),\n tracks: []\n })\n .then(addPlaylistMetadata)\n .then(addProgressiveMediaSources)\n .then(addCaptions)\n .then(addSnapshots)\n .then(add3dSupport)\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()) {\n return playlistItem;\n }\n\n return addAppnexusAds(adConfig, playlistItem);\n });\n })\n .then(function (playlistItem) {\n config.playlist = [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\n * @param globals\n * @return {*}\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(*): *}\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\nexport default function (stream, options) {\n // additional config options required for playback\n return function (config) {\n let canAutostart = options.autoplay;\n\n // firefox requires this flag to be set when playing SecureHD stream\n if (stream && stream.isSecure()) {\n config.withCredentials = true;\n }\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 };\n }\n\n // set repeat mode\n if (options.repeat === true) {\n config.repeat = options.repeat;\n }\n\n return config;\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\n load(options = {}) {\n this.options = options;\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 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(Object.assign(\n options, 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","/* global console */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport image from 'utils/image';\nimport { objectToString, prettyObject } from 'utils/string';\n\nimport config from 'player/config';\nimport Domain from 'player/model/domain';\nimport Token from 'player/model/token';\n\nimport locale from 'player/model/locale';\n\nimport appnexus from './ads/appnexus';\nimport addPlaylist 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';\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 * @param options\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 // token function for secured streams\n token: null\n };\n\n /**\n * JW Player Config\n */\n this.jwDefaults = {\n primary: null,\n hlshtml: true,\n base: config.cdn.player,\n flashplayer: `${config.cdn.player}/jwplayer.flash.swf`,\n wmode: 'transparent',\n key: config.player.keys.default\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 setStream(stream) {\n this.stream = stream;\n this.token = new Token(stream.get('id'), this.getMaxBitrate());\n },\n\n /**\n * Get config passed to SVP Player constructor\n * @returns {*|{}}\n */\n getRaw() {\n return this.rawOptions || {};\n },\n\n /**\n * Dump Javascript config to a string\n * @returns {Promise}\n */\n async dump() {\n const prettier = await prettyObject();\n return prettier(objectToString(this.getRaw()));\n },\n\n /**\n * TODO add tests\n *\n * @param stream\n * @param container\n * @returns {*}\n */\n getPoster(stream, playerContainer) {\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 * Retrieve token required for secure streams\n * Token expiry has to match API\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 // only live streams require custom metadata\n // it's used to trigger ads\n if (this.stream.isLive()) {\n params.push('custom-mdt=on');\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 * @param stream\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 (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\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 getJwConfig(stream) {\n const settings = this.getSettings();\n\n return Promise.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 primary: this.get('primary') || 'html5',\n localization: locale.translate('player', true),\n plugins: {},\n cast: {}\n }).then((jwConfig) => this.getStreamUrl('hls').then((streamUrl) => addPlaylist(\n streamUrl,\n stream,\n {\n poster: this.getPoster(stream),\n title: this.get('title') === true ? stream.get('title') : this.get('title'),\n locale: locale,\n minDvrWindow: this.get('minDvrWindow')\n },\n this.getPlaylistSettings()\n )(jwConfig)))\n .then(addSharing({\n options: this.get('sharing'),\n stream\n }))\n .then(setCaptions(this.get('captions')))\n .then(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 }))\n // enable only five percent of traffic for youbora\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 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\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 }\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","export 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\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","/* jshint bitwise: false */\nimport utils from 'utils/utils';\nimport Events from 'utils/backbone.events';\n\nfunction binarySearch(arr, compare) {\n // binary search, with custom compare function\n let l = 0;\n\n let r = arr.length - 1;\n let m;\n let comp;\n\n while (l <= r) {\n // eslint-disable-next-line no-bitwise\n m = l + ((r - l) >> 1);\n comp = compare(arr[m]);\n\n if (comp < 0) {\n // arr[m] comes before the element\n l = m + 1;\n } else if (comp > 0) {\n // arr[m] comes after the element\n r = m - 1;\n } else {\n return m;\n }\n }\n\n return l - 1; // return the index of the next left item\n // usually you would just return -1 in case nothing is found\n}\n\nconst Viewport = function() {\n this.current = null;\n};\n\nViewport.prototype = {\n labels: [\n 'tiny', 'tiny-small', 'tiny-small-medium',\n 'tiny-small-medium-big', 'tiny-small-medium-big-web', 'tiny-small-medium-big-web-wide'\n ],\n sizes: [0, 480, 640, 768, 1024, 1200],\n\n /**\n * Update player viewport which is not equal to browser wiewport\n *\n * @param width\n */\n update(width) {\n const newIndex = binarySearch(this.sizes, (x) => x - width);\n\n if (this.current !== newIndex) {\n const newBreakpoint = this.getViewportByIndex(newIndex);\n const currentBreakpoint = this.getViewportByIndex(this.current);\n\n this.trigger('change', newBreakpoint, currentBreakpoint);\n\n this.current = newIndex;\n }\n },\n\n getViewportByIndex(index) {\n return {\n width: this.sizes[index],\n label: this.labels[index]\n };\n }\n};\n\nutils.extend(Viewport.prototype, Events);\n\nexport default Viewport;\n","/* eslint-disable max-len */\nimport utils from 'utils/utils';\nimport locale from 'player/model/locale';\n\nimport playIcon from 'icons/play.svg';\nimport pauseIcon from 'icons/pause.svg';\nimport audioIcon from 'icons/audio.svg';\nimport audioMuted from 'icons/audio-muted.svg';\nimport homad from './homad-lib';\n\nfunction getAdPotTag(offset, adschedule) {\n const keys = Object.keys(adschedule);\n let tag = null;\n\n utils.each(keys, function (key) {\n if (key.indexOf(offset) > -1) {\n // eslint-disable-next-line prefer-destructuring\n tag = adschedule[key].tag;\n }\n });\n\n return tag;\n}\n\nfunction getTagUrl(potOffset) {\n return function (player) {\n const playlistItem = player.getPlaylist()[0];\n let tag = false;\n\n if (playlistItem.adschedule) {\n tag = getAdPotTag(potOffset, playlistItem.adschedule);\n }\n\n if (tag) {\n tag = tag.replace('vmap', 'ssvmap');\n } else {\n tag = false;\n }\n\n return tag;\n };\n}\n\n\nconst getHomadConfig = () => ({\n globalConfig: 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n clientConfig: '/homad-config.json',\n admessage() {\n return locale.translate('adblock').admessage;\n },\n skipable: true,\n skipAdOnContextChange: true,\n runInsideContainer: true,\n adjustAdVolumeToContentPlayer: true,\n postrollUseCompleteEvent: false,\n onReady() {\n },\n muteButton: `
${audioIcon}
`,\n unmuteButton: `
${audioMuted}
`,\n playButton: `
${playIcon}
`,\n pauseButton: `
${pauseIcon}
`,\n skipableButton: (function () {\n const adMessages = locale.translate('ads');\n return `
\n ${adMessages.skipmessage.replace('xx', '[time]')}\n \n \n \n
`;\n }()),\n skipButton: (function () {\n const adMessages = locale.translate('ads');\n\n return `
\n ${adMessages.skiptext}\n \n
`;\n }()),\n 'innerWarpper.style': '',\n prerollAdTag: getTagUrl('pre'),\n midrollAdTag: getTagUrl('mid'),\n postrollAdTag: getTagUrl('post')\n});\n\n/**\n * Homad AAB ads have single event bus for all players\n *\n * @param event\n */\nfunction parseHomadEvent(event) {\n // homad event details are under detils property\n const details = event && event.detail;\n\n // skip parsing when there is missing data or player is not registered\n if (!details || !this.events[details.containerId]) {\n return;\n }\n\n this.events[details.containerId].trigger(details.name, details);\n}\n\nexport default utils.extend({\n // events hashmap playerId -> eventBus\n // each player has its own events bus\n events: {},\n initialize() {\n const SvpPlayer = window.SVP.Player;\n\n if (!SvpPlayer.isHomadLoaded) {\n SvpPlayer.isHomadLoaded = true;\n\n const homadConfig = getHomadConfig();\n\n // override aab config url\n if (SvpPlayer.defaults.aabConfig) {\n homadConfig.clientConfig = SvpPlayer.defaults.aabConfig;\n }\n\n homad(homadConfig);\n\n window.addEventListener('hdEvent', parseHomadEvent.bind(this));\n }\n },\n\n /**\n * Get events for specific player\n * Events are matched by player id\n *\n * @param playerId\n * @returns {*}\n */\n getEvents(playerId) {\n // create event bus for specific player if this doesn't exist\n if (!this.events[playerId]) {\n this.events[playerId] = utils.extend({}, utils.Events);\n }\n\n return this.events[playerId];\n },\n\n /**\n * Remove player events from messaging bus\n * Prevents memory leaks\n *\n * @param playerId\n */\n removeEvents(playerId) {\n if (this.events[playerId]) {\n this.events[playerId].off();\n this.events[playerId].stopListening();\n\n this.events[playerId] = null;\n delete this.events[playerId];\n }\n }\n}, utils.Events);\n","const getPlaybackState = (container) => {\n const playerClassList = container.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\nconst getControlsContainer = (adPlayerContainer) => {\n const controlsContainer = adPlayerContainer.querySelector('.jw-icon').parentNode.parentNode;\n\n const appendControl = (domNode) => {\n controlsContainer.appendChild(domNode);\n };\n\n return {\n appendControl\n };\n};\n\nconst createProgressBar = (container) => {\n const seekBar = container.querySelector('.jw-controlbar').cloneNode(true);\n seekBar.querySelector('.jw-button-container').remove();\n seekBar.querySelector('.jw-progress').style.width = '0%';\n\n const progressLoader = seekBar.querySelector('.jw-progress');\n\n const setProgress = (value) => {\n progressLoader.style.width = `${value}%`;\n };\n\n return {\n domNode: seekBar,\n reset: () => setProgress(0),\n setProgress\n };\n};\n\nconst createFullscreenButton = (container) => {\n const fullscreenButton = container.querySelector('.jw-icon-fullscreen').cloneNode(true);\n const onClick = (handleClick) => {\n fullscreenButton.addEventListener('click', handleClick, true);\n };\n\n return {\n domNode: fullscreenButton,\n onClick\n };\n};\n\nconst toggleFullscreen = (jwPlayer) => {\n try {\n jwPlayer.setFullscreen();\n } catch (e) {\n // fullscreen did not work\n }\n};\n\nconst adjustVolumePosition = (adPlayerContainer) => {\n const volumeBtn = adPlayerContainer.querySelector('.jw-icon-volume');\n\n if (volumeBtn) {\n volumeBtn.parentNode.style.float = 'left';\n }\n};\n\nconst createHomadSkin = (player, adPlayer, adPlayerContainer) => {\n const container = player.getContainer();\n const { appendControl } = getControlsContainer(adPlayerContainer);\n\n const fullScreenButton = createFullscreenButton(container);\n fullScreenButton.onClick(() => toggleFullscreen(player.player));\n appendControl(fullScreenButton.domNode);\n\n const seekBar = createProgressBar(container);\n adPlayer.addEventListener(\n 'timeupdate',\n () => seekBar.setProgress((adPlayer.currentTime / adPlayer.duration) * 100),\n true\n );\n appendControl(seekBar.domNode);\n\n const { setAdPlaying, setAdComplete } = getPlaybackState(container);\n player.once('adSlotStart', seekBar.reset);\n player.once('adSlotStart', setAdPlaying);\n player.once('adSlotComplete', setAdComplete);\n\n adjustVolumePosition(adPlayerContainer);\n};\n\nexport {\n createHomadSkin\n};\n","/* global SVP */\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport HomadAds from './homad';\n\nimport { createHomadSkin } from './homad-skin';\n/**\n * Get Ad Player from player container\n *\n * @param parent\n * @param cb\n */\nfunction getAdPlayer(parent, cb) {\n const observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(mutation) {\n if (mutation.type === 'childList') {\n const nodes = mutation.addedNodes;\n\n if (nodes && nodes[0] && nodes[0].classList.length === 0) {\n const video = nodes[0].querySelector('video');\n\n if (video) {\n cb(video, nodes[0]);\n }\n }\n }\n });\n });\n\n // pass in the target node, as well as the observer options\n observer.observe(parent, {\n attributes: false,\n childList: true,\n characterData: false\n });\n}\n\n/**\n * Initialize ad player\n *\n * @param player\n * @returns {Function}\n */\nfunction initializeAdPlayer(player) {\n /**\n * Called every time ad video player is shown\n */\n return function (adPlayer, adPlayerContainer) {\n adPlayerContainer.classList.add('svp-homad-player');\n player.getContainer().classList.remove('jw-state-buffering');\n createHomadSkin(player, adPlayer, adPlayerContainer);\n };\n}\n\nfunction onAdError() {\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\nfunction onAdBreakStart(data) {\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 ((data && data.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/**\n * Forward events which are the same\n * @param eventName\n */\nfunction forwardEvent(eventName) {\n this.listenTo(this.events, eventName, function () {\n // trigger ad events only while ads are playing\n if (this.adPlaying === true) {\n // clear event data\n this.trigger(eventName);\n }\n }, this);\n}\n\nfunction onReady() {\n if (SVP.Player.isHomadLoaded !== true) {\n return;\n }\n\n // events are matched by player id\n const playerId = this.config.get('node');\n\n this.events = HomadAds.getEvents(playerId);\n\n this.listenTo(this.events, 'contentPlayerPlay', function () {\n this.getContainer().classList.remove('svp-homad-loading');\n }, this);\n\n this.listenTo(this.events, 'all', function (event, data) {\n logger('AAB').log(event, data);\n }, this);\n\n this.listenTo(this.events, 'adStart', function (data) {\n this.adPosition = data.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 }, this);\n\n this.listenTo(this.events, 'continueContent', function () {\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 this.listenTo(this.events, 'adTime', function (data) {\n if (data.currentTime && this.adPlaying) {\n this.trigger('adProgress', data.currentTime, data.duration);\n }\n }, this);\n\n this.listenTo(this.events, 'adMeta', function (data) {\n if (data) {\n this.trigger('adData', {\n adId: data.adId || null,\n impression: data.impressionURL || null\n });\n }\n }, this);\n\n utils.each(['adComplete', 'adSkipped', 'adPause', 'adPlay'], forwardEvent.bind(this));\n\n // cleanup events\n this.once('remove', HomadAds.removeEvents.bind(HomadAds, playerId));\n\n this.listenTo(this.player, 'adError', onAdError.bind(this));\n this.listenTo(this.player, 'adBreakStart', onAdBreakStart.bind(this));\n\n // turn off ad player loading when there is no ads\n this.listenTo(this.player, 'playlistItem', (playlistItem) => {\n if (playlistItem.item && !playlistItem.item.adschedule) {\n this.adPlaying = false;\n this.adPlayerLoading = false;\n }\n });\n\n // turn off ad player loading when there is no ads\n this.listenTo(this.player, 'adPlay', () => {\n this.adPlaying = true;\n this.adPlayerLoading = false;\n });\n\n this.adPlayerLoading = false;\n\n getAdPlayer(this.getContainer(), initializeAdPlayer(this));\n}\n\nexport default function (Player) {\n const { setup } = Player.prototype;\n\n // anti adblock works only for desktops\n if (!utils.device.isDesktop()) {\n return Player;\n }\n\n /**\n * Proxy player method\n * Call source when adblock is not present\n *\n * @param name\n * @param cb\n */\n function proxyMethod(name, cb) {\n const sourceMethod = Player.prototype[name];\n\n Player.prototype[name] = function () {\n const args = Array.prototype.slice.call(arguments);\n\n if (SVP.Player.isHomadLoaded !== true) {\n return sourceMethod.apply(this, args);\n }\n\n return cb.call(this, sourceMethod, args);\n };\n }\n\n Player.prototype.setup = function () {\n this.once('ready', onReady);\n return setup.call(this);\n };\n\n\n proxyMethod('onFirstFrameLoad', function (onFirstFrameLoad) {\n if (this.hasAdBlocked) {\n this.player.once('play', function () {\n this.player.once('providerFirstFrame', function () {\n onFirstFrameLoad.call(this, this.playlistItemId);\n }, this);\n }, this);\n } else {\n onFirstFrameLoad.call(this, this.playlistItemId);\n }\n });\n\n proxyMethod('onTime', function (onTime, args) {\n if (!this.adPlaying && this.adPlayerLoading === false) {\n onTime.apply(this, args);\n }\n });\n\n // eslint-disable-next-line consistent-return\n proxyMethod('onPlay', function (onPlay, args) {\n if (this.adPlayerLoading === false) {\n return onPlay.apply(this, args);\n }\n });\n\n //\n proxyMethod('onPause', function (onPause, args) {\n if (this.adPlaying === false && this.adPlayerLoading === false) {\n onPause.apply(this, args);\n }\n });\n\n proxyMethod('onComplete', function (onComplete, args) {\n if (this.adPlaying === false && (this.adPlayerLoading === false || this.adPlayerLoading === undefined)) {\n onComplete.apply(this, args);\n } else {\n this.listenToOnce(this.events, 'continueContent', function () {\n onComplete.apply(this, args);\n }, this);\n }\n });\n\n return Player;\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","const 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 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\nconst load = (svpPlayer) => {\n const handler = handle();\n\n /**\n * Get video tag from SVP Player\n *\n * @param player\n * @returns {Element | any}\n */\n const getVideo = (player) => player.getContainer().querySelector('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","const loadedStylesheets = [];\n\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\nexport default (path) => {\n return new Promise((resolve, reject) => loadStylesheet(path, resolve, reject));\n}","/* eslint-disable */\nimport utils from 'utils/utils';\n\nimport audio from 'icons/audio.svg';\nimport audioMuted from 'icons/audio-muted.svg';\nimport audioHalf from 'icons/audio-half.svg';\nimport captions from 'icons/captions.svg';\nimport chevronRight from 'icons/chevron-right.svg';\nimport fullscreenOff from 'icons/fullscreen-off.svg';\nimport fullscreenOn from 'icons/fullscreen-on.svg';\nimport pause from 'icons/pause.svg';\nimport play from 'icons/play.svg';\nimport playlist from 'icons/playlist.svg';\nimport settings from 'icons/settings.svg';\nimport share from 'icons/share.svg';\nimport info from 'icons/info.svg';\n\nimport avButton from 'icons/av-button.svg';\nimport defs from 'icons/defs.svg';\n\nconst iconsMap = {\n '.jw-svg-icon-play': play,\n '.jw-svg-icon-pause': pause,\n '.jw-skip-icon .jw-svg-icon-next': chevronRight,\n '.jw-svg-icon-settings': settings,\n '.jw-svg-icon-sharing': share,\n\n '.jw-svg-icon-cc-on': captions,\n '.jw-svg-icon-cc-off': captions,\n\n '.jw-svg-icon-volume-0': audioMuted,\n '.jw-svg-icon-volume-50': audioHalf,\n '.jw-svg-icon-volume-100': audio,\n\n '.jw-svg-icon-fullscreen-on': fullscreenOn,\n '.jw-svg-icon-fullscreen-off': fullscreenOff,\n\n 'info': info,\n 'avButton': avButton\n};\n\nlet defsLoaded = false;\n\nconst loadIcons = function(container) {\n utils.each(iconsMap, (customIcon, selector) => {\n const icons = Array.prototype.slice.call(container.querySelectorAll(selector));\n\n if (icons.length > 0) {\n utils.each(icons, icon => {\n if (icon) {\n const svpIcon = utils.createNode(customIcon);\n svpIcon.setAttribute('class', icon.getAttribute('class'));\n icon.parentNode.replaceChild(svpIcon, icon);\n }\n });\n }\n });\n};\n\nconst loadDefs = function (svpPlayer) {\n if(defsLoaded === false) {\n defsLoaded = true;\n\n svpPlayer.once('ready', () => {\n const container = svpPlayer.getContainer();\n\n if(container) {\n container.appendChild(utils.createNode(defs));\n }\n });\n }\n};\n\nconst getIcon = function (name) {\n return iconsMap[name];\n};\n\nexport { getIcon, loadDefs }\n\nexport default (svpPlayer) => {\n const jwPlayer = svpPlayer.player;\n\n jwPlayer.once('playlist', () => loadIcons(svpPlayer.getContainer()));\n}\n","const submenuHandler = (container) => {\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 svpPlayer.on('ready', () => submenuHandler(svpPlayer.getContainer()));\n};\n","import { copyToClipboard } from 'utils/clipboard';\n\nexport default (svpPlayer, { icon }) => {\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 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 = 'Loaded, click to copy';\n\n item.appendChild(infoNode);\n\n let isPrettierLoaded = false;\n\n infoNode.addEventListener('click', async () => {\n const config = await svpPlayer.config.dump();\n\n infoNode.classList.add('svp-link-tip');\n\n if (isPrettierLoaded === false) {\n setTimeout(() => {\n infoNode.classList.remove('svp-link-tip');\n }, 1000);\n\n isPrettierLoaded = true;\n infoNode.classList.add('svp-config-info--loaded');\n } else {\n infoNode.dataset.tip = 'Copied';\n\n copyToClipboard(config);\n\n setTimeout(() => {\n infoNode.classList.remove('svp-link-tip');\n }, 300);\n }\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 && el.previousSibling && value) {\n el.previousSibling.innerText = 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-tooltip-sharing-Embed'),\n code\n );\n }\n\n // link can be undefined\n if (link && hasMediaId(link) === false) {\n updateElement(\n container.querySelector('.jw-tooltip-sharing-Link'),\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","import styleLoader from 'utils/style-loader';\n\nimport loadIcons, { loadDefs, getIcon } from './skin/icons-loader';\nimport settingsMenu from './skin/settings-menu';\nimport configButton from './skin/config-button';\nimport sharingBox from './skin/sharing-box';\nimport fullscreenButton from './skin/fullscreen-button';\n\nimport containerClass from './skin/container-class';\nimport levelsIcon from './skin/levels-icon';\n\nconst loader = (jwConfig, skinLoader = styleLoader) => {\n // // disable multiple loading of JW skin\n if (jwConfig.skin && jwConfig.skin.url) {\n skinLoader(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\nexport { loader };\n\n/**\n * Load SVP Skin\n *\n * @param svpPlayerModel\n * @param options\n */\nexport default (svpPlayerModel) => {\n loadDefs(svpPlayerModel);\n\n settingsMenu(svpPlayerModel);\n configButton(svpPlayerModel, {\n icon: getIcon('info')\n });\n loadIcons(svpPlayerModel);\n sharingBox(svpPlayerModel);\n fullscreenButton(svpPlayerModel);\n containerClass(svpPlayerModel);\n levelsIcon(svpPlayerModel);\n};\n","import device from 'utils/device';\n\nexport default (svpPlayer) => {\n svpPlayer.on('playlistItem', (playlistItem = {}) => {\n if (device.isIOS()) {\n const fullscreenButton = svpPlayer.getContainer().querySelector('.jw-icon-fullscreen');\n const display = playlistItem.stereomode === 'monoscopic' ? 'none' : 'inherit';\n\n svpPlayer.on('initialPlay', () => {\n fullscreenButton.style.display = display;\n });\n }\n });\n};\n","/* globals jwplayer,console */\nimport utils from 'utils/utils';\nimport device from 'utils/device';\nimport logger from 'utils/logger';\nimport Viewport from './viewport';\nimport HomadAdsJw from './ads/homad-jw';\nimport autoplay from './config/autoplay';\nimport appnexus from './ads/appnexus';\nimport preventAdSeeking from './ads/prevent-seeking';\n\nimport youbora from './youbora';\nimport svpSkin, { loader as skinLoader } from './skin';\n\nconst PlayerModel = function (config) {\n /**\n * JW Player instance\n * @type {null}\n */\n this.player = null;\n this.stream = null;\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 {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 {null}\n */\n this.currentTime = null;\n\n /**\n * Breakpoints for visuals\n * @type {{xsmall: number, small: number, medium: number, big: number, web: number, webWide: number}}\n */\n this.viewport = new Viewport();\n this.listenTo(this.viewport, 'change', this.onViewportChange, this);\n\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/**\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 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 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 */\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\nfunction getAdPosition(slotId) {\n const slotKeys = { pre: 'preroll', mid: 'midroll', post: 'postroll' };\n\n return slotKeys[slotId];\n}\n\n/**\n * Parse adresponse for each adslot\n *\n * @param xml\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 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 * Extended ready event with info about device autoplay ability\n * @param data\n */\nfunction onReady(options, eventData) {\n this.trigger('ready', utils.extend(options, eventData));\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 player.setup(config);\n\n svpSkin(this);\n preventAdSeeking(this);\n // load youbora only for non-mock streams\n if (this.stream && this.stream.get('type') !== 'mock') {\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'\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, 'time', this.onTime, this);\n this.listenTo(player, 'resize', this.onPlayerResize, 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 // 'restart' stream only when flash has been blocked\n this.once('flashBlocked', function() {\n this.listenTo(player, 'providerChanged', this.play, this);\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\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.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 playNext(stream) {\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 // 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 async togglePlayback(type) {\n const streamType = type === 'audio' ? 'audio' : 'hls';\n const streamUrl = await this.config.getStreamUrl(streamType);\n const streamPoster = this.config.getPoster(this.stream);\n\n this.player.load([{\n id: this.stream.getId(),\n image: streamPoster,\n // image: '',\n sources: [{\n file: streamUrl,\n // force mp4 stream type for ads\n type: 'hls',\n default: true\n }],\n starttime: this.getCurrentTime(),\n playbackType: type,\n tracks: []\n }]);\n\n this.player.play(true);\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 {*}\n */\n getContainer() {\n return this.player.getContainer();\n },\n\n /**\n * Get playback volume\n * @returns {*}\n */\n getVolume() {\n return this.player.getVolume();\n },\n\n /**\n * Set playback volume\n * @param volume\n */\n setVolume(volume) {\n this.player.setVolume(volume);\n },\n\n /**\n * Get mute flag\n * @return {*|boolean}\n */\n getMute() {\n return this.player.getMute();\n },\n\n /**\n * Set mute param in player\n * @param value\n */\n setMute(value) {\n this.player.setMute(value);\n },\n\n /**\n * Seek\n */\n seek(time) {\n // flash bug - player is not seeking when stream hasn't started playing\n if (this.getCurrentTime() === 0) {\n // start stream only it's not playing\n // move this to play method?\n if (this.player.getState() !== 'playing') {\n this.play();\n }\n\n this.once('assetPlay', this.player.seek.bind(this.player, time));\n } else {\n this.player.seek(time);\n }\n },\n\n /**\n * Get player config. Method is asynchronous due to loading info from api\n *\n * @param 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\n */\n setStream(stream) {\n this.stream = stream;\n },\n\n /**\n * Get current stream loaded with player\n *\n * @returns {null|Stream|*}\n */\n getStream() {\n return this.stream;\n },\n\n /**\n * Check is ad is playing or not\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 */\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 // cleanup any bind listener\n this.off();\n\n if (this.player) {\n this.pause(true);\n\n this.player.off();\n this.player.remove();\n\n this.trigger('remove');\n }\n },\n\n /**\n * Get stream duration\n *\n * @returns {*}\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 {*}\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 getState() {\n if (this.isAdPlaying()) {\n return 'adPlaying';\n }\n\n return this.player.getState();\n },\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 * @returns {*}\n */\n getPoster(stream, container) {\n return this.config.getPoster(stream, container);\n },\n\n /**\n *\n * Get playback mode\n *\n * @returns {*}\n */\n getProvider() {\n const provider = this.player.getProvider();\n\n if (provider && provider.name === 'flash') {\n return 'flash';\n }\n\n return 'html5';\n },\n\n /**\n * Get list of captions extended by data from api\n *\n * @returns {*}\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 index (number|string) - 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 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 if (code === 210002) {\n // Flash plugin failed to load\n // click to play\n this.pause();\n this.trigger('flashBlocked');\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 */\n onPlaylistItemLoad(playlistItem) {\n if (!this.playlistItem || this.playlistItem.file !== playlistItem.item.file) {\n // cleanup any previous beforePlay event (playnext after countdown or error)\n this.stopListening(this.player, 'beforePlay');\n\n if (!this.playlistItem || this.playlistItem.id !== playlistItem.item.id) {\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\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 /**\n * Time\n *\n * @param data.position - current playback time\n * @param data.duration - current stream duration\n */\n onTime(data) {\n if (data.position < 0) {\n this.trigger('time', -(data.duration - data.position), -(data.duration));\n } else {\n this.trigger('time', data.position, data.duration);\n }\n },\n\n /**\n * Triggered on first frame of content playback - after ads\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 if (device.isSamsungInternet() && 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 /**\n * Handler for checking player size\n */\n onPlayerResize(data) {\n this.viewport.update(data.width);\n },\n\n onViewable(eventData) {\n const { viewable } = eventData;\n\n this.trigger('viewable', {\n viewable\n });\n },\n\n onAutostartNotAllowed(data) {\n const { reason } = data;\n\n if (reason === 'autoplayDisabled') {\n this.player.setMute(false);\n }\n },\n\n onViewportChange(currentViewport, previousViewport) {\n // remove current class from container if it exist\n if (previousViewport.label) {\n utils.removeClass(this.getContainer(), `svp-viewport-${previousViewport.label}`);\n }\n\n utils.addClass(this.getContainer(), `svp-viewport-${currentViewport.label}`);\n\n this.trigger('viewport', currentViewport, previousViewport);\n },\n\n /**\n * Schedule midroll to\n * @param slotDuration\n * @param 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', 'setCaptionsStyles'\n]));\n\n/* jshint newcap: false */\nexport default HomadAdsJw(PlayerModel);\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;","function copyProperties(target, source) {\n for (let key of Reflect.ownKeys(source)) {\n if (key !== \"constructor\" && key !== \"prototype\" && key !== \"name\") {\n let 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 (let 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","import 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 setPlayer(player) {\n this.player = player;\n this.setup(player);\n }\n}\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","/* global console */\nimport scriptLoader from 'utils/script-loader';\nimport logger from 'utils/logger';\nimport { createClass as createPluginClass } from 'player/plugins/model';\n\nconst plugins = {};\n\nconst Plugins = {\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 const loadPlugin = async pluginSrc => {\n try {\n await scriptLoader(pluginSrc);\n } catch (error) {\n // eslint-disable-next-line no-console\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 get(name) {\n return plugins[name];\n }\n};\n\nexport default Plugins;\n","/* global apntag */\nimport config from 'player/config';\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\n\nexport default utils.extend({\n isLoaded: null,\n\n load() {\n if (window.apntag) {\n this.isLoaded = true;\n return Promise.resolve();\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 defineTag(tagId, tagOptions) {\n return this.load().then(() => {\n const tagConfig = utils.merge({\n targetId: tagId\n }, tagOptions);\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 showTag(tagId) {\n if (this.isLoaded) {\n apntag.showTag(tagId);\n }\n },\n\n refreshTag(tagId) {\n if (this.isLoaded) {\n apntag.refresh([tagId]);\n }\n },\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 off(targetId) {\n if (this.isLoaded) {\n apntag.offEvent('adLoaded', targetId);\n }\n }\n}, utils.Events);\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().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 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().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().removeChild(this.el);\n this.el = null;\n }\n }\n\n});\n\nexport default PausePlugin;\n","import utils from 'utils/utils';\nimport PluginModel from './model';\nimport locale from 'player/model/locale';\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 }\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(`
${ageLimit}
`);\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 // hide label after 3 seconds\n this.listenToOnce(this.player, 'time', setTimeout.bind(null, this.hide.bind(this), 3000));\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 locale from 'player/model/locale';\n\nimport countdownTemplate from './countdown.html';\nimport PluginModel from './model';\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.start = options.start;\n\n this.liveDOM = null;\n this.countdownDOM = null;\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 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.bind(this, 'start'));\n\n // interval has to be initialized on\n this.intervalId = setInterval(this.refresh.bind(this), 1000);\n this.refresh();\n }\n\n refresh() {\n const start = this.getDateData(this.start);\n\n // trigger only if date has changed\n if (this.repaint(start)) {\n this.trigger('change', start);\n }\n }\n\n repaint(date) {\n const string = [];\n const liveDate = this.start;\n\n if (this.isCountdownActive()) {\n string.push(`${leadingZeros(date.min)}:`);\n string.push(`${leadingZeros(date.sec)}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(`${liveDate.getDate()} ${locale.getMonthName(liveDate)} `);\n string.push(`${leadingZeros(liveDate.getHours())}:`);\n string.push((leadingZeros(liveDate.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 return true;\n }\n\n return false;\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 getDateData(endDate) {\n let diff = (endDate - Date.parse(new Date())) / 1000;\n\n // end of counting\n if (diff <= 0) {\n diff = 0;\n\n if (this.intervalId) {\n this.stop();\n }\n }\n\n const dateData = {\n years: 0,\n days: 0,\n hours: 0,\n min: 0,\n sec: 0\n };\n\n if (diff >= (365.25 * 86400)) {\n dateData.years = Math.floor(diff / (365.25 * 86400));\n diff -= dateData.years * 365.25 * 86400;\n }\n\n if (diff >= 86400) {\n dateData.days = Math.floor(diff / 86400);\n diff -= dateData.days * 86400;\n }\n\n if (diff >= 3600) {\n dateData.hours = Math.floor(diff / 3600);\n diff -= dateData.hours * 3600;\n }\n\n if (diff >= 60) {\n dateData.min = Math.floor(diff / 60);\n diff -= dateData.min * 60;\n }\n\n dateData.sec = Math.floor(diff);\n\n return dateData;\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 const now = new Date();\n\n // less than 1 hour\n return (Math.abs(this.start.getTime() - now.getTime())) < 3599999;\n }\n}\n\nexport default CountdownPlugin;\n","\nimport assetService from 'player/services/api/asset';\nimport relatedService from 'player/services/api/related';\nimport Asset from '../asset';\n\n// eslint-disable-next-line\nconst mapResponse = (vendor, assets) => assets.map((asset) => {\n // add vendor to assets\n return new Asset(Object.assign({\n vendor\n }, asset));\n});\n\n/**\n * Get related engine\n *\n * @param useMlEngine\n * @returns {string}\n */\nconst getEngine = (useMlEngine) => (useMlEngine === true ? 'related-ml' : 'related');\n\nconst fetchByIds = async ({ vendor, ids }) => {\n const assets = await assetService.getByIds({\n vendor,\n ids\n });\n\n return mapResponse(vendor, assets);\n};\n\nconst fetchFromRelatedEngine = async({ vendor, assetId, useMlEngine }) => {\n let assets = await relatedService.getList({\n engine: getEngine(useMlEngine),\n vendor,\n assetId\n });\n\n // fetch from old recommended\n if (useMlEngine === true && assets.length === 0) {\n assets = await relatedService.getList({\n engine: getEngine(false),\n vendor,\n assetId\n });\n }\n\n return mapResponse(vendor, assets);\n};\n\n\nexport default {\n fetchByIds,\n fetchFromRelatedEngine\n};\n","/* eslint-disable no-underscore-dangle */\nimport utils from 'utils/utils';\nimport nextAsset from './next-asset';\nimport recommendedList from './recommended/list';\n\nclass Recommended {\n constructor({ asset, ml }) {\n this.asset = asset;\n this.useMlEngine = (ml !== false);\n }\n\n /**\n * Fetch next asset\n *\n * @returns {Promise}\n */\n getNextAsset(options = {}) {\n const { asset, useMlEngine } = 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(this.asset, {\n useMlEngine\n });\n }\n\n\n /**\n * Fetch recommended asset list\n * Fetch assets by ids when items provided as a param\n *\n * @param items optional array of ids\n * @returns {*}\n */\n async getItems(items) {\n const { useMlEngine } = this;\n\n const vendor = this.asset.getVendor();\n const assetId = this.asset.get('id');\n\n if (!utils.isArray(items) || items.length === 0) {\n return recommendedList.fetchFromRelatedEngine({\n vendor,\n assetId,\n useMlEngine\n });\n }\n\n return recommendedList.fetchByIds({\n ids: items,\n vendor\n });\n }\n}\n\nexport default Recommended;\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 assetId - SVP Asset id\n * @param 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 key\n * @returns {*}\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 * Click handler for recommended grid\n *\n * @param 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 ml: this.settings.ml\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(this.settings.grid.items).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 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 15s before playback end\n let fetchDuration = this.player.getDuration() - 15;\n\n // for streams shorter than 15s load next in 2s\n if (fetchDuration < 0) {\n fetchDuration = 2;\n }\n const isLive = this.player.model.getStream().isLive();\n const isDisabledNextVideo = this.player.model.getStream().isDisabledNextVideo();\n\n // do not enable recommended for live streams and asset with metadata.disableNextVideo set to true\n if (!isLive && !isDisabledNextVideo) {\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 */\nfunction onPlaybackComplete(reason) {\n // do not take any action if complete is triggered by playNext\n if (reason === 'playNext' || reason === 'stop') {\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 time\n * @param 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 timeout - duration of countdown\n */\nfunction onPlayNextVisible(timeout) {\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 */\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/**\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: {\n items: []\n },\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\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","/* global console */\nimport utils from 'utils/utils';\n\nconst ClickTracker = {\n vendor: null,\n\n mode: 'TRACK',\n url: '//click.vgnett.no/svp.gif?s=',\n\n /**\n * Track media event\n *\n * @param data\n */\n trackMediaEvent(data) {\n const query = [];\n\n query.push(`d=${this.getDeviceType()}`);\n query.push(`v=${data.assetId}`);\n\n this.sendRequest('media', query.join('&'));\n },\n\n /**\n * Track playback events in certain time\n *\n * @param data\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, 'stream', query.join('&')), Math.floor((Math.random() * 100) + 1));\n },\n\n /**\n * Send API request using 1x1px image\n *\n * @param type\n * @param queryString\n */\n sendRequest(type, queryString) {\n const image = new Image();\n const apiUrl = this.getApiUrl(type);\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 /**\n * Return full API endpoint url\n *\n * @returns {string}\n */\n getApiUrl(type) {\n if (this.vendor === 'vgtv' && type === 'media') {\n return '//click.vgnett.no/vgtv.gif';\n }\n\n return this.url + this.vendor;\n },\n\n /**\n * Tracking is divided by device type\n *\n * @returns {*}\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/**\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\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\n\nexport default SvpStatsPlugin;\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","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 AdEvents extends Eventable {\n constructor(player) {\n super();\n this.player = player;\n this.adData = {};\n this.beforeUnload = ['beforeunload', this.onAdSlotComplete.bind(this), true];\n\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\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, 'ready', this.onReady, this);\n }\n\n onReady() {\n this.listenTo(this.player.model.player, 'adImpression', (adData) => {\n Object.assign(this.adData, {\n duration: Math.round(adData.duration)\n });\n });\n }\n\n onAdSlotStart(slotData) {\n window.addEventListener(...this.beforeUnload);\n\n Object.assign(this.adData, {\n type: slotData.position\n });\n }\n\n onAdStarted() {\n Object.assign(this.adData, {\n start: true\n });\n\n this.listenToOnce(this.player.model.player, 'adMeta', (adData) => {\n let adId = null;\n\n try {\n const adXml = adData.response.querySelectorAll('Ad')[adData.sequence - 1];\n adId = adXml.id;\n } catch (e) {\n // could not find Ad element\n }\n\n Object.assign(this.adData, {\n id: adId,\n sequence: adData.sequence,\n count: adData.podcount,\n position: 0\n });\n });\n }\n\n onAdProgress(time) {\n const position = Math.floor(time);\n const previousPosition = this.adData.position;\n\n Object.assign(this.adData, {\n position\n });\n\n if (previousPosition !== position) {\n this.trigger('Watch', this.adData);\n }\n }\n\n onAdSlotComplete() {\n window.removeEventListener(...this.beforeUnload);\n\n // prevent cleaning object by reference\n this.trigger('Stop', Object.assign({}, this.adData));\n this.adData = {};\n }\n\n onAdPlay() {\n this.trigger('Play', this.adData);\n\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 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 session from './session';\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) {\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.beforePlaybackStarted = true;\n this.beforeUnload = ['beforeunload', this.onBeforeUnload.bind(this), true];\n this.playMethod = null;\n\n this.listenTo(this.player, 'playlistItem', this.onPlaylistItem, this);\n this.listenTo(this.player, 'initialPlay', this.onInitialPlay, 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, 'complete', this.onComplete, 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(\n this.player,\n 'RecommendedPlugin:nextAssetPlay',\n (asset, mode, options) => this.onRecommendedPlay(`recommendedNext-${options.source}`)\n );\n\n this.listenTo(\n this.player,\n 'RecommendedPlugin:playRecommended',\n this.onRecommendedPlay.bind(this, 'recommendedGrid')\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 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, eventInterval = 1) {\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 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 onInitialPlay() {\n this.beforePlaybackStarted = false;\n }\n\n onPlaylistItem() {\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 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 === false) {\n this.trigger('Play', this.eventData);\n }\n }\n\n /**\n * Intervals for VOD are defined as follow\n *\n * every 1s - during the first 10 seconds of content playback (no matter of where playback has started\n * every 5s - for rest of content playback, after seeking intervals should be triggered in same time\n * seek 42, then first trigger should be in 45\n */\n onTime(eventTime) {\n const time = Math.floor(eventTime);\n const eventInterval = time > 10 ? 5 : 1;\n\n this.trackTimeEvent(time, eventInterval);\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(eventTime, 5);\n }\n\n onComplete(reason) {\n this.beforeStreamStart = true;\n\n if (reason === 'playNext') {\n this.onRecommendedPlay('playNext');\n }\n\n /**\n * Track stop event only when playback has started\n */\n if (this.beforePlaybackStarted === 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 }\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","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 AdEvents extends Eventable {\n constructor(player) {\n super();\n this.player = player;\n this.listenTo(this.player, 'ready', this.onReady, this);\n\n\n this.listenTo(\n this.player,\n 'RecommendedPlugin:playNextVisible',\n this.onRecommendedVisible,\n this\n );\n }\n\n onRecommendedVisible() {\n this.trigger('UiElement', {\n id: this.player.getAsset().get('id'),\n name: 'nextAssetCountdown'\n });\n }\n\n destroy() {\n this.stopListening();\n }\n}\n\nexport default AdEvents;\n","import config from 'player/config';\n\nclass CategoryTree {\n constructor(vendor) {\n this.vendor = vendor;\n }\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 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\nconst instances = {};\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';\n\nimport logger from 'utils/logger';\n\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') || []).map((tag) => 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\nconst 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) {\n super(options);\n this.provider = options.provider;\n this.decorator = options.decorator || ((data) => data);\n this.embed = options.embed === true;\n this.previousAssetId = options.previousAssetId;\n\n this.tracker = null;\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 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 logger('Pulse').log(JSON.stringify(eventData, null, 4));\n tracker.track(eventName, eventData);\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\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 // initialize only once\n Promise.all([\n PulseTracker.init(this.provider),\n this.categoryTree.fetch()\n ]).then((data) => this.onReady(data));\n\n this.adEvents = new AdEvents(this.player);\n this.playbackEvents = new PlaybackEvents(this.player);\n this.uiEvents = new UiEvents(this.player);\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 const { config } = this.player;\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 autoplay: data.playMethod === null\n ? (config.get('autoplay') === true)\n : (data.playMethod === 'autostart' || data.playMethod === 'external'),\n embed: this.embed\n }, this.asset)\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\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 * 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 mediaAssetId: getMediaAssetId(this.provider, asset.get('id'))\n }\n };\n\n if (data.count > 1) {\n trackingData.object.slotNumber = data.sequence;\n }\n\n if (data.duration) {\n trackingData.object.duration = data.duration;\n }\n\n if (data.start === true) {\n trackingData.start = true;\n }\n\n 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 })\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","/* globals console */\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\nimport errorIcon from 'icons/error.svg';\nimport Asset from './model/asset';\nimport NextAsset from './model/next-asset';\nimport Stream from './model/stream';\nimport locale from './model/locale';\nimport Config from './playback/config';\nimport Provider from './playback/provider';\nimport { APPNEXUS_PROVIDER_ID } from './services/api';\nimport assetService from './services/api/asset';\nimport Domain from './model/domain';\nimport SvpPlugins from './plugins';\nimport PausePlugin from './plugins/pause';\nimport AgeLimitPlugin from './plugins/age-limit';\nimport SponsorLabelPlugin from './plugins/sponsor-label';\nimport CountdownPlugin from './plugins/countdown';\nimport RecommendedPlugin from './plugins/recommended';\nimport SvpStatsPlugin from './plugins/svp-stats';\nimport PulseTracker from './plugins/pulse-stats/tracker';\nimport PulseStatsPlugin from './plugins/pulse-stats';\n\nimport statusCode, { NOT_FOUND, GENERAL_ERROR } from './playback/config/status-codes';\n\n/**\n * Remove single plugin instance\n * Clear all listeners\n * Remove from plugins hashmap\n *\n * @param plugin\n */\nfunction 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/**\n * Clear error message\n * @param node\n */\nfunction 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 * @param node\n * @param message\n * @param code\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 *\n * @param event\n * @param details\n */\nfunction onError(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 * Player initialized and single playlistItem is laoded\n */\nfunction onPlaylistItem() {\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 // add translation for live button via data-label\n container.getElementsByClassName('jw-icon-display')[0]\n .setAttribute('data-label', locale.translate('Live button'));\n }\n\n this.trigger('playlistItem');\n}\n\n/**\n * Stream completed, fired for every item in playlist\n * Clear settings which are only for one stream\n */\nfunction 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\n/**\n * Proxy player events\n */\nfunction 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\n\n/**\n *\n *\n * @param options Caution, param is bound in constructor\n */\nfunction 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\n/**\n * this always points to Player object\n */\nfunction 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\n if (node) {\n clearError(node);\n }\n\n // add hasNext checking\n stream.set('hasNext', NextAsset.hasPlayNext(this.asset));\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 // set start time if chapter is provided\n if (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 (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) {\n // countdown is disable in preview mode on non live streams\n if (settings.preview !== true || stream.isLive()) {\n this.addPlugin(new CountdownPlugin({\n start: new Date((new Date().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 }));\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 pulseConfig = configuration.get('pulse');\n\n /**\n * Disable Pulse tracking for mock/ads only playback\n */\n if (pulseConfig && pulseConfig.provider && stream.isMock() === false) {\n this.addPlugin(new PulseStatsPlugin(pulseConfig));\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 // 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\n/**\n * Asset fetch failed. Usually happens when network issue occurred\n */\nfunction onAssetError(error) {\n const code = (error && error.status === 404) ? NOT_FOUND : GENERAL_ERROR;\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').log('error', error);\n\n // display errors in development mode\n if (config.env === 'development') {\n throw error;\n }\n}\n\nconst Player = function(configuration) {\n const options = Object.assign({}, configuration);\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) {\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 // allow to override token api url\n if (options.tokenUrl) {\n config.api.tokenUrl = options.tokenUrl;\n }\n\n // allow to override thumbnails api url\n if (options.thumbnailsUrl) {\n config.api.thumbnailsUrl = options.thumbnailsUrl;\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 // sync browser time with server\n if (!options.serverTime) {\n ServerTime.fetch(config.time);\n }\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 position - seconds (int)\n */\n play(position) {\n // stream will play only if publication date is valid\n if (this.model.getStream().getTimeToStart() < 0) {\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 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 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 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 id\n */\n playNext(id, options = {}) {\n const onNextAssetReady = function () {\n const stream = this.model.getStream();\n\n if (options && options.time) {\n stream.set('playAhead', options.time);\n }\n\n // trick to avoid create of new stream as it's set in assetReady\n this.model.playNext(stream);\n this.isPlayNextAvailable = true;\n }.bind(this);\n\n if (this.isPlayNextAvailable) {\n // complete current stream\n onComplete.call(this, 'playNext');\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 volume - number between 0 and 100\n */\n setVolume(volume) {\n this.model.setVolume(volume);\n },\n\n /**\n * Get playback volume\n * @returns {*}\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 value\n */\n setMute(value = true) {\n this.model.setMute(value);\n },\n\n /**\n * Get playback volume\n * @returns {*}\n */\n getMute() {\n return this.model.getMute();\n },\n\n /**\n * Get player state\n */\n getState() {\n return this.model.getState();\n },\n\n /**\n * Get stream duration\n *\n * @returns {*}\n */\n getDuration() {\n return this.model.getDuration();\n },\n\n /**\n * Get current playback time\n */\n getCurrentTime() {\n return this.model.getCurrentTime();\n },\n\n /**\n * Get quarter of stream.\n * Can be used for tracking\n *\n * @returns {number}\n */\n getCurrentQuartile() {\n return Math.ceil((this.getCurrentTime() / this.getDuration()) / 0.25);\n },\n\n /**\n * Get device type\n *\n * @returns {*}\n */\n getDeviceType() {\n if (utils.device.isIPhone()) {\n return 'iPhone';\n }\n\n if (utils.device.isIPad()) {\n return 'iPad';\n }\n\n if (utils.device.isAndroid()) {\n return 'android';\n }\n\n return 'desktop';\n },\n\n /**\n * Get current playback provider\n */\n getProvider() {\n return this.model.getProvider();\n },\n\n /**\n * Get current captions list\n */\n getCaptionsList() {\n return this.model.getCaptionsList();\n },\n\n /**\n * Get currently playing captions\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 */\n setCurrentCaptions(index) {\n return this.model.setCurrentCaptions(index);\n },\n\n /**\n * Override captions styles\n * @param styles\n */\n setCaptionsStyles(styles) {\n return this.model.setCaptionsStyles(styles);\n },\n\n /**\n * Get Player DOM Node\n *\n * @returns {*}\n */\n getContainer() {\n return this.model.getContainer();\n },\n\n stop() {\n return this.model.stop();\n },\n\n /**\n * Set asset resource\n * @param 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 current loaded asset\n * @returns {null}\n */\n getAsset() {\n return this.asset;\n },\n\n /**\n * Add plugin to the player\n *\n * @param 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 plugin - name of the plugin\n * @returns {*}\n */\n getPlugin(plugin) {\n return this.plugins[plugin];\n }\n};\n\n/**\n * Checks if device can autoplay stream\n *\n * @returns {*}\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","const hasAdblock = () => {\n let detected = false;\n\n // create the bait\n try {\n const bait = document.createElement('div');\n bait.setAttribute('class', 'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links');\n bait.setAttribute('style', 'width: 1px ! important; height: 1px !important; position: absolute !important; left: -10000px !important; top: -1000px !important;');\n window.document.body.appendChild(bait);\n\n // check if the bait has been affected by an adblocker\n if(window.document.body.getAttribute('abp') !== null\n || bait.offsetParent === null\n || bait.offsetHeight == 0\n || bait.offsetLeft == 0\n || bait.offsetTop == 0\n || bait.offsetWidth == 0\n || bait.clientHeight == 0\n || bait.clientWidth == 0) {\n detected = true;\n } else if(window.getComputedStyle !== undefined) {\n const baitTemp = window.getComputedStyle(bait, null);\n\n if(baitTemp && (baitTemp.getPropertyValue('display') === 'none' || baitTemp.getPropertyValue('visibility') === 'hidden')) {\n detected = true;\n }\n }\n\n // destroy the bait\n window.document.body.removeChild(bait);\n } catch (e) {\n detected = false;\n }\n\n return detected;\n};\n\n\n\nexport default hasAdblock;","import config from 'player/config';\nimport Player from 'player/player';\nimport image from 'utils/image';\nimport utils from 'utils/utils';\nimport hasAdblock from 'utils/adblock-detect';\n\nimport locale from 'player/model/locale';\nimport Domain from 'player/model/domain';\nimport HomadAds from 'player/playback/ads/homad';\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 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 * Determine if user is in 5% range of available traffic\n * We set half of 5% because autoplay gives around 2x traffic\n * @type {boolean}\n */\nconst loadYoubora = (options) => {\n // youbora plugin can be disabled completely\n try {\n if (localStorage.svpYoubora === 'true' || (options !== false && Math.random() < 0.025)) {\n youbora.load(options);\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\nconst preInitialize = () => {\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 const { aab } = SVP.Player.defaults;\n\n // set locale for all players\n setLocale(SVP.Player.defaults.locale);\n\n // load homad only for desktop\n // detect if adblock exist for \"auto\" mode\n // force loading when mode is set to \"true\" (forces for all desktops)\n if (utils.device.getDeviceType() === 'desktop' && ((aab === 'auto' && hasAdblock() === true) || aab === true)) {\n HomadAds.initialize();\n }\n\n loadYoubora(SVP.Player.defaults.youbora);\n};\n\nexport default SVP;\nexport { preInitialize, postInitialize };\n"],"sourceRoot":""}