{"version":3,"file":"js/playerBase.compiled.js","mappings":"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","sources":["/source/webpack/universalModuleDefinition","/source/./Frontend/src/assets/js/components/AviaVodContainer/utils.ts","/source/./Frontend/src/assets/js/tenplay/@types/bc.interface.ts","/source/./Frontend/src/assets/js/tenplay/@util/device.ts","/source/./Frontend/src/assets/js/tenplay/@util/userFlag.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/allocator.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/allocator.type.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/allocator.video.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/allocator.video.type.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/id3/id3Processor.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/id3/id3Processor.type.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/oztam.v2.lib.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/oztam.v2.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/tealium.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/tracking.conf.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/tracking.env.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/tracking.init.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/util.ts","/source/./Frontend/src/assets/js/tenplay/pkgAviaAllocator/util/callStack.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/api/api.bvod.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/api/api.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/api/api.video.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/avia.lib.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/commonPlugins/ConsumerAdvice/AviaConsumerAdvice.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/global/config.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/index.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/index.type.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/Plugins/LogoDisplay/AviaLogoDisplayOverlayPlugin.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/Plugins/LogoDisplay/index.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/Plugins/Overlay/AviaOverlayPlugin.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/Plugins/Overlay/index.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/liveCtrl.tsx","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/liveCtrl.util.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/liveWatchedTime.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/track/allocatorLive.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/track/allocatorLive.type.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/live/track/oztam.v2.aviaLive.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/jwt/cacheStatus.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/jwt/enum.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/overlayFactory.tsx","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/overlayTemplate.tsx","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/player.util.type.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/player.utls.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/playerCtrl.tsx","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/playerCtrl.type.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/slate/slateTemplate.tsx","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/track/tealium.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/util/adBlockCheck.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/util/detectOs.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/util/device.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/util/env.util.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/util/imaUtil.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/player/util/isShow.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/Plugins/createUpNext/UpNextPlugin.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/Plugins/createUpNext/enums.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/Plugins/createUpNext/ui-templates/upNextCard.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/Plugins/createUpNext/ui-templates/videoEndPanel.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/Plugins/display/AviaDisplayPlugin.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/track/allocatorVod.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/track/allocatorVod.type.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/track/oztam.v2.aviaVod.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/track/tealium.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/util/VideoProgressEnums.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/util/VideoProgressManager.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/util/VideoProgressManagerQuery.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/util/VideoTextTrackManager.ts","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/vodCtrl.tsx","/source/./Frontend/src/assets/js/tenplay/pkgPlayer/vod/vodCtrl.util.ts","/source/./Frontend/src/assets/js/tenplay/ten/conf.env.ts","/source/./Frontend/src/assets/js/tenplay/ten/cust.env.ads.ts","/source/./Frontend/src/assets/js/tenplay/ten/cust.env.ads.util.ts","/source/./Frontend/src/assets/js/tenplay/ten/cust.env.base.ts","/source/./Frontend/src/assets/js/tenplay/ten/cust.env.track.ts","/source/./Frontend/src/assets/js/tenplay/ten/cust.env.ts","/source/./Frontend/src/assets/js/tenplay/ten/env.enum.ts","/source/./Frontend/src/assets/js/tenplay/ten/env.utag.ts","/source/./Frontend/src/assets/js/tenplay/ten/env.util.ts","/source/./Frontend/src/assets/js/tenplay/tenAds/freeWheelManager.ts","/source/./Frontend/src/assets/js/tenplay/tenAds/page.path.processor.ts","/source/./Frontend/src/assets/js/tenplay/tenAds/util.adhesion.ts","/source/./Frontend/src/assets/js/tenplay/tenAds/util.c06.ts","/source/./Frontend/src/assets/js/tenplay/tenAds/util.mrec.carousel.ts","/source/./Frontend/src/assets/js/tenplay/tenAds/util.skin.ts","/source/./Frontend/src/assets/js/tenplay/tenTrack/track.allocator.ts","/source/./Frontend/src/assets/js/tenplay/tenTrack/track.allocator.video.ts","/source/./Frontend/src/assets/js/tenplay/tenTrack/track.dataModel.ts","/source/./Frontend/src/assets/js/tenplay/tenTrack/track.init.ts","/source/./Frontend/src/assets/js/tenplay/tenVod/@types/bc.interface.ts","/source/./Frontend/src/assets/js/tenplay/tenVod/plugins/drmFilter.ts","/source/./Frontend/src/assets/js/tenplay/tenVod/plugins/errorHandler.ts","/source/./Frontend/src/assets/js/tenplay/tenVod/plugins/eventHandler.ts","/source/./Frontend/src/assets/js/tenplay/tenVod/plugins/overlayUI.ts","/source/./Frontend/src/assets/js/tenplay/tenVod/plugins/trackingService.ts","/source/./Frontend/src/assets/js/tenplay/tenVod/plugins/videoPlaySync.ts","/source/./Frontend/src/assets/js/tenplay/tenVod/plugins/volumeSync.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"TenPlay\"] = factory();\n\telse\n\t\troot[\"TenPlay\"] = root[\"TenPlay\"] || {}, root[\"TenPlay\"][\"playerBase\"] = factory();\n})(self, function() {\nreturn ","export const getNextVideos = async (urlCode) => {\n const fetchUrl = `/api/next-videos/${urlCode}`;\n const resp = await fetch(fetchUrl);\n const data = await resp.json(); // array of videos\n return data;\n};\n\nexport const loadVideo = async (urlCode, destinationUrl = null) => {\n const fetchUrl = `/api/video/${urlCode}`;\n const resp = await fetch(fetchUrl);\n const data = await resp.json();\n const {video} = data;\n\n if (!destinationUrl) {\n destinationUrl = video.link;\n }\n\n history.pushState(\n {\n video: video,\n type: 'changeVideo',\n },\n '',\n destinationUrl + window.location.search,\n );\n\n // metaData &&\n // Object.keys(metaData).forEach((key) => {\n // window.TealiumData[key] = metaData[key];\n // window.utag_data[key] = metaData[key];\n // });\n // window.tenService.pageAllocator &&\n // window.tenService.pageAllocator.track('CHANGE_VIDEO');\n\n // move window to top\n};\n","// Type definitions for Video.js 5.16\n// Project: https://github.com/zencoder/video-js\n// Definitions by: Vincent Bortone \n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\n\n// following 2 methods are Brightcove library API methods\nimport {Allocator_Video} from \"../tenTrack/track.allocator.video\";\nimport {VjsHandler as VjsHandlerVod} from \"../tenVod/base/vjs.handler\";\nimport {VjsPluginHandler} from \"../ten/vjs.util\";\n\ninterface bc{\n (id: any, options?: iPlayerOptions, ready?: () => void): Player\n}\n\nexport interface videojs {\n (id: any, options?: iPlayerOptions, ready?: () => void): Player;\n plugin: (pluginName: string, callback: PluginCallback)=>void;\n registerPlugin: (pluginName: string, callback: PluginCallback)=>void;\n getPlugin: (pluginName: string) => ()=>{};\n pluginHandler: VjsPluginHandler;\n}\n\ninterface iPlayerOptions {\n techOrder?: string[];\n html5?: any;\n width?: number;\n height?: number;\n defaultVolume?: number;\n children?: string[];\n controls?: boolean;\n src?: string;\n autoplay?: boolean;\n preload?: string;\n}\n\ninterface Source {\n type: string;\n src: string;\n useCueTags?: boolean;\n}\n\nexport interface PluginCallback {\n (): void\n}\n\nexport interface mediaCues {\n force_stop: boolean,\n id: string | number,\n metadata: any,\n name: string | number,\n type: string,\n time: number,\n startTime: number,\n endTime: number\n}\n\nexport interface iControlBarItem {\n hide: ()=>void,\n show: ()=>void,\n enable: ()=>void,\n disable: ()=>void,\n on: ()=>void,\n one: ()=>void,\n off: ()=>void,\n trigger: ()=>void,\n dispose: ()=>void\n}\n\nexport interface Player {\n catalog: {\n getVideo: (videoId: string, callback: (event: any, value: any) => void, string: string) => void,\n load: (value: any) => void\n };\n _startTime: number;\n isFullscreen: ()=> boolean;\n\n name: () => string;\n plugin: (pluginName: string, callback: ()=>void) => void;\n play(): Player;\n pause(): Player;\n paused(): boolean;\n src(newSource: string | Source | Source[]): Player;\n currentTime(seconds: number): Player;\n currentTime(): number;\n duration(): number;\n buffered(): TimeRanges;\n bufferedPercent(): number;\n volume(percentAsDecimal: number): TimeRanges;\n volume(): number;\n width(): number;\n width(pixels: number): Player;\n height(): number;\n height(pixels: number): Player;\n hasStarted: any;\n size(width: number, height: number): Player;\n requestFullScreen(): Player;\n cancelFullScreen(): Player;\n ready(callback: (this: Player) => void ): Player;\n on(eventName: any, callback: (eventObject: Event, data?: any) => void ): void;\n one(eventName?: any, callback?: (eventObject: Event) => void ): void;\n off(eventName: any, callback: (eventObject: Event) => void ): void;\n trigger(eventName: any, customDataObject?: any): void;\n dispose(): void;\n addRemoteTextTrack(options: {}): HTMLTrackElement;\n removeRemoteTextTrack(track: HTMLTrackElement): void;\n poster(val?: string): string | Player;\n playbackRate(rate?: number): number;\n\n addClass(classToAdd: string): void;\n hasClass(classToCheck: string): boolean;\n removeClass(classToRemove: string): void;\n\n el(): HTMLDivElement; // it is the brightcove controlled div which is parent of real video element\n\n // controlbar controlBar.fullscreenToggle.hide()\n controlBar: {\n fullscreenToggle: iControlBarItem\n };\n\n dataAttrs: iRegisterPlayerDataAttrs;\n\n /**\n * custom properties\n */\n ima3:any;\n mediainfo: any;\n mediainfoMapping: any;\n\n thisVideoDom: HTMLVideoElement;\n thisBrightcoveDom: HTMLDivElement;\n thisBrightcoveContainerDom: HTMLDivElement;\n\n intervalStock: Array;\n\n allocator?: Allocator_Video;\n singletonEventsHandler?: {[handlerName: string]: ()=> void };\n pluginHandler?: VjsPluginHandler;\n\n nextVideo?: (videoId: string, isAutoplay?: boolean, showPreroll?: boolean) => void;\n}\n\n\nexport interface iRegisterPlayerDataAttrs {\n \"id\": string; // element ID\n \"data-embed\": string; // ?\n \"poster\": string; // default image\n \"class\": string; // style\n \"data-video-id\"?: string; // video ID\n \"video-id\"?: string, // todo copy data-video-id value, prevent default behavior of bc player\n \"autoplay\"?: boolean; // IF autoplay\n \"preload\"?: string; // OR preload = \"metadata\", \"auto\"\n \"data-account\"?: string; // value came from app main entry file\n \"data-uuid\"?: string; //\n \"data-video-ima-url\"?: string; // IMA video ad URL\n}\n\nexport const StandardPlayerEvent = {\n Progress: \"progress\", // stream downloading\n Waiting: \"waiting\",\n Playing: \"playing\", // resumed from pause or download delay\n Error: \"error\", // error while loading\n Loadstart: \"loadstart\", // initialized when ready or video source changed\n Loadedmetadata: \"loadedmetadata\", // of duration, dimension, first segment downloaded\n Loadeddata: \"loadeddata\", // downloaded data of current playback position\n Play: \"play\",\n Pause: \"pause\",\n Seeking: \"seeking\",\n Seeked: \"seeked\",\n Ended: \"ended\",\n Volumechange: \"volumechange\",\n Timeupdate: \"timeupdate\", // play position change\n Stalled: \"stalled\", // Sent when the user agent is trying to fetch media data, but data is unexpectedly not forthcoming.\n};\nexport type StandardPlayerEvent = (typeof StandardPlayerEvent)[keyof typeof StandardPlayerEvent];\n\nexport const CustomPlayerEvent = {\n TimeupdateSec: \"timeupdate-in-sec\",\n PlayerStarted: \"player-started\",\n SegmentChanged: \"segment-changed\",\n SegmentView: \"segment-view\",\n RealFirstPlay: \"real-first-play\",\n StartPlayFromResume: \"start-play-from-resume\",\n CloseTheEnd: \"close-the-end\"\n};\nexport type CustomPlayerEvent = (typeof CustomPlayerEvent)[keyof typeof CustomPlayerEvent];\n\n\nexport const BrightcoveEvent = {\n ...StandardPlayerEvent,\n /** before/after player ready\n */\n BcCatalogError: \"bc-catalog-error\",\n\n /** player\n */\n // Ready: \"ready\", // for using custom plugin, not working well with play() call\n // buffering and QoS events\n Ratechange: \"ratechange\",\n // startup events\n // other\n FirstPlay: \"firstplay\",\n Resume: \"resume\",\n Resize: \"resize\",\n Fullscreenchange: \"fullscreenchange\", // from / to fullscreen change p.isFullscreen()\n};\nexport type BrightcoveEvent = (typeof BrightcoveEvent)[keyof typeof BrightcoveEvent];\n\nexport const BrightcoveCustomEvent = CustomPlayerEvent;\nexport type BrightcoveCustomEvent = CustomPlayerEvent;\n","let userAgentFilterName = [\"bot\", \"mobile\", \"tablet\", \"mobile\"];\nlet userAgentFilter = [\n [\n /(ads|google|bing|msn|yandex|baidu|ro|career|)bot/i,\n /(baidu|jike|symantec)spider/i,\n /scanner/i,\n /(web)crawler/i,\n ],\n [\n /ip(hone|od)/i,\n /android.*(mobile|mini)/i,\n /Opera Mobi/,\n /Mobile.+Firefox/,\n /^HTC/,\n /Fennec/,\n /IEMobile/,\n /BlackBerry/,\n /BB10.*Mobile/,\n /GT-.*Build\\/GINGERBREAD/,\n /SymbianOS.*AppleWebKit/,\n ],\n [\n /ipad/i,\n /android/i,\n /PlayBook; U; RIM Tablet/,\n /hp-tablet.*TouchPad/,\n /Kindle\\/3/,\n\n ],\n [\n // without brand\n /symbian/i,\n /^sonyericsson/i,\n /^nokia/i,\n /^samsung/i,\n /^lg/i,\n /bada/i,\n /blazer/i,\n /cellphone/i,\n /iemobile/i,\n /midp-2.0/i,\n /u990/i,\n /netfront/i,\n /opera mini/i,\n /palm/i,\n /nintendo wii/i,\n /playstation portable/i,\n /portalmmm/i,\n /proxinet/i,\n /sonyericsson/i,\n /symbian/i,\n /windows\\ ?ce/i,\n /winwap/i,\n /eudoraweb/i,\n /htc/i,\n /240x320/i,\n /avantgo/i,\n ],\n];\n\n\nlet type = \"\";\nif (typeof window !== \"undefined\") {\n let filterType = userAgentFilterName.find(function(filterName, index){\n return !!userAgentFilter[index].find(function(regex, regIndex){\n return regex.test(window.navigator.userAgent);\n });\n });\n filterType ? type = filterType : type = \"desktop\";\n}\n\nexport const deviceType = type;\n\nexport function detectDeviceType() {\n if (typeof window === 'undefined' || typeof window.navigator === 'undefined') {\n return \"unknown\";\n }\n\n const userAgent = window.navigator.userAgent.toLowerCase();\n\n if (userAgent.includes(\"box\")) {\n return \"box\";\n }\n if (userAgent.includes(\"tv\")) {\n return \"tv\";\n }\n if (/mobile|android|iphone|ipod|blackberry|phone/.test(userAgent)) {\n return \"phone\";\n }\n if (/tablet|ipad/.test(userAgent)) {\n return \"tablet\";\n }\n return \"desktop\"; // Fallback for everything else\n}","/**\n * Utility function to check and set user flag in localStorage based on a percentage.\n * Resets flags if the percentage changes.\n * @param percentage - The percentage of users to be flagged (e.g., 2 for 2%).\n * @returns {boolean} - Returns true if the user is in the flagged group, false otherwise.\n */\n\nimport { env } from \"../pkgAviaAllocator/tracking.env\";\n\ndeclare global {\n interface Window {\n markAdOps: () => void;\n removeAdOps: () => void;\n checkIsFlagged: () => boolean;\n }\n}\n\nconst FLAG_KEY = 'isFlagged';\nconst ADOPS_KEY = 'isAdops';\nconst PERCENTAGE_KEY = 'currentPercentage';\n\n/**\n * Validates the percentage value.\n * @param percentage - The percentage to validate.\n * @throws Will throw an error if the percentage is not between 0 and 100.\n */\nfunction validatePercentage(percentage: number): void {\n if (percentage < 0 || percentage > 100) {\n throw new Error('Percentage must be between 0 and 100');\n }\n}\n\n/**\n * Retrieves a boolean flag from localStorage.\n * @param key - The key of the flag in localStorage.\n * @returns {boolean | null} - The flag value as a boolean, or null if not set.\n */\nfunction getFlagFromLocalStorage(key: string): boolean | null {\n const value = localStorage.getItem(key);\n return value !== null ? value === 'true' : null;\n}\n\n/**\n * Sets a boolean flag in localStorage.\n * @param key - The key of the flag in localStorage.\n * @param value - The boolean value to set.\n */\nfunction setFlagInLocalStorage(key: string, value: boolean): void {\n localStorage.setItem(key, value.toString());\n}\n\n/**\n * Resets all flags if the percentage changes.\n * @param newPercentage - The new percentage value.\n */\nfunction resetFlagsIfPercentageChanges(newPercentage: number): void {\n const currentPercentage = localStorage.getItem(PERCENTAGE_KEY);\n if (currentPercentage === null || parseFloat(currentPercentage) !== newPercentage) {\n localStorage.removeItem(FLAG_KEY);\n localStorage.setItem(PERCENTAGE_KEY, newPercentage.toString());\n logger(`🔍️ ~ Percentage changed to ${newPercentage}%. Flags reset.`);\n }\n}\n\n/**\n * Checks and sets user flag in localStorage based on a percentage.\n * If the user is part of the AdOps team (isAdops), they are always flagged.\n * Resets flags if the percentage changes.\n * @param percentage - The percentage of users to be flagged (e.g., 2 for 2%).\n * @returns {boolean} - Returns true if the user is in the flagged group, false otherwise.\n */\nexport function checkUserFlag(percentage: number): boolean {\n if (typeof window === 'undefined') {\n console.warn('🔍️ ~ checkUserFlag should only be called in a browser environment.');\n return false;\n }\n\n validatePercentage(percentage);\n\n resetFlagsIfPercentageChanges(percentage);\n\n const isAdops = getFlagFromLocalStorage(ADOPS_KEY);\n if (isAdops === true) {\n setFlagInLocalStorage(FLAG_KEY, true);\n logger('🔍️ ~ AdOps team member detected. Automatically flagged as true.');\n return true;\n }\n\n const isFlagged = getFlagFromLocalStorage(FLAG_KEY);\n\n if (isFlagged !== null) {\n return isFlagged;\n }\n\n const randomNumber = Math.random() * 100;\n const newFlagValue = randomNumber < percentage;\n\n setFlagInLocalStorage(FLAG_KEY, newFlagValue);\n\n logger(`🔍️ ~ User is ${newFlagValue ? 'in' : 'not in'} the ${percentage}% group.`);\n\n return newFlagValue;\n}\n\n/**\n * Marks the user as AdOps in localStorage.\n */\nexport function markAdOps(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n window.markAdOps = function () {\n setFlagInLocalStorage(ADOPS_KEY, true);\n logger('🔍️ ~ User marked as AdOps.');\n };\n\n window.removeAdOps = function () {\n localStorage.removeItem(ADOPS_KEY);\n localStorage.removeItem(FLAG_KEY);\n logger('🔍️ ~ User removed from AdOps and isFlagged reset.');\n };\n\n window.checkIsFlagged = function (): boolean {\n const isFlagged = getFlagFromLocalStorage(FLAG_KEY);\n logger(`🔍️ ~ User is currently ${isFlagged ? 'flagged' : 'not flagged'}.`);\n return isFlagged !== null ? isFlagged : false;\n };\n}\n\n/**\n * Logs messages to the console only in the development environment.\n * @param message The message to log.\n */\nfunction logger(message: string): void {\n if (!env.isProduction()) {\n console.log(message);\n }\n}","import { iTrackingService } from \"./tracking.conf.type\";\nexport class Allocator{\n protected _servicesConfig: iTrackingService;\n\n public oztam: any;\n public tealium: any;\n\n\n constructor (_servicesConfig: iTrackingService) {\n this._servicesConfig = _servicesConfig;\n }\n \n}","export enum eAllocatorServices {\n oztam = \"oztam\",\n tealium = \"tealium\",\n}\n\n\nexport interface iAllocatorServiceConfig {\n enabled: boolean;\n config: {\n staging: unknown;\n production: unknown;\n };\n}\n\nexport interface iAllocatorServices {\n oztam?: iAllocatorServiceConfig,\n mux?: iAllocatorServiceConfig,\n}\n\nexport interface iExtraInfo {\n userId_oztam?: string,\n externalSessionId?: string,\n externalUserId?: string,\n id3?, // ref interface in child implementation not here.\n}","import {Allocator} from \"./allocator\";\nimport {\n defaultAllocatorVideoState,\n eAllocatorEvent, iAllocatorExtraInfo,\n iAllocatorPlayerRef,\n iAllocatorVideoState,\n} from \"./allocator.video.type\";\nimport {eAllocatorServices} from \"./allocator.type\";\nimport {iTrackingService} from \"./tracking.conf.type\";\n\n\nexport class AllocatorVideo extends Allocator {\n protected _state: iAllocatorVideoState = defaultAllocatorVideoState;\n /**\n * private properties\n */\n\n set firstRoundPlay(bool) {\n this._state.isFirstRoundPlay = bool;\n }\n get firstRoundPlay() {\n return this._state.isFirstRoundPlay;\n }\n\n /**\n * implemented in child class of project folder.\n * IMPORTANT these function reset tracking property inside function.\n */\n protected initTealium (): void {};\n protected initOztam (): void {};\n\n protected initExtraInfo(): void {};\n\n /**\n * public properties\n */\n public trackingOnHold = false; // true - ignore all tracking before it change to true\n\n constructor (_servicesConfig: iTrackingService) {\n super(_servicesConfig);\n\n this._state.eventTimestamp = {};\n }\n\n private updateEventTimestamp (eventName: eAllocatorEvent) {\n this._state.eventTimestamp[eventName] = Date.now();\n }\n\n public updateExtraInfo (extraInfo: iAllocatorExtraInfo) {\n Object.keys(eAllocatorServices).forEach(serviceName => {\n this[serviceName] &&\n this[serviceName].addExtraVideoInfo &&\n this[serviceName].addExtraVideoInfo(extraInfo);\n })\n }\n\n public stopTracking(serviceName?: eAllocatorServices) {\n if (serviceName) {\n this[serviceName] &&\n this[serviceName].stopTracking &&\n this[serviceName].stopTracking();\n } else {\n Object.keys(eAllocatorServices).forEach(serviceName => {\n this[serviceName] &&\n this[serviceName].stopTracking &&\n this[serviceName].stopTracking();\n });\n }\n }\n private resetTrackingState = () => {\n this.stopTracking();\n this._state.eventTimestamp = {};\n this._state.isFirstRoundPlay = true;\n this._state.calledFirstPlay = false;\n this._state.calledPreRollBreakStart = false;\n };\n\n public resetTrackingService() {\n this.resetTrackingState();\n\n delete this.tealium;\n this.initTealium();\n delete this.oztam;\n this.initOztam();\n\n this.initExtraInfo && this.initExtraInfo();\n }\n\n /**\n * video events\n */\n public track(event: eAllocatorEvent, data?, playerRef?: iAllocatorPlayerRef, otherData: any = null) {\n if (this.trackingOnHold) {\n return;\n }\n\n let checkMediaInfoModel = [\n eAllocatorEvent.LOAD,\n eAllocatorEvent.START,\n eAllocatorEvent.FIRST_PLAY,\n eAllocatorEvent.PLAY,\n eAllocatorEvent.PAUSE,\n eAllocatorEvent.UN_PAUSE,\n eAllocatorEvent.RESUME,\n eAllocatorEvent.COMPLETE,\n eAllocatorEvent.AD_BREAK_START,\n eAllocatorEvent.AD_BREAK_END,\n eAllocatorEvent.BEFORE_UNLOAD_PAGE,\n eAllocatorEvent.INIT_PROGRESS_INTERVAL\n ];\n if (checkMediaInfoModel.indexOf(event) >= 0) {\n\n }\n\n let checkAdInfoModel = [\n eAllocatorEvent.AD_BEGIN,\n eAllocatorEvent.AD_PAUSE,\n eAllocatorEvent.AD_RESUME,\n eAllocatorEvent.AD_COMPLETE\n ];\n if (checkAdInfoModel.indexOf(event) >= 0) {\n\n }\n\n let checkPlayerRef = [\n eAllocatorEvent.LOAD,\n eAllocatorEvent.FIRST_PLAY, // vjsplayer\n eAllocatorEvent.PLAY, // vjsplayer\n eAllocatorEvent.PAUSE, // vjsplayer\n eAllocatorEvent.RESUME, // vjsplayer\n eAllocatorEvent.SEEKED,\n eAllocatorEvent.AD_BEGIN, // ad player\n eAllocatorEvent.AD_PAUSE, // ad player\n eAllocatorEvent.AD_RESUME, // ad player\n eAllocatorEvent.AD_BREAK_END // vjsplayer\n ];\n if (checkPlayerRef.indexOf(event) >= 0) {\n if (!playerRef || typeof playerRef.currentTime !== \"function\") {\n console.error('Player missing key method - currentTime');\n return;\n }\n }\n\n let cancelEventTrack = false;\n switch (event) {\n case eAllocatorEvent.LOAD:\n this.onLoad();\n break;\n case eAllocatorEvent.LOADED_METADATA:\n this.onLoadedMetadata(data, playerRef);\n break;\n case eAllocatorEvent.START:\n this.onStart(data, playerRef);\n break;\n case eAllocatorEvent.FIRST_PLAY:\n this._state.calledFirstPlay = true;\n this.onFirstPlay(data, playerRef);\n break;\n case eAllocatorEvent.PLAY:\n\n break;\n case eAllocatorEvent.PAUSE:\n this.onPause(data, playerRef);\n break;\n case eAllocatorEvent.UN_PAUSE:\n this.onUnpause(data, playerRef);\n break;\n case eAllocatorEvent.RESUME:\n this.onResume(data, playerRef);\n break;\n case eAllocatorEvent.PROGRESS:\n this.onProgress();\n break;\n case eAllocatorEvent.SEGMENT_VIEW:\n this.onSegmentView();\n break;\n case eAllocatorEvent.CLOSE_THE_END:\n // todo this logic should be improved\n if (!this._state.eventTimestamp[event] ||\n Date.now() - this._state.eventTimestamp[event] > 3000) {\n this.onCloseTheEnd();\n } else {\n cancelEventTrack = true;\n }\n break;\n case eAllocatorEvent.COMPLETE:\n this.onComplete(data);\n break;\n case eAllocatorEvent.SEEKING:\n this.onSeeking();\n break;\n case eAllocatorEvent.SEEKED:\n this.onSeeked(data, playerRef);\n break;\n case eAllocatorEvent.AD_BEGIN:\n this.onAdBegin(data, playerRef, otherData);\n break;\n case eAllocatorEvent.AD_PAUSE:\n this.onAdPause(data, playerRef);\n break;\n case eAllocatorEvent.AD_RESUME:\n this.onAdResume(data, playerRef);\n break;\n case eAllocatorEvent.AD_COMPLETE:\n this.onAdComplete(data, playerRef, otherData);\n break;\n case eAllocatorEvent.AD_BREAK_START:\n if (!this._state.calledFirstPlay) {\n this._state.calledPreRollBreakStart = true;\n }\n this.onAdBreakStart(data);\n break;\n case eAllocatorEvent.AD_BREAK_END:\n this.onAdBreakEnd(data, playerRef);\n break;\n case eAllocatorEvent.BEFORE_UNLOAD_PAGE:\n this.beforeUnloadPage(data, playerRef, otherData);\n break;\n case eAllocatorEvent.BEFORE_CHANGE_SOURCE:\n this.beforeChangeSource(data, playerRef);\n break;\n case eAllocatorEvent.INIT_PROGRESS_INTERVAL:\n this.initProgressInterval(data, playerRef);\n break;\n }\n\n if (cancelEventTrack) {\n // console.log('canceled event', event);\n } else if (event !== eAllocatorEvent.PROGRESS) {\n // console.log(`tracked event ${event}`);\n }\n\n /**\n * record last called time of the events\n */\n this.updateEventTimestamp(event);\n }\n\n /**\n * if registered event validator returns false, then the event wont be tracked.\n */\n private _validationHolder: [Array, (e)=> boolean][] = [];\n protected _validate(event): boolean {\n for (let i=0;i< this._validationHolder.length; i++) {\n let validation = this._validationHolder[i];\n if (validation[0].indexOf(event) >= 0) {\n return validation[1](event);\n }\n }\n return true;\n }\n public registerValidation(events: Array, validatorCB: (e)=> boolean) {\n this._validationHolder.push([events, validatorCB]);\n }\n\n /**\n * event handlers\n */\n\n private onLoad() {\n }\n\n public onLoadedMetadata(mediainfo, playerRef) {\n if(this.firstRoundPlay) {\n this.oztam && this.oztam.onLoadedMetadata && this.oztam.onLoadedMetadata(mediainfo, playerRef);\n }\n this.tealium && this.tealium.load && this.tealium.load(mediainfo);\n }\n\n // occur once, before trigger first play event\n private onStart(mediainfo, playerRef) {\n\n }\n\n private onReplay(mediainfo, playerRef) {\n // Previously used for Nielsen\n }\n\n // real video content started playing\n protected onFirstPlay(mediainfo, playerRef) {\n if (this.firstRoundPlay) {\n this.oztam && this.oztam.onFirstPlay && this.oztam.onFirstPlay(mediainfo, playerRef);\n }\n this.tealium && this.tealium.firstPlay && this.tealium.firstPlay();\n }\n\n protected initProgressInterval(mediainfo, playerRef) {\n this.oztam && this.oztam.onInitProgress && this.oztam.onInitProgress(mediainfo, playerRef); \n }\n\n private onPause(mediainfo, playerRef) {\n if (this._validate(eAllocatorEvent.PAUSE)) {\n this.tealium && this.tealium.pause && this.tealium.pause();\n this.oztam && this.oztam.onPause && this.oztam.onPause();\n }\n }\n\n private onUnpause(mediainfo, playerRef) {\n if (this._validate(eAllocatorEvent.UN_PAUSE)) {\n this.oztam && this.oztam.onUnPause && this.oztam.onUnPause(mediainfo, playerRef);\n }\n\n if (!this.firstRoundPlay && playerRef.currentTime() === 0) {\n this.onReplay(mediainfo, playerRef);\n }\n }\n\n private onResume(mediainfo, playerRef) {\n\n }\n\n private onProgress() {\n \n }\n\n protected onSegmentView() {\n this.tealium && this.tealium.segmentView && this.tealium.segmentView();\n }\n\n private onCloseTheEnd() {\n if (this.firstRoundPlay) {\n // Previously used for Omniture\n }\n }\n\n private onComplete(mediainfo, playerRef?) {\n this.firstRoundPlay && this.oztam && this.oztam.onComplete && this.oztam.onComplete();\n this.tealium && this.tealium.finished && this.tealium.finished();\n\n // as last thing, set state of firstRoundPlay to false, so tracking of replay can be identified\n this.firstRoundPlay = false;\n }\n\n private onSeeking(){\n if (this._validate(eAllocatorEvent.SEEKING)) {\n this.oztam && this.oztam.onSeeking && this.oztam.onSeeking();\n this.tealium && this.tealium.seeking && this.tealium.seeking();\n }\n }\n\n private onSeeked(mediainfo, playerRef){\n if (this._validate(eAllocatorEvent.SEEKED)) {\n this.oztam && this.oztam.onSeeked && this.oztam.onSeeked(mediainfo, playerRef);\n }\n }\n\n private onAdBegin(adInfo, playerRef, otherData) {\n this.oztam && this.oztam.onAdBegin && this.oztam.onAdBegin();\n this.tealium && this.tealium.adStart && this.tealium.adStart(adInfo, playerRef, otherData);\n }\n\n private onAdPause(adInfo, playerRef) {\n if(this._state.calledFirstPlay) {\n this.oztam && this.oztam.onAdPause && this.oztam.onAdPause();\n }\n }\n\n private onAdResume(adInfo, playerRef) {\n if(this._state.calledFirstPlay) {\n this.oztam && this.oztam.onAdResume && this.oztam.onAdResume();\n }\n }\n\n private onAdComplete(adInfo, playerRef, otherData) {\n this.oztam && this.oztam.onAdComplete && this.oztam.onAdComplete();\n this.tealium && this.tealium.adEnd && this.tealium.adEnd(adInfo, playerRef, otherData);\n }\n\n protected onAdBreakStart(mediainfo) {\n // special break start behaviour\n if (this._state.calledFirstPlay) {\n // midroll\n } else {\n // preroll\n // Previously used for Nielsen\n }\n // all break start behavior\n this.oztam && this.oztam.onAdBreakStart && this.oztam.onAdBreakStart();\n }\n\n protected onAdBreakEnd(mediainfo, playerRef) {\n this.oztam && this.oztam.onAdBreakEnd && this.oztam.onAdBreakEnd(mediainfo, playerRef);\n }\n \n private beforeChangeSource (mediainfo, playerRef) {\n this.tealium && this.tealium.onChangeVideo && this.tealium.onChangeVideo( mediainfo, playerRef);\n this.stopTracking();\n }\n\n private beforeUnloadPage(mediainfo, playerRef, otherData) {\n this.tealium && this.tealium.onExit && this.tealium.onExit(mediainfo, playerRef, otherData);\n this.stopTracking();\n }\n}","import {iOztamV2ExtraInfo} from \"./oztam.v2.type\";\nimport { iWebApiVideoData } from '../pkgPlayer/api/api.video.type';\n\nexport enum eAllocatorEvent {\n LOAD = \"LOAD\",\t\t// video loaded event\n LOADED_METADATA = \"LOADED_METADATA\",\n START = \"START\",\t\t// video play start, includes ads\n FIRST_PLAY = \"FIRST_PLAY\", // video content first play\n TIME_UPDATE = \"TIME_UPDATE\",\n PLAY = \"PLAY\",\t\t// video continue/resume play after ads\n PAUSE = \"PAUSE\",\t\t// user paused video\n UN_PAUSE = \"UN_PAUSE\",\n RESUME = \"RESUME\",\t// user resumed video\n PROGRESS = \"PROGRESS\",\t// video in progress\n SEGMENT_VIEW = \"SEGMENT_VIEW\",\n CLOSE_THE_END = \"CLOSE_THE_END\", // 98% finished / 7 seconds of short episode left\n COMPLETE = \"COMPLETE\",\t// video completed\n SEEKING = \"SEEKING\",\n SEEKED = \"SEEKED\",\n AD_BEGIN = \"AD_BEGIN\",\n AD_COMPLETE = \"AD_COMPLETE\",\n AD_BREAK_START = \"AD_BREAK_START\",\n AD_BREAK_END = \"AD_BREAK_END\",\n AD_PAUSE = \"AD_PAUSE\",\n AD_RESUME = \"AD_RESUME\",\n BEFORE_UNLOAD_PAGE = \"BEFORE_UNLOAD_PAGE\",\n BEFORE_CHANGE_SOURCE = \"BEFORE_CHANGE_SOURCE\",\n INIT_PROGRESS_INTERVAL = \"INIT_PROGRESS_INTERVAL\",\n PLUGIN_EVENT = \"PLUGIN_EVENT\",\n TEXTCUEPOINT = \"TEXTCUEPOINT\",\n}\n\nexport interface iMediaInfo_CustomFields {\n alt_media_id: string;\n clip_title: string;\n tv_show: string;\n series_crid_id?: string;\n episode_crid_id?: string;\n video_type_long_form?: string;\n tv_channel?: string;\n tv_episode?: string;\n episode_name?: string;\n expiry_date?: string;\n program_classification?: string;\n web_content_url?: string;\n clip_category?: string;\n market?: string;\n publisherid?: string\n tv_season?: string\n showContentMarket?: string\n oztamPublisherId?: string\n oztamSessionId?: string\n}\n\nexport interface iMediaInfo_Video {\n ShowGenre: string;\n ShowProgramClassification: string;\n isMemberGatedLive: boolean;\n genre?: string,\n}\n\nexport interface iMediaInfo {\n id: string;\n name: string;\n account_id?: string;\n description?: string;\n long_description?: string;\n duration?: string;\n head_position: string;\n created_at?: string;\n published_at?: string;\n updated_at?: string;\n reference_id?: string;\n publisher_id?: string;\n publisherid?: string;\n custom_fields: iMediaInfo_CustomFields // live returns customFields;\n video?: iMediaInfo_Video;\n channelDisplayName?: string;\n preroll?: any; // reference of brightcove player.ima3.currentAdEventInfo\n}\n\nexport interface iAdInfo {\n type: string;\n asset_id: string;\n head_position: string;\n index?: string;\n duration?: string\n}\n\nexport interface iAllocatorVideoState {\n eventTimestamp: {[key in eAllocatorEvent]?: number},\n isFirstRoundPlay: boolean,\n calledFirstPlay: boolean,\n calledPreRollBreakStart: boolean,\n tealiumEvtOverride: boolean,\n}\n\nexport const defaultAllocatorVideoState: iAllocatorVideoState = {\n eventTimestamp: {},\n isFirstRoundPlay: true,\n calledFirstPlay: false,\n calledPreRollBreakStart: false,\n tealiumEvtOverride: false,\n}\n\nexport interface iAllocatorPlayerRef {\n currentTime?: () => number,\n watchPosition?: number, // only for vod\n videoElement?: any\n}\n\nexport interface iAllocatorExtraInfo extends iOztamV2ExtraInfo {}","import {eCueType, iCueData, iID3, iID3_convertedInfo} from \"./id3Processor.type\";\nimport {isIOS} from \"../util\";\n\nexport function getId3Wrapper(): iID3 {\n return {\n source: undefined,\n latest: undefined,\n pauseDurationBeforeNewId3: 0,\n pauseDurationBeforeNewId3_nielsen: 0,\n\n generateId3Info: function (TXXX) {\n let id3Info: iID3_convertedInfo = {\n cueType: undefined,\n \"CRID\": TXXX.CRID,\n \"EpochTime\": TXXX.EpochTime,\n \"Rating\": TXXX.Rating,\n \"StreamID\": TXXX.StreamID, // index of publisher ID list\n \"LocalTime\": Date.now(),\n \"series_id\": undefined, // get from CRID\n \"episode_id\": undefined, // get from CRID\n \"syncedEpoch\": function () {\n return parseInt(this.EpochTime) +\n Math.floor((Date.now() - id3Info.LocalTime) / 1000);\n } // function to get local synced timestamp based o EpochTime\n };\n\n // sample //sydney.ten.ten.au/56076E1407950\n if (typeof id3Info.CRID === \"string\") {\n let matches = id3Info.CRID.match(/([0-9]{1,})[Ee]([0-9]{1,})$/);\n if (matches && typeof matches === \"object\" && matches[2]) {\n id3Info.series_id = matches[1];\n id3Info.episode_id = matches[2];\n }\n }\n return id3Info;\n },\n update: function (cueType: eCueType, cueData) {\n switch (cueType) {\n case eCueType.TXXX:\n if (typeof cueData === \"string\" || typeof cueData === \"number\") {\n this.updateTimestamp(cueData);\n } else if (typeof cueData === \"object\") {\n this.pauseDurationBeforeNewId3 = 0;\n this.pauseDurationBeforeNewId3_nielsen = 0;\n this.source = cueData;\n this.latest = this.generateId3Info(this.source);\n } else {\n console.error(\"TXXX data is not valid.\", cueData);\n }\n break;\n case eCueType.PRIV:\n case eCueType.TDRL:\n this.updateTimestamp(cueData);\n break;\n }\n this.latest.cueType = cueType;\n return this.latest\n },\n updateTimestamp: function (cueData) {\n try {\n cueData = typeof cueData === 'string' ? cueData.replace(/z$/, \"Z\") : cueData;\n const timestamp = (new Date(cueData)).getTime() / 1000;\n this.source = cueData;\n this.latest = this.generateId3Info({\n CRID: undefined,\n EpochTime: timestamp,\n Rating: undefined,\n StreamID: undefined,\n });\n } catch (err) {\n console.error(\"Cue timestamp is not expected time format\");\n }\n }\n }\n}\n\nexport function cueWatcher(player, _log, callback) {\n player.video.textTracks && player.video.textTracks.addEventListener(\"addtrack\", function(event) {\n const track = event.track;\n if (track.kind !== \"metadata\") {\n return;\n }\n track.mode = \"hidden\";\n track.addEventListener('cuechange', (unusedEvent) => {\n let activeCues = track.activeCues;\n if(!activeCues || !activeCues.length) {\n return;\n }\n for(let i = 0; i < activeCues.length; i++) {\n let cue = activeCues[i] as any;\n let cueObject = cue.value;\n if (cueObject && [eCueType.TXXX, eCueType.TDRL, eCueType.PRIV].indexOf(cueObject.key) >= 0) {\n callback && callback(cueObject);\n } else {\n _log && _log(cue, () => {return JSON.stringify(cueObject)});\n }\n }\n })\n }) \n}\n\n/*\n* this is only for players implemented TXXX and TDRL events\n* */\nexport function cueProcess(player, _log, cueObjectSource: iCueData) {\n try {\n let cueObject;\n switch (cueObjectSource.key) {\n case eCueType.TXXX:\n cueObject = getCueTXXXObject(cueObjectSource);\n if (cueObject.CRID) {\n player.trigger(eCueType.TXXX, cueObject);\n } else {\n _log && _log(\"TXXX missing key data\");\n }\n break;\n case eCueType.TDRL:\n cueObject = getCueTRDLObject(cueObjectSource);\n if (cueObject) {\n player.trigger(eCueType.TDRL, cueObject);\n } else {\n _log && _log(\"TRDL missing key data\");\n }\n break;\n }\n } catch (e) {\n console.error(\"cue data is not expected format\");\n }\n}\n\n// data: 2020-09-01T05:14:27.080z OR 2020-09-01T05:14:27.080Z\nfunction getCueTRDLObject(cueObj: iCueData) {\n return cueObj.data;\n}\n\nfunction getCueTXXXObject(cueObj: iCueData) {\n if (isIOS()) {\n return JSON.parse(cueObj.data);\n }\n\n // default is hls.js, if more player used other than brightcove + yoadmanager, this need to be confirmed in new player if the object structure is same as this.\n return JSON.parse(cueObj.info.replace(/^PROGRAM_INFO/, \"\"));\n}\n\nexport function getTxxxGoogleAdData(txxxObject) {\n if (isIOS()) {\n if (typeof txxxObject.data === \"string\" && /^google_/.test(txxxObject.data)) {\n return txxxObject.data;\n }\n }\n\n // default is hls.js, if more player used other than brightcove + yoadmanager, this need to be confirmed in new player if the object structure is same as this.\n if (typeof txxxObject.data === \"string\" && /^google_/.test(txxxObject.data)) {\n return txxxObject.data;\n }\n}","export enum eCueType {\n TXXX = \"TXXX\",\n TDRL = \"TDRL\",\n PRIV = \"PRIV\",\n}\n\nexport interface iCueData {\n key: eCueType,\n data: any,\n info: any,\n}\n\nexport interface iID3_convertedInfo {\n \"cueType\": eCueType,\n \"CRID\": string,\n \"EpochTime\": string,\n \"Rating\": string,\n \"StreamID\": string, // index of publisher ID list\n \"LocalTime\": number,\n \"series_id\": string, // get from CRID\n \"episode_id\": string, // get from CRID\n \"syncedEpoch\": () => number\n}\n\nexport interface iID3 {\n source: any,\n latest: iID3_convertedInfo,\n pauseDurationBeforeNewId3: number,\n pauseDurationBeforeNewId3_nielsen?: number,\n generateId3Info: (txxx: any) => void,\n update: (type: eCueType, cueData) => void,\n updateTimestamp: (cueData) => void,\n}","import {getUserIp, requestSend, UUID_v4} from \"./util\";\nimport { tenTrack } from \"../tenTrack/track.init\";\nimport { deviceType } from \"../@util/device\";\nimport { iMediaInfo } from \"../tenTrack/track.dataModel\";\n\nexport interface iOzTamTrackingMeta_Config {\n serverTarget: string; // sdeliver.oztam.com.au/api/meter\n protocolVersion: string; // string number\n vendorVersion: string; // Tenplay_{platform}_{float}\n plugin: string; // javascript\n meta: {\n account_id: string // string\n };\n platform?: string; // web | chromecast | etc.\n publisherName?: string; // \"TEN\"\n publisherId?: string; // live gets from mediainfo, vod is predefined in trackingConf\n sessionId?: string; // give a sessionId for current tracking\n}\n\nexport interface iOzTamTrackingMeta_Media {\n mediaId: string,\n mediaType: string,\n mediaDuration: number,\n url: string,\n genre: string,\n}\n\nexport interface iOzTamTrackingEvent {\n timestamp: Date,\n event: eOzTamEvent,\n fromPosition: number, // load, begin, preroll aways is 0\n toPosition: number // load, begin, preroll aways is 0\n}\n\nexport interface iOzTamTrackingFields {\n vendorVersion: string,\n plugin: string,\n timestamp: Date,\n sessionId: string,\n timezoneOffset: number,\n protocolVersion: string,\n publisherId: string, // VOD: brightcove cloud account ID; Live: state stream UUID\n publisherName: string, // TEN\n mediaId: string,\n mediaType: string, // \"vod\" || \"live\"\n mediaDuration: number, // content duration (without server side ad duration)\n url: string,\n events: Array, // normally only one\n properties?: iOzTamTrackingProperties // only for begin event\n}\n\nexport interface iOzTamTrackingProperties {\n altMediaId: string | number,\n channel: string,\n classification: string,\n deviceId: string,\n episodeId: string,\n episodeName: string,\n seriesId: string,\n seriesName: string,\n demo1: string,\n connectionType: string,\n}\n\nexport enum eOzTamEvent {\n LOAD = \"LOAD\",\n BEGIN = \"BEGIN\",\n PROGRESS = \"PROGRESS\",\n COMPLETE = \"COMPLETE\",\n AD_BEGIN = \"AD_BEGIN\",\n AD_COMPLETE = \"AD_COMPLETE\",\n}\n\nexport enum eOztamTrigger {\n LOAD = \"load\",\n BEGIN = \"begin\",\n PROGRESS_INTERVAL = \"progressInterval\",\n AD_EVENT = \"adEvent\",\n COMPLETE = \"complete\",\n DISPOSE = \"DISPOSE\",\n}\n\nexport enum eOzTamField {\n ALT_MEDIA_ID = \"altMediaId\",\n SERIES_ID = \"seriesId\",\n EPISODE_ID = \"episodeId\",\n SERIES_NAME = \"seriesName\",\n EPISODE_NAME = \"episodeName\",\n CHANNEL = \"channel\",\n CLASSIFICATION = \"classification\",\n DVB_TRIPLET = \"dvbTriplet\",\n POST_CODE = \"postCode\",\n\n PROGRAM_ID = \"programId\",\n PROGRAM_NAME = \"programName\",\n GENRE = \"genre\",\n DEMO1 = \"demo1\",\n DEMO2 = \"demo2\",\n DEMO3 = \"demo3\",\n DEVICE_ID = \"deviceId\",\n CONNECTION_TYPE = \"connectionType\",\n STREAMING_TYPE = \"streamingType\",\n LATITUDE = \"latitude\",\n LONGITUDE = \"longitude\",\n ORIGINAL_SESSION_ID = \"originalSessionId\"\n}\n\nexport enum DeviceType {\n TV = 'tv',\n Mobile = 'mobile',\n Desktop = 'desktop',\n Tablet = 'tablet'\n}\n\nexport interface STRPayload {\n PublisherName: string;\n SessionId: string;\n RegistrationId: string;\n PublisherId: string;\n IpAddress: string;\n MediaId: string;\n DeviceId: string;\n MediaType: string;\n DeviceType: DeviceType;\n UserAgent: string | null;\n Genre: string | null;\n AdEventId: string | null;\n TimeStamp: string;\n VendorVersion: string,\n Logging?:string | null,\n}\n\nexport class OzTamServiceV2 {\n private _oztamConfig: iOzTamTrackingMeta_Config;\n private _media: iOzTamTrackingMeta_Media;\n private _eventBuilder: (triggerType?: eOztamTrigger) => iOzTamTrackingEvent;\n private _registeredSessionId: string;\n private _STRFields: STRPayload;\n\n private _progressInterval;\n private _log = function(...args) {\n //console.log(...args);\n }\n\n constructor() {\n }\n\n /**\n * can be customized\n */\n\n protected getEventData(eventType: eOzTamEvent, triggerType?: eOztamTrigger): iOzTamTrackingEvent {\n let event = {\n fromPosition: 0,\n toPosition: 0,\n timestamp: new Date(),\n event: eventType\n };\n event = Object.assign(event,this._eventBuilder(triggerType));\n if ([eOzTamEvent.LOAD, eOzTamEvent.BEGIN].indexOf(eventType) >= 0) {\n event.fromPosition = 0;\n event.toPosition = 0;\n }\n\n return event;\n }\n\n public getFields(event: iOzTamTrackingEvent, media: iOzTamTrackingMeta_Media, oztamConfig: iOzTamTrackingMeta_Config): iOzTamTrackingFields {\n let timestamp = new Date();\n\n this._registeredSessionId = this._registeredSessionId || oztamConfig.sessionId || UUID_v4();\n\n return {\n protocolVersion: oztamConfig.protocolVersion,\n vendorVersion: oztamConfig.vendorVersion,\n plugin: oztamConfig.plugin,\n timestamp: timestamp,\n sessionId: this._registeredSessionId,\n timezoneOffset: Math.abs(timestamp.getTimezoneOffset()),\n publisherId: oztamConfig.publisherId,\n publisherName: oztamConfig.publisherName,\n mediaId: media.mediaId,\n mediaType: media.mediaType,\n mediaDuration: media.mediaDuration,\n url: media.url,\n events: [event]\n };\n }\n\n public get hasIntervalRunning() {\n return this._progressInterval >= 0;\n }\n\n public startProgressInterval() {\n this._log(\"### start progress interval\");\n\n this._progressInterval && this.stopProgressInterval();\n this._progressInterval = setInterval(() => {\n this.trackProgress(eOztamTrigger.PROGRESS_INTERVAL);\n }, 1000 * 60);\n }\n\n public stopProgressInterval(triggerType?: eOztamTrigger) {\n if (this._progressInterval === undefined) {\n return;\n }\n this._log(\"### stop progress interval\");\n\n this.trackProgress(triggerType);\n clearInterval(this._progressInterval);\n this._progressInterval = undefined;\n }\n\n /**\n * do not customize below private and protected functions\n */\n public dispatch(fields: iOzTamTrackingFields) {\n if (!this.canDispatch(fields)) {\n this._log(\"could not dispatch\", fields);\n return;\n }\n\n this._log(\"dispatch \", ()=>{ return JSON.stringify(fields.events[0])});\n let that = this;\n requestSend({\n method: \"POST\",\n url: that._oztamConfig.serverTarget,\n headers: {\n \"Content-Type\": \"application/json\"\n },\n data: JSON.stringify(fields)\n })\n }\n\n\n public canDispatch(fields): boolean {\n try {\n let eventObj: iOzTamTrackingEvent = fields.events[0];\n switch (eventObj.event) {\n case eOzTamEvent.PROGRESS:\n const preventDispatch =\n eventObj.toPosition < eventObj.fromPosition || eventObj.toPosition - eventObj.fromPosition < 0.3;\n const missingPosition = eventObj.fromPosition === undefined || eventObj.toPosition === undefined;\n const nanPosition = isNaN(eventObj.fromPosition) || isNaN(eventObj.toPosition);\n const flagPass = !preventDispatch && !missingPosition && !nanPosition;\n if (!flagPass) {\n this._log(\"canDispatch\", {\n preventDispatch,\n missingPosition,\n nanPosition\n }, eventObj);\n }\n return flagPass;\n default:\n return true;\n }\n } catch (e) {\n console.error(e);\n return false;\n }\n }\n\n public startSession(\n oztamConfig,\n media,\n eventBuilder,\n ) {\n this._oztamConfig = oztamConfig;\n this._media = media;\n this._eventBuilder = eventBuilder;\n }\n\n // there is a case that session id given from 3rd party,\n // so can't directly delete/init it in startSession function\n public resetSessionId(sessionId?: string) {\n if (sessionId) {\n this._registeredSessionId = sessionId;\n } else {\n delete this._registeredSessionId;\n }\n }\n\n public async trackLoad() {\n let event = this.getEventData(eOzTamEvent.LOAD, eOztamTrigger.LOAD);\n let fields = this.getFields(event, this._media, this._oztamConfig);\n this._log(\"lib will tracks \", event, fields);\n this.dispatch(fields);\n }\n\n public trackBegin(properties: iOzTamTrackingProperties) {\n let event = this.getEventData(eOzTamEvent.BEGIN, eOztamTrigger.BEGIN);\n let fields = this.getFields(event, this._media, this._oztamConfig);\n fields.properties = properties;\n this._log(\"lib will tracks \", event, fields);\n this.dispatch(fields);\n }\n\n public async trackAdStart(properties?: iOzTamTrackingProperties) {\n let event = this.getEventData(eOzTamEvent.AD_BEGIN, eOztamTrigger.AD_EVENT);\n let fields = this.getFields(event, this._media, this._oztamConfig);\n this._log(\"lib will tracks \", event, fields);\n this.dispatch(fields);\n }\n\n public trackAdComplete() {\n let event = this.getEventData(eOzTamEvent.AD_COMPLETE, eOztamTrigger.AD_EVENT);\n let fields = this.getFields(event, this._media, this._oztamConfig);\n this._log(\"lib will tracks \", event, fields);\n this.dispatch(fields);\n }\n\n /**\n * if \"triggerType\" is given, it must be eOztamTrigger.PROGRESS_INTERVAL\n * else don not send triggerType to getEventData method means casual progress track\n * @param triggerType\n */\n public trackProgress(triggerType?: eOztamTrigger) {\n let event = this.getEventData(eOzTamEvent.PROGRESS, triggerType);\n let fields = this.getFields(event, this._media, this._oztamConfig);\n this._log(\"lib will tracks \", event, fields);\n this.dispatch(fields);\n }\n\n public trackComplete() {\n let event = this.getEventData(eOzTamEvent.COMPLETE, eOztamTrigger.COMPLETE);\n let fields = this.getFields(event, this._media, this._oztamConfig);\n this._log(\"lib will tracks \", event, fields);\n this.dispatch(fields);\n }\n}","\nimport {\n eOzTamField,\n eOztamTrigger,\n iOzTamTrackingEvent,\n iOzTamTrackingMeta_Config,\n iOzTamTrackingMeta_Media,\n iOzTamTrackingProperties,\n OzTamServiceV2\n} from \"./oztam.v2.lib\";\nimport {Tracking} from \"./util/abstract/tracking\";\nimport {iMediaInfo} from \"./allocator.video.type\";\nimport {iOztamV2ExtraInfo} from \"./oztam.v2.type\";\nimport { tenTrack } from \"../tenTrack/track.init\";\nimport {TrackJS} from \"trackjs\";\nimport Axios from 'axios';\n\nexport class OzTamV2 implements Tracking{\n private _oztamConfig: iOzTamTrackingMeta_Config;\n // TODO refactor name without underscore\n public _oztamService: OzTamServiceV2;\n protected _extraInfo: iOztamV2ExtraInfo = {};\n\n private __storedProgressPosition: number;\n protected _storedProgressPositionTimestamp: number;\n\n protected lastPlayTimestamp: number;\n private duringAdBreak: boolean = false;\n \n private _log = function(...args) {\n //console.log(...args);\n }\n\n constructor(protected trackingConfig: iOzTamTrackingMeta_Config) {\n this._oztamService = new OzTamServiceV2();\n this._oztamConfig = trackingConfig;\n }\n\n // this will be set in each OztamService \"track{EventName}\" method when getting event object.\n // In other events such as pause developer need to manually update this position\n set _storedProgressPosition(positionFloat: number) {\n if (isNaN(positionFloat)) {\n this.__storedProgressPosition = -1;\n return;\n }\n\n this.__storedProgressPosition = parseFloat(positionFloat.toFixed(1));\n this._storedProgressPositionTimestamp = Date.now();\n this._log(\"_storedProgressPosition updated to \", this.__storedProgressPosition);\n }\n\n get _storedProgressPosition(): number {\n return this.__storedProgressPosition || 0;\n }\n\n public addExtraVideoInfo(extraInfo: iOztamV2ExtraInfo) {\n this._extraInfo = Object.assign(this._extraInfo, extraInfo);\n }\n\n /**\n * functions in most case have to be overwritten.\n */\n protected defineGetMediaDurationFn(mediaInfo: iMediaInfo, playerRef): number {\n const duration = mediaInfo.duration === undefined ? 0 : parseInt(mediaInfo.duration);\n if(duration === 0){\n TrackJS.console.error(`VideoId: ${mediaInfo.id} has 0 duration`);\n }\n return duration;\n }\n\n protected defineGetMediaPositionFn(mediaInfo: iMediaInfo, playerRef, lastPlayTimestamp?: number): number {\n return Math.round(playerRef.contentTime);\n }\n\n protected defineGetMediaTypeFn() {\n return \"vod\";\n }\n\n protected defineGetPublisherId(mediainfo: iMediaInfo): string {\n switch (this.defineGetMediaTypeFn()) {\n case \"vod\":\n return this.trackingConfig.meta.account_id;\n case \"live\":\n return mediainfo.publisher_id\n }\n }\n\n protected sessionStart(mediainfo: iMediaInfo, playerRef) {\n this._oztamService.startSession(\n Object.assign({\n publisherId: this.defineGetPublisherId(mediainfo)\n }, this._oztamConfig),\n this.defineTrackingMedia(mediainfo, playerRef),\n (triggerType?: eOztamTrigger) => {\n return this.defineTrackingEvent(mediainfo, playerRef, triggerType)\n }\n )\n }\n\n /**\n * normally below functions does not need to be overwritten, just call it and modify the result\n */\n\n protected defineTrackingProperties(mediainfo: iMediaInfo): iOzTamTrackingProperties {\n return {\n [eOzTamField.ALT_MEDIA_ID]: mediainfo.id,\n [eOzTamField.SERIES_ID]: mediainfo.custom_fields.series_crid_id,\n [eOzTamField.EPISODE_ID]: mediainfo.custom_fields.episode_crid_id,\n [eOzTamField.SERIES_NAME]: mediainfo.custom_fields.tv_show,\n [eOzTamField.EPISODE_NAME]: mediainfo.custom_fields.episode_name || \"\",\n [eOzTamField.CHANNEL]: mediainfo.custom_fields.tv_channel,\n [eOzTamField.CLASSIFICATION]: mediainfo.custom_fields.program_classification,\n [eOzTamField.DEVICE_ID]: tenTrack.deviceId,\n [eOzTamField.DEMO1]: this._extraInfo.oztam_userId,\n } as iOzTamTrackingProperties\n }\n\n protected defineTrackingMedia(mediainfo: iMediaInfo, playerRef): iOzTamTrackingMeta_Media {\n return {\n mediaId: mediainfo.custom_fields?.episode_crid_id || mediainfo.custom_fields?.alt_media_id,\n mediaType: this.defineGetMediaTypeFn(),\n mediaDuration: this.defineGetMediaDurationFn(mediainfo, playerRef),\n url: window.location.href,\n genre: mediainfo.video?.ShowGenre,\n } as iOzTamTrackingMeta_Media;\n }\n\n protected defineTrackingEvent(mediainfo: iMediaInfo, playerRef, triggerType?: eOztamTrigger): iOzTamTrackingEvent {\n let previousStoredPosition = this._storedProgressPosition;\n let positions = {\n fromPosition: previousStoredPosition\n } as any;\n\n switch (triggerType) {\n case eOztamTrigger.LOAD:\n return {\n fromPosition: 0,\n toPosition: 0\n } as any;\n case eOztamTrigger.BEGIN:\n this._storedProgressPosition = this.defineGetMediaPositionFn(mediainfo, playerRef);\n return {\n fromPosition: 0,\n toPosition: 0\n } as any;\n\n case eOztamTrigger.AD_EVENT: // includes adStart & adComplete\n positions.toPosition = positions.fromPosition;\n break;\n case eOztamTrigger.COMPLETE:\n this._storedProgressPosition = this.defineGetMediaPositionFn(mediainfo, playerRef);\n positions.fromPosition = positions.toPosition = this._storedProgressPosition;\n break;\n case eOztamTrigger.PROGRESS_INTERVAL:\n if (this.defineGetMediaTypeFn() === \"live\") {\n positions.fromPosition = this.defineGetMediaPositionFn(mediainfo, playerRef, this._storedProgressPositionTimestamp);\n positions.toPosition = this._storedProgressPosition = Math.floor(\n positions.fromPosition + (Date.now() - this._storedProgressPositionTimestamp) / 1000);\n } else {\n positions.toPosition = this._storedProgressPosition = this.defineGetMediaPositionFn(mediainfo, playerRef);\n }\n break;\n default:\n if (this.defineGetMediaTypeFn() === \"live\") {\n positions.fromPosition = this.defineGetMediaPositionFn(mediainfo, playerRef, this._storedProgressPositionTimestamp);\n positions.toPosition = this._storedProgressPosition = Math.floor(\n positions.fromPosition + (Date.now() - this._storedProgressPositionTimestamp) / 1000);\n } else {\n if (eOztamTrigger.DISPOSE === triggerType) {\n // player position will be unavailable when dispose\n positions.toPosition = positions.fromPosition + (Date.now() - this._storedProgressPositionTimestamp) / 1000;\n this._storedProgressPosition = positions.toPosition;\n } else {\n // player.currentTime() after seeking will be seeked position instead the position before seeking action. Use watchPosition which have less than 50ms delay\n /**\n * for chromecast once stream VOD stream with ad\n */\n if (playerRef.getContentPositionFromPayloadPosition) {\n positions.toPosition = playerRef.getContentPositionFromPayloadPosition(playerRef.watchPosition);\n } else {\n positions.toPosition = Math.round(playerRef.watchPosition);\n }\n this._storedProgressPosition = this.defineGetMediaPositionFn(mediainfo, playerRef);\n }\n\n /**\n * in case like chromecast sender backward forward 30 seconds, the BC player currenttime might not be synced position, it is too complex to fix it properly, here it will reduce the duration to normal range, and this case only rarely happens\n */\n if (positions.toPosition - positions.fromPosition >=60) {\n positions.toPosition = positions.fromPosition + (Date.now() - this._storedProgressPositionTimestamp) / 1000;\n }\n if (positions.toPosition - positions.fromPosition >=60) {\n positions.toPosition = positions.fromPosition + 60;\n }\n }\n }\n return positions;\n }\n\n /**\n * event handlers for allocator\n */\n\n public onLoadedMetadata(mediainfo, playerRef) {\n this.sessionStart(mediainfo, playerRef);\n this._oztamService.trackLoad();\n }\n\n public onFirstPlay(mediainfo, playerRef) {\n this.lastPlayTimestamp = Date.now();\n\n this._oztamService.trackBegin(this.defineTrackingProperties(mediainfo));\n this._oztamService.startProgressInterval();\n }\n\n public onPause() {\n if (this.duringAdBreak) {\n return;\n }\n this._oztamService.stopProgressInterval();\n }\n\n public onUnPause(mediainfo, playerRef) {\n this.lastPlayTimestamp = Date.now();\n\n if (this.duringAdBreak) {\n return;\n }\n this._storedProgressPosition = this.defineGetMediaPositionFn(mediainfo, playerRef);\n this._oztamService.startProgressInterval();\n }\n\n public onComplete() {\n this._oztamService.stopProgressInterval();\n this._oztamService.trackComplete();\n }\n\n public onSeeking() {\n this.onPause();\n }\n\n protected onSeeked(mediainfo, playerRef) {\n this.onUnPause(mediainfo, playerRef);\n }\n\n public onAdBreakStart() {\n this._oztamService.stopProgressInterval();\n this.duringAdBreak = true;\n }\n\n public onAdBegin() {\n this._oztamService.trackAdStart();\n }\n\n public onAdComplete() {\n this._oztamService.trackAdComplete();\n }\n\n public onAdBreakEnd(mediainfo, playerRef) {\n this._storedProgressPosition = this.defineGetMediaPositionFn(mediainfo, playerRef);\n this._oztamService.startProgressInterval();\n this.duringAdBreak = false;\n }\n\n public dispose() {\n if (this._oztamService.hasIntervalRunning) {\n this._oztamService.stopProgressInterval(eOztamTrigger.DISPOSE);\n }\n }\n\n public stopTracking() {\n this.dispose();\n }\n\n public resetSessionId() {\n this._oztamService.resetSessionId();\n }\n}","import {CallStack} from \"./util/callStack\";\nimport {Tracking} from \"./util/abstract/tracking\";\nimport {eUtag, iUtag} from \"../ten/env.utag\";\nimport {jwtMember} from \"../pkgPlayer/player/jwt/cacheStatus\";\nimport { getRoundedMinutes, isEmptyObj } from \"./util\";\n\nexport interface iTealiumExtraInfo {\n genre: string,\n genreSecondary: string,\n}\n\nexport interface iTealiumTrackingData {\n showName: string,\n showKey: string,\n showEpisodeName: string,\n showNameTargeting: string,\n showEpisodeVideoType: string,\n showContentName: string,\n showContentFormatType: string,\n showGenre: string,\n showGenreSecondary: string,\n call_type: string,\n platform: string,\n device: string,\n deviceType: string,\n n10adId: string,\n adobeECID: string,\n}\n\nexport interface iTealiumLiveTrackingData extends iTealiumTrackingData {\n showContentSeason: string,\n showContentMarket: string,\n showContentCategory:string,\n showContentId: string,\n showContentVideoId: string,\n showContentVideoType: string,\n showChannel: string,\n showId: string,\n showGenre: string,\n showName: string,\n showProgramClassification: string,\n isMemberGatedLive: string,\n oztamPublisherId: string,\n oztamSessionId: string,\n videoDuration: string,\n adType: string,\n adDuration:number,\n adIndex: number,\n adTitle: string,\n}\n\nexport class Tealium extends CallStack implements Tracking{\n protected mediaInfo;\n protected utag;\n protected mediaTrackingInfo;\n protected extraInfo: iTealiumExtraInfo = {} as any;\n protected videoHasStarted = false;\n\n constructor() {\n super({\n variable: window,\n property: \"utag\",\n });\n this.push(()=>{\n this.utag = (window as any).utag || {};\n this.utag.track = this.utag.track || function(){\n console.error(\"utag is not available\");\n };\n })\n }\n\n // todo - depreciated\n static isLibReady () {\n return !!(window as any).utag;\n }\n\n public addExtraVideoInfo(extraInfo) {\n Object.assign(this.extraInfo, extraInfo);\n }\n\n /**\n * should return string\n */\n protected getMediaGenre(utag_data: iUtag) {\n const genre: any = utag_data[eUtag.showGenre] || this.extraInfo.genre;\n return genre && Array.isArray(genre) && genre.join(\",\") || genre;\n }\n protected getMediaGenreSecondary(utag_data: iUtag) {\n const genre: any = utag_data[eUtag.showGenreSecondary] || this.extraInfo.genreSecondary;\n return genre && Array.isArray(genre) && genre.join(\",\") || genre;\n }\n\n protected getGeneralData (mediaInfo): iTealiumTrackingData | iTealiumLiveTrackingData {\n const {custom_fields, channelDisplayName} = mediaInfo;\n const video_fields = mediaInfo.video;\n const member = jwtMember.getUserDetail();\n const utag_data: iUtag = (window as any).utag_data || {};\n const player = (window as any).player || {};\n const fastChannelTrackData = {\n showContentMarket: custom_fields.showContentMarket,\n showGenre: video_fields.ShowGenre,\n showProgramClassification: video_fields.ShowProgramClassification,\n isMemberGatedLive: video_fields.isMemberGatedLive,\n }\n const trackingData = {\n showName: utag_data[eUtag.showName],\n showNameTargeting: utag_data[eUtag.showNameTargeting] || custom_fields.tv_show,\n n10adId: utag_data[eUtag.n10adId] || \"\",\n showKey: (function () {\n let tvEpisode = custom_fields.tv_episode;\n if (!tvEpisode) {\n return \"\";\n }\n\n let subStringAsKeyMatch = tvEpisode.match(/([a-zA-Z0-9]{1,}[^0-9]{1,})[0-9]{0,}\\//);\n return subStringAsKeyMatch && subStringAsKeyMatch.length >= 2 ? subStringAsKeyMatch[1] : \"\";\n })(),\n showEpisodeName: custom_fields.clip_title,\n showEpisodeVideoType: custom_fields.video_type_long_form,\n showContentId: !utag_data[eUtag.showKey] || utag_data[eUtag.showKey] === undefined ? utag_data[eUtag.showContentId] : utag_data[eUtag.showKey]+\":\"+ utag_data[eUtag.showContentCategory].toLowerCase(),\n showId: mediaInfo.id,\n showContentName: utag_data[eUtag.showContentName] || document.title?.replace(\"- Network Ten\", \"\"),\n showContentVideoId: utag_data[eUtag.showContentVideoId] || custom_fields.alt_media_id,\n showChannel: channelDisplayName || custom_fields.tv_channel || utag_data[eUtag.showChannel],\n showContentVideoType: custom_fields.video_type_long_form ||utag_data[eUtag.showContentVideoType],\n showContentCategory: utag_data[eUtag.showContentCategory],\n showContentSeason: custom_fields.season || utag_data[eUtag.showContentSeason],\n showContentFormatType: custom_fields.video_type_long_form === \"Full Episode\" ? \"Long Form\" : custom_fields.video_type_long_form === \"Live\" ? \"live\" : \"Short Form\",\n showGenre: this.getMediaGenre(utag_data),\n showGenreSecondary: this.getMediaGenreSecondary(utag_data),\n videoDuration: mediaInfo.duration,\n adType: mediaInfo.adType,\n adDuration:mediaInfo.adDuration,\n adIndex:mediaInfo.adIndex,\n adTitle:mediaInfo.adTitle,\n oztamPublisherId: mediaInfo.publisher_id,\n oztamSessionId: custom_fields.oztamSessionId,\n autoPlayFlag: jwtMember.getAutoplaySetting(),\n call_type: \"link\",\n platform: \"web\",\n device: \"web\",\n deviceType: \"web\",\n adobeECID: utag_data.deviceIdAdobe,\n }\n\n if (custom_fields.video_type_long_form === \"Live\") {\n return Object.assign(trackingData, fastChannelTrackData);\n }\n\n return trackingData;\n }\n\n protected getAdData (mediaInfo, adInfo) {\n const adDataIsEmpty = isEmptyObj(adInfo);\n const generalData = this.getGeneralData(mediaInfo);\n return adDataIsEmpty ? generalData : Object.assign({}, generalData, adInfo);\n }\n\n setMediaInfo(mediaInfo) {\n this.mediaInfo = mediaInfo;\n }\n load(mediaInfo) {\n this.mediaInfo = mediaInfo;\n if (!this.mediaInfo) {\n return;\n }\n this.mediaTrackingInfo = this.getGeneralData(this.mediaInfo);\n this.mediaTrackingInfo.tealium_event = \"video_load\";\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n firstPlay () {\n if (!this.mediaInfo) {\n return;\n }\n this.videoHasStarted = true;\n this.mediaTrackingInfo = this.getGeneralData(this.mediaInfo);\n this.mediaTrackingInfo.tealium_event = \"video_start\";\n this.mediaTrackingInfo.urlCode = this.mediaInfo.id;\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n onChangeVideo () {\n if (!this.mediaInfo) {\n return;\n }\n this.mediaTrackingInfo = this.getGeneralData(this.mediaInfo);\n this.mediaTrackingInfo.tealium_event = \"video_up_next\";\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n pause () {\n if (!this.mediaInfo) {\n return;\n }\n this.mediaTrackingInfo = this.getGeneralData(this.mediaInfo);\n this.mediaTrackingInfo.tealium_event = \"video_pause\";\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n seeking () {\n if (!this.mediaInfo || !this.videoHasStarted) {\n return;\n }\n this.mediaTrackingInfo = this.getGeneralData(this.mediaInfo);\n this.mediaTrackingInfo.tealium_event = \"video_seeking\";\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n finished () {\n if (!this.mediaInfo) {\n return;\n }\n this.mediaTrackingInfo = this.getGeneralData(this.mediaInfo);\n this.mediaTrackingInfo.tealium_event = \"video_complete\";\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n segmentView () {\n if (!this.mediaInfo) {\n return;\n }\n this.mediaTrackingInfo = this.getGeneralData(this.mediaInfo);\n this.mediaTrackingInfo.tealium_event = \"video_segment_view\";\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n adStart (matadata, playerRef, adData) { \n if (!this.mediaInfo) {\n return;\n }\n this.mediaTrackingInfo = this.getAdData(this.mediaInfo, adData);\n this.mediaTrackingInfo.tealium_event = \"ad_start\";\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n adEnd (matadata, playerRef, adData) {\n if (!this.mediaInfo) {\n return;\n }\n this.mediaTrackingInfo = this.getAdData(this.mediaInfo, adData);\n this.mediaTrackingInfo.tealium_event = \"ad_end\";\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n onExit (mediainfo, playerRef, extraData) {\n if (!this.mediaInfo) {\n return;\n }\n const customExitData = extraData ? extraData : {'videoWatchedDuration' : (playerRef?.playbackTime || 0) > 0 ? getRoundedMinutes(playerRef.playbackTime).toString() : '0'};\n this.mediaTrackingInfo = this.getGeneralData(this.mediaInfo);\n Object.assign(this.mediaTrackingInfo, customExitData);\n this.mediaTrackingInfo.tealium_event = \"video_exit\";\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n });\n }\n\n public dispose() {\n super.dispose();\n }\n\n public stopTracking() {\n this.dispose();\n }\n}\n","import {iTrackingService} from \"./tracking.conf.type\";\nimport {deviceType} from \"../pkgPlayer/player/util/device\";\n\nexport const trackingServiceConfig: iTrackingService = {\n oztam: {\n enabled: true,\n config: {\n staging: {\n serverTarget: \"//sdeliver.oztam.com.au/api/meter\",\n protocolVersion: \"1\",\n vendorVersion: deviceType === \"mobile\" ? \"10play_webmobile_4.1\" : \"10play_webdesktop_4.1\",\n plugin: \"javascript\",\n meta: {\n account_id: \"2199827728001\"\n }\n },\n production: {\n serverTarget: \"//deliver.oztam.com.au/api/meter\",\n protocolVersion: \"1\",\n vendorVersion: deviceType === \"mobile\" ? \"10play_webmobile_4.1\" : \"10play_webdesktop_4.1\",\n plugin: \"javascript\",\n meta: {\n account_id: \"2199827728001\"\n }\n }\n }\n },\n mux: {\n enabled: true,\n config: {\n staging: {\n key: \"52g3d6oag448r0bhh5fovnch1\",\n },\n production: {\n key: \"aj41vmodeesojujgtkmm1sfcu\",\n }\n }\n }\n};","export interface iEnv {\n productionHostName: string | Array;\n isProduction: () => boolean;\n isStaging: () => boolean;\n}\n\n/**\n * Global environment setting\n * @type {iEnv}\n */\nlet envTemp: iEnv = {} as any;\n\nif (typeof window !== \"undefined\"){\n envTemp = {\n productionHostName: [\n \"10play.com.au\",\n \"www.10play.com.au\"\n ],\n isProduction: () => {\n let prodDomain = envTemp.productionHostName;\n if (typeof prodDomain === \"string\") {\n return !!(prodDomain && window.location.hostname === prodDomain);\n }\n\n if (prodDomain && Array.isArray(prodDomain)) {\n return prodDomain.indexOf(window.location.hostname) >= 0;\n }\n },\n isStaging: () => {\n return !envTemp.isProduction();\n }\n };\n}\n\nexport const env = envTemp;","/**\n * make sure bind \"this\" to these methods while calling\n */\nimport {env} from \"./tracking.env\";\n\nexport function initOztam(OztamClass) {\n if (this._servicesConfig?.oztam?.enabled) {\n return new OztamClass(\n env.isStaging() ?\n this._servicesConfig.oztam.config.staging :\n this._servicesConfig.oztam.config.production\n );\n }\n}\n\nexport function initTealium(TealiumClass) {\n return new TealiumClass();\n}","import { env } from \"../pkgAviaAllocator/tracking.env\";\n\nexport function UUID_v4() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n}\n\n\ninterface iRestParam {\n method: \"POST\" | \"GET\",\n url: string,\n headers: { [header: string]: string },\n successCallback?,\n failCallback?,\n isAsync?: boolean,\n data?: any\n}\n\n\n\nexport async function requestSend(param: iRestParam) {\n fetch(param.url, {\n method: param.method,\n headers: param.headers,\n body: param.data,\n keepalive: true\n }).then( response => {\n if (response.ok) {\n return response.text();\n }\n }).catch(error => {\n console.log(error);\n });\n}\n\nexport function rest(param: iRestParam) {\n let request = new XMLHttpRequest();\n request.open(param.method, param.url);\n let headerNames = Object.keys(param.headers);\n for (let i = 0; i < headerNames.length; i++) {\n let headerName = headerNames[i];\n request.setRequestHeader(headerName, param.headers[headerName]);\n }\n\n if (param.successCallback) {\n request.onreadystatechange = function() {\n if (request.readyState !== 4 || request.status !== 200) {\n return;\n }\n\n try {\n param.successCallback(request.responseText);\n } catch (e) {\n param.failCallback && param.failCallback(e);\n }\n }\n }\n if (param.failCallback) {\n request.onerror = param.failCallback;\n }\n\n request.send(param.method.toLowerCase() === \"post\" && param.data)\n}\n\n\n\nexport function isIOS(): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n return [\n // this Simulator is iOS simulator, not browser simulator,\n // means browser simulator of iOS return false here\n 'iPad Simulator',\n 'iPhone Simulator',\n 'iPod Simulator',\n 'iPad',\n 'iPhone',\n 'iPod'\n ].some(function(exactPlatformString) {\n return navigator.platform === exactPlatformString\n });\n}\n\nexport const isEmptyObj = (obj: any) => {\n return obj === null || obj === undefined ||\n (Array.isArray(obj) && obj.length === 0) ||\n \"object\" === typeof obj && Object.keys(obj).length === 0 ||\n \"string\" === typeof obj && obj === '';\n}\n\n\n//Requirement: Rounded to the nearest minute eg: if user watches 50 min and 1 -30 sec then pass through 50, if user watches 50min and 31 - 60 sec then pass through 51\nexport function getRoundedMinutes(duration: number) {\n let roundedDuration = Math.floor(duration / 60);\n let remainder = duration % 60;\n if (remainder >= 30) {\n roundedDuration += 1;\n }\n return roundedDuration;\n}\n\n\nexport function Timer(callback: () => void, startTime: number, endTime:number) {\n let timerId: number, start: number, remaining = endTime - startTime;\n let paused = false;\n let pausedTime = 0;\n\n function pause() {\n window.clearTimeout(timerId);\n remaining -= Date.now() - start;\n paused = true;\n pausedTime = remaining;\n }\n\n function resume() {\n start = Date.now();\n window.clearTimeout(timerId);\n timerId = window.setTimeout(callback, remaining);\n paused = false;\n }\n\n this.pause = pause;\n this.resume = resume;\n\n resume();\n}\n\nexport function getDomain(): string {\n return env.isProduction() ? 'https://10play.com.au' : 'https://ww1.10play.com.au'\n}\nexport function getUserIp() {\n return new Promise((resolve, reject) => {\n fetch(`${getDomain()}/whatismyip`)\n .then(res => res.json())\n .then(data => {\n resolve(data.ip);\n })\n .catch(err => reject(err));\n });\n}","import {Dispose} from \"./abstract/dispose\";\n\nexport interface iCallStackConfig {\n variable: any,\n property: string,\n ms?: number,\n}\n\nexport class CallStack implements Dispose{\n private interval: number;\n private callbacks: Array = [];\n\n constructor(private config: iCallStackConfig) {\n config.ms = config.ms || 25;\n this.watch();\n }\n\n protected push (fn: Function) {\n this.callbacks.push(fn);\n\n if (this.isReady()) {\n this.onReady();\n }\n }\n\n\n private watch() {\n this.interval = window.setInterval(() => {\n if (this.isReady()) {\n this.onReady();\n window.clearInterval(this.interval);\n }\n }, this.config.ms)\n }\n private isReady() {\n const config = this.config;\n return typeof config.variable === \"object\" && config.variable[config.property];\n }\n private onReady() {\n if (Array.isArray(this.callbacks)) {\n this.callbacks.forEach(fn=>{\n typeof fn === \"function\" && fn();\n });\n this.callbacks = [];\n }\n }\n\n public dispose() {\n this.interval && window.clearInterval(this.interval);\n this.callbacks = [];\n }\n\n}","import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';\n\nexport interface iBVodData {\n Demo: string;\n BvodId: string;\n BvodIdSalt: string;\n}\n\nexport class AuthenticatedEndpointHandler {\n private apiKey: string;\n private publisherName: string;\n private authToken: string | null;\n private baseUrl: string;\n\n constructor(apiKey: string, publisherName: string) {\n this.apiKey = apiKey;\n this.publisherName = publisherName;\n this.authToken = null;\n this.baseUrl = 'https://realtime-demos.oztam.com.au';\n }\n\n private async requestToken(): Promise {\n try {\n const response: AxiosResponse = await axios.post(`${this.baseUrl}/sign_jwt`, {\n PublisherName: this.publisherName\n }, {\n headers: { 'api-key': this.apiKey }\n });\n\n this.authToken = response.data.access_token;\n return this.authToken;\n } catch (error) {\n this.handleError('signJWT', error);\n throw error;\n }\n }\n\n private async ensureAuthToken(): Promise {\n if (!this.authToken) {\n await this.requestToken();\n }\n }\n\n private async retryRequest(func: () => Promise, retries: number = 3): Promise {\n let attempt = 0;\n while (attempt < retries) {\n try {\n return await func();\n } catch (error) {\n if (!error.response || error.code === 'ECONNABORTED' || error.response.status === 500) {\n attempt++;\n if (attempt < retries) {\n await this.delay(300); // Retry after 300ms\n } else {\n throw error;\n }\n } else {\n throw error;\n }\n }\n }\n throw new Error('Max retries reached');\n }\n\n private async delay(ms: number): Promise {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n public async postAuthenticatedData(endpoint: string, data: any): Promise {\n await this.ensureAuthToken();\n return this.retryRequest(() => this.makeAuthenticatedPostRequest(endpoint, data));\n }\n\n private async makeAuthenticatedPostRequest(endpoint: string, data: any): Promise {\n const config: AxiosRequestConfig = {\n headers: { Authorization: `Bearer ${this.authToken}` }\n };\n\n return await axios.post(`${this.baseUrl}${endpoint}`, data, config);\n }\n\n public async postUnauthenticatedData(endpoint: string, data: any): Promise {\n return this.retryRequest(() => axios.post(`${this.baseUrl}${endpoint}`, data));\n }\n\n public mapBvodDataToOztamParams(bvodData: { BvodId: string; Demo: string; BvodIdSalt: string; }[]): [string, string][] {\n const oztamParamsArray: [string, string][] = [];\n bvodData.forEach((item, index) => {\n oztamParamsArray.push([`oztam_${index + 1}`, item.BvodId]);\n oztamParamsArray.push([`oztam_${index + 1}demo`, item.Demo]);\n oztamParamsArray.push([`oztam_${index + 1}salted`, item.BvodIdSalt.toLowerCase()===\"none\" ? '' : item.BvodIdSalt]);\n }); \n return oztamParamsArray;\n }\n\n public addCustParamsCsi(resource: any, bcodData: [string, string][]): string {\n if (!resource || !resource.ad || !resource.ad.csai || !resource.ad.csai.adCallUrl) {\n return;\n }\n \n let adCallUrl: string = resource.ad.csai.adCallUrl;\n let url = new URL(adCallUrl);\n let params = new URLSearchParams(url.search);\n let custParams = params.get('cust_params');\n \n if (!custParams) {\n throw new Error('cust_params not found in the URL');\n }\n \n let custParamsObj: { [key: string]: string } = {};\n custParams.split('&').forEach(param => {\n let [key, value] = param.split('=');\n custParamsObj[key] = value;\n });\n \n bcodData.forEach(([key, value]) => {\n custParamsObj[key] = value;\n });\n \n let newCustParams = Object.entries(custParamsObj).map(([key, value]) => `${key}=${value}`).join('&');\n params.set('cust_params', newCustParams);\n adCallUrl = `${url.origin}${url.pathname}?${params.toString()}`;\n \n resource.ad.csai.adCallUrl = adCallUrl;\n \n return resource.ad.csai.adCallUrl;\n }\n\n\n public addCustParamsSsi(resource: any, bvodData: [string, string][]): string {\n if (!resource || !resource.ad || !resource.ad.ssai || !resource.ad.ssai.adParameters) {\n return;\n }\n \n let custParams = resource.ad.ssai.adParameters.cust_params;\n \n if (!custParams) {\n throw new Error('cust_params not found in adParameters');\n }\n \n let custParamsObj: { [key: string]: string } = {};\n custParams.split('&').forEach(param => {\n let [key, value] = param.split('=');\n custParamsObj[key] = value;\n });\n \n bvodData.forEach(([key, value]) => {\n custParamsObj[key] = value;\n });\n \n let newCustParams = Object.entries(custParamsObj).map(([key, value]) => `${key}=${value}`).join('&');\n resource.ad.ssai.adParameters.cust_params = newCustParams;\n \n return resource.ad.ssai.adParameters.cust_params;\n }\n private handleError(type: string, error: any): void {\n const status = error.response ? error.response.status : 'Unknown';\n const message = error.message || 'No message available';\n\n console.error(`[${type} Error] Status: ${status}, Message: ${message}`);\n }\n}","export class Api {\n static attachApiUrl(url) {\n if (typeof window !== \"undefined\" && window.apiUrl) {\n url = window.apiUrl + url;\n }\n return \"//\" + url.replace(/([^:])\\/\\//, \"$1/\").replace(\"https://\", \"\");\n }\n}\n","import {iUapApiVideoData} from \"./api.video.type\";\nimport {iPlaybackInfoApiType} from \"./api.video.type\";\nimport {jwtMember} from \"../../tenMember/jwt/cacheStatus\";\nimport {eJwtRefreshToken, jwtRefreshToken} from \"../../tenMember/jwt/api/jwtToken\";\nimport {Api} from \"./api\";\n\nexport class ApiVideo {\n static getPlaybackInfoPath(urlCode: string): string {\n return Api.attachApiUrl(`/api/v1/videos/playback/${urlCode}/?platform=web`);\n }\n\n /**\n * return playbackInfo OR null for fail OR undefined for no action taken\n * @param urlCode\n * @param freeWheelEnabled\n * @param drmEnabled\n */\n static async getPlaybackInfo(\n urlCode: string, \n freeWheelEnabled: boolean,\n drmEnabled: boolean\n ): Promise {\n try {\n const refreshResult = await jwtRefreshToken();\n \n const headers: Record = {};\n\n // Handle feature flags\n if (freeWheelEnabled && drmEnabled) {\n headers[\"TP-AcceptFeature\"] = \"v1/fw;v1/drm\";\n } else if (freeWheelEnabled) {\n headers[\"TP-AcceptFeature\"] = \"v1/fw\";\n } else if (drmEnabled) {\n headers[\"TP-AcceptFeature\"] = \"v1/drm\";\n }\n\n if (refreshResult === eJwtRefreshToken.active) {\n const accessToken = jwtMember.getAccessToken();\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n } else {\n console.warn(\"Access token is missing.\");\n }\n }\n \n const url = ApiVideo.getPlaybackInfoPath(urlCode);\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n });\n \n if (!response.ok) {\n console.error(`Error fetching playback info from ${url}:`, response.statusText);\n return null;\n }\n \n const streamSignature = response.headers.get('x-stream-sig');\n const daiAuthToken = response.headers.get('x-dai-auth');\n const responseData = await response.json();\n \n if (!responseData) {\n console.warn(\"Received empty response data.\");\n return null;\n }\n \n return {\n ...responseData,\n streamSignature: streamSignature || responseData.streamSignature || \"default-signature\",\n daiAuthToken: daiAuthToken || responseData.daiAuthToken || \"default-dai-auth-token\",\n } as iPlaybackInfoApiType;\n \n } catch (error) {\n console.error(\"Fetch error:\", error);\n return null;\n }\n }\n \n \n \n\n static getVideoWebPath(urlCode: string) {\n return Api.attachApiUrl(`/api/video/${urlCode}`);\n }\n\n static getVideoUapPath(urlCode: string):string {\n return Api.attachApiUrl(`/api/v1/videos/${urlCode}`);\n }\n static async getVideoUapInfo(urlCode: string): Promise {\n const url = ApiVideo.getVideoUapPath(urlCode);\n const response = await fetch(url,{\n method: \"get\",\n })\n .then(res=>res.json())\n .catch((err)=>{\n console.error(err);\n });\n return response as iUapApiVideoData;\n }\n}","import * as avia from '@cbsinteractive/avia-js';\n\nif (typeof window !== \"undefined\") {\n window.avia = avia;\n}\n\nexport { VideoPlayerInterface, PlayerEvent } from '@cbsinteractive/avia-js';","import {\n\tPlayerEvent,\n\ttype PluginConfigInterface,\n\ttype PluginInterface,\n\ttype PluginServicesInterface,\n} from '@cbsinteractive/avia-js';\n\nimport { ConsumerAdviceOptions } from './iface/ConsumerAdviceOptions';\nimport { env } from '../../../ten/conf.env';\n\nexport const ConsumerAdvice = 'consumeradvice';\n\nexport function consumeradvice(options: Partial = {}): PluginConfigInterface {\n\treturn {\n\t\tid: ConsumerAdvice,\n\t\tfactory: createConsumerAdvice,\n\t\toptions,\n\t};\n}\n\nexport async function createConsumerAdvice(services: PluginServicesInterface, options: ConsumerAdviceOptions): Promise {\n\tconst { consumerAdviceOptions } = options;\n\tconst { player, dom } = services;\n\tconst {isLive} = consumerAdviceOptions;\n\n\tconst consumerAdviceTimer = consumerAdviceOptions.duration * 1000;\n\tlet consumerAdviceActive = false;\n\tconst panel = dom.main;\n\tlet container: HTMLElement | null = null;\n\tlet consumerAdviceTimerId: ReturnType;\n\n\t// get url param from the browser\n\tconst url = new URL(window.location.href);\n\tconst debug = url.searchParams.get('debug') === 'ca';\n\n\tconst createConsumerAdviceElement = () => {\n\n\t\tconst excludedList = [\n\t\t\t\n\t\t] // Add assetKeys to exclude from consumer advice could be used for testing\n\t\t\n\t\tconst assetKey = player?.resource?.ad?.ssai?.assetKey || \"\";\n\t\tconst shouldExclude = excludedList.includes(assetKey);\n\n\t\tlet classification: string = \"\";\n\t\tlet consumerAdvice: string = \"\";\n\n\t\tconst displayOverlay = isLive ? consumerAdviceOptions?.displayOverlay : player?.resource?.metadata?.displayOverlay ?? false;\n\t\t\n\t\tclassification = isLive ? (consumerAdviceOptions?.classification || player?.resource?.metadata?.classification || \"\") : (player?.resource?.metadata?.classification || \"\");\n\t\tconsumerAdvice = isLive ? (consumerAdviceOptions?.consumerAdvice || player?.resource?.metadata?.consumerAdvice || \"\") : (player?.resource?.metadata?.consumerAdvice || \"\");\n\n\t\tlogger('Consumer Advice, classification: ', classification);\n\t\tlogger('Consumer Advice, consumerAdvice: ', consumerAdvice);\n\t\tlogger('Consumer Advice, displayOverlay: ', displayOverlay);\n\n\t\tif (!classification || [\"none\", \"e\", \"\"].includes(classification.toLowerCase()) || !displayOverlay || shouldExclude) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement('div');\n\t\tcontainer.classList.add('consumer-advice', 'remove');\n\t\tcontainer.style.position = 'absolute';\n\t\tcontainer.style.transition = 'opacity 5s ease-in-out';\n\n\t\tconst adviceContainer = document.createElement('div');\n\t\tadviceContainer.classList.add('consumer-advice__container');\n\n\t\tconst wrapper = document.createElement('div');\n\t\twrapper.classList.add('consumer-advice__wrapper');\n\n\t\tconst divider = document.createElement('div');\n\t\tdivider.classList.add('consumer-advice__divider');\n\n\n\t\tconst text = document.createElement('div');\n\t\ttext.classList.add('consumer-advice__text');\n\t\ttext.innerHTML = `

Rated ${classification}

${consumerAdvice ? `
${consumerAdvice}
` : ''}`;\n\n\t\twrapper.appendChild(divider);\n\t\twrapper.appendChild(text);\n\t\tadviceContainer.appendChild(wrapper);\n\t\tcontainer.appendChild(adviceContainer);\n\n\t\tpanel.appendChild(container);\n\n\t\tlogger('Consumer Advice, created element: ', container);\n\n\t};\n\n\tconst displayConsumerAdviceElement = () => {\n\t\t\n\t\tif (consumerAdviceActive) {\n\t\t\treturn;\n\t\t}\n\t\tconst adviceContainer = container?.querySelector('.consumer-advice__container') as HTMLElement;\n\t\tif (!adviceContainer) {\n\t\t\treturn;\n\t\t}\n\t\tconst isEmpty = container.children.length === 0;\n\t\tif (!isEmpty) {\n\t\t\tadviceContainer.style.opacity = '1';\n\t\t\tcontainer.classList.remove('remove');\n\t\t\tcontainer.style.display = 'block';\n\n\t\t\tcontainer.style.transition = 'opacity 2s ease-in-out';\n\n\t\t\tif (debug) {\n\t\t\t\tconsole.log('Consumer Advice is displayed');\n\t\t\t}\n\t\t\tshowConsumerAdvice();\n\t\t\tconsumerAdviceActive = true;\n\t\t\tstartConsumerAdviceTimer()\n\t\t}\n\n\t\tlogger('Consumer Advice, displayed element: ', container);\n\t};\n\n\tconst startConsumerAdviceTimer = () => {\n\t\tif (consumerAdviceTimerId) {\n\t\t\tclearTimeout(consumerAdviceTimerId);\n\t\t}\n\t\tconsumerAdviceTimerId = setTimeout(() => {\n\t\t\tlogger('Consumer Advice, timer expired');\n\t\t\tcontainer.style.opacity = '0';\n\t\t\tcontainer.addEventListener('transitionend', () => {\n\t\t\t\tcontainer.style.display = 'none';\n\t\t\t\tremoveConsumerAdvice();\n\t\t\t});\n\t\t}, consumerAdviceTimer);\n\n\t\tlogger('Consumer Advice, started timer: ', consumerAdviceTimerId);\n\t};\n\n\tconst hideConsumerAdvice = () => {\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\t\tcontainer.style.opacity = '0';\n\t\tcontainer.style.display = 'none';\n\t};\n\n\tconst showConsumerAdvice = () => {\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\t\tif (consumerAdviceTimerId) {\n\t\t\tclearTimeout(consumerAdviceTimerId);\n\t\t\tstartConsumerAdviceTimer();\n\t\t}\n\t\tcontainer.style.display = 'block';\n\t\tcontainer.style.opacity = '1';\n\t\tlogger('Consumer Advice, showing element: ', container);\n\t};\n\n\tconst removeConsumerAdvice = () => {\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\t\tcontainer.remove();\n\t\tclearTimeout(consumerAdviceTimerId);\n\t\tconsumerAdviceActive = false;\n\t\tlogger('Consumer Advice, removed element: ', container);\n\t}\n\n\n\t// Player Event Handlers ------------------------------------------------------\n\tconst handlePlayerEvent = async (evt) => {\n\t\tif(player.isAd) {\n\t\t\thideConsumerAdvice();\n\t\t};\n\t\tif(!consumerAdviceActive) {\n\t\t\treturn;\n\t\t}\n\t\tswitch (evt.type) {\n\t\t\tcase PlayerEvent.PLAYBACK_STATE_CHANGE:\n\t\t\t\tif (evt.detail.playbackState === 'stopped') {\t\t\t\t\t\n\t\t\t\t\tremoveConsumerAdvice();\n\t\t\t\t\tlogger('Consumer Advice, playback stopped');\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase PlayerEvent.ACTIVE_STATE_CHANGE:\n\t\t\t\tconst { activeState } = evt.detail;\n\t\t\t\tif (activeState === 'active') {\n\t\t\t\t\tlogger('Consumer Advice, control bar active state');\n\t\t\t\t\thideConsumerAdvice();\n\t\t\t\t} else if (activeState === 'inactive'|| activeState === 'idle' && consumerAdviceActive) {\n\t\t\t\t\tif (!player.isAd) {\n\t\t\t\t\t\tlogger('Consumer Advice, is Ad: ', player.isAd);\n\t\t\t\t\t\tshowConsumerAdvice();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase PlayerEvent.AD_BREAK_COMPLETE:\n\t\t\t\tif(consumerAdviceActive){\n\t\t\t\t\tlogger('Consumer Advice, ad break complete');\n\t\t\t\t\tshowConsumerAdvice();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\nconst handleDestroy = () => {\n\tclearTimeout(consumerAdviceTimerId);\n\n\tconst eventTypes = Object.values(PlayerEvent);\n\teventTypes.forEach((eventType) => player.off(eventType, handlePlayerEvent));\n\n\tlogger('Consumer Advice, destroyed');\n\n\tremoveConsumerAdvice(); \n\t};\n\t\n\n\tconst eventTypes = PlayerEvent;\n\tfor (const key in eventTypes) {\n\t\tplayer.on(eventTypes[key], (event) => {\n\t\t\thandlePlayerEvent(event);\n\t\t});\n\t};\n\n\tplayer.on(PlayerEvent.STREAM_METADATA, createConsumerAdviceElement);\n\tplayer.on(PlayerEvent.CONTENT_START, displayConsumerAdviceElement);\n\n\n\tconst logger = (message: string, ...optionalParams: any[]) => {\n\t\tif (debug && !env.isProduction()) {\n\t\t\tconsole.log('%c' + message, 'color: yellow; font-weight: bold;', ...optionalParams);\n\t\t}\n\t};\n\n\treturn {\n\t\tgetId() {\n\t\t\treturn ConsumerAdvice;\n\t\t},\n\n\t\tdestroy: handleDestroy,\n\t};\n}\n","// Used for tracking\nexport const accountID = 2199827728001;","import \"./avia.lib\";\nimport \"./index.type\";\n\n/**\n * Make sure any import reference to avia ctrl is imported from here,\n * instead of other files in this pkgPlayer folder\n */\nexport { PlayerStates } from './player/playerCtrl.type';\nexport { PlayerCtrl } from \"./player/playerCtrl\";\nexport { VodCtrl } from './vod/vodCtrl';\nexport { LiveCtrl } from './live/liveCtrl';\n","declare global {\n interface Window {\n adsStatus: string | undefined,\n admiral: any,\n avia: any,\n cvui: any,\n aviaui: any,\n tenService: any,\n tvid_callback: any;\n vtg: any,\n apiUrl: any,\n adsOk: any,\n player: any\n geoip2: any,\n utag_data: any,\n remoteAPIControl: any,\n }\n}\n\nexport const ignore = undefined; // make this file module","import type { PluginConfigInterface, PluginInterface, PluginServicesInterface, ResourceConfigurationInterface } from '@cbsinteractive/avia-js';\nimport { AviaLogoDisplayOverlayOptionsInterface } from './AviaLogoOverlayOptionsInterface';\n\nexport const LOGODISPLAYOVERLAY = 'logodisplayoverlay';\n\nexport function logoOverlay(options: Partial = {}): PluginConfigInterface {\n\treturn {\n\t\tid: LOGODISPLAYOVERLAY,\n\t\tfactory: createLogoDisplayOverlayPlugin,\n\t\toptions,\n\t};\n}\n\nexport function createLogoDisplayOverlayPlugin(services: PluginServicesInterface, options: AviaLogoDisplayOverlayOptionsInterface): PluginInterface {\n\tlet resource: ResourceConfigurationInterface;\n\tlet panel: any;\n\tlet listening = false;\n\tconst { debug} = options;\n\n\tconst { player, dom } = services;\n\tconst { PlayerEvent } = services.avia;\n\tconst container = dom.main;\n\n\n\tconst styles = {\n\t\toverlayImage: {\n\t\t\tmaxWidth: \"130px\",\n\t\t},\n\t};\n\n\tconst listen = () => {\n\t\tif (debug) {\n\t\t\tObject.values(PlayerEvent).forEach((value) => {\n\t\t\t\tif (/^ad|error|content/.test(value) && !/progress/.test(value)) {\n\t\t\t\t\tplayer.on(value, (event) => {\n\t\t\t\t\t\tconsole.log(`%cEvent 🚀 : ${event.type}`, 'color: #4cf');\n\t\t\t\t\t\tif (event.type === 'error') {\n\t\t\t\t\t\t\tconsole.log('ERROR');\n\t\t\t\t\t\t\tconsole.dir(event.detail)\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t};\n\n\tconst onContentStart = () => {\n\t\tresource = player.resource as ResourceConfigurationInterface;\n\t\tif (listening) {\n\t\t\treturn;\n\t\t}\n\t\tconst logoUrl = window.player.logoUrl;\n\t\tpanel = document.createElement('div');\n\t\tpanel.classList.add('logo-overlay');\n\t\tpanel.style.zIndex = options.level || 100;\n\t\tpanel.style.position = 'absolute';\n\t\tpanel.style.top = '5%';\n\t\tpanel.style.left = '0';\n\t\tpanel.style.padding = '0.5% 2% 0.5% 8%';\n\t\tpanel.style.maxWidth = '23%';\n\t\tpanel.style.boxShadow = 'inset 0 0 0 100vmax rgba(0, 0, 0, .7)';\n\t\tconst imageTag = panel.getElementsByTagName('img');\n\t\tif (imageTag.length > 0) {\n\t\t\timageTag[0].style.maxWidth = '100%';\n\t\t}\n\t\tpanel.innerHTML = ``;\n\t\tcontainer.appendChild(panel);\n\t\tpanel.style.display = 'none';\n\t\tpanel.style.opacity = 0;\n\t\tlistening = true;\n\t};\n\n\tconst onEnded = (event: any) => {\n\t\tif (!resource) {\n\t\t\treturn;\n\t\t}\n\t\tlistening = false;\n\t\tcontainer.removeChild(panel);\n\t};\n\n\tconst onActiveStateChange = (event: any) => {\n\t\tif(!panel) {\n\t\t\treturn;\n\t\t}\n\t\tif (event.detail.activeState === 'active') {\n\t\t\tpanel.style.display = 'block';\n\t\t\tfadeIn(panel, fadeOut(panel));\n\t\t} else {\n\t\t\tfadeOut(panel, fadeIn(panel));\n\t\t}\n\t}\n\n\t\n\tconst fadeIn = (element: HTMLElement, fadeOutInterval?: NodeJS.Timeout) => {\n\t\tlet opacity = 0;\n\t\telement.style.display = 'block';\n\t\tconst interval = setInterval(() => {\n\t\t\tif (opacity >= 1) {\n\t\t\t\tclearInterval(interval);\n\t\t\t} else {\n\t\t\t\topacity += 0.1;\n\t\t\t\telement.style.opacity = opacity.toString();\n\t\t\t}\n\t\t}, 50);\n\t\tif (fadeOutInterval) {\n\t\t\tclearInterval(fadeOutInterval);\n\t\t}\n\t\treturn interval;\n\t};\n\n\tconst fadeOut = (element: HTMLElement, fadeInInterval?: NodeJS.Timeout) => {\n\t\tlet opacity = 1;\n\t\tconst interval = setInterval(() => {\n\t\t\tif (opacity <= 0) {\n\t\t\t\tclearInterval(interval);\n\t\t\t\telement.style.display = 'none';\n\t\t\t} else {\n\t\t\t\topacity -= 0.1;\n\t\t\t\telement.style.opacity = opacity.toString();\n\t\t\t}\n\t\t}, 10);\n\t\tif (fadeInInterval) {\n\t\t\tclearInterval(fadeInInterval);\n\t\t}\n\t\treturn interval;\n\t};\n\t\n\tplayer.on(PlayerEvent.READY , listen);\n\tplayer.on(PlayerEvent.CONTENT_SEGMENT_START, onContentStart);\n\tplayer.on(PlayerEvent.CONTENT_SEGMENT_END, onEnded);\n\tplayer.on(PlayerEvent.ACTIVE_STATE_CHANGE, onActiveStateChange);\n\n\treturn {\n\t\tgetId() {\n\t\t\treturn LOGODISPLAYOVERLAY;\n\t\t},\n\n\t\tdestroy() {\n\t\t\tif (panel) {\n\t\t\t\tpanel.onclick = null;\n\t\t\t\tcontainer.removeChild(panel);\n\t\t\t}\n\t\t\tplayer.off(PlayerEvent.CONTENT_SEGMENT_START, onContentStart);\n\t\t\tplayer.off(PlayerEvent.CONTENT_SEGMENT_END, onEnded);\n\t\t\tlistening = false;\n\t\t},\n\t};\n}","import { createLogoDisplayOverlayPlugin, LOGODISPLAYOVERLAY , logoOverlay } from './AviaLogoDisplayOverlayPlugin';\n\nexport type { AviaLogoDisplayOverlayOptionsInterface } from './AviaLogoOverlayOptionsInterface';\nexport * from './AviaLogoDisplayOverlayPlugin';\n\n// UMD Aliases\nexport const ID = LOGODISPLAYOVERLAY;\nexport const createPlugin = createLogoDisplayOverlayPlugin;\nexport const plugin = logoOverlay;","import type {\n\tPluginConfigInterface,\n\tPluginInterface,\n\tPluginServicesInterface,\n\tResourceConfigurationInterface,\n} from '@cbsinteractive/avia-js';\nimport { AviaOverlayOptionsInterface } from './AviaOverlayOptionsInterface';\n\nexport const OVERLAY = 'overlay';\n\nexport function overlay(options: Partial = {}): PluginConfigInterface {\n\treturn {\n\t\tid: OVERLAY,\n\t\tfactory: createOverlayPlugin,\n\t\toptions,\n\t};\n}\n\nexport function createOverlayPlugin(services: PluginServicesInterface, options: AviaOverlayOptionsInterface): PluginInterface {\n\tconst { avia, player, dom } = services;\n\tconst { PlayerEvent } = avia;\n\n\tlet resource: ResourceConfigurationInterface;\n\tlet listening = false;\n\tlet panel: HTMLElement;\n\n\tconst container = dom.main;\n\n\tfunction onContentStart() {\n\t\tif (listening) {\n\t\t\treturn;\n\t\t}\n\n\t\tresource = player.resource;\n\n\t\tconst playlistPlugin = player.getPlugin('playlist');\n\t\tif (playlistPlugin) {\n\t\t\tplayer.on(avia.PlayerEvent.PLUGIN_EVENT, onEnded);\n\t\t} else {\n\t\t\tplayer.on(avia.PlayerEvent.RESOURCE_END, onEnded);\n\t\t}\n\n\t\tlistening = true;\n\t}\n\n\tfunction onEnded(event: any) {\n\t\tif (!resource) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.type === avia.PlayerEvent.PLUGIN_EVENT && event.detail?.type !== 'playlistcomplete') {\n\t\t\treturn;\n\t\t}\n\n\t\trender();\n\t}\n\n\n\n\tfunction render() {\n\t\tconst panelElement = document.createElement('div');\n\t\tpanelElement.classList.add('live-avia-play-overlay');\n\t\tpanelElement.style.zIndex = (options.level || 100).toString();\n\t\tpanelElement.innerHTML = '
';\n\t\tpanelElement.onclick = () => {\n\t\t\tresource.playback.startTime = 0;\n\t\t\tplayer.attachResource(resource);\n\t\t\tcontainer.removeChild(panelElement);\n\t\t};\n\n\t\tcontainer.appendChild(panelElement);\n\t\tpanel = panelElement;\n\t}\n\n\tfunction destroy() {\n\t\tif (panel) {\n\t\t\tpanel.onclick = null;\n\t\t\tcontainer.removeChild(panel);\n\t\t\tpanel = null;\n\t\t}\n\n\t\tplayer.off(PlayerEvent.CONTENT_START, onContentStart);\n\t\tplayer.off(PlayerEvent.CONTENT_PROGRESS, onContentStart);\n\t\tplayer.off(PlayerEvent.LIVE_PRESENTATION_STOPPED, onEnded);\n\n\t\tconst playlistPlugin = player.getPlugin('playlist');\n\t\tif (playlistPlugin) {\n\t\t\tplayer.off(PlayerEvent.PLUGIN_EVENT, onEnded);\n\t\t} else {\n\t\t\tplayer.off(PlayerEvent.RESOURCE_END, onEnded);\n\t\t}\n\n\t\tlistening = false;\n\t\tresource = null;\n\t}\n\n\tplayer.on(PlayerEvent.CONTENT_START, onContentStart);\n\tplayer.once(PlayerEvent.CONTENT_PROGRESS, onContentStart);\n\tplayer.on(PlayerEvent.LIVE_PRESENTATION_STOPPED, onEnded);\n\n\treturn {\n\t\tgetId: () => OVERLAY,\n\t\tdestroy,\n\t};\n}\n\n\n","import { createOverlayPlugin, OVERLAY, overlay } from './AviaOverlayPlugin';\n\nexport type { AviaOverlayOptionsInterface } from './AviaOverlayOptionsInterface';\nexport * from './AviaOverlayPlugin';\n\n// UMD Aliases\nexport const ID = OVERLAY;\nexport const createPlugin = createOverlayPlugin;\nexport const plugin = overlay;","import React from 'react';\nimport { PlayerStates, iPlayer } from '../player/playerCtrl.type';\nimport { Autoplay, createVideoPlayer, PlayerEvent, TextTrackEvent, PlayerOptionsInterface } from \"@cbsinteractive/avia-js\";\nimport { LiveCtrlUtils } from './liveCtrl.util';\nimport { tOverlayFactory } from \"../player/overlayTemplate.type\";\nimport { OverlayFactory } from \"../player/overlayFactory\";\nimport * as queryString from \"query-string\";\nimport { AllocatorLive } from \"./track/allocatorLive\";\nimport { cueWatcher, getId3Wrapper, getTxxxGoogleAdData } from \"../../pkgAviaAllocator/id3/id3Processor\";\nimport { iID3, eCueType } from \"../../pkgAviaAllocator/id3/id3Processor.type\";\nimport { trackingServiceConfig } from \"../../pkgAviaAllocator/tracking.conf\";\nimport { allocatorLiveEventMapping } from \"./track/allocatorLive.type\";\nimport { PlayerCtrl } from \"..\";\nimport { getUserIp, UUID_v4 } from \"../../pkgAviaAllocator/util\";\nimport { iChannel, iChannels, iLiveCtrlProps, iLiveCtrlState } from \"./liveCtrl.type\";\nimport { OztamV2AviaLive } from \"./track/oztam.v2.aviaLive\";\nimport { iOzTamTrackingMeta_Media } from \"../../pkgAviaAllocator/oztam.v2.lib\";\nimport { iTrackingOztamConfig } from \"../../pkgAviaAllocator/tracking.conf.type\";\nimport { env } from \"../../pkgAviaAllocator/tracking.env\";\nimport { playlist, PLAYLIST } from '@cbsinteractive/avia-js-playlist';\nimport {getRecordedTime, initRecording} from \"./liveWatchedTime\";\nimport {AuthenticatedEndpointHandler} from '../api/api.bvod';\nimport { tenTrack } from '../../tenTrack/track.init';\nimport { deviceType } from '../player/util/device';\nimport {eLocalStorage_tenUser} from \"../../tenMember/jwt/enum\";\nimport { ApiVideo } from \"../api/api.video\";\nimport { IMSAPIIntegration, IMSResponse } from '../../tenAds/freeWheelManager';\nimport { iPlaybackInfoApiType } from '../api/api.video.type';\nimport { checkUserFlag, markAdOps } from '../../@util/userFlag';\n\nexport class LiveCtrl extends PlayerCtrl {\n readonly _noAds: boolean;\n\n protected _allocator: AllocatorLive;\n\n private _resources: any[] = [];\n private _id3Wrapper: iID3;\n private _initMockProgress: boolean = false;\n private _firstLoad: boolean = true;\n private _beginTimeStamp: number = undefined;\n private _storedEvents: any[] = [];\n private _oztamServiceConfig: iTrackingOztamConfig = undefined;\n private lastPausedTimestamp: number;\n private adEventData = {};\n private _playbackTime = 0;\n private _playBackInfo :iPlaybackInfoApiType;\n private _serverTimeOffset: number = 0;\n \n private updateInterval: ReturnType | null = null;\n \n private hasTimestamp: boolean = false;\n\n private offsetTime: number;\n private currentStreamTime: number = -1;\n \n private customEpochStartingStreamTime: number = -1;\n private customEpochStartingTimeCheckpoint: number = -1;\n private customEpochLastCueUpdateTimeCheckpoint: number = -1;\n private id3EventCuedataOffsetTime: number = 0;\n\n public playerContainerId: string;\n\n private bvodApiKey: string;\n private bvodPublisherName: string;\n private authHandler: AuthenticatedEndpointHandler;\n private imsAPI: IMSAPIIntegration;\n private freeWheelEnabled: boolean;\n private rolloutPercentage: number;\n private isFlagged: boolean;\n private globalSettings: { [key: string]: any };\n private globalFWEnable: boolean;\n \n private playerMuted: boolean;\n constructor(props) {\n super(props);\n\n const string = window.location.search.replace('?','');\n const qs = queryString.parse(string);\n this.markAdOperations();\n this._noAds = typeof qs.noads === 'string' && qs.noads.toLowerCase() === 'true';\n this.playerContainerId = props.containerId;\n this._oztamServiceConfig = this.setOztamConfig();\n this.bvodApiKey = '///adjust.bouncing.flame';\n this.bvodPublisherName = 'TEN';\n this.authHandler = new AuthenticatedEndpointHandler(this.bvodApiKey, this.bvodPublisherName);\n this.imsAPI = new IMSAPIIntegration('https://fms.viacomcbs.digital');\n this.globalSettings = props.globalSettings || {};\n this.globalFWEnable = this.globalSettings.experiments?.[\"Freewheel Enabled\"]?.enabled ?? false;\n this.rolloutPercentage = this.globalSettings.experiments?.[\"Freewheel Enabled\"]?.rolloutPercentage ?? 0;\n this.isFlagged = this.initializeUserFlag(this.rolloutPercentage);\n this.freeWheelEnabled = this.globalFWEnable && this.isFlagged;\n this.playerMuted = false;\n this.state = {\n playerState: PlayerStates.PreInitialize,\n overlay: undefined,\n isMemberGated: this.props.memberGated,\n liveChannels: this.props.liveChannels,\n consumerAdvice: \"\",\n displayOverlay: false,\n drmEnabled: false,\n }\n }\n\n async componentDidMount() {\n if (typeof window === 'undefined') return;\n this.setServerTimeOffset();\n LiveCtrlUtils.detectTouchDevice();\n this.addBeforeUnloadListener();\n if (document.readyState === 'complete') {\n await this._initPlayer();\n } else {\n window.addEventListener('load', this._initPlayer);\n }\n window.addEventListener('userLogin', this.handleUserLogin);\n }\n\n /**\n * Reset resource if google DAI key changes\n */\n componentDidUpdate(prevProps: iLiveCtrlProps) {\n const {mediaInfo} = this.props;\n \n if (prevProps.mediaInfo.customFields.google_dai_key !== mediaInfo.customFields.google_dai_key) {\n this._resetSession();\n this._resetResources();\n }\n }\n\n componentWillUnmount() {\n this.stopIntervals();\n window.removeEventListener('userLogin', this.handleUserLogin);\n }\n\n initializeUserFlag(percent: number): boolean {\n if (percent < 1) {\n return false;\n }\n try {\n return checkUserFlag(percent);\n } catch (error) {\n console.error('Failed to check user flag:', error);\n return false;\n }\n }\n\n markAdOperations() {\n try {\n markAdOps();\n } catch (error) {\n console.error('Failed to mark ad operations:', error);\n }\n }\n\n render() {\n return(\n <>\n {this.state.overlay &&
{this.state.overlay}
}\n
\n \n )\n }\n\n private initializeVariables = () => {\n this.resetVariables();\n this.offsetTime = this.calculateOffsetTimeInMs();\n this.hasTimestamp = false;\n this.currentStreamTime = this.customEpochLastCueUpdateTimeCheckpoint = -1;\n this.customEpochStartingStreamTime = this.customEpochStartingTimeCheckpoint = -1;\n this.id3EventCuedataOffsetTime = 0;\n }\n\n public resetVariables = () => {\n this.stopIntervals ();\n }\n\n private async _updatePlayerState(newPlayerState: PlayerStates) {\n this.setState({\n playerState: newPlayerState\n }, async () => {\n await this._updateOverlayState();\n });\n }\n\n private async _updateOverlayState() {\n const {playerState} = this.state;\n const {video, slateUrl} = this.props;\n const stateOverlayFactory: tOverlayFactory = OverlayFactory[playerState];\n let ui;\n\n if (typeof stateOverlayFactory === \"function\") {\n ui = await stateOverlayFactory(this.player, video, slateUrl)\n }\n this.setState({overlay: ui});\n }\n\n /*\n * Player initiation\n * */\n private _initPlayer = async () => {\n\n const playerShouldBeBlocked = await this._playerShouldBeBlocked();\n const {memberGated, loggedIn} = this.props;\n\n if(playerShouldBeBlocked === \"adBlock\") {\n await this._updatePlayerState(PlayerStates.AdBlockerOn);\n return;\n }\n if(playerShouldBeBlocked === \"geoBlock\") {\n await this._updatePlayerState(PlayerStates.GeoBlocked);\n return;\n }\n if(playerShouldBeBlocked === \"win7Block\") {\n await this._updatePlayerState(PlayerStates.DetectWindows7)\n return;\n }\n if(!loggedIn && memberGated) { \n this._logger.log && this._logger.log(\"Bypass create player\");\n }else {\n this.getConsumerAdvice();\n this._createPlayer();\n }\n }\n\n private async _createPlayer() {\n\n await this._createResources().then(async () => {\n const playerOptions: PlayerOptionsInterface = LiveCtrlUtils.createPlayerOptions({\n containerId: this.playerContainerId,\n autoplay: Autoplay.ATTEMPT_UNMUTED,\n video: this.props.video,\n globalSettings: this.props.globalSettings,\n consumerAdvice: this.state.consumerAdvice,\n displayOverlay: this.state.displayOverlay,\n })\n \n this._id3Wrapper = getId3Wrapper();\n this.resetAllocator();\n await createVideoPlayer(playerOptions).then((player) => {\n this.player = player;\n window.player = player;\n this.initializeVariables();\n this._onPlayerReady(player);\n initRecording(player);\n this._playResources();\n })\n })\n }\n\n private async _createResources() {\n const {mediaInfo, liveChannels, video} = this.props;\n video.displayOverlay = this.state.displayOverlay;\n this._resources = [];\n await this.setMediaInfo(mediaInfo, video);\n }\n\n private getLogoUrl (player: iPlayer) {\n const filteredLiveChannels = this.props.liveChannels.filter((subArray: any) => {\n return subArray.find((channel: any) => {\n return channel.channelUrl === this.props.relativeUrl\n })\n });\n if (filteredLiveChannels.length > 0 && filteredLiveChannels[0].length > 0) {\n const logoUrl = filteredLiveChannels[0][0].logo;\n player.logoUrl = logoUrl;\n } else {\n console.warn('No matching live channels found for logo URL.');\n }\n }\n\n private getConsumerAdvice() {\n const filteredLiveChannels = this.props.liveChannels.filter((subArray: any) => {\n return subArray.find((channel: any) => {\n return channel.channelUrl === this.props.relativeUrl;\n });\n });\n if (filteredLiveChannels.length > 0 && filteredLiveChannels[0].length > 0) {\n const { consumerAdvice, displayOverlay } = filteredLiveChannels[0][0];\n this.setState({ consumerAdvice, displayOverlay });\n } else {\n this.setState({ consumerAdvice: '', displayOverlay: false });\n }\n }\n\n private async _resetResources() {\n await this._createResources().then (() => {\n this._playResources();\n })\n }\n\n private async _updateResource() {\n await this._createResources()\n }\n\n private _playResources() {\n const playList = this.player.getPlugin(PLAYLIST);\n this.livePlayList = playList;\n this.livePlayList.clear();\n this._handleResources();\n }\n\n private async _handleResources(): Promise {\n const { slateTime, slateUrl } = this.props;\n \n if (!slateTime || !slateUrl) {\n this._startPlaylistWithResources(this._resources);\n return;\n }\n \n if (this._resources.length === 1) {\n await this._displaySlateAndExecute(slateTime, () => {\n this._clearSponsorLogo();\n this._startPlaylistWithResources([this._resources[0]]);\n });\n } else if (this._resources.length > 1) {\n this._startPlaylistWithResources([this._resources[0]]);\n this._handlePlaylistCompleteEvent(slateTime);\n }\n }\n \n private async _displaySlateAndExecute(slateTime: number, callback: Function): Promise {\n await this._updatePlayerState(PlayerStates.DisplaySlateImage);\n setTimeout(callback, slateTime * 1000);\n }\n \n private _clearSponsorLogo(): void {\n const container = document.querySelector('.liveVideoContainer') as HTMLElement;\n const childContainer = container?.querySelector('#sponsorLogo') as HTMLElement;\n if (childContainer) childContainer.remove();\n }\n \n private _startPlaylistWithResources(resources: any[]): void {\n this.livePlayList.clear();\n this.livePlayList.addResources(resources);\n this.livePlayList.start();\n }\n \n private _handlePlaylistCompleteEvent(slateTime: number): void {\n this.player.on(PlayerEvent.PLUGIN_EVENT, async (event) => {\n const { type } = event.detail;\n if (type === 'playlistcomplete') {\n await this._displaySlateAndExecute(slateTime, () => {\n this._clearSponsorLogo();\n this.livePlayList.addResources([this._resources[1]]);\n this.livePlayList.next();\n });\n }\n });\n }\n\n\n private _onPlayerReady = (player: any) => {\n this.getLogoUrl(player);\n for (const key in PlayerEvent) {\n player.on(PlayerEvent[key], (event: PlayerEvent) => {\n this._trackEvent(event);\n this._handleEvent(event);\n });\n }\n \n this.watcherClickedLink();\n }\n\n private addBeforeUnloadListener() {\n if (typeof window !== 'undefined') {\n window.addEventListener(\"beforeunload\", event => {\n const {mediaInfo} = this.props;\n this._allocator.track(allocatorLiveEventMapping['beforeunloadpage'], mediaInfo, this.player, {videoWatchedDuration: getRecordedTime()});\n setTimeout(() => {\n this.player.stop();\n }, 0);\n });\n } \n }\n\n private async addWatcherToLink() {\n if(window !== undefined) {\n return new Promise((resolve, reject) => {\n const links = document.querySelectorAll('a');\n const selectedLinks = Array.from(links).filter((link) => {\n const href = link.getAttribute('href');\n const target = link.getAttribute('target');\n return href !== null && target !== '_blank';\n });\n selectedLinks.forEach(link => {\n const lnk = link.addEventListener('click', (event) =>{\n const {defaultPrevented} = event;\n if (!defaultPrevented) {\n const {mediaInfo} = this.props;\n const recordedTime = getRecordedTime();\n const extra = {'videoWatchedDuration': recordedTime};\n this._allocator.track(allocatorLiveEventMapping['beforeunloadpage'], mediaInfo, this.player, extra);\n this._allocator && this._allocator.resetTrackingService();\n }\n ({ success }) => resolve(lnk)\n });\n });\n })\n \n }\n \n }\n\n private async watcherClickedLink() {\n await this.addWatcherToLink();\n }\n\n public async getLiveFields() {\n const userId = localStorage.getItem(eLocalStorage_tenUser.tu_oztamid);\n const timestamp = new Date();\n const metadata = PlayerCtrl.convertToVideoTrackObj(this.props.video, this.props.mediaInfo, this._oztamServiceConfig.sessionId);\n let ipAddress = '';\n try {\n ipAddress = await getUserIp() as string;\n } catch (err) {\n console.error(`🔍️~ Error fetching IP: ${err}`);\n }\n\n const genreFilter = () => {\n if (metadata.video.ShowGenre === \"N/A\") {\n return '';\n } else {\n return metadata.video.ShowGenre\n }\n }\n\n const userAgent = typeof window !== 'undefined' ? window.navigator.userAgent : '';\n const livePayload = {\n AdEventId: '' || null,\n DeviceId: tenTrack.deviceId || '',\n DeviceType: deviceType || '',\n Genre: genreFilter(),\n IpAddress: ipAddress,\n MediaId: metadata.publisher_id || '',\n MediaType: 'live' || '',\n PublisherId: metadata.publisher_id || '',\n PublisherName: 'TEN',\n RegistrationId: userId || '', \n SessionId: this._oztamServiceConfig.sessionId || '',\n TimeStamp: timestamp.toISOString() || '', \n UserAgent: userAgent || null, \n VendorVersion: this._oztamServiceConfig.vendorVersion || '',\n };\n return livePayload;\n }\n\n // BVOD - START\n\n private handleLIVEData = async () => {\n const {loggedIn} = this.props;\n if(!loggedIn) return []; \n try {\n const data = await this.getLiveFields();\n const response = await this.authHandler.postAuthenticatedData('/auth', data);\n const { data: responseData } = response;\n const BvodArray = this.authHandler.mapBvodDataToOztamParams(responseData); //\n return BvodArray;\n } catch (error) {\n console.error(\"🔍️~ Error handling VOD data: \", error);\n }\n };\n\n // BVOD - END\n \n\n private async setMediaInfo(mediaInfo, video) {\n let bvodData = [];\n let imsData = null;\n const { relativeUrl, activeChannels, isLivePrerollDisabled } = this.props;\n\n try {\n bvodData = await this.handleLIVEData();\n } catch (error) {\n console.error(\"🔍️~ Error fetching BVOD data:\", error);\n }\n\n const matchingChannels = activeChannels.flatMap(channels =>\n channels.filter(channel => channel.channelUrl === relativeUrl)\n );\n\n const isChannelPreRollDisabled = matchingChannels.some(channel => channel.isPreRollDisabled);\n\n const { id } = mediaInfo;\n try {\n this._playBackInfo = await ApiVideo.getPlaybackInfo(\n id, \n this.freeWheelEnabled, true\n );\n } catch (error) {\n console.error(\"Error fetching playback info:\", error);\n }\n\n try {\n const prerollDisabled = !!isLivePrerollDisabled || !!this._noAds || !!isChannelPreRollDisabled;\n let imsData = null;\n const prerollSource = prerollDisabled ? null : LiveCtrlUtils.createPrerollResource(mediaInfo, this._oztamServiceConfig.sessionId, bvodData, imsData);\n if (this.freeWheelEnabled) {\n try {\n imsData = await this.fetchIMSDataAndLog();\n if (imsData) {\n console.log('🔍️~ FreeWheel parameters fetched successfully:', imsData);\n } else {\n console.warn('🔍️~ FreeWheel parameters are empty.');\n }\n } catch (error) {\n console.error('🔍️~ Error fetching FreeWheel parameters:', error);\n }\n }\n const contentSource = LiveCtrlUtils.createLiveStreamResource(mediaInfo, this._oztamServiceConfig.sessionId, bvodData, video, imsData, this._playBackInfo, this.freeWheelEnabled, this.playerMuted);\n if (prerollSource) {\n this._resources.push(prerollSource);\n }\n if (contentSource) {\n this._resources.push(contentSource);\n }\n } catch (error) {\n console.error(\"🔍️~ Error setting media info:\", error);\n }\n }\n\n\n protected _addCueListener() {\n cueWatcher(this.player, this._logger.log, (cueObject) => {\n const googleAdData = getTxxxGoogleAdData(cueObject);\n let cueData;\n if (googleAdData) {\n // Google dai ad cue data\n // this._logger.log && this._logger.log(\"received cue for ads\", cueObject);\n if (!this.hasTimestamp && this.customEpochLastCueUpdateTimeCheckpoint === -1) {\n this.setCustomEpochStartingTimes();\n }\n } else {\n // Shows cue data\n // this._logger.log && this._logger.log(\"received cue for shows\", cueObject);\n cueData = this.getCueDataFromId3Event(cueObject);\n if (cueData == null || !this.canBeParsedAsDate(cueData)) {\n if (!env.isProduction()) { console.warn(\"🔍️~ cannot parse epoch data from id3 event\", cueObject) }\n return;\n }\n \n if (!this.hasTimestamp) {\n this.hasTimestamp = true;\n let cueDataTime = new Date(cueData).getTime();\n if (this.customEpochLastCueUpdateTimeCheckpoint > 0) {\n this.id3EventCuedataOffsetTime = (this.customEpochLastCueUpdateTimeCheckpoint - cueDataTime) + (this.getCurrentTime() - this.customEpochLastCueUpdateTimeCheckpoint);\n }\n cueDataTime += this.id3EventCuedataOffsetTime;\n const cueDataTimeWithOffset = (new Date(cueDataTime)).getTime();\n const dateTimeDifference = this.getCurrentTime() - cueDataTimeWithOffset;\n const maxTime = 3 * 60 * 1000; // max id3 epoch offset is 3 mins away from current time\n if (Math.abs(dateTimeDifference) > maxTime) {\n this.id3EventCuedataOffsetTime += (dateTimeDifference - this.calculateOffsetTimeInMs());\n }\n }\n \n cueData = new Date(((new Date(cueData)).getTime() + this.id3EventCuedataOffsetTime)).toISOString();\n this._id3Wrapper.update(cueObject.key, cueData);\n }\n });\n }\n\n protected getCueDataFromId3Event(cueObject): any {\n let cueData;\n if (!cueObject) { return null; }\n const cueObjectDataAdjusted = typeof cueObject.data === 'string' ? cueObject.data.toUpperCase() : cueObject.data;\n const cueObjectInfoAdjusted = typeof cueObject.info === 'string' ? cueObject.info.toUpperCase() : cueObject.info;\n switch (cueObject.key) {\n case eCueType.TXXX: {\n if (!isNaN(Date.parse(cueObjectDataAdjusted))) {\n cueData = cueObject.data;\n } else if (!isNaN(Date.parse(cueObjectInfoAdjusted))) {\n cueData = cueObject.info;\n } else {\n try {\n cueData = JSON.parse(cueObject.data);\n } catch (error) {\n if (!env.isProduction()) { console.warn(error) }\n return;\n }\n }\n break;\n }\n case eCueType.TDRL: {\n if (!isNaN(Date.parse(cueObjectDataAdjusted))) {\n cueData = cueObject.data;\n } else if (!isNaN(Date.parse(cueObjectInfoAdjusted))) {\n cueData = cueObject.info;\n }\n break;\n }\n case eCueType.PRIV: {\n cueData = cueObject.data;\n if (cueObject.data instanceof ArrayBuffer) {\n cueData = String.fromCharCode.apply(null, new Uint8Array(cueObject.data));\n } else if (cueObject.info instanceof ArrayBuffer) {\n cueData = String.fromCharCode.apply(null, new Uint8Array(cueObject.info));\n }\n break;\n }\n }\n cueData = typeof cueData === 'string' ? cueData.replace(/z$/, \"Z\") : cueData;\n return cueData;\n }\n\n public reset() {\n this._resetId3();\n this.resetAllocator();\n };\n\n private _resetId3() {\n if (this._id3Wrapper) {\n this._id3Wrapper.source = undefined;\n this._id3Wrapper.latest = undefined;\n this._id3Wrapper.pauseDurationBeforeNewId3 = 0;\n this._id3Wrapper.pauseDurationBeforeNewId3_nielsen = 0;\n }\n }\n\n protected setOztamConfig() {\n let config;\n\n if(env.isProduction()){\n config = trackingServiceConfig.oztam.config.production;\n } else {\n config = trackingServiceConfig.oztam.config.staging;\n }\n config.sessionId = UUID_v4();\n return config;\n }\n\n protected resetAllocator() {\n if(this._allocator) {\n this._allocator.resetTrackingService();\n }\n this._allocator = new AllocatorLive();\n this._allocator.updateExtraInfo({id3: this._id3Wrapper});\n }\n\n protected _resetSession() {\n this.setOztamConfig();\n this._firstLoad = true;\n this._beginTimeStamp = undefined;\n this._initMockProgress = false;\n this._storedEvents = [];\n this._oztamServiceConfig.sessionId = UUID_v4();\n this.reset();\n }\n\n public _checkId3() {\n return !!this._id3Wrapper && !!this._id3Wrapper.latest;\n }\n\n protected convertToVideoTrackObj(mediaInfo, video) { \n const mediaInfoNew = PlayerCtrl.convertToVideoTrackObj(mediaInfo, video, this._oztamServiceConfig.sessionId);\n mediaInfoNew.publisher_id = mediaInfo.customFields.publisherid;\n \n const newCustomFields = {\n clip_title: mediaInfo.customFields.clip_title,\n episode_name: \"\",\n tv_channel: mediaInfo.customFields.tv_channel,\n video_type_long_form: \"Live\",\n show_title: video.title,\n };\n\n Object.assign(mediaInfoNew.custom_fields, newCustomFields);\n \n return mediaInfoNew;\n };\n\n protected mockOztamProgress(mediaInfo?) {\n const currentTimestamp = Math.round(new Date().getTime() / 1000);\n const delayDuration = currentTimestamp - this._beginTimeStamp;\n const fullProgressEvents = Math.floor(delayDuration / 60);\n const partialProgressDuration = delayDuration % 60;\n const timeToFullProgress = (60 - partialProgressDuration) * 1000;\n\n if(mediaInfo) {\n this._initMockProgress = true;\n\n if(delayDuration <= 2) {\n this._allocator.track(allocatorLiveEventMapping['initialiseProgressInterval'], mediaInfo, this.player);\n return;\n }\n\n const latestEpochTime = parseInt(this._id3Wrapper.latest.EpochTime);\n const epochStartTime = latestEpochTime - delayDuration;\n const timeOffset = Math.round(this._id3Wrapper.latest.LocalTime / 1000 - latestEpochTime);\n\n // Send stored progress events first\n if(this._storedEvents.length > 0) {\n const mockedPartialProgressEvents = this.offsetTimestamps(timeOffset);\n this.postProgressEvents(mockedPartialProgressEvents, mediaInfo);\n }\n\n const mockedProgressEvents = this.mockProgressData(fullProgressEvents, epochStartTime, false);\n this.postProgressEvents(mockedProgressEvents, mediaInfo);\n\n setTimeout(() => {\n const mockedProgressEvent = this.mockProgressData(fullProgressEvents, epochStartTime, true);\n this.postProgressEvents(mockedProgressEvent, mediaInfo);\n \n // Initialise regular progress interval via allocator\n this._allocator.track(allocatorLiveEventMapping['initialiseProgressInterval'], mediaInfo, this.player);\n }, timeToFullProgress);\n\n return;\n }\n // Store events if data is not avaliable\n this.storeEvents(fullProgressEvents, partialProgressDuration, currentTimestamp)\n }\n\n protected storeEvents(fullProgress, partialDuration, currentTime) {\n for(let i = 0; i < fullProgress; i++) {\n const fromSeconds = this._beginTimeStamp + i * 60;\n this._storedEvents.push({from: fromSeconds, to: fromSeconds + 60});\n }\n if(partialDuration > 0) {\n const fromSeconds = currentTime - partialDuration;\n this._storedEvents.push({from: fromSeconds, to: currentTime});\n }\n }\n\n protected offsetTimestamps(offset) {\n const eventArray = [];\n this._storedEvents.forEach((event) => {\n const eventObj = this.setEventFields(event.from - offset, event.to - offset);\n eventArray.push(eventObj);\n })\n\n return eventArray;\n }\n\n protected mockProgressData(numFullEvents, epochStartTime, isPartial) {\n const eventArray = [];\n if(isPartial) {\n const eventStartEpoch = epochStartTime + numFullEvents * 60;\n const dataFields = this.setEventFields(eventStartEpoch, eventStartEpoch + 60);\n eventArray.push(dataFields);\n return eventArray;\n }\n\n for(let i = 0; i < numFullEvents; i++) {\n const eventStartEpoch = epochStartTime + i * 60;\n const dataFields = this.setEventFields(eventStartEpoch, eventStartEpoch + 60);\n eventArray.push(dataFields); \n }\n return eventArray;\n }\n\n protected setEventFields(from, to) {\n return {\n fromPosition: from,\n toPosition: to,\n timestamp: new Date(),\n event: \"PROGRESS\",\n }\n }\n\n protected postProgressEvents(mockedProgressEvents, mediaInfo) {\n mockedProgressEvents.forEach((event) => {\n const media = this.mapMediaInfo(mediaInfo, event);\n const updatedOztamConfig = Object.assign(this._oztamServiceConfig, {publisherId: mediaInfo.publisher_id})\n const trackingFields = (this._allocator.oztam as OztamV2AviaLive)._oztamService.getFields(event, media, updatedOztamConfig);\n this.progressFetch(trackingFields);\n });\n }\n\n protected mapMediaInfo(data, event): iOzTamTrackingMeta_Media {\n return {\n mediaDuration: 0,\n mediaId: data.publisher_id,\n mediaType: \"live\",\n url: window.location.href,\n genre: data.video.showGenre || \"\",\n }\n }\n\n protected progressFetch(trackingFields) {\n let that = this;\n fetch(that._oztamServiceConfig.serverTarget, \n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(trackingFields)\n }\n )\n }\n\n protected _trackEvent(event) {\n const {mediaInfo, video} = this.props;\n const eType = event.type\n const allocatorEvent = allocatorLiveEventMapping[eType];\n\n if (allocatorEvent === undefined) {\n return\n }\n\n const container = document.querySelector(`#${this.playerContainerId}`) as HTMLElement;\n\n if (!container) {\n return\n }\n\n const generateAdData = (event) => {\n if(event.type === PlayerEvent.AD_START) {\n const {adDuration, adTitle, adPosition, adObject} = event.detail.adInfo;\n const ads = {\n adType: adObject?.podInfo?.data?.type === \"mid\" ? \"video_midroll\" : \"video_preroll\",\n adDuration: adDuration,\n adTitle: adTitle, \n adIndex: adObject?.j?.adPodInfo?.adPosition || adObject?.data?.position || adPosition, \n }\n this.adEventData = ads;\n }\n if(event.type === PlayerEvent.AD_START || event.type === PlayerEvent.AD_COMPLETE) {\n return this.adEventData;\n }\n }\n\n const videoElement = container.querySelector('video') as HTMLElement;\n video.memberGated = this.props.memberGated;\n \n const allocatorVideoObj = this.convertToVideoTrackObj(mediaInfo, video);\n this.player.currentTime = () => { return this.player.video.currentTime }\n\n switch(eType) {\n case PlayerEvent.RESOURCE_START: \n this._addCueListener(); \n if(!this._firstLoad) {\n return;\n }\n this._firstLoad = false;\n break;\n case PlayerEvent.CONTENT_START:\n this._beginTimeStamp = Math.round(new Date().getTime() / 1000);\n this.beginUpdateInterval();\n break;\n case PlayerEvent.CONTENT_PROGRESS:\n case PlayerEvent.CONTENT_PLAYING:\n if(this._checkId3()) {\n if(!this._initMockProgress) {\n this.mockOztamProgress(allocatorVideoObj);\n }\n break;\n } else {\n return;\n }\n case PlayerEvent.CONTENT_PAUSED:\n this.lastPausedTimestamp = Date.now();\n this.player.stop();\n break\n case PlayerEvent.PLUGIN_EVENT:\n if (event.detail.type === \"play\"){\n const timeToReset = Math.floor((Date.now() - this.lastPausedTimestamp) / 1000);\n if(timeToReset > 600) {\n window && window.location.reload();\n }\n }\n break;\n case PlayerEvent.AD_PAUSED: \n if(this._checkId3()) {\n break;\n }\n // Stop the interval and store partial progress\n this.mockOztamProgress();\n return;\n case PlayerEvent.AD_PLAYING:\n if(this._checkId3()) {\n break;\n }\n // Reset the begin time for calculating progress\n this._beginTimeStamp = Math.round(new Date().getTime() / 1000);\n return;\n case PlayerEvent.LIVE_PRESENTATION_STOPPED:\n\n this._allocator.track(allocatorEvent, allocatorVideoObj, this.player);\n this._resetSession();\n this.playerMuted = this.player.muted\n return;\n default:\n break;\n }\n\n this._allocator.track(allocatorEvent, allocatorVideoObj, this.player, generateAdData(event));\n };\n\n protected _handleEvent(event) {\n const {muted} = event.detail\n const eType = event.type;\n if(eType === PlayerEvent.PLUGIN_EVENT) { \n if(event.detail.type === \"playoverlay\") {\n this._resetResources();\n }\n }\n if(eType === PlayerEvent.MUTE_CHANGE) {\n this.playerMuted = muted;\n }\n }\n\n // Starts the update interval\n private beginUpdateInterval = (): void => {\n // If the update interval is already running, we don't need to start it again.\n if (this.updateInterval !== null) {\n return;\n }\n\n const minimumTimeBeforeFirstCustomCueInSeconds: number = 12;\n \n //TODO: replace this check with content time/buffering/seek/buffer error timestamp event system, does not function as intended but not needed, stream time will always increase irrespective of content time\n this.currentStreamTime = this.getPlayerCurrentTime();\n\n this.updateInterval = setInterval(() => {\n // If we already have a timestamp, stop the intervals.\n if (this.hasTimestamp) {\n this.stopIntervals();\n return;\n }\n\n const currentTime = this.getPlayerCurrentTime();\n\n // Set start checkpoints to check if we have passed the minimum time before we process the first custom cue\n if (this.customEpochStartingTimeCheckpoint === -1) {\n // Live streams will seek to an initial position (eg. 90) soon after starting, delay setting start checkpoints until initial seek has probably happened\n if (Math.floor(currentTime) > 4) {\n this.setCustomEpochStartingTimes();\n }\n return;\n }\n\n // Returns if stream time or time since stream has started has not passed the minimum time before we process the first custom cue\n if (\n this.customEpochLastCueUpdateTimeCheckpoint === -1\n && (currentTime < (this.customEpochStartingStreamTime + minimumTimeBeforeFirstCustomCueInSeconds) || (this.getCurrentTime() - this.customEpochStartingTimeCheckpoint) < minimumTimeBeforeFirstCustomCueInSeconds * 1000)\n ) {\n return;\n }\n \n // If the current time is valid and greater than the last known stream time, update the cue.\n if (\n !isNaN(currentTime) \n && currentTime > this.currentStreamTime\n ) {\n this.updateCue();\n }\n\n // Update the current stream time.\n this.currentStreamTime = currentTime;\n }, 5000);\n };\n\n private setCustomEpochStartingTimes = () => {\n this.customEpochStartingTimeCheckpoint = this.getCurrentTime();\n this.customEpochStartingStreamTime = Math.floor(this.getPlayerCurrentTime());\n }\n\n // Updates cue\n private updateCue = () => {\n this.customEpochLastCueUpdateTimeCheckpoint = this.getCurrentTime() - this.offsetTime;\n this._id3Wrapper.update(eCueType.TDRL, new Date(this.customEpochLastCueUpdateTimeCheckpoint).toISOString());\n }\n \n // Stops all intervals and clears their references\n private stopIntervals = () => {\n if (this.updateInterval !== null) {\n clearInterval(this.updateInterval);\n this.updateInterval = null;\n }\n }\n\n // Gets the current stream time\n private getPlayerCurrentTime = (): number => {\n return this.player.video?.currentTime ?? -1;\n }\n\n // Gets a random offset time between 20-45 seconds by default\n private calculateOffsetTimeInMs = (min = 20, max = 45): number => {\n return max > min ? (Math.floor(Math.random() * (max - min + 1)) + min) * 1000 : 0;\n }\n\n private canBeParsedAsDate = (val: any): boolean => {\n return typeof val === 'number' || (typeof val === 'string' && !isNaN(Date.parse(val)));\n }\n\n private setServerTimeOffset = () => {\n const fetchUrl = \"/timestamp\";\n fetch(fetchUrl.toLowerCase())\n .then(res => res.json())\n .then(data => { \n this._serverTimeOffset = data?.timestamp > 0 ? Date.now() - (data.timestamp * 1000) : 0;\n })\n .catch((err) => { \n this._serverTimeOffset = 0;\n })\n }\n\n private getCurrentTime = () => {\n return Date.now() - this._serverTimeOffset;\n }\n\n private async fetchIMSDataAndLog(): Promise {\n // COPPA flag 1 indicates child-directed content that follows COPPA ad standards\n // 0 indicates adult-directed content\n const coppaFlag = this.props.video.genre?.toLowerCase() === 'kids' ? 1 : 0;\n\n const data = {\n userIp: await getUserIp(),\n coppa: coppaFlag\n };\n\n try {\n // This will automatically handle COPPA status updates and cache invalidation\n const response = await this.imsAPI.getIMSData(data);\n if (response) {\n this.imsAPI.logFreewheelDebug('IMS Data:', response);\n return response;\n }\n return null;\n } catch (error) {\n console.error('Error fetching IMS data:', error);\n return null;\n }\n }\n\n private handleUserLogin = async (event) => {\n this.imsAPI.invalidateCache();\n this.imsAPI.logFreewheelDebug('Received userLogin event:', event);\n }\n}","import { createResourceConfig, PlayerOptionsInterface, VideoFormat, ResourceAdInterface, Autoplay } from \"@cbsinteractive/avia-js\";\nimport { formatIMAServerUrl } from \"../player/util/imaUtil\";\nimport { iVideoAdConfig, iVideoAdRequestParams } from \"../player/util/imaUtil.type\";\nimport { jwtMember} from \"../player/jwt/cacheStatus\";\nimport { eLocalStorage_tenUser_info } from \"../player/jwt/enum\";\nimport { iCreatePlayerConfig } from \"./liveCtrl.type\";\nimport { isCompanionAds } from \"../player/util/isShow\";\nimport { isDesktop } from \"../player/util/env.util\";\nimport { playlist } from '@cbsinteractive/avia-js-playlist';\nimport { replay } from '@cbsinteractive/avia-js-replay';\nimport { overlay } from './Plugins/Overlay';\nimport { logoOverlay } from './Plugins/LogoDisplay';\nimport { gam } from '@cbsinteractive/avia-js-gam';\nimport { hls } from '@cbsinteractive/avia-js-hls';\nimport { ui } from '@cbsinteractive/avia-js-ui';\nimport { consumeradvice } from '../commonPlugins/ConsumerAdvice/AviaConsumerAdvice';\nimport { ApiVideo } from \"../api/api.video\";\nimport { IMSResponse } from '../../tenAds/freeWheelManager';\nimport { iPlaybackInfoApiType } from \"../api/api.video.type\";\nimport { generateGoogleAdTagParams } from '../player/player.utls';\nimport { iBVodData } from '../player/player.util.type';\n\n\nexport namespace LiveCtrlUtils {\n\n export const createPlayerOptions = (props: iCreatePlayerConfig) => {\n const {autoplay, containerId, video, globalSettings, consumerAdvice, displayOverlay} = props;\n const { programClassification, showRatingClassification} = props.video;\n const classification = programClassification ? programClassification?.toUpperCase() : showRatingClassification?.toUpperCase();\n const consumerAdviceOptions = {\n duration: globalSettings?.playbackSettings?.consumerAdviceDisplayTime || 5,\n consumerAdvice: video?.consumerAdvice || consumerAdvice,\n classification,\n isLive: true,\n displayOverlay: displayOverlay,\n };\n let poster = video?.poster;\n if (typeof poster === \"string\" && poster.indexOf(\"image-profile\") > 0) {\n poster = poster.replace(\n \"image-profile=image_poster&io=portrait\",\n \"image-profile=image_full&io=landscape\",\n );\n }\n const theme = {\n html: `\n \n
\n \n
\n \n \n ${isDesktop ? '' : ''}\n
\n
\n \n ${isDesktop ? '' : ''}\n ${isDesktop ? '' : ''}\n \n
\n
\n
\n
\n `,\n };\n return {\n container: document.getElementById(containerId) as HTMLElement,\n autoplay,\n renderTextTrackNatively: true,\n useNativeFullscreen: true,\n enableMoat: false,\n overrides: {\n liveStreamPausable: false,\n },\n //logLevel: \"debug\", \n plugins: [\n ui({\n compactViewBreakpoint: 1,\n theme,\n }),\n hls(),\n gam(),\n playlist(),\n overlay(),\n logoOverlay({debug: false}),\n consumeradvice({\n consumerAdviceOptions\n }),\n ], \n } as PlayerOptionsInterface;\n }\n\n export const createPrerollResource = (mediaInfo, oztamSessionId, bvodData, imsData: IMSResponse) => {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const prerollResource = createResourceConfig();\n const videoAdConfig = setVideoAdConfig(oztamSessionId, imsData);\n const imaAdCallUrl = formatIMAServerUrl(mediaInfo.id, videoAdConfig, bvodData);\n const loadVideoWait = 12000;\n\n prerollResource.ad = {\n showPrerollOnNonZeroStart: true,\n csai: {\n adCallUrl: imaAdCallUrl,\n loadVideoTimeoutMs: loadVideoWait,\n preloadContentAtEndOfPreRoll: false,\n enableAdPreloading: true,\n },\n } as ResourceAdInterface;\n\n return prerollResource;\n }\n export const createLiveStreamResource = (mediaInfo, oztamSessionId, bvodData, video, fwParameters: IMSResponse, playBackInfo: iPlaybackInfoApiType, freeWheelEnabled: boolean, playerMuted:boolean) => {\n const daiAuthToken = playBackInfo.daiAuthToken;\n const liveStreamResource = createResourceConfig();\n const videoAdConfig = setVideoAdConfig(oztamSessionId, fwParameters);\n const { account, id, device, site, cmsID, requestParams, customParams } = videoAdConfig;\n\n if (Array.isArray(bvodData) && bvodData.length > 0) {\n customParams.push(...bvodData);\n }\n \n let fwParamsToSpread = {};\n if (freeWheelEnabled) {\n const csidPrefix = 'intllocal_tenplay_au';\n const platform = isDesktop ? 'desktop_web' : 'mobile_web';\n const FW_SITE_SECTION_ID = playBackInfo?.fw?.fwSiteSectionId || '';\n const imafw_csid = `${csidPrefix}_${platform}_live${FW_SITE_SECTION_ID ? `_${FW_SITE_SECTION_ID}` : ''}`;\n if (!csidPrefix || !platform) {\n TrackJS.track({\n message: '🔍️ ~ csidPrefix or platform is not defined',\n csidPrefix,\n platform\n });\n }\n if (!imafw_csid) {\n TrackJS.track({\n message: '🔍️ ~ Missing imafw_csid',\n csidPrefix,\n platform\n });\n return liveStreamResource;\n }\n\n const adParams = {\n gr: jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_gr],\n ge: jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_ge],\n state: localStorage.getItem(\"tu_geo\") || '',\n collection: Array.isArray((window as any).utag_data.videoContentCategories) ? (window as any).utag_data.videoContentCategories : [],\n genre: Array.isArray((window as any).utag_data.showGenres) ? (window as any).utag_data.showGenres : [],\n pcode: jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_memberPostcode],\n session: oztamSessionId,\n sub: jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_n10adId],\n tvid: localStorage.getItem(\"tvid_callback\"),\n oztamozsid: oztamSessionId,\n };\n\n const additionalParams = {\n video,\n plabackInfo: playBackInfo,\n miscData: {\n imafw_csid: imafw_csid,\n imafw_mode: 'live',\n },\n };\n\n const transformedData: iBVodData[] = bvodData.map(([Demo, BvodId], index) => ({\n Demo,\n BvodId,\n }));\n\n const freeWheelParams = generateGoogleAdTagParams(transformedData, { enableFreeWheel: freeWheelEnabled }, mediaInfo?.id || \"\", playBackInfo?.dai?.contentSourceId || \"\", fwParameters?.fms_params, adParams, additionalParams);\n fwParamsToSpread = Object.keys(freeWheelParams).reduce((object, key) => {\n if (freeWheelParams[key] != null) {\n object[key] = freeWheelParams[key];\n }\n return object;\n }, {});\n\n }\n\n liveStreamResource.ad = {\n ssai: {\n assetKey: playBackInfo?.dai?.assetKey || \"\",\n isLive: true,\n format: VideoFormat.HLS,\n ...(freeWheelEnabled && {\n authToken: daiAuthToken,\n }),\n adParameters: {\n iu: `/${account}/${id}/${device}/${site}`,\n cmsid: cmsID,\n ...(!freeWheelEnabled && {\n cust_params: generateCustomParams(customParams)\n }),\n ppid: generateRequestParams(requestParams).ppid || null,\n ...(fwParamsToSpread && Object.keys(fwParamsToSpread).length > 0 ? fwParamsToSpread : {}),\n vpmute: playerMuted ? 1 : 0,\n },\n },\n viewabilityTracking: {\n partner: 'ten',\n viewGuid: 'string',\n pageType: 'string'\n },\n } as ResourceAdInterface;\n return liveStreamResource;\n }\n\n const generateCustomParams = (customParams) => {\n if (Array.isArray(customParams) && customParams.length > 0) {\n let appendingCustomParams = customParams.map(kv => {\n if (typeof kv[0] !== \"string\" || typeof kv[1] !== \"string\" || [undefined, null, \"\", []].includes(kv[1])) {\n return \"\";\n }\n return `${kv[0]}=${kv[1]}`;\n }).filter(kv => {\n return kv !== \"\";\n });\n return appendingCustomParams.join('&');\n }\n }\n\n const generateRequestParams = (requestParams) => {\n let reqParams = {} as iVideoAdRequestParams;\n if (Array.isArray(requestParams)) {\n requestParams.forEach((kv) => {\n if (\n Array.isArray(kv) &&\n kv.length === 2 &&\n kv[0] !== \"\" &&\n kv[1] !== \"\"\n ) {\n reqParams[kv[0]] = kv[1];\n }\n });\n }\n return reqParams;\n };\n\n const setVideoAdConfig = (oztamSessionId, fwParameters: IMSResponse) => {\n const utag_data = (window as any).utag_data;\n const retrievedLocalStorageState = localStorage.getItem(\"tu_geo\") || '';\n const tvid_callback = localStorage.getItem(\"tvid_callback\");\n\n return {\n companionAds: {\n enabled: isCompanionAds(),\n adSizes: [[300, 250], [728, 90], [4, 1]],\n },\n\n account: \"8264\", // todo we do not have access to staging video ad account\n id: \"vau-ten\",\n device: isDesktop ? \"desktop\" : \"mobile_web\",\n site: \"tenplay\",\n cmsID: \"2489270\",\n\n customParams: [\n [\"gr\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_gr]],\n [\"ge\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_ge]],\n [\"state\", retrievedLocalStorageState],\n [\"collection\", Array.isArray(utag_data.videoContentCategories) ? utag_data.videoContentCategories : []],\n [\"genre\", Array.isArray(utag_data.showGenres) ? utag_data.showGenres : []],\n [\"pcode\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_memberPostcode]],\n [\"sub\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_n10adId]],\n [\"session\", oztamSessionId],\n [\"tvid\", tvid_callback],\n [\"oztamozsid\", oztamSessionId]\n ],\n requestParams: [\n [\"ppid\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_n10adId]],\n ]\n } as iVideoAdConfig;\n }\n\n export const detectTouchDevice = () => {\n if (typeof window !== \"undefined\" && window.hasOwnProperty('ontouchstart')) {\n const root = document.getElementsByTagName('html');\n root[0].classList.add('is-touch');\n }\n }\n}","import { PlayerEvent } from \"@cbsinteractive/avia-js\";\nimport { env } from \"../../ten/conf.env\";\n\nlet beginTimeStamp: number | undefined;\nlet elapsedWatchTime: number = 0;\nlet isPaused: boolean = false;\nlet intervalId: NodeJS.Timeout | undefined;\nlet metadataCuePointTimeout: NodeJS.Timeout | undefined;\nlet debug: boolean = false;\n\nif (typeof window !== 'undefined') {\n const url = new URL(window.location.href);\n\tdebug = url.searchParams.get('debug') === 'timer';\n}\n\nconst messageColors = {\n 'Recording': 'yellow',\n 'Pause recording': 'white',\n 'Resume recording': 'green',\n 'Recording stopped': 'red',\n // Add more mappings as needed\n};\n\nconst logger = (message: string, debug: boolean) => {\n if (debug && !env.isProduction()) {\n const color = messageColors[message.split(':')[0]] || 'black'; // Default to black if no mapping found\n console.log(`%c👁️ ~ ${message}`, `color: ${color}; font-weight: bold;`);\n }\n};\n\nconst initRecording = (player: any): void => {\n player.on(PlayerEvent.CONTENT_START, () => {\n const currentTimeStamp = Date.now();\n if (!beginTimeStamp) {\n beginTimeStamp = currentTimeStamp;\n intervalId = setInterval(() => {\n if (!isPaused) {\n elapsedWatchTime += 1000;\n logger(`Recording: ${elapsedWatchTime / 1000} seconds`, debug);\n }\n }, 1000);\n }\n });\n\n player.on('metadatacuepoint', () => {\n if (!isPaused) {\n logger('Pause recording', debug);\n isPaused = true;\n }\n\n if (metadataCuePointTimeout) {\n clearTimeout(metadataCuePointTimeout);\n }\n\n metadataCuePointTimeout = setTimeout(() => {\n logger('Resume recording', debug);\n isPaused = false;\n }, 1000);\n });\n\n player.on(PlayerEvent.LIVE_PRESENTATION_STOPPED, () => {\n beginTimeStamp = undefined;\n elapsedWatchTime = 0;\n\n if (intervalId) {\n clearInterval(intervalId);\n }\n\n if (metadataCuePointTimeout) {\n clearTimeout(metadataCuePointTimeout);\n }\n\n logger('Recording stopped', debug);\n });\n};\n\nconst getRecordedTime = (): number => {\n return roundSecondsToNearestMinute(elapsedWatchTime / 1000);\n};\n\nconst roundSecondsToNearestMinute = (totalSeconds: number): number => {\n const totalMinutes = Math.floor(totalSeconds / 60);\n const remainingSeconds = totalSeconds % 60;\n const roundedMinutes = remainingSeconds >= 30 ? totalMinutes + 1 : totalMinutes;\n return roundedMinutes;\n};\n\nexport { initRecording, getRecordedTime };","import { iTrackingService } from \"../../../pkgAviaAllocator/tracking.conf.type\"\nimport { trackingServiceConfig } from \"../../../pkgAviaAllocator/tracking.conf\";\nimport { eLocalStorage_tenUser } from \"../../../tenMember/jwt/enum\";\nimport { initTealium, initOztam } from \"../../../pkgAviaAllocator/tracking.init\";\nimport { AllocatorVideo } from \"../../../pkgAviaAllocator/allocator.video\";\nimport { OztamV2AviaLive } from \"./oztam.v2.aviaLive\";\nimport {TealiumAvia} from \"../../player/track/tealium\";\n\nexport class AllocatorLive extends AllocatorVideo {\n constructor (_servicesConfig: iTrackingService = trackingServiceConfig){\n super(_servicesConfig);\n\n this.resetTrackingService();\n }\n\n protected initOztam() {\n this.oztam = initOztam.bind(this)(OztamV2AviaLive);\n }\n\n protected initTealium() {\n this.tealium = initTealium.bind(this)(TealiumAvia);\n }\n\n protected initExtraInfo() {\n this.updateExtraInfo({\n oztam_userId: localStorage.getItem(eLocalStorage_tenUser.tu_oztamid) || \"\",\n })\n }\n\n public onLoadedMetadata(mediainfo, playerRef) {\n if(this.firstRoundPlay) {\n this.oztam && this.oztam.onLoadedMetadata && this.oztam.onLoadedMetadata(mediainfo, playerRef);\n }\n if(!this._state.tealiumEvtOverride) {\n this.tealium && this.tealium.load && this.tealium.load(mediainfo);\n } else {\n this.tealium && this.tealium.setMediaInfo && this.tealium.setMediaInfo(mediainfo);\n }\n }\n\n public onFirstPlay(mediainfo, playerRef) {\n if (this.firstRoundPlay) {\n this.oztam && this.oztam.onFirstPlay && this.oztam.onFirstPlay(mediainfo, playerRef);\n }\n if(!this._state.tealiumEvtOverride) {\n this.tealium && this.tealium.firstPlay && this.tealium.firstPlay();\n }\n this._state.tealiumEvtOverride = true;\n }\n}","import { eAllocatorEvent } from \"../../../pkgAviaAllocator/allocator.video.type\";\nimport { PlayerEvent } from \"../../avia.lib\";\n\nexport const allocatorLiveEventMapping = typeof window === \"undefined\" ? {} : {\n [PlayerEvent.RESOURCE_START]: eAllocatorEvent.LOADED_METADATA,\n [PlayerEvent.CONTENT_START]: eAllocatorEvent.FIRST_PLAY,\n [PlayerEvent.CONTENT_PAUSED]: eAllocatorEvent.PAUSE,\n [PlayerEvent.CONTENT_PLAYING]: eAllocatorEvent.RESUME,\n [PlayerEvent.LIVE_PRESENTATION_STOPPED]: eAllocatorEvent.PAUSE,\n [PlayerEvent.CONTENT_PROGRESS]: eAllocatorEvent.PROGRESS,\n [PlayerEvent.AD_BREAK_START]: eAllocatorEvent.AD_BREAK_START,\n [PlayerEvent.AD_BREAK_COMPLETE]: eAllocatorEvent.SEGMENT_VIEW,\n\n [PlayerEvent.AD_START]: eAllocatorEvent.AD_BEGIN,\n [PlayerEvent.AD_COMPLETE]: eAllocatorEvent.AD_COMPLETE,\n [PlayerEvent.AD_PAUSED]: eAllocatorEvent.AD_PAUSE,\n [PlayerEvent.AD_PLAYING]: eAllocatorEvent.AD_RESUME,\n ['beforeunloadpage']: eAllocatorEvent.BEFORE_UNLOAD_PAGE,\n ['initialiseProgressInterval']: eAllocatorEvent.INIT_PROGRESS_INTERVAL,\n [PlayerEvent.PLUGIN_EVENT]: eAllocatorEvent.PLUGIN_EVENT,\n}","import {OzTamV2} from \"../../../pkgAviaAllocator/oztam.v2\";\nimport {eOzTamEvent, iOzTamTrackingFields, iOzTamTrackingMeta_Config, iOzTamTrackingMeta_Media} from \"../../../pkgAviaAllocator/oztam.v2.lib\";\nimport {iMediaInfo} from \"../../../pkgAviaAllocator/allocator.video.type\";\n\nexport class OztamV2AviaLive extends OzTamV2 {\n private pauseTimestamp;\n\n // for processing delayed EPOCH tracking\n private onHoldProgressFields: Array = [];\n\n constructor(protected trackingConfig: iOzTamTrackingMeta_Config) {\n super(trackingConfig);\n\n this.delayProgressLogic();\n }\n\n private delayProgressLogic = () => {\n const originalCanDispatch = this._oztamService.canDispatch.bind(this._oztamService);\n this._oztamService.canDispatch = (fields: iOzTamTrackingFields): boolean => {\n const {latest} = this._extraInfo.id3;\n const originalCanDispatchFlag = originalCanDispatch(fields);\n if (fields.events[0].event !== eOzTamEvent.PROGRESS) {\n return originalCanDispatchFlag;\n }\n if (!originalCanDispatchFlag) {\n return originalCanDispatchFlag;\n }\n\n // if did not receive epoch from current play timestamp, store all tracking fields until epoch received.\n if (this.lastPlayTimestamp && latest.LocalTime < this.lastPlayTimestamp) {\n this.onHoldProgressFields.push(fields);\n return false;\n }\n\n /**\n * new epoch is received after last play event\n */\n\n // if no holding progress\n if (this.onHoldProgressFields.length === 0) {\n return originalCanDispatchFlag;\n }\n\n try {\n const newEpochtime = latest.EpochTime;\n const thisProgressFromEpochtime = fields.events[0].fromPosition;\n this.batchProgressTrack(newEpochtime, thisProgressFromEpochtime);\n } catch (e) {\n return originalCanDispatchFlag;\n }\n\n return false;\n }\n };\n private batchProgressTrack = (newEpochTime, playEpochtime) => {\n // get total duration\n const totalDuration = this.onHoldProgressFields.reduce((duration, field): number => {\n const event = field.events[0];\n return event.toPosition - event.fromPosition;\n }, 0);\n // calculate start epoch of all on hold progress\n let progressFromPosition = newEpochTime - (newEpochTime - playEpochtime) - totalDuration;\n // update all tracking segment from to position\n this.onHoldProgressFields.forEach(field => {\n const event = field.events[0];\n const duration = event.toPosition - event.fromPosition;\n event.fromPosition = progressFromPosition;\n event.toPosition = progressFromPosition + (duration);\n progressFromPosition = event.toPosition;\n // dispatch each track\n this._oztamService.dispatch(field);\n });\n\n // remove all items in onHoldProgressFields array\n this.onHoldProgressFields.splice(0, this.onHoldProgressFields.length);\n };\n\n public onFirstPlay(mediainfo, playerRef) {\n // this.lastPlayTimestamp = Date.now();\n\n this._oztamService.trackBegin(this.defineTrackingProperties(mediainfo));\n // this._oztamService.startProgressInterval();\n }\n\n public onInitProgress(mediainfo, playerRef) {\n // this.lastPlayTimestamp = Date.now();\n this._storedProgressPositionTimestamp = Date.now();\n this._oztamService.startProgressInterval();\n }\n\n public onPause() {\n this.pauseTimestamp = Date.now();\n super.onPause();\n }\n\n public onUnPause(mediainfo, playerRef) {\n this._extraInfo.id3.pauseDurationBeforeNewId3 += Math.round((Date.now() - this.pauseTimestamp) / 1000);\n super.onUnPause(mediainfo, playerRef);\n }\n\n // live dont stop progress tracking during ad break\n onAdBreakEnd(mediainfo, playerRef) {\n\n }\n\n // Partial progress triggered on ad pause\n public onAdPause() {\n this._oztamService.stopProgressInterval();\n }\n\n public onAdResume(mediainfo, playerRef) {\n this._storedProgressPosition = this.defineGetMediaPositionFn(mediainfo, playerRef);\n this._oztamService.startProgressInterval();\n }\n\n protected defineGetMediaTypeFn() {\n return \"live\";\n }\n\n protected defineGetMediaDurationFn(mediaInfo: iMediaInfo, playerRef): number {\n return 0;\n }\n\n protected defineGetMediaPositionFn(mediaInfo: iMediaInfo, playerRef, lastPlayTimestamp?: number) {\n const id3Wrapper = this._extraInfo?.id3;\n // lastPlayTimestamp is used for getting fromPosition\n if (!id3Wrapper || !id3Wrapper.latest) {\n return 0;\n }\n\n const id3 = id3Wrapper.latest;\n if (lastPlayTimestamp) {\n // live video get from position\n return (() => {\n if (id3.LocalTime < lastPlayTimestamp) {\n // did not receive epoch since last play\n return Math.ceil(parseInt(id3.EpochTime) + ((lastPlayTimestamp - id3.LocalTime) / 1000 - id3Wrapper.pauseDurationBeforeNewId3));\n } else {\n return Math.ceil(parseInt(id3.EpochTime) - (id3.LocalTime - lastPlayTimestamp) / 1000);\n }\n })()\n } else {\n return id3.syncedEpoch();\n }\n }\n\n\n protected defineTrackingMedia(mediainfo: iMediaInfo, playerRef): iOzTamTrackingMeta_Media {\n return {\n mediaId: mediainfo.custom_fields?.episode_crid_id || mediainfo.publisher_id,\n mediaType: this.defineGetMediaTypeFn(),\n mediaDuration: this.defineGetMediaDurationFn(mediainfo, playerRef),\n url: window.location.href\n } as iOzTamTrackingMeta_Media;\n }\n}","import {\n eLocalStorage_tenUser_info as userInfoCacheKey,\n eLocalStorage_tenUser_token as tokenCacheKey,\n tLocalStorage_tenUser_info,\n eLocalSotrage_tenUser_autoplay,\n eLocalSotrage_tenUser_favourites,\n eLocalSotrage_tenUser_progress, localStorage_remain\n} from \"./enum\";\n\n/**\n * general\n */\nfunction isTokenCached () {\n return localStorage.getItem(tokenCacheKey.tu_accesstoken) &&\n localStorage.getItem(tokenCacheKey.tu_refreshtoken);\n}\n\n// this one mainly used for refresh token\nfunction isExpired() {\n if (isTokenCached()) {\n const {expiresAt} = getTokenList();\n return expiresAt <= (Date.now() - 30 * 1000);\n } else {\n return true;\n }\n}\n\n/**\n * sign status\n */\nfunction isLoggedIn() {\n return isTokenCached();\n}\n\nfunction isLoggedOut() {\n return !isTokenCached();\n}\n\n/**\n * local user detail cache\n */\nfunction getUserDetail() {\n const userDetail = {};\n Object.keys(userInfoCacheKey).forEach(key=> {\n const kv = localStorage.getItem(key);\n if (kv) {\n userDetail[key] = kv;\n }\n });\n\n return userDetail;\n}\nfunction setUserDetail(data) {\n Object.keys(userInfoCacheKey).forEach((key: tLocalStorage_tenUser_info)=>{\n data[key] !== undefined && data[key] !== null && localStorage.setItem(key, data[key]);\n });\n}\nfunction removeUserDetail(){\n Object.keys(userInfoCacheKey).forEach(key=>{\n if (localStorage_remain.indexOf(key) === -1) {\n localStorage.removeItem(key);\n }\n });\n}\n\n/**\n * user favourites\n */\nfunction getUserFavouriteShows() {\n const favs = localStorage.getItem(eLocalSotrage_tenUser_favourites.tu_shows);\n return favs;\n}\n\nfunction getUserFavouriteRecipes() {\n const favs = localStorage.getItem(eLocalSotrage_tenUser_favourites.tu_recipes);\n return favs;\n}\n\nfunction setUserFavouriteShows(shows) {\n localStorage.setItem(eLocalSotrage_tenUser_favourites.tu_shows, shows);\n}\n\nfunction setUserFavouriteRecipes(recipes) {\n localStorage.setItem(eLocalSotrage_tenUser_favourites.tu_recipes, recipes); \n}\n\nfunction removeFavouriteShows(): void {\n localStorage.removeItem(eLocalSotrage_tenUser_favourites.tu_shows);\n}\n\nfunction removeFavouriteRecipes(): void {\n localStorage.removeItem(eLocalSotrage_tenUser_favourites.tu_recipes);\n}\n\nfunction removeVideoProgress(): void {\n localStorage.removeItem(eLocalSotrage_tenUser_progress.tu_progress);\n}\n\n/**\n * token section\n */\nfunction getAccessToken(){\n return localStorage.getItem(tokenCacheKey.tu_accesstoken);\n}\n\ninterface iJWT {\n accessToken: string,\n refreshToken: string,\n expiresIn: number,\n expiresAt: number,\n memberId: string,\n memberEmailHash: string,\n}\n\nfunction setTokenList(jwt: iJWT): void {\n const { accessToken, refreshToken, expiresAt, expiresIn } = jwt;\n localStorage.setItem(tokenCacheKey.tu_accesstoken, accessToken);\n localStorage.setItem(tokenCacheKey.tu_refreshtoken, refreshToken);\n localStorage.setItem(tokenCacheKey.tu_expiresat, expiresAt * 1000 + \"\");\n localStorage.setItem(tokenCacheKey.tu_expiresin, expiresIn * 1000 + \"\");\n}\n\ninterface iGetTokenDetailOutput {\n accessToken: string,\n refreshToken: string,\n expiresIn: number,\n expiresAt: number,\n}\n\nfunction getTokenList(): iGetTokenDetailOutput {\n return {\n accessToken: localStorage.getItem(tokenCacheKey.tu_accesstoken),\n refreshToken: localStorage.getItem(tokenCacheKey.tu_refreshtoken),\n expiresIn: parseInt(localStorage.getItem(tokenCacheKey.tu_expiresin)),\n expiresAt: parseInt(localStorage.getItem(tokenCacheKey.tu_expiresat)),\n }\n}\n\nfunction removeTokenList():void {\n localStorage.removeItem(tokenCacheKey.tu_accesstoken);\n localStorage.removeItem(tokenCacheKey.tu_refreshtoken);\n localStorage.removeItem(tokenCacheKey.tu_expiresat);\n localStorage.removeItem(tokenCacheKey.tu_expiresin);\n}\n\nfunction setMemberId(jwt: iJWT): void {\n localStorage.setItem(userInfoCacheKey.tu_memberid, jwt.memberId);\n}\n\nfunction getMemberId(): string {\n return localStorage.getItem(userInfoCacheKey.tu_memberid);\n}\n\nfunction removeMemberId(): void {\n localStorage.removeItem(userInfoCacheKey.tu_memberid);\n}\n\nfunction setMemberEmailHashed(jwt: iJWT): void {\n localStorage.setItem(userInfoCacheKey.tu_memberEmailHashed, jwt.memberEmailHash);\n}\n\nfunction getMemberEmailHashed(): string {\n return localStorage.getItem(userInfoCacheKey.tu_memberEmailHashed);\n}\n\n/**\n * social status\n */\ninterface iSocialStatus {\n regId: string\n socialLinkKey: string\n socialSite: string\n socialSiteId: string\n}\n\nfunction setSocialStatus(statusList: Array = []) {\n const socialLinks = [];\n statusList.forEach(socialStatus => {\n socialLinks.push(socialStatus.socialSite);\n });\n localStorage.setItem(userInfoCacheKey.tu_socialLinks, JSON.stringify(socialLinks));\n}\n\nfunction linkSocialStatus(socialName: string) {\n const socialLinks = getSocialStatus();\n if (socialLinks.indexOf(socialName) >= 0) {\n return;\n }\n socialLinks.push(socialName);\n localStorage.setItem(userInfoCacheKey.tu_socialLinks, JSON.stringify(socialLinks));\n}\n\nfunction unlinkSocialStatus(socialName: string) {\n const socialLinks = getSocialStatus();\n const unlinkIndex = socialLinks.indexOf(socialName);\n if (unlinkIndex >= 0) {\n socialLinks.splice(unlinkIndex, 1);\n localStorage.setItem(userInfoCacheKey.tu_socialLinks, JSON.stringify(socialLinks));\n }\n}\n\nfunction getSocialStatus(): Array {\n try {\n const socialLinks = JSON.parse(localStorage.getItem(userInfoCacheKey.tu_socialLinks));\n if (!socialLinks || !Array.isArray(socialLinks)) {\n return [];\n } else {\n return socialLinks;\n }\n } catch (err) {\n return [];\n }\n}\n\nfunction getAutoplaySetting() {\n const autoplay = localStorage.getItem(eLocalSotrage_tenUser_autoplay.tu_autoplay);\n return autoplay;\n}\n\nfunction setAutoplaySetting(autoplay: boolean) {\n localStorage.setItem(eLocalSotrage_tenUser_autoplay.tu_autoplay, JSON.stringify(autoplay));\n}\n\nfunction removeSocialStatus(): void{\n localStorage.removeItem(userInfoCacheKey.tu_socialLinks);\n return;\n}\n\nfunction removeAllCache() {\n removeTokenList();\n removeMemberId();\n removeUserDetail();\n removeSocialStatus();\n removeVideoProgress();\n}\n\nexport const jwtMember = {\n isExpired,\n isLoggedIn,\n isLoggedOut,\n\n setUserDetail,\n getUserDetail,\n\n getUserFavouriteShows,\n getUserFavouriteRecipes,\n setUserFavouriteShows,\n setUserFavouriteRecipes,\n removeFavouriteShows,\n removeFavouriteRecipes,\n\n setMemberId,\n getMemberId,\n\n setAutoplaySetting,\n getAutoplaySetting,\n\n setMemberEmailHashed,\n getMemberEmailHashed,\n\n setTokenList,\n getTokenList,\n removeTokenList,\n getAccessToken,\n\n setSocialStatus,\n linkSocialStatus,\n unlinkSocialStatus,\n getSocialStatus,\n\n removeAllCache,\n};","export const eLocalStorage_tenUser_display = {\n tu_name: \"tu_name\",\n tu_firstname: \"tu_firstname\",\n tu_lastname: \"tu_lastname\",\n tu_email: \"tu_email\",\n tu_socialLinks: \"tu_socialLinks\",\n};\nexport type tLocalStorage_tenUser_display = (typeof eLocalStorage_tenUser_display)[keyof typeof eLocalStorage_tenUser_display];\n\nexport const eLocalStorage_tenUser_backend = {\n tu_username: \"tu_username\",\n tu_userid: \"tu_userid\",\n tu_memberid: \"tu_memberid\",\n tu_oztamid: \"tu_oztamid\",\n tu_n10adId: \"tu_n10adId\",\n tu_memberEmailHashed: \"tu_memberEmailHashed\",\n tu_datecreated: \"tu_datecreated\",\n tu_gr: \"tu_gr\", // TPWP-1368\n tu_ge: \"tu_ge\",\n tu_geo: \"tu_geo\",\n tu_vpn: \"tu_vpn\",\n tu_vpn_switch: \"tu_vpn_switch\",\n tu_memberPostcode: \"tu_memberPostcode\",\n};\nexport type tLocalStorage_tenUser_backend = (typeof eLocalStorage_tenUser_backend)[keyof typeof eLocalStorage_tenUser_backend];\n\nexport const eLocalStorage_tenUser_info = {\n ...eLocalStorage_tenUser_display,\n ...eLocalStorage_tenUser_backend,\n};\nexport type tLocalStorage_tenUser_info = (typeof eLocalStorage_tenUser_info)[keyof typeof eLocalStorage_tenUser_info];\n\nexport const eLocalStorage_tenUser_token = {\n tu_accesstoken: \"tu_accesstoken\",\n tu_refreshtoken: \"tu_refreshtoken\",\n tu_expiresat: \"tu_expiresat\",\n tu_expiresin: \"tu_expiresin\",\n tu_tokentimestamp: \"tu_tokentimestamp\",\n};\nexport type tLocalStorage_tenUser_token = (typeof eLocalStorage_tenUser_token)[keyof typeof eLocalStorage_tenUser_token];\n\nexport const eLocalSotrage_tenUser_favourites = {\n tu_shows: \"tu_shows\",\n tu_recipes: \"tu_recipes\",\n};\n\nexport const eLocalSotrage_tenUser_progress = {\n tu_progress: \"tu_progress\",\n};\n\nexport const eLocalSotrage_tenUser_autoplay = {\n tu_autoplay: \"tu_autoplay\",\n};\n\nexport type tLocalSotrage_tenUser_favourites = (typeof eLocalSotrage_tenUser_favourites)[keyof typeof eLocalSotrage_tenUser_favourites];\n\nexport const eLocalStorage_tenUser = {\n ...eLocalStorage_tenUser_info,\n ...eLocalStorage_tenUser_token,\n};\nexport type tLocalStorage_tenUser = (typeof eLocalStorage_tenUser)[keyof typeof eLocalStorage_tenUser];\n\n\nexport const eLocalStorage_tenTrack = {\n // ten track\n tt_deviceid: \"tt_deviceid\",\n};\nexport type tLocalStorage_tenTrack = (typeof eLocalStorage_tenTrack)[keyof typeof eLocalStorage_tenTrack];\n\nexport const localStorage_remain = [\n eLocalStorage_tenUser_backend.tu_geo,\n];\n\nexport const eLocalStorage = {\n ...eLocalStorage_tenUser,\n ...eLocalStorage_tenTrack,\n};\nexport type tLocalStorage = (typeof eLocalStorage)[keyof typeof eLocalStorage];","import React from 'react';\nimport OverlayTemplate from './overlayTemplate';\nimport SlateTemplate from './slate/slateTemplate';\nimport {iPlayer, PlayerStates} from './playerCtrl.type';\nimport {tOverlays} from \"./overlayTemplate.type\";\nimport {iWebApiVideoData} from \"../api/api.video.type\";\nimport { ProxyCheck } from '../../ten/geo.util';\n\nconst vpnStorageCleanUp = () => {\n try {\n const value = localStorage?.getItem('tu_vpn');\n if (value !== null) {\n ProxyCheck.storageClean();\n window.location.reload();\n }\n } catch (error) {\n // Error retrieving data\n }\n};\n\nconst AdBlockerOMessage = async (_player: iPlayer, video: iWebApiVideoData) => {\n return (\n \n If you're experiencing playback issues, it may be because you have an ad blocker enabled.{' '}\n Try disabling this and see if that resolves the problem. If not, let us know!\n \n }\n />\n );\n};\n\nconst GeoBlockeMessage = async (_player: iPlayer, video: iWebApiVideoData) => {\n return (\n \n If you're in Australia, please disable any VPNs or get in touch with us at{' '}\n \n helpdesk.tenplay.com.au\n {' '}\n for assistance.\n
\n

If you are not using a VPN, please click the button below

\n \n
\n \n }\n />\n );\n};\n\nconst ErrorFetchingVideoMessage = async () => {\n return ;\n};\n\nconst DetectWindows7Message = async () => {\n return ;\n}\n\nconst AdFetchingVideoMessage = async () => {\n return ;\n};\n\nconst DisplaySlateImage = async (_player: iPlayer, video: iWebApiVideoData, slateUrl: string) => {\n return ;\n};\n\nexport const OverlayFactory: tOverlays = {\n [PlayerStates.AdBlockerOn]: AdBlockerOMessage,\n [PlayerStates.GeoBlocked]: GeoBlockeMessage,\n [PlayerStates.DetectWindows7]: DetectWindows7Message,\n [PlayerStates.ErrorFetchingVideo]: ErrorFetchingVideoMessage,\n [PlayerStates.ErrorFetchingAd]: AdFetchingVideoMessage,\n [PlayerStates.DisplaySlateImage]: DisplaySlateImage,\n};\n","import React from 'react';\nimport {iOverlayTemplateProps} from \"./overlayTemplate.type\";\n\nconst OverlayTemplate = (props: iOverlayTemplateProps) => {\n const {video, heading, body, id } = props;\n const {poster} = video || {};\n\n return (\n \n
\n
\n

{heading}

\n

{body}

\n
\n
\n
\n );\n};\n\nexport default OverlayTemplate;\n","\n\nexport interface iFreeWheelConfig {\n enableFreeWheel: boolean\n}\n\nexport interface iBVodData {\n Demo: string; //\"F55-64\",\n BvodId: string; //\"5786649802655706129\",\n}\n\nexport interface iFreewheelAdTagParametersGlobal {\n imafw__fw_coppa: string | number; // COPPA compliance setting. Should be set to 0 unless otherwise specified. Required for all platforms. (tfcd).\n imafw__fw_is_lat?: string | number; // User tracking preference. Should be 0 or 1 depending on whether tracking is enabled. Required for all platforms.\n imafw__fw_site_page: string; // Represents the site section for web content. Required and dynamically set for all platforms.\n imafw__fw_h_x_country: string | number; // Country code of the request origin. Required for all platforms.\n imafw__fw_vcid2?: string; // Publisher-provided ID (PPID). Optional for all platforms.\n imafw__fw_content_id?: string; // Video content ID representing the specific video asset. Optional, typically used in dynamic content calls.\n imafw__fw_continuous_play?: string | number; // Indicates whether continuous play triggered the video asset. Optional and used for VOD content only.\n imafw__fw_h_referer?: string; // Referrer URL, mainly used for web environments to track the page source. Optional.\n imafw__fw_3P_uid?: string; // Third-party identifier. Optional and used for user identification from external systems. (Comes from FMS API).\n imafw__fw_3P_UID?: string; // Alternative third-party identifier. Optional and often used interchangeably with 3P_uid. (Comes from FMS API).\n}\n\nexport interface iFreeWheelAdTagParametersCustom {\n imafw_ge: string | number; // Gender information\n imafw_gr: string | number; // Age information\n imafw_givn?: string; // Nonce or one-time value, optional and platform-agnostic.\n imafw_pcode: string; // Postcode\n imafw__fw_h_x_postal_code: string; // Postal code, required for all platforms.\n imafw_state: string; // nsw, sa, qld, nt, wa, vic (these values explicitly listed in spreadsheet docs, unsure if other values are acceptable)\n imafw_sub: string; // Source identifier, typically used in GAM for identifying ad request origins. Required for all platforms. (GAM ppid)\n imafw_session: string; // Session ID to track the user session for dynamic content delivery. Required for all platforms.\n imafw_idtype?: string; // Identifier type, optional and specific to third-party integrations. (Needs clarification - refer to docs).\n imafw_ptype?: string; // Optional parameter for specifying P type, used in platform-specific implementations.\n imafw_vguide?: string; // Optional parameter for video guide metadata, typically used in BVOD environments. (\"Video GUID\" (Globally Unique Identifier))\n imafw_oztamozsid?: string; // BVOD-specific metadata used for OZTAM tracking. Optional and used in Australian markets.\n imafw_oztam_1?: string; // BVOD data point for tracking. Optional.\n imafw_oztam_1salted?: string; // Salted version of OZTAM 1 for privacy-preserving tracking. Optional.\n imafw_oztam_1demo?: string; // Demographic data for OZTAM 1. Optional and BVOD-specific.\n imafw_oztam_2?: string; // BVOD data point for OZTAM 2 tracking. Optional.\n imafw_oztam_2salted?: string; // Salted version of OZTAM 2 for privacy purposes. Optional.\n imafw_oztam_2demo?: string; // Demographic data for OZTAM 2. Optional and used in specific BVOD implementations.\n imafw_oztam_3?: string; // BVOD data point for OZTAM 3 tracking. Optional.\n imafw_oztam_3salted?: string; // Salted version of OZTAM 3 for privacy reasons. Optional.\n imafw_oztam_3demo?: string; // Demographic data for OZTAM 3. Optional.\n imafw_oztam_4?: string; // BVOD data point for OZTAM 4 tracking. Optional.\n imafw_oztam_4salted?: string; // Salted version of OZTAM 4. Optional.\n imafw_oztam_4demo?: string; // Demographic data for OZTAM 4. Optional.\n imafw_collection?: string; // Collection metadata, desktop and mobile-specific. Optional and rarely used in dynamic ad requests.\n imafw_tvid?: string; // TV ID for desktop and mobile platforms. Optional and used in some environments.\n imafw_genre?: string; // Genre information for content categorization. Optional and typically used in desktop and mobile.\n imafw_csid?: string;\n}\n\nexport interface AppInfo {\n webhost: string; // Required for desktop and mobile web\n googledai: number;\n region: string; // Required for non-US domestic properties\n coppa: number; // Required\n}\nexport interface DeviceInfo {\n lat: number;\n ip: string;\n ua: string;\n}\nexport interface Identifiers {\n userid?: string;\n ifa?: string; // Optional, include if available\n ifatype?: string; // Optional, include if available\n emailhash?: string; // Optional, include if available\n subscriberid?: string; // Optional, include if available\n}\nexport interface IMSResponse {\n fms_id_ttl: number;\n fms_params: Record;\n}\n\nexport enum State {\n ACT = \"ACT\",\n NSW = \"NSW\",\n VIC = \"VIC\",\n QLD = \"QLD\",\n SA = \"SA\",\n WA = \"WA\",\n TAS = \"TAS\",\n NT = \"NT\",\n}\n\nexport interface StateRange {\n range: [number, number];\n state: State;\n}","import { env } from './../../ten/cust.env';\nimport { iBVodData, iFreeWheelAdTagParametersCustom, iFreewheelAdTagParametersGlobal, iFreeWheelConfig, State, StateRange } from './player.util.type'; // Adjust the import path as necessary\n\nexport const ORIGIN_PROD = \"https://www.10play.com.au\";\nexport const ORIGIN_DEV = \"https://ww1.10play.com.au\";\n\nexport function generateGoogleAdTagParams(\n bvodData: iBVodData[] | null,\n freeWheelConfig: iFreeWheelConfig,\n contentId: string,\n cmsId: string = '',\n ImsApiParameters: any,\n adParams: any,\n additionalParams: any\n) {\n\n function createAdTagParams(enableFreeWheel: boolean, bvodData: iBVodData[], contentId: string, cmsId: string = '', ImsApiParameters: any, adParams:any, additionalParams:any): { [key: string]: any } {\n const {video, miscData, plabackInfo } = additionalParams;\n if (!enableFreeWheel) {\n return {};\n }\n const globalParams = getGlobalParams(contentId, video);\n const customParams = getCustomParams(bvodData, adParams);\n const extraParams = generateExtraFreeWheelParams(video, miscData);\n const adTagParams = {\n ...globalParams,\n ...customParams,\n ...extraParams,\n ...ImsApiParameters\n };\n if (cmsId) {\n adTagParams['cmsid'] = cmsId;\n }\n\n return adTagParams;\n }\n\n function getCustomParams(bvodData: iBVodData[], adParams:any): { [key: string]: any } {\n const customInterfaceParams: iFreeWheelAdTagParametersCustom = {\n imafw_ge: adParams.ge,\n imafw_gr: adParams.gr,\n imafw_pcode: adParams.pcode,\n imafw__fw_h_x_postal_code: adParams.pcode,\n imafw_sub: adParams.sub,\n imafw_session: adParams.session,\n imafw_tvid: adParams.tvid,\n imafw_state: getStateFromPostcode(adParams.pcode), // deriving from postcode\n ...getBvodCustomParams(bvodData, adParams.oztamozsid),\n };\n return { ...customInterfaceParams };\n }\n\n function getGlobalParams(contentId: string, video:any): { [key: string]: string } {\n const defaultSitePage = env?.isProduction() ? ORIGIN_PROD : ORIGIN_DEV;\n const sitePage = window?.location?.href || defaultSitePage;\n const globalInterfaceParams: iFreewheelAdTagParametersGlobal = {\n imafw__fw_coppa: video?.genre?.toLowerCase() === 'kids' ? 1 : 0,\n imafw__fw_site_page: sitePage,\n imafw__fw_h_x_country: String(\"AU\"),\n imafw__fw_content_id: String(contentId || ''),\n };\n const globalParams: { [key: string]: any } = { ...globalInterfaceParams }\n return globalParams;\n }\n\n\n function getBvodCustomParams(bvodData: iBVodData[], oztamSessionId: string): { [key: string]: any } {\n if (!oztamSessionId || bvodData.length === 0) {\n return {};\n }\n const bvodParams = {\n \"imafw_oztamozsid\": oztamSessionId\n };\n \n bvodData.forEach((data) => {\n bvodParams[`imafw_${data.Demo}`] = data.BvodId;\n });\n return bvodParams;\n }\n\n function generateExtraFreeWheelParams(videoData: any, miscData: any): { [key: string]: any } {\n const extraParams = {\n ...miscData\n };\n return extraParams;\n }\n\n function createBvodParamsArray(bvodData: iBVodData[], oztamSessionId: string): string[] {\n if (!oztamSessionId || bvodData.length === 0) {\n return [];\n }\n const paramsArray = [`oztamozsid=${oztamSessionId}`];\n bvodData.forEach((data, index) => {\n paramsArray.push(`oztam_${index + 1}=${data.BvodId}`);\n paramsArray.push(`oztam_${index + 1}demo=${data.Demo}`);\n });\n return paramsArray;\n }\n\n function getStateFromPostcode(postcode: string): State {\n const numericPostcode = parseInt(postcode, 10);\n\n if (isNaN(numericPostcode) || numericPostcode < 200 || numericPostcode > 9999) {\n return undefined;\n }\n\n const states: StateRange[] = [\n { range: [200, 299], state: State.ACT },\n { range: [800, 999], state: State.NT },\n { range: [1000, 1999], state: State.NSW },\n { range: [2000, 2599], state: State.NSW },\n { range: [2619, 2899], state: State.NSW },\n { range: [2921, 2999], state: State.NSW },\n { range: [2600, 2618], state: State.ACT },\n { range: [2900, 2920], state: State.ACT },\n { range: [3000, 3999], state: State.VIC },\n { range: [4000, 4999], state: State.QLD },\n { range: [5000, 5999], state: State.SA },\n { range: [6000, 6797], state: State.WA },\n { range: [7000, 7999], state: State.TAS }\n ];\n\n const matchedState = states.find(({ range }) => numericPostcode >= range[0] && numericPostcode <= range[1]);\n return matchedState ? matchedState.state : undefined;\n }\n\n return createAdTagParams(freeWheelConfig.enableFreeWheel, bvodData || [], contentId, cmsId, ImsApiParameters, adParams, additionalParams);\n}\n\n\n\n","import React from \"react\";\nimport {accountID} from \"../global/config\";\nimport {ePlayerBlockedReason, ePlayerCtrlState, iPlayer, iPlayerCtrlState} from \"./playerCtrl.type\";\nimport { Geo, ProxyCheck } from '../../ten/geo.util';\nimport {AllocatorVideo} from \"../../pkgAviaAllocator/allocator.video\";\nimport { iUapApiVideoData, iWebApiVideoData } from '../api/api.video.type';\nimport {iMediaInfo} from \"../../pkgAviaAllocator/allocator.video.type\";\nimport {isAdBlock} from \"./util/adBlockCheck\";\nimport {isWindows7} from \"./util/detectOs\";\nimport {promiseAllSettled} from \"../../../Shared/Helpers/index\"\n\nexport class PlayerCtrl extends React.Component {\n static ctrls;\n static ctrlsStateCache;\n\n protected _logger = console;\n protected _allocator: AllocatorVideo;\n\n public player: iPlayer;\n public playerContainerId: string;\n public playing: boolean;\n public livePlayList;\n\n constructor(props) {\n super(props);\n if (typeof window === \"undefined\") {\n return;\n }\n\n this._init();\n PlayerCtrl.ctrls = PlayerCtrl.ctrls || [];\n PlayerCtrl.ctrls.push(this);\n }\n\n static batchCtrlState(batchResumePlay?: boolean) {\n PlayerCtrl.ctrls = PlayerCtrl.ctrls || [];\n PlayerCtrl.ctrlsStateCache = PlayerCtrl.ctrlsStateCache || [];\n\n PlayerCtrl.ctrls.forEach((ctrl: PlayerCtrl, index) => {\n if (batchResumePlay) {\n // resume last stored player state\n switch (PlayerCtrl.ctrlsStateCache[index]) {\n case ePlayerCtrlState.play:\n ctrl.player.play();\n break;\n }\n } else {\n // pause all ctrl players\n PlayerCtrl.ctrlsStateCache[index] =\n ctrl.playing ?\n ePlayerCtrlState.play :\n ePlayerCtrlState.notPlay;\n PlayerCtrl.ctrlsStateCache[index] === ePlayerCtrlState.play && ctrl.player.pause();\n }\n })\n }\n\n private _init() {\n this._initVTG();\n }\n\n private _initVTG() {\n const hasVTGConfigs = window.vtg && window.vtg.config;\n // this._logger.log('vtg config: ' + hasVTGConfigs);\n\n if (hasVTGConfigs) {\n window.vtg.config.OzTam.params.serverInfo.vodKey = String(accountID);\n window.vtg.config.OzTam.params.serverInfo.liveKey = String(accountID);\n }\n }\n\n protected async _playerShouldBeBlocked(): Promise {\n const bypassAdBlockDetection = this._bypassAdBlockDetection();\n const [geoBlockResponse, adBlockResponse, vpnBlockResponse] = await promiseAllSettled([Geo.isGeoBlocked(), isAdBlock(), ProxyCheck.vpnCheck()]);\n const isAdBlocked:boolean = adBlockResponse.value;\n const isGeoBlocked:boolean = geoBlockResponse.value;\n const isVpnBlocked:boolean = vpnBlockResponse.value;\n if (isAdBlocked === true && !bypassAdBlockDetection) {\n await this._deniedAdBlocker();\n return ePlayerBlockedReason.adBlocker;\n } else if (isGeoBlocked === true || isVpnBlocked === true ) {\n await this._deniedGeoBlocker();\n return ePlayerBlockedReason.geoBlocker;\n } else if(await isWindows7() === true){\n await this._deniedWindows7();\n return ePlayerBlockedReason.win7Blocker\n }\n return;\n }\n\n protected _bypassAdBlockDetection = () => {\n const bypassShows = [\"neighbours\", \"ncis\", \"the-bold-and-the-beautiful-fast-tracked\"];\n let bypassDetection = false;\n for(let i = 0; i < bypassShows.length; i++) {\n bypassDetection = window.location.pathname.indexOf(bypassShows[i]) > -1;\n if(bypassDetection) {\n break;\n }\n }\n return bypassDetection;\n }\n\n static convertToVideoTrackObj(mediaInfo: any, video?: any , OzTamSessionID?:string): iMediaInfo {\n const {customFields} = mediaInfo;\n return {\n id: mediaInfo.id,\n name: mediaInfo.clipTitle,\n account_id: accountID + \"\",\n description: mediaInfo.description,\n long_description: mediaInfo.description,\n duration: mediaInfo.duration + \"\",\n channelDisplayName: mediaInfo.channelDisplayName,\n head_position: \"0\",\n created_at: mediaInfo.published + \"\",\n published_at: mediaInfo.published + \"\",\n updated_at: mediaInfo.published + \"\",\n reference_id: mediaInfo.referenceId,\n publisher_id: accountID + \"\",\n custom_fields: {\n alt_media_id: mediaInfo.altId,\n tv_channel: mediaInfo.tvChannel,\n tv_show: mediaInfo.tvShow,\n tv_episode: mediaInfo.episode,\n tv_season: mediaInfo.season,\n episode_crid_id: mediaInfo.episodeCrid,\n series_crid_id: mediaInfo.seriesCrid,\n clip_title: mediaInfo.clipTitle,\n episode_name: mediaInfo.title,\n expiry_date: mediaInfo.expiry + \"\",\n program_classification: mediaInfo.classification,\n video_type_long_form: mediaInfo.videoTypeLongForm,\n showContentMarket: customFields?.market,\n oztamPublisherId: mediaInfo.publisherid,\n oztamSessionId: OzTamSessionID,\n },\n video : {\n ShowGenre: video?.genre || mediaInfo.genre,\n ShowProgramClassification: video?.showRatingClassification,\n isMemberGatedLive: video?.memberGated,\n }\n\n }\n }\n\n /*\n *\n * Implement below methods in child class\n *\n * */\n protected _trackEvent(event, allocatorVideo, mediaInfo, playerRef): void {\n\n }\n\n protected async _deniedAdBlocker() {\n }\n\n protected async _deniedGeoBlocker() {\n }\n\n protected async _deniedWindows7() {\n }\n}","import React from \"react\";\nimport {iAllocatorPlayerRef} from \"../../pkgAviaAllocator/allocator.video.type\";\nimport {PlayerEvent, VideoPlayerInterface} from \"../avia.lib\";\nimport { PlaylistEvent } from \"@cbsinteractive/avia-js-playlist\";\n\nexport interface iPlayerCtrlState {\n playerState: PlayerStates;\n overlay: React.ReactNode,\n}\n\nexport enum PlayerStates {\n PreInitialize = 'PreInitialize',\n ErrorOccurred = 'ErrorOccurred',\n\n Playing = 'Playing',\n Paused = 'Paused',\n End = 'End',\n Next = 'Next',\n AdPlaying = 'AdPlaying',\n AdBlockerOn = 'AdBlockerOn',\n GeoBlocked = 'GeoBlocked',\n DetectWindows7 = \"DetectWindows7\",\n ErrorFetchingVideo = 'ErrorFetchingVideo',\n ErrorFetchingAd = 'ErrorFetchingAd',\n DisplaySlateImage = 'DisplaySlateImage',\n}\n\nexport type playerEventMappable =\n PlayerEvent.CONTENT_PLAYING |\n PlayerEvent.CONTENT_PAUSED |\n PlayerEvent.CONTENT_COMPLETE |\n PlayerEvent.ERROR |\n PlayerEvent.AD_PROGRESS;\n\nexport const playerEventStateMap = {\n [PlayerEvent.CONTENT_PLAYING]: PlayerStates.Playing,\n [PlayerEvent.CONTENT_PAUSED]: PlayerStates.Paused,\n [PlayerEvent.CONTENT_COMPLETE]: PlayerStates.End,\n [PlayerEvent.ERROR]: PlayerStates.ErrorOccurred,\n [PlayerEvent.AD_PROGRESS]: PlayerStates.AdPlaying,\n};\n\nexport enum ePlayerBlockedReason {\n adBlocker = \"adBlock\",\n geoBlocker = \"geoBlock\",\n win7Blocker = \"win7Block\"\n}\n\n\nexport enum ePlayerCtrlState {\n notPlay,\n play,\n}\n\nexport interface iPlayer extends VideoPlayerInterface, iAllocatorPlayerRef {\n videoElement?: any;\n logoUrl?: string;\n consumerAdvice?: string | null;\n}\n","import React from 'react';\nimport {iOverlayTemplateProps} from \"../overlayTemplate.type\";\n\nconst SlateTemplate = (props: iOverlayTemplateProps) => {\n const {id, slateUrl } = props;\n\n return (\n \n \n );\n};\n\nexport default SlateTemplate;\n","import {iTealiumTrackingData, Tealium} from \"../../../pkgAviaAllocator/tealium\";\nimport {jwtMember} from \"../../../tenMember/jwt/cacheStatus\";\n\ninterface iTPWPTealiumTrackingData extends iTealiumTrackingData {\n memberId?: string,\n memberEmailHashed?: string,\n memberLoginStatus?: \"logged-in\" | \"logged-out\",\n showProgramClassification?: string,\n memberGender?: string,\n memberAge?: string,\n memberPostcode?: string,\n memberFavouriteGenre?: string,\n}\n\nexport class TealiumAvia extends Tealium {\n protected getGeneralData(mediaInfo): iTPWPTealiumTrackingData {\n const result: iTPWPTealiumTrackingData = super.getGeneralData(mediaInfo);\n\n const userinfo = jwtMember.getUserDetail();\n\n if (jwtMember.isLoggedIn()) {\n result.memberId = jwtMember.getMemberId();\n result.memberEmailHashed = jwtMember.getMemberEmailHashed();\n result.memberLoginStatus = jwtMember.isLoggedIn() ? \"logged-in\" : \"logged-out\";\n result.memberGender = jwtMember.getMemberGender();\n result.memberAge = jwtMember.getMemberAge();\n result.memberPostcode = jwtMember.getMemberPostcode();\n result.memberFavouriteGenre = jwtMember.getMemberFavouriteGenre();\n }\n\n return result;\n }\n}","// Checks to see if the user has ad blocker enabled\nexport async function isAdBlock() {\n \n let isBlocked;\n \n const tryRequest = async () => {\n try {\n return fetch(\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\", {\n method: 'HEAD',\n mode: 'no-cors'\n })\n .then((response) => {\n // Google Ads request succeeded, so likely no ad blocker\n isBlocked = false;\n return isBlocked;\n }).catch((e) => {\n // Request failed, likely due to ad blocker\n isBlocked = true;\n return isBlocked;\n });\n } catch (error) {\n console.error(error);\n isBlocked = true;\n return isBlocked;\n }\n }\n \n return isBlocked !== undefined ? isBlocked : await tryRequest();\n }","export async function isWindows7() {\n return navigator.appVersion.indexOf(\"Windows NT 6.1\") !== -1\n}","let userAgentFilterName = [\"bot\", \"mobile\", \"tablet\", \"mobile\"];\nlet userAgentFilter = [\n [\n /(ads|google|bing|msn|yandex|baidu|ro|career|)bot/i,\n /(baidu|jike|symantec)spider/i,\n /scanner/i,\n /(web)crawler/i,\n ],\n [\n /ip(hone|od)/i,\n /android.*(mobile|mini)/i,\n /Opera Mobi/,\n /Mobile.+Firefox/,\n /^HTC/,\n /Fennec/,\n /IEMobile/,\n /BlackBerry/,\n /BB10.*Mobile/,\n /GT-.*Build\\/GINGERBREAD/,\n /SymbianOS.*AppleWebKit/,\n ],\n [\n /ipad/i,\n /android/i,\n /PlayBook; U; RIM Tablet/,\n /hp-tablet.*TouchPad/,\n /Kindle\\/3/,\n\n ],\n [\n // without brand\n /symbian/i,\n /^sonyericsson/i,\n /^nokia/i,\n /^samsung/i,\n /^lg/i,\n /bada/i,\n /blazer/i,\n /cellphone/i,\n /iemobile/i,\n /midp-2.0/i,\n /u990/i,\n /netfront/i,\n /opera mini/i,\n /palm/i,\n /nintendo wii/i,\n /playstation portable/i,\n /portalmmm/i,\n /proxinet/i,\n /sonyericsson/i,\n /symbian/i,\n /windows\\ ?ce/i,\n /winwap/i,\n /eudoraweb/i,\n /htc/i,\n /240x320/i,\n /avantgo/i,\n ],\n];\n\n\nlet type = \"\";\nif (typeof window !== \"undefined\") {\n let filterType = userAgentFilterName.find(function(filterName, index){\n return !!userAgentFilter[index].find(function(regex, regIndex){\n return regex.test(window.navigator.userAgent);\n });\n });\n filterType ? type = filterType : type = \"desktop\";\n}\n\nexport const deviceType = type;","import {deviceType} from \"./device\";\n\nexport const detectBrowser = (function () {\n if (typeof window === \"undefined\") {\n return {\n name: \"node\",\n version: \"0.0.0\"\n };\n }\n\n let userAgent = navigator.userAgent;\n let browserName;\n\n if (userAgent.match(/edg/i)) {\n browserName = \"Edge\";\n }else if(userAgent.match(/chrome|chromium|crios/i)) {\n browserName = \"chrome\";\n } else if (userAgent.match(/firefox|fxios/i)) {\n browserName = \"firefox\";\n } else if (userAgent.match(/safari/i)) {\n browserName = \"safari\";\n } else if (userAgent.match(/opr\\//i)) {\n browserName = \"opera\";\n } else {\n browserName = \"No browser detection\";\n }\n return browserName.toLowerCase();\n})\n\nexport function isFlashPlayerEnabled(): boolean {\n let navigator = (window as any).navigator;\n if (navigator.mimeTypes\n && navigator.mimeTypes['application/x-shockwave-flash'] != undefined\n && navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {\n return true;\n } else {\n try {\n new ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n\nexport function generateUUID() {\n let d = new Date().getTime();\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n let r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);\n });\n}\n\nexport function gup(name) {\n if (typeof window === \"undefined\") {\n return \"\";\n }\n\n name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n let regexS = \"[\\\\?&]\" + name + \"=([^&#]*)\";\n let regex = new RegExp(regexS);\n let results = regex.exec(window.location.href);\n return (results === null) ? \"\" : results[1];\n}\n\nexport const urlUtil = (function () {\n if (typeof window === \"undefined\") {\n return {\n kv: {},\n keys: [],\n };\n }\n\n let params: { [key: string]: string } = {};\n let paramKeys = [];\n if (location.search) {\n let paramStr = location.search;\n if (paramStr[0] === \"?\") {\n paramStr = paramStr.substr(1);\n }\n let paramArray = paramStr.split(\"&\");\n for (let i = 0; i < paramArray.length; i++) {\n let kv = paramArray[i].split(\"=\");\n if (kv.length === 2) {\n params[kv[0]] = kv[1];\n paramKeys.push(kv[0]);\n }\n }\n }\n\n return {\n kv: params,\n keys: paramKeys\n }\n})();\n\nexport const getOffsetTop = (element) => {\n if (!element || !element.nodeName || element.nodeName.toLowerCase() === \"body\") {\n return 0;\n } else {\n return element.offsetTop + getOffsetTop(element.offsetParent)\n }\n};\nexport const lazyCallback = (\n slotElement: HTMLElement,\n events: Array,\n pixelOffset: number,\n callback: () => void\n) => {\n events.forEach((event) => {\n let callbackWrapper = () => {\n for (let i = 0; i < events.length; i++) {\n window.removeEventListener(events[i], eventCallback, false);\n }\n callback();\n };\n\n let eventCallback = () => {\n let windowScrollTop = window.pageYOffset || window.scrollY;\n let windowScrollBottom = window.innerHeight + windowScrollTop;\n let slotOffsetTop = getOffsetTop(slotElement);\n let slotOffsetBottom = getOffsetTop(slotElement) + slotElement.clientHeight;\n if (windowScrollTop < 0) {\n callbackWrapper();\n } else {\n if (slotOffsetTop > (windowScrollTop - pixelOffset) && slotOffsetTop < windowScrollBottom) {\n callbackWrapper();\n }\n if (slotOffsetBottom < (windowScrollBottom + pixelOffset) && slotOffsetBottom > windowScrollTop) {\n callbackWrapper();\n }\n }\n };\n\n window.addEventListener(event, eventCallback, false);\n })\n};\n\nexport const cookies = {\n /**\n *\n * @param name\n * @param paths\n */\n expireAllCookies: function (name, paths) {\n let expires = new Date(0).toUTCString();\n\n // expire null-path cookies as well\n document.cookie = name + '=; expires=' + expires;\n\n for (let i = 0, l = paths.length; i < l; i++) {\n document.cookie = name + '=; path=' + paths[i] + '; expires=' + expires;\n }\n },\n /**\n *\n * @param name\n */\n deleteCookie: function (name) {\n this.setCookie(name, '', -1);\n },\n /**\n *\n * @param name\n * @returns {*}\n */\n getCookie: function (name) {\n let reg = new RegExp('(?:^|; )' + encodeURIComponent(name) + '=([^;]*)', \"i\");\n let matches = document.cookie.match(reg);\n if (matches && matches.length > 1) {\n return matches[1];\n } else {\n return undefined;\n }\n },\n /**\n *\n * @param name\n * @param value\n * @param time\n */\n setCookie: function (name, value, time?) {\n let date = new Date();\n let expires;\n if (typeof value === \"object\") {\n value = JSON.stringify(value);\n }\n if (time) {\n if (typeof time === \"number\" || time.days) {\n date.setTime(date.getTime() + (time * 24 * 60 * 60 * 1000));\n } else if (time.hours) {\n date.setTime(date.getTime() + (time.hours * 60 * 60 * 1000));\n } else if (time.mins) {\n date.setTime(date.getTime() + (time.mins * 60 * 1000));\n } else if (time.seconds) {\n date.setTime(date.getTime() + (time.seconds * 1000));\n }\n expires = \"; expires=\" + date.toUTCString();\n } else {\n expires = \"\";\n }\n document.cookie = name + \"=\" + value + expires + \"; path=/\";\n }\n};\n\nexport const storages = {\n getJSONFromLocalStorage: function (key: string) {\n if (typeof window === \"undefined\") {\n return;\n }\n\n let storageData = (window as any).localStorage.getItem(key);\n if (!storageData) {\n return undefined;\n }\n\n try {\n return JSON.parse(storageData);\n } catch (e) {\n return undefined;\n }\n },\n setJSONToLocalStorage: function (key: string, data: any) {\n if (typeof window === \"undefined\") {\n return;\n }\n\n let stringifyData;\n if (data === undefined || data === null) {\n stringifyData = \"\";\n } else {\n stringifyData = JSON.stringify(data)\n }\n\n (window as any).localStorage.setItem(key, stringifyData);\n }\n};\n\nlet clientWidth, clientHeight;\n\nif (typeof window !== \"undefined\" && document) {\n clientWidth = document.documentElement.clientWidth;\n clientHeight = document.documentElement.clientHeight;\n}\n\nexport const documentClientWidth = clientWidth;\nexport const documentClientHeight = clientHeight;\n\nexport const isMobile = deviceType === \"mobile\";\nexport const isTablet = deviceType === \"tablet\";\nexport const isDesktop = deviceType === \"desktop\";\n\nexport const isMobileWidth = documentClientWidth < 768;\nexport const isTabletWidth = documentClientWidth >= 768 && documentClientWidth < 1024;\nexport const isDesktopWidth = documentClientWidth >= 1024;\n\n","import {isDesktop} from \"./env.util\";\nimport {iVideoAdConfig, iVideoAdParamMapping} from \"./imaUtil.type\";\n\nconst processParamMapping = (paramMapping: iVideoAdParamMapping, path): string => {\n // setting must be complete\n if (!paramMapping.param ||\n !Array.isArray(paramMapping.mappingKey) ||\n !Array.isArray(paramMapping.mappingValue) ||\n paramMapping.mappingKey.length !== paramMapping.mappingValue.length\n ) {\n return;\n }\n\n // find match key index\n const index = paramMapping.mappingKey.findIndex(key => {\n return location.pathname.indexOf(key) === 0;\n });\n\n // get match key's value\n if (index === -1) {\n return;\n }\n\n let out = paramMapping.mappingValue[index];\n let extensionOut;\n\n // if extension setting exists, add extension to the \"out\" value\n if (paramMapping.extensionValue) {\n switch (paramMapping.extensionValue) {\n case \"category\":\n path[0] && (extensionOut= path[0]);\n break;\n case \"section\":\n path[1] && (extensionOut= path[1]);\n break;\n case \"subSection\":\n path[2] && (extensionOut= path[2]);\n break\n }\n }\n if (extensionOut && Array.isArray(paramMapping.extensionReplaceMapping)) {\n paramMapping.extensionReplaceMapping.forEach(replaceKV=>{\n extensionOut.replace(replaceKV[0], replaceKV[1]);\n })\n }\n if (extensionOut) {\n out += extensionOut;\n }\n\n return out;\n}\n\nconst generateAdditionalParam = (paramMappings: Array, path: Array): string => {\n if (!Array.isArray(paramMappings)) {\n return \"\";\n }\n\n const params = paramMappings.map((paramMapping, ind) => {\n const paramOut = processParamMapping(paramMapping, path);\n return paramOut ? paramMapping.param + \"=\" + paramOut : \"\";\n }).filter(param => {\n return !!param;\n });\n\n return encodeURIComponent(Array.from(new Set(params)).join(\"&\"));\n}\n\nexport const formatIMAServerUrl = (videoId: string | number, videoAdConfig: iVideoAdConfig, bvodData: any): string => {\n if (Array.isArray(bvodData) && bvodData.length > 0) {\n videoAdConfig.customParams.push(...bvodData);\n }\n if (!videoId || !videoAdConfig){\n return \"\";\n }\n\n let urlString = \"https://pubads.g.doubleclick.net/gampad/ads?\" +\n \"iu=/\" +\n videoAdConfig.account + \"/\" +\n videoAdConfig.id + \"/\" +\n videoAdConfig.device + \"/\" +\n videoAdConfig.site +\n \"&description_url=\" + encodeURIComponent(location.href) +\n \"&env=vp\" +\n \"&impl=s\" +\n \"&correlator=\" +\n \"&scor==\" +\n \"&tfcd=0\" +\n \"&npa=0\" +\n \"&gdfp_req=1\" +\n \"&output=xml_vmap1_vast4\" +\n \"&sz=640x480\" +\n (videoAdConfig.companionAds.enabled ? \"&ciu_szs=\" + encodeURIComponent(videoAdConfig.companionAds.adSizes.map(size=>(Array.isArray(size) && size.join(\"x\") || size)).join(\",\")) : \"\") +\n \"&pp=\" + (isDesktop ? \"vpaid_js\" : \"ssai\") +\n \"&cmsid=\" + videoAdConfig.cmsID +\n \"&vid=\" + videoId +\n \"&unviewed_position_start=1\";\n\n\n const additionalParam = generateAdditionalParam(videoAdConfig.paramMappings, videoAdConfig.categoryPath);\n\n additionalParam && (urlString += `&cust_params=${additionalParam}`);\n \n const requestParams = videoAdConfig.requestParams;\n if (Array.isArray(requestParams)) {\n requestParams.forEach(kv => {\n if (Array.isArray(kv) && kv.length === 2 && kv[0] !== \"\" && kv[1] !== \"\") {\n urlString += `&${kv[0]}=${kv[1]}`;\n }\n })\n }\n\n if (Array.isArray(videoAdConfig.customParams) && videoAdConfig.customParams.length > 0) {\n let appendingCustomParams = videoAdConfig.customParams.map(kv=>{\n if (typeof kv[0] !== \"string\" || [undefined, null].indexOf(kv[1]) >= 0) {\n return \"\";\n }\n return `${kv[0]}=${kv[1]}`;\n }).filter(kv=>{\n return kv !== \"\";\n });\n if (appendingCustomParams.length > 0) {\n urlString += \"&cust_params=\" + encodeURIComponent(appendingCustomParams.join(\"&\"));\n }\n }\n return urlString;\n}","const isShowPage = () => {\n\n const utag_data = (window as any).utag_data;\n\n if (!utag_data.showChannel) {\n return;\n }\n if (!utag_data.showName) {\n // this is live page\n return;\n }\n return [\"ten\", \"bold\", \"peach\", \"shake\"].indexOf(utag_data.showChannel.toLowerCase()) >= 0;\n}\n\nexport function hasShowVideo() {\n return document.querySelector(\".show-video__player\") !== null;\n}\n\nexport function isCompanionAds() {\n return isShowPage() && hasShowVideo();\n}","import { PluginServicesInterface, ResourceConfigurationInterface, PluginConfigInterface, PluginInterface } from '@cbsinteractive/avia-js'\nimport { UpNextOptionInterface } from './UpNextOptionInterface';\nimport { getNextVideos } from \"../../../../../components/AviaVodContainer/utils\";\nimport { jwtMember } from '../../../player/jwt/cacheStatus';\nimport { AutoplayClass } from './enums'\nimport { iWebApiVideoData } from '../../../api/api.video.type';\nimport { videoEndPanel } from './ui-templates/videoEndPanel'\nimport { upNextCard } from './ui-templates/upNextCard';\nimport { PLAYLIST } from '@cbsinteractive/avia-js-playlist';\n\n\texport function upnext(options = {}): PluginConfigInterface {\n\t\treturn {\n\t\t\tfactory: createUpNext,\n\t\t\toptions,\n\t\t\tid: 'upnext'\n\t\t};\n\t}\n\texport const createUpNext = (services: PluginServicesInterface, options: UpNextOptionInterface): PluginInterface => {\n\t\tlet resource: ResourceConfigurationInterface;\n\t\tlet panelEnd: any;\n\t\tlet panelNext: any;\n\t\tlet nextVideos: iWebApiVideoData[] // Up next videos\n\t\t// Templates-----------\n\t\tlet videoEndPanelTemplate: string;\n\t\tlet upNextCardTemplate: string;\n\t\t// Templates-----------\n\t\tlet countdownSeconds = 5;\n\t\tlet countdownHandler: null | ReturnType = null;\n\t\tlet upNextAutoplay: string;\n\n\t\tlet isOpen = false;\n\n\t\tconst { player, dom } = services;\n\t\t\n\t\tconst vodPlayList = player.getPlugin(PLAYLIST);\n\n\t\tconst { PlayerEvent } = services.avia;\n\t\tconst container = dom.main;\n\n\n\t\tconst onContentStart = async (event:any) => {\n\t\t\tisOpen = false;\n\t\t\tkillUpNextPanel();\n\t\t\tupNextAutoplay = jwtMember.getAutoplaySetting();\n\t\t\tresource = player.resource as ResourceConfigurationInterface;\n\t\t\tnextVideos = await getNextVideos(resource.metadata.altMediaId);\n\t\t\tvideoEndPanelTemplate = videoEndPanel(nextVideos)\n\t\t\tupNextCardTemplate = upNextCard(nextVideos)\n\t\t}\n\n\t\t// Video End Panel ---------------------------------------------------------\n\n\t\tconst createVideoEndPanel = () => {\n\t\t\tvodPlayList && vodPlayList.clear();\n\t\t\tif (!resource) return;\n\t\t\tpanelEnd = document.createElement('div');\n\t\t\tpanelEnd.classList.add('up-next');\n\t\t\tpanelEnd.style.zIndex = options.level || 100;\n\t\t\tpanelEnd.innerHTML = `
${videoEndPanelTemplate}
`;\n\t\t\tpanelEnd.onclick = (event) => {\n\t\t\t\thandlePanelClick(event)\n\t\t\t}\n\t\t\tcontainer.appendChild(panelEnd);\n\n\t\t\tif (upNextAutoplay === 'false') {\n\t\t\t\thandleAutoplay(false);\n\t\t\t} else {\n\t\t\t\thandleAutoplay(true);\n\t\t\t}\n\t\t\tisFullscreenMode();\n\t\t}\n\n\t\tconst handlePanelClick = (evt:any) => {\n\t\t\tconst className = evt.target.className;\n\t\t\tconst evtIndex = parseInt(evt.target.getAttribute('data-index'), 10) + 1;\n\t\t\tconst dataIndex = evtIndex ? evtIndex : 0;\n\n\t\t\tswitch (className) {\n\t\t\t\tcase 'video-end__image':\n\t\t\t\t\tplayNextVideo(dataIndex ? dataIndex : 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'up-next__image':\n\t\t\t\t\tplayNextVideo(0);\n\t\t\t\t\twindow.tenService.pageAllocator && window.tenService.pageAllocator.track(\"UPNEXT_CLICK_BANNER\", { name: nextVideos[0].title });\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'close__button':\n\t\t\t\t\tkillUpNextPanel();\n\t\t\t\t\tisOpen = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase AutoplayClass.ON:\n\t\t\t\t\thandleAutoplay(true);\n\t\t\t\t\tbreak;\n\t\t\t\tcase AutoplayClass.OFF:\n\t\t\t\t\thandleAutoplay(false);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'exit-fullscreen__btn':\n\t\t\t\t\texitFullscreen();\n\t\t\t\t\tbreak;\n\t\t\t};\n\n\t\t};\n\n\n\n\t\tconst handleAutoplay = (autoplay: boolean) => {\n\t\t\tconst countDownContainer = document.querySelector('.countdown__text') as HTMLElement;\n\t\t\tconst offBtn = document.querySelector(`.${AutoplayClass.OFF}`);\n\t\t\tconst onBtn = document.querySelector(`.${AutoplayClass.ON}`);\n\t\t\tclearInterval(countdownHandler);\n\t\t\tjwtMember.setAutoplaySetting(autoplay);\n\t\t\tif (autoplay) {\n\t\t\t\tonBtn.classList.add('selected');\n\t\t\t\toffBtn.classList.remove('selected');\n\t\t\t\tupdateCountDownText();\n\t\t\t\tcountDownContainer && countDownContainer.classList.remove('hide');\n\t\t\t\tcountdownHandler = setInterval(updateCountdown, 1000);\n\t\t\t} else {\n\t\t\t\toffBtn.classList.add('selected');\n\t\t\t\tonBtn.classList.remove('selected');\n\t\t\t\tcountDownContainer && countDownContainer.classList.add('hide');\n\t\t\t\tcountdownSeconds = 5;\n\t\t\t};\n\t\t};\n\n\t\tconst updateCountdown = () => {\n\t\t\tif (countdownSeconds > 0) {\n\t\t\t\tcountdownSeconds--;\n\t\t\t\tupdateCountDownText();\n\t\t\t} else {\n\t\t\t\tclearInterval(countdownHandler);\n\t\t\t\tplayNextVideo(0);\n\t\t\t}\n\t\t};\n\n\t\tconst updateCountDownText = () => {\n\t\t\tconst countDownElement = document.getElementById('countdown__text') as HTMLElement;\n\t\t\tcountDownElement ? countDownElement.innerHTML = `In ${countdownSeconds} Seconds` : null;\n\t\t}\n\n\t\tconst playNextVideo = (tileIndex: number) => {\n\t\t\tservices.event.dispatchPluginEvent({ event: 'change-video', video: nextVideos[tileIndex] });\n\t\t\tkillVideoEndPanel();\n\t\t};\n\n\t\tconst killVideoEndPanel = () => {\n\t\t\tif (container && container.contains(panelEnd)) {\n\t\t\t\tcontainer.removeChild(panelEnd)\n\n\t\t\t}\n\t\t\tclearInterval(countdownHandler);\n\t\t\tcountdownSeconds = 5;\n\t\t};\n\t\t// End Video End Panel -----------------------------------------------------\n\n\n\n\t\t// Full Screen ---------------------------------------------------------------\n\t\tconst isFullscreenMode = () => {\n\t\t\tconst overlay = document.querySelector('.up-next') as HTMLElement;\n\t\t\tconst compressIcon = document.querySelector('.exit-fullscreen__btn') as HTMLElement;\n\t\t\tif (!overlay || !compressIcon) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst overlayWidth = overlay.offsetWidth;\n\t\t\tif (overlayWidth > 832) {\n\t\t\t\tcompressIcon.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\thideCompressionIcon();\n\t\t\t}\n\t\t}\n\t\tconst hideCompressionIcon = () => {\n\t\t\tconst compressIcon = document.querySelector('.exit-fullscreen__btn') as HTMLElement;\n\t\t\tcompressIcon.style.display = \"none\";\n\t\t}\n\t\tconst exitFullscreen = () => {\n\t\t\tif (document.exitFullscreen) {\n\t\t\t\tdocument.exitFullscreen();\n\t\t\t\thideCompressionIcon();\n\t\t\t};\n\t\t}\n\t\t// End Full Screen -----------------------------------------------------------\n\n\n\n\t\t// Upnext card ----------------------------------------------------------------\n\t\tconst createUpNextPanel = async () => {\n\t\t\twindow.tenService.pageAllocator && window.tenService.pageAllocator.track(\"UPNEXT_SHOW_BANNER\");\n\t\t\tpanelNext = document.createElement('div');\n\t\t\tpanelNext.classList.add('up-next-card');\n\t\t\tpanelNext.style.zIndex = options.level || 100;\n\t\t\tpanelNext.innerHTML = `
${upNextCardTemplate}
`;\n\t\t\tpanelNext.onclick = (event: any) => {\n\t\t\t\thandlePanelClick(event)\n\t\t\t}\n\t\t\tcontainer.appendChild(panelNext);\n\t\t\tisOpen = true;\n\t\t};\n\t\tconst killUpNextPanel = () => {\n\t\t\tconst element = document.querySelector('.up-next-panel') as HTMLElement;\n\t\t\tif (container && container.contains(panelNext)) {\n\t\t\t\tcontainer.removeChild(panelNext);\n\t\t\t\tisOpen = false;\n\t\t\t}\n\t\t};\n\t\t// End Upnext card ------------------------------------------------------------\n\n\n\n\t\t// Player Event Handlers ------------------------------------------------------\n\t\tconst handlePlayerEvent = async (evt) => {\n\t\t\tswitch (evt.type) {\n\t\t\t\tcase PlayerEvent.CONTENT_PROGRESS:\n\t\t\t\t\tconst contentDuration = evt.detail.contentDuration;\n\t\t\t\t\tconst contentTime = evt.detail.contentTime;\n\t\t\t\t\tif (contentDuration - contentTime <= 30 && !player.isAd ) {\n\t\t\t\t\t\t\tif(isOpen === false) {\n\t\t\t\t\t\t\t\tawait createUpNextPanel();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t} else {\n\t\t\t\t\t\tkillUpNextPanel();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase PlayerEvent.CONTENT_PAUSED:\n\t\t\t\t\tkillUpNextPanel();\n\t\t\t\t\tbreak;\n\t\t\t\tcase PlayerEvent.AD_PLAYING:\n\t\t\t\t\tkillUpNextPanel();\n\t\t\t\t\tbreak;\n\t\t\t\tcase PlayerEvent.RESOURCE_END:\n\t\t\t\t\tkillUpNextPanel();\n\t\t\t};\n\t\t};\n\n\t\tconst eventTypes = PlayerEvent;\n\t\tfor (const key in eventTypes) {\n\t\t\tplayer.on(eventTypes[key], async (event: any) => {\n\t\t\t\tawait handlePlayerEvent(event);\n\t\t\t});\n\t\t}\n\t\n\t\tplayer.on(PlayerEvent.CONTENT_START, onContentStart);\n\t\tplayer.once(PlayerEvent.CONTENT_PROGRESS, onContentStart);\n\t\tplayer.on(PlayerEvent.CONTENT_COMPLETE, createVideoEndPanel);\n\t\tplayer.on(PlayerEvent.LIVE_PRESENTATION_STOPPED, createVideoEndPanel);\n\n\t\treturn {\n\t\t\tgetId() {\n\t\t\t\treturn 'upnext';\n\t\t\t}, \n\t\t\tdestroy() {\n\t\t\t\tif (panelEnd) {\n\t\t\t\t\tpanelEnd.onclick = null;\n\t\t\t\t\tcontainer.removeChild(panelEnd);\n\t\t\t\t}\n\t\t\t\tif (panelNext) {\n\t\t\t\t\tpanelNext.onclick = null;\n\t\t\t\t\tcontainer.removeChild(panelNext);\n\t\t\t\t}\n\t\n\t\t\t\tplayer.off(PlayerEvent.RESOURCE_START, onContentStart);\n\t\t\t\tplayer.off(PlayerEvent.CONTENT_PROGRESS, onContentStart);\n\t\t\t\tplayer.off(PlayerEvent.CONTENT_COMPLETE, createVideoEndPanel);\n\t\t\t\tplayer.off(PlayerEvent.LIVE_PRESENTATION_STOPPED, createVideoEndPanel);\n\t\t\t}\n\t\t};\n\t\t// End Player Event Handlers --------------------------------------------------\n\t};","export enum AutoplayClass {\n ON = \"autoplay-on\",\n OFF = \"autoplay-off\",\n}","export const upNextCard = (nextVideos) => {\n const { title, image } = nextVideos[0];\n return `
\n
\n \n
\n

Up Next

\n ${title}\n
\n
\n \n
`\n}","export const videoEndPanel = (nextVideos) => {\n\n const videoArray = [...nextVideos];\n\tconst upNext = videoArray[0];\n\tconst moreVideos = videoArray.splice(1,4);\n const { title, airDate, description, image } = upNext;\n return `
\n
\n

Up Next In 5 Seconds

\n
\n

Autoplay:

\n \n \n
\n
\n
\n \n
\n

${title}

\n

${airDate}

\n

${description}

\n
\n
\n
\n

More For You

\n
\n ${moreVideos.map((videos, index:number) => {\n const { title, airDate, description, image } = videos;\n return `
\n \n

${title}

\n

${airDate}

\n
`\n }).join('')\n }\n\n
\n
\n
\n
`\n\n}","import type { PluginConfigInterface, PluginInterface, PluginServicesInterface, ResourceConfigurationInterface } from '@cbsinteractive/avia-js';\nimport { AviaDisplayOptionsInterface } from './AviaDisplayOptionsInterface';\n\nexport const DISPLAY = 'display';\n\nexport function display(options: Partial = {}): PluginConfigInterface {\n\treturn {\n\t\tid: DISPLAY,\n\t\tfactory: createDisplayPlugin,\n\t\toptions,\n\t};\n}\n\nexport function createDisplayPlugin(services: PluginServicesInterface, options: AviaDisplayOptionsInterface): PluginInterface {\n\tlet resource: ResourceConfigurationInterface;\n\tlet panel: any;\n\tlet listening = false;\n\n\tconst { player, dom } = services;\n\tconst { PlayerEvent } = services.avia;\n\tconst container = dom.main;\n\n\tconst onContentStart = () => {\n\t\tresource = player.resource as ResourceConfigurationInterface;\n\t\tif (panel) {\n\t\t\tpanel.remove();\n\t\t}\n\t\tif (listening) {\n\t\t\treturn;\n\t\t}\n\t\tlistening = true;\n\t};\n\n\n\tconst onResourceEnd = (event: any) => {\n\t\tif (event.detail?.playbackState === 'stopped') {\n\t\t\tpanel = document.createElement('div');\n\t\t\tpanel.classList.add('avia-display');\n\t\t\tpanel.style.zIndex = options.level || 10;\n\t\t\tpanel.innerHTML = '
';\n\n\t\t\tpanel.onclick = () => {\n\t\t\t\tif (resource?.playback) resource.playback.startTime = 0;\n\t\t\t\tplayer?.attachResource(resource);\n\t\t\t\tcontainer?.removeChild(panel);\n\t\t\t};\n\t\t\tcontainer?.appendChild(panel);\n\t\t};\n\t};\n\n\n\tconst handlePluginEvent = (evt) => {\n const {event} = evt.detail;\n\t\tif(event === \"change-video\") {\n\t\t\tkillPanel()\n\t\t}\n }\n\n\tconst killPanel = () => {\n\t\tif (panel) {\n\t\t\tpanel.remove();\n\t\t}\n\t}\n\n player.on(PlayerEvent.PLUGIN_EVENT, handlePluginEvent);\n\tplayer.on(PlayerEvent.RESOURCE_START, onContentStart);\n\tplayer.once(PlayerEvent.CONTENT_PROGRESS, onContentStart);\n\tplayer.on(PlayerEvent.PLAYBACK_STATE_CHANGE, onResourceEnd);\n\n\treturn {\n\t\tgetId() {\n\t\t\treturn DISPLAY;\n\t\t},\n\t\tdestroy() {\n\t\t\tif (panel) {\n\t\t\t\tpanel.onclick = null;\n\t\t\t\tcontainer.removeChild(panel);\n\t\t\t}\n\t\t\tplayer.off(PlayerEvent.PLUGIN_EVENT, handlePluginEvent);\n\t\t\tplayer.off(PlayerEvent.RESOURCE_START, onContentStart);\n\t\t\tplayer.off(PlayerEvent.CONTENT_PROGRESS, onContentStart);\n\t\t\tplayer.off(PlayerEvent.PLAYBACK_STATE_CHANGE, onResourceEnd);\n\t\t\tlistening = false;\n\t\t},\n\t};\n}","import {AllocatorVideo} from \"../../../pkgAviaAllocator/allocator.video\";\nimport {initTealium, initOztam} from \"../../../pkgAviaAllocator/tracking.init\";\nimport {OztamV2AviaVod} from \"./oztam.v2.aviaVod\";\nimport {TealiumAviaVod} from \"./tealium\";\nimport {iTrackingService} from \"../../../pkgAviaAllocator/tracking.conf.type\";\nimport {eLocalStorage_tenUser} from \"../../../tenMember/jwt/enum\";\nimport {trackingServiceConfig} from \"../../../pkgAviaAllocator/tracking.conf\";\n\nexport class AllocatorVod extends AllocatorVideo {\n constructor(serviceConfig: iTrackingService = trackingServiceConfig) {\n super(serviceConfig);\n this.resetTrackingService();\n }\n protected initOztam() {\n this.oztam = initOztam.bind(this)(OztamV2AviaVod);\n }\n\n protected initTealium() {\n this.tealium = initTealium.bind(this)(TealiumAviaVod);\n }\n\n protected initExtraInfo() {\n this.updateExtraInfo({\n oztam_userId: localStorage.getItem(eLocalStorage_tenUser.tu_oztamid) || \"\",\n })\n }\n}","import { PlayerEvent } from \"../../avia.lib\";\nimport { eAllocatorEvent } from \"../../../pkgAviaAllocator/allocator.video.type\";\n\nexport const allocatorVodEventMapping = typeof window === \"undefined\" ? {} : {\n // [PlayerEvent.READY]: eAllocatorEvent.LOAD,\n [PlayerEvent.RESOURCE_START]: eAllocatorEvent.LOADED_METADATA,\n\n [PlayerEvent.CONTENT_START]: eAllocatorEvent.FIRST_PLAY,\n [PlayerEvent.CONTENT_PAUSED]: eAllocatorEvent.PAUSE,\n [PlayerEvent.CONTENT_PLAYING]: eAllocatorEvent.UN_PAUSE,\n [PlayerEvent.CONTENT_PROGRESS]: eAllocatorEvent.PROGRESS,\n [PlayerEvent.CONTENT_COMPLETE]: eAllocatorEvent.COMPLETE,\n\n [PlayerEvent.SEEK_START]: eAllocatorEvent.SEEKING,\n [PlayerEvent.SEEK_COMPLETE]: eAllocatorEvent.SEEKED,\n\n [PlayerEvent.AD_START]: eAllocatorEvent.AD_BEGIN,\n [PlayerEvent.AD_COMPLETE]: eAllocatorEvent.AD_COMPLETE,\n [PlayerEvent.AD_BREAK_START]: eAllocatorEvent.AD_BREAK_START,\n [PlayerEvent.AD_BREAK_COMPLETE]: eAllocatorEvent.AD_BREAK_END,\n [PlayerEvent.AD_PAUSED]: eAllocatorEvent.AD_PAUSE,\n [PlayerEvent.AD_PLAYING]: eAllocatorEvent.AD_RESUME,\n ['beforeunloadpage']: eAllocatorEvent.BEFORE_UNLOAD_PAGE,\n [PlayerEvent.RESOURCE_END]: eAllocatorEvent.BEFORE_CHANGE_SOURCE,\n [PlayerEvent.PLAYBACK_SUSPENDED]: eAllocatorEvent.BEFORE_UNLOAD_PAGE,\n} ","import {OzTamV2} from \"../../../pkgAviaAllocator/oztam.v2\";\n\nexport class OztamV2AviaVod extends OzTamV2 {\n\n}","import {TealiumAvia} from \"../../player/track/tealium\";\nimport {eUtag} from \"../../../ten/env.utag\";\n\nexport class TealiumAviaVod extends TealiumAvia {\n private watchPercentageCounter = new WatchPercentageCounter([0.25, 0.5, 0.9]);\n\n public watchedPercentage(watchedPercentage: number) {\n if (typeof window !== \"undefined\"){\n const eventPercentage = this.watchPercentageCounter.shouldTrack(watchedPercentage);\n\n if(!this.mediaInfo) {\n return;\n }\n \n if (eventPercentage) {\n let tealiumData = (window as any).TealiumData || {};\n this.mediaTrackingInfo = this.getGeneralData(this.mediaInfo);\n this.mediaTrackingInfo[eUtag.showProgramClassification] = tealiumData.showProgramClassification || \"\";\n this.mediaTrackingInfo[eUtag.tealium_event] = `video_watched_${eventPercentage * 100}`;\n this.push(()=>{\n this.utag.track(\"link\", this.mediaTrackingInfo);\n })\n }\n }\n }\n}\n\nclass WatchPercentageCounter {\n private trackedPercentage = 0;\n\n constructor(private breakpoints: Array) {\n\n }\n\n public shouldTrack(watchedPercentage) {\n let shouldTrackBreakpoint = this.breakpoints.find(breakpoint => {\n return this.trackedPercentage < breakpoint && watchedPercentage > breakpoint;\n });\n\n if (shouldTrackBreakpoint) {\n this.trackedPercentage = watchedPercentage;\n return shouldTrackBreakpoint;\n }\n }\n}","export enum VPEnums {\n CONTENT_TYPE = \"application/json\",\n INPUT_DURATION = 120000,\n INTERVAL_DURATION = 300000,\n END_INTERVAL = 10000,\n THRESHHOLD_SECONDS = 30,\n}\n\nlet progressApiTmp = {\n FETCH_URL: `/api/video-progress`,\n REFRESH_URL: `/api/token/refresh`,\n};\nif (typeof window !== \"undefined\") {\n progressApiTmp = {\n FETCH_URL: `${window.apiUrl}/api/video-progress`,\n REFRESH_URL: `${window.apiUrl}/api/token/refresh`,\n }\n}\n\nexport const progressApi = progressApiTmp;","import {VPQuery} from './VideoProgressManagerQuery';\nimport {VPEnums} from './VideoProgressEnums';\nimport {jwtMember} from \"../../../tenMember/jwt/cacheStatus\";\nimport {tVideoProgressItem, tVideoProgressObj} from \"./VideoProgressManager.type\";\nimport Timeout = NodeJS.Timeout;\nimport {iPlayer} from \"../../player/playerCtrl.type\";\nimport {eJwtRefreshToken, jwtRefreshToken} from \"../../../tenMember/jwt/api/jwtToken\";\n\nexport class VideoProgressManager {\n /**\n *\n * every page load this class will fetch user progress list, and let other components know\n *\n */\n static needSync: boolean = typeof window !== \"undefined\" && !!jwtMember.isLoggedIn();\n static requestedTimestamp: number = 0;\n static progressObj: tVideoProgressObj;\n\n static async getVideoProgress(urlCode: string): Promise {\n await VideoProgressManager.getAllProgress();\n\n let {progressObj} = VideoProgressManager;\n if (Array.isArray(progressObj) === false || progressObj.length === 0) {\n return 0;\n }\n\n const progressItem = progressObj.find(obj => {\n return obj.videoCode === urlCode;\n });\n \n return progressItem ? progressItem.progress : 0;\n }\n\n static async getAllProgress(): Promise {\n const tokenRefreshResult = await jwtRefreshToken();\n if (tokenRefreshResult !== eJwtRefreshToken.active) {\n VideoProgressManager.progressObj = [];\n } else {\n if (VideoProgressManager.progressObj === undefined || VideoProgressManager.progressObj.length === 0) {\n const nowTimestamp = Date.now();\n if (nowTimestamp - VideoProgressManager.requestedTimestamp > 5 * 60 * 1000) {\n VideoProgressManager.requestedTimestamp = nowTimestamp;\n VideoProgressManager.progressObj = await VPQuery.fetchVideoProgress() || [];\n } else {\n return new Promise((resolve, reject) => {\n const getProgressInterval = setInterval(()=>{\n if (VideoProgressManager.progressObj) {\n clearInterval(getProgressInterval);\n resolve(VideoProgressManager.progressObj);\n } else if (VideoProgressManager.progressObj === null) {\n clearInterval(getProgressInterval);\n reject()\n }\n }, 100)\n })\n }\n }\n }\n return VideoProgressManager.progressObj || [];\n }\n\n /*\n *\n * Class props\n *\n * */\n private _urlCode: string;\n //private _showUrlCode: string;\n private _currentProgressItem: tVideoProgressItem;\n private _prevSyncTimestamp: number;\n private _endProgressFired: boolean = false;\n\n constructor(private _player: iPlayer) {\n if (VideoProgressManager.needSync === false) {\n return;\n }\n this._interactionWatcher();\n this._syncIntervalWatcher();\n this._closeToEndWatcher();\n }\n\n /*\n *\n * Constructing logic - per player instance\n *\n * */\n private _interactionWatcher() {\n this._prevSyncTimestamp = Date.now();\n const timeChecking = this._checkTimer.bind(this);\n window.addEventListener('mousemove', timeChecking, false);\n window.addEventListener('keypress', timeChecking, false);\n }\n\n private _checkTimer() {\n const dateNow = Date.now();\n if (dateNow - this._prevSyncTimestamp > VPEnums.INPUT_DURATION) {\n this._prevSyncTimestamp = dateNow;\n this._syncProgress();\n }\n }\n\n /*\n *\n * progress sync logic - per Video\n *\n * */\n\n public async initVideoWatcher(urlCode: string) {\n this._resetWatcher();\n\n if (typeof urlCode !== \"string\") {\n return;\n }\n\n this._urlCode = urlCode;\n //this._showUrlCode = showUrlCode;\n await this._registerCurrentProgress();\n this._syncIntervalWatcher();\n this._closeToEndWatcher();\n }\n\n private _resetWatcher() {\n clearInterval(this._syncingWatchInterval);\n clearInterval(this._closeToEndInterval);\n this._urlCode = undefined;\n //this._showUrlCode = undefined;\n this._currentProgressItem = undefined;\n this._prevSyncTimestamp = Date.now();\n this._endProgressFired = false;\n }\n\n private async _registerCurrentProgress() {\n await VideoProgressManager.getAllProgress();\n const {progressObj} = VideoProgressManager;\n if (\n Array.isArray(VideoProgressManager.progressObj) &&\n VideoProgressManager.progressObj.length > 0\n ) {\n this._currentProgressItem = progressObj.find(progress => progress.videoCode === this._urlCode);\n //this._currentProgressItem.ParentCode = this._showUrlCode;\n }\n if (!this._currentProgressItem) {\n this._currentProgressItem = {\n videoCode: this._urlCode,\n progress: 0,\n //ParentCode: this._showUrlCode,\n }\n progressObj.push(this._currentProgressItem);\n }\n }\n\n private _syncingWatchInterval: Timeout;\n private _syncIntervalWatcher() {\n this._syncingWatchInterval = setInterval(() => {\n this._syncProgress();\n }, VPEnums.INTERVAL_DURATION);\n }\n\n // Send progress if the video is 95% complete or less than 1 minute from the end\n private _closeToEndInterval: Timeout;\n private _closeToEndWatcher() {\n this._closeToEndInterval = setInterval(() => {\n const progressSecs = Math.round(this._player?.currentTime());\n const durationSecs = Math.round(this._player?.video?.duration);\n const durationThreshold = durationSecs - VPEnums.THRESHHOLD_SECONDS;\n \n if (progressSecs > durationThreshold) {\n if (this._endProgressFired === false) {\n this._syncProgress();\n this._endProgressFired = true;\n }\n } else {\n this._endProgressFired = false;\n }\n }, VPEnums.END_INTERVAL);\n }\n\n /**\n * Progress sync logic\n */\n private async _syncProgress() {\n const tokenRefreshResult = await jwtRefreshToken();\n if (tokenRefreshResult === eJwtRefreshToken.active) {\n // different player lib have different method to get current position/progress\n const msProgress = this._player.currentTime() * 1000;\n if (msProgress > 0) {\n this._prevSyncTimestamp = Date.now();\n this._currentProgressItem.progress = Math.floor(msProgress);\n VPQuery.syncServerProgress(this._currentProgressItem);\n }\n }\n }\n}","import {progressApi, VPEnums} from './VideoProgressEnums';\nimport { eLocalStorage_tenUser_token as token } from '../../../tenMember/jwt/enum';\nimport { jwtMember } from \"../../../tenMember/jwt/cacheStatus\";\nimport {tVideoProgressObj} from \"./VideoProgressManager.type\";\nexport namespace VPQuery {\n export async function fetchVideoProgress(): Promise {\n let progressObj: tVideoProgressObj;\n if(jwtMember.isLoggedOut() == true) {\n return;\n }\n try {\n let header = getHeaders();\n const resp = await fetch(progressApi.FETCH_URL, {\n headers: header,\n });\n progressObj = await resp.json();\n\n return progressObj;\n } catch (err) {\n console.error(err);\n return null;\n }\n }\n\n export function syncServerProgress(videoObject) {\n if(jwtMember.isLoggedOut() == true) {\n return;\n }\n try {\n let header = getHeaders();\n fetch(progressApi.FETCH_URL, {\n method: \"POST\",\n body: JSON.stringify(videoObject),\n headers: header,\n });\n } catch (err) {\n console.error(err);\n }\n }\n\n function getHeaders() {\n let authToken = localStorage.getItem(token.tu_accesstoken);\n let tenAuth = localStorage.getItem(token.tu_refreshtoken);\n return {\n \"Authorization\": `Bearer ${authToken}`,\n \"Content-Type\": `${VPEnums.CONTENT_TYPE}`,\n \"X-Network-Ten-Auth\": tenAuth,\n };\n }\n}\n","import { TextCuepointEventDetailInterface, TextCuepointInterface, VideoPlayerInterface, PlayerEvent } from \"@cbsinteractive/avia-js\";\nimport { deviceType } from \"../../player/util/device\";\n\nexport function videoTextTrackManager(player) {\n this.player = player\n let textTrackContainer = document.querySelector('.textTrackContainer');\n let textTrackStartTime = 0\n let textTrackEndTime = 0\n let ccText = ''\n let textTrackElement = null;\n let textTrackElementCount = 0;\n let textTrackEnabled = false;\n let ticker = null; \n player.on(PlayerEvent.TEXT_TRACK_AVAILABLE, (event: CustomEvent) => {\n localStorage.getItem('textTrackEnabled') === 'true' ? textTrackEnabled = true : textTrackEnabled = false;\n if(!textTrackEnabled) return;\n player.textTrackEnabled = true;\n });\n\n player.on(PlayerEvent.TEXT_TRACK_ENABLED_CHANGE , (event: CustomEvent) => {\n localStorage.setItem('textTrackEnabled', event.detail.textTrackEnabled.toString());\n textTrackEnabled = event.detail.textTrackEnabled;\n if(!textTrackEnabled) {\n removeTextTrackElement();\n }\n });\n\n player.on(PlayerEvent.FULLSCREEN_CHANGE, (event: CustomEvent) => {\n if( deviceType === 'mobile') return;\n if(event.detail.fullscreen) {\n showTextTrackElement();\n }\n });\n\n player.on(PlayerEvent.ACTIVE_STATE_CHANGE, (event: CustomEvent) => {\n if(event.detail.activeState === 'active') {\n textTrackContainer.style.height = '86%';\n }else {\n textTrackContainer.style.height = '100%';\n } \n });\n\n\n this.updateTextTrack = (textCuePoint : TextCuepointEventDetailInterface) => {\n if( deviceType === 'mobile') return;\n if(!textTrackEnabled) return;\n const activeCue = textCuePoint.activeCues;\n if (activeCue.length === 0) {\n removeTextTrackElement();\n return;\n }\n Array.from(activeCue).forEach((cue: TextCuepointInterface) => {\n const { startTime, endTime, text } = cue;\n textTrackStartTime = startTime;\n textTrackEndTime = endTime;\n ccText = text;\n createTextTrackElement(textTrackStartTime, textTrackEndTime);\n });\n }\n\n const tickerCountDown = function(startTime: number, endTime:number, elementId:string) {\n let timeDifference = endTime * 1000 - startTime * 1000;\n const element = document.getElementById(elementId);\n if(!element) return;\n let ticker = setTimeout(() => {\n element.parentElement.remove();\n clearTimeout(ticker);\n }, timeDifference);\n\n player.on(PlayerEvent.CONTENT_PAUSED, () => {\n clearTimeout(ticker);\n });\n\n player.on(PlayerEvent.SEEK_START, () => {\n removeTextTrackElement();\n });\n \n }\n\n\n const createTextTrackElement = function( startTime:number, endTime:number) {\n if(!textTrackContainer) return;\n if(textTrackContainer.hasChildNodes) {\n removeTextTrackElement();\n }\n\n const cssBoxContainer = document.createElement('div');\n cssBoxContainer.classList.add('cc-box-container');\n textTrackContainer.appendChild(cssBoxContainer);\n\n cssBoxContainer.style.width = '80%';\n cssBoxContainer.style.height = 'auto';\n cssBoxContainer.style.left = '10%';\n\n const cssBoxInner = document.createElement('div');\n cssBoxInner.setAttribute('id', `cc-${textTrackElementCount}-box-inner`);\n cssBoxInner.classList.add('cc-box-inner');\n cssBoxContainer.appendChild(cssBoxInner);\n\n const textTrack = document.createElement('div');\n textTrack.classList.add('cc-container');\n textTrack.setAttribute('starttime', startTime.toString());\n textTrack.setAttribute('endtime', endTime.toString());\n textTrack.innerHTML = ccText;\n textTrack.style.backgroundColor = 'rgba(0,0,0,0.7)';\n textTrack.style.fontWeight = 'normal';\n textTrack.style.display = 'flex';\n textTrack.style.color = 'rgb(255,255,255)';\n textTrack.style.fontSize = '1.5rem';\n \n textTrackElement = textTrack;\n cssBoxInner.appendChild(textTrack);\n tickerCountDown(startTime, endTime, `cc-${textTrackElementCount}-box-inner`);\n updateTextTrackFontSize();\n if(window === undefined) return;\n window.addEventListener('resize', updateTextTrackFontSize);\n }\n\n const showTextTrackElement = function() {\n const ccBoxContainer = document.querySelector('.cc-box-container');\n if (ccBoxContainer) {\n ccBoxContainer.style.display = 'flex';\n }\n }\n\n const hideTextTrackElement = function() {\n const ccBoxContainer = document.querySelector('.cc-box-container');\n if (ccBoxContainer) {\n ccBoxContainer.style.display = 'none';\n }\n }\n\n const removeTextTrackElement = function() {\n const ccBoxContainer = document.querySelector('.cc-box-container');\n if (ccBoxContainer) {\n ccBoxContainer.remove();\n clearTimeout(ticker);\n }\n }\n\n const updateTextTrackFontSize = function() {\n if(deviceType === 'mobile') return;\n const videoPlayerWidth = player.video.offsetWidth;\n const desiredFontSize = videoPlayerWidth * 0.03; // Adjust the factor as needed\n textTrackElement.style.fontSize = `${desiredFontSize}px`;\n }\n}\n\n\n\n\n","/**\n * This class requires the following objects to be available in the window object\n * - window.tenService.ads = new AdManager(env.adsServiceConfig); (PageBase.js)\n * - window.vtg - (comes from tealuim)\n * - window.adsStatus - (ads.js)\n */\n\nimport React from 'react';\nimport queryString from 'query-string';\nimport {iPlayer, playerEventMappable, playerEventStateMap, PlayerStates} from '../player/playerCtrl.type';\nimport {OverlayFactory} from '../player/overlayFactory';\nimport {iPlaybackInfoApiType, iUapApiVideoData, iWebApiVideoData} from \"../api/api.video.type\";\nimport {ApiVideo} from \"../api/api.video\";\nimport {iVodCtrlProps, iVodCtrlState} from \"./vodCtrl.type\";\nimport {tOverlayFactory, tOverlays} from \"../player/overlayTemplate.type\";\nimport {vodCreatePlayer} from \"./vodCtrl.util\";\nimport {tenTrack} from \"../../tenTrack/track.init\";\nimport {VideoProgressManager} from \"./util/VideoProgressManager\";\nimport {eLocalStorage_tenUser} from \"../../tenMember/jwt/enum\";\nimport { Autoplay, createResourceConfig, ErrorCode,PlaybackState, ErrorMessage, ErrorCategory, PlayerEvent, removeVideoPlayer, ResourceConfigurationInterface, ResourceAdInterface, VideoFormat, ResourceLocationDrmInterface, ResourceLocationInterface } from '@cbsinteractive/avia-js';\nimport { eAllocatorEvent } from \"../../pkgAviaAllocator/allocator.video.type\";\nimport {allocatorVodEventMapping} from \"./track/allocatorVod.type\";\nimport {AllocatorVod} from \"./track/allocatorVod\";\nimport {PlayerCtrl} from \"..\";\nimport {TealiumAviaVod} from \"./track/tealium\";\nimport {iVideoAdConfig, iVideoAdRequestParams} from \"../player/util/imaUtil.type\";\nimport {jwtMember} from \"../player/jwt/cacheStatus\";\nimport {eLocalStorage_tenUser_info} from \"../player/jwt/enum\";\nimport {formatIMAServerUrl} from \"../player/util/imaUtil\";\nimport {isCompanionAds} from \"../player/util/isShow\";\nimport {detectBrowser, isDesktop} from \"../player/util/env.util\";\nimport {TrackJS} from \"trackjs\";\nimport { iTrackingOztamConfig } from \"../../pkgAviaAllocator/tracking.conf.type\";\nimport { UUID_v4, getUserIp } from \"../../pkgAviaAllocator/util\";\nimport { trackingServiceConfig } from \"../../pkgAviaAllocator/tracking.conf\";\nimport { env } from \"../../pkgAviaAllocator/tracking.env\";\nimport { videoTextTrackManager } from './util/VideoTextTrackManager';\nimport { VODPayload } from './vodCtrl.type';\nimport { iOzTamTrackingMeta_Media, iOzTamTrackingMeta_Config, DeviceType } from '../../pkgAviaAllocator/oztam.v2.lib';\nimport { deviceType, detectDeviceType } from '../../@util/device';\nimport { iMediaInfo } from '../../pkgAviaAllocator/allocator.video.type';\nimport {AuthenticatedEndpointHandler} from '../api/api.bvod';\nimport { IMSAPIIntegration, IMSResponse } from '../../tenAds/freeWheelManager';\nimport { checkUserFlag, markAdOps } from '../../@util/userFlag';\nimport { generateGoogleAdTagParams } from '../player/player.utls';\nimport { iBVodData } from '../player/player.util.type';\n\nexport class VodCtrl extends PlayerCtrl {\n readonly _adLoadTimeout = 12000;\n\n private _noAds: boolean;\n private _progressMag: VideoProgressManager;\n private _videoInfo: iUapApiVideoData;\n private _video: iWebApiVideoData;\n private _isFirstPlay: boolean = false;\n private adEventData = {};\n private playBackInfo: iPlaybackInfoApiType;\n private _oztamServiceConfig: iTrackingOztamConfig = undefined;\n private lastPausedTimestamp: number;\n private isDaiEnabled: boolean = true;\n private textTrackManager;\n private mediaInfo: iMediaInfo;\n private userIp: string;\n private isFlagged: boolean;\n private globalSettings: { [key: string]: any };\n private globalFWEnable: boolean;\n \n\n private playerMuted: boolean;\n bvodApiKey: string;\n bvodPublisherName: string;\n authHandler: AuthenticatedEndpointHandler;\n freeWheelEnabled: boolean;\n qs: queryString.ParsedQuery;\n upNextPlaying: boolean;\n private imsAPI: IMSAPIIntegration;\n private rolloutPercentage: number;\n\n constructor(props: iVodCtrlProps) {\n super(props);\n this.markAdOperations();\n this.playerContainerId = props.playerId;\n this._oztamServiceConfig = this.setOztamConfig();\n this.bvodApiKey = '///adjust.bouncing.flame';\n this.bvodPublisherName = 'TEN';\n this.playerMuted = false;\n this.qs = queryString.parse(window.location.search);\n this.authHandler = new AuthenticatedEndpointHandler(this.bvodApiKey, this.bvodPublisherName);\n this.playBackInfo = {} as iPlaybackInfoApiType;\n this.upNextPlaying = false;\n this.imsAPI = new IMSAPIIntegration('https://fms.viacomcbs.digital');\n this.globalSettings = props.globalSettings || {};\n this.globalFWEnable = props.globalSettings?.experiments?.[\"Freewheel Enabled\"]?.enabled ?? false;\n this.rolloutPercentage = props.globalSettings?.experiments?.[\"Freewheel Enabled\"]?.rolloutPercentage ?? 0;\n this.isFlagged = this.initializeUserFlag(this.rolloutPercentage);\n this.freeWheelEnabled = this.globalFWEnable && this.isFlagged;\n\n\n this.state = {\n playerState: PlayerStates.PreInitialize,\n overlay: undefined,\n remainingString: '',\n textCuepoint: '',\n drmEnabled: false,\n };\n }\n\n async componentDidMount() {\n if (typeof window === 'undefined') return;\n try {\n const userIp = await getUserIp() as string;\n this.userIp = userIp;\n } catch (error) {\n this.userIp = '';\n console.warn('Failed to get user IP:', error);\n }\n await this._createPlayer();\n await this._updatePlayerState(PlayerStates.PreInitialize);\n await this.initPlayer(this.props.video);\n this.addBeforeUnloadListener();\n window.addEventListener('userLogin', this.handleUserLogin);\n }\n\n componentWillUnmount() {\n removeVideoPlayer(this.props.playerId);\n window.removeEventListener('userLogin', this.handleUserLogin);\n }\n\n private handleUserLogin = async (event) => {\n this.imsAPI.invalidateCache();\n this.imsAPI.logFreewheelDebug('Received userLogin event:', event);\n }\n\n async componentDidUpdate(prevProps) {\n if(prevProps.video !== this.props.video) {\n await this._updatePlayerState(PlayerStates.PreInitialize);\n await this.initPlayer(this.props.video);\n }\n }\n\n initializeUserFlag(percent: number): boolean {\n if (percent < 1) {\n return false; \n }\n try {\n return checkUserFlag(percent);\n } catch (error) {\n console.error('Failed to check user flag:', error);\n return false;\n }\n }\n\n markAdOperations() {\n try {\n markAdOps();\n } catch (error) {\n console.error('Failed to mark ad operations:', error);\n }\n }\n\n render() {\n return (\n
\n {this.state.overlay &&
{this.state.overlay}
}\n
\n
\n );\n }\n\n /*\n * overlays\n * */\n private _overlayFactories(): tOverlays {\n return {...OverlayFactory};\n }\n\n private _changeResource = (data) => {\n const { video } = data;\n this.props.videoChangeHandler && this.props.videoChangeHandler(video);\n }\n\n /*\n * Check video access permission then init player\n * */\n public initPlayer = async (newVideo: iWebApiVideoData) => {\n if (typeof window === 'undefined') return;\n this._video = newVideo;\n \n this._noAds = typeof this.qs.noads === 'string' && this.qs.noads.toLowerCase() === 'true';\n if (this._allocator) {\n this._allocator.resetTrackingService();\n }\n \n\n if (this._isFirstPlay) {\n this._isFirstPlay= false\n }\n\n const noAds = this.props.disableAds || this._noAds;\n if (await this._playerShouldBeBlocked() === undefined) {\n if (noAds) {\n await this._updateVideoNoAds();\n } else {\n await this._updateVideo();\n }\n }\n\n this._video && this._progressMag.initVideoWatcher(this._video.urlCode);\n }\n\n /*\n * For blocking video access cases\n * */\n protected async _deniedAdBlocker() {\n await this._updatePlayerState(PlayerStates.AdBlockerOn);\n }\n\n protected async _deniedGeoBlocker() {\n await this._updatePlayerState(PlayerStates.GeoBlocked);\n }\n\n protected async _deniedWindows7(){\n const {_video} = this;\n const {videoId, urlCode} = _video;\n TrackJS.console.error(`VideoId:${videoId} - UrlCode:${urlCode} User using unsupported OS`);\n await this._updatePlayerState(PlayerStates.DetectWindows7)\n }\n\n /*\n * Player creation\n * */\n private async _createPlayer() {\n if(typeof window === 'undefined') return;\n const {playerId, autoplay, video, globalSettings} = this.props;\n await vodCreatePlayer({\n containerId: this.playerContainerId,\n playerId,\n video,\n globalSettings,\n autoplay: Autoplay.ATTEMPT_UNMUTED_THEN_MUTED,\n onPlayerReady: this._onPlayerReady,\n }).then((player) => {\n this.player = player;\n this._onPlayerReady(player);\n }).catch ((error) => {\n this._logger.error('Failed to create player', error)\n });\n this._allocator = new AllocatorVod();\n }\n\n /*\n * Player switch video\n * */\n private async _updateVideo() {\n this.setOztamConfig();\n this._oztamServiceConfig.sessionId = UUID_v4();\n let videoResource = await this._getVideoResource(),\n adResource = await this._getAdResource();\n this.player.attachResource({...videoResource, ...adResource});\n }\n\n private async _updateVideoNoAds() {\n const resource = await this._getVideoResource(); // refreshes the player\n this.player.attachResource(resource);\n }\n\n private async _getVideoResource() {\n const {_video} = this;\n const {videoId, urlCode, showId} = _video;\n \n let playbackInfo: iPlaybackInfoApiType | undefined,\n videoInfo: iUapApiVideoData | undefined;\n \n try {\n const [playbackInfoResponse, videoInfoResponse] = await Promise.all([\n ApiVideo.getPlaybackInfo(urlCode, this.freeWheelEnabled, true),\n ApiVideo.getVideoUapInfo(urlCode),\n ]).then(response => {\n return response;\n })\n \n playbackInfo = playbackInfoResponse;\n videoInfo = videoInfoResponse;\n \n this.setState({ \n drmEnabled: playbackInfo?.drm?.enabled || false\n });\n \n } catch (err) {\n this._logger.error('error fetching video info' + JSON.stringify(err));\n }\n \n if (!playbackInfo || !videoInfo) {\n await this._updatePlayerState(PlayerStates.ErrorFetchingVideo);\n return;\n }\n \n this._videoInfo = videoInfo;\n this.playBackInfo = playbackInfo;\n \n const {source = ''} = playbackInfo;\n const myResource = createResourceConfig();\n const progressDuration = (await VideoProgressManager.getVideoProgress(urlCode) / 1000) || 0;\n const videoPercentage = Math.round((100 / (videoInfo.duration || 1)) * progressDuration);\n const cleanTextTrackUrl = videoInfo.captionUrl ? `${window?.apiUrl}${videoInfo.captionUrl.replace(/^.*\\/\\/[^\\/]+/, '')}` : '';\n const { programClassification, showRatingClassification, displayOverlay, consumerAdvice, airDate, genre, memberGated, title, urlCode: propUrlCode } = this.props.video;\n const classification = programClassification ? programClassification.toUpperCase() : showRatingClassification?.toUpperCase() || '';\n \n const resourceDuration = videoInfo.duration || 0;\n \n if (progressDuration > 30 && progressDuration < resourceDuration - 30) {\n myResource.playback.startTime = progressDuration;\n }\n \n if(videoPercentage >= 95 || progressDuration >= resourceDuration - 30){\n myResource.playback.startTime = 0;\n };\n \n myResource.location.mediaUrl = source;\n myResource.location.textTrackUrl = cleanTextTrackUrl;\n \n myResource.metadata = {\n videoIdForTracking: videoId,\n videoIdForAdCalls: videoId,\n };\n \n if (this._videoInfo) {\n myResource.metadata = {\n ...myResource.metadata,\n videoId,\n altMediaId: this._videoInfo.id || '',\n seriesId: this._videoInfo.seriesCrid || '',\n episodeId: this._videoInfo.episodeCrid || '',\n seriesName: this._videoInfo.tvShow || '',\n episodeName: `${this._videoInfo.clipTitle || ''}${this._videoInfo.episode || ''}`,\n channel: this._videoInfo.tvChannel || '',\n classification,\n duration: this._videoInfo.duration || 0,\n deviceId: tenTrack.deviceId || '',\n demo1: localStorage.getItem(eLocalStorage_tenUser.tu_oztamid) || undefined,\n consumerAdvice: consumerAdvice || this._videoInfo.consumerAdvice || '',\n displayOverlay: displayOverlay || false,\n airDate: airDate || '',\n genre: genre || '',\n memberGated: memberGated || false,\n title: title || '',\n urlCode: propUrlCode || '',\n };\n }\n \n return myResource as ResourceConfigurationInterface;\n }\n\n public async getVODFields() {\n const userId = localStorage.getItem(eLocalStorage_tenUser.tu_oztamid);\n const timestamp = new Date();\n const metadata = PlayerCtrl.convertToVideoTrackObj(this._videoInfo, this.mediaInfo, this._oztamServiceConfig.sessionId);\n const userAgent = typeof window !== 'undefined' ? window.navigator.userAgent : '';\n const vodPayload = {\n AdEventId: null,\n DeviceId: tenTrack.deviceId || '',\n DeviceType: detectDeviceType() || '',\n Genre: metadata.video.ShowGenre || null,\n IpAddress: this.userIp || '',\n MediaId: metadata.custom_fields.alt_media_id || '',\n MediaType: 'vod',\n PublisherId: metadata.publisher_id || '',\n PublisherName: 'TEN',\n RegistrationId: userId || '',\n SessionId: this._oztamServiceConfig.sessionId || '',\n TimeStamp: timestamp.toISOString() || '', \n UserAgent: userAgent || null, \n VendorVersion: this._oztamServiceConfig.vendorVersion || '',\n };\n return vodPayload;\n }\n\n \n\n private async _getAdResource() {\n const utag_data = (window as any).utag_data;\n const retrievedLocalStorageState = localStorage.getItem(\"tu_geo\") || '';\n const isIos = /iPad|iPhone|iPod/.test(navigator.userAgent);\n \n const handleVODData = async () => { \n if (utag_data.memberLoginStatus === 'logged-out') return [];\n try {\n const data = await this.getVODFields();\n const response = await this.authHandler.postAuthenticatedData('/auth', data);\n const { data: responseData } = response;\n const BvodArray = this.authHandler.mapBvodDataToOztamParams(responseData);\n return BvodArray;\n } catch (error) {\n console.error(\"Error handling VOD data: \", error);\n return [];\n }\n };\n \n const generateCustomParams = (customParams) => {\n if (Array.isArray(customParams) && customParams.length > 0) {\n let appendingCustomParams = customParams.map(kv => {\n if (typeof kv[0] !== \"string\" || [undefined, null].indexOf(kv[1]) >= 0) {\n return \"\";\n }\n return `${kv[0]}=${kv[1]}`;\n }).filter(kv => {\n return kv !== \"\";\n });\n return appendingCustomParams.join('&');\n }\n }\n \n const generateRequestParams = (requestParams) => {\n let reqParams = {} as iVideoAdRequestParams;\n if (Array.isArray(requestParams)) {\n requestParams.forEach(kv => {\n if (Array.isArray(kv) && kv.length === 2 && kv[0] !== \"\" && kv[1] !== \"\") {\n reqParams[kv[0]] = kv[1];\n }\n });\n }\n return reqParams;\n }\n\n const signature = this.playBackInfo.streamSignature\n const daiAuthToken = this.playBackInfo.daiAuthToken;\n \n const bvodData = await handleVODData();\n\n const transformedData: iBVodData[] = bvodData.map(([Demo, BvodId]) => ({\n Demo,\n BvodId,\n }));\n\n /* Freewheel */\n\n const commonParams = {\n gr: jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_gr],\n ge: jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_ge],\n state: localStorage.getItem(\"tu_geo\") || '',\n collection: Array.isArray((window as any).utag_data.videoContentCategories) ? (window as any).utag_data.videoContentCategories : [],\n genre: Array.isArray((window as any).utag_data.showGenres) ? (window as any).utag_data.showGenres : [],\n pcode: jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_memberPostcode],\n session: this._oztamServiceConfig.sessionId,\n sub: jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_n10adId],\n tvid: localStorage.getItem(\"tvid_callback\"),\n oztamozsid: this._oztamServiceConfig.sessionId,\n };\n\n let fwParamsToSpread = {};\n if (this.freeWheelEnabled) {\n const fwParameters = await this.fetchIMSDataAndLog();\n const csidPrefix = 'intllocal_tenplay_au';\n const platform = isDesktop ? 'desktop_web' : 'mobile_web';\n\n if (!csidPrefix || !platform) {\n TrackJS.track({\n message: '🔍️ ~ csidPrefix or platform is not defined',\n csidPrefix,\n platform\n });\n }\n\n const imafw_csid = `${csidPrefix}_${platform}_vod`;\n\n if (!imafw_csid) {\n TrackJS.track({\n message: '🔍️ ~ Missing imafw_csid',\n csidPrefix,\n platform\n });\n }\n\n const adParams = {\n ...commonParams,\n };\n\n const additionalParams = {\n video: this._videoInfo,\n plabackInfo: this.playBackInfo,\n miscData: {\n imafw_csid: imafw_csid,\n imafw__fw_continuous_play: this.upNextPlaying ? 1 : 0,\n imafw_mode : 'vod',\n },\n };\n \n const freeWheelParams = generateGoogleAdTagParams( transformedData, { enableFreeWheel: this.freeWheelEnabled }, this._video.videoId || \"\", this.playBackInfo?.dai?.contentSourceId || \"\", fwParameters?.fms_params, adParams, additionalParams); \n fwParamsToSpread = Object.keys(freeWheelParams).reduce((object, key) => {\n if (freeWheelParams[key] != null) {\n object[key] = freeWheelParams[key];\n }\n return object;\n }, {});\n }\n /* End */\n\n \n // CASI ad config\n const videoAdConfig: iVideoAdConfig = {\n \n companionAds: {\n enabled: isCompanionAds(),\n adSizes: [[300, 250], [728, 90], [4, 1]],\n },\n \n account: \"8264\", \n id: \"vau-ten\",\n device: isDesktop ? \"desktop\" : \"mobile_web\",\n site: \"tenplay\",\n cmsID: this.playBackInfo?.dai?.contentSourceId || \"\",\n customParams: [\n ...Object.entries(commonParams),\n ...await handleVODData()\n ],\n // ...(!this.freeWheelEnabled && {\n // customParams: [\n // ...Object.entries(commonParams),\n // ...await handleVODData()\n // ]\n // }),\n requestParams: [\n [\"ppid\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_n10adId]],\n ]\n };\n\n // SSAI ad config\n const {account, id, device, site, cmsID, requestParams, customParams} = videoAdConfig;\n const custPram = generateCustomParams(customParams);\n const reqParams = generateRequestParams(requestParams);\n const isSafari = this.isBrowserEnvironment() && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\n const drmConfig = {} as ResourceLocationDrmInterface;\n\n if (this.playBackInfo.drm?.enabled) {\n const { laType } = this.playBackInfo.drm;\n\n if (laType.playready?.laUrl) {\n drmConfig.playready = {\n url: `${laType.playready.laUrl}&ls_session=${signature}`,\n header: null,\n priority: null,\n audioRobustness: null,\n videoRobustness: null\n };\n }\n\n if (laType.widevine?.laUrl) {\n drmConfig.widevine = {\n url: `${laType.widevine.laUrl}&ls_session=${signature}`,\n header: null,\n priority: null,\n audioRobustness: null,\n videoRobustness: null\n };\n }\n\n if (laType.fairplay) {\n drmConfig.fairplay = {\n appCertUrl: laType.fairplay.cert,\n licenseUrl: `${laType.fairplay.ckc}&ls_session=${signature}`,\n header: null,\n };\n }\n }\n\n const resource: {\n ad: ResourceAdInterface;\n location?: ResourceLocationInterface;\n } = {\n ad: {\n viewabilityTracking: {\n pageType: null,\n partner: 'ten',\n viewGuid: null,\n },\n showPrerollOnNonZeroStart: true,\n ...(this.isDaiEnabled === false ? {\n csai: {\n adCallUrl: formatIMAServerUrl(this._video.videoId, videoAdConfig, bvodData),\n enableAdPreloading: true,\n loadVideoTimeoutMs: this._adLoadTimeout,\n preloadContentAtEndOfPreRoll: !isIos,\n enableStalledAdCheck: true,\n vastLoadTimeout: 12000,\n stalledAdThreshold: 10000\n }\n } : {\n ssai: {\n contentSourceId:this.playBackInfo.dai.contentSourceId,\n videoId: this.playBackInfo.dai.videoId,\n ...(this.freeWheelEnabled && {\n authToken: daiAuthToken,\n }), \n //adParameters: videoAdConfig, // only used for CASI\n adParameters: {\n iu: `/${videoAdConfig.account}/${videoAdConfig.id}/${videoAdConfig.device}/${videoAdConfig.site}`,\n cmsid: this.playBackInfo?.dai?.contentSourceId || \"\",\n ...(!this.freeWheelEnabled && {\n cust_params: custPram,\n }), \n ppid: reqParams.ppid ? reqParams.ppid : null,\n ...(fwParamsToSpread && Object.keys(fwParamsToSpread).length > 0 ? fwParamsToSpread : {}),\n\n vpmute: this.playerMuted ? 1 : 0,\n },\n format: this.state.drmEnabled && !isSafari ? VideoFormat.DASH : VideoFormat.HLS,\n filterOutPremiumAudioCodecs: true,\n isLive: false,\n },\n }),\n },\n };\n \n if (this.state.drmEnabled ) {\n resource.location = {\n drm: drmConfig,\n };\n }\n return resource;\n\n }\n \n\n protected setOztamConfig() {\n let config;\n if(env.hasOwnProperty('isProduction')){\n if(env.isProduction()){\n config = trackingServiceConfig.oztam.config.production;\n } else {\n config = trackingServiceConfig.oztam.config.staging;\n }\n config.sessionId = UUID_v4(); \n }\n\n return config;\n }\n\n private _playerEventToState(eventType: playerEventMappable): PlayerStates {\n return playerEventStateMap[eventType] || this.state.playerState;\n }\n\n private async _updateOverlayState() {\n const {playerState} = this.state;\n const {_video} = this;\n const stateOverlayFactory: tOverlayFactory = this._overlayFactories()[playerState];\n let ui;\n\n if (typeof stateOverlayFactory === \"function\") {\n ui = await stateOverlayFactory(this.player, _video)\n }\n this.setState({overlay: ui});\n }\n\n private async _updatePlayerState(newPlayerState: PlayerStates) {\n this.setState({\n playerState: newPlayerState\n }, async () => {\n if (typeof this.props.onPlayerStateChange === \"function\") {\n await this.props.onPlayerStateChange(newPlayerState);\n }\n\n await this._updateOverlayState();\n });\n }\n\n private _playStateTimer;\n \n private async _onPlayerEvent(event: any) {\n const data = event.detail;\n const UP_NEXT_COUNT = 30;\n let newPlayerState = this._playerEventToState(event.type);\n switch (event.type) {\n case PlayerEvent.ERROR:\n const {fatal, message, code, category} = event.detail.error;\n if (category === ErrorCategory.RESOURCE) {\n console.error(\"RESOURCE_ERROR\", event);\n if (message === ErrorMessage.IMA_SDK_MISSING) {\n await this._updatePlayerState(PlayerStates.AdBlockerOn);\n } else {\n await this._updatePlayerState(PlayerStates.ErrorFetchingVideo);\n }\n return;\n }\n if (fatal) {\n console.error(\"FATAL_ERROR\", event);\n if (category === ErrorCategory.AD && ErrorCode.DAI_DATA_ERROR === code){\n //await this.restartVideoWithoutAds();\n await this._updatePlayerState(PlayerStates.ErrorFetchingAd);\n } else {\n this._updatePlayerState(PlayerStates.ErrorFetchingVideo);\n }\n return;\n }\n \n case PlayerEvent.AD_STALLED:\n break;\n case PlayerEvent.MUTE_CHANGE:\n this.playerMuted = data.muted;\n break;\n case PlayerEvent.CONTENT_PAUSED:\n this.lastPausedTimestamp = Date.now();\n break;\n case PlayerEvent.CONTENT_PROGRESS:\n case PlayerEvent.CONTENT_PLAYING: {\n const secondsRemaining =\n data && data.contentDuration - data.contentTime;\n if (secondsRemaining < UP_NEXT_COUNT && secondsRemaining !== null) {\n newPlayerState = PlayerStates.Next;\n }\n this.calculateRemainingTime(secondsRemaining);\n break;\n }\n case PlayerEvent.CONTENT_PAUSED:\n this.addRemaingTimeAttribute();\n break;\n case PlayerEvent.AUTOPLAY_BLOCKED:\n console.log(\"AUTOPLAY BLOCKED ON THIS BROWSER\")\n break;\n case PlayerEvent.CONTENT_COMPLETE:\n newPlayerState = PlayerStates.End;\n break;\n case PlayerEvent.TEXT_CUEPOINT:\n const textCuepoint = event.detail;\n this.textTrackManager.updateTextTrack(textCuepoint)\n break;\n case PlayerEvent.PLAYBACK_STATE_CHANGE:\n if (data.playbackState === PlaybackState.PAUSED) {\n this.lastPausedTimestamp = Date.now();\n }\n if(data.playbackState === PlaybackState.PLAYING){ \n const timeToReset = Math.floor((Date.now() - this.lastPausedTimestamp) / 1000);\n if(timeToReset > 600) {\n window && window.location.reload();\n }\n }\n break;\n case PlayerEvent.PLUGIN_EVENT:\n if (data.type === \"posterplay\") {\n let playCount = 0;\n const playingCheck = setInterval(()=> {\n playCount++;\n this.player.play();\n if(this.player.playbackState === \"playing\" && playCount >= 5){\n clearInterval(playingCheck);\n }\n }, 2000);\n }\n if (data.type === \"pause\" || data.type === \"seek\") {\n this.addRemaingTimeAttribute();\n }\n if (data.event === \"change-video\") {\n this._changeResource(data);\n this.upNextPlaying = true;\n }\n break;\n case PlayerEvent.CONTENT_START:\n break;\n case PlayerEvent.CONTENT_SEGMENT_START:\n break;\n }\n\n\n this.props.onPlayerEvent && await this.props.onPlayerEvent(event);\n\n if (newPlayerState !== this.state.playerState) {\n await this._updatePlayerState(newPlayerState);\n }\n }\n\n private _onPlayerReady = async (player: iPlayer) => {\n (window as any).player = this.player = player;\n this.player.currentTime = () => { return this.player?.video?.currentTime || 0};\n this.playerUIEffects()\n this.addWatcherToLink();\n this._progressMag = new VideoProgressManager(player);\n this.textTrackManager = new videoTextTrackManager(player)\n\n // const {playerId} = this.props;\n // this._logger.log('Player has been initialized with id: ' + playerId);\n\n const eventTypes = PlayerEvent;\n // Register for player events\n for (const key in eventTypes) {\n this.player.on(eventTypes[key], async (event: any) => {\n this._trackEvent(event);\n await this._onPlayerEvent(event);\n });\n }\n }\n\n private addBeforeUnloadListener() {\n if (typeof window !== 'undefined') {\n window.addEventListener(\"beforeunload\", event => {\n const {mediaInfo} = this.props;\n this._allocator.track(allocatorVodEventMapping['beforeunloadpage'], mediaInfo, this.player);\n setTimeout(() => {\n this.player.stop();\n }, 0);\n });\n } \n }\n\n private async addWatcherToLink() {\n if(window !== undefined) {\n return new Promise((resolve, reject) => {\n const links = document.querySelectorAll('a');\n const selectedLinks = Array.from(links).filter((link) => {\n const href = link.getAttribute('href');\n const target = link.getAttribute('target');\n return href !== null && target !== '_blank';\n });\n selectedLinks.forEach(link => {\n const lnk = link.addEventListener('click', (event) =>{\n const {defaultPrevented} = event;\n if (!defaultPrevented) {\n const {mediaInfo} = this.props;\n this._allocator.track(allocatorVodEventMapping['beforeunloadpage'], mediaInfo, this.player);\n this._allocator && this._allocator.resetTrackingService();\n }\n ({ success }) => resolve(lnk)\n });\n });\n })\n \n }\n \n }\n\n protected convertToVideoTrackObj(mediaInfo, video) { \n this.mediaInfo = mediaInfo;\n const mediaInfoNew = PlayerCtrl.convertToVideoTrackObj(this._videoInfo, mediaInfo, this._oztamServiceConfig.sessionId);\n\n mediaInfoNew.publisher_id = mediaInfo.customFields.publisherid; \n Object.assign(mediaInfoNew.custom_fields);\n return mediaInfoNew;\n \n };\n\n protected _trackEvent(event) {\n const eType = event.type\n const allocatorEvent = allocatorVodEventMapping[eType];\n const {mediaInfo, video} = this.props;\n if ([PlayerEvent.CONTENT_PROGRESS, PlayerEvent.AD_PROGRESS].indexOf(event.type) === -1) {\n }\n\n if (allocatorEvent === undefined) {\n return;\n }\n\n const generateAdData = (event) => {\n if(event.type === PlayerEvent.AD_START) {\n const {adDuration, adTitle, adPosition, adObject} = event.detail.adInfo;\n const ads = {\n adType: adObject?.podInfo?.data?.type === \"mid\" ? \"video_midroll\" : \"video_preroll\",\n adDuration: adDuration,\n adTitle: adTitle, \n adIndex: adObject?.j?.adPodInfo?.adPosition || adObject?.data?.position || adPosition, \n }\n this.adEventData = ads;\n }\n if(event.type === PlayerEvent.AD_START || event.type === PlayerEvent.AD_COMPLETE) {\n return this.adEventData;\n }\n }\n\n if (allocatorEvent === eAllocatorEvent.PROGRESS) {\n\n const {contentDuration, contentTime} = event.detail || {};\n if (contentDuration && contentTime) {\n (this._allocator.tealium as TealiumAviaVod)?.watchedPercentage(contentTime/contentDuration);\n }\n\n setTimeout(()=>{\n this.player.watchPosition = contentTime;\n }, 500);\n }\n\n if (!this._videoInfo) {\n return;\n }\n\n const allocatorVideoObj = PlayerCtrl.convertToVideoTrackObj(this._videoInfo, mediaInfo, this._oztamServiceConfig.sessionId);\n this._allocator.track(allocatorEvent, allocatorVideoObj, this.player, generateAdData(event));\n\n if (allocatorEvent === eAllocatorEvent.FIRST_PLAY) {\n this._allocator.track(eAllocatorEvent.SEGMENT_VIEW, allocatorVideoObj, this.player);\n this._isFirstPlay= true;\n }\n\n // Check for isFirstPlay flag so segment view event does not fire on preroll ad end event\n if (allocatorEvent === eAllocatorEvent.AD_BREAK_END && this._isFirstPlay === true) {\n this._allocator.track(eAllocatorEvent.SEGMENT_VIEW, allocatorVideoObj, this.player);\n }\n\n }\n\n async restartVideoWithoutAds() {\n const {playerState} = this.state;\n if (playerState !== PlayerStates.PreInitialize) {\n this._logger.log('Error Occurred - re-creating player without ads');\n await this._updatePlayerState(PlayerStates.PreInitialize);\n await this._updateVideoNoAds();\n }\n }\n\n async restartPlayerCSAI() {\n await this._updateVideo()\n }\n\n calculateRemainingTime(secondsRemaining: number) {\n let remainingText;\n const remainderSeconds = Math.round(secondsRemaining % 60);\n const remainingMinutes = Math.round(secondsRemaining / 60);\n\n if (isNaN(remainingMinutes) || isNaN(remainderSeconds)) {\n return\n }\n if (remainingMinutes < 1) {\n remainingText = `${remainderSeconds} secs`;\n } else if (remainingMinutes === 1) {\n remainingText = `${remainingMinutes} min`;\n } else if (remainingMinutes > 1) {\n remainingText = `${remainingMinutes} mins`;\n }\n if (remainingText !== this.state.remainingString) {\n this.setState({remainingString: remainingText});\n }\n }\n\n async addRemaingTimeAttribute() {\n const container = document.querySelector(`#${this.playerContainerId}`);\n const {remainingString} = this.state;\n const checkExist = setInterval(function () {\n const playBtn = container.querySelectorAll('avia-play-cta avia-button');\n if (playBtn.length > 0) {\n for (let i = 0; i < playBtn.length; i++) {\n playBtn[i].setAttribute('data-rt', remainingString);\n }\n clearInterval(checkExist);\n } \n }, 100)\n\n }\n\n playerUIEffects() {\n const slider = document.querySelector(\".avia-volume-slider-target\");\n const volCtrl = document.querySelector(\".avia-mute-toggle-target\");\n volCtrl && volCtrl.addEventListener(\"mouseover\", function(event) {\n slider.classList.add(\"show\")\n });\n volCtrl && volCtrl.addEventListener(\"mouseout\", function(event) {\n slider.classList.remove(\"show\")\n });\n slider && slider.addEventListener(\"mouseover\", function(event) {\n slider.classList.add(\"show\")\n });\n slider && slider.addEventListener(\"mouseout\", function(event) {\n slider.classList.remove(\"show\")\n });\n }\n\n isBrowserEnvironment() {\n return typeof window !== 'undefined';\n }\n\n getUrlParam(paramName: string): string {\n if (!this.isBrowserEnvironment()) {\n return null;\n }\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(paramName);\n }\n\n private async fetchIMSDataAndLog(): Promise {\n // COPPA flag 1 indicates child-directed content that follows COPPA ad standards\n // 0 indicates adult-directed content\n const coppaFlag = this.props.video.genre?.toLowerCase() === 'kids' ? 1 : 0;\n\n const data = {\n userIp: this.userIp,\n coppa: coppaFlag\n };\n\n try {\n // This will automatically handle COPPA status updates and cache invalidation\n const response = await this.imsAPI.getIMSData(data);\n if (response) {\n this.imsAPI.logFreewheelDebug('IMS Data:', response);\n return response;\n }\n return null;\n } catch (error) {\n console.error('Error fetching IMS data:', error);\n return null;\n }\n }\n}","import { Autoplay, createVideoPlayer, PlayerOptionsInterface, PerformanceMode, LogLevel } from \"@cbsinteractive/avia-js\";\nimport {ActiveMode, ThemeInterface} from '@cbsinteractive/avia-js-ui'\nimport { iWebApiVideoData } from \"../api/api.video.type\";\nimport {upnext} from \"./Plugins/createUpNext/UpNextPlugin\";\nimport { ui } from '@cbsinteractive/avia-js-ui';\nimport { hls } from '@cbsinteractive/avia-js-hls';\nimport { playlist } from '@cbsinteractive/avia-js-playlist';\nimport { gam } from '@cbsinteractive/avia-js-gam';\nimport { deviceType } from \"../player/util/device\";\nimport { consumeradvice } from '../commonPlugins/ConsumerAdvice/AviaConsumerAdvice';\nimport { isDesktop } from \"../player/util/env.util\";\nimport { display } from './Plugins/display/AviaDisplayPlugin';\nimport { dash } from '@cbsinteractive/avia-js-dash';\n\ninterface iCreatePlayerConfig {\n containerId: string,\n playerId: string,\n autoplay: Autoplay,\n video: iWebApiVideoData,\n onPlayerReady,\n globalSettings?\n}\n\n\nconst createTheme = (isMobile: boolean): ThemeInterface => {\n return {\n html: `\n
\n
\n \n
\n \n
\n \n \n ${isMobile ? '' : ''}\n
\n
\n ${isMobile ? '' : ''}\n \n \n
\n
\n
\n
\n `,\n };\n};\n\n\nexport async function vodCreatePlayer(props: iCreatePlayerConfig) {\n const { video, globalSettings } = props;\n \n const consumerAdviceOptions = {\n duration: globalSettings?.playbackSettings?.consumerAdviceDisplayTime || 5,\n consumerAdvice: video?.consumerAdvice,\n isLive: false,\n };\n const playerOptions: PlayerOptionsInterface = {\n autoplay: Autoplay.ATTEMPT_UNMUTED,\n container: document.querySelector(`#${props.containerId}`) as HTMLElement,\n id: props.playerId,\n performanceMode: PerformanceMode.AUTO,\n useNativeFullscreen: true,\n playsInline: true,\n renderTextTrackNatively: deviceType === 'mobile',\n enableMoat: false,\n //logLevel: LogLevel.DEBUG,\n enableOm: true,\n plugins: [\n ui({\n posterImageUrl: video?.poster, // optional path to poster\n compactViewBreakpoint: 1,\n theme: createTheme(!isDesktop),\n activeMode: ActiveMode.AUTO,\n enableMobileCaptionsAndSettings: true,\n }),\n dash({ debug: false }),\n hls(),\n gam(),\n playlist(),\n upnext(),\n consumeradvice({\n consumerAdviceOptions\n }),\n display()\n ],\n };\n\n return await createVideoPlayer(playerOptions);\n};","import {isFlashPlayerEnabled} from \"./env.util\";\nimport {iVideoAdConfig} from \"../tenAds/video\";\nimport {iAdsServiceConfig} from \"../tenAds/adManager\";\n\n/**\n * define global objects\n */\ndeclare global {\n interface Window {\n /**\n * global project setting\n */\n debug: any, // debug config\n\n /**\n * global object\n */\n trac: any, // nielsen v60\n NOLCMB: any, // nielsen SDK\n s_gi: any, // omniture SDK\n google,\n googletag: any, // googletag\n bc: any, // brightcove player\n videojs: any, // brightcove player\n\n /**\n * global callback\n */\n blankAdCallback: any, // googletag loaded blank ad callback\n }\n}\n\nexport interface iBCAttrConfig {\n \"data-account\": string;\n defaultPlayerId: string;\n \"data-player\"?: string;\n}\n\nexport interface iAdsMCNExclusion {\n key: string;\n rules: Array;\n}\n\nexport interface iBCConfig{\n attributes: iBCAttrConfig;\n plugins: {[name: string]: () => void };\n pluginsForVod?: {[name: string]: () => void };\n pluginsForLive?: {[name: string]: () => void };\n}\n\nexport interface iEnv {\n productionHostName: string | Array;\n enabledFlash: boolean;\n isProduction: () => boolean;\n isStaging: () => boolean;\n\n meta: {[metaName: string]: string};\n playerConfig: iBCConfig;\n trackingService: iTrackingService;\n adsServiceConfig: iAdsServiceConfig;\n}\n\nexport interface iTrackingServiceConfig {\n enabled: boolean;\n config: { // interface of config obj should be defined in their lib file\n staging: any;\n production: any;\n };\n}\n\nexport interface iTrackingService {\n oztam: iTrackingServiceConfig,\n omniture: iTrackingServiceConfig,\n nielsen: iTrackingServiceConfig,\n mux?: iTrackingServiceConfig,\n}\n\n/**\n * Global environment setting\n * @type {iEnv}\n */\nlet envTemp: iEnv = {} as any;\n\nif (typeof window !== \"undefined\"){\n envTemp = {\n productionHostName: undefined,\n enabledFlash: isFlashPlayerEnabled(),\n isProduction: () => {\n let prodDomain = envTemp.productionHostName;\n if (typeof prodDomain === \"string\") {\n return !!(prodDomain && window.location.hostname === prodDomain);\n }\n\n if (prodDomain && Array.isArray(prodDomain)) {\n return prodDomain.indexOf(window.location.hostname) >= 0;\n }\n },\n isStaging: () => {\n return !envTemp.isProduction();\n },\n meta: (function () {\n let metaObject = {};\n\n let metaDOMs = document.querySelectorAll('meta[property*=\"bt:\"]');\n for (let i = 0; i < metaDOMs.length; i++) {\n let meta = metaDOMs[i];\n metaObject[meta.getAttribute(\"property\")] = meta.getAttribute(\"content\");\n }\n\n\n metaDOMs = document.querySelectorAll('meta[name*=\"gcontent-\"]');\n for (let i = 0; i < metaDOMs.length; i++) {\n let meta = metaDOMs[i];\n metaObject[meta.getAttribute(\"name\")] = meta.getAttribute(\"content\");\n }\n\n return metaObject;\n })(),\n playerConfig: undefined,\n trackingService: undefined,\n adsServiceConfig: undefined\n };\n}\n\nexport const env = envTemp;","import {iAdsServiceConfig} from \"../tenAds/adManager\";\nimport {cookies, isDesktop, isMobileWidth} from \"../ten/env.util\";\nimport {PagePathInfo} from \"../tenAds/page.path.processor\";\nimport {skin_handleBlankLoad, skin_handlePreload, skin_handleSuccessLoad} from \"../tenAds/util.skin\";\nimport {\n addAdhesionDom,\n adhesion_handleBlankLoad,\n adhesion_handlePreload,\n adhesion_handleSuccessLoad\n} from \"../tenAds/util.adhesion\";\nimport {mrec_handleBlankLoad, mrec_handleSuccessLoad} from \"../tenAds/util.mrec.carousel\";\nimport {c06_handleBlankLoad, c06_handleSuccessLoad} from \"../tenAds/util.c06\";\nimport {iUtag} from \"./env.utag\";\nimport {baseCustEnv as env} from \"./cust.env.base\";\nimport {jwtMember} from \"../tenMember/jwt/cacheStatus\";\nimport {eLocalStorage_tenUser_info} from \"../tenMember/jwt/enum\";\nimport {iAdSlotConfig} from \"../tenAds/static.type\";\nimport {adsUtil} from \"./cust.env.ads.util\";\n\n//const utagData = window.utag_data;\nconst utag_data: iUtag = (window as any).utag_data || {};\nconst retrievedLocalStorageStte = localStorage.getItem(\"tenplay.geolocation.state\") || '';\nconst targettedPageCategories = [\n \"melbourne-cup-carnival\",\n];\n\nfunction getUpdatedSections(){\n const sections = [];\n const paths = window.location.pathname.split(\"/\");\n if (paths.length <= 1) {\n return sections\n }\n Array.apply(null, Array(3)).forEach((n, i) =>{\n utag_data[`siteSubSection${i+1}`] && paths[i+1] && sections.push(paths[i+1]);\n });\n\n return sections;\n}\n\nfunction isTargetedCategoryPage(category) {\n return targettedPageCategories.indexOf(category) >= 0;\n}\n\nfunction getShowName() {\n if (utag_data.showNameTargeting) {\n return utag_data.showNameTargeting.toLowerCase();\n } else {\n if (utag_data.showName) {\n let showNameUnformatted = utag_data.showName;\n let showNameFormatted = showNameUnformatted.replace(/[^a-zA-Z ]/g, \"\").replace(/\\s+/g, '-').toLowerCase();\n return showNameFormatted;\n } else {\n return '';\n }\n\n }\n}\n\nfunction isShowPage() {\n if (!utag_data.showChannel) {\n return;\n }\n if (!utag_data.showName) {\n // this is live page\n return;\n }\n return [\"ten\", \"play\", \"bold\", \"peach\", \"shake\"].indexOf(utag_data.showChannel.toLowerCase()) >= 0;\n}\n\nfunction isHubPage() {\n if (!utag_data.hubName) {\n return;\n }\n let hubNameFormatted = utag_data.siteSubSection1.replace(/\\-/g,\"_\");\n return hubNameFormatted;\n}\n\nfunction isShow() {\n switch (utag_data.siteSection) {\n case \"Shows\":\n case \"Sport\":\n break;\n default:\n return;\n }\n\n if (!utag_data.showName) {\n // this is live page\n return;\n }\n\n if (!utag_data.showChannel) {\n return \"tenplay\";\n } else {\n return [\"ten\", \"play\", \"bold\", \"peach\", \"shake\"].indexOf(utag_data.showChannel.toLowerCase()) >= 0;\n }\n}\n\nfunction hasShowVideo() {\n return document.querySelector(\".show-video__player\") !== null;\n}\n\nfunction isCompanionAds() {\n return isShow() && hasShowVideo();\n}\n\nexport const adServiceConfig: iAdsServiceConfig = {\n companionAds: {\n enabled: isCompanionAds(),\n adSizes: [[300, 250], [728,90], [4,1]],\n },\n staticAdConfig: {\n lazyLoading: undefined,\n // todo post launch feature\n // {\n // fetchMarginPercent: 200,\n // renderMarginPercent: 100,\n // mobileScaling: 1.5\n // },\n account: env.isProduction() ? \"8264\" : \"7336\",\n pagePathInfo: (): PagePathInfo=> {\n /**\n * get page type\n */\n // let type;\n // const ldjson = document.querySelector('script[type=\"application/ld+json\"]');\n // if (ldjson !== null) {\n // let jsonldObj = JSON.parse(ldjson.innerHTML);\n // if (jsonldObj && jsonldObj[\"@graph\"]) {\n // jsonldObj = jsonldObj[\"@graph\"];\n //\n // if (jsonldObj && jsonldObj[jsonldObj.length - 1][\"@type\"]) {\n // type = jsonldObj[jsonldObj.length - 1][\"@type\"];\n // }\n // }\n // }\n\n let foundEmptyItem = false;\n const subUrlPath = getUpdatedSections().filter((subUrl, index) => {\n if (foundEmptyItem) {\n return false;\n }\n if (!subUrl) {\n foundEmptyItem = true;\n return false;\n }\n\n if (utag_data.showName && utag_data.showChannel && index === 1) {\n foundEmptyItem = true;\n return true;\n }\n\n return !!subUrl;\n });\n\n\n return new PagePathInfo(\n (utag_data as any).pageType,\n window.location.pathname,\n subUrlPath\n );\n },\n pathRule: {\n 0: (pagePathInfo: PagePathInfo): string => {\n let options = {\n desktop: \"/au-tenplay\",\n mobile: \"/mau-tenplay\"\n };\n\n if (isMobileWidth) { // always specifically check isMobile instead of isDesktop\n return options.mobile;\n } else {\n return options.desktop;\n }\n },\n 1: (pagePathInfo: PagePathInfo): string => {\n if (pagePathInfo.category === \"rugby-world-cup-2019\") {\n return \"/rugbyworldcup\";\n } else if (pagePathInfo.category === \"10-play-trending\") {\n return \"/tenplay-trending\";\n } else if (pagePathInfo.category === \"search\") {\n return \"/search-results\";\n } else if (\n pagePathInfo.category === \"my-tv\" ||\n pagePathInfo.category === \"collection-statement\" ||\n pagePathInfo.category === \"apps\" ||\n pagePathInfo.category === \"casting\" ||\n pagePathInfo.category === \"contact-us\"\n ) {\n return \"/\";\n } else if (isShow() || pagePathInfo.category === \"masterchef-coles\" || pagePathInfo.category === \"hours-of-entertainment\") {\n return \"/shows\";\n } else {\n return \"/\" + pagePathInfo.category;\n }\n }\n },\n ptypeRule: {\n 0: (pagePathInfo: PagePathInfo): string => {\n return \"front_door\";\n },\n 1: (pagePathInfo: PagePathInfo): string => {\n switch (pagePathInfo.category) {\n case \"shows\": return \"show_index\";\n case \"news\": return \"news_index\";\n case \"live\": return \"live\";\n case \"tv-guide\": return \"tv_guide\";\n }\n\n if (isShow() && hasShowVideo()) {\n if (pagePathInfo.clearEnding) {\n return \"show_home\";\n }\n\n // when navigating to different section without page refresh\n if (Array.isArray(pagePathInfo.pathName) && pagePathInfo.pathName[2] && typeof pagePathInfo.pathName[2] === \"string\") {\n return pagePathInfo.pathName[2].toLowerCase();\n } else {\n return \"show_extra_detail\";\n }\n } else if (isTargetedCategoryPage(pagePathInfo.category)) {\n if (Array.isArray(pagePathInfo.pathName) && pagePathInfo.pathName[2] && typeof pagePathInfo.pathName[2] === \"string\") {\n return pagePathInfo.pathName[2].toLowerCase();\n }\n }\n\n return \"category_door\";\n },\n 2: (pagePathInfo: PagePathInfo): string => {\n switch (pagePathInfo.category) {\n case \"live\": return \"live\";\n case \"news\": return \"news_show\";\n }\n\n // todo currently pageContentType does not appear more frequently than showContentCategory, will remove showContentCategory option once fixed this from backend.\n const content = utag_data.pageContentType || utag_data.showContentCategory;\n\n if (isShow() && hasShowVideo()) {\n if (pagePathInfo.section) {\n return pagePathInfo.section.toLowerCase();\n } else {\n return \"show_extra_detail\";\n }\n } else if (isHubPage()) {\n return \"hub_page_detail\";\n } else if (isTargetedCategoryPage(pagePathInfo.category) && pagePathInfo.section) {\n return pagePathInfo.section.toLowerCase();\n } else if (!utag_data.siteSubSection3 && pagePathInfo.section){\n return pagePathInfo.section.toLowerCase();\n } else {\n switch (content) {\n case \"Recipe\":\n return \"show_recipe_detail\";\n case \"Article\":\n return \"show_article_detail\";\n case \"Gallery\":\n return \"show_gallery_detail\";\n case \"Web Extra\":\n return \"show_extra_detail\";\n case \"Episodes\":\n return \"episodes\";\n case \"About\":\n return \"about\";\n case \"Competition\":\n return \"competition\";\n case \"Quiz\":\n return \"show_quiz_detail\";\n }\n return \"sub_category_door\";\n }\n },\n 3: (pagePathInfo: PagePathInfo): string => {\n const content = utag_data.pageContentType || utag_data.showContentCategory;\n if (content && document.querySelector(\".show-video__player\") !== null) {\n return content.toLowerCase();\n } else {\n return \"sub_section_door\";\n }\n }\n },\n keyValueRule: {\n 0: [],\n 1: [\n {\n A_Range: [],\n keyValueRules: [\n {\n k: \"show\",\n v: (pagePathInfo): string => {\n if (pagePathInfo.category === \"masterchef-coles\") {\n return \"masterchef\";\n }\n return isShow() && getShowName();\n }\n },\n {\n k: \"channel\",\n v: (pagePathInfo): string => {\n if (pagePathInfo.category === \"live\") {\n return utag_data.showChannel.toLowerCase();\n }\n if(!utag_data.showChannel) {\n return \"tenplay\";\n } else {\n return isShow() && utag_data.showChannel.toLowerCase();\n }\n }\n },\n {\n k: \"genre\",\n v: (pagePathInfo): string => {\n return Array.isArray(utag_data.showGenre) && utag_data.showGenre.join(\",\").toLowerCase();\n }\n },\n {\n k: \"rating\",\n v: (): string => {\n return isShow() && utag_data.showProgramClassification\n }\n },\n {\n k: \"feat\",\n v: (): string => {\n return isShow() && hasShowVideo() && typeof utag_data.showContentVideoType === \"string\" && utag_data.showContentVideoType.toLowerCase().replace(\" \", \"_\") || undefined;\n }\n },\n {\n k: \"content_type\",\n v: (): string => {\n return isShow() && hasShowVideo() && typeof utag_data.showContentFormatType === \"string\" && utag_data.showContentFormatType.toLowerCase().replace(\" \", \"_\") || undefined;\n }\n },\n {\n k: \"section\",\n v: (pagePathInfo): any => {\n if (pagePathInfo.category === \"news\") {\n return pagePathInfo.section;\n }\n if (pagePathInfo.category === \"live\") {\n return utag_data.showChannel.toLowerCase();\n }\n\n let showGenreLowercase = Array.isArray(utag_data.showGenre) ? utag_data.showGenre.map(genre => {\n return genre && genre.toLowerCase() || \"\";\n }) : [];\n if (showGenreLowercase.indexOf(\"sport\") >= 0) {\n return pagePathInfo.category;\n }\n }\n },\n {\n k: \"pv\",\n v: (pagePathInfo): string => {\n const pv0 = \"pv_0\";\n const pv24 = \"pv_24\";\n let currentPV = 1;\n const sessionCookie = cookies.getCookie(pv0);\n const oneDayCookie = cookies.getCookie(pv24);\n if (sessionCookie && oneDayCookie && sessionCookie === oneDayCookie) {\n currentPV = parseInt(sessionCookie, 10) + 1;\n }\n\n cookies.setCookie(pv0, currentPV);\n cookies.setCookie(pv24, currentPV, 1);\n return currentPV + \"\";\n }\n },\n {\n k: \"collection\",\n v: (pagePathInfo): Array => {\n let addShowName = isShow() ? getShowName() : [];\n let addRecipeCollection = utag_data.recipeCollection ? utag_data.recipeCollection.split('-').join('_').toLowerCase() : [];\n let addContentTags = Array.isArray(utag_data.videoContentCategories) ? utag_data.videoContentCategories : [];\n let addHubName = isHubPage() ? isHubPage() : [];\n let addChannelName = pagePathInfo.category === \"live\" ? utag_data.showChannel.toLowerCase() : []; \n const collections = [`web-extra-${utag_data.siteSubSection1}`];\n return addContentTags.indexOf(\"web-extras\") > -1 ? collections : addContentTags.concat(addShowName, addHubName, addRecipeCollection, addChannelName);\n }\n }\n ]\n }\n ],\n 2: [],\n 3: []\n },\n exclusionRule: {\n general: [\n \"Alcoholic_Beverages\",\n \"Porn\",\n \"Gambling\"\n ],\n shows: []\n },\n // extraTargeting are static, and wont be updated by adManager.syncStaticAdParams()\n extraTargeting: {\n \"keywords\": (): Array => {\n let articleTags = Array.isArray(utag_data.articleTags) ? utag_data.articleTags : [];\n let recipeTags = Array.isArray(utag_data.recipeTags) ? utag_data.recipeTags : [];\n return articleTags.concat(recipeTags);\n },\n \"cid\": (pagePathInfo): string => {\n const content = utag_data.pageContentType || utag_data.showContentCategory;\n if (isHubPage()) {\n isHubPage();\n }\n else {\n switch (content) {\n case \"Recipe\": return adsUtil.replaceSpecChar_cid(utag_data.recipeTitle);\n case \"Video\": return adsUtil.replaceSpecChar_cid(utag_data.showContentName);\n case \"Article\": return adsUtil.replaceSpecChar_cid(utag_data.articleTitle);\n case \"Gallery\": return adsUtil.replaceSpecChar_cid(utag_data.siteSubSection3);\n case \"Quiz\": return adsUtil.replaceSpecChar_cid(utag_data.siteSubSection3);\n case \"Competition\": return adsUtil.replaceSpecChar_cid(utag_data.siteSubSection3);\n }\n return adsUtil.replaceSpecChar_cid(utag_data.siteSubSection3);\n }\n },\n \"device\": (): string => {\n return utag_data.deviceType;\n },\n \"user\": utag_data.memberLoginStatus === \"logged-in\" ? \"register\" : \"anon\",\n \"sub\": jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_n10adId],\n \"gr\": jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_gr],\n \"ge\": jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_ge],\n \"session\": (()=>{\n let cbsSession = cookies.getCookie(\"CBS_ADV_VAL\");\n if (!cbsSession) {\n cbsSession = [\"a\", \"b\", \"c\", \"d\"][Math.floor(Math.random() * 4)];\n cookies.setCookie(\"CBS_ADV_VAL\", cbsSession);\n }\n return cbsSession;\n })(),\n \"pguid\": utag_data.memberEmailHashed || \"\",\n \"env\": env.isProduction() ? \"prod\" : \"qa\",\n \"podcast\": (): string => {\n if (utag_data.siteSection === \"Podcasts\") {\n return utag_data.siteSubSection1;\n }\n }\n },\n genericSlots: [\n {\n pos: \"\", elementId: \"outofpage\",\n size: [\"outOfPage\"], type: [\"adhesion\"],\n insert: {\n before:\n \"#nav\"\n }\n },\n {\n pos: \"top\", elementId: \"mpu_top\",\n size: [[300, 250]], type: [\"mrec\"],\n parent: `\n .content--withMREC .content__ad__content, \n .sidebar__items .mrec,\n #showParticipantsPage .mrec,\n #showRecipePage .mrec,\n #showRecipesPage .mrec,\n #showRecipeCollectionPage .mrec,\n #showArticlePage .mrec,\n #showArticlesPage .mrec,\n #showGalleriesPage .mrec,\n #showCompetitionsPage .mrec,\n #showPage .mrec,\n .content__grid .content__tiles-tile,\n #showQuizzesPage .mrec,\n #newsVodPage .mrec\n `,\n insert: {\n into: `\n .content--withMREC .mrec,\n .sidebar__items .mrec,\n #showParticipantsPage .mrec,\n #showRecipePage .mrec,\n #showRecipesPage .mrec,\n #showRecipeCollectionPage .mrec,\n #showArticlePage .mrec,\n #showArticlesPage .mrec,\n #showGalleriesPage .mrec,\n #showCompetitionsPage .mrec,\n #showPage .mrec,\n #showQuizzesPage .mrec,\n #newsVodPage .mrec,\n .content__grid .mrec\n `,\n },\n style: \"width: 300px; height: 250px; margin: auto;\",\n successLoadCallback: function(){\n mrec_handleSuccessLoad(this);\n },\n blankAdCallback: function(){\n mrec_handleBlankLoad(this);\n }\n },\n getFeatureAdConfig(0),\n getFeatureAdConfig(1),\n getFeatureAdConfig(2),\n getFeatureAdConfig(3),\n getFeatureAdConfig(4),\n getFeatureAdConfig(5),\n getFeatureAdConfig(6),\n getFeatureAdConfig(7),\n getFeatureAdConfig(8),\n getFeatureAdConfig(9),\n {\n pos: \"quick1\", elementId: \"quick_link_1\",\n size: [[148, 212]], type: [\"QuickLink v2/Native\"],\n insert: {\n into: \"#quick-links .content__wrapper .ql.ql-1\"\n }\n },\n {\n pos: \"quick2\", elementId: \"quick_link_2\",\n size: [[148, 212]], type: [\"QuickLink v2/Native\"],\n insert: {\n into: \"#quick-links .content__wrapper .ql.ql-2\"\n }\n },\n {\n pos: \"quick3\", elementId: \"quick_link_3\",\n size: [[148, 212]], type: [\"QuickLink v2/Native\"],\n insert: {\n into: \"#quick-links .content__wrapper .ql.ql-3\"\n }\n },\n {\n pos: \"quick4\", elementId: \"quick_link_4\",\n size: [[148, 212]], type: [\"QuickLink v2/Native\"],\n insert: {\n into: \"#quick-links .content__wrapper .ql.ql-4\"\n }\n },\n {\n pos: \"top\", elementId: \"logo_top\",\n size: [[160, 92]], type: [\"logo\"],\n sizeAny: true,\n parent: \".show-video__sponsor, .recipe__header--sponsor, .article--sponsor\",\n insert: {\n into:\n \".show-video__sponsor, .recipe__header--sponsor, .article--sponsor\",\n }\n },\n ],\n desktopSlots: [\n {\n pos: \"\", elementId: \"skin\",\n size: [[4, 1]], type: [\"skin\"],\n insert: {\n before:\n \"main > .content__wrapper > :first-child\"\n },\n preloadCallback: ()=>{\n skin_handlePreload();\n },\n successLoadCallback: ()=>{\n skin_handleSuccessLoad();\n },\n blankAdCallback: ()=>{\n skin_handleBlankLoad();\n }\n },\n {\n pos: \"sticky\", elementId: \"adhesion\",\n size: [[728,90]], type: [\"leader\"],\n preloadCallback: ()=>{\n adhesion_handlePreload();\n },\n successLoadCallback: ()=>{\n adhesion_handleSuccessLoad();\n },\n blankAdCallback: ()=>{\n adhesion_handleBlankLoad();\n }\n },\n ],\n mobileSlots: [\n {\n pos: \"sticky\", elementId: \"mobile_adhesion\",\n size: [[320,50]], type: [\"leader\"],\n preloadCallback: ()=>{\n adhesion_handlePreload();\n },\n successLoadCallback: ()=>{\n adhesion_handleSuccessLoad();\n },\n blankAdCallback: ()=>{\n adhesion_handleBlankLoad();\n }\n },\n ],\n requestParams: [\n [\"ppid\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_n10adId]],\n ],\n },\n videoAdConfig: {\n account: \"8264\", // todo we do not have access to staging video ad account\n id: \"vau-ten\",\n device: isDesktop ? \"desktop\" : \"mobile_web\",\n site: \"tenplay\",\n cmsID: \"2489270\",\n //exclusions: mcnExclusions\n\n customParams:[\n [\"gr\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_gr]],\n [\"ge\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_ge]],\n [\"state\", retrievedLocalStorageStte],\n [\"collection\", Array.isArray(utag_data.videoContentCategories) ? utag_data.videoContentCategories : []],\n [\"genre\", Array.isArray(utag_data.showGenres) ? utag_data.showGenres : []],\n [\"sub\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_n10adId]],\n ],\n requestParams: [\n [\"ppid\", jwtMember.getUserDetail()[eLocalStorage_tenUser_info.tu_n10adId]],\n ]\n }\n};\n\n\nfunction getFeatureAdConfig(index): iAdSlotConfig {\n return {\n pos: \"feature\" + (index + 1),\n elementId: \"feature_\" + (index + 1),\n size: [[234, 227]],\n sizeAny: true,\n type: [\"feature_unit\"],\n parent: \"#c06 #c06_card_\" + index,\n style: \"min-height: 1px;\",\n insert: {\n into: \"#c06 #c06_card_\" + index,\n },\n successLoadCallback: function() {\n c06_handleSuccessLoad(this);\n },\n blankAdCallback: function(){\n c06_handleBlankLoad(this);\n }\n }\n}\n","export namespace adsUtil {\n /**\n * cid value should not include \",\" - remove it\n * @param cidString\n */\n export function replaceSpecChar_cid(cidString: string) {\n if (typeof cidString === \"string\") {\n cidString = cidString.replace(/,/g, \"\");\n }\n return cidString;\n }\n}","import {env as baseEnv} from \"../ten/conf.env\";\nimport {vjsErrorHandler} from \"../tenVod/plugins/errorHandler\";\nimport {vjsEventHandler} from \"../tenVod/plugins/eventHandler\";\nimport {trackingService} from \"../tenVod/plugins/trackingService\";\nimport {vjsOverlayUI} from \"../tenVod/plugins/overlayUI\";\nimport {vjsVideoPlaySync} from \"../tenVod/plugins/videoPlaySync\";\nimport {vjsVolumeSync} from \"../tenVod/plugins/volumeSync\";\nimport {drmFilter} from \"../tenVod/plugins/drmFilter\";\n\n\nbaseEnv.productionHostName = [\n \"10play.com.au\",\n \"www.10play.com.au\"\n];\n\nbaseEnv.playerConfig = {\n plugins: {\n DrmFilter: drmFilter,\n ErrorHandler: vjsErrorHandler,\n EventHandler: vjsEventHandler,\n TrackingService: trackingService,\n OverlayUI: vjsOverlayUI,\n VideoPlaySync: vjsVideoPlaySync,\n VolumeSync: vjsVolumeSync,\n },\n attributes: {\n \"data-account\": \"5699924508001\",\n \"defaultPlayerId\": \"\"\n },\n};\n\nexport const baseCustEnv = baseEnv;","import {iTrackingService} from \"../ten/conf.env\";\n\nexport const trackingServiceConfig: iTrackingService = {\n oztam: {\n enabled: true,\n config: {\n staging: {\n serverTarget: \"//sdeliver.oztam.com.au/api/meter\",\n protocolVersion: \"1\",\n vendorVersion: \"Tenplay_web_3.0\",\n plugin: \"javascript\",\n meta: {\n account_id: \"2199827728001\"\n }\n },\n production: {\n serverTarget: \"//deliver.oztam.com.au/api/meter\",\n protocolVersion: \"1\",\n vendorVersion: \"Tenplay_web_3.0\",\n plugin: \"javascript\",\n meta: {\n account_id: \"2199827728001\"\n }\n }\n }\n },\n omniture: {\n enabled: true,\n config: {\n staging: {\n account: \"nwtplaydev,nwtglobaldev\",\n namespace: \"networkten\",\n server: \"networkten.sc.omtrdc.net\"\n },\n production: {\n account: \"nwtplay,nwtglobal\",\n namespace: \"networkten\",\n server: \"networkten.sc.omtrdc.net\"\n }\n }\n },\n nielsen: {\n enabled: true,\n config: {\n staging: {\n sfcode: \"dcr-cert\",\n apid: \"T06F16904-EF42-4F7F-A5A8-DC3A7341D4F5\",\n apn: \"networkten\",\n nsdkv: \"511\",\n nol_devDebug: \"DEBUG\"\t// 'INFO', 'WARNING', 'ERROR', 'DEBUG'\n },\n production: {\n sfcode: \"dcr\",\n apid: \"P06F16904-EF42-4F7F-A5A8-DC3A7341D4F5\",\n apn: \"networkten\",\n nsdkv: \"511\"\n }\n }\n },\n mux: {\n enabled: true,\n config: {\n staging: {\n key: \"52g3d6oag448r0bhh5fovnch1\",\n },\n production: {\n key: \"aj41vmodeesojujgtkmm1sfcu\",\n }\n }\n }\n};","import {adServiceConfig} from \"./cust.env.ads\";\nimport {iUtag} from \"./env.utag\";\nimport {trackingServiceConfig} from \"./cust.env.track\";\nimport {baseCustEnv} from \"./cust.env.base\";\n\n/**\n * define global objects\n */\ndeclare global {\n interface Window {\n /**\n * global project setting\n */\n debug: any, // debug config\n\n /**\n * global object\n */\n trac: any, // nielsen v60\n NOLCMB: any, // nielsen SDK\n s_gi: any, // omniture SDK\n google,\n googletag: any, // googletag\n bc: any, // brightcove player\n videojs: any, // brightcove player\n utag_data: any,\n trackingData:any,\n\n /**\n * global callback\n */\n blankAdCallback: any, // googletag loaded blank ad callback\n }\n}\n\nbaseCustEnv.trackingService = trackingServiceConfig;\nbaseCustEnv.adsServiceConfig = adServiceConfig;\nexport const env = baseCustEnv;","/**\n * Value are all lower case with _, so we can call toLowerCase when find \"debug\" url param string value, to make the match easily done.\n */\nexport enum eDebug_Title {\n tealium = \"tealium\",\n nielsen = \"nielsen\",\n oztam = \"oztam\",\n omniture = \"omniture\",\n allocator = \"allocator\",\n player = \"player\",\n player_event = \"player_event\",\n ima = \"ima\",\n id3 = \"id3\",\n\n // ads\n staticAd= \"staticAd\",\n adSlotManager = \"adSlotManager\",\n\n // live player source\n yospace = \"yospace\",\n googledai = \"googledai\",\n backupStream = \"backupStream\",\n\n // debug chromecast related issue\n chromecast = \"chromecast\",\n chromecast_plugin = \"chromecast_plugin\",\n chromecast_ads = \"chromecast_ads\",\n chromecast_sync = \"chromecast_sync\",\n chromecast_seek = \"chromecast_seek\",\n chromecast_ad_beacon = \"chromecast_ad_beacon\",\n chromecast_receiver = \"chromecast_receiver\"\n}","export enum eUtag {\n articleAuthor = \"articleAuthor\",\n articleId = \"articleId\",\n articlePublishDate = \"articlePublishDate\",\t\t// \"2018-12-23\"\n articleTags = \"articleTags\",\t // [\"Celebrities\", \"Jungle\", \"Africa\"]\n articleTitle = \"articleTitle\",\t\t// \"8 Most Memorable Tucker Trials\"\n competitionClosure = \"competitionClosure\",\t\t// \"5 days\"\n competitionName = \"competitionName\",\t\t// \"20k Dream Bathroom Renovation\"\n deviceType = \"deviceType\",\t\t // \"desktop\"\n favoritesRecipeCuisine = \"favoritesRecipeCuisine\",\t\t// [\"Indian\", \"Asian\", \"Asian\"]\n favoritesRecipeShow = \"favoritesRecipeShow\",\t\t// [\"mchef\", \"tlr\", \"mchef\"]\n favoritesRecipeType = \"favoritesRecipeType\",\t\t// [\"Lunch\", \"Snack\", \"Dinner\"]\n favoritesShowChannel = \"favoritesShowChannel\",\t\t// [\"TEN\"]\n favoritesShowGenre = \"favoritesShowGenre\",\t\t// [\"Comedy\"]\n favoritesShowGenreSecondary = \"favoritesShowGenreSecondary\",\t\t// [\"Panel,Light Entertainment\"]\n favoritesShowKey = \"favoritesShowKey\",\t\t// [\"gogg\"]\n favoritesShowName = \"favoritesShowName\",\t// [\"Have You Been Paying Attention?\"]\n favoritesShowProgramClassification = \"favoritesShowProgramClassification\",\t\t// [\"M\"]\n hubName = \"hubName\",\t\t// \"Kids Hub\"\n interactionCategory = \"interactionCategory\",\t// \"Carousel\"\n interactionName = \"interactionName\",\t\t// \"Enter Now\"\n interactionType = \"interactionType\",\t\t// \"Button Click\"\n interactionValue = \"interactionValue\",\t// \"5\"\n interactionValueArray = \"interactionValueArray\",\t// [Featured:shows:Reality:2:Australian Survivor, ...]\n memberId = \"memberId\",\n memberOzTamId = \"memberOzTamId\",\n memberAge = \"memberAge\",\t\t // \"48\"\n memberBirthMonth = \"memberBirthMonth\",\t// \"01\"\n memberBirthYear = \"memberBirthYear\",\t\t// \"1970\"\n memberBirthDate = \"memberBirthDate\",\t\t// \"1970-01-01\"\n memberEmail = \"memberEmail\",\t\t // \"firstname.lastname@tealium.com\"\n memberEmailHashed = \"memberEmailHashed\",\t// memberEmailHashed = \"4c02dc4d631b6cef6ec7ad4bc5a5fb5a263ddc8b75a8da42c8b3797d7559444e\"\n memberFavoriteGenre = \"memberFavoriteGenre\",\t// \"Comedy\"\n memberGender = \"memberGender\",\t\t// \"Male\"\n memberLinkedSocialAccounts = \"memberLinkedSocialAccounts\",\t\t// [\"twitter\",\"google\"]\n memberLoginStatus = \"memberLoginStatus\",\t\t// \"logged-in\"\n n10adId=\"n10adId\", // c318e6c41...\n memberMobilePhone = \"memberMobilePhone\",\t\t// \"0400 000 000\"\n memberNameFirst = \"memberNameFirst\",\t\t// \"First\"\n memberNameLast = \"memberNameLast\",\t\t// \"Last\"\n memberPostcode = \"memberPostcode\",\t\t// \"2000\"\n memberState = \"memberState\",\t\t // \"New South Wales\"\n memberSuburb = \"memberSuburb\",\t\t// \"Sydney\"\n newsletterSubs = \"newsletterSubs\",\t\t// [\"All 10 Play Updates\", \"10 Play Trending\", \"Sports\"]\n notificationChannels = \"notificationChannels\",\t\t// [\"Email\", \"Push\"]\n pageContentFilter = \"pageContentFilter\",\t\t// Page Filter Value, eg. Populate,Channel 10,Genre,etc.\t\"Latest\"\n pageContentId = \"pageContentId\",\t\t// \"58987464635\"\n pageContentName = \"pageContentName\",\t\t// \"Win 20K Bathroom Makeover\"\n pageContentType = \"pageContentType\",\t\t// \"Article\"\n pageViewGuid = \"pageViewGuid\",\t\t// Page Identifier (Sitecore)\t\"9fec0651-59ac-4713-c33a-1b49753b46e4\"\n recipeAuthor = \"recipeAuthor\",\t\t// \"Gary Mehigan\"\n recipeCategory = \"recipeCategory\",\t\t// \"Indian\"\n recipeCollection = \"recipeCollection\",\t\t// \"Mystery Box\"\n recipeIngredients = \"recipeIngredients\",\t\t// [\"Avocado, Tuna, Yuzu\"]\n recipePublishDate = \"recipePublishDate\",\t\t// \"2018-11-11\"\n recipeRatingAverage = \"recipeRatingAverage\",\t\t// \"4.3 Stars\"\n recipeRatingVotes = \"recipeRatingVotes\",\t\t// \"506 Votes\"\n recipeServes = \"recipeServes\",\t// \"6 Serves\"\n recipeTags = \"recipeTags\",\t\t// [\"Food and Wine Guide\", \"Billy McKay - Contestant\", \"Chicken Stock\"]\n recipeTitle = \"recipeTitle\",\t\t// \"Tuna, Avocado and Yuzu\"\n searchResults = \"searchResults\",\t// [\"5 shows\",\"1157 videos\",\"66 galleries\",\"2265 recipes\",\"181 articles\"]\n searchTerm = \"searchTerm\",\t\t// \"masterchef\"\n shareChannel = \"channel\",\t// \"Facebook\"\n showChannel = \"showChannel\",\t\t// \"TEN\"\n showContentCategory = \"showContentCategory\",\t\t// \"article\"\n videoContentCategories = \"videoContentCategories\",\t\t// \"web-extras\"\n showContentFormatType = \"showContentFormatType\",\t// \"Short Form\"\n showContentId = \"showContentId\",\t\t// Concatenation of Show Key and Content Type\t\"stud:extra\"\n showContentName = \"showContentName\",\t\t// \"Episode 3\"\n showContentSeason = \"showContentSeason\",\t// \"Season 4\"\n showContentVideoId = \"showContentVideoId\",\t// \"6054169784001\"\n showContentVideoPlatform = \"showContentVideoPlatform\",\t// \"brightcove\"\n showContentVideoType = \"showContentVideoType\",\t// \"Full Episode\"\n showGenre = \"showGenre\",\t\t// [\"Comedy\"]\n showGenres = \"showGenres\",\t\t// [\"Comedy\",\"Panel\",\"Light Entertainment\"]\n showGenreSecondary = \"showGenreSecondary\",\t\t// [\"Panel\",\"Light Entertainment\"]\n showIsPriority = \"showIsPriority\",\t// \"true\"\n showKey = \"showKey\",\t\t // \"gogg\"\n showName = \"showName\",\t\t// \"Have You Been Paying Attention?\"\n showNameTargeting = \"showNameTargeting\",\t\t// \"Have You Been Paying Attention?\"\n showProgramClassification = \"showProgramClassification\",\t\t// \"M\"\n siteDomain = \"siteDomain\",\t\t// \"10play.com.au\"\n siteName = \"siteName\",\t\t// \"10play\"\n siteSection = \"siteSection\",\t\t// \"Shows\"\n siteSubSection1 = \"siteSubSection1\",\t\t// \"the-bachelorette\"\n siteSubSection2 = \"siteSubSection2\",\t\t// \"extra\"\n siteSubSection3 = \"siteSubSection3\",\t\t// \"season-4\"\n siteSubSection4 = \"siteSubSection4\",\t\t// \"the-bachelorette-unpacked-episode-11\"\n siteSubSection5 = \"siteSubSection5\",\t\t// \"1258746697\"\n tealium_event = \"tealium_event\", // \"live_tv_view\"\n tealium_visitor_id = \"tealium_visitor_id\", // \"0186966ec997005d4d343aefdd9c05075001a06d00bd0\"\n tealium_session_id = \"tealium_session_id\",\t// \"1678314877014\"\n tealium_timestamp_utc = \"tealium_timestamp_utc\", // \"2023-03-08T22:34:41.600Z\"\n timestamp_unix = \"timestamp_unix\", // 1678314881\n deviceModelId = \"deviceModelId\", \n visitorIdGoogle = \"visitorIdGoogle\",\t\t// \"755084999.1539054776\"\n visitorNewRepeat = \"visitorNewRepeat\",\t// \"Repeat\"\n SignUpLeadSource = \"SignUpLeadSource\", // \"nav/video/competition/activate\"\n SignUpLeadPage = \"SignUpLeadPage\", // \"homepage ( Page Name which users clicks on the signup from)\"\n SignUpLeadShow = \"SignUpLeadShow\", // \"masterchef ( optional: If they sign up from the video, then pass the associated show into this section)\"\n deviceIdAdobe = \"deviceIdAdobe\",\t// \"71034372000069852993169212641566210749\"\n pageName = \"pageName\",\t// \"10play/home\"\n timeOfDay = \"timeOfDay\",\t// \"Midday\"\n carouselName = \"carouselName\", //Shows You Can't Miss, _ccat in Tealium eCommerce extension \n carouselPosition = \"carouselPosition\", // 1, _csku in Tealium eCommerce extension\n contentType = \"contentType\", // \"Short Form\" _ccat2 in Tealium eCommerce extension\n genre = \"genre\", // [\"Comedy\"] _cbrand in Tealium eCommerce extension\n ctaButton = \"ctaButton\", // \"Slider\"\n carouselType = \"carouselType\", // \"marquee\"\n cardsTotal = \"cardsTotal\", // \"5\"\n cardPosition = \"cardPosition\", // \"3\"\n carouselCta = \"carouselCta\", // \"Sneak Peek\"\n playbackTypeCta = \"playbackTypeCta\" // \"Short Form\"\n}\n\nexport interface iUtag {\n [eUtag.articleAuthor]: string\t\t// \"Studio 10\"\n [eUtag.articleId]: string\t\t // \"1234567890\"\n [eUtag.articlePublishDate]: string\t\t// \"2018-12-23\"\n [eUtag.articleTags]: Array\t\t // [\"Celebrities\", \"Jungle\", \"Africa\"]\n [eUtag.articleTitle]: string\t\t// \"8 Most Memorable Tucker Trials\"\n [eUtag.competitionClosure]: string\t\t// \"5 days\"\n [eUtag.competitionName]: string\t\t// \"20k Dream Bathroom Renovation\"\n [eUtag.deviceType]: string\t\t // \"desktop\"\n [eUtag.favoritesRecipeCuisine]: Array\t\t// [\"Indian\", \"Asian\", \"Asian\"]\n [eUtag.favoritesRecipeShow]: Array\t\t// [\"mchef\", \"tlr\", \"mchef\"]\n [eUtag.favoritesRecipeType]: Array\t\t// [\"Lunch\", \"Snack\", \"Dinner\"]\n [eUtag.favoritesShowChannel]: Array\t\t// [\"TEN\"]\n [eUtag.favoritesShowGenre]: Array\t\t// [\"Comedy\"]\n [eUtag.favoritesShowGenreSecondary]: Array\t\t// [\"Panel,Light Entertainment\"]\n [eUtag.favoritesShowKey]: Array\t\t// [\"gogg\"]\n [eUtag.favoritesShowName]: Array\t// [\"Have You Been Paying Attention?\"]\n [eUtag.favoritesShowProgramClassification]: Array\t\t// [\"M\"]\n [eUtag.hubName]: string\t\t// \"Kids Hub\"\n [eUtag.interactionCategory]: string\t// \"Carousel\"\n [eUtag.interactionName]: string\t\t// \"Enter Now\"\n [eUtag.interactionType]: string\t\t// \"Button Click\"\n [eUtag.interactionValue]: string\t// \"5\"\n [eUtag.interactionValueArray]: Array\t// [Featured:shows:Reality:2:Australian Survivor, ...]\n [eUtag.memberAge]: string\t\t // \"48\"\n [eUtag.memberBirthMonth]: string\t// \"01\"\n [eUtag.memberBirthYear]: string\t\t// \"1970\"\n [eUtag.memberBirthDate]: string\t\t// \"1970-01-01\"\n [eUtag.memberEmail]: string\t\t // \"firstname.lastname@tealium.com\"\n [eUtag.memberEmailHashed]: string\t// memberEmailHashed: \"4c02dc4d631b6cef6ec7ad4bc5a5fb5a263ddc8b75a8da42c8b3797d7559444e\"\n [eUtag.memberFavoriteGenre]: string\t// \"Comedy\"\n [eUtag.memberGender]: string // \"Male\"\n [eUtag.memberId]: string // \"F8F59416717B02809EF40ED7D210A79A5C12441BE4F9DABA25D1D91C070FB643\"\n [eUtag.n10adId]: string // \"c318e6c41b88a6e8220760d542e2f635019817fe90a073b7a05b1c1d613a67df\"\n [eUtag.memberLinkedSocialAccounts]: Array\t\t// [\"twitter\",\"google\"]\n [eUtag.memberLoginStatus]: string\t\t// \"logged-in\"\n [eUtag.memberOzTamId]: string\n [eUtag.memberMobilePhone]: string\t\t// \"0400 000 000\"\n [eUtag.memberNameFirst]: string\t\t// \"First\"\n [eUtag.memberNameLast]: string\t\t// \"Last\"\n [eUtag.memberPostcode]: string\t\t// \"2000\"\n [eUtag.memberState]: string\t\t // \"New South Wales\"\n [eUtag.memberSuburb]: string\t\t// \"Sydney\"\n [eUtag.newsletterSubs]: Array\t\t// [\"All 10 Play Updates\", \"10 Play Trending\", \"Sports\"]\n [eUtag.notificationChannels]: Array\t\t// [\"Email\", \"Push\"]\n [eUtag.pageContentFilter]: string\t\t// Page Filter Value, eg. Populate,Channel 10,Genre,etc.\t\"Latest\"\n [eUtag.pageContentId]: string\t\t// \"58987464635\"\n [eUtag.pageContentName]: string\t\t// \"Win 20K Bathroom Makeover\"\n [eUtag.pageContentType]: string\t\t// \"Article\"\n [eUtag.pageViewGuid]: string\t\t// Page Identifier (Sitecore)\t\"9fec0651-59ac-4713-c33a-1b49753b46e4\"\n [eUtag.recipeAuthor]: string\t\t// \"Gary Mehigan\"\n [eUtag.recipeCategory]: string\t\t// \"Indian\"\n [eUtag.recipeCollection]: string\t\t// \"Mystery Box\"\n [eUtag.recipeIngredients]: Array\t\t// [\"Avocado, Tuna, Yuzu\"]\n [eUtag.recipePublishDate]: string\t\t// \"2018-11-11\"\n [eUtag.recipeRatingAverage]: string\t\t// \"4.3 Stars\"\n [eUtag.recipeRatingVotes]: string\t\t// \"506 Votes\"\n [eUtag.recipeServes]: string\t// \"6 Serves\"\n [eUtag.recipeTags]: Array\t\t// [\"Food and Wine Guide\", \"Billy McKay - Contestant\", \"Chicken Stock\"]\n [eUtag.recipeTitle]: string\t\t// \"Tuna, Avocado and Yuzu\"\n [eUtag.searchResults]: Array\t// [\"5 shows\",\"1157 videos\",\"66 galleries\",\"2265 recipes\",\"181 articles\"]\n [eUtag.searchTerm]: string\t\t// \"masterchef\"\n [eUtag.shareChannel]: string\t// \"Facebook\"\n [eUtag.showChannel]: string\t\t// \"TEN\"\n [eUtag.showContentCategory]: string\t\t// \"article\"\n [eUtag.videoContentCategories]: Array\t\t// \"web-extras\"\n [eUtag.showContentFormatType]: string\t// \"Short Form\"\n [eUtag.showContentId]: string\t\t// Concatenation of Show Key and Content Type\t\"stud:extra\"\n [eUtag.showContentName]: string\t\t// \"Episode 3\"\n [eUtag.showContentSeason]: string\t// \"Season 4\"\n [eUtag.showContentVideoId]: string\t// \"6054169784001\"\n [eUtag.showContentVideoPlatform]: string\t// \"Brightcove\"\n [eUtag.showContentVideoType]: string\t// \"Full Episode\"\n [eUtag.showGenre]: Array\t\t// [\"Comedy\"]\n [eUtag.showGenres]: Array\t\t// [\"Comedy\",\"Panel\",\"Light Entertainment\"]\n [eUtag.showGenreSecondary]: Array\t\t// [\"Panel\",\"Light Entertainment\"]\n [eUtag.showIsPriority]: string\t// \"true\"\n [eUtag.showKey]: string\t\t // \"gogg\"\n [eUtag.showName]: string\t\t// \"Have You Been Paying Attention?\"\n [eUtag.showNameTargeting]: string\t\t// \"Have You Been Paying Attention?\"\n [eUtag.showProgramClassification]: string\t\t// \"M\"\n [eUtag.siteDomain]: string\t\t// \"10play.com.au\"\n [eUtag.siteName]: string\t\t// \"10play\"\n [eUtag.siteSection]: string\t\t// \"Shows\"\n [eUtag.siteSubSection1]: string\t\t// \"the-bachelorette\"\n [eUtag.siteSubSection2]: string\t\t// \"extra\"\n [eUtag.siteSubSection3]: string\t\t// \"season-4\"\n [eUtag.siteSubSection4]: string\t\t// \"the-bachelorette-unpacked-episode-11\"\n [eUtag.siteSubSection5]: string\t\t// \"1258746697\"\n [eUtag.tealium_event]: string\t\t// \"home_view\"\n [eUtag.tealium_visitor_id]: string, // \"0186966ec997005d4d343aefdd9c05075001a06d00bd0\"\n [eUtag.tealium_session_id]: string,\t// \"1678314877014\"\n [eUtag.tealium_timestamp_utc]: string, // \"2023-03-08T22:34:41.600Z\"\n [eUtag.timestamp_unix]: string, // 1678314881\n [eUtag.deviceModelId]: string, \n [eUtag.visitorIdGoogle]: string\t\t// \"755084999.1539054776\"\n [eUtag.visitorNewRepeat]: string\t// \"Repeat\"\n [eUtag.SignUpLeadSource]: string // \"nav/video/competition/activate\"\n [eUtag.SignUpLeadPage]: string // \"homepage ( Page Name which users clicks on the signup from)\"\n [eUtag.SignUpLeadShow]: string // \"masterchef ( optional: If they sign up from the video, then pass the associated show into this section)\"\n [eUtag.deviceIdAdobe]: string\t// \"21fy2ap3-411f-45f5-99ea-0daae7f4f0f0\"\n [eUtag.pageName]: string\t// \"URL of page/screen the customer is on\"\n [eUtag.timeOfDay]: string\t// \"midday\"\n [eUtag.carouselName]: string\t//Shows You Can't Miss\"\n [eUtag.carouselPosition]: string\t// \"1\"\n [eUtag.contentType]: string\t// \"Short Form\"\n [eUtag.genre]: Array\t// ctaButton = \"ctaButton\", // \"Slider\"\n [eUtag.carouselType]: string // \"marquee\"\n [eUtag.cardsTotal]: string // \"5\"\n [eUtag.cardPosition]: string // \"3\"\n [eUtag.carouselCta]: string // \"Sneak Peek\"\n [eUtag.playbackTypeCta]: string // \"Short Form\"[\"Comedy\"]\n track: (type, data)=> void\n}\n","import {deviceType} from \"../@util/device\";\n/**\n * this method depends on the script tag in header of all pages.\n * script src is \"https://assets.adobedtm.com/1277ee49733590b64e2ee25a215a72fed5785f40/satelliteLib-54c8c30a2eca828e741b0ff3bc09e58cecbd8bd5.js\"\n * return true if enabled, return false if disabled, return undefined if do not have enough info to validate\n * @returns {boolean | undefined}\n */\nexport function enabledTrackingProtection(): boolean {\n return true;\n /*\n const headerScripts: HTMLScriptElement[] = document.querySelectorAll(\"head > script\") as any;\n\n let hasSatelliteLibScript;\n for (const script of headerScripts) {\n if (script.src.indexOf(\"satelliteLib\")) {\n hasSatelliteLibScript = true;\n break;\n }\n }\n\n if (hasSatelliteLibScript) {\n return !(window as any)._satellite;\n } else {\n return undefined;\n }\n */\n}\n\ninterface ISafariFilter {\n ios?: boolean;\n iphone?: boolean;\n ipad?: boolean;\n desktop?: boolean;\n}\nfunction getIOSVersion(userAgent) {\n const matchResult = /CPU [a-zA-Z ]{0,}OS ([0-9]{1,})/.exec(userAgent);\n if (matchResult && matchResult.length > 1) {\n return parseInt(matchResult[1], 10) || -1;\n } else {\n return -1;\n }\n}\n/**\n * If it is iOS/MacOS safari/chrome which matches filter option (one option each time), return the IOS version number\n * @param filter\n * @returns {number}\n */\nexport function isMacWebkitBrowser(filter: ISafariFilter): number {\n const userAgent = window.navigator.userAgent;\n const isIOSWebkitBrowser = userAgent.indexOf(\"like Mac OS X\") >= 0;\n\n if (filter.ios) {\n if (isIOSWebkitBrowser) {\n return getIOSVersion(userAgent);\n }\n }\n if (filter.iphone) {\n if (isIOSWebkitBrowser && userAgent.indexOf(\"iPhone\") >= 0) {\n return getIOSVersion(userAgent);\n }\n }\n if (filter.ipad) {\n if (isIOSWebkitBrowser && userAgent.indexOf(\"iPad\") >= 0) {\n return getIOSVersion(userAgent);\n }\n }\n if (filter.desktop) {\n const matchResult = /Mac OS X ([0-9]{1,})/.exec(userAgent);\n if (matchResult && matchResult.length > 1) {\n return parseInt(matchResult[1], 10) || -1;\n }\n }\n\n return -1;\n}\n\n\nexport function requireScript(url, callback)\n{\n var e = document.createElement(\"script\");\n e.src = url;\n e.type=\"text/javascript\";\n e.addEventListener('load', callback);\n document.getElementsByTagName(\"head\")[0].appendChild(e);\n}\n\nexport function isFlashPlayerEnabled(): boolean {\n if (typeof window === \"undefined\") {\n return true;\n }\n let navigator = (window as any).navigator;\n if (navigator.mimeTypes\n && navigator.mimeTypes['application/x-shockwave-flash'] != undefined\n && navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {\n return true;\n } else {\n try {\n new ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n\nexport function generateUUID() {\n let d = new Date().getTime();\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n let r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);\n });\n}\n\nexport function gup(name) {\n if (typeof window === \"undefined\") {\n return \"\";\n }\n\n name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n let regexS = \"[\\\\?&]\" + name + \"=([^&#]*)\";\n let regex = new RegExp(regexS);\n let results = regex.exec(window.location.href);\n return (results === null) ? \"\" : results[1];\n}\n\nexport const urlUtil = (function () {\n if (typeof window === \"undefined\") {\n return {\n kv: {},\n keys: [],\n };\n }\n\n let params: { [key: string]: string } = {};\n let paramKeys = [];\n if (location.search) {\n let paramStr = location.search;\n if (paramStr[0] === \"?\") {\n paramStr = paramStr.substr(1);\n }\n let paramArray = paramStr.split(\"&\");\n for (let i = 0; i < paramArray.length; i++) {\n let kv = paramArray[i].split(\"=\");\n if (kv.length === 2) {\n params[kv[0]] = kv[1];\n paramKeys.push(kv[0]);\n }\n }\n }\n\n return {\n kv: params,\n keys: paramKeys\n }\n})();\n\nexport const getOffsetTop = (element) => {\n if (!element || !element.nodeName || element.nodeName.toLowerCase() === \"body\") {\n return 0;\n } else {\n return element.offsetTop + getOffsetTop(element.offsetParent)\n }\n};\nexport const lazyCallback = (\n slotElement: HTMLElement,\n events: Array,\n pixelOffset: number,\n callback: () => void\n) => {\n events.forEach((event) => {\n let callbackWrapper = () => {\n for (let i = 0; i < events.length; i++) {\n window.removeEventListener(events[i], eventCallback, false);\n }\n callback();\n };\n\n let eventCallback = () => {\n let windowScrollTop = window.pageYOffset || window.scrollY;\n let windowScrollBottom = window.innerHeight + windowScrollTop;\n let slotOffsetTop = getOffsetTop(slotElement);\n let slotOffsetBottom = getOffsetTop(slotElement) + slotElement.clientHeight;\n if (windowScrollTop < 0) {\n callbackWrapper();\n } else {\n if (slotOffsetTop > (windowScrollTop - pixelOffset) && slotOffsetTop < windowScrollBottom) {\n callbackWrapper();\n }\n if (slotOffsetBottom < (windowScrollBottom + pixelOffset) && slotOffsetBottom > windowScrollTop) {\n callbackWrapper();\n }\n }\n };\n\n window.addEventListener(event, eventCallback, false);\n })\n};\n\nexport const cookies = {\n /**\n *\n * @param name\n * @param paths\n */\n expireAllCookies: function (name, paths) {\n let expires = new Date(0).toUTCString();\n\n // expire null-path cookies as well\n document.cookie = name + '=; expires=' + expires;\n\n for (let i = 0, l = paths.length; i < l; i++) {\n document.cookie = name + '=; path=' + paths[i] + '; expires=' + expires;\n }\n },\n /**\n *\n * @param name\n */\n deleteCookie: function (name) {\n this.setCookie(name, '', -1);\n },\n /**\n *\n * @param name\n * @returns {*}\n */\n getCookie: function (name) {\n let reg = new RegExp('(?:^|; )' + encodeURIComponent(name) + '=([^;]*)', \"i\");\n let matches = document.cookie.match(reg);\n if (matches && matches.length > 1) {\n return matches[1];\n } else {\n return undefined;\n }\n },\n /**\n *\n * @param name\n * @param value\n * @param time\n */\n setCookie: function (name, value, time?) {\n let date = new Date();\n let expires;\n if (typeof value === \"object\") {\n value = JSON.stringify(value);\n }\n if (time) {\n if (typeof time === \"number\" || time.days) {\n date.setTime(date.getTime() + (time * 24 * 60 * 60 * 1000));\n } else if (time.hours) {\n date.setTime(date.getTime() + (time.hours * 60 * 60 * 1000));\n } else if (time.mins) {\n date.setTime(date.getTime() + (time.mins * 60 * 1000));\n } else if (time.seconds) {\n date.setTime(date.getTime() + (time.seconds * 1000));\n }\n expires = \"; expires=\" + date.toUTCString();\n } else {\n expires = \"\";\n }\n document.cookie = name + \"=\" + value + expires + \"; path=/\";\n }\n};\n\nexport const storages = {\n getJSONFromLocalStorage: function (key: string) {\n if (typeof window === \"undefined\") {\n return;\n }\n\n let storageData = (window as any).localStorage.getItem(key);\n if (!storageData) {\n return undefined;\n }\n\n try {\n return JSON.parse(storageData);\n } catch (e) {\n return undefined;\n }\n },\n setJSONToLocalStorage: function (key: string, data: any) {\n if (typeof window === \"undefined\") {\n return;\n }\n\n let stringifyData;\n if (data === undefined || data === null) {\n stringifyData = \"\";\n } else {\n stringifyData = JSON.stringify(data)\n }\n\n (window as any).localStorage.setItem(key, stringifyData);\n }\n};\n\nexport class Log {\n static debugConfig = (function () {\n if (typeof window === \"undefined\") {\n return {};\n } else {\n (window as any).tenDebug = (window as any).tenDebug || {};\n return (window as any).tenDebug;\n }\n })();\n static debugUrlParam = typeof gup(\"debug\") === \"string\" ? gup(\"debug\").split(\",\") : [];\n protected serviceName;\n\n constructor(debugServiceName) {\n this.serviceName = debugServiceName;\n }\n\n public get debug() {\n let serviceName = this.serviceName;\n return [true, false].indexOf(Log.debugConfig[serviceName]) > -1 ?\n Log.debugConfig[serviceName] : Log.debugUrlParam.indexOf(serviceName) > -1;\n }\n\n public set debug(ignoreBoolean) {\n }\n\n private formatOutputArgs(args) {\n let arrArgs = this.convertArgumentToArray(args);\n return [this.serviceName].concat(arrArgs);\n }\n\n private convertArgumentToArray(args) {\n let arr = [];\n for (let i = 0; i < args.length; i++) {\n if (typeof args[i] === \"function\") {\n args[i] = args[i]();\n }\n arr.push(args[i]);\n }\n\n return arr;\n }\n\n /**\n * when enabled debug, logging info only visible to developer\n * @param args\n */\n log(...args) {\n if (typeof window !== \"undefined\" && this.debug) {\n console.log.apply(window, this.formatOutputArgs(arguments));\n }\n }\n\n warn(...args) {\n if (typeof window !== \"undefined\" && this.debug) {\n console.warn.apply(window, this.formatOutputArgs(arguments));\n }\n }\n\n /**\n * when enabled debug, only visible to developer\n * @param args\n */\n logCatch(...args) {\n if (typeof window !== \"undefined\" && this.debug) {\n console.error.apply(window, this.formatOutputArgs(arguments));\n }\n }\n\n /**\n * general console error\n * @param args\n */\n error(...args) {\n if (typeof window !== \"undefined\") {\n console.error.apply(window, this.formatOutputArgs(arguments));\n }\n }\n}\n\nexport class Interval_Log extends Log {\n protected intervalStock: Array = [];\n\n constructor(debugServiceName) {\n super(debugServiceName);\n }\n\n protected addInterval(intervalId: number) {\n this.intervalStock.push(intervalId);\n }\n\n protected clearInterval(index?: number) {\n if (index === -1) {\n return;\n } else if (index > -1) {\n clearInterval(this.intervalStock[index]);\n this.intervalStock.splice(index, 1);\n } else {\n for (let i = this.intervalStock.length - 1; i > -1; i--) {\n clearInterval(this.intervalStock[i]);\n this.intervalStock.splice(i, 1);\n }\n }\n }\n}\n\nlet clientWidth, clientHeight;\n\nif (typeof window !== \"undefined\" && document) {\n clientWidth = document.documentElement.clientWidth;\n clientHeight = document.documentElement.clientHeight;\n}\n\nexport const documentClientWidth = clientWidth;\nexport const documentClientHeight = clientHeight;\n\nexport const isMobile = deviceType === \"mobile\";\nexport const isTablet = deviceType === \"tablet\";\nexport const isDesktop = deviceType === \"desktop\";\n\nexport const isMobileWidth = documentClientWidth < 768;\nexport const isTabletWidth = documentClientWidth >= 768 && documentClientWidth < 1024;\nexport const isDesktopWidth = documentClientWidth >= 1024;","import { env } from \"../pkgAviaAllocator/tracking.env\";\n\nexport interface AppInfo {\n webhost: string; // Required for desktop and mobile web\n googledai: number;\n region: string; // Required for non-US domestic properties\n coppa: number; // Required\n}\n\nexport interface DeviceInfo {\n lat: number;\n ip: string;\n ua: string;\n}\n\nexport interface Identifiers {\n userid?: string;\n ifa?: string; // Optional, include if available\n ifatype?: string; // Optional, include if available\n emailhash?: string; // Optional, include if available\n subscriberid?: string; // Optional, include if available\n}\n\nexport interface IMSResponse {\n fms_id_ttl: number;\n fms_params: Record;\n}\n\ninterface FallbackParams {\n imafw__fw_vcid2: string;\n imafw_fms_emailhash?: string;\n imafw_fms_vcid2type: string;\n}\n\ninterface DefaultFMSResponse {\n timestamp: number;\n data: IMSResponse;\n}\n\nexport class IMSAPIIntegration {\n private baseURL: string;\n private cacheKey: string;\n private readonly COPPA_CACHE_KEY = 'coppa_status';\n\n constructor(baseURL: string) {\n this.baseURL = !env.isProduction() ? \"https://n10-proxy-fms.global.ssl.fastly.net/\" : baseURL;\n this.cacheKey = 'ims_response';\n }\n\n private cacheResponse(response: IMSResponse, ttl: number): void {\n const expiry = Date.now() + ttl * 1000;\n localStorage.setItem(this.cacheKey, JSON.stringify({ response, expiry }));\n }\n\n private getCachedResponse(): IMSResponse | null {\n const cachedData = localStorage.getItem(this.cacheKey);\n if (cachedData) {\n const parsedData = JSON.parse(cachedData);\n if (parsedData.expiry > Date.now()) {\n return parsedData.response;\n }\n localStorage.removeItem(this.cacheKey);\n }\n return null;\n }\n\n public invalidateCache(): void {\n localStorage.removeItem(this.cacheKey);\n }\n\n private isIosPlatform(): boolean {\n return /iPad|iPhone|iPod/.test(navigator.userAgent);\n }\n\n private generateFallbackParams(identifiers: Identifiers, appInfo: AppInfo): FallbackParams {\n this.logFreewheelDebug('Generating fallback params with identifiers:', identifiers);\n\n // Priority 4: COPPA = 1 case\n if (appInfo.coppa === 1) {\n return {\n imafw__fw_vcid2: identifiers.userid || this.getOrCreateUserId(),\n imafw_fms_vcid2type: 'userid'\n };\n }\n\n // Priority 1: Email hash for authenticated users\n if (identifiers.emailhash) {\n return {\n imafw__fw_vcid2: identifiers.emailhash,\n imafw_fms_vcid2type: 'emailhash',\n imafw_fms_emailhash: identifiers.emailhash\n };\n }\n // Priority 2 & 3: IFA/IDFV for supported devices\n // This is required for iOS devices only (IFA for iOS 14+ and IDFV for iOS 13 and below)\n\n // Fallback to generated user ID\n const userId = this.getOrCreateUserId();\n this.logFreewheelDebug('Using fallback user ID:', userId);\n \n return {\n imafw__fw_vcid2: userId,\n imafw_fms_vcid2type: 'userid'\n };\n }\n\n async fetchIMSData(appInfo: AppInfo, deviceInfo: DeviceInfo, identifiers: Identifiers): Promise {\n const cachedResponse = this.getCachedResponse();\n if (cachedResponse) {\n return cachedResponse;\n }\n\n const endpoint = `${this.baseURL}/lookup`;\n const payload = {\n app: appInfo,\n device: deviceInfo,\n identifiers: identifiers\n };\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Error: ${response.status} ${response.statusText}`);\n }\n\n const data: IMSResponse = await response.json();\n\n this.cacheResponse(data, data.fms_id_ttl || 172800); // Default to 2 days if not specified\n return data;\n } catch (error) {\n this.logFreewheelDebug('IMS request failed, using fallback params:', error);\n \n const fallbackResponse: DefaultFMSResponse = {\n timestamp: Date.now(),\n data: {\n fms_id_ttl: 43200, // 12 hours\n fms_params: this.generateFallbackParams(identifiers, appInfo)\n }\n };\n // No need to cache fallback response\n // Just in case if needed: this.cacheResponse(fallbackResponse.data, fallbackResponse.data.fms_id_ttl);\n return fallbackResponse.data;\n }\n }\n\n public async getIMSData(data: any): Promise {\n const currentCoppaStatus = this.getCachedCoppaStatus();\n if (currentCoppaStatus !== data.coppa) {\n this.updateCoppaStatus(data.coppa);\n }\n\n const appInfo: AppInfo = {\n webhost: '10play.com.au', // Required for desktop and mobile web\n googledai: 1,\n region: 'AU', // Required for non-US domestic properties\n coppa: data.coppa // 0 indicates adult-directed content, 1 indicates child-directed content\n };\n\n const userIp: string = data.userIp || '';\n\n const deviceInfo: DeviceInfo = {\n lat: 0,\n ip: userIp,\n ua: typeof window !== 'undefined' ? window.navigator.userAgent : ''\n };\n\n const rawIdentifiers: Identifiers = {\n userid: localStorage.getItem(\"tu_n10adId\") || '', // Required\n emailhash: localStorage.getItem(\"tu_memberEmailHashed\") || '', // Optional, include if available\n subscriberid: localStorage.getItem(\"tu_memberid\") || '' // Optional, include if available\n };\n\n // Filter out empty string properties\n const identifiers: Partial = this.removeEmptyStringProperties(rawIdentifiers);\n\n // Log the filtered identifiers to verify\n this.logFreewheelDebug('Filtered Identifiers:', identifiers);\n\n const response = await this.fetchIMSData(appInfo, deviceInfo, identifiers);\n return response;\n }\n\n private removeEmptyStringProperties>(obj: T): Partial {\n const result: Partial = {};\n for (const key in obj) {\n if (obj[key] !== '') {\n result[key] = obj[key];\n }\n }\n return result;\n }\n\n // Method to check if Freewheel debugging is enabled\n private isFreewheelDebugEnabled(): boolean {\n return localStorage.getItem('fwdebug') === 'true';\n }\n\n // Method to log Freewheel-related debug information\n public logFreewheelDebug(message: string, data?: any): void {\n if (this.isFreewheelDebugEnabled()) {\n console.log(`[Freewheel Debug] ${message}`, data);\n }\n }\n\n private getOrCreateUserId(): string {\n let userId = localStorage.getItem(\"tu_n10adId\");\n return userId;\n }\n\n private getCachedCoppaStatus(): number | null {\n const status = localStorage.getItem(this.COPPA_CACHE_KEY);\n return status ? parseInt(status, 10) : null;\n }\n\n private setCoppaStatus(status: number): void {\n localStorage.setItem(this.COPPA_CACHE_KEY, status.toString());\n }\n\n public updateCoppaStatus(status: number): void {\n const currentStatus = this.getCachedCoppaStatus();\n if (currentStatus !== status) {\n this.setCoppaStatus(status);\n this.invalidateCache();\n this.logFreewheelDebug('COPPA status updated, cache invalidated', { oldStatus: currentStatus, newStatus: status });\n }\n }\n}\n","/**\n * Util class used by ad config object from outside\n */\nexport class PagePathInfo {\n public level: number;\n public type: string;\n public clearEnding: boolean;\n public category;\n public section;\n public subSection;\n public pathFinal; // path value that overwrite pathRule's result\n\n public pathName: Array; // array of the whole pathname of URL\n public contentId: string; // last sub path of URL\n public show: string; // the last valid page section plus any thing after it in the URL\n\n constructor(type: string,\n pathName: string,\n pagePath?: Array,\n pageStructureMap?: any) {\n this.type = type; // seems not used anywhere\n this.getPathNameAsArray(pathName);\n this.getPathPattern(pagePath, pageStructureMap);\n this.getContentId();\n this.getShow();\n }\n\n private getPathNameAsArray(pathName: string) {\n if (typeof pathName !== \"string\") {\n pathName = \"/\";\n }\n if (pathName[0] !== \"/\") {\n pathName = \"/\" + pathName;\n }\n\n this.pathName = pathName.split(\"/\");\n }\n\n private getContentId() {\n if (this.clearEnding) {\n return;\n }\n\n let lastSubPath = this.pathName[this.pathName.length - 1];\n this.contentId = lastSubPath.replace(/[-_]/g, \"\");\n }\n\n private getPathPattern(pagePath, pageStructureMap) {\n if (pagePath && Array.isArray(pagePath)) {\n this.level = pagePath.length;\n\n switch (this.level) {\n case 3:\n this.subSection = pagePath[2];\n case 2:\n this.section = pagePath[1];\n case 1:\n this.category = pagePath[0];\n case 0:\n break;\n }\n this.clearEnding = !this.pathName[this.level + 1];\n return;\n }\n\n if (pageStructureMap && typeof pageStructureMap === \"object\") {\n let level = 0;\n let section: any = pageStructureMap;\n let reachTheEndOfMenu = false;\n\n while (!reachTheEndOfMenu) {\n let nextLevelName = this.pathName[level + 1];\n if (section.constructor === Object && section[nextLevelName]) {\n level++;\n section = section[nextLevelName];\n } else if (Array.isArray(section) && section.indexOf(nextLevelName) >= 0) {\n level++;\n reachTheEndOfMenu = true;\n } else {\n reachTheEndOfMenu = true;\n }\n }\n\n // validated level of sub path\n this.level = level;\n // clearEnding if no more sub path after identified level\n\n switch (this.level) {\n case 3:\n this.subSection = this.pathName[3];\n case 2:\n this.section = this.pathName[2];\n case 1:\n this.category = this.pathName[1];\n case 0:\n break;\n }\n\n this.clearEnding = !this.pathName[this.level + 1];\n return;\n }\n\n }\n\n private getShow() {\n this.show = this.pathName.slice(this.level, this.pathName.length).join(\"/\");\n }\n}","import {isMobileWidth} from \"../ten/env.util\";\n\nconst adhesionTemplate = `\n
\n
\n \n
\n
\n`;\n\nfunction getAdhesion() {\n const divTmp = document.createElement(\"div\");\n divTmp.innerHTML = adhesionTemplate;\n return divTmp.querySelector(\".adhesion-container\");\n}\n\nexport function addAdhesionDom() {\n document.body.appendChild(getAdhesion());\n}\n\nexport function adhesion_handlePreload() {\n\n}\n\nexport function adhesion_handleSuccessLoad() {\n document.querySelector(`.tenads.adhesion iframe`).addEventListener(\"load\", function () {\n setTimeout(\n function () {\n document.querySelector(\"body > .adhesion-container\").remove();\n }, 8000\n )\n });\n}\n\nexport function adhesion_handleBlankLoad() {\n\n}","import {iAdSlotConfig} from \"../tenAds/static.type\";\n\nexport function c06_handleSuccessLoad(config: iAdSlotConfig) {\n let adParent: HTMLElement;\n if (config.parent && (adParent = document.querySelector(config.parent)) !== null) {\n handleSuccess(config, adParent);\n }\n}\n\nexport function c06_handleBlankLoad(config: iAdSlotConfig) {\n let adParent: HTMLElement;\n if (config.parent && (adParent = document.querySelector(config.parent)) !== null) {\n handleBlank(config, adParent);\n }\n}\n\n\nfunction handleSuccess(config: iAdSlotConfig, parent: HTMLElement) {\n const adEvent = document.createEvent(\"Event\");\n adEvent.initEvent(\"adLoadEvent\", false, false);\n parent.dispatchEvent(adEvent);\n}\nfunction handleBlank(config: iAdSlotConfig, parent: HTMLElement) {\n const adEvent = document.createEvent(\"Event\");\n adEvent.initEvent(\"adBlankEvent\", false, false);\n parent.dispatchEvent(adEvent);\n}","import {iAdSlotConfig} from \"../tenAds/static.type\";\n\nexport function mrec_handleSuccessLoad(config: iAdSlotConfig) {\n let adParent: HTMLElement | null;\n if (config.parent && (adParent = document.querySelector(config.parent)) !== null) {\n handleSuccessOfCarousel(config, adParent);\n }\n}\n\nexport function mrec_handleBlankLoad(config: iAdSlotConfig) {\n let adParent: HTMLElement | null;\n if (config.parent && (adParent = document.querySelector(config.parent)) !== null) {\n handleBlankOfCarousel(config, adParent);\n }\n}\n\n\nfunction handleSuccessOfCarousel(config: iAdSlotConfig, adParent: HTMLElement) {\n // carousel jsx logic will watch this class\n adParent.classList.add(\"tenads--success\");\n}\n\nfunction handleBlankOfCarousel(config: iAdSlotConfig, adParent: HTMLElement) {\n // carousel jsx logic will watch this class\n adParent.classList.add(\"tenads--blank\");\n}","const imgStyleUrlAttrName = \"imgUrl\";\n\nexport function skin_handlePreload() {\n // todo which element this will be?\n let firstChildDiv = document.querySelector(\"main > .content__wrapper > div:first-child\");\n if (firstChildDiv === null) {\n return;\n }\n\n let adSkinLeft, adSkinRight;\n if (document.querySelector(\"#adSkinLeft\")) {\n adSkinLeft = document.querySelector(\"#adSkinLeft\");\n adSkinRight = document.querySelector(\"#adSkinRight\");\n }\n else {\n adSkinLeft = document.createElement(\"div\");\n adSkinLeft.id = \"adSkinLeft\";\n adSkinLeft.classList.add(\"default\");\n adSkinRight = document.createElement(\"div\");\n adSkinRight.id = \"adSkinRight\";\n adSkinRight.classList.add(\"default\");\n firstChildDiv.parentNode.insertBefore(adSkinLeft, firstChildDiv);\n firstChildDiv.parentNode.insertBefore(adSkinRight, firstChildDiv);\n }\n\n\n let checkAdImgInterval = setInterval(function () {\n let adSkinBGImage = window.getComputedStyle(adSkinLeft).backgroundImage;\n const prevStyle = document.querySelector(\"#skinImgStyle\");\n let prevImg = prevStyle ? prevStyle.getAttribute(imgStyleUrlAttrName) : undefined;\n if (typeof adSkinBGImage === \"string\" && adSkinBGImage.indexOf(\"url(\") >= 0 && adSkinBGImage !== prevImg) {\n initSkinHandler(adSkinLeft, adSkinRight); // do it once\n updateSkinImg(adSkinBGImage); // do it every time skin img updated\n }\n }, 50);\n\n\n // stop interval after 10 sec:\n const timeoutDuration = 10 * 1000;\n setTimeout(function() {\n checkAdImgInterval && clearInterval(checkAdImgInterval);\n checkAdImgInterval = undefined;\n }, timeoutDuration)\n}\n\nlet initedSkinHandler = false;\nfunction initSkinHandler(adSkinLeft, adSkinRight) {\n if (initedSkinHandler === true) {\n return;\n }\n\n const bodyWidth = window.innerWidth;\n let style = document.createElement('style');\n style.type = 'text/css';\n // todo what is the slick-track dom is? could not find it on home page or show page.\n style.innerHTML = `\n @media print, (min-width:1260px) {\n body.loadedSkin.loadedSkin_narrow .content__marquee__infinite:not(.erase) .slick-track {\n margin-left: ${-(bodyWidth - 1260) / 2 + 2 + 8}px; \n } \n }\n `;\n document.head.appendChild(style);\n\n\n adSkinLeft.classList.add(\"boost\");\n adSkinRight.classList.add(\"boost\");\n\n setTimeout(() => {\n if (document.body.classList.contains(\"loadedSkin\")) {\n // todo find marquee template and add the class\n const marquee = document.querySelector(\"#marquee\");\n\n marquee && marquee.classList.add(\"content__marquee__infinite\");\n document.body.classList.add(\"loadedSkin_narrow\");\n\n syncCarouselPosition();\n }\n }, 100);\n\n initedSkinHandler = true;\n\n}\n\nfunction updateSkinImg(adSkinBGImage) {\n const prevStyle = document.querySelector(\"#skinImgStyle\");\n prevStyle && prevStyle.remove();\n let style = document.createElement('style');\n style.type = 'text/css';\n style.id = \"skinImgStyle\";\n style.setAttribute(imgStyleUrlAttrName, adSkinBGImage);\n style.innerHTML = `\n #adSkinLeft.boost::before, #adSkinRight.boost::before {\n background-image: ${adSkinBGImage}\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction syncCarouselPosition() {\n document.querySelectorAll(\".content__marquee__infinite\").forEach(carousel => {\n syncPosition(carousel);\n })\n}\n\nfunction syncPosition(carousel) {\n const slick = carousel.querySelector(\".slick-track\") as HTMLElement;\n const marginLeft = parseFloat(window.getComputedStyle(slick).marginLeft);\n if (!slick || !marginLeft) {\n return;\n }\n\n try {\n const currentLeft = parseFloat(slick.style.left);\n const newLeft = parseFloat(currentLeft + \"\") + parseFloat(marginLeft - 2 + \"\");\n let prevStyle = slick.getAttribute(\"style\");\n if (typeof prevStyle !== \"string\") {\n removeMarginLeft(slick);\n return;\n }\n\n prevStyle = prevStyle.replace(/left:[0-9\\. \\-\\,]{1,}px;/, \"\");\n\n slick.setAttribute(\"style\", `${prevStyle} margin-left: 0;`);\n slick.classList.add(\"erase\");\n\n if(slick.children.length !== 1) {\n slick.setAttribute(\"style\", `${prevStyle} margin-left: 0; left: ${newLeft}px`);\n }\n\n } catch (e) {\n removeMarginLeft(slick);\n }\n}\n\nfunction removeMarginLeft(slick) {\n slick.style.marginLeft = \"0\";\n}\n\nexport function skin_handleSuccessLoad() {\n document.body.classList.add(\"loadedSkin\");\n}\n\nexport function skin_handleBlankLoad() {\n document.body.classList.remove(\"loadedSkin\");\n}","import {Log} from \"../ten/env.util\";\nimport {iTrackingService} from \"../ten/conf.env\";\nimport {eDebug_Title} from \"../ten/env.enum\";\n\n\nexport enum eAllocatorService {\n oztam = \"oztam\",\n omniture = \"omniture\",\n nielsen = \"nielsen\",\n tealium = \"tealium\",\n}\n\nexport class Allocator extends Log{\n protected serviceConfig: iTrackingService;\n\n // The name of all tracking services that go through any type of allocator will be listed, their service config should be given in constructor\n protected oztam: any;\n protected omniture: any;\n protected nielsen: any;\n protected tealium: any;\n\n\n constructor (serviceConfig: iTrackingService) {\n super(eDebug_Title.allocator);\n\n this.serviceConfig = serviceConfig;\n }\n}","import {iBCConfig, iTrackingService} from \"../ten/conf.env\";\nimport {dataModels, dataModelUtil, iMediaInfo} from \"./track.dataModel\";\nimport {Allocator, eAllocatorService} from \"./track.allocator\";\n\nexport enum eAllocatorEvent {\n LOAD = \"LOAD\",\t\t// video loaded event\n LOADED_METADATA = \"LOADED_METADATA\",\n START = \"START\",\t\t// video play start, includes ads\n FIRST_PLAY = \"FIRST_PLAY\", // video content first play\n TIME_UPDATE = \"TIME_UPDATE\",\n PLAY = \"PLAY\",\t\t// video continue/resume play after ads\n PAUSE = \"PAUSE\",\t\t// user paused video\n UN_PAUSE = \"UN_PAUSE\",\n RESUME = \"RESUME\",\t// user resumed video\n PROGRESS = \"PROGRESS\",\t// video in progress\n SEGMENT_VIEW = \"SEGMENT_VIEW\",\n CLOSE_THE_END = \"CLOSE_THE_END\", // 98% finished / 7 seconds of short episode left\n COMPLETE = \"COMPLETE\",\t// video completed\n SEEKING = \"SEEKING\",\n SEEKED = \"SEEKED\",\n AD_BEGIN = \"AD_BEGIN\",\n AD_COMPLETE = \"AD_COMPLETE\",\n AD_BREAK_START = \"AD_BREAK_START\",\n AD_BREAK_END = \"AD_BREAK_END\",\n AD_PAUSE = \"AD_PAUSE\",\n AD_RESUME = \"AD_RESUME\",\n BEFORE_UNLOAD_PAGE = \"BEFORE_UNLOAD_PAGE\",\n BEFORE_CHANGE_SOURCE = \"BEFORE_CHANGE_SOURCE\",\n SWITCHING_SOURCE = \"SWITCHING_SOURCE\", // todo be might safe to remove\n SWITCHED_SOURCE = \"SWITCHED_SOURCE\", // todo be might safe to remove\n}\n\n\n\nexport class Allocator_Video extends Allocator{\n /**\n * Supported tracking events - ENUM object.\n * @enum {string}\n */\n static Events = eAllocatorEvent;\n\n /**\n * private properties\n */\n private eventTimestamp;\n private calledFirstPlay = false;\n private calledPrerollBreakStart = false;\n\n private _firstRoundPlay = true;\n set firstRoundPlay(bool) {\n this._firstRoundPlay = bool;\n }\n get firstRoundPlay() {\n return this._firstRoundPlay;\n }\n\n protected serviceConfig: iTrackingService;\n\n /**\n * implemented in child class of project folder.\n * IMPORTANT these function reset tracking property inside function.\n */\n protected initTealium (): void {};\n protected initOztam (): void {};\n protected initOmniture (): void {};\n protected initNielsen (): void {};\n\n protected initExtraInfo(): void {};\n\n /**\n * public properties\n */\n public trackingOnHold = false; // true - ignore all tracking before it change to true\n\n constructor (serviceConfig: iTrackingService) {\n super(serviceConfig);\n\n this.eventTimestamp = {};\n }\n\n private updateEventTimestamp (eventName: eAllocatorEvent) {\n this.eventTimestamp[eventName] = Date.now();\n }\n\n public updateExtraInfo (extraInfo) {\n Object.keys(eAllocatorService).forEach(serviceName => {\n this[serviceName] &&\n this[serviceName].addExtraVideoInfo &&\n this[serviceName].addExtraVideoInfo(extraInfo);\n })\n }\n\n public stopTracking(serviceName?: eAllocatorService) {\n if (serviceName) {\n this[serviceName] &&\n this[serviceName].stopTracking &&\n this[serviceName].stopTracking();\n } else {\n Object.keys(eAllocatorService).forEach(serviceName => {\n this[serviceName] &&\n this[serviceName].stopTracking &&\n this[serviceName].stopTracking();\n });\n }\n }\n private resetTrackingState = () => {\n this.firstRoundPlay = true;\n this.stopTracking();\n this.eventTimestamp = {};\n this.calledFirstPlay = false;\n this.calledPrerollBreakStart = false;\n };\n public resetTrackingService() {\n this.resetTrackingState();\n\n delete this.tealium;\n this.initTealium();\n delete this.oztam;\n this.initOztam();\n delete this.omniture;\n this.initOmniture();\n delete this.nielsen;\n this.initNielsen();\n\n this.initExtraInfo && this.initExtraInfo();\n }\n\n\n /**\n * video events\n */\n public track(event: eAllocatorEvent, data?, playerRef?) {\n if (this.trackingOnHold) {\n return;\n }\n\n let checkMediaInfoModel = [\n eAllocatorEvent.LOAD,\n eAllocatorEvent.START,\n eAllocatorEvent.FIRST_PLAY,\n eAllocatorEvent.PLAY,\n eAllocatorEvent.PAUSE,\n eAllocatorEvent.UN_PAUSE,\n eAllocatorEvent.RESUME,\n eAllocatorEvent.COMPLETE,\n eAllocatorEvent.AD_BREAK_START,\n eAllocatorEvent.AD_BREAK_END\n ];\n if (checkMediaInfoModel.indexOf(event) >= 0) {\n let videoType = data && typeof (data as iMediaInfo).custom_fields === \"object\" ?\n (data as iMediaInfo).custom_fields.video_type_long_form : undefined;\n if (!dataModelUtil.matchModel(dataModels.mediaInfo(videoType), data)) {\n this.logCatch(\"Video data is not complete\");\n return;\n }\n }\n\n let checkAdInfoModel = [\n eAllocatorEvent.AD_BEGIN,\n eAllocatorEvent.AD_PAUSE,\n eAllocatorEvent.AD_RESUME,\n eAllocatorEvent.AD_COMPLETE\n ];\n if (checkAdInfoModel.indexOf(event) >= 0) {\n if (!dataModelUtil.matchModel(dataModels.adInfo, data)) {\n this.logCatch(\"Ad data is not complete\");\n return;\n }\n }\n\n let checkPlayerRef = [\n eAllocatorEvent.LOAD,\n eAllocatorEvent.FIRST_PLAY, // vjsplayer\n eAllocatorEvent.PLAY, // vjsplayer\n eAllocatorEvent.PAUSE, // vjsplayer\n eAllocatorEvent.RESUME, // vjsplayer\n eAllocatorEvent.SEEKED,\n eAllocatorEvent.AD_BEGIN, // ad player\n eAllocatorEvent.AD_PAUSE, // ad player\n eAllocatorEvent.AD_RESUME, // ad player\n eAllocatorEvent.AD_BREAK_END // vjsplayer\n ];\n if (checkPlayerRef.indexOf(event) >= 0) {\n if (!playerRef || typeof playerRef.currentTime !== \"function\") {\n this.logCatch(\"player reference is missing\");\n return;\n }\n }\n\n let eventWillBeHandled = true; // todo this might cause confusion, improve it\n switch (event) {\n case eAllocatorEvent.LOAD:\n this.onLoad();\n break;\n case eAllocatorEvent.LOADED_METADATA:\n this.onLoadedMetadata(data, playerRef);\n break;\n case eAllocatorEvent.START:\n this.onStart(data, playerRef);\n break;\n case eAllocatorEvent.FIRST_PLAY:\n this.calledFirstPlay = true;\n this.onFirstPlay(data, playerRef);\n break;\n case eAllocatorEvent.PLAY:\n\n break;\n case eAllocatorEvent.PAUSE:\n this.onPause(data, playerRef);\n break;\n case eAllocatorEvent.UN_PAUSE:\n this.onUnpause(data, playerRef);\n break;\n case eAllocatorEvent.RESUME:\n this.onResume(data, playerRef);\n break;\n case eAllocatorEvent.PROGRESS:\n this.onProgress();\n break;\n case eAllocatorEvent.SEGMENT_VIEW:\n this.onSegmentView();\n break;\n case eAllocatorEvent.CLOSE_THE_END:\n // todo this logic should be improved\n if (!this.eventTimestamp[event] ||\n Date.now() - this.eventTimestamp[event] > 3000) {\n this.onCloseTheEnd();\n } else {\n eventWillBeHandled = false;\n }\n break;\n case eAllocatorEvent.COMPLETE:\n this.onComplete(data);\n break;\n case eAllocatorEvent.SEEKING:\n this.onSeeking();\n break;\n case eAllocatorEvent.SEEKED:\n this.onSeeked(data, playerRef);\n break;\n case eAllocatorEvent.AD_BEGIN:\n this.onAdBegin(data, playerRef);\n break;\n case eAllocatorEvent.AD_PAUSE:\n this.onAdPause(data, playerRef);\n break;\n case eAllocatorEvent.AD_RESUME:\n this.onAdResume(data, playerRef);\n break;\n case eAllocatorEvent.AD_COMPLETE:\n this.onAdComplete(data);\n break;\n case eAllocatorEvent.AD_BREAK_START:\n if (!this.calledFirstPlay) {\n this.calledPrerollBreakStart = true;\n }\n this.onAdBreakStart(data);\n break;\n case eAllocatorEvent.AD_BREAK_END:\n this.onAdBreakEnd(data, playerRef);\n break;\n case eAllocatorEvent.BEFORE_UNLOAD_PAGE:\n this.beforeUnloadPage();\n break;\n case eAllocatorEvent.BEFORE_CHANGE_SOURCE:\n this.beforeChangeSource();\n break;\n }\n if (eventWillBeHandled) {\n this.log(`tracking event ${event} called`);\n }\n\n /**\n * record last called time of the events\n */\n this.updateEventTimestamp(event);\n }\n\n /**\n * exceptions that allocator should not track\n */\n private validationHost: [Array, (e)=> boolean][] = [];\n protected validate(event): boolean {\n for (let i=0;i< this.validationHost.length; i++) {\n let validation = this.validationHost[i];\n if (validation[0].indexOf(event) >= 0) {\n return validation[1](event);\n }\n }\n return true;\n }\n public registerValidation(events: Array, validatorCB: (e)=> boolean) {\n this.validationHost.push([events, validatorCB]);\n }\n\n /**\n * event handlers\n */\n\n private onLoad() {\n\n }\n\n public onLoadedMetadata(mediainfo, playerRef) {\n this.firstRoundPlay && this.oztam && this.oztam.onLoadedMetadata && this.oztam.onLoadedMetadata(mediainfo, playerRef);\n this.firstRoundPlay && this.omniture && this.omniture.onLoadedMetadata && this.omniture.onLoadedMetadata(mediainfo, playerRef);\n this.firstRoundPlay && this.nielsen && this.nielsen.videoLoadMetadata && this.nielsen.videoLoadMetadata(mediainfo, playerRef);\n this.tealium && this.tealium.load && this.tealium.load(mediainfo);\n }\n\n // occur once, before trigger first play event\n private onStart(mediainfo, playerRef) {\n if (playerRef.ads && [\"adserror\"].indexOf(playerRef.ads.triggerevent) < 0) {\n mediainfo.hasPreroll = true;\n }\n }\n\n private onReplay(mediainfo, playerRef) {\n this.nielsen && this.nielsen.videoStartMetadata && this.nielsen.videoStartMetadata(mediainfo);\n }\n\n // real video content started playing\n protected onFirstPlay(mediainfo, playerRef) {\n if (!this.calledPrerollBreakStart) {\n this.nielsen && this.nielsen.videoStartMetadata && this.nielsen.videoStartMetadata(mediainfo);\n }\n this.nielsen && this.nielsen.videoFirstPlayMetadata && this.nielsen.videoFirstPlayMetadata(mediainfo, playerRef);\n if (this.firstRoundPlay) {\n this.oztam && this.oztam.onFirstPlay && this.oztam.onFirstPlay(mediainfo, playerRef);\n this.omniture && this.omniture.onFirstPlay && this.omniture.onFirstPlay(mediainfo, playerRef);\n }\n this.tealium && this.tealium.firstPlay && this.tealium.firstPlay();\n }\n\n private onPause(mediainfo, playerRef) {\n if (this.validate(eAllocatorEvent.PAUSE)) {\n this.nielsen && this.nielsen.videoPause && this.nielsen.videoPause(mediainfo, playerRef);\n this.oztam && this.oztam.onPause && this.oztam.onPause();\n }\n }\n\n private onUnpause(mediainfo, playerRef) {\n if (this.validate(eAllocatorEvent.UN_PAUSE)) {\n this.nielsen && this.nielsen.videoUnpause && this.nielsen.videoUnpause(mediainfo, playerRef);\n this.oztam && this.oztam.onUnPause && this.oztam.onUnPause(mediainfo, playerRef);\n }\n\n if (!this.firstRoundPlay && playerRef.currentTime() === 0) {\n this.onReplay(mediainfo, playerRef);\n }\n }\n\n private onResume(mediainfo, playerRef) {\n\n }\n\n private onProgress() {\n\n }\n\n protected onSegmentView() {\n if (this.firstRoundPlay) {\n this.omniture && this.omniture.onSegment && this.omniture.onSegment();\n }\n this.tealium && this.tealium.segmentView();\n }\n\n private onCloseTheEnd() {\n if (this.firstRoundPlay) {\n this.omniture && this.omniture.onComplete && this.omniture.onComplete();\n }\n }\n\n private onComplete(mediainfo) {\n this.nielsen && this.nielsen.videoEndMetadata && this.nielsen.videoEndMetadata(mediainfo);\n this.firstRoundPlay && this.oztam && this.oztam.onComplete && this.oztam.onComplete();\n this.tealium && this.tealium.finished && this.tealium.finished();\n\n // as last thing, set state of firstRoundPlay to false, so tracking of replay can be identified\n this.firstRoundPlay = false;\n }\n\n private onSeeking(){\n if (this.validate(eAllocatorEvent.SEEKING)) {\n this.oztam && this.oztam.onSeeking && this.oztam.onSeeking();\n this.tealium && this.tealium.seeking && this.tealium.seeking();\n }\n }\n\n private onSeeked(mediainfo, playerRef){\n if (this.validate(eAllocatorEvent.SEEKED)) {\n this.oztam && this.oztam.onSeeked && this.oztam.onSeeked(mediainfo, playerRef);\n }\n }\n\n private onAdBegin(adInfo, playerRef) {\n this.nielsen && this.nielsen.adPlayMetadata && this.nielsen.adPlayMetadata(adInfo, playerRef);\n this.oztam && this.oztam.onAdBegin && this.oztam.onAdBegin();\n this.tealium && this.tealium.adStart && this.tealium.adStart();\n this.omniture && this.omniture.onAdStart && this.omniture.onAdStart(adInfo);\n }\n\n private onAdPause(adInfo, playerRef) {\n this.nielsen && this.nielsen.adPause && this.nielsen.adPause(adInfo, playerRef);\n }\n\n private onAdResume(adInfo, playerRef) {\n this.nielsen && this.nielsen.adResume && this.nielsen.adResume(adInfo, playerRef);\n }\n\n private onAdComplete(adInfo) {\n this.nielsen && this.nielsen.adStopMetadata && this.nielsen.adStopMetadata(adInfo);\n this.oztam && this.oztam.onAdComplete && this.oztam.onAdComplete();\n this.tealium && this.tealium.adEnd && this.tealium.adEnd();\n this.omniture && this.omniture.onAdComplete && this.omniture.onAdComplete(adInfo);\n }\n\n protected onAdBreakStart(mediainfo) {\n // special break start behaviour\n if (this.calledFirstPlay) {\n // midroll\n } else {\n // preroll\n this.nielsen && this.nielsen.setHasPreroll && this.nielsen.setHasPreroll();\n this.nielsen && this.nielsen.videoStartMetadata && this.nielsen.videoStartMetadata(mediainfo);\n }\n\n // all break start behavior\n this.nielsen && this.nielsen.adBreakStart && this.nielsen.adBreakStart(mediainfo);\n this.oztam && this.oztam.onAdBreakStart && this.oztam.onAdBreakStart();\n this.omniture && this.omniture.onAdBreakStart && this.omniture.onAdBreakStart();\n }\n\n protected onAdBreakEnd(mediainfo, playerRef) {\n this.nielsen && this.nielsen.adBreakEnd && this.nielsen.adBreakEnd(mediainfo, playerRef);\n this.oztam && this.oztam.onAdBreakEnd && this.oztam.onAdBreakEnd(mediainfo, playerRef);\n this.omniture && this.omniture.onAdBreakComplete && this.omniture.onAdBreakComplete();\n }\n\n private beforeChangeSource () {\n this.stopTracking();\n }\n\n private beforeUnloadPage() {\n this.stopTracking();\n }\n}","/**\n * dataModels defines tracking data standard structure.
\n * this object defines data standard of multiple data model about page, media and ads.\n *
  • 1 means must have
  • \n *
  • 0 means optional
\n * this definition does not care the value, if value is unexpected empty, should be fixed in each player's \"DataMod\" method\n * @mixin\n */\n\nexport let triggeredErrors = [];\n\nexport interface iPageInfo {\n page_nav_title: string;\n page_name: string;\n content_type: string;\n content_title: string;\n content_id: string;\n platform: string;\n tv_channel: string;\n tv_show: string;\n section: string;\n sub_section_1?: any;\n sub_section_2?: any;\n sub_section_3?: any;\n sub_section_4?: any;\n sub_section_5?: any;\n sub_section_6?: any\n}\n\nexport interface iMediaInfo_CustomFields {\n alt_media_id: string;\n clip_title: string;\n tv_show: string;\n series_crid_id?: string;\n episode_crid_id?: string;\n video_type_long_form?: string;\n tv_channel?: string;\n tv_episode?: string;\n episode_name?: string;\n expiry_date?: string;\n program_classification?: string;\n web_content_url?: string;\n clip_category?: string;\n market?: string;\n publisherid?: string\n tv_season?: string\n}\n\nexport interface iVideo {\n ShowGenre: string | null,\n ShowProgramClassification: string | null,\n isMemberGatedLive: boolean\n}\n\nexport interface iMediaInfo {\n id: string;\n name: string;\n account_id?: string;\n description?: string;\n long_description?: string;\n duration?: string;\n head_position: string;\n created_at?: string;\n published_at?: string;\n updated_at?: string;\n reference_id?: string;\n publisher_id?: string;\n custom_fields: iMediaInfo_CustomFields // live returns customFields;\n video?: iVideo\n preroll?: any; // reference of brightcove player.ima3.currentAdEventInfo\n}\n\nexport interface iAdInfo {\n type: string;\n asset_id: string;\n head_position: string;\n index?: string;\n duration?: string\n}\n\nexport const dataModels = {\n /**\n * Data model definition of page view event\n * @enum{number}\n */\n pageInfo: {\n platformName: 1,\n platformPostfix: 1,\n pageTitle: 0,\n pageId: 1,\n platform: 0,\n category: 0,\n section: 0,\n subSection: 0\n },\n\n /**\n * Data model definition of video content events
\n * This model is defined base on data structure of brightcove response
\n * live player (YO) should follow this structure and modify/insert data if necessary
\n * @param {string} videoType Its value will be \"Full Episode\", \"Live\" or others\n * @return {object}\n */\n mediaInfo: function (videoType) {\n let isFullEpisode = typeof videoType === \"string\" && \"full episode\" === videoType.toLowerCase();\n let isLive = typeof videoType === \"string\" && \"live\" === videoType.toLowerCase();\n /**\n *
    \n *
  • VOD means brightcove player
  • \n *
  • YO means yospace player
  • \n *
  • : means property name is different between players
  • \n *
  • = means sample value
  • \n *
  • -> means get value from variable on the right of arrow
  • \n *
  • inserted means each player's \"DataMod\" method will insert that value
  • \n *
  • VOD means only available in VOD source data
  • \n *
  • VOD; YO; means property is available in both player source data, but might be named differently
\n */\n return {\n id: 1,\t\t\t\t\t// VOD; YO;\n name: 1,\t\t\t\t// VOD; YO;\n account_id: 0,\t\t\t// VOD; YO: accountId\n description: 0,\t\t\t// VOD; YO: shortDescription\n long_description: 0,\t// VOD; YO: longDescription\n duration: 0,\t\t\t// VOD; YO = \"86400\"\n head_position: 1,\t\t// VOD, get from player.currentTime(); YO: local date()\n created_at: 0,\t\t\t// VOD; YO: creationDate\n published_at: 0,\t\t// VOD; YO: publishedDate\n updated_at: 0,\t\t\t// VOD; YO: lastModifiedDate\n reference_id: 0,\t\t// VOD; YO: referenceId\n custom_fields: {\n alt_media_id: 1,\t\t\t// inserted; VOD -> id; YO -> E.timedMetadata.crid\n clip_title: 1,\t\t\t\t// VOD; YO -> name -> tv_show\n tv_show: 0,\t\t\t\t\t// VOD; YO;\n // VOD; YO -> E.timedMetadata.crid.pA\n series_crid_id: isLive ? 1 : 0,\n // VOD; YO -> E.timedMetadata.crid.pB\n episode_crid_id: isLive ? 1 : 0,\n // VOD = \"Full Episode\"; YO = \"Live\";\n video_type_long_form: isFullEpisode || isLive ? 1 : 0,\n // VOD; YO;\n tv_channel: 0,\n tv_episode: 0,\t\t\t\t// VOD;\n episode_name: 0,\t\t\t// VOD;\n expiry_date: 0,\t\t\t\t// VOD;\n program_classification: 0,\t// VOD;\n web_content_url: 0,\t\t\t// VOD;\n clip_category: 0,\t\t\t// YO = \"Live Hub Market\";\n market: 0,\t\t\t\t\t// YO;\n publisherid: 0\t\t\t\t// YO;\n },\n preroll: 0,\n video:{\n ShowGenre: 0,\n ShowProgramClassification: 0,\n isMemberGatedLive: 0\n }\n }\n },\n /**\n * Data model definition of ads events\n * @enum{number}\n */\n adInfo: {\n type: 1,\n asset_id: 1,\n index: 0,\n duration: 0,\n head_position: 1\n }\n};\n\n/**\n * util includes methods which would be helpful when generating standard tracking data\n * @mixin\n */\nexport const dataModelUtil = {\n /**\n * This method will evaluate given dataObject structure based on given data model.\n *\n * @param {Object} model object of {@link tenTrack.dataModels}\n * @param {Object} dataObject data source of REST response\n * @return {boolean}\n */\n matchModel: function (model, dataObject) {\n if (typeof model !== \"object\" || model.constructor !== Object) {\n let errorMsg = \"Given data model is not object\";\n if (triggeredErrors.indexOf(errorMsg) === -1) {\n console.error(errorMsg);\n triggeredErrors.push(errorMsg);\n }\n return false;\n }\n\n for (let key in model) {\n // check if given dataObject has each property, does not care about the value\n if (model[key] === 1 && !(key in dataObject)) {\n let errorMsg = \"Important tracking data is missing - \" + key;\n if (triggeredErrors.indexOf(errorMsg) === -1) {\n console.error(errorMsg, model, dataObject);\n triggeredErrors.push(errorMsg);\n }\n return false;\n }\n if (model[key].constructor === Object) {\n if (!this.matchModel(model[key], dataObject[key])) {\n return false;\n }\n }\n }\n\n return true;\n },\n\n /**\n * This method will create data object, try to get values of all given model's properties from given \"dataObject\".
\n * This method normally should be called first, then the player should modify and complete the generated object to make sure it matches given model's requirement, then call the matchModel() method to test if all required properties have value.\n *\n * @param {Object} model object of {@link tenTrack.dataModels}\n * @param {Object} dataObject data source of REST response\n * @param {Object} mapping Object defines property names used in given dataObject which means same thing.\n * @return {*}\n */\n makeData: function (model, dataObject, mapping?):iMediaInfo {\n if (typeof model !== \"object\" || model.constructor !== Object) {\n let errorMsg = \"Given data model is not object\";\n if (triggeredErrors.indexOf(errorMsg) === -1) {\n console.error(errorMsg);\n triggeredErrors.push(errorMsg);\n }\n return undefined;\n }\n\n let tmp = {} as iMediaInfo;\n for (let key in model) {\n let mappedKey = key;\n // if mapping object is given, replace key with given value of each key\n if (mapping && mappedKey in mapping) {\n mappedKey = mapping[key];\n }\n\n if (typeof model[key] === \"object\" && model[key].constructor === Object) {\n tmp[key] = this.makeData(model[key], dataObject[mappedKey], mapping ? mapping[key + \"_mapping\"] : undefined);\n } else if (mappedKey in dataObject) {\n tmp[key] = dataObject[mappedKey];\n }\n }\n return tmp;\n }\n};","/**\n * @namespace\n */\nimport {Allocator_Video} from \"./track.allocator.video\";\nimport {cookies, generateUUID} from \"../ten/env.util\";\nimport {dataModels, dataModelUtil} from \"./track.dataModel\";\nimport {eLocalStorage_tenUser} from \"../tenMember/jwt/enum\";\n\nexport interface iTenTrack {\n deviceId: string,\n userId_ten: string,\n userId_oztam: string,\n userId_nielsen: string,\n\n /**\n * legacy properties\n */\n meta: any,\n dataModels: any,\n dataModelUtil: any,\n Allocator: any,\n}\n\nlet tenTrackTmp: iTenTrack = {} as any;\n\nif (typeof window !== \"undefined\"){\n tenTrackTmp.deviceId = (function() {\n if (window.navigator.cookieEnabled) {\n let tmpDeviceId = cookies.getCookie(\"ten_deviceId\");\n if (tmpDeviceId) {\n return tmpDeviceId;\n } else {\n let newCookieDeviceId = generateUUID();\n cookies.setCookie(\"ten_deviceId\", newCookieDeviceId, 365 * 10);\n return newCookieDeviceId;\n }\n } else {\n // todo if we need to use fingerprint to handle cookie disabled case, then add figerprint logic in here. [DTECH-724]\n return undefined;\n }\n })();\n tenTrackTmp.userId_ten = localStorage.getItem(eLocalStorage_tenUser.tu_userid) || undefined;\n tenTrackTmp.userId_oztam = localStorage.getItem(eLocalStorage_tenUser.tu_oztamid) || undefined;\n tenTrackTmp.userId_nielsen = localStorage.getItem(\"tu_nielsenid\") || generateUUID();\n\n\n /**\n * get page and video info from meta tag. There are bt:type, bt:genre, etc. can be used to send data to tracking tools.\n */\n tenTrackTmp.meta = (function () {\n let metaObject = {};\n\n let metaDOMs = document.querySelectorAll('meta[property*=\"bt:\"]');\n for (let i = 0; i < metaDOMs.length; i++) {\n let meta = metaDOMs[i];\n metaObject[meta.getAttribute(\"property\")] = meta.getAttribute(\"content\");\n }\n\n\n metaDOMs = document.querySelectorAll('meta[name*=\"gcontent-\"]');\n for (let i = 0; i < metaDOMs.length; i++) {\n let meta = metaDOMs[i];\n metaObject[meta.getAttribute(\"name\")] = meta.getAttribute(\"content\");\n }\n\n return metaObject;\n })();\n tenTrackTmp.dataModels = dataModels;\n tenTrackTmp.dataModelUtil = dataModelUtil;\n tenTrackTmp.Allocator = Allocator_Video;\n}\n\nexport const tenTrack = tenTrackTmp;","import {Player} from \"../../@types/bc.interface\";\nimport {Allocator_Video} from \"../../tenTrack/track.allocator.video\";\n\nexport enum eIMAEvent {\n /**\n * ad event - needs ima plugin\n */\n AdsRequest = \"ads-request\",\n AdsLoad = \"ads-load\",\n AdsAdStarted = \"ads-ad-started\",\n AdsAdEnded = \"ads-ad-ended\",\n AdsPause = \"ads-pause\",\n AdsPlay = \"ads-play\",\n AdsFirstQuartile = \"ads-first-quartile\",\n AdsMidpoint = \"ads-midpoint\",\n AdsThirdQuartile = \"ads-third-quartile\",\n AdsClick = \"ads-click\",\n AdsVolumechange = \"ads-volumechange\",\n AdsPodStarted = \"ads-pod-started\",\n AdsPodEnded = \"ads-pod-ended\",\n AdsAllpodsCompleted = \"ads-allpods-completed\",\n /**\n * Error events\n */\n ima3Ready = \"ima3-ready\",\n ima3Error = \"ima3error\",\n ima3AdError = \"ima3-ad-error\"\n}\n\ninterface iIMAConfig {\n\n}\n\nexport interface iIMAAds {\n adType: string, // lower case\n ad: {\n id: string,\n type: string, // upper case\n index: number,\n duration: number\n },\n state: \"content-set\"\n}\n\nexport interface iVodPlayer extends Player{\n autoplay?: boolean;\n load?: () => void;\n ads?: iIMAAds;\n trackingFirstPlayEvents: () => void;\n}\n\n// these events are not listed on ima3 page, but triggered in ad related logic\nexport enum BrightcoveIMABackendEvent {\n NoPreRoll = \"nopreroll\",\n AdTimeout = \"adtimeout\",\n ReadyForPreRoll = \"readyforpreroll\",\n IMA3ContentResumeRequested = \"ima3-content-resume-requested\"\n}","import {iVodPlayer} from \"../@types/bc.interface\";\nimport {Log} from \"../../ten/env.util\";\nimport {eDebug_Title} from \"../../ten/env.enum\";\n\nexport function drmFilter(): void {\n const player: iVodPlayer = this;\n const catalogLoad = player.catalog.load;\n const logger = new Log(eDebug_Title.player);\n\n player.catalog.load = function(mediaInfo) {\n const useDrmValue = (mediaInfo.customFields && mediaInfo.customFields.video_type_drm_only) ||\n (mediaInfo.custom_fields && mediaInfo.custom_fields.video_type_drm_only);\n const useDrm = [\"true\", \"TRUE\", \"True\"].indexOf(useDrmValue) >= 0;\n\n const sources = mediaInfo.sources;\n if (Array.isArray(sources) && sources.length > 0) {\n const filtered = sources.filter(function(source) {\n const isDrmSource = (source.key_systems || source.keySystems) && source.src.indexOf(\"http://\") === -1;\n const isNotDrmSource = !source.key_systems && !source.keySystems;\n return (useDrm && isDrmSource) || (!useDrm && isNotDrmSource);\n });\n\n if (filtered.length !== sources.length) {\n mediaInfo.sources = filtered;\n logger.log(\"UPDATED SOURCE - \", filtered);\n }\n }\n\n catalogLoad(mediaInfo);\n }\n};","export function vjsErrorHandler():void {\n\n}","import {iVodPlayer} from \"../@types/bc.interface\";\n\nexport function vjsEventHandler(): void {\n let player: iVodPlayer= this;\n}","import {iVodPlayer} from \"../@types/bc.interface\";\n\nexport function vjsOverlayUI(): void {\n let player: iVodPlayer = this;\n\n player.on(\"loadedmetadata\", () => {\n const mediainfo = player.mediainfo;\n if (!mediainfo) {\n return;\n }\n if (!Array.isArray(mediainfo.cue_points)) {\n return;\n }\n\n const brightcoveControlledDiv = player.el();\n if (!brightcoveControlledDiv && !brightcoveControlledDiv.querySelector) {\n return;\n }\n const progressHolder = brightcoveControlledDiv.querySelector(\".vjs-progress-control > .vjs-progress-holder\");\n const progressBar = brightcoveControlledDiv.querySelector(\".vjs-progress-control > .vjs-progress-holder > .vjs-play-progress\");\n if (progressHolder === null || progressBar === null) {\n return;\n }\n\n const cuePointClass = \"vjs-progress-cue-point\";\n progressHolder.querySelectorAll(`.${cuePointClass}`).forEach(cue => {\n cue.remove();\n });\n\n const duration = player.duration();\n const cuePoints = mediainfo.cue_points;\n cuePoints.forEach((cue) => {\n const div = document.createElement(\"div\");\n div.classList.add(cuePointClass);\n div.style.left = (cue.time / duration) * 100 + \"%\";\n progressHolder.insertBefore(div, progressBar);\n });\n\n const style = document.createElement(\"style\");\n style.type = \"text/css\";\n style.innerHTML = `\n .${cuePointClass} {\n width: 4px;\n height: 100%;\n position: absolute;\n top: 0;\n bottom: 0;\n background-color: rgba(255,255,255,0.2);\n }\n `;\n document.head.appendChild(style);\n });\n}\n","import {Allocator_Video, eAllocatorEvent} from \"../../tenTrack/track.allocator.video\";\nimport {dataModels, dataModelUtil, iAdInfo, iMediaInfo} from \"../../tenTrack/track.dataModel\";\nimport {Log} from \"../../ten/env.util\";\nimport {eDebug_Title} from \"../../ten/env.enum\";\nimport {BrightcoveCustomEvent, BrightcoveEvent} from \"../../@types/bc.interface\";\nimport {BrightcoveIMABackendEvent, eIMAEvent, iVodPlayer} from \"../@types/bc.interface\";\n\nfunction getTrackingServiceState() {\n return {\n loadedMetadata: false,\n paused: undefined,\n playedAds: 0,\n };\n}\n\nexport function trackingService(): void {\n let player: iVodPlayer= this;\n let eventLog: Log = new Log(eDebug_Title.player_event);\n\n let previousSegment: number;\n let state = getTrackingServiceState();\n\n let previousPosition = getTimeInSec();\n player.on(BrightcoveEvent.Timeupdate, ()=>{\n // timeupdate in sec\n let nowSec = getTimeInSec();\n if (player.hasStarted() && previousPosition !== nowSec) {\n previousPosition = nowSec;\n player.trigger(BrightcoveCustomEvent.TimeupdateSec);\n }\n\n // watchPosition update\n setTimeout(()=>{\n this.watchPosition = player.currentTime();\n },500);\n });\n\n player.on(BrightcoveEvent.Play, () => {\n eventLog.log(`Called ${BrightcoveEvent.Play}`);\n if (state.paused) {\n eventLog.log(`Tracking ${Allocator_Video.Events.UN_PAUSE}`);\n this.allocator.track(\n Allocator_Video.Events.UN_PAUSE,\n getMediaData(player),\n player\n )\n }\n state.paused = false;\n });\n\n player.on(BrightcoveEvent.Pause, () => {\n if (!state.paused) {\n eventLog.log(`Called ${BrightcoveEvent.Pause}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.PAUSE}`);\n this.allocator.track(\n Allocator_Video.Events.PAUSE,\n getMediaData(player),\n player\n );\n }\n state.paused = true;\n });\n\n player.on(BrightcoveEvent.Resume, () => {\n eventLog.log(`Called ${BrightcoveEvent.Resume}`);\n });\n\n\n player.on(BrightcoveEvent.Seeking, () => {\n eventLog.log(`Called ${BrightcoveEvent.Seeking}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.SEEKING}`);\n this.allocator.track(\n Allocator_Video.Events.SEEKING,\n getMediaData(player),\n player\n )\n });\n\n player.on(BrightcoveEvent.Seeked, () => {\n eventLog.log(`Called ${BrightcoveEvent.Seeked}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.SEEKED}`);\n this.allocator.track(\n Allocator_Video.Events.SEEKED,\n getMediaData(player),\n player\n );\n });\n\n window.addEventListener(\"beforeunload\", ()=>{\n eventLog.log(`Called window beforeunload`);\n eventLog.log(`Tracking ${Allocator_Video.Events.BEFORE_UNLOAD_PAGE}`);\n this.allocator.track(\n Allocator_Video.Events.BEFORE_UNLOAD_PAGE\n )\n });\n\n if (player.ima3) {\n state.playedAds = 0;\n if (player.dataAttrs[\"data-video-ima-url\"]) {\n player.on(eIMAEvent.AdsPlay, () => {\n eventLog.log(`Called ${eIMAEvent.AdsPlay}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_RESUME}`);\n this.allocator.track(\n Allocator_Video.Events.AD_RESUME,\n getAdData(player.ads),\n player.ima3.adPlayer\n )\n });\n player.on(eIMAEvent.AdsPause, () => {\n eventLog.log(`Called ${eIMAEvent.AdsPause}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_PAUSE}`);\n this.allocator.track(\n Allocator_Video.Events.AD_PAUSE,\n getAdData(player.ads, player.ima3.adPlayer.currentTime()),\n player.ima3.adPlayer\n )\n });\n // single ad start/end events\n player.on(eIMAEvent.AdsAdStarted, () => {\n state.playedAds++;\n\n eventLog.log(`Called ${eIMAEvent.AdsAdStarted}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_BEGIN}`);\n this.allocator.track(\n Allocator_Video.Events.AD_BEGIN,\n getAdData(player.ads),\n player.ima3.adPlayer\n )\n });\n player.on(eIMAEvent.AdsAdEnded, () => {\n if (state.playedAds) {\n eventLog.log(`Called ${eIMAEvent.AdsAdEnded}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_COMPLETE}`);\n this.allocator.track(\n Allocator_Video.Events.AD_COMPLETE,\n getAdCompleteData(player.ads)\n )\n }\n });\n // ad break start/end events\n player.on(eIMAEvent.AdsPodStarted, () => {\n eventLog.log(`Called ${eIMAEvent.AdsAdStarted}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_BEGIN}`);\n this.allocator.track(\n Allocator_Video.Events.AD_BREAK_START,\n getMediaData(player),\n player\n )\n });\n player.on(eIMAEvent.AdsPodEnded, () => {\n eventLog.log(`Called ${eIMAEvent.AdsAdEnded}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_COMPLETE}`);\n this.allocator.track(\n Allocator_Video.Events.AD_BREAK_END,\n getMediaData(player),\n player\n )\n });\n }\n }\n\n player.on(BrightcoveCustomEvent.TimeupdateSec, () => {\n // trigger close to the video end event, for OzTam\n if (closeTheEnd(player.currentTime(), player.duration())) {\n eventLog.log(`Tracking ${Allocator_Video.Events.CLOSE_THE_END}`);\n player.trigger(BrightcoveCustomEvent.CloseTheEnd);\n }\n\n // checking segment frequently, call segment change, segment view after it changed\n let mediaCues = getCues(player);\n let currentSegment = getSegmentId(player.currentTime(), mediaCues);\n if (previousSegment !== currentSegment) {\n previousSegment = currentSegment;\n player.trigger(BrightcoveCustomEvent.SegmentChanged);\n }\n });\n\n player.on(BrightcoveCustomEvent.SegmentChanged, () => {\n eventLog.log(`Called ${BrightcoveCustomEvent.SegmentChanged}`);\n player.trigger(BrightcoveCustomEvent.SegmentView);\n });\n\n player.on(BrightcoveCustomEvent.SegmentView, () => {\n eventLog.log(`Called ${BrightcoveCustomEvent.SegmentView}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.SEGMENT_VIEW}`);\n this.allocator.track(\n Allocator_Video.Events.SEGMENT_VIEW,\n previousSegment,\n player\n )\n });\n\n // event handlers that should be triggered once for each video (exclude replay)\n trackingSingletonEvents(player, state);\n player.trackingFirstPlayEvents = () => {\n trackingFirstPlayEvents(player, state);\n };\n player.trackingFirstPlayEvents();\n}\n\nexport function getSingletonEventHandlers (player, state) {\n let eventLog: Log = new Log(eDebug_Title.player_event);\n return {\n loadedMetadata: () => {\n eventLog.log(`Called ${BrightcoveEvent.Loadedmetadata}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.LOADED_METADATA}`);\n player.allocator.track(\n Allocator_Video.Events.LOADED_METADATA,\n getMediaData(player),\n player\n );\n },\n firstPlay: () => {\n state.paused = false;\n eventLog.log(`Called ${BrightcoveEvent.FirstPlay}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.START}`);\n player.allocator.track(\n Allocator_Video.Events.START,\n getMediaData(player),\n player\n );\n player.trigger(BrightcoveCustomEvent.PlayerStarted);\n },\n realFirstPlay: () => {\n eventLog.log(`Called ${BrightcoveCustomEvent.RealFirstPlay}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.FIRST_PLAY}`);\n player.allocator.track(\n Allocator_Video.Events.FIRST_PLAY,\n getMediaData(player),\n player\n )\n },\n closeTheEnd: () => {\n eventLog.log(`Called ${BrightcoveCustomEvent.CloseTheEnd}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.CLOSE_THE_END}`);\n player.allocator.track(\n Allocator_Video.Events.CLOSE_THE_END\n )\n },\n ended: () => {\n eventLog.log(`Called ${BrightcoveEvent.Ended}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.COMPLETE}`);\n player.allocator.track(\n Allocator_Video.Events.COMPLETE,\n getMediaData(player)\n )\n }\n };\n}\n\nexport function trackingSingletonEvents(player, state) {\n // on some platform such as chromecast, some of these event handlers should be removed from listener so they won't affect platform specific logic.\n player.singletonEventsHandler = getSingletonEventHandlers(player, state);\n let handlers = player.singletonEventsHandler;\n\n player.on(BrightcoveEvent.Loadedmetadata, ()=>{\n handlers.loadedMetadata();\n player.one(BrightcoveEvent.Play, ()=> {\n handlers.firstPlay();\n });\n });\n // vod player other than using ima3 ad plugin, need to trigger realfirstplay in their specific logic, in player.one(BrightcoveCustomEvent.PlayerStarted) callback\n player.on(BrightcoveCustomEvent.RealFirstPlay, handlers.realFirstPlay);\n player.on(BrightcoveCustomEvent.CloseTheEnd, handlers.closeTheEnd);\n player.on(BrightcoveEvent.Ended, handlers.ended);\n}\n\nexport function trackingFirstPlayEvents(player, state) {\n let eventLog: Log = new Log(eDebug_Title.player_event);\n let realFirstPlayTriggered = false;\n\n function triggerRealFirstPlay() {\n if (realFirstPlayTriggered) {\n return;\n }\n realFirstPlayTriggered = true;\n eventLog.log(\"+++ \" + BrightcoveCustomEvent.RealFirstPlay);\n player.trigger(BrightcoveCustomEvent.RealFirstPlay);\n }\n function adsPodEndedCallback() {\n if (state.playedAds) {\n triggerRealFirstPlay();\n }\n }\n function silentAdTimeout() {\n /**\n * no scheduled ad\n */\n let waitingAd = setInterval(()=> {\n if (state.playedAds) {\n clearInterval(waitingAd);\n }\n if (state.playedAds === 0 && player.currentTime() > 1) {\n clearInterval(waitingAd);\n player.off(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n triggerRealFirstPlay();\n }\n }, 500);\n\n /**\n * with ad\n */\n player.one(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n player.one(BrightcoveIMABackendEvent.AdTimeout, function(){\n eventLog.log(\"+++ \" + BrightcoveIMABackendEvent.AdTimeout);\n player.off(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n triggerRealFirstPlay();\n });\n }\n\n if (player.ima3) {\n state.playedAds = 0;\n\n if (player.dataAttrs[\"data-video-ima-url\"]) {\n // ima error - empty VAST, etc.\n player.one(eIMAEvent.ima3AdError, function(){\n eventLog.log(\"+++ \" + eIMAEvent.ima3AdError);\n player.one(BrightcoveCustomEvent.PlayerStarted, triggerRealFirstPlay);\n });\n\n // ima served, normal process\n player.one(BrightcoveCustomEvent.PlayerStarted, silentAdTimeout);\n } else {\n player.one(BrightcoveCustomEvent.PlayerStarted, triggerRealFirstPlay)\n }\n\n // once real first play triggered, remove all other \"one\" listener\n player.one(BrightcoveCustomEvent.RealFirstPlay, function(){\n player.off(BrightcoveCustomEvent.PlayerStarted, silentAdTimeout);\n player.off(BrightcoveCustomEvent.PlayerStarted, triggerRealFirstPlay);\n player.off(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n });\n player.one(\"switchingSource\", ()=>{\n realFirstPlayTriggered = true; // if user switch source and ima3 url, make true so all events for previous source will be ignored.\n player.off(BrightcoveCustomEvent.PlayerStarted, silentAdTimeout);\n player.off(BrightcoveCustomEvent.PlayerStarted, triggerRealFirstPlay);\n player.off(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n player.allocator.track(eAllocatorEvent.BEFORE_CHANGE_SOURCE);\n });\n }\n}\n\n\nfunction getCues (player) {\n return player.mediainfo.cuePoints || player.mediainfo.cue_points || [];\n}\n\nfunction getSegmentId(currentPosition, cues) {\n for (let i = 0; i < cues.length; i++) {\n cues[i].startTime = i > 0 ? cues[i - 1].time : 0;\n cues[i].endTime = cues[i].time;\n if (i === 0 && currentPosition < cues[i].startTime) {\n return 1;\n } else if (currentPosition >= cues[i].startTime && currentPosition < cues[i].endTime) {\n return i + 2;\n }\n }\n return 1;\n}\n\nfunction closeTheEnd (playerCurrentTime, videoDuration) {\n let secondsToTheEnd = 7;\n let percentageToTheEnd = 0.02;\n if (videoDuration <= 5 * 60) {\n // short episode close to the end seconds\n if (playerCurrentTime + secondsToTheEnd >= videoDuration) {\n return true;\n }\n } else {\n // long episode check close to the end by percentage\n if ((videoDuration - playerCurrentTime)/videoDuration <= percentageToTheEnd) {\n return true;\n }\n }\n\n return false;\n}\n\n\nexport function getMediaData(player) {\n const media = player.mediainfo;\n const headPosition = player.currentTime();\n const mediainfoMapping = player.mediainfoMapping;\n let videoType = media && typeof media.custom_fields === \"object\" ?\n media.custom_fields.video_type_long_form : undefined;\n let mediaInfo: iMediaInfo = dataModelUtil.makeData(dataModels.mediaInfo(videoType), media, mediainfoMapping);\n mediaInfo.head_position = headPosition;\n\n mediaInfo.custom_fields.alt_media_id = mediaInfo.id;\n\n if (mediaInfo.custom_fields && mediaInfo.name && !mediaInfo.custom_fields.clip_title) {\n mediaInfo.custom_fields.clip_title = mediaInfo.name;\n }\n\n if (!dataModelUtil.matchModel(dataModels.mediaInfo(videoType), mediaInfo)) {\n console.error(\"Generated data not match standard of videoJs player data model\");\n }\n return mediaInfo;\n}\n\n/**\n * @param {object} adsObject ads object which is part of player object\n * @param currentPosition\n * @return {*}\n */\nexport function getAdData(adsObject, currentPosition?): iAdInfo {\n if (typeof adsObject !== \"object\") {\n return {} as iAdInfo;\n }\n\n let adTypes = [\"preroll\", \"midroll\"];\n let adMeta = adsObject && adsObject.ad ? adsObject.ad : {};\n let adInfo = {\n type: adMeta.type.toLowerCase(),\n asset_id: adMeta.id,\n index: adMeta.index,\n duration: adMeta.duration,\n head_position: currentPosition ? currentPosition : 0\n };\n\n if (adTypes.indexOf(adInfo.type) < 0 &&\n typeof adsObject.adType === \"string\" &&\n adTypes.indexOf(adsObject.adType.toLowerCase()) > -1) {\n adInfo.type = adsObject.adType.toLowerCase();\n }\n\n return adInfo;\n}\n\n/**\n * when ad complete event called, player.currentTime returns 0. Head position should be same as duration after ad finished\n */\nexport function getAdCompleteData(adsObject) {\n let adInfo = getAdData(adsObject);\n adInfo.head_position = adInfo.duration;\n return adInfo;\n}\n\nfunction getTimeInSec() {\n return Math.floor(Date.now() / 1000);\n}","export function vjsVideoPlaySync():void {\n\n}","export function vjsVolumeSync():void {\n\n}"],"names":["root","factory","exports","module","define","amd","self","getNextVideos","urlCode","fetchUrl","resp","fetch","json","loadVideo","destinationUrl","data","video","link","history","pushState","type","window","location","search","StandardPlayerEvent","Progress","Waiting","Playing","Error","Loadstart","Loadedmetadata","Loadeddata","Play","Pause","Seeking","Seeked","Ended","Volumechange","Timeupdate","Stalled","CustomPlayerEvent","TimeupdateSec","PlayerStarted","SegmentChanged","SegmentView","RealFirstPlay","StartPlayFromResume","CloseTheEnd","BrightcoveEvent","BcCatalogError","Ratechange","FirstPlay","Resume","Resize","Fullscreenchange","BrightcoveCustomEvent","userAgentFilter","find","filterName","index","regex","regIndex","test","navigator","userAgent","deviceType","toLowerCase","includes","FLAG_KEY","ADOPS_KEY","PERCENTAGE_KEY","getFlagFromLocalStorage","key","value","localStorage","getItem","setFlagInLocalStorage","setItem","toString","logger","message","env","isProduction","console","log","percentage","warn","validatePercentage","newPercentage","currentPercentage","parseFloat","removeItem","resetFlagsIfPercentageChanges","isFlagged","newFlagValue","Math","random","markAdOps","removeAdOps","checkIsFlagged","constructor","_servicesConfig","this","eAllocatorServices","AllocatorVideo","Allocator","firstRoundPlay","bool","_state","isFirstRoundPlay","initTealium","initOztam","initExtraInfo","super","defaultAllocatorVideoState","trackingOnHold","resetTrackingState","stopTracking","eventTimestamp","calledFirstPlay","calledPreRollBreakStart","_validationHolder","updateEventTimestamp","eventName","Date","now","updateExtraInfo","extraInfo","Object","keys","forEach","serviceName","addExtraVideoInfo","resetTrackingService","tealium","oztam","track","event","playerRef","otherData","eAllocatorEvent","LOAD","START","FIRST_PLAY","PLAY","PAUSE","UN_PAUSE","RESUME","COMPLETE","AD_BREAK_START","AD_BREAK_END","BEFORE_UNLOAD_PAGE","INIT_PROGRESS_INTERVAL","indexOf","AD_BEGIN","AD_PAUSE","AD_RESUME","AD_COMPLETE","SEEKED","currentTime","error","cancelEventTrack","onLoad","LOADED_METADATA","onLoadedMetadata","onStart","onFirstPlay","onPause","onUnpause","onResume","PROGRESS","onProgress","SEGMENT_VIEW","onSegmentView","CLOSE_THE_END","onCloseTheEnd","onComplete","SEEKING","onSeeking","onSeeked","onAdBegin","onAdPause","onAdResume","onAdComplete","onAdBreakStart","onAdBreakEnd","beforeUnloadPage","BEFORE_CHANGE_SOURCE","beforeChangeSource","initProgressInterval","_validate","i","length","validation","registerValidation","events","validatorCB","push","mediainfo","load","onReplay","firstPlay","onInitProgress","pause","onUnPause","segmentView","finished","seeking","adInfo","adStart","adEnd","onChangeVideo","onExit","tealiumEvtOverride","source","undefined","latest","pauseDurationBeforeNewId3","pauseDurationBeforeNewId3_nielsen","generateId3Info","TXXX","id3Info","cueType","CRID","EpochTime","Rating","StreamID","parseInt","floor","LocalTime","matches","match","series_id","episode_id","update","cueData","eCueType","updateTimestamp","PRIV","TDRL","replace","timestamp","getTime","err","player","_log","callback","textTracks","addEventListener","kind","mode","unusedEvent","activeCues","cue","cueObject","JSON","stringify","cueObjectSource","cueObj","isIOS","parse","info","trigger","e","txxxObject","eOzTamEvent","eOztamTrigger","DeviceType","eOzTamField","args","getEventData","eventType","triggerType","fromPosition","toPosition","assign","_eventBuilder","BEGIN","getFields","media","oztamConfig","_registeredSessionId","sessionId","UUID_v4","protocolVersion","vendorVersion","plugin","timezoneOffset","abs","getTimezoneOffset","publisherId","publisherName","mediaId","mediaType","mediaDuration","url","hasIntervalRunning","_progressInterval","startProgressInterval","stopProgressInterval","setInterval","trackProgress","PROGRESS_INTERVAL","clearInterval","dispatch","fields","canDispatch","requestSend","method","_oztamConfig","serverTarget","headers","eventObj","preventDispatch","missingPosition","nanPosition","isNaN","flagPass","startSession","eventBuilder","_media","resetSessionId","trackLoad","trackBegin","properties","trackAdStart","AD_EVENT","trackAdComplete","trackComplete","trackingConfig","_extraInfo","duringAdBreak","_oztamService","OzTamServiceV2","_storedProgressPosition","positionFloat","__storedProgressPosition","toFixed","_storedProgressPositionTimestamp","defineGetMediaDurationFn","mediaInfo","duration","TrackJS","id","defineGetMediaPositionFn","lastPlayTimestamp","round","contentTime","defineGetMediaTypeFn","defineGetPublisherId","meta","account_id","publisher_id","sessionStart","defineTrackingMedia","defineTrackingEvent","defineTrackingProperties","ALT_MEDIA_ID","SERIES_ID","custom_fields","series_crid_id","EPISODE_ID","episode_crid_id","SERIES_NAME","tv_show","EPISODE_NAME","episode_name","CHANNEL","tv_channel","CLASSIFICATION","program_classification","DEVICE_ID","tenTrack","deviceId","DEMO1","oztam_userId","alt_media_id","href","genre","ShowGenre","positions","DISPOSE","getContentPositionFromPayloadPosition","watchPosition","dispose","Tealium","CallStack","variable","property","videoHasStarted","utag","static","getMediaGenre","utag_data","eUtag","showGenre","Array","isArray","join","getMediaGenreSecondary","showGenreSecondary","genreSecondary","getGeneralData","channelDisplayName","video_fields","jwtMember","getUserDetail","fastChannelTrackData","showContentMarket","showProgramClassification","ShowProgramClassification","isMemberGatedLive","trackingData","showName","showNameTargeting","n10adId","showKey","tvEpisode","tv_episode","subStringAsKeyMatch","showEpisodeName","clip_title","showEpisodeVideoType","video_type_long_form","showContentId","showContentCategory","showId","showContentName","document","title","showContentVideoId","showChannel","showContentVideoType","showContentSeason","season","showContentFormatType","videoDuration","adType","adDuration","adIndex","adTitle","oztamPublisherId","oztamSessionId","autoPlayFlag","getAutoplaySetting","call_type","platform","device","adobeECID","deviceIdAdobe","getAdData","adDataIsEmpty","isEmptyObj","generalData","setMediaInfo","mediaTrackingInfo","tealium_event","matadata","adData","extraData","customExitData","playbackTime","getRoundedMinutes","trackingServiceConfig","enabled","config","staging","production","mux","envTemp","productionHostName","prodDomain","hostname","isStaging","OztamClass","TealiumClass","getDomain","s4","substring","param","body","keepalive","then","response","ok","text","catch","request","XMLHttpRequest","open","headerNames","headerName","setRequestHeader","successCallback","onreadystatechange","readyState","status","responseText","failCallback","onerror","send","some","exactPlatformString","obj","roundedDuration","startTime","endTime","timerId","start","remaining","paused","pausedTime","resume","clearTimeout","setTimeout","Promise","resolve","reject","res","ip","callbacks","ms","watch","fn","isReady","onReady","interval","apiKey","authToken","baseUrl","requestToken","post","PublisherName","access_token","handleError","ensureAuthToken","retryRequest","func","retries","attempt","code","delay","postAuthenticatedData","endpoint","makeAuthenticatedPostRequest","Authorization","postUnauthenticatedData","mapBvodDataToOztamParams","bvodData","oztamParamsArray","item","BvodId","Demo","BvodIdSalt","addCustParamsCsi","resource","bcodData","ad","csai","adCallUrl","URL","params","URLSearchParams","custParams","get","custParamsObj","split","newCustParams","entries","map","set","origin","pathname","addCustParamsSsi","ssai","adParameters","cust_params","apiUrl","ApiVideo","Api","attachApiUrl","freeWheelEnabled","drmEnabled","refreshResult","jwtRefreshToken","eJwtRefreshToken","active","accessToken","getAccessToken","getPlaybackInfoPath","statusText","streamSignature","daiAuthToken","responseData","getVideoUapPath","avia","PlayerEvent","createConsumerAdvice","services","options","consumerAdviceOptions","dom","isLive","consumerAdviceTimer","consumerAdviceActive","panel","main","consumerAdviceTimerId","container","debug","searchParams","startConsumerAdviceTimer","style","opacity","display","removeConsumerAdvice","hideConsumerAdvice","showConsumerAdvice","remove","handlePlayerEvent","evt","isAd","PLAYBACK_STATE_CHANGE","detail","playbackState","ACTIVE_STATE_CHANGE","activeState","AD_BREAK_COMPLETE","eventTypes","on","STREAM_METADATA","assetKey","shouldExclude","classification","consumerAdvice","displayOverlay","metadata","createElement","classList","add","position","transition","adviceContainer","wrapper","divider","innerHTML","appendChild","CONTENT_START","querySelector","children","optionalParams","getId","ConsumerAdvice","destroy","values","off","accountID","PlayerStates","PlayerCtrl","VodCtrl","LiveCtrl","ignore","createLogoDisplayOverlayPlugin","listening","styles","maxWidth","onContentStart","logoUrl","zIndex","level","top","left","padding","boxShadow","imageTag","getElementsByTagName","onEnded","removeChild","fadeIn","element","fadeOutInterval","fadeOut","fadeInInterval","READY","dir","CONTENT_SEGMENT_START","CONTENT_SEGMENT_END","LOGODISPLAYOVERLAY","onclick","ID","createPlugin","logoOverlay","createOverlayPlugin","getPlugin","PLUGIN_EVENT","RESOURCE_END","panelElement","playback","attachResource","render","once","CONTENT_PROGRESS","LIVE_PRESENTATION_STOPPED","OVERLAY","overlay","props","_resources","_initMockProgress","_firstLoad","_beginTimeStamp","_storedEvents","_oztamServiceConfig","adEventData","_playbackTime","_serverTimeOffset","updateInterval","hasTimestamp","currentStreamTime","customEpochStartingStreamTime","customEpochStartingTimeCheckpoint","customEpochLastCueUpdateTimeCheckpoint","id3EventCuedataOffsetTime","initializeVariables","resetVariables","offsetTime","calculateOffsetTimeInMs","stopIntervals","_initPlayer","playerShouldBeBlocked","_playerShouldBeBlocked","memberGated","loggedIn","_logger","getConsumerAdvice","_createPlayer","_updatePlayerState","DetectWindows7","GeoBlocked","AdBlockerOn","_onPlayerReady","getLogoUrl","_trackEvent","_handleEvent","watcherClickedLink","handleLIVEData","getLiveFields","authHandler","beginUpdateInterval","getPlayerCurrentTime","getCurrentTime","minimumTimeBeforeFirstCustomCueInSeconds","updateCue","setCustomEpochStartingTimes","_id3Wrapper","toISOString","min","max","canBeParsedAsDate","val","setServerTimeOffset","handleUserLogin","imsAPI","invalidateCache","logFreewheelDebug","string","qs","queryString","markAdOperations","_noAds","noads","playerContainerId","containerId","setOztamConfig","bvodApiKey","bvodPublisherName","AuthenticatedEndpointHandler","IMSAPIIntegration","globalSettings","globalFWEnable","experiments","rolloutPercentage","initializeUserFlag","playerMuted","state","playerState","PreInitialize","isMemberGated","liveChannels","componentDidMount","LiveCtrlUtils","detectTouchDevice","addBeforeUnloadListener","componentDidUpdate","prevProps","customFields","google_dai_key","_resetSession","_resetResources","componentWillUnmount","removeEventListener","percent","checkUserFlag","className","newPlayerState","setState","_updateOverlayState","slateUrl","stateOverlayFactory","OverlayFactory","ui","_createResources","playerOptions","createPlayerOptions","autoplay","Autoplay","ATTEMPT_UNMUTED","getId3Wrapper","resetAllocator","createVideoPlayer","initRecording","_playResources","filteredLiveChannels","filter","subArray","channel","channelUrl","relativeUrl","logo","_updateResource","playList","PLAYLIST","livePlayList","clear","_handleResources","slateTime","_displaySlateAndExecute","_clearSponsorLogo","_startPlaylistWithResources","_handlePlaylistCompleteEvent","DisplaySlateImage","childContainer","resources","addResources","next","_allocator","allocatorLiveEventMapping","videoWatchedDuration","getRecordedTime","stop","addWatcherToLink","links","querySelectorAll","from","getAttribute","target","defaultPrevented","extra","userId","eLocalStorage_tenUser","tu_oztamid","convertToVideoTrackObj","ipAddress","getUserIp","AdEventId","DeviceId","Genre","IpAddress","MediaId","MediaType","PublisherId","RegistrationId","SessionId","TimeStamp","UserAgent","VendorVersion","activeChannels","isLivePrerollDisabled","isChannelPreRollDisabled","flatMap","channels","isPreRollDisabled","_playBackInfo","getPlaybackInfo","prerollDisabled","imsData","prerollSource","createPrerollResource","fetchIMSDataAndLog","contentSource","createLiveStreamResource","_addCueListener","cueWatcher","getTxxxGoogleAdData","getCueDataFromId3Event","cueDataTime","cueDataTimeWithOffset","dateTimeDifference","maxTime","cueObjectDataAdjusted","toUpperCase","cueObjectInfoAdjusted","ArrayBuffer","String","fromCharCode","apply","Uint8Array","reset","_resetId3","AllocatorLive","id3","_checkId3","mediaInfoNew","publisherid","newCustomFields","show_title","mockOztamProgress","currentTimestamp","delayDuration","fullProgressEvents","partialProgressDuration","timeToFullProgress","latestEpochTime","epochStartTime","timeOffset","mockedPartialProgressEvents","offsetTimestamps","postProgressEvents","mockedProgressEvents","mockProgressData","mockedProgressEvent","storeEvents","fullProgress","partialDuration","fromSeconds","to","offset","eventArray","setEventFields","numFullEvents","isPartial","eventStartEpoch","dataFields","mapMediaInfo","updatedOztamConfig","trackingFields","progressFetch","eType","allocatorEvent","allocatorVideoObj","RESOURCE_START","CONTENT_PLAYING","CONTENT_PAUSED","lastPausedTimestamp","reload","AD_PAUSED","AD_PLAYING","muted","AD_START","adPosition","adObject","ads","podInfo","j","adPodInfo","generateAdData","MUTE_CHANGE","coppaFlag","userIp","coppa","getIMSData","programClassification","showRatingClassification","playbackSettings","consumerAdviceDisplayTime","poster","theme","html","isDesktop","getElementById","renderTextTrackNatively","useNativeFullscreen","enableMoat","overrides","liveStreamPausable","plugins","compactViewBreakpoint","hls","gam","playlist","consumeradvice","prerollResource","createResourceConfig","videoAdConfig","setVideoAdConfig","imaAdCallUrl","formatIMAServerUrl","showPrerollOnNonZeroStart","loadVideoTimeoutMs","preloadContentAtEndOfPreRoll","enableAdPreloading","fwParameters","playBackInfo","liveStreamResource","account","site","cmsID","requestParams","customParams","fwParamsToSpread","csidPrefix","FW_SITE_SECTION_ID","fw","fwSiteSectionId","imafw_csid","adParams","gr","eLocalStorage_tenUser_info","tu_gr","ge","tu_ge","collection","videoContentCategories","showGenres","pcode","tu_memberPostcode","session","sub","tu_n10adId","tvid","oztamozsid","additionalParams","plabackInfo","miscData","imafw_mode","transformedData","freeWheelParams","generateGoogleAdTagParams","enableFreeWheel","dai","contentSourceId","fms_params","reduce","object","format","VideoFormat","HLS","iu","cmsid","generateCustomParams","ppid","generateRequestParams","vpmute","viewabilityTracking","partner","viewGuid","pageType","kv","reqParams","retrievedLocalStorageState","tvid_callback","companionAds","isCompanionAds","adSizes","hasOwnProperty","beginTimeStamp","intervalId","metadataCuePointTimeout","elapsedWatchTime","isPaused","messageColors","color","currentTimeStamp","roundSecondsToNearestMinute","totalSeconds","totalMinutes","bind","OztamV2AviaLive","TealiumAvia","OzTamV2","onHoldProgressFields","delayProgressLogic","originalCanDispatch","originalCanDispatchFlag","newEpochtime","thisProgressFromEpochtime","batchProgressTrack","newEpochTime","playEpochtime","progressFromPosition","field","splice","pauseTimestamp","id3Wrapper","ceil","syncedEpoch","isTokenCached","tu_accesstoken","tu_refreshtoken","getTokenList","refreshToken","expiresIn","tu_expiresin","expiresAt","tu_expiresat","removeTokenList","getSocialStatus","socialLinks","tu_socialLinks","isExpired","isLoggedIn","isLoggedOut","setUserDetail","userDetail","getUserFavouriteShows","eLocalSotrage_tenUser_favourites","tu_shows","getUserFavouriteRecipes","tu_recipes","setUserFavouriteShows","shows","setUserFavouriteRecipes","recipes","removeFavouriteShows","removeFavouriteRecipes","setMemberId","jwt","tu_memberid","memberId","getMemberId","setAutoplaySetting","eLocalSotrage_tenUser_autoplay","tu_autoplay","setMemberEmailHashed","tu_memberEmailHashed","memberEmailHash","getMemberEmailHashed","setTokenList","setSocialStatus","statusList","socialStatus","socialSite","linkSocialStatus","socialName","unlinkSocialStatus","unlinkIndex","removeAllCache","localStorage_remain","eLocalSotrage_tenUser_progress","tu_progress","eLocalStorage_tenUser_display","tu_name","tu_firstname","tu_lastname","tu_email","eLocalStorage_tenUser_backend","tu_username","tu_userid","tu_datecreated","tu_geo","tu_vpn","tu_vpn_switch","eLocalStorage_tenUser_token","tu_tokentimestamp","eLocalStorage_tenTrack","tt_deviceid","eLocalStorage","_player","heading","rel","onClick","ProxyCheck","storageClean","vpnStorageCleanUp","ErrorFetchingVideo","ErrorFetchingAd","backgroundImage","State","ORIGIN_PROD","ORIGIN_DEV","freeWheelConfig","contentId","cmsId","ImsApiParameters","getStateFromPostcode","postcode","numericPostcode","matchedState","range","ACT","NT","NSW","VIC","QLD","SA","WA","TAS","globalParams","defaultSitePage","sitePage","globalInterfaceParams","imafw__fw_coppa","imafw__fw_site_page","imafw__fw_h_x_country","imafw__fw_content_id","getGlobalParams","customInterfaceParams","imafw_ge","imafw_gr","imafw_pcode","imafw__fw_h_x_postal_code","imafw_sub","imafw_session","imafw_tvid","imafw_state","bvodParams","getBvodCustomParams","getCustomParams","extraParams","videoData","generateExtraFreeWheelParams","adTagParams","createAdTagParams","Component","_bypassAdBlockDetection","bypassShows","bypassDetection","_init","ctrls","batchResumePlay","ctrlsStateCache","ctrl","ePlayerCtrlState","play","playing","notPlay","_initVTG","vtg","OzTam","serverInfo","vodKey","liveKey","bypassAdBlockDetection","geoBlockResponse","adBlockResponse","vpnBlockResponse","promiseAllSettled","Geo","isGeoBlocked","isAdBlock","vpnCheck","isAdBlocked","isVpnBlocked","_deniedGeoBlocker","ePlayerBlockedReason","geoBlocker","isWindows7","_deniedWindows7","win7Blocker","_deniedAdBlocker","adBlocker","OzTamSessionID","name","clipTitle","description","long_description","head_position","created_at","published","published_at","updated_at","reference_id","referenceId","altId","tvChannel","tvShow","episode","tv_season","episodeCrid","seriesCrid","expiry_date","expiry","videoTypeLongForm","market","allocatorVideo","playerEventStateMap","Paused","CONTENT_COMPLETE","End","ERROR","ErrorOccurred","AD_PROGRESS","AdPlaying","result","memberEmailHashed","memberLoginStatus","memberGender","getMemberGender","memberAge","getMemberAge","memberPostcode","getMemberPostcode","memberFavouriteGenre","getMemberFavouriteGenre","isBlocked","tryRequest","appVersion","clientWidth","clientHeight","detectBrowser","version","browserName","mimeTypes","enabledPlugin","ActiveXObject","d","c","r","results","RegExp","exec","urlUtil","paramKeys","paramStr","substr","paramArray","getOffsetTop","nodeName","offsetTop","offsetParent","lazyCallback","slotElement","pixelOffset","callbackWrapper","eventCallback","windowScrollTop","pageYOffset","scrollY","windowScrollBottom","innerHeight","slotOffsetTop","slotOffsetBottom","cookies","expireAllCookies","paths","expires","toUTCString","cookie","l","deleteCookie","setCookie","getCookie","reg","encodeURIComponent","time","date","days","setTime","hours","mins","seconds","storages","getJSONFromLocalStorage","storageData","setJSONToLocalStorage","stringifyData","documentElement","documentClientWidth","documentClientHeight","isMobile","isTablet","isMobileWidth","isTabletWidth","isDesktopWidth","videoId","urlString","size","additionalParam","paramMappings","path","paramMapping","ind","paramOut","mappingKey","mappingValue","findIndex","extensionOut","out","extensionValue","extensionReplaceMapping","replaceKV","processParamMapping","Set","generateAdditionalParam","categoryPath","appendingCustomParams","hasShowVideo","isShowPage","createUpNext","panelEnd","panelNext","nextVideos","videoEndPanelTemplate","upNextCardTemplate","upNextAutoplay","countdownSeconds","countdownHandler","isOpen","vodPlayList","killUpNextPanel","altMediaId","videoEndPanel","upNextCard","createVideoEndPanel","handlePanelClick","handleAutoplay","isFullscreenMode","dataIndex","playNextVideo","tenService","pageAllocator","AutoplayClass","ON","OFF","exitFullscreen","countDownContainer","offBtn","onBtn","updateCountDownText","updateCountdown","countDownElement","tileIndex","dispatchPluginEvent","killVideoEndPanel","contains","compressIcon","offsetWidth","hideCompressionIcon","contentDuration","image","videoArray","upNext","moreVideos","airDate","videos","createDisplayPlugin","onResourceEnd","handlePluginEvent","killPanel","DISPLAY","AllocatorVod","serviceConfig","OztamV2AviaVod","TealiumAviaVod","allocatorVodEventMapping","SEEK_START","SEEK_COMPLETE","PLAYBACK_SUSPENDED","watchPercentageCounter","WatchPercentageCounter","watchedPercentage","eventPercentage","shouldTrack","tealiumData","TealiumData","breakpoints","trackedPercentage","shouldTrackBreakpoint","breakpoint","VPEnums","progressApiTmp","FETCH_URL","REFRESH_URL","progressApi","VideoProgressManager","getAllProgress","progressObj","progressItem","videoCode","progress","nowTimestamp","requestedTimestamp","getProgressInterval","VPQuery","fetchVideoProgress","_endProgressFired","needSync","_interactionWatcher","_syncIntervalWatcher","_closeToEndWatcher","_prevSyncTimestamp","timeChecking","_checkTimer","dateNow","INPUT_DURATION","_syncProgress","initVideoWatcher","_resetWatcher","_urlCode","_registerCurrentProgress","_syncingWatchInterval","_closeToEndInterval","_currentProgressItem","INTERVAL_DURATION","THRESHHOLD_SECONDS","END_INTERVAL","msProgress","syncServerProgress","getHeaders","tenAuth","CONTENT_TYPE","header","videoObject","textTrackContainer","textTrackStartTime","textTrackEndTime","ccText","textTrackElement","textTrackEnabled","TEXT_TRACK_AVAILABLE","TEXT_TRACK_ENABLED_CHANGE","removeTextTrackElement","FULLSCREEN_CHANGE","fullscreen","showTextTrackElement","height","updateTextTrack","textCuePoint","activeCue","createTextTrackElement","hasChildNodes","cssBoxContainer","width","cssBoxInner","setAttribute","textTrack","backgroundColor","fontWeight","fontSize","elementId","timeDifference","ticker","parentElement","tickerCountDown","updateTextTrackFontSize","ccBoxContainer","desiredFontSize","_adLoadTimeout","_isFirstPlay","isDaiEnabled","_changeResource","videoChangeHandler","initPlayer","newVideo","_video","noAds","disableAds","_updateVideoNoAds","_updateVideo","_progressMag","playerUIEffects","textTrackManager","videoTextTrackManager","_onPlayerEvent","playerId","upNextPlaying","remainingString","textCuepoint","removeVideoPlayer","_overlayFactories","vodCreatePlayer","ATTEMPT_UNMUTED_THEN_MUTED","onPlayerReady","videoResource","_getVideoResource","adResource","_getAdResource","playbackInfo","videoInfo","playbackInfoResponse","videoInfoResponse","all","getVideoUapInfo","drm","_videoInfo","myResource","progressDuration","getVideoProgress","videoPercentage","cleanTextTrackUrl","captionUrl","propUrlCode","resourceDuration","mediaUrl","textTrackUrl","videoIdForTracking","videoIdForAdCalls","seriesId","episodeId","seriesName","episodeName","demo1","getVODFields","detectDeviceType","isIos","handleVODData","signature","commonParams","imafw__fw_continuous_play","custPram","isSafari","isBrowserEnvironment","drmConfig","laType","playready","laUrl","priority","audioRobustness","videoRobustness","widevine","fairplay","appCertUrl","cert","licenseUrl","ckc","enableStalledAdCheck","vastLoadTimeout","stalledAdThreshold","DASH","filterOutPremiumAudioCodecs","_playerEventToState","onPlayerStateChange","fatal","category","ErrorCategory","RESOURCE","ErrorMessage","IMA_SDK_MISSING","AD","ErrorCode","DAI_DATA_ERROR","AD_STALLED","secondsRemaining","Next","calculateRemainingTime","addRemaingTimeAttribute","AUTOPLAY_BLOCKED","TEXT_CUEPOINT","PlaybackState","PAUSED","PLAYING","playCount","playingCheck","onPlayerEvent","restartVideoWithoutAds","restartPlayerCSAI","remainingText","remainderSeconds","remainingMinutes","checkExist","playBtn","slider","volCtrl","getUrlParam","paramName","performanceMode","PerformanceMode","AUTO","playsInline","enableOm","posterImageUrl","activeMode","ActiveMode","enableMobileCaptionsAndSettings","dash","upnext","enabledFlash","isFlashPlayerEnabled","metaObject","metaDOMs","playerConfig","trackingService","adsServiceConfig","retrievedLocalStorageStte","targettedPageCategories","isTargetedCategoryPage","getShowName","isHubPage","hubName","siteSubSection1","isShow","siteSection","getFeatureAdConfig","pos","sizeAny","parent","insert","into","successLoadCallback","c06_handleSuccessLoad","blankAdCallback","c06_handleBlankLoad","adServiceConfig","staticAdConfig","lazyLoading","pagePathInfo","foundEmptyItem","subUrlPath","sections","n","getUpdatedSections","subUrl","PagePathInfo","pathRule","ptypeRule","clearEnding","pathName","content","pageContentType","section","siteSubSection3","keyValueRule","A_Range","keyValueRules","k","v","pv0","pv24","currentPV","sessionCookie","oneDayCookie","addShowName","addRecipeCollection","recipeCollection","addContentTags","addHubName","addChannelName","collections","concat","exclusionRule","general","extraTargeting","articleTags","recipeTags","adsUtil","replaceSpecChar_cid","recipeTitle","articleTitle","cbsSession","genericSlots","before","mrec_handleSuccessLoad","mrec_handleBlankLoad","desktopSlots","preloadCallback","skin_handlePreload","skin_handleSuccessLoad","skin_handleBlankLoad","adhesion_handlePreload","adhesion_handleSuccessLoad","adhesion_handleBlankLoad","mobileSlots","cidString","DrmFilter","drmFilter","ErrorHandler","vjsErrorHandler","EventHandler","vjsEventHandler","TrackingService","OverlayUI","vjsOverlayUI","VideoPlaySync","vjsVideoPlaySync","VolumeSync","vjsVolumeSync","attributes","baseCustEnv","omniture","namespace","server","nielsen","sfcode","apid","apn","nsdkv","nol_devDebug","eDebug_Title","getIOSVersion","matchResult","gup","isIOSWebkitBrowser","ios","iphone","ipad","desktop","src","Log","debugServiceName","debugConfig","debugUrlParam","ignoreBoolean","formatOutputArgs","arrArgs","convertArgumentToArray","arr","arguments","logCatch","tenDebug","intervalStock","addInterval","baseURL","COPPA_CACHE_KEY","cacheKey","cacheResponse","ttl","getCachedResponse","cachedData","parsedData","isIosPlatform","generateFallbackParams","identifiers","appInfo","imafw__fw_vcid2","userid","getOrCreateUserId","imafw_fms_vcid2type","emailhash","imafw_fms_emailhash","fetchIMSData","deviceInfo","cachedResponse","payload","app","fms_id_ttl","getCachedCoppaStatus","updateCoppaStatus","webhost","googledai","region","lat","ua","rawIdentifiers","subscriberid","removeEmptyStringProperties","isFreewheelDebugEnabled","setCoppaStatus","currentStatus","oldStatus","newStatus","pagePath","pageStructureMap","getPathNameAsArray","getPathPattern","getContentId","getShow","lastSubPath","subSection","reachTheEndOfMenu","nextLevelName","show","slice","adhesionTemplate","divTmp","getAdhesion","adParent","adEvent","createEvent","initEvent","dispatchEvent","handleSuccess","handleBlank","handleSuccessOfCarousel","handleBlankOfCarousel","imgStyleUrlAttrName","adSkinLeft","adSkinRight","firstChildDiv","parentNode","insertBefore","checkAdImgInterval","adSkinBGImage","getComputedStyle","prevStyle","prevImg","initedSkinHandler","bodyWidth","innerWidth","head","marquee","carousel","slick","marginLeft","currentLeft","newLeft","removeMarginLeft","syncPosition","initSkinHandler","updateSkinImg","eAllocatorService","allocator","Allocator_Video","_firstRoundPlay","initOmniture","initNielsen","calledPrerollBreakStart","validationHost","videoType","dataModelUtil","matchModel","dataModels","eventWillBeHandled","validate","videoLoadMetadata","triggerevent","hasPreroll","videoStartMetadata","videoFirstPlayMetadata","videoPause","videoUnpause","onSegment","videoEndMetadata","adPlayMetadata","onAdStart","adPause","adResume","adStopMetadata","setHasPreroll","adBreakStart","adBreakEnd","onAdBreakComplete","Events","triggeredErrors","pageInfo","platformName","platformPostfix","pageTitle","pageId","isFullEpisode","web_content_url","clip_category","preroll","asset_id","model","dataObject","errorMsg","makeData","mapping","tmp","mappedKey","tenTrackTmp","cookieEnabled","tmpDeviceId","newCookieDeviceId","generateUUID","userId_ten","userId_oztam","userId_nielsen","BrightcoveIMABackendEvent","eIMAEvent","catalogLoad","catalog","useDrmValue","video_type_drm_only","useDrm","sources","filtered","isDrmSource","key_systems","keySystems","isNotDrmSource","cue_points","brightcoveControlledDiv","el","progressHolder","progressBar","cuePointClass","div","getSingletonEventHandlers","eventLog","player_event","loadedMetadata","getMediaData","realFirstPlay","closeTheEnd","ended","trackingSingletonEvents","singletonEventsHandler","handlers","one","trackingFirstPlayEvents","realFirstPlayTriggered","triggerRealFirstPlay","adsPodEndedCallback","playedAds","silentAdTimeout","waitingAd","AdsPodEnded","AdTimeout","ima3","dataAttrs","ima3AdError","headPosition","mediainfoMapping","adsObject","currentPosition","adTypes","adMeta","getAdCompleteData","getTimeInSec","previousSegment","previousPosition","nowSec","hasStarted","AdsPlay","adPlayer","AdsPause","AdsAdStarted","AdsAdEnded","AdsPodStarted","playerCurrentTime","mediaCues","cuePoints","getCues","currentSegment","cues","getSegmentId"],"sourceRoot":""}