stormcloud-video-player 0.8.59 → 0.8.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1369 -1369
  3. package/dist/stormcloud-vp.min.js +3 -1
  4. package/lib/Player.cjs +548 -0
  5. package/lib/Player.cjs.map +1 -0
  6. package/lib/Player.d.cts +146 -0
  7. package/lib/{index.js → StormcloudPlayer.cjs} +1193 -1908
  8. package/lib/StormcloudPlayer.cjs.map +1 -0
  9. package/lib/{index.d.ts → StormcloudPlayer.d.cts} +7 -400
  10. package/lib/index.cjs +1064 -280
  11. package/lib/index.cjs.map +1 -1
  12. package/lib/index.d.cts +18 -4032
  13. package/lib/patterns.cjs +111 -0
  14. package/lib/patterns.cjs.map +1 -0
  15. package/lib/patterns.d.cts +14 -0
  16. package/lib/player/AdBreakOrchestrator.cjs +51 -16
  17. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  18. package/lib/player/AdBreakOrchestrator.d.cts +3 -1
  19. package/lib/player/AdConfigManager.cjs +206 -26
  20. package/lib/player/AdConfigManager.cjs.map +1 -1
  21. package/lib/player/AdConfigManager.d.cts +1 -1
  22. package/lib/player/AdTimingService.cjs.map +1 -1
  23. package/lib/player/AdTimingService.d.cts +1 -1
  24. package/lib/player/HlsEngine.cjs.map +1 -1
  25. package/lib/player/HlsEngine.d.cts +1 -1
  26. package/lib/player/PlaceholderLayer.cjs.map +1 -1
  27. package/lib/player/PlayerControls.cjs.map +1 -1
  28. package/lib/player/PlayerControls.d.cts +1 -1
  29. package/lib/player/Scte35CueManager.cjs.map +1 -1
  30. package/lib/player/Scte35CueManager.d.cts +1 -1
  31. package/lib/player/Scte35Parser.cjs.map +1 -1
  32. package/lib/player/Scte35Parser.d.cts +1 -1
  33. package/lib/player/StormcloudVideoPlayer.cjs +1060 -278
  34. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  35. package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
  36. package/lib/player/playerTypes.cjs.map +1 -1
  37. package/lib/player/playerTypes.d.cts +1 -1
  38. package/lib/players/FilePlayer.cjs.map +1 -1
  39. package/lib/players/HlsPlayer.cjs +1060 -278
  40. package/lib/players/HlsPlayer.cjs.map +1 -1
  41. package/lib/players/HlsPlayer.d.cts +1 -1
  42. package/lib/players/index.cjs +1060 -278
  43. package/lib/players/index.cjs.map +1 -1
  44. package/lib/props.cjs +186 -0
  45. package/lib/props.cjs.map +1 -0
  46. package/lib/props.d.cts +62 -0
  47. package/lib/sdk/hlsAdPlayer.cjs +884 -234
  48. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  49. package/lib/sdk/hlsAdPlayer.d.cts +1 -1
  50. package/lib/sdk/pal.cjs +9 -5
  51. package/lib/sdk/pal.cjs.map +1 -1
  52. package/lib/sdk/pal.d.cts +1 -0
  53. package/lib/types.cjs +49 -0
  54. package/lib/types.cjs.map +1 -0
  55. package/lib/{types-52ASml2N.d.cts → types.d.cts} +48 -1
  56. package/lib/ui/StormcloudVideoPlayer.cjs +1064 -280
  57. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  58. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  59. package/lib/utils/browserCompat.cjs.map +1 -1
  60. package/lib/utils/ctvVastSignals.cjs +178 -19
  61. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  62. package/lib/utils/devUrl.cjs.map +1 -1
  63. package/lib/utils/polyfills.cjs.map +1 -1
  64. package/lib/utils/tracking.cjs +45 -16
  65. package/lib/utils/tracking.cjs.map +1 -1
  66. package/lib/utils/tracking.d.cts +1 -1
  67. package/lib/utils/trackingIngest.cjs.map +1 -1
  68. package/lib/utils/vastEnvironmentSignals.cjs +192 -20
  69. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
  70. package/lib/utils/vastEnvironmentSignals.d.cts +13 -2
  71. package/lib/utils/vastMacros.cjs +50 -4
  72. package/lib/utils/vastMacros.cjs.map +1 -1
  73. package/lib/utils/vastMacros.d.cts +2 -0
  74. package/lib/utils/vastTrackingMacros.cjs +5 -0
  75. package/lib/utils/vastTrackingMacros.cjs.map +1 -1
  76. package/lib/utils/vastTrackingMacros.d.cts +2 -0
  77. package/lib/utils.cjs +292 -0
  78. package/lib/utils.cjs.map +1 -0
  79. package/lib/utils.d.cts +17 -0
  80. package/package.json +91 -91
  81. package/rollup.config.js +90 -90
  82. package/lib/index.js.map +0 -1
package/lib/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/index.cjs","../src/index.ts","../src/ui/StormcloudVideoPlayer.tsx","../src/sdk/hlsAdPlayer.ts","../src/utils/browserCompat.ts","../src/utils/vastTrackingMacros.ts","../src/utils/devUrl.ts","../src/sdk/pal.ts","../src/utils/trackingIngest.ts","../src/utils/vastEnvironmentSignals.ts","../src/utils/tracking.ts","../src/utils/polyfills.ts","../src/utils/vastMacros.ts","../src/player/Scte35Parser.ts","../src/player/Scte35CueManager.ts","../src/player/AdConfigManager.ts","../src/player/AdTimingService.ts","../src/player/PlaceholderLayer.ts","../src/player/HlsEngine.ts","../src/player/PlayerControls.ts","../src/player/AdBreakOrchestrator.ts","../src/player/StormcloudVideoPlayer.ts","../src/StormcloudPlayer.tsx","../src/props.ts","../src/utils.ts","../src/patterns.ts","../src/players/HlsPlayer.tsx","../src/players/FilePlayer.tsx","../src/players/index.ts","../src/Player.tsx"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","index_exports","DEFAULT_TRACKING_INGEST_CONFIG","IS_BROWSER","IS_GLOBAL","IS_IOS","IS_SAFARI","SUPPORTS_DASH","SUPPORTS_HLS","StormcloudPlayer","StormcloudPlayer_default","StormcloudVideoPlayer","StormcloudVideoPlayerComponent","applyTrackingIngestConfig","buildAnalyticsContext","canPlay","configureTrackingIngest","createHlsAdPlayer","createPalNonceManager","createStormcloudPlayer","default","detectBrowser","getBrowserConfigOverrides","getBrowserID","getClientInfo","ingestPlayerTracking","initializePolyfills","isMediaStream","isTrackingIngestEnabled","lazy","logBrowserInfo","merge","omit","parseQuery","players","players_default","randomString","requiresMediaPipelineResetAfterAds","sendAdDetectTracking","sendAdImpressionTracking","sendAdLoadedTracking","sendHeartbeat","sendInitialTracking","supportsFeature","supportsModernJS","supportsWebKitPresentationMode","trackingIngestConfig","module","exports","import_react","require","import_hls","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","version","majorVersion","isSmartTV","isLegacyTV","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams","browser","overrides","allowNativeHls","pauseContentDuringAds","Array","assign","forEach","String","includes","e","debug","console","log","feature","TextEncoder","fetch","crypto","subtle","VAST_MACRO_PATTERN","CACHEBUSTING_ALIASES","KNOWN_VAST_MACROS","generateCachebuster","Math","floor","random","formatPlayhead","seconds","Number","isFinite","total","hh","padStart","mm","ss","ms","resolveMacroValues","ctx","values","set","adPlayhead","adPlayheadSeconds","contentPlayheadSeconds","assetUri","mediaMime","Date","toISOString","errorCode","playerWidth","playerHeight","round","deviceId","deviceIdType","limitAdTracking","pageUrl","URL","hostname","clientUa","podSequence","substituteVastTrackingMacros","url","replace","encodeURIComponent","has","MAX_VAST_WRAPPER_DEPTH","BEACON_TIMEOUT_MS","inFlightBeacons","VAST_ERROR_MEDIA_DISPLAY","toVastMediaErrorCode","error","code","contentVideo","options","adPlaying","originalMutedState","originalVolume","max","min","volume","listeners","mainHlsInstance","AD_CONTAINER_PROP","AD_VIDEO_PROP","FRAME_COUNTER_RELIABLE_PROP","RVFC_RELIABLE_PROP","adVideoElement","adHls","adContainerEl","adEventHandlers","currentAd","currentAdMediaFile","podAds","podIndex","preloadedAds","preloadingAds","destroyed","pendingTimeouts","STALL_TIMEOUT_MS","STALL_CHECK_INTERVAL_MS","BLACKFRAME_MIN_PLAYBACK_S","stallWatchdogId","lastAdProgressTime","lastAdProgressPosition","sawDecodedVideoFrame","videoFrameCallbackHandle","pendingPlayPromise","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","fn","warn","buildTrackingMacroContext","context","currentTime","type","clientWidth","clientHeight","location","href","length","fireTrackingPixels","urls","macroContext","trackingUrl","img","Image","add","timeoutId","release","clearTimeout","onload","onerror","delete","setTimeout","src","getMainStreamQuality","levels","currentLevel","autoLevel","loadLevel","level","width","height","bitrate","selectBestMediaFile","mediaFiles","Error","firstFile","mainQuality","scoredFiles","map","file","widthDiff","abs","heightDiff","resolutionDiff","fileBitrate","bitrateDiff","score","sort","a","b","bestMatch","resolution","isHlsMediaFile","mediaFile","toLowerCase","isProgressiveMediaFile","startsWith","endsWith","isAudioMediaFile","trim","collectVideoMediaFiles","scope","verbose","mediaFileElements","querySelectorAll","mf","index","getAttribute","textContent","bitrateAttr","bitrateValue","hasExplicitDimensions","push","createEmptyTrackingUrls","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","extractTrackingUrls","trackingUrls","el","eventKey","mergeTrackingUrls","source","keys","concat","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","adElement","adId","title","clickThrough","wrapperUri","vastAdTagUri","isNoAdAvailable","durationText","durationParts","duration","ad","id","parseAdElement","fetchVastXml","vastTagUrl","credentials","requestVast","response","creds","mode","headers","referrerPolicy","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","substring","fetchAndParsePod","trimmedXml","adElements","ads","resolved","aSeq","bSeq","aVal","MAX_SAFE_INTEGER","bVal","createAdVideoElement","video","document","createElement","style","position","left","top","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","onTimeUpdate","noteAdProgress","progress","onLoadedMetadata","videoWidth","videoHeight","handleVideoDecodeFailure","onPlaying","startStallWatchdog","onEnded","advanceToNextPodAd","handleAdComplete","onError","handleAdError","onVolumeChange","onPause","ended","onPlay","handler","addEventListener","teardownAdEventListeners","removeEventListener","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","resetQuartileTracking","preserveImpression","isRvfcSupported","requestVideoFrameCallback","settlePendingPlay","startAdPlayback","playPromise","play","catch","finally","prepareVideoElementForNewSource","destroy","removeAttribute","load","recreateAdVideoElement","remove","appendChild","loadCurrentAdMedia","isHlsAd","Hls","isSupported","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","ERROR","_event","data","fatal","canPlayType","clearStallWatchdog","clearInterval","cancelVideoFrameProbe","now","handleAdStall","getDecodedVideoFrameCount","getVideoPlaybackQuality","quality","totalVideoFrames","legacyCount","webkitDecodedFrameCount","isFrameCounterReliable","markFrameCounterReliable","isRvfcReliable","markRvfcReliable","cancelVideoFrameCallback","startVideoFrameProbe","rvfc","onPresentedFrame","blackFrameDetectionEnabled","window","setInterval","paused","decodedFrames","timeAdvancing","releaseAdDecoder","display","pointerEvents","continueLiveStreamDuringAds","visibility","opacity","initialize","container","right","bottom","alignItems","justifyContent","zIndex","parentElement","requestAds","preloaded","reject","resolve","contentVolume","stop","previousMutedState","clear","isAdPlaying","resize","listener","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","PRIVATE_HOST_PATTERNS","isLocalDevHost","host","some","pattern","toDevSafeUrl","rawUrl","protocol","cleanPath","pathname","PAL_SDK_URL","_nonceLoader","_palLoadPromise","loadPalSdk","goog","pal","existing","timeout","script","async","setAttribute","head","getOrCreateNonceLoader","consentSettings","ConsentSettings","allowStorage","NonceLoader","currentNonce","currentNonceManager","generateNonce","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","iconsSupported","playerType","playerVersion","supportedApiFrameworks","ppid","sessionId","JSON","stringify","loadNonceManager","getNonce","getCurrentNonce","injectNonce","searchParams","base","sep","sendPlaybackStart","sendPlaybackEnd","sendAdClick","sendAdTouch","reset","enabled","baseUrl","normalizeIngestBaseUrl","buildTrackingIngestUrl","channel","licenseKey","body","method","Authorization","status","CTV_SESSION_STORAGE_KEY","PLAYER_ID_STORAGE_KEY","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","resolveVastEnvironmentSignals","isCtv","platformLat","bridgeSignals","readNativeBridgeSignals","platformDevice","readPlatformNativeDeviceId","realDeviceId","readStoredDeviceId","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","dpid","getOrCreateStoredUuid","getOrCreateCtvSessionId","deviceTypeHint","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","resolveNativeDeviceId","isMacroPlaceholder","isZeroedAdId","storageKey","readPersistentId","writePersistentId","createUuid","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","cookie","part","entry","decodeURIComponent","slice","bytes","randomUUID","Uint8Array","getRandomValues","seed","performanceNow","i","hex","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","candidates","__STORMCLOUD_CTV_AD_INFO__","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","filter","Boolean","contentUrl","readBridgeValue","appId","appName","readBridgeBoolean","result","normalized","normalizeBoolean","getItem","cachedBrowserId","config","debugAdTiming","isLiveStream","inputStreamType","screen","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","os","model","isAndroid","isWebView","isWebApp","webosMatch","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","origin","path","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","sha256Hex","input","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","digest","encode","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","metricEvent","events","adDetectInfo","adLoadedInfo","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","polyfillPromiseFinally","constructor","then","reason","polyfillObjectAssign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","indexOf","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","getValue","correlator","trimmed","generateCorrelator","buf","Uint32Array","expandInlineMacroPlaceholders","applyDeviceIdentityParams","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","_match","val","applyVastMacros","expandedUrl","replaceCorrelatorFallback","streamCorrelator","pod","podMinDurationMs","podMaxDurationMs","podMaxAds","existingUrl","consent","gdpr","gdprConsent","usPrivacy","adTest","programTitle","staleKeys","correlatorRegex","fetchConsentSignals","timeoutMs","signals","tasks","tcfApi","__tcfapi","settled","tcData","success","eventStatus","gdprApplies","tcString","listenerId","uspApi","__uspapi","uspString","parseCueOutDuration","num","parseFloat","dStr","d","parseCueOutCont","res","elapsedMatch","durationMatch","elapsed","slashMatch","parseAttributeList","attrs","regex","exec","rawVal","toNumber","n","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","decode","out","fromCharCode","getFragmentStartSeconds","frag","startPTS","candidate","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","packetSize","tsPayloadOffset","offset","matchedPackets","packetStart","getPsiSectionStart","payloadUnitStart","pointerField","sectionStart","getPsiSectionLength","parsePatSection","pmtPids","sectionLength","sectionEnd","programNumber","pid","descriptorsIdentifyScte35","end","descriptorStart","descriptorEnd","registration","parsePmtSection","tsScte35Pids","programInfoLength","streamType","elementaryPid","esInfoLength","hasProcessedTsScte35Section","section","processedSections","checksum","size","firstKey","next","addScte35SectionMarker","markers","appendScte35Bytes","assemblers","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","bitPos","readBits","numBits","remainingInByte","toRead","currentByte","shift","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","parseScte35SegmentationDescriptor","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","durationTicks","segmentationUpidLength","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorLength","descriptorDataStart","descriptorDataEnd","descriptorMarker","ptsAdjHigh","ptsAdjLow","spliceCommandLength","spliceCommandType","spliceEventId","commandBodyStart","cancel","outOfNetwork","programSpliceFlag","durationFlag","spliceImmediateFlag","componentPtsSeconds","expectedDescriptorOffset","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","inAdBreak","isInAdBreak","hasRecentlyHandledScte35Cue","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","entries","getScte35CueKey","getScte35MarkerRaw","toIdentityString","daterangeId","ID","scteValue","isStrongScte35CueKey","recentKey","AdConfigManager","vmapBreaks","consumedVmapBreakIds","viewCorrelator","consentSignals","podCounter","podAssignedByPrefetch","lastHeartbeatTime","defaultPodMaxAds","defaultPodMaxDurationMs","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","vastMode","vastEndpoint","apiUrl","imaPayload","decodedPayload","numberAds","fetchAndParseVmap","apiVastTagUrl","json","ima","vast","cue_tones","number_ads","apiNumberAds","vmapXml","parseVmapToBreaks","doc","VMAP_NS","adBreakNodes","getElementsByTagNameNS","getElementsByTagName","localName","node","timeOffsetRaw","startTimeMs","parseVmapTimeOffsetToMs","adTagNode","adTagUrl","breakId","aStart","bStart","timeOffset","hms","hours","minutes","millis","percent","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","beginNewAdPod","resolvePodParams","breakDurationMs","maxDurationMs","maxAds","minDurationMs","podExactDuration","getPalDescriptionUrl","generatePodVastUrl","podParams","adPlayer","palNonce","envSignals","ctvAdRequest","urlWithMacros","autoplay","finalUrl","initializeTracking","heartbeatInterval","sendHeartbeatIfNeeded","destroyTracking","AdTimingService","adRequestWatchdogToken","adFailsafeToken","ptsDriftEmaMs","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","temporaryFailureCooldownMs","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillCooldownUntil","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalLastGamRequestTime","globalMinGamIntervalMs","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","ensureAdStoppedByTimer","adStopTimerId","onAdStopTimerFired","scheduleAdStartIn","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","adStartTimerId","updatePtsDrift","ptsSecondsSample","sampleMs","alpha","resolveScteBreakStartWallClockMs","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","expectedAdBreakDurationMs","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","scheduleAdStopAtBreakBoundary","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","getDurationBudgetRemainingMs","getLoadedAdDurationMs","adController","adFitsRemainingBudget","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","notePodAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","getMinRemainingMsToStartAd","configured","minRemainingMsToStartAd","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","message","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","exponent","backoff","pow","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adFailsafeTimeoutMs","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeTimerId","videoPaused","onFailsafeTimeout","extra","getAdState","showAds","resetForBreakEnd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","offsetHeight","requestAnimationFrame","hide","removeChild","HlsEngine","cueManager","timing","nativeHlsMode","videoSrcProtection","reloadingLiveStream","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","latencyProfileApplied","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","setupHls","hls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","details","live","onManifestParsed","detectedLowLatencyStream","minSegmentsBeforePlay","LEVEL_LOADED","_evt","applyStreamLatencyProfile","hasPendingAdBreak","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","err","FRAG_PARSING_METADATA","id3Tags","samples","pts","onId3Tag","FRAG_LOADED","processFragmentScte35Payload","FRAG_DECRYPTED","FRAG_CHANGED","activatePendingCuesForFragment","prog","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","onFatalDestroy","isLowLatencyStream","isLowLatencyManifest","useLowLatency","cfg","liveSyncDuration","liveSyncDurationCount","lowLatencyModeRequested","canBlockReload","partTarget","partHoldBack","partListLength","partList","targetDuration","targetduration","hasParts","hasPartTarget","hasPartHoldBack","payloadData","getLiveSyncPosition","liveSyncPosition","restartLoadAt","stopLoad","reloadLiveStream","detachMedia","recreateDelayMs","getAdAudioVolume","toggleMute","newMutedState","restoreVolume","toggleFullscreen","fullscreenElement","requestFullscreen","isMuted","setMuted","setVolume","clampedVolume","getVolume","isFullscreen","resizePlayer","AdBreakOrchestrator","adConfig","placeholder","isShowingPlaceholder","adDetectSentForCurrentBreak","continuousFetchingActive","continuousFetchLoopRunning","adRequestQueue","adPodQueue","maxPlaceholderDurationMs","pendingAdBreak","analyticsContext","nextAdRequestUrl","baseVastUrl","remaining","attachImaEventListeners","getAdPlayer","adIndex","queuedUrls","tryNextAvailableAdWithRateLimit","handleAdPodComplete","errorPayload","errorMessage","vastErrorCode","cause","innerError","causeMessage","handleAdFailure","recreateAdController","shouldShowPlaceholder","preservedMutedState","preservedVolumeState","shouldContinueLiveStreamDuringAds","newAdPlayer","createAdPlayer","setAdPlayer","clearPendingAdBreak","prefetchTimerId","handleAdStart","_marker","scheduled","tags","adBreakDurationMs","currentMuted","currentVolume","podPlayed","startOptimizedPod","startContinuousFetching","podUrl","requestToken","podCount","vastUrls","vastUrl","continuousFetchLoop","epoch","maxQueueSize","newAdUrl","queuedUrlsPreview","generationDelay","stopContinuousFetching","backoffMultiplier","backoffDelay","effectiveMinInterval","timeSinceLastRequest","waitTime","tryNextAvailableAd","retryCount","nextAdUrl","maxRetries","playSingleAd","showPlaceholderAndWaitForAds","ap","playError","checkInterval","maxChecks","restoredMuted","restoredVolume","monitorLiveResumeStall","liveSyncPos","toFixed","restartHlsLoad","resumeContentPlayback","getBufferedAhead","ranges","buffered","describeVideoState","networkStates","readyStates","v","net","networkState","ready","readyState","seeking","resumeBaseline","needsReset","pollIntervalMs","graceMs","recoveryCooldownMs","maxRecoveries","maxMonitorMs","startTime","baseline","recoveries","lastRecoveryAt","listenersAttached","onMediaEvent","diagEvents","dt","cleanup","poll","advanced","playing","bufferedAhead","wedged","canRecover","reloadPos","attempt","maxAttempts","onReady","backoffMs","playResult","attached","palPlaybackStarted","browserOverrides","videoElement","startAdPrefetch","onScte35Marker","startScte35AdBreak","hlsEngine","p","c","palDescriptionUrl","attach","offsetWidth","prerollKey","endedHandler","onVideoEnded","timeUpdateHandler","emptiedHandler","wasPaused","Infinity","newDurationMs","detectPayload","hasPrefetchedAds","isManifest","forceImmediate","immediateManifestAds","isManifestMarker","hasPts","estCurrentPtsMs","markerPtsMs","tolerance","hasQueuedAds","activeAdRequest","checkIntervalMs","adBreakCheckIntervalMs","maxExtensionMsConfig","maxAdBreakExtensionMs","maxExtensionMs","overrunMs","shouldExtendAdBreak","generatedUrls","detectedAtFragmentSn","isFetching","fetchStartTime","currentTimeSec","breakToPlay","handleVmapAdBreak","postroll","find","endMs","inWindow","first","rest","getCurrentAdIndex","getTotalAdsInBreak","getAdRemainingMs","isShowingAds","shouldShowNativeControls","showCustomControls","import_fa","import_jsx_runtime","ExpandIcon","jsxs","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","focusable","children","jsx","CompressIcon","CRITICAL_PROPS","CONTROLS_HIDE_DELAY","DEFAULT_PLAYER_ASPECT_RATIO","React","memo","props","hideLoadingIndicator","onVolumeToggle","onFullscreenToggle","onControlClick","wrapperClassName","wrapperStyle","className","controls","preload","poster","restVideoAttrs","videoRef","useRef","playerRef","bufferingTimeoutRef","controlsTimerRef","wrapperRef","useState","currentIndex","totalAds","remainingSeconds","adStatus","setAdStatus","setShouldShowNativeControls","setIsMuted","setIsFullscreen","setIsPlaying","setCurrentTime","setDuration","playbackRate","setPlaybackRate","showVolumeSlider","setShowVolumeSlider","showSpeedMenu","setShowSpeedMenu","isLoading","setIsLoading","isBuffering","setIsBuffering","showCenterPlay","setShowCenterPlay","showLicenseWarning","setShowLicenseWarning","controlsVisible","setControlsVisible","innerWidth","viewportWidth","setViewportWidth","innerHeight","isPortrait","setIsPortrait","playerAspectRatio","setPlayerAspectRatio","getResponsiveScale","responsiveScale","resetControlsTimer","useCallback","current","handleWrapperMouseMove","handleWrapperMouseLeave","formatTime","handlePlayPause","hasValidSource","currentSrc","handleCenterPlayClick","handleTimelineSeek","rect","currentTarget","getBoundingClientRect","clickX","clientX","newTime","handleVolumeChange","newVolume","handlePlaybackRateChange","rate","isHlsStream","isLiveUiMode","shouldShowEnhancedControls","criticalPropsKey","useMemo","prop","useEffect","player","showNative","checkAdStatus","showAdsFromMethod","showAdsFromAttribute","ceil","prev","interval","handleResize","updateStates","currentTimeValue","durationValue","volumeValue","rateValue","handleFullscreenChange","handleLoadedMetadata","handleLoadedData","handleLoadStart","handleCanPlay","handleCanPlayThrough","handleWaiting","handlePlaying","handlePause","isAdActive","handleEnded","progressPercent","VolumeIcon","FaVolumeMute","FaVolumeDown","FaVolumeUp","Fragment","ref","onMouseMove","onMouseLeave","overflow","minHeight","aspectRatio","maxWidth","maxHeight","borderRadius","boxShadow","transform","animation","inset","border","borderTopColor","borderRightColor","background","backdropFilter","color","padding","textAlign","margin","fontSize","fontWeight","marginBottom","letterSpacing","lineHeight","gap","textTransform","onClick","cursor","onMouseEnter","FaPlay","marginLeft","minWidth","FaPause","paddingRight","paddingLeft","onMouseDown","preventDefault","move","ev","up","stopPropagation","fontFamily","fontVariantNumeric","userSelect","WebkitBackdropFilter","speed","flexShrink","textShadow","flexDirection","prevProps","nextProps","uiProps","callbackProps","noop","defaultProps","loop","progressInterval","onStart","onBuffer","onBufferEnd","onDuration","onSeek","onProgress","import_react2","reactLazy","object","MediaStream","substr","queryString","manualParse","qs","isObject","item","globalThis","HLS_EXTENSIONS","HLS_PATHS","DASH_EXTENSIONS","VIDEO_EXTENSIONS","AUDIO_EXTENSIONS","dash","audio","HlsPlayer","arguments","mounted","onMount","seekTo","keepPlaying","getDuration","getCurrentTime","getSecondsLoaded","getInternalPlayer","componentDidMount","componentWillUnmount","componentDidUpdate","render","import_react3","Component","displayName","FilePlayer","handlePlay","handleError","onLoaded","setLoop","enablePIP","requestPictureInPicture","disablePIP","pictureInPictureElement","exitPictureInPicture","import_react4","lazyPlayer","canEnablePIP","pictureInPictureEnabled","webkitSupportsPresentationMode","SEEK_ON_PLAY_EXPIRY","Player","isReady","loadOnReady","startOnPlay","seekOnPlay","onDurationCalled","handlePlayerMount","playedSeconds","loadedSeconds","played","loaded","prevPlayed","prevLoaded","progressTimeout","handleReady","handleDurationCheck","activePlayer","loopOnEnded","args","durationCheckTimeout","handleLoaded","forceLoad","amount","isFraction","import_react5","UniversalSuspense","import_react6","Suspense","SUPPORTED_PROPS","customPlayers","playerList","fallback","_a","state","showPreview","references","wrapper","getActivePlayer","getAttributes","fraction","renderActivePlayer","fallbackElement","Wrapper","attributes","addCustomPlayer","removeCustomPlayers"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/index.ts\nvar index_exports = {};\n__export(index_exports, {\n DEFAULT_TRACKING_INGEST_CONFIG: () => DEFAULT_TRACKING_INGEST_CONFIG,\n IS_BROWSER: () => IS_BROWSER,\n IS_GLOBAL: () => IS_GLOBAL,\n IS_IOS: () => IS_IOS,\n IS_SAFARI: () => IS_SAFARI,\n SUPPORTS_DASH: () => SUPPORTS_DASH,\n SUPPORTS_HLS: () => SUPPORTS_HLS,\n StormcloudPlayer: () => StormcloudPlayer_default,\n StormcloudVideoPlayer: () => StormcloudVideoPlayer,\n StormcloudVideoPlayerComponent: () => StormcloudVideoPlayerComponent,\n applyTrackingIngestConfig: () => applyTrackingIngestConfig,\n buildAnalyticsContext: () => buildAnalyticsContext,\n canPlay: () => canPlay,\n configureTrackingIngest: () => configureTrackingIngest,\n createHlsAdPlayer: () => createHlsAdPlayer,\n createPalNonceManager: () => createPalNonceManager,\n createStormcloudPlayer: () => createStormcloudPlayer,\n default: () => StormcloudVideoPlayerComponent,\n detectBrowser: () => detectBrowser,\n getBrowserConfigOverrides: () => getBrowserConfigOverrides,\n getBrowserID: () => getBrowserID,\n getClientInfo: () => getClientInfo,\n ingestPlayerTracking: () => ingestPlayerTracking,\n initializePolyfills: () => initializePolyfills,\n isMediaStream: () => isMediaStream,\n isTrackingIngestEnabled: () => isTrackingIngestEnabled,\n lazy: () => lazy,\n logBrowserInfo: () => logBrowserInfo,\n merge: () => merge,\n omit: () => omit,\n parseQuery: () => parseQuery,\n players: () => players_default,\n randomString: () => randomString,\n requiresMediaPipelineResetAfterAds: () => requiresMediaPipelineResetAfterAds,\n sendAdDetectTracking: () => sendAdDetectTracking,\n sendAdImpressionTracking: () => sendAdImpressionTracking,\n sendAdLoadedTracking: () => sendAdLoadedTracking,\n sendHeartbeat: () => sendHeartbeat,\n sendInitialTracking: () => sendInitialTracking,\n supportsFeature: () => supportsFeature,\n supportsModernJS: () => supportsModernJS,\n supportsWebKitPresentationMode: () => supportsWebKitPresentationMode,\n trackingIngestConfig: () => trackingIngestConfig\n});\nmodule.exports = __toCommonJS(index_exports);\n\n// src/ui/StormcloudVideoPlayer.tsx\nvar import_react = __toESM(require(\"react\"), 1);\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS2 = true;\n let webOSVersion;\n let tizenVersion;\n let chromeVersionNum;\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n if (match && match[1]) {\n version = match[1];\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = \"6.0\";\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = \"5.0\";\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = \"4.0\";\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = \"3.0\";\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = \"2.0\";\n majorVersion = 2;\n }\n } else {\n version = \"Unknown\";\n webOSVersion = void 0;\n }\n isLegacyTV = webOSVersion !== void 0 && webOSVersion < 3;\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n isLegacyTV = tizenVersion !== void 0 && tizenVersion < 3;\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else {\n if (chromeVersion > 0) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n if (chromeVersion < 50) {\n supportsModernJS2 = false;\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS2 = false;\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS2 = false;\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS2 = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS: supportsModernJS2,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum\n };\n}\nfunction requiresMediaPipelineResetAfterAds() {\n const browser = detectBrowser();\n return browser.name === \"Samsung Tizen\" && (browser.tizenVersion ?? 0) >= 5;\n}\nfunction getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n overrides.pauseContentDuringAds = true;\n }\n return overrides;\n}\nfunction supportsModernJS() {\n try {\n return typeof Promise !== \"undefined\" && typeof Map !== \"undefined\" && typeof Set !== \"undefined\" && typeof Array.from !== \"undefined\" && typeof Object.assign !== \"undefined\" && typeof Array.prototype.forEach !== \"undefined\" && typeof String.prototype.includes !== \"undefined\";\n } catch (e) {\n return false;\n }\n}\nfunction logBrowserInfo(debug = false) {\n if (!debug) return;\n const browser = detectBrowser();\n console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n ...browser.webOSVersion !== void 0 ? { webOSVersion: browser.webOSVersion } : {},\n ...browser.tizenVersion !== void 0 ? { tizenVersion: browser.tizenVersion } : {},\n ...browser.chromeVersion !== void 0 ? { chromeVersion: browser.chromeVersion } : {},\n userAgent: navigator.userAgent\n });\n}\nfunction supportsFeature(feature) {\n switch (feature) {\n case \"urlsearchparams\":\n return typeof URLSearchParams !== \"undefined\";\n case \"textencoder\":\n return typeof TextEncoder !== \"undefined\";\n case \"promises\":\n return typeof Promise !== \"undefined\";\n case \"fetch\":\n return typeof fetch !== \"undefined\";\n case \"crypto\":\n return typeof crypto !== \"undefined\" && typeof crypto.subtle !== \"undefined\";\n default:\n return false;\n }\n}\n\n// src/utils/vastTrackingMacros.ts\nvar VAST_MACRO_PATTERN = /\\[([A-Z][A-Z0-9_]*)\\]/g;\nvar CACHEBUSTING_ALIASES = /\\[CACHEBUSTER\\]|\\[cachebuster\\]|\\[timestamp\\]|\\[random\\]|\\[INSERT_RANDOM_NUMBER\\]|%%CACHEBUSTER%%|%%CACHEBUST%%|\\$\\{CACHEBUSTER\\}|\\$\\{CACHEBUSTING\\}|\\{cachebuster\\}|\\{random\\}/g;\nvar KNOWN_VAST_MACROS = /* @__PURE__ */ new Set([\n \"ADCATEGORIES\",\n \"ADCOUNT\",\n \"ADPLAYHEAD\",\n \"ADSERVINGID\",\n \"ADTYPE\",\n \"APIFRAMEWORKS\",\n \"APPBUNDLE\",\n \"ASSETURI\",\n \"BLOCKEDADCATEGORIES\",\n \"BREAKMAXADLENGTH\",\n \"BREAKMAXADS\",\n \"BREAKMAXDURATION\",\n \"BREAKMINADLENGTH\",\n \"BREAKPOSITION\",\n \"CACHEBUSTING\",\n \"CLICKPOS\",\n \"CLICKTYPE\",\n \"CLIENTUA\",\n \"CONTENTID\",\n \"CONTENTPLAYHEAD\",\n \"CONTENTURI\",\n \"DEVICEIP\",\n \"DEVICEUA\",\n \"DOMAIN\",\n \"ERRORCODE\",\n \"EXTENSIONS\",\n \"GDPRCONSENT\",\n \"IFA\",\n \"IFATYPE\",\n \"INVENTORYSTATE\",\n \"LATLONG\",\n \"LIMITADTRACKING\",\n \"MEDIAMIME\",\n \"MEDIAPLAYHEAD\",\n \"OMIDPARTNER\",\n \"PAGEURL\",\n \"PLACEMENTTYPE\",\n \"PLAYERCAPABILITIES\",\n \"PLAYERSIZE\",\n \"PLAYERSTATE\",\n \"PODSEQUENCE\",\n \"REGULATIONS\",\n \"SERVERSIDE\",\n \"SERVERUA\",\n \"TIMESTAMP\",\n \"TRANSACTIONID\",\n \"UNIVERSALADID\",\n \"VASTVERSIONS\",\n \"VERIFICATIONVENDORS\"\n]);\nfunction generateCachebuster() {\n return String(Math.floor(Math.random() * 9e7) + 1e7);\n}\nfunction formatPlayhead(seconds) {\n if (seconds == null || !Number.isFinite(seconds) || seconds < 0) {\n return void 0;\n }\n const total = Math.floor(seconds);\n const hh = String(Math.floor(total / 3600)).padStart(2, \"0\");\n const mm = String(Math.floor(total % 3600 / 60)).padStart(2, \"0\");\n const ss = String(total % 60).padStart(2, \"0\");\n const ms = String(Math.floor((seconds - total) * 1e3)).padStart(3, \"0\");\n return `${hh}:${mm}:${ss}.${ms}`;\n}\nfunction resolveMacroValues(ctx) {\n const values = /* @__PURE__ */ new Map();\n const set = (key, value) => {\n if (value != null && value !== \"\") values.set(key, value);\n };\n const adPlayhead = formatPlayhead(ctx.adPlayheadSeconds);\n set(\"ADPLAYHEAD\", adPlayhead);\n set(\"MEDIAPLAYHEAD\", adPlayhead);\n set(\"CONTENTPLAYHEAD\", formatPlayhead(ctx.contentPlayheadSeconds));\n set(\"ASSETURI\", ctx.assetUri);\n set(\"MEDIAMIME\", ctx.mediaMime);\n set(\"TIMESTAMP\", (/* @__PURE__ */ new Date()).toISOString());\n set(\"SERVERSIDE\", \"0\");\n if (ctx.errorCode != null && ctx.errorCode !== \"\") {\n set(\"ERRORCODE\", String(ctx.errorCode));\n }\n if (ctx.playerWidth != null && ctx.playerHeight != null) {\n set(\"PLAYERSIZE\", `${Math.round(ctx.playerWidth)},${Math.round(ctx.playerHeight)}`);\n }\n set(\"IFA\", ctx.deviceId);\n set(\"IFATYPE\", ctx.deviceIdType);\n if (ctx.limitAdTracking != null) {\n set(\"LIMITADTRACKING\", ctx.limitAdTracking ? \"1\" : \"0\");\n }\n set(\"PAGEURL\", ctx.pageUrl);\n if (ctx.pageUrl) {\n try {\n set(\"DOMAIN\", new URL(ctx.pageUrl).hostname);\n } catch {\n }\n }\n set(\"CLIENTUA\", ctx.clientUa);\n set(\"DEVICEUA\", ctx.clientUa);\n if (ctx.podSequence != null) {\n set(\"PODSEQUENCE\", String(ctx.podSequence));\n }\n return values;\n}\nfunction substituteVastTrackingMacros(url, ctx = {}) {\n if (!url) return url;\n const values = resolveMacroValues(ctx);\n return url.replace(CACHEBUSTING_ALIASES, () => generateCachebuster()).replace(VAST_MACRO_PATTERN, (match, name) => {\n if (name === \"CACHEBUSTING\") return generateCachebuster();\n const value = values.get(name);\n if (value != null) return encodeURIComponent(value);\n return KNOWN_VAST_MACROS.has(name) ? \"\" : match;\n });\n}\n\n// src/sdk/hlsAdPlayer.ts\nvar MAX_VAST_WRAPPER_DEPTH = 5;\nvar BEACON_TIMEOUT_MS = 3e4;\nvar inFlightBeacons = /* @__PURE__ */ new Set();\nvar VAST_ERROR_MEDIA_DISPLAY = 405;\nfunction toVastMediaErrorCode(error) {\n switch (error?.code) {\n case 1:\n return 400;\n case 2:\n return 401;\n case 4:\n return 403;\n default:\n return VAST_ERROR_MEDIA_DISPLAY;\n }\n}\nfunction createHlsAdPlayer(contentVideo, options) {\n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = /* @__PURE__ */ new Map();\n const mainHlsInstance = options?.mainHlsInstance;\n const AD_CONTAINER_PROP = \"__stormcloudAdContainer\";\n const AD_VIDEO_PROP = \"__stormcloudAdVideo\";\n const FRAME_COUNTER_RELIABLE_PROP = \"__stormcloudFrameCounterReliable\";\n const RVFC_RELIABLE_PROP = \"__stormcloudRvfcReliable\";\n let adVideoElement = contentVideo[AD_VIDEO_PROP] ?? void 0;\n let adHls;\n let adContainerEl = contentVideo[AD_CONTAINER_PROP] ?? void 0;\n let adEventHandlers = [];\n let currentAd;\n let currentAdMediaFile;\n let podAds = [];\n let podIndex = 0;\n const preloadedAds = /* @__PURE__ */ new Map();\n const preloadingAds = /* @__PURE__ */ new Map();\n let destroyed = false;\n let pendingTimeouts = [];\n const STALL_TIMEOUT_MS = 4e3;\n const STALL_CHECK_INTERVAL_MS = 1e3;\n const BLACKFRAME_MIN_PLAYBACK_S = 1.5;\n let stallWatchdogId;\n let lastAdProgressTime = 0;\n let lastAdProgressPosition = 0;\n let sawDecodedVideoFrame = false;\n let videoFrameCallbackHandle;\n let pendingPlayPromise;\n let trackingFired = {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\n function emit(event, payload) {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(\n `[HlsAdPlayer] Error in event listener for ${event}:`,\n error\n );\n }\n }\n }\n function buildTrackingMacroContext(errorCode) {\n const context = {\n adPlayheadSeconds: adVideoElement?.currentTime,\n contentPlayheadSeconds: contentVideo.currentTime,\n assetUri: currentAdMediaFile?.url,\n mediaMime: currentAdMediaFile?.type,\n playerWidth: adVideoElement?.clientWidth || adContainerEl?.clientWidth,\n playerHeight: adVideoElement?.clientHeight || adContainerEl?.clientHeight\n };\n if (errorCode != null) {\n context.errorCode = errorCode;\n }\n if (typeof navigator !== \"undefined\" && navigator.userAgent) {\n context.clientUa = navigator.userAgent;\n }\n if (typeof location !== \"undefined\" && location.href) {\n context.pageUrl = location.href;\n }\n if (podAds.length > 0) {\n context.podSequence = podIndex + 1;\n }\n return context;\n }\n function fireTrackingPixels(urls, options2) {\n if (!urls || urls.length === 0) return;\n const macroContext = buildTrackingMacroContext(options2?.errorCode);\n urls.forEach((url) => {\n try {\n const trackingUrl = substituteVastTrackingMacros(url, macroContext);\n const img = new Image(1, 1);\n inFlightBeacons.add(img);\n let timeoutId;\n const release = () => {\n if (timeoutId !== void 0) clearTimeout(timeoutId);\n img.onload = null;\n img.onerror = null;\n inFlightBeacons.delete(img);\n };\n img.onload = release;\n img.onerror = release;\n timeoutId = setTimeout(release, BEACON_TIMEOUT_MS);\n img.src = trackingUrl;\n console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n }\n });\n }\n function getMainStreamQuality() {\n if (!mainHlsInstance || !mainHlsInstance.levels) {\n return null;\n }\n const currentLevel = mainHlsInstance.currentLevel;\n if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n const autoLevel = mainHlsInstance.loadLevel;\n if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n const level2 = mainHlsInstance.levels[autoLevel];\n return {\n width: level2.width || 1920,\n height: level2.height || 1080,\n bitrate: level2.bitrate || 5e6\n };\n }\n return null;\n }\n const level = mainHlsInstance.levels[currentLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5e6\n };\n }\n function selectBestMediaFile(mediaFiles) {\n if (mediaFiles.length === 0) {\n throw new Error(\"No media files available\");\n }\n const firstFile = mediaFiles[0];\n if (!firstFile) {\n throw new Error(\"No media files available\");\n }\n if (mediaFiles.length === 1) {\n return firstFile;\n }\n const mainQuality = getMainStreamQuality();\n if (!mainQuality) {\n console.log(\n \"[HlsAdPlayer] No main stream quality info, using first media file\"\n );\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n const scoredFiles = mediaFiles.map((file) => {\n const widthDiff = Math.abs(file.width - mainQuality.width);\n const heightDiff = Math.abs(file.height - mainQuality.height);\n const resolutionDiff = widthDiff + heightDiff;\n const fileBitrate = (file.bitrate || 5e3) * 1e3;\n const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n const score = resolutionDiff * 2 + bitrateDiff / 1e3;\n return { file, score, resolutionDiff, bitrateDiff };\n });\n scoredFiles.sort((a, b) => a.score - b.score);\n const bestMatch = scoredFiles[0];\n if (!bestMatch) {\n console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Selected media file:\", {\n url: bestMatch.file.url,\n resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n bitrate: bestMatch.file.bitrate,\n score: bestMatch.score,\n resolutionDiff: bestMatch.resolutionDiff,\n bitrateDiff: bestMatch.bitrateDiff\n });\n return bestMatch.file;\n }\n function isHlsMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type === \"application/x-mpegurl\" || type === \"application/vnd.apple.mpegurl\" || type.includes(\"mpegurl\") || url.includes(\".m3u8\");\n }\n function isProgressiveMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type.startsWith(\"video/\") || url.endsWith(\".mp4\") || url.includes(\".mp4?\");\n }\n function isAudioMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = (mediaFile.url.toLowerCase().split(\"?\")[0] || \"\").trim();\n return type.startsWith(\"audio/\") || url.endsWith(\".mp3\") || url.endsWith(\".aac\") || url.endsWith(\".m4a\") || url.endsWith(\".ogg\") || url.endsWith(\".oga\") || url.endsWith(\".opus\") || url.endsWith(\".wav\") || url.endsWith(\".weba\");\n }\n function collectVideoMediaFiles(scope, verbose) {\n const mediaFileElements = scope.querySelectorAll(\"MediaFile\");\n const mediaFiles = [];\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n }\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n }\n if (!url) {\n if (verbose) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n }\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n const mediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0\n };\n if (isAudioMediaFile(mediaFile)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (audio-only, type=\"${type}\") \\u2014 audio ads are not played to avoid a black screen`\n );\n return;\n }\n const hasExplicitDimensions = mf.getAttribute(\"width\") != null && mf.getAttribute(\"height\") != null;\n if (!isHlsMediaFile(mediaFile) && hasExplicitDimensions && (mediaFile.width <= 1 || mediaFile.height <= 1)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (degenerate dimensions ${mediaFile.width}x${mediaFile.height}, type=\"${type}\") \\u2014 likely an audio-only placeholder rendition`\n );\n return;\n }\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n }\n } else if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\n return mediaFiles;\n }\n function createEmptyTrackingUrls() {\n return {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n mute: [],\n unmute: [],\n pause: [],\n resume: [],\n fullscreen: [],\n exitFullscreen: [],\n skip: [],\n error: []\n };\n }\n function extractTrackingUrls(scope) {\n const trackingUrls = createEmptyTrackingUrls();\n scope.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n scope.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n scope.querySelectorAll(\"Error\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.error.push(url);\n });\n return trackingUrls;\n }\n function mergeTrackingUrls(target, source) {\n Object.keys(target).forEach((key) => {\n if (source[key] && source[key].length > 0) {\n target[key] = target[key].concat(source[key]);\n }\n });\n return target;\n }\n function parseVastXml(xmlString) {\n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n parserError.textContent\n );\n return { type: \"empty\" };\n }\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return { type: \"empty\" };\n }\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n const clickThrough = xmlDoc.querySelector(\"ClickThrough\")?.textContent?.trim();\n const wrapperUri = xmlDoc.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n if (wrapperUri) {\n console.log(\n `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n );\n return {\n type: \"wrapper\",\n vastAdTagUri: wrapperUri,\n trackingUrls: extractTrackingUrls(xmlDoc),\n clickThrough\n };\n }\n const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n const durationText = xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n const mediaFiles = collectVideoMediaFiles(xmlDoc, true);\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n }\n return { type: \"empty\" };\n }\n return {\n type: \"inline\",\n ad: {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls: extractTrackingUrls(xmlDoc),\n clickThrough\n }\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return { type: \"empty\" };\n }\n }\n function parseAdElement(adElement) {\n try {\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n const clickThrough = adElement.querySelector(\"ClickThrough\")?.textContent?.trim();\n const wrapperUri = adElement.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n if (wrapperUri) {\n return {\n type: \"wrapper\",\n vastAdTagUri: wrapperUri,\n trackingUrls: extractTrackingUrls(adElement),\n clickThrough\n };\n }\n const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n const durationText = adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n const mediaFiles = collectVideoMediaFiles(adElement, false);\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\n }\n return { type: \"empty\" };\n }\n return {\n type: \"inline\",\n ad: {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls: extractTrackingUrls(adElement),\n clickThrough\n }\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", error);\n return { type: \"empty\" };\n }\n }\n async function fetchVastXml(vastTagUrl, credentials = \"include\") {\n const requestVast = (creds) => fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: creds,\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\"\n },\n referrerPolicy: \"no-referrer-when-downgrade\"\n });\n let response;\n try {\n response = await requestVast(credentials);\n } catch (error) {\n if (credentials !== \"omit\") {\n console.warn(\n `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n error\n );\n response = await requestVast(\"omit\");\n } else {\n throw error;\n }\n }\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n return response.text();\n }\n async function fetchAndParseVastAd(vastTagUrl, depth = 0, accumulatedTracking = createEmptyTrackingUrls()) {\n const vastXml = await fetchVastXml(\n vastTagUrl,\n depth === 0 ? \"include\" : \"omit\"\n );\n console.log(\"[HlsAdPlayer] VAST XML received\");\n console.log(\n \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n const parsed = parseVastXml(vastXml);\n if (parsed.type === \"empty\") {\n return null;\n }\n if (parsed.type === \"wrapper\") {\n if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n console.warn(\n `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n );\n return null;\n }\n mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n return fetchAndParseVastAd(\n parsed.vastAdTagUri,\n depth + 1,\n accumulatedTracking\n );\n }\n mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n return parsed.ad;\n }\n async function fetchAndParsePod(vastTagUrl) {\n const vastXml = await fetchVastXml(vastTagUrl);\n console.log(\n `[HlsAdPlayer] Pod VAST XML received (length=${vastXml.length})`\n );\n const trimmedXml = vastXml.trim();\n if (trimmedXml.length === 0) {\n console.warn(\n \"[HlsAdPlayer] Pod VAST response body is empty (no fill)\"\n );\n return [];\n }\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n if (xmlDoc.querySelector(\"parsererror\")) {\n console.error(\n \"[HlsAdPlayer] Pod VAST XML parsing error (malformed). Content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n return [];\n }\n const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n if (adElements.length === 0) {\n console.warn(\n \"[HlsAdPlayer] No <Ad> elements found in pod VAST response (no fill). Content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n return [];\n }\n adElements.sort((a, b) => {\n const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n return aVal - bVal;\n });\n const ads = [];\n for (const adElement of adElements) {\n const parsed = parseAdElement(adElement);\n if (parsed.type === \"inline\") {\n ads.push(parsed.ad);\n } else if (parsed.type === \"wrapper\") {\n try {\n const resolved = await fetchAndParseVastAd(\n parsed.vastAdTagUri,\n 1,\n parsed.trackingUrls\n );\n if (resolved) {\n ads.push(resolved);\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n error\n );\n }\n }\n }\n console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n return ads;\n }\n function createAdVideoElement() {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.playsInline = true;\n video.muted = false;\n video.volume = 1;\n console.log(\n `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n );\n return video;\n }\n function setupAdEventListeners() {\n if (!adVideoElement || !currentAd) return;\n if (adEventHandlers.length > 0) return;\n const onTimeUpdate = () => {\n if (!currentAd || !adVideoElement) return;\n noteAdProgress();\n const progress = adVideoElement.currentTime / currentAd.duration;\n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n }\n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(currentAd.trackingUrls.midpoint);\n }\n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n }\n };\n const onLoadedMetadata = () => {\n if (!adPlaying || !adVideoElement) return;\n const { videoWidth, videoHeight } = adVideoElement;\n if (videoWidth <= 1 || videoHeight <= 1) {\n console.warn(\n `[HlsAdPlayer] Ad creative has no usable video dimensions (${videoWidth}x${videoHeight}) - skipping this creative`\n );\n handleVideoDecodeFailure();\n }\n };\n const onPlaying = () => {\n startStallWatchdog();\n if (!currentAd || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n };\n const onEnded = () => {\n if (!currentAd || trackingFired.complete) return;\n trackingFired.complete = true;\n fireTrackingPixels(currentAd.trackingUrls.complete);\n console.log(\"[HlsAdPlayer] Ad completed\");\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdComplete();\n };\n const onError = (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: toVastMediaErrorCode(adVideoElement?.error)\n });\n }\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n };\n const onVolumeChange = () => {\n if (!currentAd || !adVideoElement) return;\n if (adVideoElement.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n };\n const onPause = () => {\n if (currentAd && adVideoElement && !adVideoElement.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n };\n const onPlay = () => {\n if (currentAd && adVideoElement && adVideoElement.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n };\n adEventHandlers = [\n { type: \"timeupdate\", handler: onTimeUpdate },\n { type: \"loadedmetadata\", handler: onLoadedMetadata },\n { type: \"playing\", handler: onPlaying },\n { type: \"ended\", handler: onEnded },\n { type: \"error\", handler: onError },\n { type: \"volumechange\", handler: onVolumeChange },\n { type: \"pause\", handler: onPause },\n { type: \"play\", handler: onPlay }\n ];\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.addEventListener(type, handler);\n }\n }\n function teardownAdEventListeners() {\n if (adVideoElement) {\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.removeEventListener(type, handler);\n }\n }\n adEventHandlers = [];\n }\n function setAdPlayingFlag(isPlaying) {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n function resetQuartileTracking(preserveImpression) {\n trackingFired = {\n impression: preserveImpression ? trackingFired.impression : false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\n }\n function isRvfcSupported(video) {\n return typeof video.requestVideoFrameCallback === \"function\";\n }\n function settlePendingPlay() {\n pendingPlayPromise = void 0;\n }\n function startAdPlayback(context) {\n if (!adVideoElement) return;\n const playPromise = adVideoElement.play();\n pendingPlayPromise = playPromise;\n playPromise.catch((error) => {\n if (pendingPlayPromise !== playPromise) {\n return;\n }\n console.error(`[HlsAdPlayer] Error starting ${context}:`, error);\n handleAdError();\n }).finally(() => {\n if (pendingPlayPromise === playPromise) {\n pendingPlayPromise = void 0;\n }\n });\n }\n function prepareVideoElementForNewSource() {\n settlePendingPlay();\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (!adVideoElement) return;\n try {\n adVideoElement.pause();\n adVideoElement.removeAttribute(\"src\");\n adVideoElement.load();\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error preparing ad video for new source:\",\n error\n );\n }\n }\n function recreateAdVideoElement() {\n console.log(\n \"[HlsAdPlayer] Recreating ad video element (single-decoder platform)\"\n );\n teardownAdEventListeners();\n prepareVideoElementForNewSource();\n if (adVideoElement) {\n try {\n adVideoElement.remove();\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error removing ad video element:\", error);\n }\n }\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n contentVideo[AD_VIDEO_PROP] = adVideoElement;\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n }\n function loadCurrentAdMedia() {\n if (!adVideoElement || !currentAd) {\n throw new Error(\"No ad video element or ad to load\");\n }\n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n currentAdMediaFile = mediaFile;\n const isHlsAd = isHlsMediaFile(mediaFile);\n console.log(\n `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n );\n if (isHlsAd && import_hls.default.isSupported()) {\n if (adHls) {\n adHls.destroy();\n }\n adHls = new import_hls.default({\n enableWorker: true,\n lowLatencyMode: false\n });\n adHls.loadSource(mediaFile.url);\n adHls.attachMedia(adVideoElement);\n adHls.on(import_hls.default.Events.MANIFEST_PARSED, () => {\n console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n startAdPlayback(\"HLS ad playback\");\n });\n adHls.on(import_hls.default.Events.ERROR, (_event, data) => {\n console.error(\"[HlsAdPlayer] HLS error:\", data);\n if (data.fatal) {\n handleAdError();\n }\n });\n } else if (isHlsAd && adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")) {\n adVideoElement.src = mediaFile.url;\n startAdPlayback(\"native HLS ad playback\");\n } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n adVideoElement.src = mediaFile.url;\n adVideoElement.load();\n startAdPlayback(\"progressive ad playback\");\n } else {\n throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n }\n }\n function advanceToNextPodAd() {\n if (podIndex >= podAds.length - 1) {\n return false;\n }\n podIndex++;\n currentAd = podAds[podIndex];\n currentAdMediaFile = void 0;\n resetQuartileTracking(false);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.impression);\n trackingFired.impression = true;\n console.log(\n `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n );\n }\n clearStallWatchdog();\n if (requiresMediaPipelineResetAfterAds()) {\n recreateAdVideoElement();\n setupAdEventListeners();\n } else {\n prepareVideoElementForNewSource();\n }\n try {\n loadCurrentAdMedia();\n emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n return true;\n } catch (error) {\n console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n return false;\n }\n }\n function clearStallWatchdog() {\n if (stallWatchdogId != null) {\n clearInterval(stallWatchdogId);\n stallWatchdogId = void 0;\n }\n cancelVideoFrameProbe();\n }\n function noteAdProgress() {\n lastAdProgressTime = Date.now();\n if (adVideoElement) {\n lastAdProgressPosition = adVideoElement.currentTime;\n }\n }\n function handleAdStall() {\n console.warn(\n \"[HlsAdPlayer] Ad playback stalled (no progress) - recovering to avoid a blank frame\"\n );\n clearStallWatchdog();\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: VAST_ERROR_MEDIA_DISPLAY\n });\n }\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n }\n function getDecodedVideoFrameCount(video) {\n try {\n if (typeof video.getVideoPlaybackQuality === \"function\") {\n const quality = video.getVideoPlaybackQuality();\n if (quality && typeof quality.totalVideoFrames === \"number\") {\n return quality.totalVideoFrames;\n }\n }\n const legacyCount = video.webkitDecodedFrameCount;\n if (typeof legacyCount === \"number\") {\n return legacyCount;\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Unable to read decoded video frame count:\",\n error\n );\n }\n return void 0;\n }\n function isFrameCounterReliable() {\n return contentVideo[FRAME_COUNTER_RELIABLE_PROP] === true;\n }\n function markFrameCounterReliable() {\n contentVideo[FRAME_COUNTER_RELIABLE_PROP] = true;\n }\n function isRvfcReliable() {\n return contentVideo[RVFC_RELIABLE_PROP] === true;\n }\n function markRvfcReliable() {\n contentVideo[RVFC_RELIABLE_PROP] = true;\n }\n function cancelVideoFrameProbe() {\n if (videoFrameCallbackHandle != null && adVideoElement && typeof adVideoElement.cancelVideoFrameCallback === \"function\") {\n try {\n adVideoElement.cancelVideoFrameCallback(\n videoFrameCallbackHandle\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error cancelling video frame callback:\",\n error\n );\n }\n }\n videoFrameCallbackHandle = void 0;\n }\n function startVideoFrameProbe() {\n cancelVideoFrameProbe();\n if (!adVideoElement) return;\n const rvfc = adVideoElement.requestVideoFrameCallback;\n if (typeof rvfc !== \"function\") return;\n const onPresentedFrame = () => {\n videoFrameCallbackHandle = void 0;\n if (!adPlaying) return;\n sawDecodedVideoFrame = true;\n markRvfcReliable();\n };\n try {\n videoFrameCallbackHandle = rvfc.call(\n adVideoElement,\n onPresentedFrame\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error requesting video frame callback:\",\n error\n );\n videoFrameCallbackHandle = void 0;\n }\n }\n function handleVideoDecodeFailure() {\n console.warn(\n \"[HlsAdPlayer] Ad audio is advancing but no video frames decoded (black screen) - skipping this creative\"\n );\n clearStallWatchdog();\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: VAST_ERROR_MEDIA_DISPLAY\n });\n }\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n }\n function startStallWatchdog() {\n clearStallWatchdog();\n noteAdProgress();\n sawDecodedVideoFrame = false;\n startVideoFrameProbe();\n const blackFrameDetectionEnabled = !requiresMediaPipelineResetAfterAds();\n stallWatchdogId = window.setInterval(() => {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n if (blackFrameDetectionEnabled && !sawDecodedVideoFrame && !adVideoElement.paused) {\n const decodedFrames = getDecodedVideoFrameCount(adVideoElement);\n if (decodedFrames !== void 0 && decodedFrames > 0) {\n sawDecodedVideoFrame = true;\n markFrameCounterReliable();\n } else if (adVideoElement.currentTime >= BLACKFRAME_MIN_PLAYBACK_S) {\n const timeAdvancing = adVideoElement.currentTime > lastAdProgressPosition + 0.05;\n if (isRvfcSupported(adVideoElement) && timeAdvancing && isRvfcReliable()) {\n handleVideoDecodeFailure();\n return;\n }\n if (decodedFrames === 0 && timeAdvancing && isFrameCounterReliable()) {\n handleVideoDecodeFailure();\n return;\n }\n }\n }\n if (adVideoElement.currentTime > lastAdProgressPosition + 0.05) {\n noteAdProgress();\n return;\n }\n if (adVideoElement.paused) {\n noteAdProgress();\n return;\n }\n if (Date.now() - lastAdProgressTime >= STALL_TIMEOUT_MS) {\n handleAdStall();\n }\n }, STALL_CHECK_INTERVAL_MS);\n }\n function releaseAdDecoder() {\n prepareVideoElementForNewSource();\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }\n function handleAdComplete() {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n releaseAdDecoder();\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode:\", error);\n });\n } else {\n console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n }\n }\n emit(\"content_resume\");\n }\n function handleAdError() {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n releaseAdDecoder();\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n emit(\"ad_error\");\n }\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n contentVideo[AD_CONTAINER_PROP] = adContainerEl;\n },\n async requestAds(vastTagUrl) {\n console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n if (adPlaying) {\n console.warn(\n \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n );\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n try {\n let ads = [];\n if (preloadedAds.has(vastTagUrl)) {\n const preloaded = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n if (preloaded) {\n ads = [preloaded];\n }\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ads = await fetchAndParsePod(vastTagUrl);\n }\n if (!ads.length) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.reject(new Error(\"No ads available from VAST response\"));\n }\n podAds = ads;\n podIndex = 0;\n currentAd = ads[0];\n currentAdMediaFile = void 0;\n console.log(\n `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n );\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.impression);\n trackingFired.impression = true;\n }\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n async play() {\n if (!currentAd) {\n console.warn(\n \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n );\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n console.log(\"[HlsAdPlayer] Starting ad playback\");\n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n contentVideo[AD_VIDEO_PROP] = adVideoElement;\n }\n setupAdEventListeners();\n resetQuartileTracking(true);\n const contentVolume = contentVideo.volume;\n originalVolume = Math.max(\n 0,\n Math.min(1, contentVolume || originalVolume)\n );\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.pause();\n console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n } else {\n console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n }\n console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n contentVideo.muted = true;\n adPlaying = true;\n setAdPlayingFlag(true);\n if (adVideoElement) {\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n console.log(\n `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n );\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n emit(\"content_pause\");\n loadCurrentAdMedia();\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {\n });\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n }\n },\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n console.log(\n `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n );\n releaseAdDecoder();\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode on stop:\", error);\n });\n }\n }\n currentAd = void 0;\n currentAdMediaFile = void 0;\n podAds = [];\n podIndex = 0;\n },\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\n clearStallWatchdog();\n for (const timeoutId of pendingTimeouts) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts = [];\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n teardownAdEventListeners();\n releaseAdDecoder();\n currentAd = void 0;\n currentAdMediaFile = void 0;\n podAds = [];\n podIndex = 0;\n listeners.clear();\n preloadedAds.clear();\n preloadingAds.clear();\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width, height) {\n console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n on(event, listener) {\n if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());\n listeners.get(event).add(listener);\n },\n off(event, listener) {\n listeners.get(event)?.delete(listener);\n },\n updateOriginalMutedState(muted, volume) {\n const nextVolume = typeof volume === \"number\" && !Number.isNaN(volume) ? Math.max(0, Math.min(1, volume)) : originalVolume;\n console.log(\n `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n );\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume) {\n if (adVideoElement && adPlaying) {\n const clamped = Math.max(0, Math.min(1, volume));\n adVideoElement.volume = clamped;\n adVideoElement.muted = clamped === 0;\n }\n },\n getAdVolume() {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n showPlaceholder() {\n contentVideo.style.opacity = \"0\";\n contentVideo.style.visibility = \"hidden\";\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl && !adPlaying) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n if (!adPlaying) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n },\n getLoadedAdDuration() {\n return currentAd?.duration;\n },\n getLoadedAdId() {\n return currentAd?.id;\n },\n getPodAdCount() {\n return podAds.length;\n },\n getPodTotalDurationMs() {\n return podAds.reduce(\n (total, ad) => total + (ad.duration > 0 ? ad.duration * 1e3 : 0),\n 0\n );\n }\n };\n}\n\n// src/utils/devUrl.ts\nvar PRIVATE_HOST_PATTERNS = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/\n];\nfunction isLocalDevHost(hostname) {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\nfunction toDevSafeUrl(rawUrl) {\n if (!rawUrl) return rawUrl ?? \"\";\n let url;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n if (_palLoadPromise) return _palLoadPromise;\n _palLoadPromise = new Promise((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n );\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 1e4\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\nfunction createPalNonceManager() {\n let currentNonce = \"\";\n let currentNonceManager;\n return {\n async generateNonce(options = {}) {\n try {\n await loadPalSdk();\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId\n }, null, 2)\n );\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce();\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = void 0;\n return \"\";\n }\n },\n getCurrentNonce() {\n return currentNonce;\n },\n injectNonce(vastTagUrl) {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n sendPlaybackStart() {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {\n }\n },\n sendPlaybackEnd() {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {\n }\n },\n sendAdClick() {\n try {\n currentNonceManager?.sendAdClick();\n } catch {\n }\n },\n sendAdTouch(event) {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {\n }\n },\n reset() {\n currentNonce = \"\";\n currentNonceManager = void 0;\n }\n };\n}\n\n// src/utils/trackingIngest.ts\nvar DEFAULT_TRACKING_INGEST_CONFIG = {\n enabled: true,\n baseUrl: \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\"\n};\nvar trackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG\n};\nfunction applyTrackingIngestConfig(overrides) {\n Object.assign(trackingIngestConfig, overrides);\n}\nfunction configureTrackingIngest(overrides) {\n applyTrackingIngestConfig(overrides);\n}\nfunction isTrackingIngestEnabled() {\n return trackingIngestConfig.enabled === true;\n}\nfunction normalizeIngestBaseUrl(baseUrl) {\n return baseUrl.replace(/\\/+$/, \"\");\n}\nfunction buildTrackingIngestUrl(channel) {\n const base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);\n if (channel === \"impressions\") {\n return `${base}/impressions/ingest`;\n }\n return `${base}/metrics/ingest`;\n}\nasync function ingestPlayerTracking(licenseKey, channel, body) {\n if (!isTrackingIngestEnabled() || !licenseKey) {\n return false;\n }\n try {\n const response = await fetch(buildTrackingIngestUrl(channel), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `License-Key ${licenseKey}`\n },\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest failed (${response.status}) for ${channel}`\n );\n return false;\n }\n return true;\n } catch (error) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest error for ${channel}:`,\n error\n );\n return false;\n }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar DEVICE_ID_STORAGE_KEYS = [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"advertising_id\",\n \"deviceAdvertisingId\",\n \"aaid\",\n \"adid\",\n \"rida\",\n \"tifa\",\n \"lgudid\"\n];\nvar ANDROID_ID_TYPES = /* @__PURE__ */ new Set([\"aaid\", \"adid\"]);\nfunction resolveVastEnvironmentSignals(isCtv) {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const realDeviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;\n let deviceId = realDeviceId;\n let deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType();\n const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n let limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n if (!deviceId && isCtv) {\n const dpid = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (dpid) {\n deviceId = dpid;\n deviceIdType = \"dpid\";\n limitAdTracking = platformLat ?? readStoredLimitAdTracking() ?? false;\n }\n }\n if (isCtv) {\n return {\n isCtv: true,\n sessionId: getOrCreateCtvSessionId(),\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {},\n deviceTypeHint: 5\n };\n }\n return {\n isCtv: false,\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n };\n}\nfunction inferDeviceIdType() {\n if (typeof navigator === \"undefined\") {\n return void 0;\n }\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return void 0;\n}\nfunction isEquivalentDeviceIdType(tagType, runtimeType) {\n if (!tagType || !runtimeType) return false;\n const tag = tagType.toLowerCase();\n const runtime = runtimeType.toLowerCase();\n if (tag === runtime) return true;\n return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\nfunction resolveNativeDeviceId() {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;\n if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n return void 0;\n }\n return deviceId;\n}\nfunction getOrCreateStoredUuid(storageKey) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n const existing = readPersistentId(storageKey);\n if (existing) {\n writePersistentId(storageKey, existing);\n return existing;\n }\n const id = createUuid();\n writePersistentId(storageKey, id);\n return id;\n}\nfunction getOrCreateCtvSessionId() {\n const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n if (existing) {\n writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n return existing;\n }\n const sessionId = createUuid();\n writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n return sessionId;\n}\nfunction readPersistentId(storageKey) {\n return readStoredString(storageKey) || readCookie(storageKey);\n}\nfunction writePersistentId(storageKey, value) {\n try {\n window.localStorage?.setItem(storageKey, value);\n } catch {\n }\n writeCookie(storageKey, value);\n}\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\nfunction readCookie(name) {\n if (typeof document === \"undefined\") {\n return void 0;\n }\n try {\n const prefix = encodeURIComponent(name) + \"=\";\n const parts = document.cookie ? document.cookie.split(\";\") : [];\n for (const part of parts) {\n const entry = part.trim();\n if (entry.startsWith(prefix)) {\n return decodeURIComponent(entry.slice(prefix.length)) || void 0;\n }\n }\n } catch {\n }\n return void 0;\n}\nfunction writeCookie(name, value) {\n if (typeof document === \"undefined\") {\n return;\n }\n try {\n document.cookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value) + \";path=/;max-age=\" + PERSISTENT_ID_COOKIE_MAX_AGE + \";SameSite=Lax\";\n } catch {\n }\n}\nfunction createUuid() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const bytes = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(bytes);\n } else {\n let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n for (let i = 0; i < 16; i++) {\n seed = seed * 1103515245 + 12345 & 2147483647;\n bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;\n }\n }\n bytes[6] = (bytes[6] ?? 0) & 15 | 64;\n bytes[8] = (bytes[8] ?? 0) & 63 | 128;\n let hex = \"\";\n for (let i = 0; i < 16; i++) {\n hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n }\n return hex.slice(0, 8) + \"-\" + hex.slice(8, 12) + \"-\" + hex.slice(12, 16) + \"-\" + hex.slice(16, 20) + \"-\" + hex.slice(20, 32);\n}\nfunction performanceNow() {\n try {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n } catch {\n }\n return 0;\n}\nfunction readPlatformNativeDeviceId() {\n if (typeof window === \"undefined\") return {};\n try {\n const adinfo = window.webapis?.adinfo;\n if (adinfo) {\n const tifa = typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n const lat = typeof adinfo.isLATEnabled === \"function\" ? adinfo.isLATEnabled() : void 0;\n return {\n deviceId: tifa,\n deviceIdType: \"tifa\",\n ...typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}\n };\n }\n }\n } catch {\n }\n try {\n const webOSDev = window.webOSDev;\n if (webOSDev) {\n const lgudid = typeof webOSDev.LGUDID === \"function\" ? webOSDev.LGUDID() : webOSDev.lgudid ?? webOSDev.LGUDID;\n if (typeof lgudid === \"string\" && lgudid) {\n if (isZeroedAdId(lgudid)) {\n return { deviceIdType: \"lgudid\", limitAdTracking: true };\n }\n if (!isMacroPlaceholder(lgudid)) {\n return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n }\n }\n }\n } catch {\n }\n try {\n const roku = window.Roku;\n if (roku) {\n const rida = typeof roku.getPublisherUniqueId === \"function\" ? roku.getPublisherUniqueId() : roku.rida;\n if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n }\n }\n } catch {\n }\n return {};\n}\nvar ZEROED_AD_ID_PATTERNS = /* @__PURE__ */ new Set([\n \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n \"00000000-0000-0000-0000-000000000000\"\n]);\nfunction isMacroPlaceholder(value) {\n const t = value.trim();\n return !t || /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) || /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) || ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\nfunction isZeroedAdId(value) {\n return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\nfunction readNativeBridgeSignals() {\n if (typeof window === \"undefined\") {\n return {};\n }\n const candidates = [\n window.__STORMCLOUD_CTV_AD_INFO__,\n window.__STORMCLOUD_CTV__,\n window.stormcloudCtv,\n window.AiryTV,\n window.Android,\n window.webOS,\n window.tizen,\n window.amazon\n ].filter(Boolean);\n for (const source of candidates) {\n const contentUrl = readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) || void 0;\n const appId = readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) || void 0;\n const appName = readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || void 0;\n const deviceId = readBridgeValue(source, [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"adId\",\n \"deviceId\",\n \"lgudid\",\n \"LGUDID\",\n \"tifa\",\n \"rida\",\n \"afai\",\n \"aaid\"\n ]) || void 0;\n if (!contentUrl && !deviceId && !appId && !appName) continue;\n const deviceIdType = readBridgeValue(source, [\n \"idtype\",\n \"deviceIdType\",\n \"advertisingIdType\",\n \"idType\"\n ]) || inferDeviceIdType();\n const limitAdTracking = readBridgeBoolean(source, [\n \"is_lat\",\n \"limitAdTracking\",\n \"limitedAdTracking\",\n \"lat\"\n ]);\n return {\n ...contentUrl ? { contentUrl } : {},\n ...appId ? { appId } : {},\n ...appName ? { appName } : {},\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n };\n }\n return {};\n}\nfunction readBridgeValue(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n if (typeof value === \"string\" && value) {\n return value;\n }\n if (typeof value === \"function\") {\n try {\n const result = value.call(source);\n if (typeof result === \"string\" && result) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readBridgeBoolean(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeBoolean(value);\n if (normalized != null) {\n return normalized;\n }\n if (typeof value === \"function\") {\n try {\n const result = normalizeBoolean(value.call(source));\n if (result != null) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readStoredDeviceId() {\n for (const key of DEVICE_ID_STORAGE_KEYS) {\n const value = readStoredString(key);\n if (value) {\n return value;\n }\n }\n return void 0;\n}\nfunction readStoredString(key) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n try {\n const value = window.localStorage?.getItem(key);\n return value || void 0;\n } catch {\n return void 0;\n }\n}\nfunction readStoredLimitAdTracking() {\n return normalizeBoolean(\n readStoredString(\"limitAdTracking\") || readStoredString(\"limitedAdTracking\") || readStoredString(\"is_lat\")\n );\n}\nfunction normalizeBoolean(value) {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n }\n return void 0;\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction buildAnalyticsContext(config) {\n const context = {};\n if (config.debugAdTiming) {\n context.debugAdTiming = true;\n }\n if (config.isLiveStream !== void 0) {\n context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n }\n return context;\n}\nfunction getClientInfo() {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = navigator.deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: screen?.orientation?.type || \"\",\n pixelDepth: screen?.pixelDepth\n };\n let deviceType = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState\n };\n}\nasync function sha256Hex(input) {\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n let encodedData;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(input);\n } else {\n const utf8 = unescape(encodeURIComponent(input));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\nfunction resolvePlayerIdentitySeed(clientInfo) {\n const nativeDeviceId = resolveNativeDeviceId();\n if (nativeDeviceId) {\n return `device:${nativeDeviceId}`;\n }\n const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (persistedId) {\n return `persisted:${persistedId}`;\n }\n return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\nasync function getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n return Boolean(isTrackingIngestEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n const clientInfo = getClientInfo();\n const debugAdTiming = !!context.debugAdTiming;\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n }\n const playerId = await getBrowserID(clientInfo);\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n }\n const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n };\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n adLoaded: false,\n adDetect: false\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n await ingestPlayerTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp\n }\n ]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [heartbeatData]\n });\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n\n// src/utils/polyfills.ts\nfunction polyfillURLSearchParams() {\n if (typeof URLSearchParams !== \"undefined\") {\n return;\n }\n class URLSearchParamsPolyfill {\n constructor(init) {\n this.params = /* @__PURE__ */ new Map();\n if (typeof init === \"string\") {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n parseQueryString(query) {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return;\n cleanQuery.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n this.append(decodedKey, decodedValue);\n }\n });\n }\n safeDecodeURIComponent(str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\n } catch (e) {\n return str;\n }\n }\n append(name, value) {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n delete(name) {\n this.params.delete(name);\n }\n get(name) {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n }\n getAll(name) {\n return this.params.get(name) || [];\n }\n has(name) {\n return this.params.has(name);\n }\n set(name, value) {\n this.params.set(name, [String(value)]);\n }\n forEach(callback) {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n toString() {\n const parts = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join(\"&\");\n }\n }\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n if (typeof TextEncoder !== \"undefined\") {\n return;\n }\n class TextEncoderPolyfill {\n constructor() {\n this.encoding = \"utf-8\";\n }\n encode(str) {\n const utf8 = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 128) {\n utf8.push(charcode);\n } else if (charcode < 2048) {\n utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n } else if (charcode < 55296 || charcode >= 57344) {\n utf8.push(\n 224 | charcode >> 12,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n } else {\n i++;\n charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n utf8.push(\n 240 | charcode >> 18,\n 128 | charcode >> 12 & 63,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n Promise.prototype.finally = function(callback) {\n const constructor = this.constructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) => constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\nfunction polyfillObjectAssign() {\n if (typeof Object.assign !== \"function\") {\n Object.assign = function(target, ...sources) {\n if (target == null) {\n throw new TypeError(\"Cannot convert undefined or null to object\");\n }\n const to = Object(target);\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n }\n}\nfunction polyfillArrayFrom() {\n if (!Array.from) {\n Array.from = function(arrayLike, mapFn, thisArg) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError(\"Array.from requires an array-like object\");\n }\n const len = items.length >>> 0;\n const result = new Array(len);\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n return result;\n };\n }\n}\nfunction polyfillStringStartsWith() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(search, pos) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\nfunction polyfillStringEndsWith() {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function(search, length) {\n if (length === void 0 || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\nfunction polyfillStringIncludes() {\n if (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n if (typeof start !== \"number\") {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\nfunction initializePolyfills() {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n// src/utils/vastMacros.ts\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nvar INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nvar EXAMPLE_COM_URL = /example\\.com/i;\nvar CTV_UNSUPPORTED_PARAMS = [\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\"\n];\nvar INLINE_DEVICE_MACRO_REPLACEMENTS = [\n { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator }\n];\nfunction isMacroPlaceholder2(value) {\n if (value == null) return true;\n const trimmed = value.trim();\n if (!trimmed) return true;\n if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\nfunction generateCorrelator() {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nfunction expandInlineMacroPlaceholders(baseUrl, ctx) {\n let url = baseUrl;\n for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n const value = getValue(ctx);\n if (value != null && value !== \"\") {\n url = url.replace(pattern, encodeURIComponent(value));\n }\n }\n return url;\n}\nfunction applyDeviceIdentityParams(params, ctx) {\n const runtimeId = ctx.deviceId?.trim();\n const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n const tagRdid = params.get(\"rdid\");\n const tagType = params.get(\"idtype\");\n const tagLat = params.get(\"is_lat\");\n const latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0;\n if (runtimeId) {\n params.set(\"rdid\", runtimeId);\n params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n params.set(\"is_lat\", latValue ?? (isMacroPlaceholder2(tagLat) ? \"0\" : tagLat));\n return;\n }\n const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder2(tagRdid));\n const tagTypeValid = Boolean(tagType && !isMacroPlaceholder2(tagType));\n if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n if (tagRdidValid) {\n if (isMacroPlaceholder2(tagType) && runtimeType) {\n params.set(\"idtype\", runtimeType);\n }\n if (isMacroPlaceholder2(tagLat)) {\n params.set(\"is_lat\", latValue ?? \"0\");\n }\n return;\n }\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n}\nfunction removeBrokenAppNameOrphans(params, appName) {\n const toDelete = [];\n params.forEach((_value, key) => {\n if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n toDelete.push(key);\n }\n });\n if (appName && appName.includes(\"&\")) {\n for (const suffix of appName.split(\"&\").slice(1)) {\n const trimmed = suffix.replace(/^\\s+/, \"\");\n if (!trimmed) continue;\n toDelete.push(suffix, ` ${trimmed}`, trimmed);\n }\n }\n for (const key of new Set(toDelete)) {\n if (key) params.delete(key);\n }\n}\nfunction normalizeVastTagUrl(raw) {\n if (!raw) return raw;\n try {\n const url = new URL(raw);\n const anValue = url.searchParams.get(\"an\");\n if (anValue !== null) {\n const orphanFragments = [];\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n orphanFragments.push(key.trim());\n }\n });\n if (orphanFragments.length > 0) {\n const reconstructed = [anValue.replace(/\\s+$/, \"\"), ...orphanFragments].filter(Boolean).join(\" & \");\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n url.searchParams.delete(key);\n }\n });\n url.searchParams.set(\"an\", reconstructed);\n return url.toString().replace(\n /([?&]an=)([^&]*)/,\n (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n );\n }\n }\n removeBrokenAppNameOrphans(url.searchParams);\n return url.toString();\n } catch {\n return raw;\n }\n}\nfunction applyVastMacros(baseUrl, ctx) {\n const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n let url;\n try {\n url = new URL(normalizeVastTagUrl(expandedUrl));\n } catch {\n return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n }\n const params = url.searchParams;\n removeBrokenAppNameOrphans(params);\n params.set(\"correlator\", ctx.correlator);\n params.set(\"scor\", ctx.streamCorrelator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n }\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n params.delete(\"ppos\");\n params.delete(\"lip\");\n if (ctx.podMinDurationMs != null) {\n params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n }\n if (ctx.podMaxDurationMs != null) {\n params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n }\n if (ctx.podMaxAds != null) {\n params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n }\n if (!ctx.isCtv && ctx.pageUrl) {\n params.set(\"url\", ctx.pageUrl);\n params.set(\"description_url\", ctx.pageUrl);\n }\n const existingUrl = params.get(\"url\") || \"\";\n if (EXAMPLE_COM_URL.test(existingUrl)) {\n params.delete(\"url\");\n params.delete(\"description_url\");\n }\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n applyDeviceIdentityParams(params, ctx);\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n if (ctx.programTitle) {\n params.set(\"ct_ti\", ctx.programTitle);\n }\n const staleKeys = [];\n params.forEach((value, key) => {\n if (isMacroPlaceholder2(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n removeBrokenAppNameOrphans(params);\n return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n const signals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n const tasks = [];\n const tcfApi = window.__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData, success) => {\n if (settled) return;\n if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {\n }, tcData.listenerId);\n } catch {\n }\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n const uspApi = window.__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data, success) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n return Promise.all(tasks).then(() => signals);\n}\n\n// src/player/Scte35Parser.ts\nfunction parseCueOutDuration(value) {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match = value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) || value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const dStr = match[1];\n const d = parseFloat(dStr);\n return Number.isNaN(d) ? void 0 : d;\n }\n return void 0;\n}\nfunction parseCueOutCont(value) {\n const res = {};\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n if (slashMatch && slashMatch[1] && slashMatch[2]) {\n const elapsed = parseFloat(slashMatch[1]);\n const duration = parseFloat(slashMatch[2]);\n if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n }\n }\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return void 0;\n}\nfunction parseAttributeList(value) {\n const attrs = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match;\n while ((match = regex.exec(value)) !== null) {\n const key = match[1] ?? \"\";\n let rawVal = match[3] ?? match[4] ?? \"\";\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n}\nfunction toNumber(val) {\n if (val == null) return void 0;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? void 0 : n;\n}\nfunction isManifestBasedMarker(marker) {\n const raw = marker.raw;\n if (!raw) return false;\n if (raw.tag) {\n const tag = String(raw.tag);\n return tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-CUE-IN\") || tag.includes(\"EXT-X-DATERANGE\");\n }\n if (raw.id3) return false;\n if (raw.splice_command_type) return false;\n return false;\n}\nfunction decodeId3ValueToText(value) {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++)\n out += String.fromCharCode(value[i]);\n return out;\n } catch {\n return void 0;\n }\n}\nfunction getFragmentStartSeconds(frag) {\n const candidates = [frag?.start, frag?.startPTS];\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n }\n return void 0;\n}\nfunction parseScte35FromId3(tag) {\n const text = decodeId3ValueToText(tag.value);\n if (!text) return void 0;\n const cueOutMatch = text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) || text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = parseCueOutDuration(arg);\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...dur !== void 0 ? { durationSeconds: dur } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = parseCueOutCont(arg);\n const marker = {\n type: \"progress\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...cont?.duration !== void 0 ? { durationSeconds: cont.duration } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n if (daterangeMatch) {\n const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { id3: text, attrs }\n };\n return marker;\n }\n if (hasScteIn) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text, attrs }\n };\n return marker;\n }\n }\n if (/SCTE35-OUT/i.test(text)) {\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n if (/SCTE35-IN/i.test(text)) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n if (tag.value instanceof Uint8Array) {\n const bin = parseScte35Binary(tag.value);\n if (bin) return bin;\n }\n return void 0;\n}\nfunction normalizeFragmentPayload(payload) {\n if (payload instanceof Uint8Array) {\n return payload;\n }\n if (payload instanceof ArrayBuffer) {\n return new Uint8Array(payload);\n }\n if (ArrayBuffer.isView(payload)) {\n const view = payload;\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n }\n return void 0;\n}\nfunction detectTsPacketFormat(data) {\n const packetSizes = [188, 192, 204];\n for (const packetSize of packetSizes) {\n const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n for (let offset = 0; offset < packetSize; offset++) {\n let matchedPackets = 0;\n for (let packetStart = offset; packetStart + tsPayloadOffset < data.length && matchedPackets < 5; packetStart += packetSize) {\n if (data[packetStart + tsPayloadOffset] !== 71) {\n break;\n }\n matchedPackets++;\n }\n if (matchedPackets >= 2) {\n return { offset, packetSize, tsPayloadOffset };\n }\n }\n }\n return void 0;\n}\nfunction getPsiSectionStart(payload, payloadUnitStart) {\n if (!payloadUnitStart) {\n return void 0;\n }\n const pointerField = payload[0];\n if (pointerField == null) {\n return void 0;\n }\n const sectionStart = 1 + pointerField;\n return sectionStart < payload.length ? sectionStart : void 0;\n}\nfunction getPsiSectionLength(data, offset) {\n return ((data[offset + 1] ?? 0) & 15) << 8 | (data[offset + 2] ?? 0);\n}\nfunction parsePatSection(payload, payloadUnitStart, pmtPids) {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 8 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 0) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n const programNumber = (payload[offset] ?? 0) << 8 | (payload[offset + 1] ?? 0);\n const pid = ((payload[offset + 2] ?? 0) & 31) << 8 | (payload[offset + 3] ?? 0);\n if (programNumber !== 0) {\n pmtPids.add(pid);\n }\n }\n}\nfunction descriptorsIdentifyScte35(data, start, end) {\n let offset = start;\n while (offset + 2 <= end) {\n const tag = data[offset] ?? 0;\n const length = data[offset + 1] ?? 0;\n const descriptorStart = offset + 2;\n const descriptorEnd = descriptorStart + length;\n if (descriptorEnd > end) {\n return false;\n }\n const registration = length >= 4 ? String.fromCharCode(\n data[descriptorStart] ?? 0,\n data[descriptorStart + 1] ?? 0,\n data[descriptorStart + 2] ?? 0,\n data[descriptorStart + 3] ?? 0\n ) : \"\";\n if (tag === 138 || registration === \"CUEI\" || registration === \"SCTE\") {\n return true;\n }\n offset = descriptorEnd;\n }\n return false;\n}\nfunction parsePmtSection(payload, payloadUnitStart, tsScte35Pids) {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 12 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 2) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n const programInfoLength = ((payload[sectionStart + 10] ?? 0) & 15) << 8 | (payload[sectionStart + 11] ?? 0);\n let offset = sectionStart + 12 + programInfoLength;\n while (offset + 5 <= sectionEnd - 4) {\n const streamType = payload[offset] ?? 0;\n const elementaryPid = ((payload[offset + 1] ?? 0) & 31) << 8 | (payload[offset + 2] ?? 0);\n const esInfoLength = ((payload[offset + 3] ?? 0) & 15) << 8 | (payload[offset + 4] ?? 0);\n const descriptorStart = offset + 5;\n const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n if (streamType === 134 || streamType === 6 && descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd)) {\n tsScte35Pids.add(elementaryPid);\n }\n offset = descriptorStart + esInfoLength;\n }\n}\nfunction hasProcessedTsScte35Section(section, processedSections) {\n let checksum = 0;\n for (let i = 0; i < section.length; i++) {\n checksum = checksum * 31 + (section[i] ?? 0) >>> 0;\n }\n const key = `${section.length}:${checksum}`;\n if (processedSections.has(key)) {\n return true;\n }\n processedSections.add(key);\n if (processedSections.size > 200) {\n const firstKey = processedSections.values().next().value;\n if (firstKey) {\n processedSections.delete(firstKey);\n }\n }\n return false;\n}\nfunction addScte35SectionMarker(section, markers, processedSections) {\n if (section[0] !== 252 || hasProcessedTsScte35Section(section, processedSections)) {\n return;\n }\n const marker = parseScte35Binary(section);\n if (!marker) {\n return;\n }\n marker.raw = {\n ...typeof marker.raw === \"object\" && marker.raw ? marker.raw : {},\n source: \"ts-packet\"\n };\n markers.push(marker);\n}\nfunction appendScte35Bytes(pid, bytes, assemblers, markers, processedSections) {\n const assembler = assemblers.get(pid);\n if (!assembler) {\n return;\n }\n for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n assembler.bytes.push(bytes[i] ?? 0);\n }\n if (assembler.bytes.length >= assembler.expectedLength) {\n assemblers.delete(pid);\n addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n }\n}\nfunction collectScte35SectionsFromPayload(pid, payload, payloadUnitStart, assemblers, markers, processedSections) {\n if (payload.length === 0) {\n return;\n }\n let offset = 0;\n if (payloadUnitStart) {\n const pointerField = payload[0] ?? 0;\n const previousAssembler = assemblers.get(pid);\n if (previousAssembler && pointerField > 0) {\n appendScte35Bytes(\n pid,\n payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n assemblers,\n markers,\n processedSections\n );\n }\n assemblers.delete(pid);\n offset = 1 + pointerField;\n } else {\n appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n return;\n }\n while (offset + 3 <= payload.length) {\n const tableId = payload[offset];\n if (tableId == null || tableId === 255) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, offset);\n const totalLength = 3 + sectionLength;\n if (sectionLength <= 0 || totalLength <= 3) {\n return;\n }\n if (offset + totalLength <= payload.length) {\n addScte35SectionMarker(\n payload.subarray(offset, offset + totalLength),\n markers,\n processedSections\n );\n offset += totalLength;\n } else {\n assemblers.set(pid, {\n bytes: Array.from(payload.subarray(offset)),\n expectedLength: totalLength\n });\n return;\n }\n }\n}\nfunction parseScte35FromTsPackets(data, tsScte35Pids, pmtPids, processedSections) {\n const packetInfo = detectTsPacketFormat(data);\n if (!packetInfo) {\n return [];\n }\n const markers = [];\n const sectionAssemblers = /* @__PURE__ */ new Map();\n for (let packetStart = packetInfo.offset; packetStart + packetInfo.packetSize <= data.length; packetStart += packetInfo.packetSize) {\n const tsStart = packetStart + packetInfo.tsPayloadOffset;\n if (data[tsStart] !== 71) {\n continue;\n }\n const secondByte = data[tsStart + 1];\n const thirdByte = data[tsStart + 2];\n const fourthByte = data[tsStart + 3];\n if (secondByte == null || thirdByte == null || fourthByte == null || (secondByte & 128) !== 0) {\n continue;\n }\n const payloadUnitStart = (secondByte & 64) !== 0;\n const pid = (secondByte & 31) << 8 | thirdByte;\n const adaptationFieldControl = fourthByte >> 4 & 3;\n const hasPayload = adaptationFieldControl === 1 || adaptationFieldControl === 3;\n if (!hasPayload) {\n continue;\n }\n let payloadStart = tsStart + 4;\n if (adaptationFieldControl === 3) {\n const adaptationLength = data[payloadStart];\n if (adaptationLength == null) {\n continue;\n }\n payloadStart += 1 + adaptationLength;\n }\n const payloadEnd = Math.min(tsStart + 188, data.length);\n if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n continue;\n }\n const payload = data.subarray(payloadStart, payloadEnd);\n if (pid === 0) {\n parsePatSection(payload, payloadUnitStart, pmtPids);\n } else if (pmtPids.has(pid)) {\n parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n } else if (tsScte35Pids.has(pid)) {\n collectScte35SectionsFromPayload(\n pid,\n payload,\n payloadUnitStart,\n sectionAssemblers,\n markers,\n processedSections\n );\n }\n }\n return markers;\n}\nvar BitReader = class {\n constructor(buf) {\n this.buf = buf;\n this.bytePos = 0;\n this.bitPos = 0;\n }\n readBits(numBits) {\n let result = 0;\n while (numBits > 0) {\n if (this.bytePos >= this.buf.length) return result;\n const remainingInByte = 8 - this.bitPos;\n const toRead = Math.min(numBits, remainingInByte);\n const currentByte = this.buf[this.bytePos];\n const shift = remainingInByte - toRead;\n const mask = (1 << toRead) - 1 & 255;\n const bits = currentByte >> shift & mask;\n result = result << toRead | bits;\n this.bitPos += toRead;\n if (this.bitPos >= 8) {\n this.bitPos = 0;\n this.bytePos += 1;\n }\n numBits -= toRead;\n }\n return result >>> 0;\n }\n skipBits(n) {\n this.readBits(n);\n }\n get bytePosition() {\n return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n }\n};\nfunction readSpliceTime(r, ptsAdjustmentTicks) {\n const timeSpecifiedFlag = r.readBits(1) === 1;\n if (!timeSpecifiedFlag) {\n r.readBits(7);\n return void 0;\n }\n r.readBits(6);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const ptsTicks = (high * 4294967296 + low + ptsAdjustmentTicks) % 8589934592;\n return ptsTicks / 9e4;\n}\nfunction markerTypeFromSegmentationTypeId(segmentationTypeId) {\n switch (segmentationTypeId) {\n case 16:\n case 34:\n case 48:\n case 50:\n case 52:\n case 54:\n return \"start\";\n case 17:\n case 35:\n case 49:\n case 51:\n case 53:\n case 55:\n return \"end\";\n default:\n return void 0;\n }\n}\nfunction parseScte35SegmentationDescriptor(descriptor) {\n if (descriptor.length < 11) {\n return void 0;\n }\n const identifier = String.fromCharCode(\n descriptor[0] ?? 0,\n descriptor[1] ?? 0,\n descriptor[2] ?? 0,\n descriptor[3] ?? 0\n );\n if (identifier !== \"CUEI\") {\n return void 0;\n }\n const segmentationEventId = (descriptor[4] ?? 0) * 16777216 + ((descriptor[5] ?? 0) << 16) + ((descriptor[6] ?? 0) << 8) + (descriptor[7] ?? 0);\n const cancelIndicator = ((descriptor[8] ?? 0) & 128) !== 0;\n if (cancelIndicator) {\n return void 0;\n }\n const flags = descriptor[9] ?? 0;\n const programSegmentationFlag = (flags & 128) !== 0;\n const segmentationDurationFlag = (flags & 64) !== 0;\n let offset = 10;\n if (!programSegmentationFlag) {\n const componentCount = descriptor[offset] ?? 0;\n offset += 1 + componentCount * 6;\n if (offset > descriptor.length) {\n return void 0;\n }\n }\n let durationSeconds = void 0;\n if (segmentationDurationFlag) {\n if (offset + 5 > descriptor.length) {\n return void 0;\n }\n const durationTicks = (descriptor[offset] ?? 0) * 4294967296 + (descriptor[offset + 1] ?? 0) * 16777216 + ((descriptor[offset + 2] ?? 0) << 16) + ((descriptor[offset + 3] ?? 0) << 8) + (descriptor[offset + 4] ?? 0);\n durationSeconds = durationTicks / 9e4;\n offset += 5;\n }\n if (offset + 2 > descriptor.length) {\n return void 0;\n }\n offset += 1;\n const segmentationUpidLength = descriptor[offset] ?? 0;\n offset += 1 + segmentationUpidLength;\n if (offset >= descriptor.length) {\n return void 0;\n }\n const segmentationTypeId = descriptor[offset] ?? 0;\n const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n if (!markerType) {\n return void 0;\n }\n return {\n type: markerType,\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n segmentationEventId\n };\n}\nfunction parseScte35SegmentationDescriptors(data, offset) {\n if (offset + 2 > data.length) {\n return void 0;\n }\n const descriptorLoopLength = (data[offset] ?? 0) << 8 | (data[offset + 1] ?? 0);\n let descriptorOffset = offset + 2;\n const descriptorEnd = Math.min(\n data.length,\n descriptorOffset + descriptorLoopLength\n );\n while (descriptorOffset + 2 <= descriptorEnd) {\n const descriptorTag = data[descriptorOffset] ?? 0;\n const descriptorLength = data[descriptorOffset + 1] ?? 0;\n const descriptorDataStart = descriptorOffset + 2;\n const descriptorDataEnd = descriptorDataStart + descriptorLength;\n if (descriptorDataEnd > descriptorEnd) {\n return void 0;\n }\n if (descriptorTag === 2) {\n const descriptorMarker = parseScte35SegmentationDescriptor(\n data.subarray(descriptorDataStart, descriptorDataEnd)\n );\n if (descriptorMarker) {\n return descriptorMarker;\n }\n }\n descriptorOffset = descriptorDataEnd;\n }\n return void 0;\n}\nfunction parseScte35Binary(data) {\n const r = new BitReader(data);\n const tableId = r.readBits(8);\n if (tableId !== 252) return void 0;\n r.readBits(1);\n r.readBits(1);\n r.readBits(2);\n const sectionLength = r.readBits(12);\n if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n return void 0;\n }\n r.readBits(8);\n r.readBits(1);\n r.readBits(6);\n const ptsAdjHigh = r.readBits(1);\n const ptsAdjLow = r.readBits(32);\n const ptsAdjustmentTicks = ptsAdjHigh * 4294967296 + ptsAdjLow;\n r.readBits(8);\n r.readBits(12);\n const spliceCommandLength = r.readBits(12);\n const spliceCommandType = r.readBits(8);\n let markerType;\n let durationSeconds = void 0;\n let ptsSeconds = void 0;\n let spliceEventId = void 0;\n const commandBodyStart = r.bytePosition;\n if (spliceCommandType === 5) {\n spliceEventId = r.readBits(32);\n const cancel = r.readBits(1) === 1;\n r.readBits(7);\n if (cancel) return void 0;\n const outOfNetwork = r.readBits(1) === 1;\n const programSpliceFlag = r.readBits(1) === 1;\n const durationFlag = r.readBits(1) === 1;\n const spliceImmediateFlag = r.readBits(1) === 1;\n r.readBits(4);\n markerType = outOfNetwork ? \"start\" : \"end\";\n if (programSpliceFlag && !spliceImmediateFlag) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else if (!programSpliceFlag) {\n const componentCount = r.readBits(8);\n for (let i = 0; i < componentCount; i++) {\n r.readBits(8);\n if (!spliceImmediateFlag) {\n const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n if (ptsSeconds === void 0) {\n ptsSeconds = componentPtsSeconds;\n }\n }\n }\n }\n if (durationFlag) {\n r.readBits(6);\n r.readBits(1);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const durationTicks = high * 4294967296 + low;\n durationSeconds = durationTicks / 9e4;\n }\n r.readBits(16);\n r.readBits(8);\n r.readBits(8);\n } else if (spliceCommandType === 6) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else {\n return void 0;\n }\n const expectedDescriptorOffset = spliceCommandLength === 4095 ? r.bytePosition : commandBodyStart + spliceCommandLength;\n const descriptorMarker = parseScte35SegmentationDescriptors(\n data,\n expectedDescriptorOffset\n );\n if (descriptorMarker) {\n markerType = descriptorMarker.type;\n if (durationSeconds === void 0) {\n durationSeconds = descriptorMarker.durationSeconds;\n }\n }\n if (!markerType) {\n return void 0;\n }\n const marker = {\n type: markerType,\n ...ptsSeconds !== void 0 ? { ptsSeconds } : {},\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: {\n splice_command_type: spliceCommandType,\n ...spliceEventId !== void 0 ? { splice_event_id: spliceEventId } : {},\n ...descriptorMarker?.segmentationEventId !== void 0 ? { segmentation_event_id: descriptorMarker.segmentationEventId } : {}\n }\n };\n return marker;\n}\n\n// src/player/Scte35CueManager.ts\nvar Scte35CueManager = class {\n constructor(debug, callbacks) {\n this.pendingScte35Cues = /* @__PURE__ */ new Map();\n this.recentScte35CueKeys = /* @__PURE__ */ new Map();\n this.recentScte35CueLimit = 200;\n this.tsScte35Pids = /* @__PURE__ */ new Set();\n this.pmtPids = /* @__PURE__ */ new Set();\n this.processedTsScte35Sections = /* @__PURE__ */ new Set();\n this.debug = debug;\n this.callbacks = callbacks;\n }\n get pendingScte35CueKey() {\n return this.pendingScte35CueKeyValue;\n }\n set pendingScte35CueKey(value) {\n this.pendingScte35CueKeyValue = value;\n }\n get activeScte35BreakKey() {\n return this.activeScte35BreakKeyValue;\n }\n set activeScte35BreakKey(value) {\n this.activeScte35BreakKeyValue = value;\n }\n get scheduledScte35BreakKey() {\n return this.scheduledScte35BreakKeyValue;\n }\n set scheduledScte35BreakKey(value) {\n this.scheduledScte35BreakKeyValue = value;\n }\n createScte35CueContext(source, readiness, frag) {\n const context = { source, readiness };\n if (typeof frag?.sn === \"number\") {\n context.fragmentSn = frag.sn;\n }\n const fragmentStartSec = getFragmentStartSeconds(frag);\n if (fragmentStartSec !== void 0) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n return context;\n }\n onScte35Cue(marker, context) {\n const cue = this.createScte35Cue(marker, context);\n const pendingKey = this.getPendingScte35CueKey(cue);\n if (context.readiness === \"early\") {\n this.pendingScte35Cues.set(pendingKey, cue);\n this.trimRecentScte35CueMaps();\n if (marker.type === \"start\") {\n this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n }\n return;\n }\n if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n key: cue.key,\n activeScte35BreakKey: this.activeScte35BreakKeyValue,\n inAdBreak: this.callbacks.isInAdBreak(),\n source: cue.source\n });\n }\n return;\n }\n if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n key: cue.key,\n source: cue.source\n });\n }\n return;\n }\n this.pendingScte35Cues.delete(pendingKey);\n this.markScte35CueHandled(cue);\n this.callbacks.onPlaybackCue(marker, cue.key);\n }\n activatePendingScte35CuesForFragment(frag) {\n const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : void 0;\n if (fragmentSn === void 0) {\n return;\n }\n const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n ([, cue]) => cue.fragmentSn === fragmentSn\n );\n matchingCues.forEach(([pendingKey, cue]) => {\n this.pendingScte35Cues.delete(pendingKey);\n const context = {\n source: cue.source,\n readiness: \"playback\"\n };\n context.fragmentSn = fragmentSn;\n const fragmentStartSec = cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n if (fragmentStartSec !== void 0) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n this.onScte35Cue(cue.marker, context);\n });\n }\n createScte35Cue(marker, context) {\n const cue = {\n marker,\n source: context.source,\n readiness: context.readiness,\n key: this.getScte35CueKey(marker, context)\n };\n if (context.fragmentSn !== void 0) {\n cue.fragmentSn = context.fragmentSn;\n }\n if (context.fragmentStartSeconds !== void 0) {\n cue.fragmentStartSeconds = context.fragmentStartSeconds;\n }\n return cue;\n }\n getScte35CueKey(marker, context) {\n const raw = this.getScte35MarkerRaw(marker);\n const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n if (spliceEventId) {\n return `splice:${spliceEventId}`;\n }\n const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n if (segmentationEventId) {\n return `segmentation:${segmentationEventId}`;\n }\n const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n if (daterangeId) {\n return `daterange:${daterangeId}`;\n }\n const scteValue = this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) || this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n if (scteValue) {\n return `daterange-scte:${scteValue}`;\n }\n if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n }\n if (context.fragmentSn !== void 0) {\n return `fragment:${context.fragmentSn}`;\n }\n return `${context.source}:wallclock:${Math.floor(Date.now() / 1e3)}`;\n }\n getPendingScte35CueKey(cue) {\n return `${cue.marker.type}:${cue.key}:${cue.fragmentSn !== void 0 ? cue.fragmentSn : \"unknown\"}`;\n }\n getScte35MarkerRaw(marker) {\n return typeof marker.raw === \"object\" && marker.raw !== null ? marker.raw : {};\n }\n toIdentityString(value) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n return void 0;\n }\n isStrongScte35CueKey(key) {\n return !!(key && (key.startsWith(\"splice:\") || key.startsWith(\"segmentation:\") || key.startsWith(\"daterange:\") || key.startsWith(\"daterange-scte:\")));\n }\n hasRecentlyHandledScte35Cue(cue) {\n if (this.activeScte35BreakKeyValue === cue.key || this.scheduledScte35BreakKeyValue === cue.key) {\n return true;\n }\n const recentKey = `${cue.marker.type}:${cue.key}`;\n return this.recentScte35CueKeys.has(recentKey);\n }\n markScte35CueHandled(cue) {\n this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n this.trimRecentScte35CueMaps();\n }\n trimRecentScte35CueMaps() {\n while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n const firstKey = this.recentScte35CueKeys.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.recentScte35CueKeys.delete(firstKey);\n }\n while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n const firstKey = this.pendingScte35Cues.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.pendingScte35Cues.delete(firstKey);\n }\n }\n shouldAcceptScte35EndCue(cue) {\n if (!this.callbacks.isInAdBreak()) {\n return false;\n }\n if (this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) && this.isStrongScte35CueKey(cue.key) && this.activeScte35BreakKeyValue !== cue.key) {\n return false;\n }\n return true;\n }\n};\n\n// src/player/AdConfigManager.ts\nvar AdConfigManager = class {\n constructor(config, video) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds = /* @__PURE__ */ new Set();\n this.streamCorrelator = generateCorrelator();\n this.viewCorrelator = generateCorrelator();\n this.consentSignals = {};\n this.podCounter = 0;\n this.podAssignedByPrefetch = false;\n this.lastHeartbeatTime = 0;\n this.defaultPodMaxAds = 6;\n this.defaultPodMaxDurationMs = 12e4;\n this.config = config;\n this.video = video;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n isVmapEnabled() {\n return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n }\n async fetchAdConfiguration() {\n if (this.isVmapEnabled()) {\n await this.fetchAndParseVmap(this.config.vmapUrl);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n }\n return;\n }\n const vastMode = this.config.vastMode || \"default\";\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n }\n if (vastMode === \"adstorm\") {\n if (!this.config.licenseKey) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n );\n }\n return;\n }\n const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n this.apiVastTagUrl = vastEndpoint;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n vastEndpoint\n );\n }\n return;\n }\n if (this.config.vastTagUrl) {\n this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n return;\n }\n const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n apiUrl\n );\n }\n const headers = {};\n if (this.config.licenseKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n }\n const response = await fetch(apiUrl, { headers });\n if (!response.ok) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n );\n }\n return;\n }\n const data = await response.json();\n const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n if (imaPayload) {\n let decodedPayload = imaPayload;\n try {\n decodedPayload = decodeURIComponent(imaPayload);\n } catch {\n console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n }\n console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n } else {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n );\n }\n }\n const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n if (numberAds != null && numberAds > 0) {\n this.apiNumberAds = numberAds;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n this.apiNumberAds\n );\n }\n }\n }\n async fetchAndParseVmap(vmapUrl) {\n if (!vmapUrl.trim()) {\n return;\n }\n try {\n const response = await fetch(vmapUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch VMAP (${response.status})`);\n }\n const vmapXml = await response.text();\n this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n vmapUrl\n );\n }\n } catch (error) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n }\n }\n }\n parseVmapToBreaks(vmapXml) {\n if (typeof DOMParser === \"undefined\") {\n return [];\n }\n const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n }\n return [];\n }\n const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(\n doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n );\n }\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n (el) => el.localName === \"AdBreak\"\n );\n }\n const parsed = [];\n adBreakNodes.forEach((node, index) => {\n const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n if (startTimeMs == null) {\n return;\n }\n let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n if (!adTagNode) {\n adTagNode = node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") ?? void 0;\n }\n const adTagUrl = (adTagNode?.textContent || \"\").trim();\n if (!adTagUrl) {\n return;\n }\n const breakId = node.getAttribute(\"breakId\") || `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n parsed.push({\n id: breakId,\n startTimeMs,\n vastTagUrl: adTagUrl\n });\n });\n parsed.sort((a, b) => {\n const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n return aStart - bStart;\n });\n return parsed;\n }\n parseVmapTimeOffsetToMs(timeOffset) {\n if (!timeOffset) {\n return void 0;\n }\n const normalized = timeOffset.trim().toLowerCase();\n if (normalized === \"start\") {\n return 0;\n }\n if (normalized === \"end\") {\n return -1;\n }\n const hms = timeOffset.match(\n /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n );\n if (hms) {\n const [, hh, mm, ss, ms = \"0\"] = hms;\n const hours = Number(hh);\n const minutes = Number(mm);\n const seconds = Number(ss);\n const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n return (hours * 3600 + minutes * 60 + seconds) * 1e3 + millis;\n }\n const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percent) {\n const ratio = Number(percent[1]) / 100;\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1e3 * ratio);\n }\n return void 0;\n }\n return void 0;\n }\n getAdBreakKey(adBreak) {\n if (adBreak.id) {\n return adBreak.id;\n }\n return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n }\n resolveBreakStartMs(adBreak) {\n if (adBreak.startTimeMs >= 0) {\n return adBreak.startTimeMs;\n }\n if (adBreak.startTimeMs === -1) {\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1e3);\n }\n }\n return void 0;\n }\n findCurrentOrNextBreak(nowMs) {\n const schedule = this.vmapBreaks;\n let candidate;\n const tol = this.config.driftToleranceMs ?? 1e3;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (breakStartMs <= nowMs + tol && (candidate == null || breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))) {\n candidate = b;\n }\n }\n return candidate;\n }\n findBreakForTime(nowMs) {\n const schedule = this.vmapBreaks;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (b.durationMs) {\n const end = breakStartMs + b.durationMs;\n if (nowMs >= breakStartMs && nowMs < end) {\n return b;\n }\n continue;\n }\n if (nowMs >= breakStartMs) {\n return b;\n }\n }\n return void 0;\n }\n selectVastTagsForBreak(b) {\n if (!b || !b.vastTagUrl) return void 0;\n if (b.vastTagUrl.includes(\",\")) {\n return b.vastTagUrl.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n }\n return [b.vastTagUrl];\n }\n beginNewAdPod() {\n this.podCounter++;\n }\n resolvePodParams(breakDurationMs) {\n const maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0 ? this.config.podMaxDurationMs : this.defaultPodMaxDurationMs;\n const maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;\n const minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n return { maxAds, minDurationMs, maxDurationMs };\n }\n getPalDescriptionUrl() {\n if (!this.apiVastTagUrl) return void 0;\n try {\n const params = new URL(this.apiVastTagUrl).searchParams;\n return params.get(\"description_url\") || params.get(\"url\") || void 0;\n } catch {\n return void 0;\n }\n }\n generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {\n const adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;\n const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n const urlWithMacros = applyVastMacros(baseUrl, {\n correlator: this.viewCorrelator,\n streamCorrelator: this.streamCorrelator,\n pod: this.podCounter > 0 ? this.podCounter : void 0,\n podMaxAds: podParams.maxAds,\n podMinDurationMs: podParams.minDurationMs,\n podMaxDurationMs: podParams.maxDurationMs,\n isCtv: envSignals.isCtv,\n pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? toDevSafeUrl(window.location.href) : void 0,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n sessionId: envSignals.sessionId,\n deviceId: envSignals.deviceId,\n deviceIdType: envSignals.deviceIdType,\n limitAdTracking: envSignals.limitAdTracking,\n deviceTypeHint: envSignals.deviceTypeHint,\n adTest: this.config.adTest,\n ...this.config.programTitle ? { programTitle: this.config.programTitle } : {},\n consent: this.consentSignals\n });\n const finalUrl = palNonce.injectNonce(urlWithMacros);\n console.log(\n `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n finalUrl\n );\n return finalUrl;\n }\n // --- Tracking ---\n initializeTracking() {\n sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config)).then(() => {\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5e3);\n }).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n error\n );\n }\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5e3);\n });\n }\n sendHeartbeatIfNeeded() {\n const now = Date.now();\n if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 3e4) {\n this.lastHeartbeatTime = now;\n sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n error\n );\n }\n });\n }\n }\n destroyTracking() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = void 0;\n }\n }\n};\n\n// src/player/AdTimingService.ts\nvar AdTimingService = class {\n constructor(config, video, callbacks) {\n this.adRequestWatchdogToken = null;\n this.adFailsafeToken = null;\n this.ptsDriftEmaMs = 0;\n this.adBreakPlayedDurationMs = 0;\n this.adBreakEpoch = 0;\n this.adRequestTokenCounter = 0;\n this.activeAdRequestToken = null;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.totalAdRequestsInBreak = 0;\n this.maxTotalAdRequestsPerBreak = 10;\n this.lastAdRequestTime = 0;\n this.consecutiveFailures = 0;\n this.maxConsecutiveFailures = 5;\n this.minAdRequestIntervalMs = 3e3;\n this.backoffBaseMs = 1e3;\n this.maxBackoffMs = 15e3;\n this.defaultMinRemainingMsToStartAd = 4e3;\n this.failedVastUrls = /* @__PURE__ */ new Set();\n this.temporaryFailureUrls = /* @__PURE__ */ new Map();\n this.temporaryFailureCooldownMs = 3e4;\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillThreshold = 3;\n this.globalNoFillCooldownUntil = 0;\n this.globalNoFillBackoffBaseMs = 5e3;\n this.globalNoFillBackoffMaxMs = 6e4;\n this.globalLastGamRequestTime = 0;\n this.globalMinGamIntervalMs = 3e3;\n this.config = config;\n this.video = video;\n this.callbacks = callbacks;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n // --- Ad stop timer ---\n scheduleAdStopCountdown(remainingMs) {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.ensureAdStoppedByTimer();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.ensureAdStoppedByTimer();\n }, ms);\n }\n clearAdStopTimer() {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = void 0;\n }\n }\n ensureAdStoppedByTimer() {\n this.adStopTimerId = void 0;\n this.callbacks.onAdStopTimerFired();\n }\n // --- Ad start timer ---\n scheduleAdStartIn(delayMs, marker = { type: \"start\" }, cueKey) {\n this.clearAdStartTimer();\n const ms = Math.max(0, Math.floor(delayMs));\n if (ms === 0) {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n return;\n }\n this.adStartTimerId = window.setTimeout(() => {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n }, ms);\n }\n clearAdStartTimer() {\n if (this.adStartTimerId != null) {\n clearTimeout(this.adStartTimerId);\n this.adStartTimerId = void 0;\n }\n }\n // --- PTS drift ---\n updatePtsDrift(ptsSecondsSample) {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1e3;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 6e4) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n resolveScteBreakStartWallClockMs(marker) {\n const nowWallClockMs = Date.now();\n if (typeof marker.ptsSeconds !== \"number\") {\n return nowWallClockMs;\n }\n const nowMs = this.video.currentTime * 1e3;\n const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n const deltaMs = marker.ptsSeconds * 1e3 - estimatedCurrentPtsMs;\n if (!Number.isFinite(deltaMs)) {\n return nowWallClockMs;\n }\n return nowWallClockMs + Math.floor(deltaMs);\n }\n // --- Duration boundary ---\n setAdBreakDurationBoundary(durationMs) {\n this.expectedAdBreakDurationMs = durationMs;\n if (durationMs != null && this.currentAdBreakStartWallClockMs != null) {\n this.scteAdBreakEndWallClockMs = this.currentAdBreakStartWallClockMs + durationMs;\n } else {\n this.scteAdBreakEndWallClockMs = void 0;\n }\n }\n scheduleAdStopAtBreakBoundary() {\n if (this.expectedAdBreakDurationMs == null) {\n return;\n }\n this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n }\n // --- Duration budget ---\n getWallClockRemainingAdMs() {\n const endWallClockMs = this.getAdBreakEndWallClockMs();\n if (endWallClockMs != null) {\n return Math.max(0, endWallClockMs - Date.now());\n }\n return 0;\n }\n getAdBreakEndWallClockMs() {\n if (this.scteAdBreakEndWallClockMs != null) {\n return this.scteAdBreakEndWallClockMs;\n }\n if (this.expectedAdBreakDurationMs == null || this.currentAdBreakStartWallClockMs == null) {\n return void 0;\n }\n return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n }\n getDurationBudgetRemainingMs() {\n if (this.expectedAdBreakDurationMs == null) {\n return 0;\n }\n return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n }\n getLoadedAdDurationMs(adController) {\n const durationSec = adController.getLoadedAdDuration?.();\n if (durationSec == null || durationSec <= 0) {\n return 0;\n }\n return Math.round(durationSec * 1e3);\n }\n adFitsRemainingBudget(durationMs) {\n if (durationMs <= 0) {\n return true;\n }\n return durationMs <= this.getDurationBudgetRemainingMs();\n }\n logAdDurationDecision(accepted, durationMs, adController) {\n if (!this.debug) {\n return;\n }\n const remainingBudget = this.getDurationBudgetRemainingMs();\n const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n if (accepted) {\n console.log(\n `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n );\n } else {\n console.log(\n `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms \\u2014 requesting another ad`\n );\n }\n }\n recordPlayedAdDuration(adController) {\n const durationMs = this.getLoadedAdDurationMs(adController);\n if (durationMs <= 0) {\n return;\n }\n this.adBreakPlayedDurationMs += durationMs;\n if (this.debug) {\n console.log(\n `[AD-DURATION] Played ${durationMs}ms \\u2014 total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n );\n }\n }\n ensureLoadedAdFitsBudget(adController) {\n const durationMs = this.getLoadedAdDurationMs(adController);\n const fits = this.adFitsRemainingBudget(durationMs);\n this.logAdDurationDecision(fits, durationMs, adController);\n return fits;\n }\n rejectLoadedAdForDuration(adController) {\n try {\n adController.destroy();\n } catch {\n }\n }\n markAdStarted() {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n this.totalAdRequestsInBreak++;\n this.lastAdRequestTime = Date.now();\n }\n notePodAdStarted() {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n }\n getRemainingAdMs() {\n const wallClockRemaining = this.getWallClockRemainingAdMs();\n const budgetRemaining = this.getDurationBudgetRemainingMs();\n if (this.expectedAdBreakDurationMs == null) {\n return wallClockRemaining;\n }\n return Math.min(wallClockRemaining, budgetRemaining);\n }\n getMinRemainingMsToStartAd() {\n const configured = this.config.minRemainingMsToStartAd;\n if (typeof configured === \"number\" && configured >= 0) {\n return configured;\n }\n return this.defaultMinRemainingMsToStartAd;\n }\n hasTimeToStartAnotherAd() {\n const minRemaining = this.getMinRemainingMsToStartAd();\n return this.getWallClockRemainingAdMs() > minRemaining && this.getDurationBudgetRemainingMs() > minRemaining;\n }\n // --- Circuit breaker ---\n isTemporaryAdError(error) {\n const message = error?.message?.toLowerCase() || \"\";\n if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n return true;\n }\n if (message.includes(\"timeout\")) {\n return true;\n }\n if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n return true;\n }\n if (message.includes(\"ad playback error\")) {\n return true;\n }\n return false;\n }\n isUrlInCooldown(vastTagUrl) {\n const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n if (failureTime == null) {\n return false;\n }\n const elapsed = Date.now() - failureTime;\n if (elapsed >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(vastTagUrl);\n return false;\n }\n return true;\n }\n cleanupTemporaryFailures() {\n const now = Date.now();\n for (const [url, timestamp] of this.temporaryFailureUrls) {\n if (now - timestamp >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(url);\n }\n }\n }\n isGamInCooldown() {\n return Date.now() < this.globalNoFillCooldownUntil;\n }\n recordGamNoFill() {\n this.globalConsecutiveNoFills++;\n if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n const backoff = Math.min(\n this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n this.globalNoFillBackoffMaxMs\n );\n this.globalNoFillCooldownUntil = Date.now() + backoff;\n if (this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n );\n }\n }\n }\n resetGamNoFillCounter() {\n if (this.globalConsecutiveNoFills > 0 && this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n );\n }\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillCooldownUntil = 0;\n }\n async enforceGlobalRateLimit() {\n const now = Date.now();\n const elapsed = now - this.globalLastGamRequestTime;\n if (elapsed < this.globalMinGamIntervalMs) {\n const waitMs = this.globalMinGamIntervalMs - elapsed;\n if (this.debug) {\n console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n this.globalLastGamRequestTime = Date.now();\n }\n // --- Watchdog ---\n startAdRequestWatchdog(token) {\n this.clearAdRequestWatchdog();\n const timeoutMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n this.adRequestWatchdogToken = token;\n this.adRequestWatchdogId = window.setTimeout(() => {\n if (this.adRequestWatchdogToken !== token) {\n return;\n }\n this.adRequestWatchdogId = void 0;\n this.adRequestWatchdogToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n this.callbacks.onWatchdogTimeout();\n }, timeoutMs);\n this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n }\n clearAdRequestWatchdog() {\n if (this.adRequestWatchdogId != null) {\n clearTimeout(this.adRequestWatchdogId);\n this.adRequestWatchdogId = void 0;\n }\n if (this.adRequestWatchdogToken != null) {\n this.logAdState(\"ad_request_watchdog_cleared\", {\n token: this.adRequestWatchdogToken\n });\n this.adRequestWatchdogToken = null;\n }\n }\n // --- Failsafe ---\n startAdFailsafeTimer(token) {\n this.clearAdFailsafeTimer();\n const failsafeMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n this.adFailsafeToken = token;\n this.adFailsafeTimerId = window.setTimeout(() => {\n if (this.adFailsafeToken !== token) {\n return;\n }\n this.adFailsafeTimerId = void 0;\n this.adFailsafeToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n this.logAdState(\"ad_failsafe_triggered\", {\n token,\n failsafeMs,\n videoPaused: this.video.paused\n });\n this.callbacks.onFailsafeTimeout();\n }, failsafeMs);\n this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n }\n clearAdFailsafeTimer() {\n if (this.adFailsafeTimerId != null) {\n clearTimeout(this.adFailsafeTimerId);\n this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n this.adFailsafeTimerId = void 0;\n }\n this.adFailsafeToken = null;\n }\n logAdState(event, extra = {}) {\n if (!this.debug) {\n return;\n }\n const { inAdBreak, showAds, adPlaying } = this.callbacks.getAdState();\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n showAds,\n adPlaying,\n inAdBreak,\n activeAdRequestToken: this.activeAdRequestToken,\n ...extra\n });\n }\n // --- Reset for ad break end ---\n resetForBreakEnd() {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdRequestWatchdog();\n this.clearAdFailsafeTimer();\n this.activeAdRequestToken = null;\n this.expectedAdBreakDurationMs = void 0;\n this.currentAdBreakStartWallClockMs = void 0;\n this.scteAdBreakEndWallClockMs = void 0;\n this.adBreakPlayedDurationMs = 0;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.consecutiveFailures = 0;\n this.globalConsecutiveNoFills = 0;\n this.adBreakEpoch++;\n }\n destroy() {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdFailsafeTimer();\n this.clearAdRequestWatchdog();\n }\n};\n\n// src/player/PlaceholderLayer.ts\nvar PlaceholderLayer = class {\n constructor(video, debug) {\n this.video = video;\n this.debug = debug;\n }\n ensureContainer() {\n if (this.container) {\n return;\n }\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.left = \"0\";\n el.style.top = \"0\";\n el.style.right = \"0\";\n el.style.bottom = \"0\";\n el.style.display = \"none\";\n el.style.alignItems = \"center\";\n el.style.justifyContent = \"center\";\n el.style.pointerEvents = \"none\";\n el.style.zIndex = \"5\";\n el.style.backgroundColor = \"#000\";\n el.style.transition = \"opacity 0.3s ease-in-out\";\n el.style.opacity = \"0\";\n if (!this.video.parentElement) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n }\n return;\n }\n this.video.parentElement.appendChild(el);\n this.container = el;\n }\n show() {\n this.ensureContainer();\n if (!this.container) {\n return;\n }\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n }\n }\n const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n if (wasHidden) {\n this.container.style.transition = \"none\";\n } else {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n this.container.style.backgroundColor = \"#000\";\n this.container.style.display = \"flex\";\n this.container.offsetHeight;\n this.container.style.opacity = \"1\";\n this.container.style.pointerEvents = \"auto\";\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (this.container) {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n }\n }\n hide() {\n if (!this.container) {\n return;\n }\n this.container.style.opacity = \"0\";\n setTimeout(() => {\n if (this.container) {\n this.container.style.display = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.backgroundColor = \"#000\";\n }\n }, 300);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n }\n }\n destroy() {\n if (this.container) {\n if (this.container.parentElement) {\n this.container.parentElement.removeChild(this.container);\n }\n this.container = void 0;\n }\n }\n};\n\n// src/player/HlsEngine.ts\nvar import_hls2 = __toESM(require(\"hls.js\"), 1);\nvar HlsEngine = class {\n constructor(config, video, cueManager, timing, callbacks) {\n this.isLiveStream = false;\n this.nativeHlsMode = false;\n this.videoSrcProtection = null;\n this.reloadingLiveStream = false;\n this.bufferedSegmentsCount = 0;\n this.shouldAutoplayAfterBuffering = false;\n this.hasInitialBufferCompleted = false;\n this.latencyProfileApplied = false;\n this.config = config;\n this.video = video;\n this.cueManager = cueManager;\n this.timing = timing;\n this.callbacks = callbacks;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n shouldUseNativeHls(getStreamType) {\n const streamType = getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n async setupNativeHls() {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n if (this.debug) {\n const adBehavior = this.isLiveStream ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n console.log(\n \"[StormcloudVideoPlayer] Using native HLS playback:\",\n {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior\n }\n );\n }\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n setupHls() {\n this.hls = new import_hls2.default({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: 1.1,\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1e3 * 1e3,\n maxBufferHole: 1,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.2,\n nudgeMaxRetry: 5,\n startPosition: -1\n });\n this.hls.on(import_hls2.default.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n this.hls.on(import_hls2.default.Events.MANIFEST_PARSED, async (_, _data) => {\n this.isLiveStream = this.config.isLiveStream ?? (this.hls?.levels?.some(\n (level) => level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false);\n await this.callbacks.onManifestParsed(this.isLiveStream);\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n this.latencyProfileApplied = false;\n this.detectedLowLatencyStream = void 0;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n this.reloadingLiveStream = false;\n });\n this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\n this.applyStreamLatencyProfile(data?.details);\n if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n return;\n }\n const details = data?.details;\n if (!details || !details.fragments || details.fragments.length === 0) {\n return;\n }\n const fragmentsToScan = Math.min(5, details.fragments.length);\n for (let i = 0; i < fragmentsToScan; i++) {\n const frag = details.fragments[i];\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) continue;\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = tag.includes(\"EXT-X-DATERANGE\") ? parseAttributeList(value) : {};\n const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") || \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n if (hasScteOut) {\n const durationSeconds = parseCueOutDuration(value);\n const marker = {\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value, earlyDetection: true }\n };\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n }\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag)\n });\n return;\n }\n }\n }\n }\n });\n this.hls.on(import_hls2.default.Events.FRAG_BUFFERED, async (_evt, _data) => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n if (this.shouldAutoplayAfterBuffering) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n this.hls.on(import_hls2.default.Events.FRAG_PARSING_METADATA, (_evt, data) => {\n const id3Tags = (data?.samples || []).map((s) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n this.hls.on(import_hls2.default.Events.FRAG_LOADED, (_evt, data) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n getFragmentStartSeconds(data?.frag)\n );\n });\n this.hls.on(import_hls2.default.Events.FRAG_DECRYPTED, (_evt, data) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n getFragmentStartSeconds(data?.frag)\n );\n });\n this.hls.on(import_hls2.default.Events.FRAG_CHANGED, (_evt, data) => {\n const frag = data?.frag;\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) {\n this.callbacks.activatePendingCuesForFragment(frag);\n return;\n }\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = parseCueOutCont(value);\n const marker = {\n type: \"progress\",\n ...prog?.duration !== void 0 ? { durationSeconds: prog.duration } : {},\n ...prog?.elapsed !== void 0 ? { ptsSeconds: prog.elapsed } : {},\n raw: { tag, value }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = parseCueOutDuration(value);\n const marker = {\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n }\n );\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = parseAttributeList(value);\n const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker = {\n type: \"start\",\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { tag, value, attrs }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n }\n if (hasScteIn) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value, attrs } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n }\n );\n }\n }\n }\n this.callbacks.activatePendingCuesForFragment(frag);\n });\n this.hls.on(import_hls2.default.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case import_hls2.default.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case import_hls2.default.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.callbacks.onFatalDestroy();\n break;\n }\n }\n });\n this.hls.attachMedia(this.video);\n }\n isLowLatencyStream() {\n return this.detectedLowLatencyStream;\n }\n applyStreamLatencyProfile(details) {\n if (this.latencyProfileApplied || !this.hls) {\n return;\n }\n if (!details) {\n return;\n }\n if (details.live !== true) {\n this.latencyProfileApplied = true;\n this.detectedLowLatencyStream = false;\n return;\n }\n const isLowLatencyManifest = this.isLowLatencyManifest(details);\n const useLowLatency = isLowLatencyManifest && !!this.config.lowLatencyMode;\n this.detectedLowLatencyStream = useLowLatency;\n this.latencyProfileApplied = true;\n const cfg = this.hls.config;\n if (useLowLatency) {\n cfg.maxLiveSyncPlaybackRate = 1.5;\n cfg.maxBufferHole = 0.5;\n delete cfg.liveSyncDuration;\n } else {\n cfg.maxLiveSyncPlaybackRate = 1.1;\n cfg.maxBufferHole = 1;\n delete cfg.liveSyncDuration;\n cfg.liveSyncDurationCount = 3;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live latency profile: ${useLowLatency ? \"LL-HLS (low latency)\" : \"standard live (stability)\"}`,\n {\n isLowLatencyManifest,\n lowLatencyModeRequested: !!this.config.lowLatencyMode,\n canBlockReload: details.canBlockReload,\n partTarget: details.partTarget,\n partHoldBack: details.partHoldBack,\n partListLength: Array.isArray(details.partList) ? details.partList.length : 0,\n targetDuration: details.targetduration ?? details.targetDuration,\n maxLiveSyncPlaybackRate: cfg.maxLiveSyncPlaybackRate,\n maxBufferHole: cfg.maxBufferHole\n }\n );\n }\n }\n isLowLatencyManifest(details) {\n if (!details) {\n return false;\n }\n const hasParts = Array.isArray(details.partList) && details.partList.length > 0;\n const hasPartTarget = typeof details.partTarget === \"number\" && details.partTarget > 0;\n const hasPartHoldBack = typeof details.partHoldBack === \"number\" && details.partHoldBack > 0;\n const canBlockReload = details.canBlockReload === true;\n return hasParts || hasPartTarget || hasPartHoldBack || canBlockReload;\n }\n onId3Tag(tag) {\n if (typeof tag.ptsSeconds === \"number\") {\n this.timing.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = parseScte35FromId3(tag);\n if (marker) {\n this.callbacks.onScte35Cue(marker, {\n source: \"id3\",\n readiness: \"playback\"\n });\n }\n }\n processFragmentScte35Payload(payloadData, fragmentSn, fragmentStartSeconds) {\n const payload = normalizeFragmentPayload(payloadData);\n if (!payload) {\n return;\n }\n const markers = parseScte35FromTsPackets(\n payload,\n this.cueManager.tsScte35Pids,\n this.cueManager.pmtPids,\n this.cueManager.processedTsScte35Sections\n );\n markers.forEach((marker) => {\n const context = {\n source: \"ts\",\n readiness: \"early\"\n };\n if (fragmentSn !== void 0) {\n context.fragmentSn = fragmentSn;\n }\n if (fragmentStartSeconds !== void 0) {\n context.fragmentStartSeconds = fragmentStartSeconds;\n }\n this.callbacks.onScte35Cue(marker, context);\n });\n }\n getLiveSyncPosition() {\n const pos = this.hls?.liveSyncPosition;\n return typeof pos === \"number\" && Number.isFinite(pos) ? pos : void 0;\n }\n restartLoadAt(position) {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.stopLoad();\n this.hls.startLoad(position);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to restart HLS load at live edge:\", error);\n }\n }\n }\n recoverMediaError() {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.recoverMediaError();\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] recoverMediaError() failed:\", error);\n }\n }\n }\n reloadLiveStream() {\n const hls = this.hls;\n if (!hls) {\n return;\n }\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls \\u2192 reset video \\u2192 fresh setupHls)\"\n );\n }\n try {\n this.reloadingLiveStream = true;\n hls.stopLoad();\n hls.detachMedia();\n hls.destroy();\n this.hls = void 0;\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch (error) {\n console.warn(\"[StormcloudVideoPlayer] video.load() threw after src removal:\", error);\n }\n } catch (error) {\n this.reloadingLiveStream = false;\n this.hls = void 0;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to tear down during hard-reload:\", error);\n }\n return;\n }\n const recreateDelayMs = 600;\n window.setTimeout(() => {\n if (this.hls) {\n this.reloadingLiveStream = false;\n return;\n }\n try {\n this.setupHls();\n } catch (error) {\n this.reloadingLiveStream = false;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:\", error);\n }\n }\n }, recreateDelayMs);\n }\n destroy() {\n this.hls?.destroy();\n this.hls = void 0;\n }\n};\n\n// src/player/PlayerControls.ts\nfunction getAdAudioVolume(adPlayer) {\n return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\nfunction toggleMute(video, adPlayer, debug) {\n if (adPlayer.isAdPlaying()) {\n const newMutedState = !adPlayer.getOriginalMutedState();\n const restoreVolume = adPlayer.getOriginalVolume() || 1;\n adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n newMutedState\n );\n }\n } else {\n video.muted = !video.muted;\n adPlayer.updateOriginalMutedState(video.muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n }\n }\n}\nfunction toggleFullscreen(video, debug) {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container.requestFullscreen().then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n }\n resolve();\n }).catch((err) => {\n if (debug) {\n console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n }\n reject(err);\n });\n } else {\n document.exitFullscreen().then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n }\n resolve();\n }).catch((err) => {\n if (debug) {\n console.error(\n \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n err\n );\n }\n reject(err);\n });\n }\n });\n}\nfunction isMuted(video, adPlayer) {\n if (adPlayer.isAdPlaying()) {\n return adPlayer.getOriginalMutedState();\n }\n return video.muted;\n}\nfunction setMuted(video, adPlayer, muted, debug) {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying && muted === video.muted) {\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n { muted }\n );\n }\n return;\n }\n video.muted = muted;\n if (adPlaying) {\n adPlayer.updateOriginalMutedState(muted, video.volume);\n adPlayer.setAdVolume(muted ? 0 : 1);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n muted\n });\n }\n return;\n }\n adPlayer.updateOriginalMutedState(muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n }\n}\nfunction setVolume(video, adPlayer, volume, debug) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n adPlayer.setAdVolume(clampedVolume);\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n volume: clampedVolume\n });\n }\n } else {\n video.volume = clampedVolume;\n video.muted = clampedVolume === 0;\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n }\n }\n}\nfunction getVolume(video, adPlayer) {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n return adPlayer.getAdVolume();\n }\n return video.volume;\n}\nfunction isFullscreen() {\n return !!document.fullscreenElement;\n}\nfunction resizePlayer(video, adPlayer, debug) {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Resizing player\");\n }\n if (adPlayer && adPlayer.isAdPlaying()) {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n if (debug) {\n console.log(\n `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n );\n }\n adPlayer.resize(width, height);\n }\n}\n\n// src/player/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator = class {\n constructor(host, timing, adConfig, cueManager, placeholder) {\n this.inAdBreak = false;\n this.showAds = false;\n this.isShowingPlaceholder = false;\n this.adDetectSentForCurrentBreak = false;\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.adRequestQueue = [];\n this.adPodQueue = [];\n this.maxPlaceholderDurationMs = 5e3;\n this.pendingAdBreak = null;\n this.host = host;\n this.timing = timing;\n this.adConfig = adConfig;\n this.cueManager = cueManager;\n this.placeholder = placeholder;\n }\n get debug() {\n return !!this.host.config.debugAdTiming;\n }\n get analyticsContext() {\n return buildAnalyticsContext(this.host.config);\n }\n // ───────────────────────────────────────────────────────────────\n // IMA event listeners\n // ───────────────────────────────────────────────────────────────\n nextAdRequestUrl(baseVastUrl) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n const breakDurationMs = remaining > 0 ? remaining : void 0;\n return this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n attachImaEventListeners() {\n const adPlayer = this.host.getAdPlayer();\n adPlayer.on(\"pod_ad_started\", (payload) => {\n this.timing.notePodAdStarted();\n if (this.debug) {\n console.log(\n `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n );\n }\n });\n adPlayer.on(\"all_ads_completed\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n this.timing.consecutiveFailures = 0;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.inAdBreak) {\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n }\n });\n adPlayer.on(\"ad_error\", (errorPayload) => {\n let errorMessage = \"Ad playback failed\";\n if (errorPayload) {\n const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n const vastErrorCode = errorPayload.vastErrorCode;\n const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n }\n if (cause) {\n const causeMessage = typeof cause === \"string\" ? cause : cause.message || String(cause);\n errorMessage += `. Caused by: ${causeMessage}`;\n }\n }\n console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n this.handleAdFailure();\n });\n adPlayer.on(\"content_pause\", () => {\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = true;\n this.timing.resetGamNoFillCounter();\n if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n }\n }\n this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n if (this.isShowingPlaceholder) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n }\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n });\n adPlayer.on(\"content_resume\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n if (!this.host.video.muted) {\n this.host.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n }\n }\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = false;\n if (!this.inAdBreak) {\n return;\n }\n this.timing.consecutiveFailures = 0;\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n });\n }\n recreateAdController() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n }\n const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n const adPlayer = this.host.getAdPlayer();\n if (shouldShowPlaceholder && adPlayer) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n }\n this.placeholder.show();\n adPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n const preservedMutedState = adPlayer.getOriginalMutedState();\n const preservedVolumeState = adPlayer.getOriginalVolume();\n if (adPlayer) {\n try {\n adPlayer.destroy();\n this.host.video.muted = true;\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n }\n }\n }\n const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n this.host.setAdPlayer(newAdPlayer);\n newAdPlayer.initialize();\n newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n this.attachImaEventListeners();\n if (shouldShowPlaceholder) {\n this.placeholder.show();\n newAdPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n }\n clearPendingAdBreak() {\n if (this.prefetchTimerId != null) {\n clearTimeout(this.prefetchTimerId);\n this.prefetchTimerId = void 0;\n }\n this.pendingAdBreak = null;\n this.cueManager.pendingScte35CueKey = void 0;\n this.adConfig.podAssignedByPrefetch = false;\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break start\n // ───────────────────────────────────────────────────────────────\n async handleAdStart(_marker) {\n const scheduled = this.adConfig.findCurrentOrNextBreak(\n this.host.video.currentTime * 1e3\n );\n if (scheduled) {\n this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n }\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n this.clearPendingAdBreak();\n return;\n }\n const adBreakDurationMs = _marker.durationSeconds != null ? _marker.durationSeconds * 1e3 : scheduled?.durationMs;\n if (this.debug) {\n const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n console.log(\n `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n );\n }\n this.timing.failedVastUrls.clear();\n this.timing.temporaryFailureUrls.clear();\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.isShowingPlaceholder = false;\n this.timing.totalAdRequestsInBreak = 0;\n if (this.adConfig.podAssignedByPrefetch) {\n this.adConfig.podAssignedByPrefetch = false;\n } else {\n this.adConfig.beginNewAdPod();\n }\n const currentMuted = this.host.video.muted;\n const currentVolume = this.host.video.volume;\n this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n this.inAdBreak = true;\n this.timing.adBreakPlayedDurationMs = 0;\n this.timing.currentAdIndex = 0;\n this.timing.totalAdsInBreak = 0;\n this.adPodQueue = [];\n this.showAds = false;\n if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {\n this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n }\n const podPlayed = await this.startOptimizedPod(\n baseVastUrl,\n adBreakDurationMs,\n currentMuted,\n currentVolume\n );\n if (!podPlayed) {\n if (this.debug) {\n console.log(\"[POD] Initial pod request did not fill; attempting top-up pod request\");\n }\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Optimized pod (single multi-ad request)\n // ───────────────────────────────────────────────────────────────\n async startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {\n let podUrl;\n if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n podUrl = this.pendingAdBreak.vastUrls[0];\n this.clearPendingAdBreak();\n } else {\n podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n if (!podUrl) {\n return false;\n }\n this.continuousFetchingActive = false;\n this.recreateAdController();\n const adPlayer = this.host.getAdPlayer();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n await adPlayer.requestAds(podUrl);\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) {\n return true;\n }\n const podCount = adPlayer.getPodAdCount?.() ?? 1;\n if (podCount < 1) {\n return false;\n }\n if (this.debug) {\n console.log(\n podCount === 1 ? \"[POD] Response contained a single ad; playing it and enabling pod top-up\" : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n );\n }\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: podUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.startAdFailsafeTimer(requestToken);\n await adPlayer.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n return true;\n } catch (error) {\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n if (this.debug) {\n console.warn(\"[POD] Optimized pod request/play failed:\", error);\n }\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n }\n this.continuousFetchingActive = true;\n this.recreateAdController();\n return false;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Continuous fetching\n // ───────────────────────────────────────────────────────────────\n startContinuousFetching(baseVastUrl) {\n if (!this.continuousFetchingActive) {\n return;\n }\n if (this.continuousFetchLoopRunning) {\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n }\n return;\n }\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n }\n this.continuousFetchLoopRunning = true;\n this.continuousFetchLoop(baseVastUrl);\n }\n async continuousFetchLoop(baseVastUrl) {\n const epoch = this.timing.adBreakEpoch;\n while (this.continuousFetchingActive && this.inAdBreak && epoch === this.timing.adBreakEpoch) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n }\n break;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n }\n break;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n }\n break;\n }\n if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n }\n break;\n }\n const maxQueueSize = 5;\n if (this.adRequestQueue.length >= maxQueueSize) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n }\n await new Promise((resolve) => setTimeout(resolve, 1e3));\n continue;\n }\n const newAdUrl = this.nextAdRequestUrl(baseVastUrl);\n if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n continue;\n }\n if (this.debug) {\n const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n console.log(\n `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n { queuedUrls: queuedUrlsPreview }\n );\n }\n this.adRequestQueue.push(newAdUrl);\n const generationDelay = this.timing.consecutiveFailures > 0 ? Math.min(1e3 * Math.pow(2, this.timing.consecutiveFailures), 5e3) : 500;\n await new Promise((resolve) => setTimeout(resolve, generationDelay));\n }\n this.continuousFetchLoopRunning = false;\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n }\n stopContinuousFetching() {\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.placeholder.hide();\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Ad iteration\n // ───────────────────────────────────────────────────────────────\n async tryNextAvailableAdWithRateLimit() {\n if (!this.inAdBreak) {\n return;\n }\n const epoch = this.timing.adBreakEpoch;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n }\n this.handleAdPodComplete();\n return;\n }\n const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n if (timeSinceLastRequest < effectiveMinInterval) {\n const waitTime = effectiveMinInterval - timeSinceLastRequest;\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n return;\n }\n return this.tryNextAvailableAd(0);\n }\n async tryNextAvailableAd(retryCount = 0) {\n if (!this.inAdBreak) {\n return;\n }\n const remaining = this.timing.getRemainingAdMs();\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n this.timing.cleanupTemporaryFailures();\n while (this.adRequestQueue.length > 0) {\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n continue;\n }\n if (this.timing.isUrlInCooldown(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n continue;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n }\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n const maxRetries = 3;\n if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2e3) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n await this.tryNextAvailableAd(retryCount + 1);\n return;\n }\n if (!this.isShowingPlaceholder && remaining > 1e3) {\n this.showPlaceholderAndWaitForAds();\n } else {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n this.handleAdPodComplete();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Single ad playback\n // ───────────────────────────────────────────────────────────────\n async playSingleAd(vastTagUrl) {\n const adPlayer = this.host.getAdPlayer();\n if (adPlayer.isAdPlaying()) return;\n if (this.timing.failedVastUrls.has(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n throw new Error(\"VAST URL permanently failed\");\n }\n if (this.timing.isUrlInCooldown(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n throw new Error(\"VAST URL in cooldown after no-fill\");\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n throw new Error(\"Too many consecutive failures\");\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n throw new Error(\"GAM in cooldown\");\n }\n this.recreateAdController();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n const ap = this.host.getAdPlayer();\n await ap.requestAds(vastTagUrl);\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: vastTagUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) return;\n if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n this.timing.rejectLoadedAdForDuration(ap);\n this.recreateAdController();\n throw new Error(\"ad_duration_exceeds_budget\");\n }\n try {\n this.timing.startAdFailsafeTimer(requestToken);\n await ap.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n ap.setAdVolume(getAdAudioVolume(ap));\n this.timing.consecutiveFailures = 0;\n this.timing.temporaryFailureUrls.delete(vastTagUrl);\n } catch (playError) {\n if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n if (this.timing.isTemporaryAdError(playError)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n }\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw playError;\n }\n } catch (error) {\n const errorMessage = error?.message || \"\";\n if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n }\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw error;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Placeholder wait\n // ───────────────────────────────────────────────────────────────\n async showPlaceholderAndWaitForAds() {\n const remaining = this.timing.getRemainingAdMs();\n const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n this.handleAdPodComplete();\n return;\n }\n if (waitTime < 1e3) {\n this.handleAdPodComplete();\n return;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n }\n this.isShowingPlaceholder = true;\n this.host.getAdPlayer().showPlaceholder();\n const checkInterval = 300;\n const maxChecks = Math.floor(waitTime / checkInterval);\n for (let i = 0; i < maxChecks; i++) {\n await new Promise((resolve) => setTimeout(resolve, checkInterval));\n if (!this.inAdBreak) return;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n break;\n }\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n break;\n }\n while (this.adRequestQueue.length > 0) {\n if (!this.timing.hasTimeToStartAnotherAd()) break;\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n }\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n this.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break completion\n // ───────────────────────────────────────────────────────────────\n handleAdPodComplete() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n }\n this.timing.resetForBreakEnd();\n this.stopContinuousFetching();\n this.clearPendingAdBreak();\n if (this.isShowingPlaceholder) {\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n this.adRequestQueue = [];\n this.inAdBreak = false;\n this.adDetectSentForCurrentBreak = false;\n this.cueManager.activeScte35BreakKey = void 0;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.adPodQueue = [];\n this.showAds = false;\n this.host.getAdPlayer().stop().catch(() => {\n });\n const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n if (this.host.video.muted !== restoredMuted) {\n this.host.video.muted = restoredMuted;\n }\n if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n this.host.video.volume = restoredVolume;\n }\n this.host.video.style.visibility = \"visible\";\n this.host.video.style.opacity = \"1\";\n if (this.host.isLiveStream()) {\n if (this.host.requiresMediaPipelineResetAfterAds()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Live break end \\u2014 hard-reloading stream to reacquire decoder (single-decoder platform)\"\n );\n }\n this.host.reloadLiveStream();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n const liveSyncPos = this.host.getLiveSyncPosition();\n if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live break end \\u2014 snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s \\u2192 ${liveSyncPos.toFixed(2)}s`\n );\n }\n this.host.video.currentTime = liveSyncPos;\n this.host.restartHlsLoad(liveSyncPos);\n }\n this.resumeContentPlayback();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n this.resumeContentPlayback();\n }\n getBufferedAhead() {\n const video = this.host.video;\n const t = video.currentTime;\n const ranges = video.buffered;\n for (let i = 0; i < ranges.length; i++) {\n if (t >= ranges.start(i) - 0.5 && t <= ranges.end(i)) {\n return ranges.end(i) - t;\n }\n }\n return 0;\n }\n describeVideoState() {\n const v = this.host.video;\n const networkStates = [\"EMPTY\", \"IDLE\", \"LOADING\", \"NO_SOURCE\"];\n const readyStates = [\n \"HAVE_NOTHING\",\n \"HAVE_METADATA\",\n \"HAVE_CURRENT_DATA\",\n \"HAVE_FUTURE_DATA\",\n \"HAVE_ENOUGH_DATA\"\n ];\n const net = networkStates[v.networkState] ?? String(v.networkState);\n const ready = readyStates[v.readyState] ?? String(v.readyState);\n const err = v.error ? `code=${v.error.code}${v.error.message ? ` (${v.error.message})` : \"\"}` : \"none\";\n const ranges = [];\n for (let i = 0; i < v.buffered.length; i++) {\n ranges.push(`[${v.buffered.start(i).toFixed(2)}\\u2013${v.buffered.end(i).toFixed(2)}]`);\n }\n return `t=${v.currentTime.toFixed(2)}s paused=${v.paused} ended=${v.ended} seeking=${v.seeking} readyState=${ready} networkState=${net} error=${err} buffered=${ranges.length ? ranges.join(\",\") : \"none\"}`;\n }\n monitorLiveResumeStall(resumeBaseline) {\n const needsReset = this.host.requiresMediaPipelineResetAfterAds();\n const pollIntervalMs = 1e3;\n const graceMs = needsReset ? 8e3 : 5e3;\n const recoveryCooldownMs = needsReset ? 7e3 : 5e3;\n const maxRecoveries = 3;\n const maxMonitorMs = 45e3;\n const startTime = Date.now();\n let baseline = resumeBaseline;\n let recoveries = 0;\n let lastRecoveryAt = 0;\n const video = this.host.video;\n let listenersAttached = false;\n let onMediaEvent;\n const diagEvents = [\n \"loadstart\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"stalled\",\n \"suspend\",\n \"seeking\",\n \"seeked\",\n \"emptied\",\n \"error\",\n \"ended\"\n ];\n if (this.debug) {\n onMediaEvent = (e) => {\n const dt = ((Date.now() - startTime) / 1e3).toFixed(1);\n console.log(\n `[ResumeDiag] +${dt}s event=${e.type} \\u2014 ${this.describeVideoState()}`\n );\n };\n for (const name of diagEvents) {\n video.addEventListener(name, onMediaEvent);\n }\n listenersAttached = true;\n console.log(\n `[ResumeDiag] +0.0s monitor start \\u2014 ${this.describeVideoState()}`\n );\n }\n const cleanup = () => {\n if (listenersAttached && onMediaEvent) {\n for (const name of diagEvents) {\n video.removeEventListener(name, onMediaEvent);\n }\n listenersAttached = false;\n }\n };\n const poll = () => {\n if (this.inAdBreak) {\n cleanup();\n return;\n }\n const currentTime = video.currentTime;\n const advanced = currentTime > baseline + 0.5;\n const playing = !video.paused && video.readyState >= 3;\n if (advanced && playing) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live stream resumed successfully after ad break \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n const elapsed = Date.now() - startTime;\n const bufferedAhead = this.getBufferedAhead();\n const wedged = bufferedAhead < 0.5 && !advanced;\n if (elapsed >= maxMonitorMs) {\n if (this.debug && !advanced) {\n console.warn(\n `[StormcloudVideoPlayer] Live stream failed to resume after ${(maxMonitorMs / 1e3).toFixed(0)}s \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n const canRecover = wedged && elapsed >= graceMs && Date.now() - lastRecoveryAt >= recoveryCooldownMs && recoveries < maxRecoveries;\n if (canRecover) {\n recoveries++;\n lastRecoveryAt = Date.now();\n if (needsReset) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n } else if (recoveries === 1) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 calling recoverMediaError() (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.recoverMediaError();\n } else if (recoveries === 2) {\n const liveSyncPos = this.host.getLiveSyncPosition();\n const reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 restarting HLS load at ${reloadPos.toFixed(2)}s (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n if (liveSyncPos != null && liveSyncPos > currentTime) {\n video.currentTime = liveSyncPos;\n }\n this.host.restartHlsLoad(reloadPos);\n } else {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n }\n baseline = video.currentTime;\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n }\n window.setTimeout(poll, pollIntervalMs);\n };\n window.setTimeout(poll, pollIntervalMs);\n }\n resumeContentPlayback(attempt = 0) {\n const maxAttempts = 5;\n const video = this.host.video;\n if (!video.paused) {\n if (this.debug && attempt === 0) {\n console.log(\"[StormcloudVideoPlayer] Content video already playing after ads\");\n }\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Resuming content playback after ads (attempt ${attempt + 1}/${maxAttempts}, readyState=${video.readyState})`\n );\n }\n if (video.readyState < 3) {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] readyState never reached HAVE_FUTURE_DATA, forcing play()\"\n );\n }\n video.play()?.catch(() => {\n });\n return;\n }\n const onReady = () => {\n video.removeEventListener(\"canplay\", onReady);\n this.resumeContentPlayback(attempt + 1);\n };\n video.addEventListener(\"canplay\", onReady);\n const backoffMs = 500 * (attempt + 1);\n window.setTimeout(() => {\n video.removeEventListener(\"canplay\", onReady);\n if (video.paused) {\n this.resumeContentPlayback(attempt + 1);\n }\n }, backoffMs);\n return;\n }\n const playResult = video.play();\n if (playResult && typeof playResult.catch === \"function\") {\n playResult.catch((error) => {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to resume content playback after ads:\",\n error\n );\n }\n return;\n }\n const backoffMs = 250 * (attempt + 1);\n window.setTimeout(() => {\n this.resumeContentPlayback(attempt + 1);\n }, backoffMs);\n });\n }\n }\n handleAdFailure() {\n this.timing.consecutiveFailures++;\n this.timing.recordGamNoFill();\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n this.handleAdPodComplete();\n }\n }\n};\n\n// src/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer = class {\n constructor(config) {\n this.attached = false;\n this.palPlaybackStarted = false;\n initializePolyfills();\n const browserOverrides = getBrowserConfigOverrides();\n this.config = { ...browserOverrides, ...config };\n this.video = config.videoElement;\n logBrowserInfo(config.debugAdTiming);\n this.adPlayer = this.createAdPlayer(false);\n this.palNonce = createPalNonceManager();\n this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {\n onEarlyStartCue: (marker, fragmentSn, cueKey) => {\n this.startAdPrefetch(marker, fragmentSn, cueKey);\n },\n onPlaybackCue: (marker, cueKey) => {\n this.onScte35Marker(marker, cueKey);\n },\n isInAdBreak: () => this.adBreak.inAdBreak\n });\n this.adConfig = new AdConfigManager(this.config, this.video);\n this.timing = new AdTimingService(this.config, this.video, {\n onAdStopTimerFired: () => this.onAdStopTimerFired(),\n onAdStartTimerFired: (marker, cueKey) => {\n this.startScte35AdBreak(\n marker,\n cueKey,\n marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.timing.expectedAdBreakDurationMs\n );\n },\n onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n onFailsafeTimeout: () => this.adBreak.handleAdFailure(),\n getAdState: () => ({\n inAdBreak: this.adBreak.inAdBreak,\n showAds: this.adBreak.showAds,\n adPlaying: this.adPlayer.isAdPlaying()\n })\n });\n this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n this.hlsEngine = new HlsEngine(this.config, this.video, this.cueManager, this.timing, {\n onManifestParsed: async (isLive) => this.onManifestParsed(isLive),\n onScte35Cue: (marker, context) => this.cueManager.onScte35Cue(marker, context),\n activatePendingCuesForFragment: (frag) => this.cueManager.activatePendingScte35CuesForFragment(frag),\n onFatalDestroy: () => this.destroy(),\n isInAdBreak: () => this.adBreak.inAdBreak,\n hasPendingAdBreak: () => this.adBreak.pendingAdBreak !== null\n });\n this.adBreak = new AdBreakOrchestrator(\n {\n config: this.config,\n video: this.video,\n getAdPlayer: () => this.adPlayer,\n setAdPlayer: (p) => {\n this.adPlayer = p;\n },\n createAdPlayer: (c) => this.createAdPlayer(c),\n shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n isLiveStream: () => this.hlsEngine.isLiveStream,\n getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n restartHlsLoad: (position) => this.hlsEngine.restartLoadAt(position),\n reloadLiveStream: () => this.hlsEngine.reloadLiveStream(),\n recoverMediaError: () => this.hlsEngine.recoverMediaError(),\n requiresMediaPipelineResetAfterAds: () => requiresMediaPipelineResetAfterAds(),\n generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs)\n },\n this.timing,\n this.adConfig,\n this.cueManager,\n this.placeholder\n );\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n createAdPlayer(continueLiveStreamDuringAds) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n }\n return createHlsAdPlayer(this.video, {\n continueLiveStreamDuringAds,\n ...this.config.licenseKey ? { licenseKey: this.config.licenseKey } : {},\n ...this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}\n });\n }\n generatePodVastUrl(baseUrl, breakDurationMs) {\n const podParams = this.adConfig.resolvePodParams(breakDurationMs);\n return this.adConfig.generatePodVastUrl(\n baseUrl,\n podParams,\n this.adPlayer,\n this.palNonce,\n this.adBreak.inAdBreak\n );\n }\n // ───────────────────────────────────────────────────────────────\n // Lifecycle\n // ───────────────────────────────────────────────────────────────\n async load() {\n if (!this.attached) {\n this.attach();\n }\n try {\n await this.adConfig.fetchAdConfiguration();\n } catch (error) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n error\n );\n }\n }\n const palDescriptionUrl = this.adConfig.getPalDescriptionUrl();\n this.palNonce.generateNonce({\n videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,\n videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,\n adWillAutoPlay: !!this.config.autoplay,\n adWillPlayMuted: true,\n playerVolume: 0,\n continuousPlayback: this.config.lowLatencyMode ?? false,\n ...palDescriptionUrl ? { descriptionUrl: palDescriptionUrl } : {}\n }).catch(() => {\n });\n fetchConsentSignals().then((signals) => {\n this.adConfig.consentSignals = signals;\n }).catch(() => {\n });\n this.adConfig.initializeTracking();\n if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n await this.hlsEngine.setupNativeHls();\n const continueLiveStreamDuringAds = this.shouldContinueLiveStreamDuringAds();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Native HLS ad behavior:\", {\n isLive: this.hlsEngine.isLiveStream,\n continueLiveStreamDuringAds\n });\n }\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n this.adPlayer.initialize();\n return;\n }\n this.hlsEngine.setupHls();\n }\n async onManifestParsed(isLive) {\n if (this.hlsEngine.reloadingLiveStream) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Manifest re-parsed after hard reload \\u2014 skipping ad-player setup\");\n }\n return;\n }\n if (!this.adConfig.isVmapEnabled() && !isLive && this.adConfig.vmapBreaks.length === 0 && this.adConfig.apiVastTagUrl) {\n const prerollKey = \"synthetic-vod-preroll\";\n if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {\n this.adConfig.vmapBreaks = [\n { id: prerollKey, startTimeMs: 0, vastTagUrl: this.adConfig.apiVastTagUrl }\n ];\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Injected synthetic VOD preroll from apiVastTagUrl\"\n );\n }\n }\n }\n if (this.debug) {\n const adBehavior = this.shouldContinueLiveStreamDuringAds() ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior\n });\n }\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n this.adPlayer.initialize();\n }\n attach() {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n this.adPlayer.initialize();\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.attachImaEventListeners();\n this.video.addEventListener(\"play\", () => {\n if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n this.palPlaybackStarted = true;\n this.palNonce.sendPlaybackStart();\n }\n });\n this.endedHandler = () => {\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.onVideoEnded();\n };\n this.video.addEventListener(\"ended\", this.endedHandler);\n this.video.addEventListener(\"mousedown\", (e) => {\n this.palNonce.sendAdTouch(e);\n });\n this.video.addEventListener(\"touchstart\", (e) => {\n this.palNonce.sendAdTouch(e);\n });\n this.timeUpdateHandler = () => {\n this.onTimeUpdate(this.video.currentTime);\n };\n this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n this.emptiedHandler = () => {\n if (this.hlsEngine.nativeHlsMode && this.hlsEngine.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Video src was cleared, restoring:\",\n this.hlsEngine.videoSrcProtection\n );\n }\n const currentTime = this.video.currentTime;\n const wasPaused = this.video.paused;\n this.video.src = this.hlsEngine.videoSrcProtection;\n this.video.currentTime = currentTime;\n if (!wasPaused) {\n this.video.play().catch(() => {\n });\n }\n }\n };\n this.video.addEventListener(\"emptied\", this.emptiedHandler);\n }\n shouldContinueLiveStreamDuringAds() {\n if (this.config.pauseContentDuringAds) {\n return false;\n }\n if (this.hlsEngine.isLiveStream) {\n return true;\n }\n const duration = this.video.duration;\n if (!Number.isFinite(duration) || duration === Infinity) {\n return true;\n }\n return false;\n }\n // ───────────────────────────────────────────────────────────────\n // SCTE-35 marker orchestration\n // ───────────────────────────────────────────────────────────────\n onScte35Marker(marker, cueKey) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n type: marker.type,\n ptsSeconds: marker.ptsSeconds,\n durationSeconds: marker.durationSeconds,\n currentTime: this.video.currentTime,\n raw: marker.raw,\n hasPendingAdBreak: !!this.adBreak.pendingAdBreak\n });\n }\n if (marker.type === \"start\") {\n if (this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n const newDurationMs = marker.durationSeconds * 1e3;\n if (this.timing.expectedAdBreakDurationMs == null || newDurationMs > this.timing.expectedAdBreakDurationMs) {\n this.timing.setAdBreakDurationBoundary(newDurationMs);\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Updated ad break duration from subsequent marker: ${newDurationMs}ms, remaining: ${this.timing.getWallClockRemainingAdMs()}ms`\n );\n }\n }\n }\n return;\n }\n if (!this.adBreak.adDetectSentForCurrentBreak) {\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n });\n }\n const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n const durationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.adBreak.pendingAdBreak?.marker.durationSeconds != null ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1e3 : void 0;\n const isManifest = isManifestBasedMarker(marker);\n const forceImmediate = this.config.immediateManifestAds ?? true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n isManifestMarker: isManifest,\n forceImmediate,\n hasPts: typeof marker.ptsSeconds === \"number\",\n hasPrefetchedAds\n });\n }\n if (isManifest && forceImmediate) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Starting ad immediately (manifest-based)${hasPrefetchedAds ? \" with prefetched ads\" : \"\"}`\n );\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n } else if (typeof marker.ptsSeconds === \"number\") {\n const tol = this.config.driftToleranceMs ?? 1e3;\n const nowMs = this.video.currentTime * 1e3;\n const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n const deltaMs = Math.floor(marker.ptsSeconds * 1e3 - estCurrentPtsMs);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n nowMs,\n estCurrentPtsMs,\n markerPtsMs: marker.ptsSeconds * 1e3,\n deltaMs,\n tolerance: tol\n });\n }\n if (deltaMs > tol) {\n if (this.debug) {\n console.log(`[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`);\n }\n this.timing.expectedAdBreakDurationMs = durationMs;\n this.cueManager.scheduledScte35BreakKey = cueKey;\n this.timing.scheduleAdStartIn(deltaMs, marker, cueKey);\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (fallback)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n return;\n }\n if (marker.type === \"progress\" && this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.timing.setAdBreakDurationBoundary(marker.durationSeconds * 1e3);\n }\n this.timing.scheduleAdStopAtBreakBoundary();\n if (!this.adPlayer.isAdPlaying() && this.timing.activeAdRequestToken === null && this.adBreak.adRequestQueue.length > 0 && this.timing.hasTimeToStartAnotherAd()) {\n this.adBreak.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n if (marker.type === \"end\") {\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on SCTE end marker\");\n }\n }\n const remaining = this.timing.getRemainingAdMs();\n const adPlaying = this.adPlayer.isAdPlaying();\n const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 end marker received:\", {\n remaining,\n adPlaying,\n hasQueuedAds,\n activeAdRequest: this.timing.activeAdRequestToken !== null\n });\n }\n this.timing.scteAdBreakEndWallClockMs = Date.now();\n this.timing.clearAdStartTimer();\n this.timing.clearAdStopTimer();\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {\n });\n }\n this.adBreak.handleAdPodComplete();\n return;\n }\n }\n startScte35AdBreak(marker, cueKey, durationMs) {\n this.adBreak.inAdBreak = true;\n this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.timing.currentAdBreakStartWallClockMs = this.timing.resolveScteBreakStartWallClockMs(marker);\n this.timing.setAdBreakDurationBoundary(durationMs);\n this.adBreak.handleAdStart(marker);\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n onAdStopTimerFired() {\n if (!this.adBreak.inAdBreak) return;\n const adPlaying = this.adPlayer.isAdPlaying();\n const checkIntervalMs = Math.max(\n 250,\n Math.floor(this.config.adBreakCheckIntervalMs ?? 1e3)\n );\n const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n const maxExtensionMs = typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0 ? maxExtensionMsConfig : 0;\n const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n if (shouldExtendAdBreak) {\n this.timing.scheduleAdStopCountdown(checkIntervalMs);\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Ad break boundary reached (overrun=${overrunMs}ms) - hard-stopping ads and resuming stream`\n );\n }\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {\n });\n }\n this.adBreak.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad prefetch\n // ───────────────────────────────────────────────────────────────\n startAdPrefetch(marker, fragmentSn, cueKey) {\n if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1e3);\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n if (this.debug) console.warn(\"[StormcloudVideoPlayer] No VAST URL available for prefetch\");\n return;\n }\n this.adConfig.beginNewAdPod();\n this.adConfig.podAssignedByPrefetch = true;\n const breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;\n const generatedUrls = [this.generatePodVastUrl(baseVastUrl, breakDurationMs)];\n this.adBreak.pendingAdBreak = {\n marker,\n ...fragmentSn !== void 0 ? { detectedAtFragmentSn: fragmentSn } : {},\n vastUrls: generatedUrls,\n isFetching: false,\n fetchStartTime: Date.now()\n };\n this.cueManager.pendingScte35CueKey = cueKey;\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n if (fragmentSn !== void 0) detectPayload.detectedAtFragmentSn = fragmentSn;\n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n });\n if (this.debug) {\n console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n console.log(`[PREFETCH] Pre-generated pod request URL`);\n }\n }\n // ───────────────────────────────────────────────────────────────\n // VMAP time-based ad breaks\n // ───────────────────────────────────────────────────────────────\n onTimeUpdate(currentTimeSec) {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n const nowMs = currentTimeSec * 1e3;\n const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n if (breakToPlay) {\n void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n }\n });\n }\n }\n onVideoEnded() {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n const durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;\n const postroll = this.adConfig.vmapBreaks.find(\n (b) => b.startTimeMs === -1 && !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n );\n if (postroll) {\n void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n }\n });\n }\n }\n async handleVmapAdBreak(adBreak, nowMs) {\n const key = this.adConfig.getAdBreakKey(adBreak);\n if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n if (breakStartMs == null) return;\n const durationMs = adBreak.durationMs ?? 0;\n const endMs = breakStartMs + durationMs;\n const inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;\n if (inWindow) {\n this.adConfig.consumedVmapBreakIds.add(key);\n const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n if (!tags || tags.length === 0) return;\n const first = tags[0];\n const rest = tags.slice(1);\n this.adBreak.adPodQueue = rest;\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.showAds = true;\n this.adBreak.inAdBreak = true;\n this.timing.currentAdBreakStartWallClockMs = Date.now();\n try {\n await this.adBreak.playSingleAd(first);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n }\n this.adBreak.handleAdPodComplete();\n }\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Public API\n // ───────────────────────────────────────────────────────────────\n getCurrentAdIndex() {\n return this.timing.currentAdIndex;\n }\n getTotalAdsInBreak() {\n return this.timing.totalAdsInBreak;\n }\n getAdRemainingMs() {\n return this.timing.getRemainingAdMs();\n }\n isAdPlaying() {\n return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n }\n isShowingAds() {\n return this.adBreak.showAds;\n }\n getStreamType() {\n const url = this.config.src.toLowerCase();\n if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n return \"hls\";\n }\n return \"other\";\n }\n shouldShowNativeControls() {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n }\n isLive() {\n return this.hlsEngine.isLiveStream;\n }\n isLowLatencyStream() {\n return this.hlsEngine.isLowLatencyStream();\n }\n get videoElement() {\n return this.video;\n }\n toggleMute() {\n toggleMute(this.video, this.adPlayer, this.debug);\n }\n toggleFullscreen() {\n return toggleFullscreen(this.video, this.debug);\n }\n isMuted() {\n return isMuted(this.video, this.adPlayer);\n }\n setMuted(muted) {\n setMuted(this.video, this.adPlayer, muted, this.debug);\n }\n setVolume(volume) {\n setVolume(this.video, this.adPlayer, volume, this.debug);\n }\n getVolume() {\n return getVolume(this.video, this.adPlayer);\n }\n isFullscreen() {\n return isFullscreen();\n }\n resize() {\n resizePlayer(this.video, this.adPlayer, this.debug);\n }\n // ───────────────────────────────────────────────────────────────\n // Destroy\n // ───────────────────────────────────────────────────────────────\n destroy() {\n this.adBreak.stopContinuousFetching();\n this.timing.destroy();\n this.adBreak.clearPendingAdBreak();\n this.placeholder.destroy();\n if (this.timeUpdateHandler) {\n this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n delete this.timeUpdateHandler;\n }\n if (this.endedHandler) {\n this.video.removeEventListener(\"ended\", this.endedHandler);\n delete this.endedHandler;\n }\n if (this.emptiedHandler) {\n this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n delete this.emptiedHandler;\n }\n this.adConfig.destroyTracking();\n this.hlsEngine.destroy();\n this.adPlayer?.destroy();\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.palNonce.reset();\n this.adBreak.adRequestQueue = [];\n this.timing.consecutiveFailures = 0;\n }\n};\n\n// src/ui/StormcloudVideoPlayer.tsx\nvar import_fa = require(\"react-icons/fa\");\nvar import_jsx_runtime = require(\"react/jsx-runtime\");\nvar ExpandIcon = ({ size = 18 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"svg\",\n {\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M9 4H4v5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M20 9V4h-5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M15 20h5v-5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M4 15v5h5\" })\n ]\n }\n);\nvar CompressIcon = ({ size = 18 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"svg\",\n {\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M4 9h5V4\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M15 4v5h5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M20 15h-5v5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M9 20v-5H4\" })\n ]\n }\n);\nvar CRITICAL_PROPS = [\n \"src\",\n \"allowNativeHls\",\n \"isLiveStream\",\n \"licenseKey\",\n \"isVmap\",\n \"vmapUrl\",\n \"lowLatencyMode\",\n \"driftToleranceMs\",\n \"vastMode\",\n \"ctvAdRequest\"\n];\nvar CONTROLS_HIDE_DELAY = 3e3;\nvar DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;\nvar StormcloudVideoPlayerComponent = import_react.default.memo(\n (props) => {\n const {\n src,\n autoplay,\n muted,\n lowLatencyMode,\n allowNativeHls,\n isLiveStream,\n driftToleranceMs,\n immediateManifestAds,\n debugAdTiming,\n showCustomControls,\n hideLoadingIndicator,\n onVolumeToggle,\n onFullscreenToggle,\n onControlClick,\n onReady,\n wrapperClassName,\n wrapperStyle,\n className,\n style,\n controls,\n playsInline,\n preload,\n poster,\n children,\n licenseKey,\n vastMode,\n vastTagUrl,\n isVmap,\n vmapUrl,\n minSegmentsBeforePlay,\n ctvAdRequest,\n programTitle,\n ...restVideoAttrs\n } = props;\n const videoRef = (0, import_react.useRef)(null);\n const playerRef = (0, import_react.useRef)(null);\n const bufferingTimeoutRef = (0, import_react.useRef)(null);\n const controlsTimerRef = (0, import_react.useRef)(null);\n const wrapperRef = (0, import_react.useRef)(null);\n const [adStatus, setAdStatus] = import_react.default.useState({ showAds: false, currentIndex: 0, totalAds: 0, remainingSeconds: 0 });\n const [shouldShowNativeControls, setShouldShowNativeControls] = import_react.default.useState(true);\n const [isMuted2, setIsMuted] = import_react.default.useState(false);\n const [isFullscreen2, setIsFullscreen] = import_react.default.useState(false);\n const [isPlaying, setIsPlaying] = import_react.default.useState(false);\n const [currentTime, setCurrentTime] = import_react.default.useState(0);\n const [duration, setDuration] = import_react.default.useState(0);\n const [volume, setVolume2] = import_react.default.useState(1);\n const [playbackRate, setPlaybackRate] = import_react.default.useState(1);\n const [showVolumeSlider, setShowVolumeSlider] = import_react.default.useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = import_react.default.useState(false);\n const [isLoading, setIsLoading] = import_react.default.useState(true);\n const [isBuffering, setIsBuffering] = import_react.default.useState(false);\n const [showCenterPlay, setShowCenterPlay] = import_react.default.useState(false);\n const [showLicenseWarning, setShowLicenseWarning] = import_react.default.useState(false);\n const [controlsVisible, setControlsVisible] = import_react.default.useState(true);\n const [viewportWidth, setViewportWidth] = import_react.default.useState(\n typeof window !== \"undefined\" ? window.innerWidth : 1920\n );\n const [isPortrait, setIsPortrait] = import_react.default.useState(\n typeof window !== \"undefined\" ? window.innerHeight > window.innerWidth : false\n );\n const [playerAspectRatio, setPlayerAspectRatio] = import_react.default.useState(\n DEFAULT_PLAYER_ASPECT_RATIO\n );\n const getResponsiveScale = () => {\n if (viewportWidth < 480) return 0.7;\n if (viewportWidth < 768) return 0.8;\n if (viewportWidth < 1024) return 0.9;\n return 1;\n };\n const responsiveScale = getResponsiveScale();\n const resetControlsTimer = (0, import_react.useCallback)(() => {\n if (controlsTimerRef.current) {\n clearTimeout(controlsTimerRef.current);\n }\n setControlsVisible(true);\n controlsTimerRef.current = window.setTimeout(() => {\n if (!showVolumeSlider && !showSpeedMenu) {\n setControlsVisible(false);\n }\n }, CONTROLS_HIDE_DELAY);\n }, [showVolumeSlider, showSpeedMenu]);\n const handleWrapperMouseMove = (0, import_react.useCallback)(() => {\n resetControlsTimer();\n }, [resetControlsTimer]);\n const handleWrapperMouseLeave = (0, import_react.useCallback)(() => {\n if (!showVolumeSlider && !showSpeedMenu) {\n setControlsVisible(false);\n }\n }, [showVolumeSlider, showSpeedMenu]);\n const formatTime = (seconds) => {\n if (!isFinite(seconds)) return \"0:00:00\";\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor(seconds % 3600 / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return `${hours}:${minutes.toString().padStart(2, \"0\")}:${remainingSeconds.toString().padStart(2, \"0\")}`;\n };\n const handlePlayPause = () => {\n if (videoRef.current) {\n if (videoRef.current.paused) {\n const hasValidSource = videoRef.current.src || videoRef.current.currentSrc && videoRef.current.currentSrc !== \"\" || videoRef.current.readyState >= 1;\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n } else {\n videoRef.current.pause();\n setShowCenterPlay(true);\n }\n }\n resetControlsTimer();\n };\n const handleCenterPlayClick = () => {\n if (videoRef.current && videoRef.current.paused) {\n const hasValidSource = videoRef.current.src || videoRef.current.currentSrc && videoRef.current.currentSrc !== \"\" || videoRef.current.readyState >= 1;\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n }\n };\n const handleTimelineSeek = (e) => {\n if (videoRef.current && duration > 0 && isFinite(duration)) {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const progress = Math.max(0, Math.min(1, clickX / rect.width));\n const newTime = progress * duration;\n if (isFinite(newTime) && newTime >= 0 && newTime <= duration) {\n videoRef.current.currentTime = newTime;\n }\n }\n resetControlsTimer();\n };\n const handleVolumeChange = (newVolume) => {\n if (playerRef.current && isFinite(newVolume)) {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n playerRef.current.setVolume(clampedVolume);\n }\n };\n const handlePlaybackRateChange = (rate) => {\n if (videoRef.current && isFinite(rate) && rate > 0) {\n videoRef.current.playbackRate = rate;\n }\n setShowSpeedMenu(false);\n };\n const isHlsStream = src?.toLowerCase().includes(\".m3u8\") || src?.toLowerCase().includes(\"/hls/\");\n const isLiveUiMode = isLiveStream === true;\n const shouldShowEnhancedControls = showCustomControls && (isHlsStream ? !isLiveUiMode : true);\n const criticalPropsKey = (0, import_react.useMemo)(() => {\n return CRITICAL_PROPS.map((prop) => `${prop}:${props[prop]}`).join(\"|\");\n }, [\n src,\n allowNativeHls,\n isLiveStream,\n licenseKey,\n isVmap,\n vmapUrl,\n lowLatencyMode,\n driftToleranceMs,\n vastMode\n ]);\n (0, import_react.useEffect)(() => {\n if (typeof window === \"undefined\") return;\n const el = videoRef.current;\n if (!el || !src) return;\n if (!licenseKey) {\n setShowLicenseWarning(true);\n setIsLoading(false);\n console.warn(\n \"StormcloudVideoPlayer: License key is required but not provided. Please set the licenseKey prop to use the player.\"\n );\n return;\n }\n setShowLicenseWarning(false);\n if (debugAdTiming) {\n console.log(\"[StormcloudUI] Initializing player, isLoading=true\");\n }\n if (playerRef.current) {\n try {\n playerRef.current.destroy();\n } catch {\n }\n playerRef.current = null;\n }\n const cfg = {\n src,\n videoElement: el\n };\n if (autoplay !== void 0) cfg.autoplay = autoplay;\n if (muted !== void 0) cfg.muted = muted;\n if (lowLatencyMode !== void 0) cfg.lowLatencyMode = lowLatencyMode;\n if (allowNativeHls !== void 0) cfg.allowNativeHls = allowNativeHls;\n if (isLiveStream !== void 0) cfg.isLiveStream = isLiveStream;\n if (driftToleranceMs !== void 0)\n cfg.driftToleranceMs = driftToleranceMs;\n if (immediateManifestAds !== void 0)\n cfg.immediateManifestAds = immediateManifestAds;\n if (debugAdTiming !== void 0) cfg.debugAdTiming = debugAdTiming;\n if (showCustomControls !== void 0)\n cfg.showCustomControls = showCustomControls;\n if (onVolumeToggle !== void 0) cfg.onVolumeToggle = onVolumeToggle;\n if (onFullscreenToggle !== void 0)\n cfg.onFullscreenToggle = onFullscreenToggle;\n if (onControlClick !== void 0) cfg.onControlClick = onControlClick;\n if (licenseKey !== void 0) cfg.licenseKey = licenseKey;\n if (vastMode !== void 0) cfg.vastMode = vastMode;\n if (vastTagUrl !== void 0) cfg.vastTagUrl = vastTagUrl;\n if (isVmap !== void 0) cfg.isVmap = isVmap;\n if (vmapUrl !== void 0) cfg.vmapUrl = vmapUrl;\n if (minSegmentsBeforePlay !== void 0)\n cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;\n if (ctvAdRequest !== void 0) cfg.ctvAdRequest = ctvAdRequest;\n if (programTitle !== void 0) cfg.programTitle = programTitle;\n const player = new StormcloudVideoPlayer(cfg);\n playerRef.current = player;\n player.load().then(() => {\n const showNative = player.shouldShowNativeControls();\n setShouldShowNativeControls(showNative);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Player loaded successfully, waiting for video ready\"\n );\n }\n onReady?.(player);\n }).catch((error) => {\n console.error(\n \"StormcloudVideoPlayer: Failed to load player:\",\n error\n );\n setIsLoading(false);\n onReady?.(player);\n });\n return () => {\n try {\n player.destroy();\n } catch {\n }\n playerRef.current = null;\n };\n }, [criticalPropsKey]);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current) return;\n try {\n if (autoplay !== void 0 && playerRef.current.videoElement) {\n playerRef.current.videoElement.autoplay = autoplay;\n }\n if (muted !== void 0 && !playerRef.current.isShowingAds()) {\n playerRef.current.setMuted(muted);\n }\n } catch (error) {\n console.warn(\"Failed to update player properties:\", error);\n }\n }, [autoplay, muted]);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current) return;\n const checkAdStatus = () => {\n if (playerRef.current) {\n const showAdsFromMethod = playerRef.current.isShowingAds();\n const showAdsFromAttribute = videoRef.current?.dataset?.stormcloudAdPlaying === \"true\";\n const showAds = showAdsFromMethod || showAdsFromAttribute;\n const currentIndex = playerRef.current.getCurrentAdIndex();\n const totalAds = playerRef.current.getTotalAdsInBreak();\n const remainingMs = playerRef.current.getAdRemainingMs();\n const remainingSeconds = showAds ? Math.max(0, Math.ceil(remainingMs / 1e3)) : 0;\n setAdStatus((prev) => {\n if (prev.showAds !== showAds || prev.currentIndex !== currentIndex || prev.totalAds !== totalAds || prev.remainingSeconds !== remainingSeconds) {\n if (showAds && !prev.showAds) {\n setShowCenterPlay(false);\n }\n return { showAds, currentIndex, totalAds, remainingSeconds };\n }\n return prev;\n });\n }\n };\n const interval = setInterval(checkAdStatus, 50);\n return () => clearInterval(interval);\n }, []);\n (0, import_react.useEffect)(() => {\n if (typeof window === \"undefined\" || !playerRef.current) return;\n const handleResize = () => {\n if (playerRef.current && videoRef.current) {\n if (typeof playerRef.current.resize === \"function\") {\n playerRef.current.resize();\n }\n }\n setViewportWidth(window.innerWidth);\n setIsPortrait(window.innerHeight > window.innerWidth);\n };\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current || !videoRef.current) return;\n const updateStates = () => {\n if (playerRef.current && videoRef.current) {\n setIsMuted(playerRef.current.isMuted());\n setIsPlaying(!videoRef.current.paused);\n const currentTimeValue = videoRef.current.currentTime;\n setCurrentTime(isFinite(currentTimeValue) ? currentTimeValue : 0);\n const durationValue = videoRef.current.duration;\n setDuration(isFinite(durationValue) ? durationValue : 0);\n const volumeValue = playerRef.current.getVolume();\n setVolume2(\n isFinite(volumeValue) ? Math.max(0, Math.min(1, volumeValue)) : 1\n );\n const rateValue = videoRef.current.playbackRate;\n setPlaybackRate(\n isFinite(rateValue) && rateValue > 0 ? rateValue : 1\n );\n }\n setIsFullscreen(\n document.fullscreenElement === wrapperRef.current\n );\n };\n const interval = setInterval(updateStates, 200);\n const handleFullscreenChange = () => {\n setIsFullscreen(\n document.fullscreenElement === wrapperRef.current\n );\n };\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () => {\n clearInterval(interval);\n document.removeEventListener(\n \"fullscreenchange\",\n handleFullscreenChange\n );\n };\n }, []);\n (0, import_react.useEffect)(() => {\n if (!videoRef.current) return;\n const handleLoadedMetadata = () => {\n const video2 = videoRef.current;\n if (video2) {\n if (video2.videoWidth > 0 && video2.videoHeight > 0) {\n setPlayerAspectRatio(video2.videoWidth / video2.videoHeight);\n }\n void video2.offsetHeight;\n }\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadedmetadata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleLoadedData = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadeddata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleLoadStart = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadstart, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleCanPlay = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplay, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n const handleCanPlayThrough = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplaythrough, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n const handleWaiting = () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n }\n bufferingTimeoutRef.current = window.setTimeout(() => {\n setIsBuffering(true);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video buffering detected (after 300ms delay), readyState:\",\n videoRef.current?.readyState,\n \"- showing spinner, isBuffering=true\"\n );\n }\n }, 300);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: waiting, readyState:\",\n videoRef.current?.readyState,\n \"- buffering delay started (300ms)\"\n );\n }\n };\n const handlePlaying = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n setShowCenterPlay(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: playing, readyState:\",\n videoRef.current?.readyState,\n \"- playback started, isLoading=false, isBuffering=false\"\n );\n }\n };\n const handlePause = () => {\n const isAdActive = playerRef.current?.isShowingAds() || videoRef.current?.dataset?.stormcloudAdPlaying === \"true\";\n if (playerRef.current && !isAdActive) {\n setShowCenterPlay(true);\n } else {\n setShowCenterPlay(false);\n }\n };\n const handleEnded = () => {\n setShowCenterPlay(true);\n };\n const video = videoRef.current;\n video.addEventListener(\"loadstart\", handleLoadStart);\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n if (video.paused) {\n setShowCenterPlay(true);\n }\n return () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n video.removeEventListener(\"loadstart\", handleLoadStart);\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n };\n }, [debugAdTiming]);\n (0, import_react.useEffect)(() => {\n setPlayerAspectRatio(DEFAULT_PLAYER_ASPECT_RATIO);\n }, [src]);\n (0, import_react.useEffect)(() => {\n return () => {\n if (controlsTimerRef.current) {\n clearTimeout(controlsTimerRef.current);\n }\n };\n }, []);\n const progressPercent = duration > 0 ? currentTime / duration * 100 : 0;\n const VolumeIcon = isMuted2 || volume === 0 ? import_fa.FaVolumeMute : volume < 0.5 ? import_fa.FaVolumeDown : import_fa.FaVolumeUp;\n return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"style\", { children: `\n @keyframes sc-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes sc-loading-glow {\n 0%, 100% { opacity: 0.85; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n }\n @keyframes sc-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n }\n @keyframes sc-fade-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .sc-wrapper:fullscreen,\n .sc-wrapper:has(*:fullscreen) {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n .sc-ctrl-btn {\n background: none;\n border: none;\n color: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n padding: 8px;\n transition: background 0.15s ease, opacity 0.15s ease;\n opacity: 0.9;\n }\n .sc-ctrl-btn:hover {\n opacity: 1;\n background: rgba(255, 255, 255, 0.1);\n }\n .sc-ctrl-btn:active {\n opacity: 0.7;\n }\n .sc-controls-bar {\n transition: opacity 0.35s ease, transform 0.35s ease;\n }\n .sc-progress-track:hover .sc-progress-thumb {\n transform: translate(-50%, -50%) scale(1) !important;\n }\n .sc-loading-hidden .sc-loading-indicator {\n display: none !important;\n }\n ` }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n ref: wrapperRef,\n className: `sc-wrapper ${wrapperClassName || \"\"}`,\n onMouseMove: handleWrapperMouseMove,\n onMouseLeave: handleWrapperMouseLeave,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: isFullscreen2 ? \"fixed\" : \"relative\",\n top: isFullscreen2 ? 0 : void 0,\n left: isFullscreen2 ? 0 : void 0,\n overflow: \"hidden\",\n width: isFullscreen2 ? \"100vw\" : \"100%\",\n height: isFullscreen2 ? \"100vh\" : \"auto\",\n minHeight: isFullscreen2 ? \"100vh\" : \"auto\",\n aspectRatio: isFullscreen2 ? void 0 : playerAspectRatio,\n maxWidth: isFullscreen2 ? \"100vw\" : \"100%\",\n maxHeight: isFullscreen2 ? \"100vh\" : \"none\",\n zIndex: isFullscreen2 ? 999999 : void 0,\n backgroundColor: \"#000\",\n borderRadius: isFullscreen2 ? 0 : void 0,\n boxShadow: isFullscreen2 ? \"none\" : void 0,\n ...wrapperStyle\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"video\",\n {\n ref: videoRef,\n className,\n style: {\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n maxWidth: \"100%\",\n maxHeight: isFullscreen2 ? \"100%\" : \"none\",\n objectFit: isFullscreen2 ? \"cover\" : \"contain\",\n backgroundColor: \"#000\",\n aspectRatio: isFullscreen2 ? \"unset\" : void 0,\n ...style\n },\n controls: shouldShowNativeControls && controls && !showCustomControls,\n playsInline,\n preload,\n poster,\n ...restVideoAttrs,\n children\n }\n ),\n (isLoading || isBuffering) && !hideLoadingIndicator && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: \"sc-loading-indicator\",\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 20,\n width: `${Math.max(34, 38 * responsiveScale)}px`,\n height: `${Math.max(34, 38 * responsiveScale)}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n animation: \"sc-loading-glow 1.4s ease-in-out infinite\",\n filter: \"drop-shadow(0 6px 14px rgba(0, 0, 0, 0.55))\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n border: \"3px solid rgba(255, 255, 255, 0.25)\",\n borderTopColor: \"#ff0000\",\n borderRightColor: \"rgba(255, 255, 255, 0.85)\",\n animation: \"sc-spin 0.8s linear infinite\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n width: \"7px\",\n height: \"7px\",\n borderRadius: \"50%\",\n background: \"#ff0000\",\n boxShadow: \"0 0 10px rgba(255, 0, 0, 0.65)\"\n }\n }\n )\n ]\n }\n ),\n showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 25,\n background: \"rgba(220, 38, 38, 0.92)\",\n backdropFilter: \"blur(24px)\",\n color: \"white\",\n padding: \"28px 36px\",\n borderRadius: \"14px\",\n border: \"1px solid rgba(255, 255, 255, 0.15)\",\n boxShadow: \"0 24px 64px rgba(0, 0, 0, 0.5)\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n margin: \"0 16px\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"div\", { style: { fontSize: \"18px\", fontWeight: \"700\", marginBottom: \"10px\", letterSpacing: \"-0.02em\" }, children: \"License Key Required\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\"div\", { style: { fontSize: \"13px\", lineHeight: \"1.6\", color: \"rgba(255, 255, 255, 0.85)\" }, children: [\n \"Please provide a valid license key to use the Stormcloud Video Player.\",\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"br\", {}),\n \"Contact your administrator for licensing information.\"\n ] })\n ]\n }\n ),\n adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: `${12 * responsiveScale}px`,\n left: `${12 * responsiveScale}px`,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n pointerEvents: \"none\",\n animation: \"sc-fade-in 0.3s ease\"\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n background: \"rgba(234, 179, 8, 0.95)\",\n color: \"#111\",\n padding: `${4 * responsiveScale}px ${12 * responsiveScale}px`,\n borderRadius: \"6px\",\n fontSize: `${11 * responsiveScale}px`,\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n boxShadow: \"0 2px 12px rgba(234, 179, 8, 0.35)\"\n },\n children: `Ad ${Math.max(1, adStatus.currentIndex)}`\n }\n )\n }\n ),\n showCenterPlay && !isLoading && !isBuffering && !showLicenseWarning && !adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n onClick: handleCenterPlayClick,\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 15,\n cursor: \"pointer\",\n background: \"rgba(0, 0, 0, 0.55)\",\n backdropFilter: \"blur(8px)\",\n borderRadius: \"50%\",\n width: `${92 * responsiveScale}px`,\n height: `${92 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"background 0.2s ease, transform 0.2s ease\",\n animation: \"sc-fade-in 0.2s ease\"\n },\n onMouseEnter: (e) => {\n e.currentTarget.style.background = \"rgba(0, 0, 0, 0.72)\";\n e.currentTarget.style.transform = \"translate(-50%, -50%) scale(1.06)\";\n },\n onMouseLeave: (e) => {\n e.currentTarget.style.background = \"rgba(0, 0, 0, 0.55)\";\n e.currentTarget.style.transform = \"translate(-50%, -50%) scale(1)\";\n },\n title: \"Play\",\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaPlay,\n {\n size: Math.max(24, 32 * responsiveScale),\n color: \"white\",\n style: { marginLeft: \"4px\" }\n }\n )\n }\n ),\n shouldShowEnhancedControls && !showLicenseWarning ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: \"sc-controls-bar\",\n style: {\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n background: \"linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.35) 60%, transparent 100%)\",\n padding: `${20 * responsiveScale}px ${12 * responsiveScale}px ${8 * responsiveScale}px`,\n zIndex: 10,\n opacity: controlsVisible || adStatus.showAds ? 1 : 0,\n transform: controlsVisible || adStatus.showAds ? \"translateY(0)\" : \"translateY(6px)\",\n pointerEvents: controlsVisible || adStatus.showAds ? \"auto\" : \"none\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: \"sc-progress-track\",\n style: {\n width: \"100%\",\n height: \"3px\",\n background: \"rgba(255, 255, 255, 0.2)\",\n borderRadius: \"1.5px\",\n marginBottom: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n position: \"relative\",\n transition: \"height 0.1s ease\"\n },\n onClick: handleTimelineSeek,\n onMouseEnter: (e) => {\n e.currentTarget.style.height = \"5px\";\n },\n onMouseLeave: (e) => {\n e.currentTarget.style.height = \"3px\";\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n bottom: 0,\n background: adStatus.showAds ? \"#f5c518\" : \"#ff0000\",\n borderRadius: \"1.5px\",\n width: `${progressPercent}%`,\n transition: \"width 0.15s linear\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n className: \"sc-progress-thumb\",\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: `${progressPercent}%`,\n transform: \"translate(-50%, -50%) scale(0)\",\n width: \"13px\",\n height: \"13px\",\n background: adStatus.showAds ? \"#f5c518\" : \"#ff0000\",\n borderRadius: \"50%\",\n boxShadow: \"0 0 4px rgba(0, 0, 0, 0.3)\",\n transition: \"transform 0.1s ease, left 0.15s linear\"\n }\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n color: \"white\",\n gap: `${8 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: `${8 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: handlePlayPause,\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`\n },\n title: isPlaying ? \"Pause\" : \"Play\",\n children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaPause, { size: Math.max(14, 18 * responsiveScale) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaPlay, { size: Math.max(14, 18 * responsiveScale), style: { marginLeft: \"2px\" } })\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n paddingRight: `${6 * responsiveScale}px`\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false),\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n if (playerRef.current) playerRef.current.toggleMute();\n onVolumeToggle?.();\n resetControlsTimer();\n },\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`\n },\n title: isMuted2 ? \"Unmute\" : \"Mute\",\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(VolumeIcon, { size: Math.max(14, 18 * responsiveScale) })\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n width: showVolumeSlider ? `${68 * responsiveScale}px` : \"0px\",\n overflow: \"hidden\",\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n display: \"flex\",\n alignItems: \"center\",\n paddingLeft: showVolumeSlider ? `${3 * responsiveScale}px` : \"0\",\n paddingRight: showVolumeSlider ? `${8 * responsiveScale}px` : \"0\"\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n width: `${56 * responsiveScale}px`,\n height: \"3px\",\n cursor: \"pointer\",\n borderRadius: \"1.5px\"\n },\n onMouseDown: (e) => {\n e.preventDefault();\n const el = e.currentTarget;\n const move = (ev) => {\n const r2 = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (ev.clientX - r2.left) / r2.width)));\n };\n const up = () => {\n document.removeEventListener(\"mousemove\", move);\n document.removeEventListener(\"mouseup\", up);\n };\n document.addEventListener(\"mousemove\", move);\n document.addEventListener(\"mouseup\", up);\n const r = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n },\n onClick: (e) => {\n e.stopPropagation();\n const r = e.currentTarget.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"div\", { style: { position: \"absolute\", inset: 0, background: \"rgba(255, 255, 255, 0.2)\", borderRadius: \"1.5px\" } }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n bottom: 0,\n width: `${(isMuted2 ? 0 : volume) * 100}%`,\n background: \"#fff\",\n borderRadius: \"1.5px\",\n transition: \"width 0.1s ease-out\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: `${(isMuted2 ? 0 : volume) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n width: \"12px\",\n height: \"12px\",\n background: \"#fff\",\n borderRadius: \"50%\",\n boxShadow: \"0 0 3px rgba(0, 0, 0, 0.3)\",\n transition: \"left 0.1s ease-out\"\n }\n }\n )\n ]\n }\n )\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n fontSize: `${13 * responsiveScale}px`,\n fontFamily: \"Roboto, 'Segoe UI', Arial, sans-serif\",\n color: \"rgba(255, 255, 255, 0.9)\",\n display: viewportWidth < 480 ? \"none\" : \"block\",\n fontVariantNumeric: \"tabular-nums\",\n userSelect: \"none\",\n marginLeft: `${4 * responsiveScale}px`\n },\n children: [\n formatTime(currentTime),\n \" \",\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"span\", { style: { color: \"rgba(255,255,255,0.5)\" }, children: \"/\" }),\n \" \",\n formatTime(duration)\n ]\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: `${8 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\"div\", { style: { position: \"relative\", display: viewportWidth < 600 ? \"none\" : \"block\" }, children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n setShowSpeedMenu(!showSpeedMenu);\n resetControlsTimer();\n },\n style: {\n padding: `${6 * responsiveScale}px ${10 * responsiveScale}px`,\n borderRadius: `${6 * responsiveScale}px`,\n fontSize: `${13 * responsiveScale}px`,\n fontFamily: \"'SF Mono', 'Cascadia Code', monospace\",\n fontWeight: \"600\",\n minHeight: `${32 * responsiveScale}px`\n },\n title: \"Playback Speed\",\n children: [\n playbackRate,\n \"x\"\n ]\n }\n ),\n showSpeedMenu && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n right: 0,\n marginBottom: \"8px\",\n background: \"rgba(0, 0, 0, 0.8)\",\n backdropFilter: \"blur(24px)\",\n WebkitBackdropFilter: \"blur(24px)\",\n borderRadius: \"10px\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n overflow: \"hidden\",\n minWidth: \"80px\",\n boxShadow: \"0 12px 40px rgba(0, 0, 0, 0.5)\",\n animation: \"sc-fade-in 0.15s ease\"\n },\n children: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2].map((speed) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"button\",\n {\n onClick: () => handlePlaybackRateChange(speed),\n style: {\n display: \"block\",\n width: \"100%\",\n padding: `${8 * responsiveScale}px ${14 * responsiveScale}px`,\n background: playbackRate === speed ? \"rgba(255, 255, 255, 0.12)\" : \"transparent\",\n border: \"none\",\n color: playbackRate === speed ? \"#fff\" : \"rgba(255, 255, 255, 0.7)\",\n cursor: \"pointer\",\n fontSize: `${12 * responsiveScale}px`,\n fontFamily: \"'SF Mono', monospace\",\n fontWeight: playbackRate === speed ? \"700\" : \"500\",\n textAlign: \"center\",\n transition: \"background 0.15s ease, color 0.15s ease\"\n },\n onMouseEnter: (e) => {\n if (playbackRate !== speed) {\n e.target.style.background = \"rgba(255, 255, 255, 0.08)\";\n e.target.style.color = \"#fff\";\n }\n },\n onMouseLeave: (e) => {\n if (playbackRate !== speed) {\n e.target.style.background = \"transparent\";\n e.target.style.color = \"rgba(255, 255, 255, 0.7)\";\n }\n },\n children: [\n speed,\n \"x\"\n ]\n },\n speed\n ))\n }\n )\n ] }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (wrapperRef.current) {\n if (!document.fullscreenElement) {\n wrapperRef.current.requestFullscreen().catch(() => {\n });\n } else {\n document.exitFullscreen().catch(() => {\n });\n }\n }\n resetControlsTimer();\n },\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`\n },\n title: isFullscreen2 ? \"Exit Fullscreen\" : \"Enter Fullscreen\",\n children: isFullscreen2 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CompressIcon, { size: Math.max(14, 18 * responsiveScale) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ExpandIcon, { size: Math.max(14, 18 * responsiveScale) })\n }\n )\n ]\n }\n )\n ]\n }\n )\n ]\n }\n ) : showCustomControls && !showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: `${10 * responsiveScale}px`,\n left: `${10 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n zIndex: 10,\n opacity: controlsVisible ? 1 : 0,\n transition: \"opacity 0.35s ease\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n background: \"#ff3b30\",\n animation: \"sc-pulse 1.5s ease-in-out infinite\",\n flexShrink: 0\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"span\",\n {\n style: {\n fontSize: `${12 * responsiveScale}px`,\n fontFamily: \"'SF Pro Display', 'Segoe UI', Arial, sans-serif\",\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n color: \"#fff\",\n textShadow: \"0 1px 3px rgba(0,0,0,0.6)\",\n userSelect: \"none\"\n },\n children: \"LIVE\"\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: \"sc-controls-bar\",\n style: {\n position: \"absolute\",\n bottom: `${10 * responsiveScale}px`,\n right: `${10 * responsiveScale}px`,\n display: \"flex\",\n flexDirection: isPortrait ? \"column\" : \"row\",\n alignItems: isPortrait ? \"flex-end\" : \"center\",\n gap: `${8 * responsiveScale}px`,\n zIndex: 10,\n opacity: controlsVisible ? 1 : 0,\n transform: controlsVisible ? \"translateY(0)\" : \"translateY(4px)\",\n pointerEvents: controlsVisible ? \"auto\" : \"none\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n background: \"rgba(0, 0, 0, 0.6)\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: \"2px\",\n paddingRight: `${8 * responsiveScale}px`\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false),\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n if (playerRef.current) playerRef.current.toggleMute();\n onVolumeToggle?.();\n resetControlsTimer();\n },\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`\n },\n title: isMuted2 ? \"Unmute\" : \"Mute\",\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(VolumeIcon, { size: Math.max(14, 18 * responsiveScale) })\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n width: showVolumeSlider ? `${68 * responsiveScale}px` : \"0px\",\n overflow: \"hidden\",\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n display: \"flex\",\n alignItems: \"center\",\n paddingLeft: showVolumeSlider ? `${3 * responsiveScale}px` : \"0\",\n paddingRight: showVolumeSlider ? `${10 * responsiveScale}px` : \"0\"\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n width: `${56 * responsiveScale}px`,\n height: \"3px\",\n cursor: \"pointer\",\n borderRadius: \"1.5px\"\n },\n onMouseDown: (e) => {\n e.preventDefault();\n const el = e.currentTarget;\n const move = (ev) => {\n const r2 = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (ev.clientX - r2.left) / r2.width)));\n };\n const up = () => {\n document.removeEventListener(\"mousemove\", move);\n document.removeEventListener(\"mouseup\", up);\n };\n document.addEventListener(\"mousemove\", move);\n document.addEventListener(\"mouseup\", up);\n const r = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n },\n onClick: (e) => {\n e.stopPropagation();\n const r = e.currentTarget.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"div\", { style: { position: \"absolute\", inset: 0, background: \"rgba(255, 255, 255, 0.2)\", borderRadius: \"1.5px\" } }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n bottom: 0,\n width: `${(isMuted2 ? 0 : volume) * 100}%`,\n background: \"#fff\",\n borderRadius: \"1.5px\",\n transition: \"width 0.1s ease-out\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: `${(isMuted2 ? 0 : volume) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n width: \"12px\",\n height: \"12px\",\n background: \"#fff\",\n borderRadius: \"50%\",\n boxShadow: \"0 0 3px rgba(0, 0, 0, 0.3)\",\n transition: \"left 0.1s ease-out\"\n }\n }\n )\n ]\n }\n )\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (wrapperRef.current) {\n if (!document.fullscreenElement) {\n wrapperRef.current.requestFullscreen().catch(() => {\n });\n } else {\n document.exitFullscreen().catch(() => {\n });\n }\n }\n resetControlsTimer();\n },\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`,\n background: \"rgba(0, 0, 0, 0.6)\"\n },\n title: isFullscreen2 ? \"Exit Fullscreen\" : \"Enter Fullscreen\",\n children: isFullscreen2 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CompressIcon, { size: Math.max(14, 18 * responsiveScale) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ExpandIcon, { size: Math.max(14, 18 * responsiveScale) })\n }\n )\n ]\n }\n )\n ] }),\n onControlClick && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n onClick: onControlClick,\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1,\n cursor: \"pointer\"\n }\n }\n )\n ]\n }\n )\n ] });\n },\n (prevProps, nextProps) => {\n for (const prop of CRITICAL_PROPS) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n const uiProps = [\n \"autoplay\",\n \"muted\",\n \"controls\",\n \"showCustomControls\",\n \"className\",\n \"style\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"playsInline\",\n \"preload\",\n \"poster\",\n \"children\"\n ];\n for (const prop of uiProps) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n const callbackProps = [\n \"onReady\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\"\n ];\n for (const prop of callbackProps) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n return true;\n }\n);\n\n// src/StormcloudPlayer.tsx\nvar import_react6 = __toESM(require(\"react\"), 1);\n\n// src/props.ts\nvar noop = () => {\n};\nvar defaultProps = {\n playing: false,\n loop: false,\n controls: true,\n volume: 1,\n muted: false,\n playbackRate: 1,\n width: \"100%\",\n height: \"auto\",\n style: {},\n progressInterval: 1e3,\n playsInline: false,\n autoplay: false,\n preload: \"metadata\",\n poster: \"\",\n className: \"\",\n wrapperClassName: \"\",\n wrapperStyle: {},\n allowNativeHls: false,\n lowLatencyMode: false,\n driftToleranceMs: 1e3,\n immediateManifestAds: true,\n debugAdTiming: false,\n showCustomControls: false,\n hideLoadingIndicator: false,\n licenseKey: \"\",\n isVmap: false,\n vmapUrl: \"\",\n adFailsafeTimeoutMs: 1e4,\n minSegmentsBeforePlay: 2,\n onStart: noop,\n onPlay: noop,\n onPause: noop,\n onBuffer: noop,\n onBufferEnd: noop,\n onEnded: noop,\n onError: noop,\n onDuration: noop,\n onSeek: noop,\n onProgress: noop,\n onVolumeToggle: noop,\n onFullscreenToggle: noop,\n onControlClick: noop\n};\n\n// src/utils.ts\nvar import_react2 = require(\"react\");\nvar lazy = import_react2.lazy;\nvar omit = (object, keys) => {\n const result = { ...object };\n keys.forEach((key) => {\n delete result[key];\n });\n return result;\n};\nvar isMediaStream = (url) => {\n return typeof window !== \"undefined\" && window.MediaStream && url instanceof window.MediaStream;\n};\nvar supportsWebKitPresentationMode = () => {\n if (typeof window === \"undefined\") return false;\n const video = document.createElement(\"video\");\n return \"webkitSupportsPresentationMode\" in video;\n};\nvar randomString = () => {\n return Math.random().toString(36).substr(2, 9);\n};\nvar parseQuery = (url) => {\n const query = {};\n const queryString = url.split(\"?\")[1] || \"\";\n if (!queryString) return query;\n const manualParse = (qs) => {\n qs.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n try {\n query[decodeURIComponent(key)] = value ? decodeURIComponent(value.replace(/\\+/g, \" \")) : \"\";\n } catch (e) {\n query[key] = value || \"\";\n }\n }\n });\n };\n if (typeof URLSearchParams !== \"undefined\") {\n try {\n const params = new URLSearchParams(queryString);\n params.forEach((value, key) => {\n query[key] = value;\n });\n return query;\n } catch (e) {\n manualParse(queryString);\n }\n } else {\n manualParse(queryString);\n }\n return query;\n};\nvar merge = (target, ...sources) => {\n if (!sources.length) return target;\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n merge(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return merge(target, ...sources);\n};\nvar isObject = (item) => {\n return item && typeof item === \"object\" && !Array.isArray(item);\n};\nvar IS_BROWSER = typeof window !== \"undefined\" && window.document;\nvar IS_GLOBAL = typeof globalThis !== \"undefined\" && globalThis.window && globalThis.window.document;\nvar IS_IOS = IS_BROWSER && /iPad|iPhone|iPod/.test(navigator.userAgent);\nvar IS_SAFARI = IS_BROWSER && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\nvar SUPPORTS_HLS = () => {\n if (!IS_BROWSER) return false;\n const video = document.createElement(\"video\");\n return Boolean(video.canPlayType(\"application/vnd.apple.mpegurl\"));\n};\nvar SUPPORTS_DASH = () => {\n if (!IS_BROWSER) return false;\n const video = document.createElement(\"video\");\n return Boolean(video.canPlayType(\"application/dash+xml\"));\n};\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n hls: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n },\n dash: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return DASH_EXTENSIONS.test(url);\n },\n video: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url);\n },\n audio: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return AUDIO_EXTENSIONS.test(url);\n },\n file: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n }\n};\n\n// src/players/HlsPlayer.tsx\nvar import_react3 = require(\"react\");\nvar HlsPlayer = class extends import_react3.Component {\n constructor() {\n super(...arguments);\n this.player = null;\n this.mounted = false;\n this.load = async () => {\n if (!this.props.videoElement || !this.props.src) return;\n try {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n const config = {\n src: this.props.src,\n videoElement: this.props.videoElement\n };\n if (this.props.autoplay !== void 0)\n config.autoplay = this.props.autoplay;\n if (this.props.muted !== void 0) config.muted = this.props.muted;\n if (this.props.lowLatencyMode !== void 0)\n config.lowLatencyMode = this.props.lowLatencyMode;\n if (this.props.allowNativeHls !== void 0)\n config.allowNativeHls = this.props.allowNativeHls;\n if (this.props.isLiveStream !== void 0)\n config.isLiveStream = this.props.isLiveStream;\n if (this.props.driftToleranceMs !== void 0)\n config.driftToleranceMs = this.props.driftToleranceMs;\n if (this.props.immediateManifestAds !== void 0)\n config.immediateManifestAds = this.props.immediateManifestAds;\n if (this.props.debugAdTiming !== void 0)\n config.debugAdTiming = this.props.debugAdTiming;\n if (this.props.showCustomControls !== void 0)\n config.showCustomControls = this.props.showCustomControls;\n if (this.props.onVolumeToggle !== void 0)\n config.onVolumeToggle = this.props.onVolumeToggle;\n if (this.props.onFullscreenToggle !== void 0)\n config.onFullscreenToggle = this.props.onFullscreenToggle;\n if (this.props.onControlClick !== void 0)\n config.onControlClick = this.props.onControlClick;\n if (this.props.licenseKey !== void 0)\n config.licenseKey = this.props.licenseKey;\n if (this.props.adFailsafeTimeoutMs !== void 0)\n config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n if (this.props.minSegmentsBeforePlay !== void 0)\n config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n if (this.props.ctvAdRequest !== void 0)\n config.ctvAdRequest = this.props.ctvAdRequest;\n this.player = new StormcloudVideoPlayer(config);\n this.props.onMount?.(this);\n await this.player.load();\n if (this.mounted) {\n this.props.onReady?.();\n }\n } catch (error) {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n }\n };\n this.play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[HlsPlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n this.props.onPlay?.();\n } else {\n console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n }\n }\n };\n this.pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n this.props.onPause?.();\n }\n };\n this.stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n this.seekTo = (seconds, keepPlaying) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n this.setVolume = (volume) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n this.mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n this.unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n this.setPlaybackRate = (rate) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n this.getDuration = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n this.getCurrentTime = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n this.getSecondsLoaded = () => {\n if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (key === \"player\") return this.player;\n if (key === \"video\") return this.props.videoElement;\n if (key === \"hls\" && this.player) return this.player.hls;\n return null;\n };\n }\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n componentWillUnmount() {\n this.mounted = false;\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n }\n componentDidUpdate(prevProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n render() {\n return null;\n }\n};\nHlsPlayer.displayName = \"HlsPlayer\";\nHlsPlayer.canPlay = canPlay.hls;\n\n// src/players/FilePlayer.tsx\nvar import_react4 = require(\"react\");\nvar FilePlayer = class extends import_react4.Component {\n constructor() {\n super(...arguments);\n this.mounted = false;\n this.ready = false;\n this.load = () => {\n if (!this.props.videoElement || !this.props.src) return;\n const video = this.props.videoElement;\n const handleLoadedMetadata = () => {\n if (this.mounted && !this.ready) {\n this.ready = true;\n this.props.onReady?.();\n }\n };\n const handlePlay = () => {\n if (this.mounted) {\n this.props.onPlay?.();\n }\n };\n const handlePause = () => {\n if (this.mounted) {\n this.props.onPause?.();\n }\n };\n const handleEnded = () => {\n if (this.mounted) {\n this.props.onEnded?.();\n }\n };\n const handleError = (error) => {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n };\n const handleLoadedData = () => {\n if (this.mounted) {\n this.props.onLoaded?.();\n }\n };\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.src = this.props.src;\n if (this.props.autoplay !== void 0) video.autoplay = this.props.autoplay;\n if (this.props.muted !== void 0) video.muted = this.props.muted;\n if (this.props.loop !== void 0) video.loop = this.props.loop;\n if (this.props.controls !== void 0) video.controls = this.props.controls;\n if (this.props.playsInline !== void 0)\n video.playsInline = this.props.playsInline;\n if (this.props.preload !== void 0)\n video.preload = this.props.preload;\n if (this.props.poster !== void 0) video.poster = this.props.poster;\n this.props.onMount?.(this);\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n };\n };\n this.play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[FilePlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n } else {\n console.warn(\"[FilePlayer] Cannot play: video has no valid source\");\n }\n }\n };\n this.pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n }\n };\n this.stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n this.seekTo = (seconds, keepPlaying) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n this.setVolume = (volume) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n this.mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n this.unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n this.setPlaybackRate = (rate) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n this.setLoop = (loop) => {\n if (this.props.videoElement) {\n this.props.videoElement.loop = loop;\n }\n };\n this.getDuration = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n this.getCurrentTime = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n this.getSecondsLoaded = () => {\n if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (key === \"video\") return this.props.videoElement;\n return null;\n };\n this.enablePIP = async () => {\n if (this.props.videoElement && \"requestPictureInPicture\" in this.props.videoElement) {\n try {\n await this.props.videoElement.requestPictureInPicture();\n } catch (error) {\n console.warn(\"Picture-in-Picture failed:\", error);\n }\n }\n };\n this.disablePIP = async () => {\n if (document.pictureInPictureElement) {\n try {\n await document.exitPictureInPicture();\n } catch (error) {\n console.warn(\"Exit Picture-in-Picture failed:\", error);\n }\n }\n };\n }\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n componentWillUnmount() {\n this.mounted = false;\n }\n componentDidUpdate(prevProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n render() {\n return null;\n }\n};\nFilePlayer.displayName = \"FilePlayer\";\nFilePlayer.canPlay = canPlay.file;\n\n// src/players/index.ts\nvar players = [\n {\n key: \"hls\",\n name: \"HLS Player\",\n canPlay: canPlay.hls,\n lazyPlayer: lazy(() => Promise.resolve({ default: HlsPlayer }))\n },\n {\n key: \"file\",\n name: \"File Player\",\n canPlay: canPlay.file,\n canEnablePIP: (url) => {\n return canPlay.file(url) && (document.pictureInPictureEnabled || typeof document.webkitSupportsPresentationMode === \"function\");\n },\n lazyPlayer: lazy(() => Promise.resolve({ default: FilePlayer }))\n }\n];\nvar players_default = players;\n\n// src/Player.tsx\nvar import_react5 = __toESM(require(\"react\"), 1);\nvar SEEK_ON_PLAY_EXPIRY = 5e3;\nvar Player = class extends import_react5.Component {\n constructor() {\n super(...arguments);\n this.mounted = false;\n this.isReady = false;\n this.isPlaying = false;\n this.isLoading = true;\n this.loadOnReady = null;\n this.startOnPlay = true;\n this.seekOnPlay = null;\n this.onDurationCalled = false;\n this.handlePlayerMount = (player) => {\n if (this.player) {\n this.progress();\n return;\n }\n this.player = player;\n this.player.load(this.props.src);\n this.progress();\n };\n this.getInternalPlayer = (key) => {\n if (!this.player) return null;\n return this.player.getInternalPlayer(key);\n };\n this.progress = () => {\n if (this.props.src && this.player && this.isReady) {\n const playedSeconds = this.getCurrentTime() || 0;\n const loadedSeconds = this.getSecondsLoaded();\n const duration = this.getDuration();\n if (duration) {\n const progress = {\n playedSeconds,\n played: playedSeconds / duration,\n loaded: 0,\n loadedSeconds: 0\n };\n if (loadedSeconds !== null) {\n progress.loadedSeconds = loadedSeconds;\n progress.loaded = loadedSeconds / duration;\n }\n if (progress.playedSeconds !== this.prevPlayed || progress.loadedSeconds !== this.prevLoaded) {\n this.props.onProgress?.(progress);\n }\n this.prevPlayed = progress.playedSeconds;\n this.prevLoaded = progress.loadedSeconds;\n }\n }\n this.progressTimeout = window.setTimeout(\n this.progress,\n this.props.progressInterval || 1e3\n );\n };\n this.handleReady = () => {\n if (!this.mounted) return;\n this.isReady = true;\n this.isLoading = false;\n const { onReady, playing, volume, muted } = this.props;\n onReady();\n if (!muted && volume !== null) {\n this.player.setVolume(volume);\n }\n if (this.loadOnReady) {\n this.player.load(this.loadOnReady, true);\n this.loadOnReady = null;\n } else if (playing) {\n this.player.play();\n }\n this.handleDurationCheck();\n };\n this.handlePlay = () => {\n this.isPlaying = true;\n this.isLoading = false;\n const { onStart, onPlay, playbackRate } = this.props;\n if (this.startOnPlay) {\n if (this.player.setPlaybackRate && playbackRate !== 1) {\n this.player.setPlaybackRate(playbackRate);\n }\n onStart?.();\n this.startOnPlay = false;\n }\n onPlay?.();\n if (this.seekOnPlay) {\n this.seekTo(this.seekOnPlay);\n this.seekOnPlay = null;\n }\n this.handleDurationCheck();\n };\n this.handlePause = (e) => {\n this.isPlaying = false;\n if (!this.isLoading) {\n this.props.onPause?.(e);\n }\n };\n this.handleEnded = () => {\n const { activePlayer, loop, onEnded } = this.props;\n if (activePlayer.loopOnEnded && loop) {\n this.seekTo(0);\n }\n if (!loop) {\n this.isPlaying = false;\n onEnded?.();\n }\n };\n this.handleError = (...args) => {\n this.isLoading = false;\n this.props.onError?.(args[0], args[1], args[2], args[3]);\n };\n this.handleDurationCheck = () => {\n clearTimeout(this.durationCheckTimeout);\n const duration = this.getDuration();\n if (duration) {\n if (!this.onDurationCalled) {\n this.props.onDuration?.(duration);\n this.onDurationCalled = true;\n }\n } else {\n this.durationCheckTimeout = window.setTimeout(\n this.handleDurationCheck,\n 100\n );\n }\n };\n this.handleLoaded = () => {\n this.isLoading = false;\n };\n }\n componentDidMount() {\n this.mounted = true;\n }\n componentWillUnmount() {\n clearTimeout(this.progressTimeout);\n clearTimeout(this.durationCheckTimeout);\n this.mounted = false;\n }\n componentDidUpdate(prevProps) {\n if (!this.player) return;\n const { src, playing, volume, muted, playbackRate, loop, activePlayer } = this.props;\n if (prevProps.src !== src) {\n if (this.isLoading && !activePlayer.forceLoad && !isMediaStream(src)) {\n console.warn(\n `StormcloudPlayer: the attempt to load ${src} is being deferred until the player has loaded`\n );\n this.loadOnReady = src || null;\n return;\n }\n this.isLoading = true;\n this.startOnPlay = true;\n this.onDurationCalled = false;\n this.player.load(src, this.isReady);\n }\n if (!prevProps.playing && playing && !this.isPlaying) {\n this.player.play();\n }\n if (prevProps.playing && !playing && this.isPlaying) {\n this.player.pause();\n }\n if (prevProps.volume !== volume && volume !== null) {\n this.player.setVolume(volume);\n }\n if (prevProps.muted !== muted) {\n if (muted) {\n this.player.mute();\n } else {\n this.player.unmute();\n if (volume !== null) {\n setTimeout(() => this.player.setVolume(volume));\n }\n }\n }\n if (prevProps.playbackRate !== playbackRate && this.player.setPlaybackRate) {\n this.player.setPlaybackRate(playbackRate);\n }\n if (prevProps.loop !== loop && this.player.setLoop) {\n this.player.setLoop(loop);\n }\n }\n getDuration() {\n if (!this.isReady) return null;\n return this.player.getDuration();\n }\n getCurrentTime() {\n if (!this.isReady) return null;\n return this.player.getCurrentTime();\n }\n getSecondsLoaded() {\n if (!this.isReady) return null;\n return this.player.getSecondsLoaded();\n }\n seekTo(amount, type, keepPlaying) {\n if (!this.isReady) {\n if (amount !== 0) {\n this.seekOnPlay = amount;\n setTimeout(() => {\n this.seekOnPlay = null;\n }, SEEK_ON_PLAY_EXPIRY);\n }\n return;\n }\n const isFraction = !type ? amount > 0 && amount < 1 : type === \"fraction\";\n if (isFraction) {\n const duration = this.player.getDuration();\n if (!duration) {\n console.warn(\n \"StormcloudPlayer: could not seek using fraction \\u2013 duration not yet available\"\n );\n return;\n }\n this.player.seekTo(duration * amount, keepPlaying);\n return;\n }\n this.player.seekTo(amount, keepPlaying);\n }\n render() {\n const Player2 = this.props.activePlayer;\n if (!Player2) {\n return null;\n }\n return import_react5.default.createElement(Player2, {\n ...this.props,\n onMount: this.handlePlayerMount,\n onReady: this.handleReady,\n onPlay: this.handlePlay,\n onPause: this.handlePause,\n onEnded: this.handleEnded,\n onLoaded: this.handleLoaded,\n onError: this.handleError\n });\n }\n};\nPlayer.displayName = \"Player\";\nPlayer.defaultProps = defaultProps;\n\n// src/StormcloudPlayer.tsx\nvar IS_BROWSER2 = typeof window !== \"undefined\" && window.document;\nvar IS_GLOBAL2 = typeof globalThis !== \"undefined\" && globalThis.window && globalThis.window.document;\nvar UniversalSuspense = IS_BROWSER2 || IS_GLOBAL2 ? import_react6.Suspense : () => null;\nvar SUPPORTED_PROPS = [\n \"src\",\n \"playing\",\n \"loop\",\n \"controls\",\n \"volume\",\n \"muted\",\n \"playbackRate\",\n \"width\",\n \"height\",\n \"style\",\n \"progressInterval\",\n \"playsInline\",\n \"autoplay\",\n \"preload\",\n \"poster\",\n \"className\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"allowNativeHls\",\n \"lowLatencyMode\",\n \"isLiveStream\",\n \"driftToleranceMs\",\n \"immediateManifestAds\",\n \"debugAdTiming\",\n \"showCustomControls\",\n \"licenseKey\",\n \"isVmap\",\n \"vmapUrl\",\n \"adFailsafeTimeoutMs\",\n \"minSegmentsBeforePlay\",\n \"ctvAdRequest\",\n \"onReady\",\n \"onStart\",\n \"onPlay\",\n \"onPause\",\n \"onBuffer\",\n \"onBufferEnd\",\n \"onEnded\",\n \"onError\",\n \"onDuration\",\n \"onSeek\",\n \"onProgress\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\"\n];\nvar customPlayers = [];\nvar createStormcloudPlayer = (playerList, fallback) => {\n var _a;\n return _a = class extends import_react6.Component {\n constructor() {\n super(...arguments);\n this.state = {\n showPreview: false\n };\n this.references = {\n wrapper: (wrapper) => {\n this.wrapper = wrapper;\n },\n player: (player) => {\n this.player = player;\n }\n };\n this.getActivePlayer = (src) => {\n if (!src) return null;\n for (const player of [...customPlayers, ...playerList]) {\n if (player.canPlay(src)) {\n return player;\n }\n }\n if (fallback) {\n return fallback;\n }\n return null;\n };\n this.getAttributes = (src) => {\n return omit(this.props, SUPPORTED_PROPS);\n };\n this.handleReady = () => {\n this.props.onReady?.(this);\n };\n this.seekTo = (fraction, type, keepPlaying) => {\n if (!this.player) return null;\n this.player.seekTo(fraction, type, keepPlaying);\n };\n this.getCurrentTime = () => {\n if (!this.player) return null;\n return this.player.getCurrentTime();\n };\n this.getSecondsLoaded = () => {\n if (!this.player) return null;\n return this.player.getSecondsLoaded();\n };\n this.getDuration = () => {\n if (!this.player) return null;\n return this.player.getDuration();\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (!this.player) return null;\n return this.player.getInternalPlayer(key);\n };\n this.renderActivePlayer = (src) => {\n if (!src) return null;\n const activePlayer = this.getActivePlayer(src);\n if (!activePlayer) return null;\n return import_react6.default.createElement(Player, {\n ...this.props,\n key: activePlayer.key,\n ref: this.references.player,\n activePlayer: activePlayer.lazyPlayer || activePlayer,\n onReady: this.handleReady\n });\n };\n }\n render() {\n const {\n src,\n style,\n width,\n height,\n fallback: fallbackElement,\n wrapper: Wrapper\n } = this.props;\n const attributes = this.getAttributes(src);\n const wrapperRef = typeof Wrapper === \"string\" ? this.references.wrapper : void 0;\n return import_react6.default.createElement(\n Wrapper,\n {\n ref: wrapperRef,\n style: { ...style, width, height },\n ...attributes\n },\n import_react6.default.createElement(\n UniversalSuspense,\n { fallback: fallbackElement },\n this.renderActivePlayer(src)\n )\n );\n }\n }, _a.displayName = \"StormcloudPlayer\", _a.defaultProps = {\n ...defaultProps,\n fallback: null,\n wrapper: \"div\"\n }, _a.addCustomPlayer = (player) => {\n customPlayers.push(player);\n }, _a.removeCustomPlayers = () => {\n customPlayers.length = 0;\n }, _a.canPlay = (src) => {\n for (const Player2 of [...customPlayers, ...playerList]) {\n if (Player2.canPlay(src)) {\n return true;\n }\n }\n return false;\n }, _a.canEnablePIP = (src) => {\n for (const Player2 of [...customPlayers, ...playerList]) {\n if (Player2.canEnablePIP && Player2.canEnablePIP(src)) {\n return true;\n }\n }\n return false;\n }, _a;\n};\nvar StormcloudPlayer = createStormcloudPlayer(\n players_default,\n players_default[players_default.length - 1]\n);\nvar StormcloudPlayer_default = StormcloudPlayer;\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n DEFAULT_TRACKING_INGEST_CONFIG,\n IS_BROWSER,\n IS_GLOBAL,\n IS_IOS,\n IS_SAFARI,\n SUPPORTS_DASH,\n SUPPORTS_HLS,\n StormcloudPlayer,\n StormcloudVideoPlayer,\n StormcloudVideoPlayerComponent,\n applyTrackingIngestConfig,\n buildAnalyticsContext,\n canPlay,\n configureTrackingIngest,\n createHlsAdPlayer,\n createPalNonceManager,\n createStormcloudPlayer,\n detectBrowser,\n getBrowserConfigOverrides,\n getBrowserID,\n getClientInfo,\n ingestPlayerTracking,\n initializePolyfills,\n isMediaStream,\n isTrackingIngestEnabled,\n lazy,\n logBrowserInfo,\n merge,\n omit,\n parseQuery,\n players,\n randomString,\n requiresMediaPipelineResetAfterAds,\n sendAdDetectTracking,\n sendAdImpressionTracking,\n sendAdLoadedTracking,\n sendHeartbeat,\n sendInitialTracking,\n supportsFeature,\n supportsModernJS,\n supportsWebKitPresentationMode,\n trackingIngestConfig\n});\n","export { StormcloudVideoPlayerComponent as default } from \"./ui/StormcloudVideoPlayer\";\nexport { default as StormcloudPlayer } from \"./StormcloudPlayer\";\nexport { createStormcloudPlayer } from \"./StormcloudPlayer\";\n\nexport { StormcloudVideoPlayer } from \"./player/StormcloudVideoPlayer\";\nexport { StormcloudVideoPlayerComponent } from \"./ui/StormcloudVideoPlayer\";\n\nexport type {\n StormcloudVideoPlayerConfig,\n AdBreak,\n AdSchedule,\n LateJoinPolicy,\n ClientInfo,\n TrackingData,\n HeartbeatData,\n AdDetectInfo,\n AdLoadedInfo,\n AdImpressionInfo,\n PlayerAnalyticsContext,\n} from \"./types\";\nexport type { StormcloudVideoPlayerProps } from \"./ui/StormcloudVideoPlayer\";\nexport type { BaseStormcloudPlayerProps, OnProgressProps } from \"./props\";\n\nexport { canPlay } from \"./patterns\";\nexport * from \"./utils\";\nexport {\n getClientInfo,\n getBrowserID,\n buildAnalyticsContext,\n sendInitialTracking,\n sendHeartbeat,\n sendAdDetectTracking,\n sendAdLoadedTracking,\n sendAdImpressionTracking,\n} from \"./utils/tracking\";\n\nexport {\n configureTrackingIngest,\n applyTrackingIngestConfig,\n isTrackingIngestEnabled,\n trackingIngestConfig,\n DEFAULT_TRACKING_INGEST_CONFIG,\n ingestPlayerTracking,\n} from \"./utils/trackingIngest\";\nexport type {\n TrackingIngestConfig,\n TrackingIngestChannel,\n} from \"./utils/trackingIngest\";\n\nexport { initializePolyfills } from \"./utils/polyfills\";\nexport {\n detectBrowser,\n supportsModernJS,\n logBrowserInfo,\n getBrowserConfigOverrides,\n requiresMediaPipelineResetAfterAds,\n supportsFeature,\n} from \"./utils/browserCompat\";\nexport type { BrowserInfo } from \"./utils/browserCompat\";\n\nexport { default as players } from \"./players\";\n\nexport { createHlsAdPlayer } from \"./sdk/hlsAdPlayer\";\nexport { createPalNonceManager } from \"./sdk/pal\";\nexport type { PalNonceManager, PalNonceOptions } from \"./sdk/pal\";\nexport type { AdController, AdControllerOptions, ImaController, ImaControllerOptions } from \"./types\";\n","import React, { useEffect, useRef, useMemo, useCallback } from \"react\";\nimport { StormcloudVideoPlayer } from \"../player/StormcloudVideoPlayer\";\nimport type { StormcloudVideoPlayerConfig } from \"../types\";\nimport {\n FaPlay,\n FaPause,\n FaVolumeUp,\n FaVolumeMute,\n FaVolumeDown,\n} from \"react-icons/fa\";\n\nconst ExpandIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M9 4H4v5\" />\n <path d=\"M20 9V4h-5\" />\n <path d=\"M15 20h5v-5\" />\n <path d=\"M4 15v5h5\" />\n </svg>\n);\n\nconst CompressIcon: React.FC<{ size?: number }> = ({ size = 18 }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M4 9h5V4\" />\n <path d=\"M15 4v5h5\" />\n <path d=\"M20 15h-5v5\" />\n <path d=\"M9 20v-5H4\" />\n </svg>\n);\n\nexport type StormcloudVideoPlayerProps = Omit<\n StormcloudVideoPlayerConfig,\n \"videoElement\"\n> &\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n onReady?: (player: StormcloudVideoPlayer) => void;\n wrapperClassName?: string;\n wrapperStyle?: React.CSSProperties;\n licenseKey?: string;\n };\n\nconst CRITICAL_PROPS = [\n \"src\",\n \"allowNativeHls\",\n \"isLiveStream\",\n \"licenseKey\",\n \"isVmap\",\n \"vmapUrl\",\n \"lowLatencyMode\",\n \"driftToleranceMs\",\n \"vastMode\",\n \"ctvAdRequest\",\n] as const;\n\nconst CONTROLS_HIDE_DELAY = 3000;\nconst DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;\n\nexport const StormcloudVideoPlayerComponent: React.FC<StormcloudVideoPlayerProps> =\n React.memo(\n (props) => {\n const {\n src,\n autoplay,\n muted,\n lowLatencyMode,\n allowNativeHls,\n isLiveStream,\n driftToleranceMs,\n immediateManifestAds,\n debugAdTiming,\n showCustomControls,\n hideLoadingIndicator,\n onVolumeToggle,\n onFullscreenToggle,\n onControlClick,\n onReady,\n wrapperClassName,\n wrapperStyle,\n className,\n style,\n controls,\n playsInline,\n preload,\n poster,\n children,\n licenseKey,\n vastMode,\n vastTagUrl,\n isVmap,\n vmapUrl,\n minSegmentsBeforePlay,\n ctvAdRequest,\n programTitle,\n ...restVideoAttrs\n } = props;\n\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const playerRef = useRef<StormcloudVideoPlayer | null>(null);\n const bufferingTimeoutRef = useRef<number | null>(null);\n const controlsTimerRef = useRef<number | null>(null);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const [adStatus, setAdStatus] = React.useState<{\n showAds: boolean;\n currentIndex: number;\n totalAds: number;\n remainingSeconds: number;\n }>({ showAds: false, currentIndex: 0, totalAds: 0, remainingSeconds: 0 });\n\n const [shouldShowNativeControls, setShouldShowNativeControls] =\n React.useState(true);\n\n const [isMuted, setIsMuted] = React.useState(false);\n const [isFullscreen, setIsFullscreen] = React.useState(false);\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [currentTime, setCurrentTime] = React.useState(0);\n const [duration, setDuration] = React.useState(0);\n const [volume, setVolume] = React.useState(1);\n const [playbackRate, setPlaybackRate] = React.useState(1);\n const [showVolumeSlider, setShowVolumeSlider] = React.useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = React.useState(false);\n const [isLoading, setIsLoading] = React.useState(true);\n const [isBuffering, setIsBuffering] = React.useState(false);\n const [showCenterPlay, setShowCenterPlay] = React.useState(false);\n const [showLicenseWarning, setShowLicenseWarning] = React.useState(false);\n const [controlsVisible, setControlsVisible] = React.useState(true);\n const [viewportWidth, setViewportWidth] = React.useState(\n typeof window !== \"undefined\" ? window.innerWidth : 1920\n );\n const [isPortrait, setIsPortrait] = React.useState(\n typeof window !== \"undefined\"\n ? window.innerHeight > window.innerWidth\n : false\n );\n const [playerAspectRatio, setPlayerAspectRatio] = React.useState(\n DEFAULT_PLAYER_ASPECT_RATIO\n );\n\n const getResponsiveScale = () => {\n if (viewportWidth < 480) return 0.7;\n if (viewportWidth < 768) return 0.8;\n if (viewportWidth < 1024) return 0.9;\n return 1;\n };\n\n const responsiveScale = getResponsiveScale();\n\n const resetControlsTimer = useCallback(() => {\n if (controlsTimerRef.current) {\n clearTimeout(controlsTimerRef.current);\n }\n setControlsVisible(true);\n controlsTimerRef.current = window.setTimeout(() => {\n if (!showVolumeSlider && !showSpeedMenu) {\n setControlsVisible(false);\n }\n }, CONTROLS_HIDE_DELAY);\n }, [showVolumeSlider, showSpeedMenu]);\n\n const handleWrapperMouseMove = useCallback(() => {\n resetControlsTimer();\n }, [resetControlsTimer]);\n\n const handleWrapperMouseLeave = useCallback(() => {\n if (!showVolumeSlider && !showSpeedMenu) {\n setControlsVisible(false);\n }\n }, [showVolumeSlider, showSpeedMenu]);\n\n const formatTime = (seconds: number): string => {\n if (!isFinite(seconds)) return \"0:00:00\";\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return `${hours}:${minutes\n .toString()\n .padStart(2, \"0\")}:${remainingSeconds.toString().padStart(2, \"0\")}`;\n };\n\n const handlePlayPause = () => {\n if (videoRef.current) {\n if (videoRef.current.paused) {\n const hasValidSource =\n videoRef.current.src ||\n (videoRef.current.currentSrc &&\n videoRef.current.currentSrc !== \"\") ||\n videoRef.current.readyState >= 1;\n\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n } else {\n videoRef.current.pause();\n setShowCenterPlay(true);\n }\n }\n resetControlsTimer();\n };\n\n const handleCenterPlayClick = () => {\n if (videoRef.current && videoRef.current.paused) {\n const hasValidSource =\n videoRef.current.src ||\n (videoRef.current.currentSrc &&\n videoRef.current.currentSrc !== \"\") ||\n videoRef.current.readyState >= 1;\n\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n }\n };\n\n const handleTimelineSeek = (e: React.MouseEvent<HTMLDivElement>) => {\n if (videoRef.current && duration > 0 && isFinite(duration)) {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const progress = Math.max(0, Math.min(1, clickX / rect.width));\n const newTime = progress * duration;\n\n if (isFinite(newTime) && newTime >= 0 && newTime <= duration) {\n videoRef.current.currentTime = newTime;\n }\n }\n resetControlsTimer();\n };\n\n const handleVolumeChange = (newVolume: number) => {\n if (playerRef.current && isFinite(newVolume)) {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n playerRef.current.setVolume(clampedVolume);\n }\n };\n\n const handlePlaybackRateChange = (rate: number) => {\n if (videoRef.current && isFinite(rate) && rate > 0) {\n videoRef.current.playbackRate = rate;\n }\n setShowSpeedMenu(false);\n };\n\n const isHlsStream =\n src?.toLowerCase().includes(\".m3u8\") ||\n src?.toLowerCase().includes(\"/hls/\");\n const isLiveUiMode = isLiveStream === true;\n const shouldShowEnhancedControls =\n showCustomControls &&\n (isHlsStream ? !isLiveUiMode : true);\n\n const criticalPropsKey = useMemo(() => {\n return CRITICAL_PROPS.map((prop) => `${prop}:${props[prop]}`).join(\"|\");\n }, [\n src,\n allowNativeHls,\n isLiveStream,\n licenseKey,\n isVmap,\n vmapUrl,\n lowLatencyMode,\n driftToleranceMs,\n vastMode,\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const el = videoRef.current;\n if (!el || !src) return;\n\n if (!licenseKey) {\n setShowLicenseWarning(true);\n setIsLoading(false);\n console.warn(\n \"StormcloudVideoPlayer: License key is required but not provided. Please set the licenseKey prop to use the player.\"\n );\n return;\n }\n\n setShowLicenseWarning(false);\n\n if (debugAdTiming) {\n console.log(\"[StormcloudUI] Initializing player, isLoading=true\");\n }\n\n if (playerRef.current) {\n try {\n playerRef.current.destroy();\n } catch {}\n playerRef.current = null;\n }\n\n const cfg: StormcloudVideoPlayerConfig = {\n src,\n videoElement: el,\n } as StormcloudVideoPlayerConfig;\n if (autoplay !== undefined) cfg.autoplay = autoplay;\n if (muted !== undefined) cfg.muted = muted;\n if (lowLatencyMode !== undefined) cfg.lowLatencyMode = lowLatencyMode;\n if (allowNativeHls !== undefined) cfg.allowNativeHls = allowNativeHls;\n if (isLiveStream !== undefined) cfg.isLiveStream = isLiveStream;\n if (driftToleranceMs !== undefined)\n cfg.driftToleranceMs = driftToleranceMs;\n if (immediateManifestAds !== undefined)\n cfg.immediateManifestAds = immediateManifestAds;\n if (debugAdTiming !== undefined) cfg.debugAdTiming = debugAdTiming;\n if (showCustomControls !== undefined)\n cfg.showCustomControls = showCustomControls;\n if (onVolumeToggle !== undefined) cfg.onVolumeToggle = onVolumeToggle;\n if (onFullscreenToggle !== undefined)\n cfg.onFullscreenToggle = onFullscreenToggle;\n if (onControlClick !== undefined) cfg.onControlClick = onControlClick;\n if (licenseKey !== undefined) cfg.licenseKey = licenseKey;\n if (vastMode !== undefined) cfg.vastMode = vastMode;\n if (vastTagUrl !== undefined) cfg.vastTagUrl = vastTagUrl;\n if (isVmap !== undefined) cfg.isVmap = isVmap;\n if (vmapUrl !== undefined) cfg.vmapUrl = vmapUrl;\n if (minSegmentsBeforePlay !== undefined)\n cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;\n if (ctvAdRequest !== undefined) cfg.ctvAdRequest = ctvAdRequest;\n if (programTitle !== undefined) cfg.programTitle = programTitle;\n\n const player = new StormcloudVideoPlayer(cfg);\n playerRef.current = player;\n player\n .load()\n .then(() => {\n const showNative = player.shouldShowNativeControls();\n setShouldShowNativeControls(showNative);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Player loaded successfully, waiting for video ready\"\n );\n }\n onReady?.(player);\n })\n .catch((error) => {\n console.error(\n \"StormcloudVideoPlayer: Failed to load player:\",\n error\n );\n setIsLoading(false);\n onReady?.(player);\n });\n\n return () => {\n try {\n player.destroy();\n } catch {}\n playerRef.current = null;\n };\n }, [criticalPropsKey]);\n\n useEffect(() => {\n if (!playerRef.current) return;\n\n try {\n if (autoplay !== undefined && playerRef.current.videoElement) {\n playerRef.current.videoElement.autoplay = autoplay;\n }\n if (muted !== undefined && !playerRef.current.isShowingAds()) {\n playerRef.current.setMuted(muted);\n }\n } catch (error) {\n console.warn(\"Failed to update player properties:\", error);\n }\n }, [autoplay, muted]);\n\n useEffect(() => {\n if (!playerRef.current) return;\n\n const checkAdStatus = () => {\n if (playerRef.current) {\n const showAdsFromMethod = playerRef.current.isShowingAds();\n const showAdsFromAttribute = videoRef.current?.dataset?.stormcloudAdPlaying === \"true\";\n const showAds = showAdsFromMethod || showAdsFromAttribute;\n const currentIndex = playerRef.current.getCurrentAdIndex();\n const totalAds = playerRef.current.getTotalAdsInBreak();\n const remainingMs = playerRef.current.getAdRemainingMs();\n const remainingSeconds = showAds\n ? Math.max(0, Math.ceil(remainingMs / 1000))\n : 0;\n\n setAdStatus((prev) => {\n if (\n prev.showAds !== showAds ||\n prev.currentIndex !== currentIndex ||\n prev.totalAds !== totalAds ||\n prev.remainingSeconds !== remainingSeconds\n ) {\n if (showAds && !prev.showAds) {\n setShowCenterPlay(false);\n }\n return { showAds, currentIndex, totalAds, remainingSeconds };\n }\n return prev;\n });\n }\n };\n\n const interval = setInterval(checkAdStatus, 50);\n return () => clearInterval(interval);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !playerRef.current) return;\n\n const handleResize = () => {\n if (playerRef.current && videoRef.current) {\n if (typeof playerRef.current.resize === \"function\") {\n playerRef.current.resize();\n }\n }\n setViewportWidth(window.innerWidth);\n setIsPortrait(window.innerHeight > window.innerWidth);\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n useEffect(() => {\n if (!playerRef.current || !videoRef.current) return;\n\n const updateStates = () => {\n if (playerRef.current && videoRef.current) {\n setIsMuted(playerRef.current.isMuted());\n setIsPlaying(!videoRef.current.paused);\n\n const currentTimeValue = videoRef.current.currentTime;\n setCurrentTime(isFinite(currentTimeValue) ? currentTimeValue : 0);\n\n const durationValue = videoRef.current.duration;\n setDuration(isFinite(durationValue) ? durationValue : 0);\n\n const volumeValue = playerRef.current.getVolume();\n setVolume(\n isFinite(volumeValue) ? Math.max(0, Math.min(1, volumeValue)) : 1\n );\n\n const rateValue = videoRef.current.playbackRate;\n setPlaybackRate(\n isFinite(rateValue) && rateValue > 0 ? rateValue : 1\n );\n }\n setIsFullscreen(\n document.fullscreenElement === wrapperRef.current\n );\n };\n\n const interval = setInterval(updateStates, 200);\n\n const handleFullscreenChange = () => {\n setIsFullscreen(\n document.fullscreenElement === wrapperRef.current\n );\n };\n\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n\n return () => {\n clearInterval(interval);\n document.removeEventListener(\n \"fullscreenchange\",\n handleFullscreenChange\n );\n };\n }, []);\n\n useEffect(() => {\n if (!videoRef.current) return;\n\n const handleLoadedMetadata = () => {\n const video = videoRef.current;\n if (video) {\n if (video.videoWidth > 0 && video.videoHeight > 0) {\n setPlayerAspectRatio(video.videoWidth / video.videoHeight);\n }\n void video.offsetHeight;\n }\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadedmetadata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n\n const handleLoadedData = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadeddata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n\n const handleLoadStart = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadstart, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplay, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n\n const handleCanPlayThrough = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplaythrough, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n\n const handleWaiting = () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n }\n\n bufferingTimeoutRef.current = window.setTimeout(() => {\n setIsBuffering(true);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video buffering detected (after 300ms delay), readyState:\",\n videoRef.current?.readyState,\n \"- showing spinner, isBuffering=true\"\n );\n }\n }, 300);\n\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: waiting, readyState:\",\n videoRef.current?.readyState,\n \"- buffering delay started (300ms)\"\n );\n }\n };\n\n const handlePlaying = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n setShowCenterPlay(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: playing, readyState:\",\n videoRef.current?.readyState,\n \"- playback started, isLoading=false, isBuffering=false\"\n );\n }\n };\n\n const handlePause = () => {\n const isAdActive = playerRef.current?.isShowingAds() || \n videoRef.current?.dataset?.stormcloudAdPlaying === \"true\";\n \n if (playerRef.current && !isAdActive) {\n setShowCenterPlay(true);\n } else {\n setShowCenterPlay(false);\n }\n };\n\n const handleEnded = () => {\n setShowCenterPlay(true);\n };\n\n const video = videoRef.current;\n video.addEventListener(\"loadstart\", handleLoadStart);\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n\n if (video.paused) {\n setShowCenterPlay(true);\n }\n\n return () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n\n video.removeEventListener(\"loadstart\", handleLoadStart);\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n };\n }, [debugAdTiming]);\n\n useEffect(() => {\n setPlayerAspectRatio(DEFAULT_PLAYER_ASPECT_RATIO);\n }, [src]);\n\n useEffect(() => {\n return () => {\n if (controlsTimerRef.current) {\n clearTimeout(controlsTimerRef.current);\n }\n };\n }, []);\n\n const progressPercent = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n const VolumeIcon = isMuted || volume === 0\n ? FaVolumeMute\n : volume < 0.5\n ? FaVolumeDown\n : FaVolumeUp;\n\n return (\n <>\n <style>\n {`\n @keyframes sc-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes sc-loading-glow {\n 0%, 100% { opacity: 0.85; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n }\n @keyframes sc-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n }\n @keyframes sc-fade-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .sc-wrapper:fullscreen,\n .sc-wrapper:has(*:fullscreen) {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n .sc-ctrl-btn {\n background: none;\n border: none;\n color: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n padding: 8px;\n transition: background 0.15s ease, opacity 0.15s ease;\n opacity: 0.9;\n }\n .sc-ctrl-btn:hover {\n opacity: 1;\n background: rgba(255, 255, 255, 0.1);\n }\n .sc-ctrl-btn:active {\n opacity: 0.7;\n }\n .sc-controls-bar {\n transition: opacity 0.35s ease, transform 0.35s ease;\n }\n .sc-progress-track:hover .sc-progress-thumb {\n transform: translate(-50%, -50%) scale(1) !important;\n }\n .sc-loading-hidden .sc-loading-indicator {\n display: none !important;\n }\n `}\n </style>\n <div\n ref={wrapperRef}\n className={`sc-wrapper ${wrapperClassName || \"\"}`}\n onMouseMove={handleWrapperMouseMove}\n onMouseLeave={handleWrapperMouseLeave}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: isFullscreen ? \"fixed\" : \"relative\",\n top: isFullscreen ? 0 : undefined,\n left: isFullscreen ? 0 : undefined,\n overflow: \"hidden\",\n width: isFullscreen ? \"100vw\" : \"100%\",\n height: isFullscreen ? \"100vh\" : \"auto\",\n minHeight: isFullscreen ? \"100vh\" : \"auto\",\n aspectRatio: isFullscreen ? undefined : playerAspectRatio,\n maxWidth: isFullscreen ? \"100vw\" : \"100%\",\n maxHeight: isFullscreen ? \"100vh\" : \"none\",\n zIndex: isFullscreen ? 999999 : undefined,\n backgroundColor: \"#000\",\n borderRadius: isFullscreen ? 0 : undefined,\n boxShadow: isFullscreen ? \"none\" : undefined,\n ...wrapperStyle,\n }}\n >\n <video\n ref={videoRef}\n className={className}\n style={{\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n maxWidth: \"100%\",\n maxHeight: isFullscreen ? \"100%\" : \"none\",\n objectFit: isFullscreen ? \"cover\" : \"contain\",\n backgroundColor: \"#000\",\n aspectRatio: isFullscreen ? \"unset\" : undefined,\n ...style,\n }}\n controls={\n shouldShowNativeControls && controls && !showCustomControls\n }\n playsInline={playsInline}\n preload={preload}\n poster={poster}\n {...restVideoAttrs}\n >\n {children}\n </video>\n\n {(isLoading || isBuffering) && !hideLoadingIndicator && (\n <div\n className=\"sc-loading-indicator\"\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 20,\n width: `${Math.max(34, 38 * responsiveScale)}px`,\n height: `${Math.max(34, 38 * responsiveScale)}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n animation: \"sc-loading-glow 1.4s ease-in-out infinite\",\n filter: \"drop-shadow(0 6px 14px rgba(0, 0, 0, 0.55))\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n border: \"3px solid rgba(255, 255, 255, 0.25)\",\n borderTopColor: \"#ff0000\",\n borderRightColor: \"rgba(255, 255, 255, 0.85)\",\n animation: \"sc-spin 0.8s linear infinite\",\n }}\n />\n <div\n style={{\n width: \"7px\",\n height: \"7px\",\n borderRadius: \"50%\",\n background: \"#ff0000\",\n boxShadow: \"0 0 10px rgba(255, 0, 0, 0.65)\",\n }}\n />\n </div>\n )}\n\n {showLicenseWarning && (\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 25,\n background: \"rgba(220, 38, 38, 0.92)\",\n backdropFilter: \"blur(24px)\",\n color: \"white\",\n padding: \"28px 36px\",\n borderRadius: \"14px\",\n border: \"1px solid rgba(255, 255, 255, 0.15)\",\n boxShadow: \"0 24px 64px rgba(0, 0, 0, 0.5)\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n margin: \"0 16px\",\n }}\n >\n <div style={{ fontSize: \"18px\", fontWeight: \"700\", marginBottom: \"10px\", letterSpacing: \"-0.02em\" }}>\n License Key Required\n </div>\n <div style={{ fontSize: \"13px\", lineHeight: \"1.6\", color: \"rgba(255, 255, 255, 0.85)\" }}>\n Please provide a valid license key to use the Stormcloud Video\n Player.\n <br />\n Contact your administrator for licensing information.\n </div>\n </div>\n )}\n\n {adStatus.showAds && (\n <div\n style={{\n position: \"absolute\",\n top: `${12 * responsiveScale}px`,\n left: `${12 * responsiveScale}px`,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n pointerEvents: \"none\",\n animation: \"sc-fade-in 0.3s ease\",\n }}\n >\n <div\n style={{\n background: \"rgba(234, 179, 8, 0.95)\",\n color: \"#111\",\n padding: `${4 * responsiveScale}px ${12 * responsiveScale}px`,\n borderRadius: \"6px\",\n fontSize: `${11 * responsiveScale}px`,\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\" as const,\n boxShadow: \"0 2px 12px rgba(234, 179, 8, 0.35)\",\n }}\n >\n {`Ad ${Math.max(1, adStatus.currentIndex)}`}\n </div>\n </div>\n )}\n\n {showCenterPlay &&\n !isLoading &&\n !isBuffering &&\n !showLicenseWarning &&\n !adStatus.showAds && (\n <div\n onClick={handleCenterPlayClick}\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 15,\n cursor: \"pointer\",\n background: \"rgba(0, 0, 0, 0.55)\",\n backdropFilter: \"blur(8px)\",\n borderRadius: \"50%\",\n width: `${92 * responsiveScale}px`,\n height: `${92 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"background 0.2s ease, transform 0.2s ease\",\n animation: \"sc-fade-in 0.2s ease\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.background = \"rgba(0, 0, 0, 0.72)\";\n (e.currentTarget as HTMLElement).style.transform = \"translate(-50%, -50%) scale(1.06)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.background = \"rgba(0, 0, 0, 0.55)\";\n (e.currentTarget as HTMLElement).style.transform = \"translate(-50%, -50%) scale(1)\";\n }}\n title=\"Play\"\n >\n <FaPlay\n size={Math.max(24, 32 * responsiveScale)}\n color=\"white\"\n style={{ marginLeft: \"4px\" }}\n />\n </div>\n )}\n\n {shouldShowEnhancedControls && !showLicenseWarning ? (\n <div\n className=\"sc-controls-bar\"\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n background: \"linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.35) 60%, transparent 100%)\",\n padding: `${20 * responsiveScale}px ${12 * responsiveScale}px ${8 * responsiveScale}px`,\n zIndex: 10,\n opacity: controlsVisible || adStatus.showAds ? 1 : 0,\n transform: controlsVisible || adStatus.showAds ? \"translateY(0)\" : \"translateY(6px)\",\n pointerEvents: controlsVisible || adStatus.showAds ? \"auto\" : \"none\",\n }}\n >\n {/* Progress Bar */}\n <div\n className=\"sc-progress-track\"\n style={{\n width: \"100%\",\n height: \"3px\",\n background: \"rgba(255, 255, 255, 0.2)\",\n borderRadius: \"1.5px\",\n marginBottom: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n position: \"relative\",\n transition: \"height 0.1s ease\",\n }}\n onClick={handleTimelineSeek}\n onMouseEnter={(e) => { e.currentTarget.style.height = \"5px\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.height = \"3px\"; }}\n >\n <div\n style={{\n position: \"absolute\",\n top: 0, left: 0, bottom: 0,\n background: adStatus.showAds ? \"#f5c518\" : \"#ff0000\",\n borderRadius: \"1.5px\",\n width: `${progressPercent}%`,\n transition: \"width 0.15s linear\",\n }}\n />\n <div\n className=\"sc-progress-thumb\"\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: `${progressPercent}%`,\n transform: \"translate(-50%, -50%) scale(0)\",\n width: \"13px\",\n height: \"13px\",\n background: adStatus.showAds ? \"#f5c518\" : \"#ff0000\",\n borderRadius: \"50%\",\n boxShadow: \"0 0 4px rgba(0, 0, 0, 0.3)\",\n transition: \"transform 0.1s ease, left 0.15s linear\",\n }}\n />\n </div>\n\n {/* Controls Row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n color: \"white\",\n gap: `${8 * responsiveScale}px`,\n }}\n >\n {/* Left Group */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: `${8 * responsiveScale}px`,\n }}\n >\n {/* Play/Pause */}\n <button\n className=\"sc-ctrl-btn\"\n onClick={handlePlayPause}\n style={{\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`,\n }}\n title={isPlaying ? \"Pause\" : \"Play\"}\n >\n {isPlaying ? (\n <FaPause size={Math.max(14, 18 * responsiveScale)} />\n ) : (\n <FaPlay size={Math.max(14, 18 * responsiveScale)} style={{ marginLeft: \"2px\" }} />\n )}\n </button>\n\n {/* Volume Group - YouTube Style */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n paddingRight: `${6 * responsiveScale}px`,\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n >\n <button\n className=\"sc-ctrl-btn\"\n onClick={() => {\n if (playerRef.current) playerRef.current.toggleMute();\n onVolumeToggle?.();\n resetControlsTimer();\n }}\n style={{\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`,\n }}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n <VolumeIcon size={Math.max(14, 18 * responsiveScale)} />\n </button>\n <div\n style={{\n width: showVolumeSlider ? `${68 * responsiveScale}px` : \"0px\",\n overflow: \"hidden\",\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n display: \"flex\",\n alignItems: \"center\",\n paddingLeft: showVolumeSlider ? `${3 * responsiveScale}px` : \"0\",\n paddingRight: showVolumeSlider ? `${8 * responsiveScale}px` : \"0\",\n }}\n >\n <div\n style={{\n position: \"relative\",\n width: `${56 * responsiveScale}px`,\n height: \"3px\",\n cursor: \"pointer\",\n borderRadius: \"1.5px\",\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n const el = e.currentTarget;\n const move = (ev: MouseEvent) => {\n const r = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (ev.clientX - r.left) / r.width)));\n };\n const up = () => { document.removeEventListener(\"mousemove\", move); document.removeEventListener(\"mouseup\", up); };\n document.addEventListener(\"mousemove\", move);\n document.addEventListener(\"mouseup\", up);\n const r = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n }}\n onClick={(e) => {\n e.stopPropagation();\n const r = e.currentTarget.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n }}\n >\n <div style={{ position: \"absolute\", inset: 0, background: \"rgba(255, 255, 255, 0.2)\", borderRadius: \"1.5px\" }} />\n <div\n style={{\n position: \"absolute\",\n top: 0, left: 0, bottom: 0,\n width: `${(isMuted ? 0 : volume) * 100}%`,\n background: \"#fff\",\n borderRadius: \"1.5px\",\n transition: \"width 0.1s ease-out\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: `${(isMuted ? 0 : volume) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n width: \"12px\",\n height: \"12px\",\n background: \"#fff\",\n borderRadius: \"50%\",\n boxShadow: \"0 0 3px rgba(0, 0, 0, 0.3)\",\n transition: \"left 0.1s ease-out\",\n }}\n />\n </div>\n </div>\n </div>\n\n {/* Time Display */}\n <div\n style={{\n fontSize: `${13 * responsiveScale}px`,\n fontFamily: \"Roboto, 'Segoe UI', Arial, sans-serif\",\n color: \"rgba(255, 255, 255, 0.9)\",\n display: viewportWidth < 480 ? \"none\" : \"block\",\n fontVariantNumeric: \"tabular-nums\",\n userSelect: \"none\",\n marginLeft: `${4 * responsiveScale}px`,\n }}\n >\n {formatTime(currentTime)}{\" \"}\n <span style={{ color: \"rgba(255,255,255,0.5)\" }}>/</span>{\" \"}\n {formatTime(duration)}\n </div>\n </div>\n\n {/* Right Group */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: `${8 * responsiveScale}px`,\n }}\n >\n {/* Speed Selector */}\n <div style={{ position: \"relative\", display: viewportWidth < 600 ? \"none\" : \"block\" }}>\n <button\n className=\"sc-ctrl-btn\"\n onClick={() => { setShowSpeedMenu(!showSpeedMenu); resetControlsTimer(); }}\n style={{\n padding: `${6 * responsiveScale}px ${10 * responsiveScale}px`,\n borderRadius: `${6 * responsiveScale}px`,\n fontSize: `${13 * responsiveScale}px`,\n fontFamily: \"'SF Mono', 'Cascadia Code', monospace\",\n fontWeight: \"600\",\n minHeight: `${32 * responsiveScale}px`,\n }}\n title=\"Playback Speed\"\n >\n {playbackRate}x\n </button>\n\n {showSpeedMenu && (\n <div\n style={{\n position: \"absolute\",\n bottom: \"100%\",\n right: 0,\n marginBottom: \"8px\",\n background: \"rgba(0, 0, 0, 0.8)\",\n backdropFilter: \"blur(24px)\",\n WebkitBackdropFilter: \"blur(24px)\",\n borderRadius: \"10px\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n overflow: \"hidden\",\n minWidth: \"80px\",\n boxShadow: \"0 12px 40px rgba(0, 0, 0, 0.5)\",\n animation: \"sc-fade-in 0.15s ease\",\n }}\n >\n {[0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2].map((speed) => (\n <button\n key={speed}\n onClick={() => handlePlaybackRateChange(speed)}\n style={{\n display: \"block\",\n width: \"100%\",\n padding: `${8 * responsiveScale}px ${14 * responsiveScale}px`,\n background: playbackRate === speed\n ? \"rgba(255, 255, 255, 0.12)\"\n : \"transparent\",\n border: \"none\",\n color: playbackRate === speed ? \"#fff\" : \"rgba(255, 255, 255, 0.7)\",\n cursor: \"pointer\",\n fontSize: `${12 * responsiveScale}px`,\n fontFamily: \"'SF Mono', monospace\",\n fontWeight: playbackRate === speed ? \"700\" : \"500\",\n textAlign: \"center\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (playbackRate !== speed) {\n (e.target as HTMLElement).style.background = \"rgba(255, 255, 255, 0.08)\";\n (e.target as HTMLElement).style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (playbackRate !== speed) {\n (e.target as HTMLElement).style.background = \"transparent\";\n (e.target as HTMLElement).style.color = \"rgba(255, 255, 255, 0.7)\";\n }\n }}\n >\n {speed}x\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Fullscreen */}\n <button\n className=\"sc-ctrl-btn\"\n onClick={() => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (wrapperRef.current) {\n if (!document.fullscreenElement) {\n wrapperRef.current.requestFullscreen().catch(() => {});\n } else {\n document.exitFullscreen().catch(() => {});\n }\n }\n resetControlsTimer();\n }}\n style={{\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`,\n }}\n title={isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\"}\n >\n {isFullscreen ? (\n <CompressIcon size={Math.max(14, 18 * responsiveScale)} />\n ) : (\n <ExpandIcon size={Math.max(14, 18 * responsiveScale)} />\n )}\n </button>\n </div>\n </div>\n </div>\n ) : (\n showCustomControls && !showLicenseWarning && (\n <>\n <div\n style={{\n position: \"absolute\",\n top: `${10 * responsiveScale}px`,\n left: `${10 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n zIndex: 10,\n opacity: controlsVisible ? 1 : 0,\n transition: \"opacity 0.35s ease\",\n }}\n >\n <div\n style={{\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n background: \"#ff3b30\",\n animation: \"sc-pulse 1.5s ease-in-out infinite\",\n flexShrink: 0,\n }}\n />\n <span\n style={{\n fontSize: `${12 * responsiveScale}px`,\n fontFamily: \"'SF Pro Display', 'Segoe UI', Arial, sans-serif\",\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n color: \"#fff\",\n textShadow: \"0 1px 3px rgba(0,0,0,0.6)\",\n userSelect: \"none\",\n }}\n >\n LIVE\n </span>\n </div>\n\n <div\n className=\"sc-controls-bar\"\n style={{\n position: \"absolute\",\n bottom: `${10 * responsiveScale}px`,\n right: `${10 * responsiveScale}px`,\n display: \"flex\",\n flexDirection: isPortrait ? \"column\" : \"row\",\n alignItems: isPortrait ? \"flex-end\" : \"center\",\n gap: `${8 * responsiveScale}px`,\n zIndex: 10,\n opacity: controlsVisible ? 1 : 0,\n transform: controlsVisible ? \"translateY(0)\" : \"translateY(4px)\",\n pointerEvents: controlsVisible ? \"auto\" : \"none\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n background: \"rgba(0, 0, 0, 0.6)\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: \"2px\",\n paddingRight: `${8 * responsiveScale}px`,\n }}\n onMouseEnter={() => setShowVolumeSlider(true)}\n onMouseLeave={() => setShowVolumeSlider(false)}\n >\n <button\n className=\"sc-ctrl-btn\"\n onClick={() => {\n if (playerRef.current) playerRef.current.toggleMute();\n onVolumeToggle?.();\n resetControlsTimer();\n }}\n style={{\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`,\n }}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n <VolumeIcon size={Math.max(14, 18 * responsiveScale)} />\n </button>\n <div\n style={{\n width: showVolumeSlider ? `${68 * responsiveScale}px` : \"0px\",\n overflow: \"hidden\",\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n display: \"flex\",\n alignItems: \"center\",\n paddingLeft: showVolumeSlider ? `${3 * responsiveScale}px` : \"0\",\n paddingRight: showVolumeSlider ? `${10 * responsiveScale}px` : \"0\",\n }}\n >\n <div\n style={{\n position: \"relative\",\n width: `${56 * responsiveScale}px`,\n height: \"3px\",\n cursor: \"pointer\",\n borderRadius: \"1.5px\",\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n const el = e.currentTarget;\n const move = (ev: MouseEvent) => {\n const r = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (ev.clientX - r.left) / r.width)));\n };\n const up = () => { document.removeEventListener(\"mousemove\", move); document.removeEventListener(\"mouseup\", up); };\n document.addEventListener(\"mousemove\", move);\n document.addEventListener(\"mouseup\", up);\n const r = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n }}\n onClick={(e) => {\n e.stopPropagation();\n const r = e.currentTarget.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n }}\n >\n <div style={{ position: \"absolute\", inset: 0, background: \"rgba(255, 255, 255, 0.2)\", borderRadius: \"1.5px\" }} />\n <div\n style={{\n position: \"absolute\",\n top: 0, left: 0, bottom: 0,\n width: `${(isMuted ? 0 : volume) * 100}%`,\n background: \"#fff\",\n borderRadius: \"1.5px\",\n transition: \"width 0.1s ease-out\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: `${(isMuted ? 0 : volume) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n width: \"12px\",\n height: \"12px\",\n background: \"#fff\",\n borderRadius: \"50%\",\n boxShadow: \"0 0 3px rgba(0, 0, 0, 0.3)\",\n transition: \"left 0.1s ease-out\",\n }}\n />\n </div>\n </div>\n </div>\n\n <button\n className=\"sc-ctrl-btn\"\n onClick={() => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (wrapperRef.current) {\n if (!document.fullscreenElement) {\n wrapperRef.current.requestFullscreen().catch(() => {});\n } else {\n document.exitFullscreen().catch(() => {});\n }\n }\n resetControlsTimer();\n }}\n style={{\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`,\n background: \"rgba(0, 0, 0, 0.6)\",\n }}\n title={isFullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\"}\n >\n {isFullscreen ? (\n <CompressIcon size={Math.max(14, 18 * responsiveScale)} />\n ) : (\n <ExpandIcon size={Math.max(14, 18 * responsiveScale)} />\n )}\n </button>\n </div>\n </>\n )\n )}\n\n {onControlClick && (\n <div\n onClick={onControlClick}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1,\n cursor: \"pointer\",\n }}\n />\n )}\n </div>\n </>\n );\n },\n (prevProps, nextProps) => {\n for (const prop of CRITICAL_PROPS) {\n if ((prevProps as any)[prop] !== (nextProps as any)[prop]) {\n return false;\n }\n }\n\n const uiProps = [\n \"autoplay\",\n \"muted\",\n \"controls\",\n \"showCustomControls\",\n \"className\",\n \"style\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"playsInline\",\n \"preload\",\n \"poster\",\n \"children\",\n ] as const;\n\n for (const prop of uiProps) {\n if ((prevProps as any)[prop] !== (nextProps as any)[prop]) {\n return false;\n }\n }\n\n const callbackProps = [\n \"onReady\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\",\n ] as const;\n for (const prop of callbackProps) {\n if ((prevProps as any)[prop] !== (nextProps as any)[prop]) {\n return false;\n }\n }\n\n return true;\n }\n );\n","import type { AdController } from \"../types\";\nimport Hls from \"hls.js\";\nimport { requiresMediaPipelineResetAfterAds } from \"../utils/browserCompat\";\nimport type { VastTrackingMacroContext } from \"../utils/vastTrackingMacros\";\nimport { substituteVastTrackingMacros } from \"../utils/vastTrackingMacros\";\n\ninterface VastMediaFile {\n url: string;\n type: string;\n width: number;\n height: number;\n bitrate?: number | undefined;\n}\n\ninterface VastTrackingUrls {\n impression: string[];\n start: string[];\n firstQuartile: string[];\n midpoint: string[];\n thirdQuartile: string[];\n complete: string[];\n mute: string[];\n unmute: string[];\n pause: string[];\n resume: string[];\n fullscreen: string[];\n exitFullscreen: string[];\n skip: string[];\n error: string[];\n}\n\ninterface VastAd {\n id: string;\n title: string;\n duration: number;\n mediaFiles: VastMediaFile[];\n trackingUrls: VastTrackingUrls;\n clickThrough?: string | undefined;\n}\n\ntype VastParseResult =\n | { type: \"inline\"; ad: VastAd }\n | {\n type: \"wrapper\";\n vastAdTagUri: string;\n trackingUrls: VastTrackingUrls;\n clickThrough?: string | undefined;\n }\n | { type: \"empty\" };\n\nconst MAX_VAST_WRAPPER_DEPTH = 5;\nconst BEACON_TIMEOUT_MS = 30000;\n\nconst inFlightBeacons = new Set<HTMLImageElement>();\n\nconst VAST_ERROR_MEDIA_DISPLAY = 405;\n\nfunction toVastMediaErrorCode(error: MediaError | null | undefined): number {\n switch (error?.code) {\n case 1:\n return 400;\n case 2:\n return 401;\n case 4:\n return 403;\n default:\n return VAST_ERROR_MEDIA_DISPLAY;\n }\n}\n\nexport function createHlsAdPlayer(\n contentVideo: HTMLVideoElement,\n options?: {\n continueLiveStreamDuringAds?: boolean;\n licenseKey?: string;\n mainHlsInstance?: Hls;\n }\n): AdController {\n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = new Map<string, Set<(payload?: any) => void>>();\n const mainHlsInstance = options?.mainHlsInstance;\n\n const AD_CONTAINER_PROP = \"__stormcloudAdContainer\";\n const AD_VIDEO_PROP = \"__stormcloudAdVideo\";\n const FRAME_COUNTER_RELIABLE_PROP = \"__stormcloudFrameCounterReliable\";\n const RVFC_RELIABLE_PROP = \"__stormcloudRvfcReliable\";\n\n let adVideoElement: HTMLVideoElement | undefined =\n (contentVideo as any)[AD_VIDEO_PROP] ?? undefined;\n let adHls: Hls | undefined;\n let adContainerEl: HTMLDivElement | undefined =\n (contentVideo as any)[AD_CONTAINER_PROP] ?? undefined;\n let adEventHandlers: Array<{ type: string; handler: EventListener }> = [];\n let currentAd: VastAd | undefined;\n let currentAdMediaFile: VastMediaFile | undefined;\n let podAds: VastAd[] = [];\n let podIndex = 0;\n const preloadedAds = new Map<string, VastAd>();\n const preloadingAds = new Map<string, Promise<void>>();\n let destroyed = false;\n let pendingTimeouts: number[] = [];\n\n const STALL_TIMEOUT_MS = 4000;\n const STALL_CHECK_INTERVAL_MS = 1000;\n const BLACKFRAME_MIN_PLAYBACK_S = 1.5;\n\n let stallWatchdogId: number | undefined;\n let lastAdProgressTime = 0;\n let lastAdProgressPosition = 0;\n let sawDecodedVideoFrame = false;\n let videoFrameCallbackHandle: number | undefined;\n let pendingPlayPromise: Promise<void> | undefined;\n\n let trackingFired = {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n\n function emit(event: string, payload?: any): void {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(\n `[HlsAdPlayer] Error in event listener for ${event}:`,\n error\n );\n }\n }\n }\n\n function buildTrackingMacroContext(\n errorCode?: number | string\n ): VastTrackingMacroContext {\n const context: VastTrackingMacroContext = {\n adPlayheadSeconds: adVideoElement?.currentTime,\n contentPlayheadSeconds: contentVideo.currentTime,\n assetUri: currentAdMediaFile?.url,\n mediaMime: currentAdMediaFile?.type,\n playerWidth: adVideoElement?.clientWidth || adContainerEl?.clientWidth,\n playerHeight: adVideoElement?.clientHeight || adContainerEl?.clientHeight,\n };\n\n if (errorCode != null) {\n context.errorCode = errorCode;\n }\n if (typeof navigator !== \"undefined\" && navigator.userAgent) {\n context.clientUa = navigator.userAgent;\n }\n if (typeof location !== \"undefined\" && location.href) {\n context.pageUrl = location.href;\n }\n if (podAds.length > 0) {\n context.podSequence = podIndex + 1;\n }\n\n return context;\n }\n\n function fireTrackingPixels(\n urls: string[],\n options?: { errorCode?: number | string }\n ): void {\n if (!urls || urls.length === 0) return;\n\n const macroContext = buildTrackingMacroContext(options?.errorCode);\n\n urls.forEach((url) => {\n try {\n const trackingUrl = substituteVastTrackingMacros(url, macroContext);\n\n const img = new Image(1, 1);\n inFlightBeacons.add(img);\n\n let timeoutId: number | undefined;\n const release = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n img.onload = null;\n img.onerror = null;\n inFlightBeacons.delete(img);\n };\n img.onload = release;\n img.onerror = release;\n timeoutId = setTimeout(release, BEACON_TIMEOUT_MS) as unknown as number;\n\n img.src = trackingUrl;\n console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n }\n });\n }\n\n function getMainStreamQuality(): {\n width: number;\n height: number;\n bitrate: number;\n } | null {\n if (!mainHlsInstance || !mainHlsInstance.levels) {\n return null;\n }\n\n const currentLevel = mainHlsInstance.currentLevel;\n if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n const autoLevel = mainHlsInstance.loadLevel;\n if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n const level = mainHlsInstance.levels[autoLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5000000,\n };\n }\n return null;\n }\n\n const level = mainHlsInstance.levels[currentLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5000000,\n };\n }\n\n function selectBestMediaFile(mediaFiles: VastMediaFile[]): VastMediaFile {\n if (mediaFiles.length === 0) {\n throw new Error(\"No media files available\");\n }\n\n const firstFile = mediaFiles[0];\n if (!firstFile) {\n throw new Error(\"No media files available\");\n }\n\n if (mediaFiles.length === 1) {\n return firstFile;\n }\n\n const mainQuality = getMainStreamQuality();\n if (!mainQuality) {\n console.log(\n \"[HlsAdPlayer] No main stream quality info, using first media file\"\n );\n return firstFile;\n }\n\n console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n\n const scoredFiles = mediaFiles.map((file) => {\n const widthDiff = Math.abs(file.width - mainQuality.width);\n const heightDiff = Math.abs(file.height - mainQuality.height);\n const resolutionDiff = widthDiff + heightDiff;\n\n const fileBitrate = (file.bitrate || 5000) * 1000;\n const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n\n const score = resolutionDiff * 2 + bitrateDiff / 1000;\n\n return { file, score, resolutionDiff, bitrateDiff };\n });\n\n scoredFiles.sort((a, b) => a.score - b.score);\n\n const bestMatch = scoredFiles[0];\n if (!bestMatch) {\n console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n return firstFile;\n }\n\n console.log(\"[HlsAdPlayer] Selected media file:\", {\n url: bestMatch.file.url,\n resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n bitrate: bestMatch.file.bitrate,\n score: bestMatch.score,\n resolutionDiff: bestMatch.resolutionDiff,\n bitrateDiff: bestMatch.bitrateDiff,\n });\n\n return bestMatch.file;\n }\n\n function isHlsMediaFile(mediaFile: VastMediaFile): boolean {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return (\n type === \"application/x-mpegurl\" ||\n type === \"application/vnd.apple.mpegurl\" ||\n type.includes(\"mpegurl\") ||\n url.includes(\".m3u8\")\n );\n }\n\n function isProgressiveMediaFile(mediaFile: VastMediaFile): boolean {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return (\n type.startsWith(\"video/\") ||\n url.endsWith(\".mp4\") ||\n url.includes(\".mp4?\")\n );\n }\n\n function isAudioMediaFile(mediaFile: VastMediaFile): boolean {\n const type = mediaFile.type.toLowerCase();\n const url = (mediaFile.url.toLowerCase().split(\"?\")[0] || \"\").trim();\n return (\n type.startsWith(\"audio/\") ||\n url.endsWith(\".mp3\") ||\n url.endsWith(\".aac\") ||\n url.endsWith(\".m4a\") ||\n url.endsWith(\".ogg\") ||\n url.endsWith(\".oga\") ||\n url.endsWith(\".opus\") ||\n url.endsWith(\".wav\") ||\n url.endsWith(\".weba\")\n );\n }\n\n function collectVideoMediaFiles(\n scope: Document | Element,\n verbose: boolean\n ): VastMediaFile[] {\n const mediaFileElements = scope.querySelectorAll(\"MediaFile\");\n const mediaFiles: VastMediaFile[] = [];\n\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n }\n\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n\n if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n }\n\n if (!url) {\n if (verbose) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n }\n return;\n }\n\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : undefined;\n\n const mediaFile: VastMediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : undefined,\n };\n\n if (isAudioMediaFile(mediaFile)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (audio-only, type=\"${type}\") — audio ads are not played to avoid a black screen`\n );\n return;\n }\n\n const hasExplicitDimensions =\n mf.getAttribute(\"width\") != null && mf.getAttribute(\"height\") != null;\n if (\n !isHlsMediaFile(mediaFile) &&\n hasExplicitDimensions &&\n (mediaFile.width <= 1 || mediaFile.height <= 1)\n ) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (degenerate dimensions ${mediaFile.width}x${mediaFile.height}, type=\"${type}\") — likely an audio-only placeholder rendition`\n );\n return;\n }\n\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n }\n } else if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\n\n return mediaFiles;\n }\n\n function createEmptyTrackingUrls(): VastTrackingUrls {\n return {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n mute: [],\n unmute: [],\n pause: [],\n resume: [],\n fullscreen: [],\n exitFullscreen: [],\n skip: [],\n error: [],\n };\n }\n\n function extractTrackingUrls(scope: Document | Element): VastTrackingUrls {\n const trackingUrls = createEmptyTrackingUrls();\n\n scope.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n\n scope.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event as keyof VastTrackingUrls;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n\n scope.querySelectorAll(\"Error\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.error.push(url);\n });\n\n return trackingUrls;\n }\n\n function mergeTrackingUrls(\n target: VastTrackingUrls,\n source: VastTrackingUrls\n ): VastTrackingUrls {\n (Object.keys(target) as Array<keyof VastTrackingUrls>).forEach((key) => {\n if (source[key] && source[key].length > 0) {\n target[key] = target[key].concat(source[key]);\n }\n });\n return target;\n }\n\n function parseVastXml(xmlString: string): VastParseResult {\n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n parserError.textContent\n );\n return { type: \"empty\" };\n }\n\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return { type: \"empty\" };\n }\n\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n const clickThrough = xmlDoc\n .querySelector(\"ClickThrough\")\n ?.textContent?.trim();\n\n const wrapperUri = xmlDoc\n .querySelector(\"VASTAdTagURI\")\n ?.textContent?.trim();\n if (wrapperUri) {\n console.log(\n `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n );\n return {\n type: \"wrapper\",\n vastAdTagUri: wrapperUri,\n trackingUrls: extractTrackingUrls(xmlDoc),\n clickThrough,\n };\n }\n\n const isNoAdAvailable =\n adId === \"empty\" ||\n title.toLowerCase().includes(\"no ad available\") ||\n title.toLowerCase() === \"no ad available\";\n\n const durationText =\n xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration =\n parseInt(durationParts[0] || \"0\", 10) * 3600 +\n parseInt(durationParts[1] || \"0\", 10) * 60 +\n parseInt(durationParts[2] || \"0\", 10);\n\n const mediaFiles = collectVideoMediaFiles(xmlDoc, true);\n\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n }\n return { type: \"empty\" };\n }\n\n return {\n type: \"inline\",\n ad: {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls: extractTrackingUrls(xmlDoc),\n clickThrough,\n },\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return { type: \"empty\" };\n }\n }\n\n function parseAdElement(adElement: Element): VastParseResult {\n try {\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n const clickThrough = adElement\n .querySelector(\"ClickThrough\")\n ?.textContent?.trim();\n\n const wrapperUri = adElement\n .querySelector(\"VASTAdTagURI\")\n ?.textContent?.trim();\n if (wrapperUri) {\n return {\n type: \"wrapper\",\n vastAdTagUri: wrapperUri,\n trackingUrls: extractTrackingUrls(adElement),\n clickThrough,\n };\n }\n\n const isNoAdAvailable =\n adId === \"empty\" ||\n title.toLowerCase().includes(\"no ad available\") ||\n title.toLowerCase() === \"no ad available\";\n\n const durationText =\n adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration =\n parseInt(durationParts[0] || \"0\", 10) * 3600 +\n parseInt(durationParts[1] || \"0\", 10) * 60 +\n parseInt(durationParts[2] || \"0\", 10);\n\n const mediaFiles = collectVideoMediaFiles(adElement, false);\n\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\n }\n return { type: \"empty\" };\n }\n\n return {\n type: \"inline\",\n ad: {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls: extractTrackingUrls(adElement),\n clickThrough,\n },\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", error);\n return { type: \"empty\" };\n }\n }\n\n async function fetchVastXml(\n vastTagUrl: string,\n credentials: RequestCredentials = \"include\"\n ): Promise<string> {\n const requestVast = (creds: RequestCredentials) =>\n fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: creds,\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\",\n },\n referrerPolicy: \"no-referrer-when-downgrade\",\n });\n\n let response: Response;\n try {\n response = await requestVast(credentials);\n } catch (error) {\n if (credentials !== \"omit\") {\n console.warn(\n `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n error\n );\n response = await requestVast(\"omit\");\n } else {\n throw error;\n }\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n return response.text();\n }\n\n async function fetchAndParseVastAd(\n vastTagUrl: string,\n depth = 0,\n accumulatedTracking: VastTrackingUrls = createEmptyTrackingUrls()\n ): Promise<VastAd | null> {\n const vastXml = await fetchVastXml(\n vastTagUrl,\n depth === 0 ? \"include\" : \"omit\"\n );\n console.log(\"[HlsAdPlayer] VAST XML received\");\n console.log(\n \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2000)\n );\n\n const parsed = parseVastXml(vastXml);\n\n if (parsed.type === \"empty\") {\n return null;\n }\n\n if (parsed.type === \"wrapper\") {\n if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n console.warn(\n `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n );\n return null;\n }\n\n mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n return fetchAndParseVastAd(\n parsed.vastAdTagUri,\n depth + 1,\n accumulatedTracking\n );\n }\n\n mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n return parsed.ad;\n }\n\n async function fetchAndParsePod(vastTagUrl: string): Promise<VastAd[]> {\n const vastXml = await fetchVastXml(vastTagUrl);\n console.log(\n `[HlsAdPlayer] Pod VAST XML received (length=${vastXml.length})`\n );\n\n const trimmedXml = vastXml.trim();\n if (trimmedXml.length === 0) {\n console.warn(\n \"[HlsAdPlayer] Pod VAST response body is empty (no fill)\"\n );\n return [];\n }\n\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n\n if (xmlDoc.querySelector(\"parsererror\")) {\n console.error(\n \"[HlsAdPlayer] Pod VAST XML parsing error (malformed). Content (first 2000 chars):\",\n vastXml.substring(0, 2000)\n );\n return [];\n }\n\n const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n if (adElements.length === 0) {\n console.warn(\n \"[HlsAdPlayer] No <Ad> elements found in pod VAST response (no fill). Content (first 2000 chars):\",\n vastXml.substring(0, 2000)\n );\n return [];\n }\n\n adElements.sort((a, b) => {\n const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n return aVal - bVal;\n });\n\n const ads: VastAd[] = [];\n for (const adElement of adElements) {\n const parsed = parseAdElement(adElement);\n\n if (parsed.type === \"inline\") {\n ads.push(parsed.ad);\n } else if (parsed.type === \"wrapper\") {\n try {\n const resolved = await fetchAndParseVastAd(\n parsed.vastAdTagUri,\n 1,\n parsed.trackingUrls\n );\n if (resolved) {\n ads.push(resolved);\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n error\n );\n }\n }\n }\n\n console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n return ads;\n }\n\n function createAdVideoElement(): HTMLVideoElement {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.playsInline = true;\n video.muted = false;\n\n video.volume = 1.0;\n console.log(\n `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n );\n\n return video;\n }\n\n function setupAdEventListeners(): void {\n if (!adVideoElement || !currentAd) return;\n if (adEventHandlers.length > 0) return;\n\n const onTimeUpdate: EventListener = () => {\n if (!currentAd || !adVideoElement) return;\n\n noteAdProgress();\n\n const progress = adVideoElement.currentTime / currentAd.duration;\n\n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n }\n\n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(currentAd.trackingUrls.midpoint);\n }\n\n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n }\n };\n\n const onLoadedMetadata: EventListener = () => {\n if (!adPlaying || !adVideoElement) return;\n const { videoWidth, videoHeight } = adVideoElement;\n if (videoWidth <= 1 || videoHeight <= 1) {\n console.warn(\n `[HlsAdPlayer] Ad creative has no usable video dimensions (${videoWidth}x${videoHeight}) - skipping this creative`\n );\n handleVideoDecodeFailure();\n }\n };\n\n const onPlaying: EventListener = () => {\n startStallWatchdog();\n if (!currentAd || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n };\n\n const onEnded: EventListener = () => {\n if (!currentAd || trackingFired.complete) return;\n trackingFired.complete = true;\n fireTrackingPixels(currentAd.trackingUrls.complete);\n console.log(\"[HlsAdPlayer] Ad completed\");\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdComplete();\n };\n\n const onError: EventListener = (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: toVastMediaErrorCode(adVideoElement?.error),\n });\n }\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdError();\n };\n\n const onVolumeChange: EventListener = () => {\n if (!currentAd || !adVideoElement) return;\n if (adVideoElement.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n };\n\n const onPause: EventListener = () => {\n if (currentAd && adVideoElement && !adVideoElement.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n };\n\n const onPlay: EventListener = () => {\n if (currentAd && adVideoElement && adVideoElement.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n };\n\n adEventHandlers = [\n { type: \"timeupdate\", handler: onTimeUpdate },\n { type: \"loadedmetadata\", handler: onLoadedMetadata },\n { type: \"playing\", handler: onPlaying },\n { type: \"ended\", handler: onEnded },\n { type: \"error\", handler: onError },\n { type: \"volumechange\", handler: onVolumeChange },\n { type: \"pause\", handler: onPause },\n { type: \"play\", handler: onPlay },\n ];\n\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.addEventListener(type, handler);\n }\n }\n\n function teardownAdEventListeners(): void {\n if (adVideoElement) {\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.removeEventListener(type, handler);\n }\n }\n adEventHandlers = [];\n }\n\n function setAdPlayingFlag(isPlaying: boolean): void {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n\n function resetQuartileTracking(preserveImpression: boolean): void {\n trackingFired = {\n impression: preserveImpression ? trackingFired.impression : false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n }\n\n function isRvfcSupported(video: HTMLVideoElement): boolean {\n return typeof (video as any).requestVideoFrameCallback === \"function\";\n }\n\n function settlePendingPlay(): void {\n pendingPlayPromise = undefined;\n }\n\n function startAdPlayback(context: string): void {\n if (!adVideoElement) return;\n\n const playPromise = adVideoElement.play();\n pendingPlayPromise = playPromise;\n playPromise\n .catch((error) => {\n if (pendingPlayPromise !== playPromise) {\n return;\n }\n console.error(`[HlsAdPlayer] Error starting ${context}:`, error);\n handleAdError();\n })\n .finally(() => {\n if (pendingPlayPromise === playPromise) {\n pendingPlayPromise = undefined;\n }\n });\n }\n\n function prepareVideoElementForNewSource(): void {\n settlePendingPlay();\n\n if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n if (!adVideoElement) return;\n\n try {\n adVideoElement.pause();\n adVideoElement.removeAttribute(\"src\");\n adVideoElement.load();\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error preparing ad video for new source:\",\n error\n );\n }\n }\n\n function recreateAdVideoElement(): void {\n console.log(\n \"[HlsAdPlayer] Recreating ad video element (single-decoder platform)\"\n );\n teardownAdEventListeners();\n prepareVideoElementForNewSource();\n\n if (adVideoElement) {\n try {\n adVideoElement.remove();\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error removing ad video element:\", error);\n }\n }\n\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n (contentVideo as any)[AD_VIDEO_PROP] = adVideoElement;\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n }\n\n function loadCurrentAdMedia(): void {\n if (!adVideoElement || !currentAd) {\n throw new Error(\"No ad video element or ad to load\");\n }\n\n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n\n currentAdMediaFile = mediaFile;\n\n const isHlsAd = isHlsMediaFile(mediaFile);\n console.log(\n `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n );\n\n if (isHlsAd && Hls.isSupported()) {\n if (adHls) {\n adHls.destroy();\n }\n\n adHls = new Hls({\n enableWorker: true,\n lowLatencyMode: false,\n });\n\n adHls.loadSource(mediaFile.url);\n adHls.attachMedia(adVideoElement);\n\n adHls.on(Hls.Events.MANIFEST_PARSED, () => {\n console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n startAdPlayback(\"HLS ad playback\");\n });\n\n adHls.on(Hls.Events.ERROR, (_event, data) => {\n console.error(\"[HlsAdPlayer] HLS error:\", data);\n if (data.fatal) {\n handleAdError();\n }\n });\n } else if (\n isHlsAd &&\n adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")\n ) {\n adVideoElement.src = mediaFile.url;\n startAdPlayback(\"native HLS ad playback\");\n } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n adVideoElement.src = mediaFile.url;\n adVideoElement.load();\n startAdPlayback(\"progressive ad playback\");\n } else {\n throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n }\n }\n\n function advanceToNextPodAd(): boolean {\n if (podIndex >= podAds.length - 1) {\n return false;\n }\n\n podIndex++;\n currentAd = podAds[podIndex];\n currentAdMediaFile = undefined;\n resetQuartileTracking(false);\n\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.impression);\n trackingFired.impression = true;\n console.log(\n `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n );\n }\n\n clearStallWatchdog();\n if (requiresMediaPipelineResetAfterAds()) {\n recreateAdVideoElement();\n setupAdEventListeners();\n } else {\n prepareVideoElementForNewSource();\n }\n\n try {\n loadCurrentAdMedia();\n emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n return true;\n } catch (error) {\n console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n return false;\n }\n }\n\n function clearStallWatchdog(): void {\n if (stallWatchdogId != null) {\n clearInterval(stallWatchdogId);\n stallWatchdogId = undefined;\n }\n cancelVideoFrameProbe();\n }\n\n function noteAdProgress(): void {\n lastAdProgressTime = Date.now();\n if (adVideoElement) {\n lastAdProgressPosition = adVideoElement.currentTime;\n }\n }\n\n function handleAdStall(): void {\n console.warn(\n \"[HlsAdPlayer] Ad playback stalled (no progress) - recovering to avoid a blank frame\"\n );\n clearStallWatchdog();\n\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: VAST_ERROR_MEDIA_DISPLAY,\n });\n }\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdError();\n }\n\n function getDecodedVideoFrameCount(\n video: HTMLVideoElement\n ): number | undefined {\n try {\n if (typeof video.getVideoPlaybackQuality === \"function\") {\n const quality = video.getVideoPlaybackQuality();\n if (quality && typeof quality.totalVideoFrames === \"number\") {\n return quality.totalVideoFrames;\n }\n }\n const legacyCount = (video as any).webkitDecodedFrameCount;\n if (typeof legacyCount === \"number\") {\n return legacyCount;\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Unable to read decoded video frame count:\",\n error\n );\n }\n return undefined;\n }\n\n function isFrameCounterReliable(): boolean {\n return (contentVideo as any)[FRAME_COUNTER_RELIABLE_PROP] === true;\n }\n\n function markFrameCounterReliable(): void {\n (contentVideo as any)[FRAME_COUNTER_RELIABLE_PROP] = true;\n }\n\n function isRvfcReliable(): boolean {\n return (contentVideo as any)[RVFC_RELIABLE_PROP] === true;\n }\n\n function markRvfcReliable(): void {\n (contentVideo as any)[RVFC_RELIABLE_PROP] = true;\n }\n\n function cancelVideoFrameProbe(): void {\n if (\n videoFrameCallbackHandle != null &&\n adVideoElement &&\n typeof (adVideoElement as any).cancelVideoFrameCallback === \"function\"\n ) {\n try {\n (adVideoElement as any).cancelVideoFrameCallback(\n videoFrameCallbackHandle\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error cancelling video frame callback:\",\n error\n );\n }\n }\n videoFrameCallbackHandle = undefined;\n }\n\n function startVideoFrameProbe(): void {\n cancelVideoFrameProbe();\n if (!adVideoElement) return;\n\n const rvfc = (adVideoElement as any).requestVideoFrameCallback;\n if (typeof rvfc !== \"function\") return;\n\n const onPresentedFrame = () => {\n videoFrameCallbackHandle = undefined;\n if (!adPlaying) return;\n sawDecodedVideoFrame = true;\n markRvfcReliable();\n };\n\n try {\n videoFrameCallbackHandle = rvfc.call(\n adVideoElement,\n onPresentedFrame\n ) as number;\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error requesting video frame callback:\",\n error\n );\n videoFrameCallbackHandle = undefined;\n }\n }\n\n function handleVideoDecodeFailure(): void {\n console.warn(\n \"[HlsAdPlayer] Ad audio is advancing but no video frames decoded (black screen) - skipping this creative\"\n );\n clearStallWatchdog();\n\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: VAST_ERROR_MEDIA_DISPLAY,\n });\n }\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdError();\n }\n\n function startStallWatchdog(): void {\n clearStallWatchdog();\n noteAdProgress();\n sawDecodedVideoFrame = false;\n startVideoFrameProbe();\n\n const blackFrameDetectionEnabled = !requiresMediaPipelineResetAfterAds();\n\n stallWatchdogId = window.setInterval(() => {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n\n if (\n blackFrameDetectionEnabled &&\n !sawDecodedVideoFrame &&\n !adVideoElement.paused\n ) {\n const decodedFrames = getDecodedVideoFrameCount(adVideoElement);\n if (decodedFrames !== undefined && decodedFrames > 0) {\n sawDecodedVideoFrame = true;\n markFrameCounterReliable();\n } else if (adVideoElement.currentTime >= BLACKFRAME_MIN_PLAYBACK_S) {\n const timeAdvancing =\n adVideoElement.currentTime > lastAdProgressPosition + 0.05;\n\n if (\n isRvfcSupported(adVideoElement) &&\n timeAdvancing &&\n isRvfcReliable()\n ) {\n handleVideoDecodeFailure();\n return;\n }\n\n if (\n decodedFrames === 0 &&\n timeAdvancing &&\n isFrameCounterReliable()\n ) {\n handleVideoDecodeFailure();\n return;\n }\n }\n }\n\n if (adVideoElement.currentTime > lastAdProgressPosition + 0.05) {\n noteAdProgress();\n return;\n }\n\n if (adVideoElement.paused) {\n noteAdProgress();\n return;\n }\n\n if (Date.now() - lastAdProgressTime >= STALL_TIMEOUT_MS) {\n handleAdStall();\n }\n }, STALL_CHECK_INTERVAL_MS) as unknown as number;\n }\n\n function releaseAdDecoder(): void {\n prepareVideoElementForNewSource();\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }\n\n function handleAdComplete(): void {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n\n releaseAdDecoder();\n\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n \n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode:\", error);\n });\n } else {\n console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n }\n }\n\n emit(\"content_resume\");\n }\n\n function handleAdError(): void {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n\n releaseAdDecoder();\n\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n\n emit(\"ad_error\");\n }\n\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\n\n // Reuse the persistent container across ad-player instances if present.\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n (contentVideo as any)[AD_CONTAINER_PROP] = adContainerEl;\n },\n\n async requestAds(vastTagUrl: string) {\n console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n\n if (adPlaying) {\n console.warn(\n \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n );\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n\n try {\n let ads: VastAd[] = [];\n\n if (preloadedAds.has(vastTagUrl)) {\n const preloaded = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n if (preloaded) {\n ads = [preloaded];\n }\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ads = await fetchAndParsePod(vastTagUrl);\n }\n\n if (!ads.length) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.reject(new Error(\"No ads available from VAST response\"));\n }\n\n podAds = ads;\n podIndex = 0;\n currentAd = ads[0];\n currentAdMediaFile = undefined;\n console.log(\n `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n );\n\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.impression);\n trackingFired.impression = true;\n }\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n async play() {\n if (!currentAd) {\n console.warn(\n \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n );\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n\n console.log(\"[HlsAdPlayer] Starting ad playback\");\n\n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n (contentVideo as any)[AD_VIDEO_PROP] = adVideoElement;\n }\n setupAdEventListeners();\n\n resetQuartileTracking(true);\n\n const contentVolume = contentVideo.volume;\n originalVolume = Math.max(\n 0,\n Math.min(1, contentVolume || originalVolume)\n );\n\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.pause();\n console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n } else {\n console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n }\n\n console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n contentVideo.muted = true;\n adPlaying = true;\n setAdPlayingFlag(true);\n\n if (adVideoElement) {\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n console.log(\n `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n );\n }\n\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n\n emit(\"content_pause\");\n\n loadCurrentAdMedia();\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {});\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n }\n },\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n console.log(\n `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n );\n\n releaseAdDecoder();\n\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode on stop:\", error);\n });\n }\n }\n\n currentAd = undefined;\n currentAdMediaFile = undefined;\n podAds = [];\n podIndex = 0;\n },\n\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\n clearStallWatchdog();\n\n for (const timeoutId of pendingTimeouts) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts = [];\n \n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n\n teardownAdEventListeners();\n releaseAdDecoder();\n\n currentAd = undefined;\n currentAdMediaFile = undefined;\n podAds = [];\n podIndex = 0;\n listeners.clear();\n preloadedAds.clear();\n preloadingAds.clear();\n },\n\n isAdPlaying() {\n return adPlaying;\n },\n\n resize(width: number, height: number) {\n console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n\n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n\n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n\n on(event: string, listener: (payload?: any) => void) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(listener);\n },\n\n off(event: string, listener: (payload?: any) => void) {\n listeners.get(event)?.delete(listener);\n },\n\n updateOriginalMutedState(muted: boolean, volume?: number) {\n const nextVolume =\n typeof volume === \"number\" && !Number.isNaN(volume)\n ? Math.max(0, Math.min(1, volume))\n : originalVolume;\n console.log(\n `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n );\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n\n setAdVolume(volume: number) {\n if (adVideoElement && adPlaying) {\n const clamped = Math.max(0, Math.min(1, volume));\n adVideoElement.volume = clamped;\n adVideoElement.muted = clamped === 0;\n }\n },\n\n getAdVolume(): number {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n showPlaceholder() {\n contentVideo.style.opacity = \"0\";\n contentVideo.style.visibility = \"hidden\";\n \n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl && !adPlaying) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n\n if (!adPlaying) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n },\n getLoadedAdDuration() {\n return currentAd?.duration;\n },\n getLoadedAdId() {\n return currentAd?.id;\n },\n getPodAdCount() {\n return podAds.length;\n },\n getPodTotalDurationMs() {\n return podAds.reduce(\n (total, ad) => total + (ad.duration > 0 ? ad.duration * 1000 : 0),\n 0\n );\n },\n };\n}\n","interface NavigatorUAData {\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n mobile?: boolean;\n}\n\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData;\n }\n}\n\nexport interface BrowserInfo {\n name: string;\n version: string;\n majorVersion: number;\n isSmartTV: boolean;\n isLegacyTV: boolean;\n platform: string;\n supportsModernJS: boolean;\n webOSVersion?: number | undefined;\n tizenVersion?: number | undefined;\n chromeVersion?: number | undefined;\n}\n\nfunction getChromeVersion(ua: string): number {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n }\n if (/Win/i.test(ua)) {\n return 'Win32';\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n }\n if (/CrOS/i.test(ua)) {\n return 'CrOS';\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n\n let name = 'Unknown';\n let version = '0';\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS = true;\n let webOSVersion: number | undefined;\n let tizenVersion: number | undefined;\n let chromeVersionNum: number | undefined;\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : undefined;\n\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n\n if (match && match[1]) {\n version = match[1];\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = '6.0';\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = '5.0';\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = '4.0';\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = '3.0';\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = '2.0';\n majorVersion = 2;\n }\n } else {\n version = 'Unknown';\n webOSVersion = undefined;\n }\n\n isLegacyTV = webOSVersion !== undefined && webOSVersion < 3;\n } else if (/Tizen/i.test(ua)) {\n name = 'Samsung Tizen';\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n\n isLegacyTV = tizenVersion !== undefined && tizenVersion < 3;\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else {\n if (chromeVersion > 0) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n\n if (chromeVersion < 50) {\n supportsModernJS = false;\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n }\n }\n\n if (typeof Promise === 'undefined' ||\n typeof Map === 'undefined' ||\n typeof Set === 'undefined') {\n supportsModernJS = false;\n }\n\n if (typeof URLSearchParams === 'undefined') {\n supportsModernJS = false;\n }\n\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum,\n };\n}\n\nexport function requiresMediaPipelineResetAfterAds(): boolean {\n const browser = detectBrowser();\n return browser.name === 'Samsung Tizen' && (browser.tizenVersion ?? 0) >= 5;\n}\n\nexport function getBrowserConfigOverrides(): {\n allowNativeHls?: boolean;\n pauseContentDuringAds?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: {\n allowNativeHls?: boolean;\n pauseContentDuringAds?: boolean;\n } = {};\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n overrides.pauseContentDuringAds = true;\n }\n\n return overrides;\n}\n\nexport function supportsModernJS(): boolean {\n try {\n return (\n typeof Promise !== 'undefined' &&\n typeof Map !== 'undefined' &&\n typeof Set !== 'undefined' &&\n typeof Array.from !== 'undefined' &&\n typeof Object.assign !== 'undefined' &&\n typeof Array.prototype.forEach !== 'undefined' &&\n typeof String.prototype.includes !== 'undefined'\n );\n } catch (e) {\n return false;\n }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n if (!debug) return;\n\n const browser = detectBrowser();\n\n console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n ...(browser.webOSVersion !== undefined ? { webOSVersion: browser.webOSVersion } : {}),\n ...(browser.tizenVersion !== undefined ? { tizenVersion: browser.tizenVersion } : {}),\n ...(browser.chromeVersion !== undefined ? { chromeVersion: browser.chromeVersion } : {}),\n userAgent: navigator.userAgent,\n });\n}\n\nexport function supportsFeature(feature: string): boolean {\n switch (feature) {\n case 'urlsearchparams':\n return typeof URLSearchParams !== 'undefined';\n case 'textencoder':\n return typeof TextEncoder !== 'undefined';\n case 'promises':\n return typeof Promise !== 'undefined';\n case 'fetch':\n return typeof fetch !== 'undefined';\n case 'crypto':\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n default:\n return false;\n }\n}\n","export interface VastTrackingMacroContext {\n adPlayheadSeconds?: number | undefined;\n contentPlayheadSeconds?: number | undefined;\n assetUri?: string | undefined;\n mediaMime?: string | undefined;\n playerWidth?: number | undefined;\n playerHeight?: number | undefined;\n errorCode?: number | string | undefined;\n deviceId?: string | undefined;\n deviceIdType?: string | undefined;\n limitAdTracking?: boolean | undefined;\n pageUrl?: string | undefined;\n clientUa?: string | undefined;\n podSequence?: number | undefined;\n}\n\nconst VAST_MACRO_PATTERN = /\\[([A-Z][A-Z0-9_]*)\\]/g;\n\nconst CACHEBUSTING_ALIASES =\n /\\[CACHEBUSTER\\]|\\[cachebuster\\]|\\[timestamp\\]|\\[random\\]|\\[INSERT_RANDOM_NUMBER\\]|%%CACHEBUSTER%%|%%CACHEBUST%%|\\$\\{CACHEBUSTER\\}|\\$\\{CACHEBUSTING\\}|\\{cachebuster\\}|\\{random\\}/g;\n\nconst KNOWN_VAST_MACROS = new Set([\n \"ADCATEGORIES\",\n \"ADCOUNT\",\n \"ADPLAYHEAD\",\n \"ADSERVINGID\",\n \"ADTYPE\",\n \"APIFRAMEWORKS\",\n \"APPBUNDLE\",\n \"ASSETURI\",\n \"BLOCKEDADCATEGORIES\",\n \"BREAKMAXADLENGTH\",\n \"BREAKMAXADS\",\n \"BREAKMAXDURATION\",\n \"BREAKMINADLENGTH\",\n \"BREAKPOSITION\",\n \"CACHEBUSTING\",\n \"CLICKPOS\",\n \"CLICKTYPE\",\n \"CLIENTUA\",\n \"CONTENTID\",\n \"CONTENTPLAYHEAD\",\n \"CONTENTURI\",\n \"DEVICEIP\",\n \"DEVICEUA\",\n \"DOMAIN\",\n \"ERRORCODE\",\n \"EXTENSIONS\",\n \"GDPRCONSENT\",\n \"IFA\",\n \"IFATYPE\",\n \"INVENTORYSTATE\",\n \"LATLONG\",\n \"LIMITADTRACKING\",\n \"MEDIAMIME\",\n \"MEDIAPLAYHEAD\",\n \"OMIDPARTNER\",\n \"PAGEURL\",\n \"PLACEMENTTYPE\",\n \"PLAYERCAPABILITIES\",\n \"PLAYERSIZE\",\n \"PLAYERSTATE\",\n \"PODSEQUENCE\",\n \"REGULATIONS\",\n \"SERVERSIDE\",\n \"SERVERUA\",\n \"TIMESTAMP\",\n \"TRANSACTIONID\",\n \"UNIVERSALADID\",\n \"VASTVERSIONS\",\n \"VERIFICATIONVENDORS\",\n]);\n\nexport function generateCachebuster(): string {\n return String(Math.floor(Math.random() * 90000000) + 10000000);\n}\n\nfunction formatPlayhead(seconds: number | undefined): string | undefined {\n if (seconds == null || !Number.isFinite(seconds) || seconds < 0) {\n return undefined;\n }\n const total = Math.floor(seconds);\n const hh = String(Math.floor(total / 3600)).padStart(2, \"0\");\n const mm = String(Math.floor((total % 3600) / 60)).padStart(2, \"0\");\n const ss = String(total % 60).padStart(2, \"0\");\n const ms = String(Math.floor((seconds - total) * 1000)).padStart(3, \"0\");\n return `${hh}:${mm}:${ss}.${ms}`;\n}\n\nfunction resolveMacroValues(\n ctx: VastTrackingMacroContext\n): Map<string, string> {\n const values = new Map<string, string>();\n const set = (key: string, value: string | undefined) => {\n if (value != null && value !== \"\") values.set(key, value);\n };\n\n const adPlayhead = formatPlayhead(ctx.adPlayheadSeconds);\n set(\"ADPLAYHEAD\", adPlayhead);\n set(\"MEDIAPLAYHEAD\", adPlayhead);\n set(\"CONTENTPLAYHEAD\", formatPlayhead(ctx.contentPlayheadSeconds));\n\n set(\"ASSETURI\", ctx.assetUri);\n set(\"MEDIAMIME\", ctx.mediaMime);\n set(\"TIMESTAMP\", new Date().toISOString());\n set(\"SERVERSIDE\", \"0\");\n\n if (ctx.errorCode != null && ctx.errorCode !== \"\") {\n set(\"ERRORCODE\", String(ctx.errorCode));\n }\n\n if (ctx.playerWidth != null && ctx.playerHeight != null) {\n set(\"PLAYERSIZE\", `${Math.round(ctx.playerWidth)},${Math.round(ctx.playerHeight)}`);\n }\n\n set(\"IFA\", ctx.deviceId);\n set(\"IFATYPE\", ctx.deviceIdType);\n if (ctx.limitAdTracking != null) {\n set(\"LIMITADTRACKING\", ctx.limitAdTracking ? \"1\" : \"0\");\n }\n\n set(\"PAGEURL\", ctx.pageUrl);\n if (ctx.pageUrl) {\n try {\n set(\"DOMAIN\", new URL(ctx.pageUrl).hostname);\n } catch {}\n }\n\n set(\"CLIENTUA\", ctx.clientUa);\n set(\"DEVICEUA\", ctx.clientUa);\n\n if (ctx.podSequence != null) {\n set(\"PODSEQUENCE\", String(ctx.podSequence));\n }\n\n return values;\n}\n\nexport function substituteVastTrackingMacros(\n url: string,\n ctx: VastTrackingMacroContext = {}\n): string {\n if (!url) return url;\n\n const values = resolveMacroValues(ctx);\n\n return url\n .replace(CACHEBUSTING_ALIASES, () => generateCachebuster())\n .replace(VAST_MACRO_PATTERN, (match, name: string) => {\n if (name === \"CACHEBUSTING\") return generateCachebuster();\n\n const value = values.get(name);\n if (value != null) return encodeURIComponent(value);\n\n return KNOWN_VAST_MACROS.has(name) ? \"\" : match;\n });\n}\n","const PRIVATE_HOST_PATTERNS: RegExp[] = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/,\n];\n\nexport function isLocalDevHost(hostname: string): boolean {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\n\nexport function toDevSafeUrl(rawUrl: string | undefined): string {\n if (!rawUrl) return rawUrl ?? \"\";\n\n let url: URL;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n","import { toDevSafeUrl } from \"../utils/devUrl\";\n\ndeclare global {\n interface Window {\n goog?: any;\n }\n}\n\nconst PAL_SDK_URL =\n \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\n\nlet _nonceLoader: any | undefined;\nlet _palLoadPromise: Promise<void> | undefined;\n\nfunction loadPalSdk(): Promise<void> {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n\n if (_palLoadPromise) return _palLoadPromise;\n\n _palLoadPromise = new Promise<void>((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n ) as HTMLScriptElement | null;\n\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 10000\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n\n return _palLoadPromise;\n}\n\nfunction getOrCreateNonceLoader(): any {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\n\nexport interface PalNonceOptions {\n videoWidth?: number;\n videoHeight?: number;\n descriptionUrl?: string;\n ppid?: string;\n sessionId?: string;\n adWillAutoPlay?: boolean;\n adWillPlayMuted?: boolean;\n playerVolume?: number;\n continuousPlayback?: boolean;\n}\n\nexport interface PalNonceManager {\n generateNonce(options?: PalNonceOptions): Promise<string>;\n\n getCurrentNonce(): string;\n\n injectNonce(vastTagUrl: string): string;\n\n sendPlaybackStart(): void;\n\n sendPlaybackEnd(): void;\n\n sendAdClick(): void;\n\n sendAdTouch(event: MouseEvent | TouchEvent): void;\n\n reset(): void;\n}\n\nexport function createPalNonceManager(): PalNonceManager {\n let currentNonce = \"\";\n let currentNonceManager: any | undefined;\n\n return {\n async generateNonce(options: PalNonceOptions = {}): Promise<string> {\n try {\n await loadPalSdk();\n\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume =\n options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId,\n }, null, 2)\n );\n\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce() as string;\n\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = undefined;\n return \"\";\n }\n },\n\n getCurrentNonce(): string {\n return currentNonce;\n },\n\n injectNonce(vastTagUrl: string): string {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl\n .replace(/([?&])paln=[^&]*/g, \"\")\n .replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n\n sendPlaybackStart(): void {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {}\n },\n\n sendPlaybackEnd(): void {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {}\n },\n\n sendAdClick(): void {\n try {\n currentNonceManager?.sendAdClick();\n } catch {}\n },\n\n sendAdTouch(event: MouseEvent | TouchEvent): void {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {}\n },\n\n reset(): void {\n currentNonce = \"\";\n currentNonceManager = undefined;\n },\n };\n}\n","export type TrackingIngestChannel = \"metrics\" | \"impressions\" | \"heartbeat\";\n\nexport type TrackingIngestConfig = {\n enabled: boolean;\n baseUrl: string;\n};\n\nexport const DEFAULT_TRACKING_INGEST_CONFIG: TrackingIngestConfig = {\n enabled: true,\n baseUrl:\n \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\",\n};\n\nexport const trackingIngestConfig: TrackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG,\n};\n\nexport function applyTrackingIngestConfig(\n overrides: Partial<TrackingIngestConfig>\n): void {\n Object.assign(trackingIngestConfig, overrides);\n}\n\nexport function configureTrackingIngest(\n overrides: Partial<TrackingIngestConfig>\n): void {\n applyTrackingIngestConfig(overrides);\n}\n\nexport function isTrackingIngestEnabled(): boolean {\n return trackingIngestConfig.enabled === true;\n}\n\nfunction normalizeIngestBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nexport function buildTrackingIngestUrl(channel: TrackingIngestChannel): string {\n const base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);\n if (channel === \"impressions\") {\n return `${base}/impressions/ingest`;\n }\n return `${base}/metrics/ingest`;\n}\n\nexport async function ingestPlayerTracking(\n licenseKey: string,\n channel: TrackingIngestChannel,\n body: Record<string, unknown>\n): Promise<boolean> {\n if (!isTrackingIngestEnabled() || !licenseKey) {\n return false;\n }\n\n try {\n const response = await fetch(buildTrackingIngestUrl(channel), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `License-Key ${licenseKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest failed (${response.status}) for ${channel}`\n );\n return false;\n }\n\n return true;\n } catch (error) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest error for ${channel}:`,\n error\n );\n return false;\n }\n}\n","export interface VastEnvironmentSignals {\n isCtv: boolean;\n sessionId?: string;\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n deviceTypeHint?: number;\n}\n\nconst CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nexport const PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\n\nconst DEVICE_ID_STORAGE_KEYS = [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"advertising_id\",\n \"deviceAdvertisingId\",\n \"aaid\",\n \"adid\",\n \"rida\",\n \"tifa\",\n \"lgudid\",\n];\n\nconst ANDROID_ID_TYPES = new Set([\"aaid\", \"adid\"]);\n\nexport function resolveVastEnvironmentSignals(isCtv: boolean): VastEnvironmentSignals {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n\n const realDeviceId =\n bridgeSignals.deviceId ||\n readStoredDeviceId() ||\n platformDevice.deviceId;\n\n let deviceId = realDeviceId;\n let deviceIdType =\n bridgeSignals.deviceIdType ||\n readStoredString(\"deviceIdType\") ||\n readStoredString(\"idtype\") ||\n platformDevice.deviceIdType ||\n inferDeviceIdType();\n\n const platformLat = bridgeSignals.deviceId\n ? bridgeSignals.limitAdTracking\n : platformDevice.limitAdTracking;\n let limitAdTracking =\n deviceId != null\n ? platformLat ?? readStoredLimitAdTracking() ?? false\n : undefined;\n\n if (!deviceId && isCtv) {\n const dpid = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (dpid) {\n deviceId = dpid;\n deviceIdType = \"dpid\";\n limitAdTracking = platformLat ?? readStoredLimitAdTracking() ?? false;\n }\n }\n\n if (isCtv) {\n return {\n isCtv: true,\n sessionId: getOrCreateCtvSessionId(),\n ...(deviceId ? { deviceId } : {}),\n ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n deviceTypeHint: 5,\n };\n }\n\n return {\n isCtv: false,\n ...(deviceId ? { deviceId } : {}),\n ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n };\n}\n\nexport function inferDeviceIdType(): string | undefined {\n if (typeof navigator === \"undefined\") {\n return undefined;\n }\n\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return undefined;\n}\n\nexport function isEquivalentDeviceIdType(\n tagType: string | undefined,\n runtimeType: string | undefined\n): boolean {\n if (!tagType || !runtimeType) return false;\n const tag = tagType.toLowerCase();\n const runtime = runtimeType.toLowerCase();\n if (tag === runtime) return true;\n return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\n\nexport function resolveNativeDeviceId(): string | undefined {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const deviceId =\n bridgeSignals.deviceId ||\n readStoredDeviceId() ||\n platformDevice.deviceId;\n\n if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n return undefined;\n }\n\n return deviceId;\n}\n\nexport function getOrCreateStoredUuid(storageKey: string): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n const existing = readPersistentId(storageKey);\n if (existing) {\n writePersistentId(storageKey, existing);\n return existing;\n }\n\n const id = createUuid();\n writePersistentId(storageKey, id);\n return id;\n}\n\nfunction getOrCreateCtvSessionId(): string {\n const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n if (existing) {\n writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n return existing;\n }\n\n const sessionId = createUuid();\n writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n return sessionId;\n}\n\nfunction readPersistentId(storageKey: string): string | undefined {\n return readStoredString(storageKey) || readCookie(storageKey);\n}\n\nfunction writePersistentId(storageKey: string, value: string): void {\n try {\n window.localStorage?.setItem(storageKey, value);\n } catch {}\n writeCookie(storageKey, value);\n}\n\nconst PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5; // ~5 years\n\nfunction readCookie(name: string): string | undefined {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n try {\n const prefix = encodeURIComponent(name) + \"=\";\n const parts = document.cookie ? document.cookie.split(\";\") : [];\n for (const part of parts) {\n const entry = part.trim();\n if (entry.startsWith(prefix)) {\n return decodeURIComponent(entry.slice(prefix.length)) || undefined;\n }\n }\n } catch {}\n\n return undefined;\n}\n\nfunction writeCookie(name: string, value: string): void {\n if (typeof document === \"undefined\") {\n return;\n }\n\n try {\n document.cookie =\n encodeURIComponent(name) +\n \"=\" +\n encodeURIComponent(value) +\n \";path=/;max-age=\" +\n PERSISTENT_ID_COOKIE_MAX_AGE +\n \";SameSite=Lax\";\n } catch {}\n}\n\nfunction createUuid(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n const bytes = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(bytes);\n } else {\n let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n for (let i = 0; i < 16; i++) {\n seed = (seed * 1103515245 + 12345) & 0x7fffffff;\n bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 0xff;\n }\n }\n\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n\n let hex = \"\";\n for (let i = 0; i < 16; i++) {\n hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n }\n\n return (\n hex.slice(0, 8) +\n \"-\" +\n hex.slice(8, 12) +\n \"-\" +\n hex.slice(12, 16) +\n \"-\" +\n hex.slice(16, 20) +\n \"-\" +\n hex.slice(20, 32)\n );\n}\n\nfunction performanceNow(): number {\n try {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n } catch {}\n return 0;\n}\n\nfunction readPlatformNativeDeviceId(): {\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n} {\n if (typeof window === \"undefined\") return {};\n\n try {\n const adinfo = (window as any).webapis?.adinfo;\n if (adinfo) {\n const tifa: unknown =\n typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n const lat: unknown =\n typeof adinfo.isLATEnabled === \"function\"\n ? adinfo.isLATEnabled()\n : undefined;\n return {\n deviceId: tifa,\n deviceIdType: \"tifa\",\n ...(typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}),\n };\n }\n }\n } catch {}\n\n try {\n const webOSDev = (window as any).webOSDev;\n if (webOSDev) {\n const lgudid: unknown =\n typeof webOSDev.LGUDID === \"function\"\n ? webOSDev.LGUDID()\n : webOSDev.lgudid ?? webOSDev.LGUDID;\n if (typeof lgudid === \"string\" && lgudid) {\n if (isZeroedAdId(lgudid)) {\n return { deviceIdType: \"lgudid\", limitAdTracking: true };\n }\n if (!isMacroPlaceholder(lgudid)) {\n return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n }\n }\n }\n } catch {}\n\n try {\n const roku = (window as any).Roku;\n if (roku) {\n const rida: unknown =\n typeof roku.getPublisherUniqueId === \"function\"\n ? roku.getPublisherUniqueId()\n : roku.rida;\n if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n }\n }\n } catch {}\n\n return {};\n}\n\nconst ZEROED_AD_ID_PATTERNS: ReadonlySet<string> = new Set([\n \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n \"00000000-0000-0000-0000-000000000000\",\n]);\n\nfunction isMacroPlaceholder(value: string): boolean {\n const t = value.trim();\n return !t ||\n /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) ||\n /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) ||\n ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\n\nfunction isZeroedAdId(value: string): boolean {\n return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\n\nfunction readNativeBridgeSignals(): {\n contentUrl?: string;\n appId?: string;\n appName?: string;\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n} {\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const candidates = [\n (window as any).__STORMCLOUD_CTV_AD_INFO__,\n (window as any).__STORMCLOUD_CTV__,\n (window as any).stormcloudCtv,\n (window as any).AiryTV,\n (window as any).Android,\n (window as any).webOS,\n (window as any).tizen,\n (window as any).amazon,\n ].filter(Boolean);\n\n for (const source of candidates) {\n const contentUrl =\n readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) ||\n undefined;\n const appId =\n readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) ||\n undefined;\n const appName =\n readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || undefined;\n const deviceId =\n readBridgeValue(source, [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"adId\",\n \"deviceId\",\n \"lgudid\",\n \"LGUDID\",\n \"tifa\",\n \"rida\",\n \"afai\",\n \"aaid\",\n ]) || undefined;\n\n if (!contentUrl && !deviceId && !appId && !appName) continue;\n\n const deviceIdType =\n readBridgeValue(source, [\n \"idtype\",\n \"deviceIdType\",\n \"advertisingIdType\",\n \"idType\",\n ]) || inferDeviceIdType();\n const limitAdTracking = readBridgeBoolean(source, [\n \"is_lat\",\n \"limitAdTracking\",\n \"limitedAdTracking\",\n \"lat\",\n ]);\n\n return {\n ...(contentUrl ? { contentUrl } : {}),\n ...(appId ? { appId } : {}),\n ...(appName ? { appName } : {}),\n ...(deviceId ? { deviceId } : {}),\n ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n };\n }\n\n return {};\n}\n\nfunction readBridgeValue(source: any, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = source?.[key];\n if (typeof value === \"string\" && value) {\n return value;\n }\n if (typeof value === \"function\") {\n try {\n const result = value.call(source);\n if (typeof result === \"string\" && result) {\n return result;\n }\n } catch {}\n }\n }\n return undefined;\n}\n\nfunction readBridgeBoolean(source: any, keys: string[]): boolean | undefined {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeBoolean(value);\n if (normalized != null) {\n return normalized;\n }\n if (typeof value === \"function\") {\n try {\n const result = normalizeBoolean(value.call(source));\n if (result != null) {\n return result;\n }\n } catch {}\n }\n }\n return undefined;\n}\n\nfunction readStoredDeviceId(): string | undefined {\n for (const key of DEVICE_ID_STORAGE_KEYS) {\n const value = readStoredString(key);\n if (value) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction readStoredString(key: string): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n try {\n const value = window.localStorage?.getItem(key);\n return value || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readStoredLimitAdTracking(): boolean | undefined {\n return normalizeBoolean(\n readStoredString(\"limitAdTracking\") ||\n readStoredString(\"limitedAdTracking\") ||\n readStoredString(\"is_lat\")\n );\n}\n\nfunction normalizeBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n }\n return undefined;\n}\n","import type {\n ClientInfo,\n AdDetectInfo,\n AdLoadedInfo,\n AdImpressionInfo,\n PlayerAnalyticsContext,\n StormcloudVideoPlayerConfig,\n} from \"../types\";\n\nimport {\n ingestPlayerTracking,\n isTrackingIngestEnabled,\n} from \"./trackingIngest\";\nimport {\n getOrCreateStoredUuid,\n PLAYER_ID_STORAGE_KEY,\n resolveNativeDeviceId,\n} from \"./vastEnvironmentSignals\";\n\nlet cachedBrowserId: string | null = null;\n\nexport function buildAnalyticsContext(\n config: Pick<StormcloudVideoPlayerConfig, \"debugAdTiming\" | \"isLiveStream\">\n): PlayerAnalyticsContext {\n const context: PlayerAnalyticsContext = {};\n if (config.debugAdTiming) {\n context.debugAdTiming = true;\n }\n if (config.isLiveStream !== undefined) {\n context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n }\n return context;\n}\n\nexport function getClientInfo(): ClientInfo {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = (navigator as any).deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: (screen?.orientation as any)?.type || \"\",\n pixelDepth: screen?.pixelDepth,\n };\n\n let deviceType: \"tv\" | \"mobile\" | \"tablet\" | \"desktop\" = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch\n ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim()\n : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))\n ) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"NetCast\") || ua.includes(\"LG\"))\n ) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n\n if (\n ua.includes(\"Android\") &&\n (maxTouchPoints === 0 ||\n ua.includes(\"Google TV\") ||\n ua.includes(\"XiaoMi\"))\n ) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n\n isWebApp =\n window.matchMedia(\"(display-mode: standalone)\").matches ||\n (window.navigator as any).standalone === true ||\n window.screen?.orientation?.angle !== undefined;\n\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState,\n };\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n\n let encodedData: BufferSource;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(input);\n } else {\n const utf8 = unescape(encodeURIComponent(input));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n return Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n\n return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\n\nfunction resolvePlayerIdentitySeed(clientInfo: ClientInfo): string {\n const nativeDeviceId = resolveNativeDeviceId();\n if (nativeDeviceId) {\n return `device:${nativeDeviceId}`;\n }\n\n const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (persistedId) {\n return `persisted:${persistedId}`;\n }\n\n return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\n\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n\n cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n return cachedBrowserId;\n}\n\ntype PlayerMetricFlags = {\n adLoaded?: boolean;\n adDetect?: boolean;\n captureAt?: string;\n};\n\nfunction canPublish(licenseKey: string | undefined): licenseKey is string {\n return Boolean(isTrackingIngestEnabled() && licenseKey);\n}\n\nasync function buildPlayerMetricEvent(\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<Record<string, unknown>> {\n const clientInfo = getClientInfo();\n\n const debugAdTiming = !!context.debugAdTiming;\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n }\n\n const playerId = await getBrowserID(clientInfo);\n\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n }\n\n const captureAt = flags.captureAt ?? new Date().toISOString();\n\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...(context.inputStreamType\n ? { input_stream_type: context.inputStreamType }\n : {}),\n };\n}\n\nexport async function sendInitialTracking(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n if (!canPublish(licenseKey)) return;\n\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n adLoaded: false,\n adDetect: false,\n });\n\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent],\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendAdDetectTracking(\n licenseKey: string | undefined,\n adDetectInfo: AdDetectInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdLoadedTracking(\n licenseKey: string | undefined,\n adLoadedInfo: AdLoadedInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdImpressionTracking(\n licenseKey: string | undefined,\n adImpressionInfo: AdImpressionInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n if (!canPublish(licenseKey)) return;\n\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp,\n });\n\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent],\n });\n await ingestPlayerTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp,\n },\n ],\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<void> {\n if (!canPublish(licenseKey)) return;\n\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [heartbeatData],\n });\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n","export function polyfillURLSearchParams(): void {\n if (typeof URLSearchParams !== 'undefined') {\n return;\n }\n\n class URLSearchParamsPolyfill {\n private params: Map<string, string[]>;\n\n constructor(init?: string | URLSearchParamsPolyfill) {\n this.params = new Map();\n\n if (typeof init === 'string') {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n\n private parseQueryString(query: string): void {\n const cleanQuery = query.startsWith('?') ? query.slice(1) : query;\n if (!cleanQuery) return;\n\n cleanQuery.split('&').forEach((param) => {\n const [key, value] = param.split('=');\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : '';\n this.append(decodedKey, decodedValue);\n }\n });\n }\n\n private safeDecodeURIComponent(str: string): string {\n try {\n return decodeURIComponent(str.replace(/\\+/g, ' '));\n } catch (e) {\n return str;\n }\n }\n\n append(name: string, value: string): void {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n\n delete(name: string): void {\n this.params.delete(name);\n }\n\n get(name: string): string | null {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== undefined ? values[0] : null;\n }\n\n getAll(name: string): string[] {\n return this.params.get(name) || [];\n }\n\n has(name: string): boolean {\n return this.params.has(name);\n }\n\n set(name: string, value: string): void {\n this.params.set(name, [String(value)]);\n }\n\n forEach(callback: (value: string, key: string, parent: URLSearchParamsPolyfill) => void): void {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n\n toString(): string {\n const parts: string[] = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join('&');\n }\n }\n\n // @ts-ignore\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\n\nexport function polyfillTextEncoder(): void {\n if (typeof TextEncoder !== 'undefined') {\n return;\n }\n\n class TextEncoderPolyfill {\n encoding = 'utf-8';\n\n encode(str: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 0x80) {\n utf8.push(charcode);\n } else if (charcode < 0x800) {\n utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n } else if (charcode < 0xd800 || charcode >= 0xe000) {\n utf8.push(\n 0xe0 | (charcode >> 12),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n } else {\n i++;\n charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charcode >> 18),\n 0x80 | ((charcode >> 12) & 0x3f),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n\n // @ts-ignore\n window.TextEncoder = TextEncoderPolyfill;\n}\n\nexport function polyfillPromiseFinally(): void {\n if (typeof Promise !== 'undefined' && !Promise.prototype.finally) {\n Promise.prototype.finally = function (callback: () => void) {\n const constructor = this.constructor as PromiseConstructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) =>\n constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\n\nexport function polyfillObjectAssign(): void {\n if (typeof Object.assign !== 'function') {\n Object.assign = function (target: any, ...sources: any[]) {\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n const to = Object(target);\n\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n\n return to;\n };\n }\n}\n\nexport function polyfillArrayFrom(): void {\n if (!Array.from) {\n Array.from = function (arrayLike: any, mapFn?: any, thisArg?: any) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError('Array.from requires an array-like object');\n }\n\n const len = items.length >>> 0;\n const result = new Array(len);\n\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n\n return result;\n };\n }\n}\n\nexport function polyfillStringStartsWith(): void {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function (search: string, pos?: number) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\n\nexport function polyfillStringEndsWith(): void {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function (search: string, length?: number) {\n if (length === undefined || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\n\nexport function polyfillStringIncludes(): void {\n if (!String.prototype.includes) {\n String.prototype.includes = function (search: string, start?: number) {\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\n\nexport function initializePolyfills(): void {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n","import {\n inferDeviceIdType,\n isEquivalentDeviceIdType,\n} from \"./vastEnvironmentSignals\";\n\nexport interface VastConsentSignals {\n gdpr?: string | undefined;\n gdprConsent?: string | undefined;\n usPrivacy?: string | undefined;\n}\n\nexport interface VastMacroContext {\n correlator: string;\n streamCorrelator: string;\n pod?: number | undefined;\n podMaxAds?: number | undefined;\n podMinDurationMs?: number | undefined;\n podMaxDurationMs?: number | undefined;\n isCtv?: boolean | undefined;\n pageUrl?: string | undefined;\n adWillPlayMuted?: boolean | undefined;\n adWillAutoPlay?: boolean | undefined;\n sessionId?: string | undefined;\n deviceId?: string | undefined;\n deviceIdType?: string | undefined;\n limitAdTracking?: boolean | undefined;\n deviceTypeHint?: number | undefined;\n adTest?: boolean | undefined;\n programTitle?: string | undefined;\n consent?: VastConsentSignals | undefined;\n}\n\nconst UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nconst INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nconst EXAMPLE_COM_URL = /example\\.com/i;\nconst CTV_UNSUPPORTED_PARAMS = [\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\",\n];\n\nconst INLINE_DEVICE_MACRO_REPLACEMENTS: Array<{\n pattern: RegExp;\n getValue: (ctx: VastMacroContext) => string | undefined;\n}> = [\n { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) =>\n ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) =>\n ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator },\n];\n\nexport function isMacroPlaceholder(value: string | null | undefined): boolean {\n if (value == null) return true;\n const trimmed = value.trim();\n if (!trimmed) return true;\n if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\n\nexport function generateCorrelator(): string {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 0x200000 + ((buf[1] ?? 0) & 0x1fffff);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\n\nfunction expandInlineMacroPlaceholders(baseUrl: string, ctx: VastMacroContext): string {\n let url = baseUrl;\n for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n const value = getValue(ctx);\n if (value != null && value !== \"\") {\n url = url.replace(pattern, encodeURIComponent(value));\n }\n }\n return url;\n}\n\nfunction applyDeviceIdentityParams(\n params: URLSearchParams,\n ctx: VastMacroContext\n): void {\n const runtimeId = ctx.deviceId?.trim();\n const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n const tagRdid = params.get(\"rdid\");\n const tagType = params.get(\"idtype\");\n const tagLat = params.get(\"is_lat\");\n const latValue =\n ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined;\n\n if (runtimeId) {\n params.set(\"rdid\", runtimeId);\n params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n params.set(\"is_lat\", latValue ?? (isMacroPlaceholder(tagLat) ? \"0\" : tagLat!));\n return;\n }\n\n const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));\n const tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));\n\n if (\n tagRdidValid &&\n tagTypeValid &&\n runtimeType &&\n !isEquivalentDeviceIdType(tagType!, runtimeType)\n ) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n\n if (tagRdidValid) {\n if (isMacroPlaceholder(tagType) && runtimeType) {\n params.set(\"idtype\", runtimeType);\n }\n if (isMacroPlaceholder(tagLat)) {\n params.set(\"is_lat\", latValue ?? \"0\");\n }\n return;\n }\n\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n}\n\nfunction removeBrokenAppNameOrphans(\n params: URLSearchParams,\n appName?: string\n): void {\n const toDelete: string[] = [];\n\n params.forEach((_value, key) => {\n if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n toDelete.push(key);\n }\n });\n\n if (appName && appName.includes(\"&\")) {\n for (const suffix of appName.split(\"&\").slice(1)) {\n const trimmed = suffix.replace(/^\\s+/, \"\");\n if (!trimmed) continue;\n toDelete.push(suffix, ` ${trimmed}`, trimmed);\n }\n }\n\n for (const key of new Set(toDelete)) {\n if (key) params.delete(key);\n }\n}\n\nexport function normalizeVastTagUrl(raw: string): string {\n if (!raw) return raw;\n\n try {\n const url = new URL(raw);\n\n const anValue = url.searchParams.get(\"an\");\n if (anValue !== null) {\n const orphanFragments: string[] = [];\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n orphanFragments.push(key.trim());\n }\n });\n if (orphanFragments.length > 0) {\n const reconstructed = [anValue.replace(/\\s+$/, \"\"), ...orphanFragments]\n .filter(Boolean)\n .join(\" & \");\n\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n url.searchParams.delete(key);\n }\n });\n url.searchParams.set(\"an\", reconstructed);\n\n return url.toString().replace(\n /([?&]an=)([^&]*)/,\n (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n );\n }\n }\n\n removeBrokenAppNameOrphans(url.searchParams);\n return url.toString();\n } catch {\n return raw;\n }\n}\n\nexport function applyVastMacros(\n baseUrl: string,\n ctx: VastMacroContext\n): string {\n const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n let url: URL;\n try {\n url = new URL(normalizeVastTagUrl(expandedUrl));\n } catch {\n return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n }\n\n const params = url.searchParams;\n\n removeBrokenAppNameOrphans(params);\n\n params.set(\"correlator\", ctx.correlator);\n params.set(\"scor\", ctx.streamCorrelator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n }\n\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n\n params.delete(\"ppos\");\n params.delete(\"lip\");\n if (ctx.podMinDurationMs != null) {\n params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n }\n if (ctx.podMaxDurationMs != null) {\n params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n }\n if (ctx.podMaxAds != null) {\n params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n }\n\n if (!ctx.isCtv && ctx.pageUrl) {\n params.set(\"url\", ctx.pageUrl);\n params.set(\"description_url\", ctx.pageUrl);\n }\n const existingUrl = params.get(\"url\") || \"\";\n if (EXAMPLE_COM_URL.test(existingUrl)) {\n params.delete(\"url\");\n params.delete(\"description_url\");\n }\n\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n\n applyDeviceIdentityParams(params, ctx);\n\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n\n if (ctx.programTitle) {\n params.set(\"ct_ti\", ctx.programTitle);\n }\n\n const staleKeys: string[] = [];\n params.forEach((value, key) => {\n if (isMacroPlaceholder(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n\n removeBrokenAppNameOrphans(params);\n\n return url.toString();\n}\n\nfunction replaceCorrelatorFallback(baseUrl: string, correlator: string): string {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\n\nexport function fetchConsentSignals(\n timeoutMs: number = 1500\n): Promise<VastConsentSignals> {\n const signals: VastConsentSignals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n\n const tasks: Promise<void>[] = [];\n\n const tcfApi = (window as any).__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData: any, success: boolean) => {\n if (settled) return;\n if (\n success &&\n tcData &&\n (tcData.eventStatus === \"tcloaded\" ||\n tcData.eventStatus === \"useractioncomplete\")\n ) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {}, tcData.listenerId);\n } catch {}\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n\n const uspApi = (window as any).__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data: any, success: boolean) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n\n return Promise.all(tasks).then(() => signals);\n}\n","import type { Scte35Marker, Id3TagInfo } from \"../types\";\n\nexport function parseCueOutDuration(value: string): number | undefined {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match =\n value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) ||\n value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const dStr = match[1];\n const d = parseFloat(dStr);\n return Number.isNaN(d) ? undefined : d;\n }\n return undefined;\n}\n\nexport function parseCueOutCont(\n value: string\n): { elapsed?: number; duration?: number } | undefined {\n const res: { elapsed?: number; duration?: number } = {};\n\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n\n if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n if (slashMatch && slashMatch[1] && slashMatch[2]) {\n const elapsed = parseFloat(slashMatch[1]);\n const duration = parseFloat(slashMatch[2]);\n if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n }\n }\n\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return undefined;\n}\n\nexport function parseAttributeList(value: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(value)) !== null) {\n const key: string = (match[1] ?? \"\") as string;\n let rawVal: string = (match[3] ?? match[4] ?? \"\") as string;\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n}\n\nexport function toNumber(val: unknown): number | undefined {\n if (val == null) return undefined;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? undefined : n;\n}\n\nexport function isManifestBasedMarker(marker: Scte35Marker): boolean {\n const raw = marker.raw as any;\n if (!raw) return false;\n\n if (raw.tag) {\n const tag = String(raw.tag);\n return (\n tag.includes(\"EXT-X-CUE-OUT\") ||\n tag.includes(\"EXT-X-CUE-IN\") ||\n tag.includes(\"EXT-X-DATERANGE\")\n );\n }\n\n if (raw.id3) return false;\n\n if (raw.splice_command_type) return false;\n\n return false;\n}\n\nexport function decodeId3ValueToText(value: string | Uint8Array): string | undefined {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++)\n out += String.fromCharCode(value[i]!);\n return out;\n } catch {\n return undefined;\n }\n}\n\nexport function getFragmentStartSeconds(frag: any): number | undefined {\n const candidates = [frag?.start, frag?.startPTS];\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n }\n return undefined;\n}\n\nexport function parseScte35FromId3(tag: Id3TagInfo): Scte35Marker | undefined {\n const text = decodeId3ValueToText(tag.value);\n if (!text) return undefined;\n\n const cueOutMatch =\n text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) ||\n text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = parseCueOutDuration(arg);\n const marker: Scte35Marker = {\n type: \"start\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n ...(dur !== undefined ? { durationSeconds: dur } : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = parseCueOutCont(arg);\n const marker: Scte35Marker = {\n type: \"progress\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n ...(cont?.duration !== undefined\n ? { durationSeconds: cont.duration }\n : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n const marker: Scte35Marker = {\n type: \"end\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n\n const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n if (daterangeMatch) {\n const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n const hasScteOut =\n \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n const hasScteIn =\n \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker: Scte35Marker = {\n type: \"start\",\n ...(tag.ptsSeconds !== undefined\n ? { ptsSeconds: tag.ptsSeconds }\n : {}),\n ...(duration !== undefined ? { durationSeconds: duration } : {}),\n raw: { id3: text, attrs },\n } as Scte35Marker;\n return marker;\n }\n if (hasScteIn) {\n const marker: Scte35Marker = {\n type: \"end\",\n ...(tag.ptsSeconds !== undefined\n ? { ptsSeconds: tag.ptsSeconds }\n : {}),\n raw: { id3: text, attrs },\n } as Scte35Marker;\n return marker;\n }\n }\n\n if (/SCTE35-OUT/i.test(text)) {\n const marker: Scte35Marker = {\n type: \"start\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n if (/SCTE35-IN/i.test(text)) {\n const marker: Scte35Marker = {\n type: \"end\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n\n if (tag.value instanceof Uint8Array) {\n const bin = parseScte35Binary(tag.value);\n if (bin) return bin;\n }\n\n return undefined;\n}\n\nexport function normalizeFragmentPayload(payload: unknown): Uint8Array | undefined {\n if (payload instanceof Uint8Array) {\n return payload;\n }\n if (payload instanceof ArrayBuffer) {\n return new Uint8Array(payload);\n }\n if (ArrayBuffer.isView(payload)) {\n const view = payload as ArrayBufferView;\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n }\n return undefined;\n}\n\n// --- Transport Stream SCTE-35 parsing ---\n\nexport function detectTsPacketFormat(\n data: Uint8Array\n): { offset: number; packetSize: number; tsPayloadOffset: number } | undefined {\n const packetSizes = [188, 192, 204];\n for (const packetSize of packetSizes) {\n const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n for (let offset = 0; offset < packetSize; offset++) {\n let matchedPackets = 0;\n for (\n let packetStart = offset;\n packetStart + tsPayloadOffset < data.length &&\n matchedPackets < 5;\n packetStart += packetSize\n ) {\n if (data[packetStart + tsPayloadOffset] !== 0x47) {\n break;\n }\n matchedPackets++;\n }\n if (matchedPackets >= 2) {\n return { offset, packetSize, tsPayloadOffset };\n }\n }\n }\n return undefined;\n}\n\nfunction getPsiSectionStart(\n payload: Uint8Array,\n payloadUnitStart: boolean\n): number | undefined {\n if (!payloadUnitStart) {\n return undefined;\n }\n const pointerField = payload[0];\n if (pointerField == null) {\n return undefined;\n }\n const sectionStart = 1 + pointerField;\n return sectionStart < payload.length ? sectionStart : undefined;\n}\n\nfunction getPsiSectionLength(data: Uint8Array, offset: number): number {\n return (((data[offset + 1] ?? 0) & 0x0f) << 8) | (data[offset + 2] ?? 0);\n}\n\nfunction parsePatSection(\n payload: Uint8Array,\n payloadUnitStart: boolean,\n pmtPids: Set<number>\n): void {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 8 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 0x00) {\n return;\n }\n\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n\n for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n const programNumber =\n ((payload[offset] ?? 0) << 8) | (payload[offset + 1] ?? 0);\n const pid =\n (((payload[offset + 2] ?? 0) & 0x1f) << 8) |\n (payload[offset + 3] ?? 0);\n if (programNumber !== 0) {\n pmtPids.add(pid);\n }\n }\n}\n\nfunction descriptorsIdentifyScte35(\n data: Uint8Array,\n start: number,\n end: number\n): boolean {\n let offset = start;\n while (offset + 2 <= end) {\n const tag = data[offset] ?? 0;\n const length = data[offset + 1] ?? 0;\n const descriptorStart = offset + 2;\n const descriptorEnd = descriptorStart + length;\n if (descriptorEnd > end) {\n return false;\n }\n\n const registration =\n length >= 4\n ? String.fromCharCode(\n data[descriptorStart] ?? 0,\n data[descriptorStart + 1] ?? 0,\n data[descriptorStart + 2] ?? 0,\n data[descriptorStart + 3] ?? 0\n )\n : \"\";\n if (tag === 0x8a || registration === \"CUEI\" || registration === \"SCTE\") {\n return true;\n }\n\n offset = descriptorEnd;\n }\n return false;\n}\n\nfunction parsePmtSection(\n payload: Uint8Array,\n payloadUnitStart: boolean,\n tsScte35Pids: Set<number>\n): void {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 12 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 0x02) {\n return;\n }\n\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n const programInfoLength =\n (((payload[sectionStart + 10] ?? 0) & 0x0f) << 8) |\n (payload[sectionStart + 11] ?? 0);\n\n let offset = sectionStart + 12 + programInfoLength;\n while (offset + 5 <= sectionEnd - 4) {\n const streamType = payload[offset] ?? 0;\n const elementaryPid =\n (((payload[offset + 1] ?? 0) & 0x1f) << 8) |\n (payload[offset + 2] ?? 0);\n const esInfoLength =\n (((payload[offset + 3] ?? 0) & 0x0f) << 8) |\n (payload[offset + 4] ?? 0);\n const descriptorStart = offset + 5;\n const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n\n if (\n streamType === 0x86 ||\n (streamType === 0x06 &&\n descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd))\n ) {\n tsScte35Pids.add(elementaryPid);\n }\n\n offset = descriptorStart + esInfoLength;\n }\n}\n\nfunction hasProcessedTsScte35Section(\n section: Uint8Array,\n processedSections: Set<string>\n): boolean {\n let checksum = 0;\n for (let i = 0; i < section.length; i++) {\n checksum = (checksum * 31 + (section[i] ?? 0)) >>> 0;\n }\n\n const key = `${section.length}:${checksum}`;\n if (processedSections.has(key)) {\n return true;\n }\n\n processedSections.add(key);\n if (processedSections.size > 200) {\n const firstKey = processedSections.values().next().value;\n if (firstKey) {\n processedSections.delete(firstKey);\n }\n }\n return false;\n}\n\nfunction addScte35SectionMarker(\n section: Uint8Array,\n markers: Scte35Marker[],\n processedSections: Set<string>\n): void {\n if (section[0] !== 0xfc || hasProcessedTsScte35Section(section, processedSections)) {\n return;\n }\n\n const marker = parseScte35Binary(section);\n if (!marker) {\n return;\n }\n\n marker.raw = {\n ...(typeof marker.raw === \"object\" && marker.raw ? marker.raw : {}),\n source: \"ts-packet\",\n };\n markers.push(marker);\n}\n\nfunction appendScte35Bytes(\n pid: number,\n bytes: Uint8Array,\n assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n markers: Scte35Marker[],\n processedSections: Set<string>\n): void {\n const assembler = assemblers.get(pid);\n if (!assembler) {\n return;\n }\n\n for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n assembler.bytes.push(bytes[i] ?? 0);\n }\n\n if (assembler.bytes.length >= assembler.expectedLength) {\n assemblers.delete(pid);\n addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n }\n}\n\nfunction collectScte35SectionsFromPayload(\n pid: number,\n payload: Uint8Array,\n payloadUnitStart: boolean,\n assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n markers: Scte35Marker[],\n processedSections: Set<string>\n): void {\n if (payload.length === 0) {\n return;\n }\n\n let offset = 0;\n if (payloadUnitStart) {\n const pointerField = payload[0] ?? 0;\n const previousAssembler = assemblers.get(pid);\n if (previousAssembler && pointerField > 0) {\n appendScte35Bytes(\n pid,\n payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n assemblers,\n markers,\n processedSections\n );\n }\n assemblers.delete(pid);\n offset = 1 + pointerField;\n } else {\n appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n return;\n }\n\n while (offset + 3 <= payload.length) {\n const tableId = payload[offset];\n if (tableId == null || tableId === 0xff) {\n return;\n }\n\n const sectionLength = getPsiSectionLength(payload, offset);\n const totalLength = 3 + sectionLength;\n if (sectionLength <= 0 || totalLength <= 3) {\n return;\n }\n\n if (offset + totalLength <= payload.length) {\n addScte35SectionMarker(\n payload.subarray(offset, offset + totalLength),\n markers,\n processedSections\n );\n offset += totalLength;\n } else {\n assemblers.set(pid, {\n bytes: Array.from(payload.subarray(offset)),\n expectedLength: totalLength,\n });\n return;\n }\n }\n}\n\nexport function parseScte35FromTsPackets(\n data: Uint8Array,\n tsScte35Pids: Set<number>,\n pmtPids: Set<number>,\n processedSections: Set<string>\n): Scte35Marker[] {\n const packetInfo = detectTsPacketFormat(data);\n if (!packetInfo) {\n return [];\n }\n\n const markers: Scte35Marker[] = [];\n const sectionAssemblers = new Map<\n number,\n { bytes: number[]; expectedLength: number }\n >();\n\n for (\n let packetStart = packetInfo.offset;\n packetStart + packetInfo.packetSize <= data.length;\n packetStart += packetInfo.packetSize\n ) {\n const tsStart = packetStart + packetInfo.tsPayloadOffset;\n if (data[tsStart] !== 0x47) {\n continue;\n }\n\n const secondByte = data[tsStart + 1];\n const thirdByte = data[tsStart + 2];\n const fourthByte = data[tsStart + 3];\n if (\n secondByte == null ||\n thirdByte == null ||\n fourthByte == null ||\n (secondByte & 0x80) !== 0\n ) {\n continue;\n }\n\n const payloadUnitStart = (secondByte & 0x40) !== 0;\n const pid = ((secondByte & 0x1f) << 8) | thirdByte;\n const adaptationFieldControl = (fourthByte >> 4) & 0x03;\n const hasPayload =\n adaptationFieldControl === 1 || adaptationFieldControl === 3;\n if (!hasPayload) {\n continue;\n }\n\n let payloadStart = tsStart + 4;\n if (adaptationFieldControl === 3) {\n const adaptationLength = data[payloadStart];\n if (adaptationLength == null) {\n continue;\n }\n payloadStart += 1 + adaptationLength;\n }\n\n const payloadEnd = Math.min(tsStart + 188, data.length);\n if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n continue;\n }\n\n const payload = data.subarray(payloadStart, payloadEnd);\n if (pid === 0) {\n parsePatSection(payload, payloadUnitStart, pmtPids);\n } else if (pmtPids.has(pid)) {\n parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n } else if (tsScte35Pids.has(pid)) {\n collectScte35SectionsFromPayload(\n pid,\n payload,\n payloadUnitStart,\n sectionAssemblers,\n markers,\n processedSections\n );\n }\n }\n\n return markers;\n}\n\n// --- Binary SCTE-35 parsing ---\n\nclass BitReader {\n private bytePos = 0;\n private bitPos = 0;\n constructor(private readonly buf: Uint8Array) {}\n readBits(numBits: number): number {\n let result = 0;\n while (numBits > 0) {\n if (this.bytePos >= this.buf.length) return result;\n const remainingInByte = 8 - this.bitPos;\n const toRead = Math.min(numBits, remainingInByte);\n const currentByte = this.buf[this.bytePos]!;\n const shift = remainingInByte - toRead;\n const mask = ((1 << toRead) - 1) & 0xff;\n const bits = (currentByte >> shift) & mask;\n result = (result << toRead) | bits;\n this.bitPos += toRead;\n if (this.bitPos >= 8) {\n this.bitPos = 0;\n this.bytePos += 1;\n }\n numBits -= toRead;\n }\n return result >>> 0;\n }\n skipBits(n: number): void {\n this.readBits(n);\n }\n get bytePosition(): number {\n return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n }\n}\n\nfunction readSpliceTime(\n r: BitReader,\n ptsAdjustmentTicks: number\n): number | undefined {\n const timeSpecifiedFlag = r.readBits(1) === 1;\n if (!timeSpecifiedFlag) {\n r.readBits(7);\n return undefined;\n }\n r.readBits(6);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const ptsTicks =\n (high * 0x100000000 + low + ptsAdjustmentTicks) % 0x200000000;\n return ptsTicks / 90000;\n}\n\nfunction markerTypeFromSegmentationTypeId(\n segmentationTypeId: number\n): Scte35Marker[\"type\"] | undefined {\n switch (segmentationTypeId) {\n case 0x10:\n case 0x22:\n case 0x30:\n case 0x32:\n case 0x34:\n case 0x36:\n return \"start\";\n case 0x11:\n case 0x23:\n case 0x31:\n case 0x33:\n case 0x35:\n case 0x37:\n return \"end\";\n default:\n return undefined;\n }\n}\n\nfunction parseScte35SegmentationDescriptor(\n descriptor: Uint8Array\n):\n | {\n type: Scte35Marker[\"type\"];\n durationSeconds?: number;\n segmentationEventId?: number;\n }\n | undefined {\n if (descriptor.length < 11) {\n return undefined;\n }\n\n const identifier = String.fromCharCode(\n descriptor[0] ?? 0,\n descriptor[1] ?? 0,\n descriptor[2] ?? 0,\n descriptor[3] ?? 0\n );\n if (identifier !== \"CUEI\") {\n return undefined;\n }\n\n const segmentationEventId =\n ((descriptor[4] ?? 0) * 0x1000000) +\n ((descriptor[5] ?? 0) << 16) +\n ((descriptor[6] ?? 0) << 8) +\n (descriptor[7] ?? 0);\n const cancelIndicator = ((descriptor[8] ?? 0) & 0x80) !== 0;\n if (cancelIndicator) {\n return undefined;\n }\n\n const flags = descriptor[9] ?? 0;\n const programSegmentationFlag = (flags & 0x80) !== 0;\n const segmentationDurationFlag = (flags & 0x40) !== 0;\n let offset = 10;\n\n if (!programSegmentationFlag) {\n const componentCount = descriptor[offset] ?? 0;\n offset += 1 + componentCount * 6;\n if (offset > descriptor.length) {\n return undefined;\n }\n }\n\n let durationSeconds: number | undefined = undefined;\n if (segmentationDurationFlag) {\n if (offset + 5 > descriptor.length) {\n return undefined;\n }\n const durationTicks =\n ((descriptor[offset] ?? 0) * 0x100000000) +\n ((descriptor[offset + 1] ?? 0) * 0x1000000) +\n ((descriptor[offset + 2] ?? 0) << 16) +\n ((descriptor[offset + 3] ?? 0) << 8) +\n (descriptor[offset + 4] ?? 0);\n durationSeconds = durationTicks / 90000;\n offset += 5;\n }\n\n if (offset + 2 > descriptor.length) {\n return undefined;\n }\n offset += 1;\n const segmentationUpidLength = descriptor[offset] ?? 0;\n offset += 1 + segmentationUpidLength;\n if (offset >= descriptor.length) {\n return undefined;\n }\n\n const segmentationTypeId = descriptor[offset] ?? 0;\n const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n if (!markerType) {\n return undefined;\n }\n\n return {\n type: markerType,\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n segmentationEventId,\n };\n}\n\nfunction parseScte35SegmentationDescriptors(\n data: Uint8Array,\n offset: number\n):\n | {\n type: Scte35Marker[\"type\"];\n durationSeconds?: number;\n segmentationEventId?: number;\n }\n | undefined {\n if (offset + 2 > data.length) {\n return undefined;\n }\n\n const descriptorLoopLength =\n ((data[offset] ?? 0) << 8) | (data[offset + 1] ?? 0);\n let descriptorOffset = offset + 2;\n const descriptorEnd = Math.min(\n data.length,\n descriptorOffset + descriptorLoopLength\n );\n\n while (descriptorOffset + 2 <= descriptorEnd) {\n const descriptorTag = data[descriptorOffset] ?? 0;\n const descriptorLength = data[descriptorOffset + 1] ?? 0;\n const descriptorDataStart = descriptorOffset + 2;\n const descriptorDataEnd = descriptorDataStart + descriptorLength;\n if (descriptorDataEnd > descriptorEnd) {\n return undefined;\n }\n\n if (descriptorTag === 0x02) {\n const descriptorMarker = parseScte35SegmentationDescriptor(\n data.subarray(descriptorDataStart, descriptorDataEnd)\n );\n if (descriptorMarker) {\n return descriptorMarker;\n }\n }\n\n descriptorOffset = descriptorDataEnd;\n }\n\n return undefined;\n}\n\nexport function parseScte35Binary(data: Uint8Array): Scte35Marker | undefined {\n const r = new BitReader(data);\n const tableId = r.readBits(8);\n if (tableId !== 0xfc) return undefined;\n r.readBits(1);\n r.readBits(1);\n r.readBits(2);\n const sectionLength = r.readBits(12);\n if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n return undefined;\n }\n r.readBits(8);\n r.readBits(1);\n r.readBits(6);\n const ptsAdjHigh = r.readBits(1);\n const ptsAdjLow = r.readBits(32);\n const ptsAdjustmentTicks = ptsAdjHigh * 0x100000000 + ptsAdjLow;\n r.readBits(8);\n r.readBits(12);\n const spliceCommandLength = r.readBits(12);\n const spliceCommandType = r.readBits(8);\n\n let markerType: Scte35Marker[\"type\"] | undefined;\n let durationSeconds: number | undefined = undefined;\n let ptsSeconds: number | undefined = undefined;\n let spliceEventId: number | undefined = undefined;\n const commandBodyStart = r.bytePosition;\n\n if (spliceCommandType === 5) {\n spliceEventId = r.readBits(32);\n const cancel = r.readBits(1) === 1;\n r.readBits(7);\n if (cancel) return undefined;\n const outOfNetwork = r.readBits(1) === 1;\n const programSpliceFlag = r.readBits(1) === 1;\n const durationFlag = r.readBits(1) === 1;\n const spliceImmediateFlag = r.readBits(1) === 1;\n r.readBits(4);\n markerType = outOfNetwork ? \"start\" : \"end\";\n\n if (programSpliceFlag && !spliceImmediateFlag) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else if (!programSpliceFlag) {\n const componentCount = r.readBits(8);\n for (let i = 0; i < componentCount; i++) {\n r.readBits(8);\n if (!spliceImmediateFlag) {\n const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n if (ptsSeconds === undefined) {\n ptsSeconds = componentPtsSeconds;\n }\n }\n }\n }\n\n if (durationFlag) {\n r.readBits(6);\n r.readBits(1);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const durationTicks = high * 0x100000000 + low;\n durationSeconds = durationTicks / 90000;\n }\n r.readBits(16);\n r.readBits(8);\n r.readBits(8);\n } else if (spliceCommandType === 6) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else {\n return undefined;\n }\n\n const expectedDescriptorOffset =\n spliceCommandLength === 0x0fff\n ? r.bytePosition\n : commandBodyStart + spliceCommandLength;\n const descriptorMarker = parseScte35SegmentationDescriptors(\n data,\n expectedDescriptorOffset\n );\n\n if (descriptorMarker) {\n markerType = descriptorMarker.type;\n if (durationSeconds === undefined) {\n durationSeconds = descriptorMarker.durationSeconds;\n }\n }\n\n if (!markerType) {\n return undefined;\n }\n\n const marker: Scte35Marker = {\n type: markerType,\n ...(ptsSeconds !== undefined ? { ptsSeconds } : {}),\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: {\n splice_command_type: spliceCommandType,\n ...(spliceEventId !== undefined ? { splice_event_id: spliceEventId } : {}),\n ...(descriptorMarker?.segmentationEventId !== undefined\n ? { segmentation_event_id: descriptorMarker.segmentationEventId }\n : {}),\n },\n } as Scte35Marker;\n return marker;\n}\n","import type { Scte35Marker } from \"../types\";\nimport type {\n NormalizedScte35Cue,\n Scte35CueContext,\n Scte35CueSource,\n Scte35CueReadiness,\n} from \"./playerTypes\";\nimport { getFragmentStartSeconds } from \"./Scte35Parser\";\n\nexport interface Scte35CueManagerCallbacks {\n onEarlyStartCue(marker: Scte35Marker, fragmentSn: number | undefined, cueKey: string): void;\n onPlaybackCue(marker: Scte35Marker, cueKey?: string): void;\n isInAdBreak(): boolean;\n}\n\nexport class Scte35CueManager {\n private readonly pendingScte35Cues: Map<string, NormalizedScte35Cue> = new Map();\n private readonly recentScte35CueKeys: Map<string, number> = new Map();\n private readonly recentScte35CueLimit: number = 200;\n private pendingScte35CueKeyValue: string | undefined;\n private activeScte35BreakKeyValue: string | undefined;\n private scheduledScte35BreakKeyValue: string | undefined;\n\n readonly tsScte35Pids: Set<number> = new Set();\n readonly pmtPids: Set<number> = new Set();\n readonly processedTsScte35Sections: Set<string> = new Set();\n\n private debug: boolean;\n private callbacks: Scte35CueManagerCallbacks;\n\n constructor(debug: boolean, callbacks: Scte35CueManagerCallbacks) {\n this.debug = debug;\n this.callbacks = callbacks;\n }\n\n get pendingScte35CueKey(): string | undefined {\n return this.pendingScte35CueKeyValue;\n }\n set pendingScte35CueKey(value: string | undefined) {\n this.pendingScte35CueKeyValue = value;\n }\n\n get activeScte35BreakKey(): string | undefined {\n return this.activeScte35BreakKeyValue;\n }\n set activeScte35BreakKey(value: string | undefined) {\n this.activeScte35BreakKeyValue = value;\n }\n\n get scheduledScte35BreakKey(): string | undefined {\n return this.scheduledScte35BreakKeyValue;\n }\n set scheduledScte35BreakKey(value: string | undefined) {\n this.scheduledScte35BreakKeyValue = value;\n }\n\n createScte35CueContext(\n source: Scte35CueSource,\n readiness: Scte35CueReadiness,\n frag?: any\n ): Scte35CueContext {\n const context: Scte35CueContext = { source, readiness };\n if (typeof frag?.sn === \"number\") {\n context.fragmentSn = frag.sn;\n }\n const fragmentStartSec = getFragmentStartSeconds(frag);\n if (fragmentStartSec !== undefined) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n return context;\n }\n\n onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void {\n const cue = this.createScte35Cue(marker, context);\n const pendingKey = this.getPendingScte35CueKey(cue);\n\n if (context.readiness === \"early\") {\n this.pendingScte35Cues.set(pendingKey, cue);\n this.trimRecentScte35CueMaps();\n\n if (marker.type === \"start\") {\n this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n }\n return;\n }\n\n if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n key: cue.key,\n activeScte35BreakKey: this.activeScte35BreakKeyValue,\n inAdBreak: this.callbacks.isInAdBreak(),\n source: cue.source,\n });\n }\n return;\n }\n\n if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n key: cue.key,\n source: cue.source,\n });\n }\n return;\n }\n\n this.pendingScte35Cues.delete(pendingKey);\n this.markScte35CueHandled(cue);\n this.callbacks.onPlaybackCue(marker, cue.key);\n }\n\n activatePendingScte35CuesForFragment(frag: any): void {\n const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : undefined;\n if (fragmentSn === undefined) {\n return;\n }\n\n const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n ([, cue]) => cue.fragmentSn === fragmentSn\n );\n\n matchingCues.forEach(([pendingKey, cue]) => {\n this.pendingScte35Cues.delete(pendingKey);\n const context: Scte35CueContext = {\n source: cue.source,\n readiness: \"playback\",\n };\n context.fragmentSn = fragmentSn;\n const fragmentStartSec =\n cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n if (fragmentStartSec !== undefined) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n this.onScte35Cue(cue.marker, context);\n });\n }\n\n private createScte35Cue(\n marker: Scte35Marker,\n context: Scte35CueContext\n ): NormalizedScte35Cue {\n const cue: NormalizedScte35Cue = {\n marker,\n source: context.source,\n readiness: context.readiness,\n key: this.getScte35CueKey(marker, context),\n };\n if (context.fragmentSn !== undefined) {\n cue.fragmentSn = context.fragmentSn;\n }\n if (context.fragmentStartSeconds !== undefined) {\n cue.fragmentStartSeconds = context.fragmentStartSeconds;\n }\n return cue;\n }\n\n private getScte35CueKey(\n marker: Scte35Marker,\n context: Scte35CueContext\n ): string {\n const raw = this.getScte35MarkerRaw(marker);\n const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n if (spliceEventId) {\n return `splice:${spliceEventId}`;\n }\n\n const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n if (segmentationEventId) {\n return `segmentation:${segmentationEventId}`;\n }\n\n const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n if (daterangeId) {\n return `daterange:${daterangeId}`;\n }\n\n const scteValue =\n this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) ||\n this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n if (scteValue) {\n return `daterange-scte:${scteValue}`;\n }\n\n if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n }\n\n if (context.fragmentSn !== undefined) {\n return `fragment:${context.fragmentSn}`;\n }\n\n return `${context.source}:wallclock:${Math.floor(Date.now() / 1000)}`;\n }\n\n private getPendingScte35CueKey(cue: NormalizedScte35Cue): string {\n return `${cue.marker.type}:${cue.key}:${\n cue.fragmentSn !== undefined ? cue.fragmentSn : \"unknown\"\n }`;\n }\n\n private getScte35MarkerRaw(marker: Scte35Marker): any {\n return typeof marker.raw === \"object\" && marker.raw !== null\n ? (marker.raw as any)\n : {};\n }\n\n private toIdentityString(value: unknown): string | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n return undefined;\n }\n\n isStrongScte35CueKey(key: string | undefined): boolean {\n return !!(\n key &&\n (key.startsWith(\"splice:\") ||\n key.startsWith(\"segmentation:\") ||\n key.startsWith(\"daterange:\") ||\n key.startsWith(\"daterange-scte:\"))\n );\n }\n\n private hasRecentlyHandledScte35Cue(cue: NormalizedScte35Cue): boolean {\n if (\n this.activeScte35BreakKeyValue === cue.key ||\n this.scheduledScte35BreakKeyValue === cue.key\n ) {\n return true;\n }\n\n const recentKey = `${cue.marker.type}:${cue.key}`;\n return this.recentScte35CueKeys.has(recentKey);\n }\n\n private markScte35CueHandled(cue: NormalizedScte35Cue): void {\n this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n this.trimRecentScte35CueMaps();\n }\n\n private trimRecentScte35CueMaps(): void {\n while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n const firstKey = this.recentScte35CueKeys.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.recentScte35CueKeys.delete(firstKey);\n }\n\n while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n const firstKey = this.pendingScte35Cues.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.pendingScte35Cues.delete(firstKey);\n }\n }\n\n private shouldAcceptScte35EndCue(cue: NormalizedScte35Cue): boolean {\n if (!this.callbacks.isInAdBreak()) {\n return false;\n }\n\n if (\n this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) &&\n this.isStrongScte35CueKey(cue.key) &&\n this.activeScte35BreakKeyValue !== cue.key\n ) {\n return false;\n }\n\n return true;\n }\n}\n","import type {\n StormcloudVideoPlayerConfig,\n AdBreak,\n StormcloudApiResponse,\n AdController,\n} from \"../types\";\nimport type { PalNonceManager } from \"../sdk/pal\";\nimport { applyVastMacros, generateCorrelator, normalizeVastTagUrl } from \"../utils/vastMacros\";\nimport type { VastConsentSignals } from \"../utils/vastMacros\";\nimport { resolveVastEnvironmentSignals } from \"../utils/vastEnvironmentSignals\";\nimport { toDevSafeUrl } from \"../utils/devUrl\";\nimport {\n buildAnalyticsContext,\n sendHeartbeat,\n sendInitialTracking,\n} from \"../utils/tracking\";\n\nexport class AdConfigManager {\n vmapBreaks: AdBreak[] = [];\n consumedVmapBreakIds: Set<string> = new Set();\n apiVastTagUrl: string | undefined;\n apiNumberAds: number | undefined;\n readonly streamCorrelator: string = generateCorrelator();\n readonly viewCorrelator: string = generateCorrelator();\n consentSignals: VastConsentSignals = {};\n podCounter: number = 0;\n podAssignedByPrefetch: boolean = false;\n\n private lastHeartbeatTime: number = 0;\n private heartbeatInterval: number | undefined;\n\n private config: StormcloudVideoPlayerConfig;\n private video: HTMLVideoElement;\n\n constructor(config: StormcloudVideoPlayerConfig, video: HTMLVideoElement) {\n this.config = config;\n this.video = video;\n }\n\n get debug(): boolean {\n return !!this.config.debugAdTiming;\n }\n\n isVmapEnabled(): boolean {\n return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n }\n\n async fetchAdConfiguration(): Promise<void> {\n if (this.isVmapEnabled()) {\n await this.fetchAndParseVmap(this.config.vmapUrl!);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n }\n return;\n }\n\n const vastMode = this.config.vastMode || \"default\";\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n }\n\n if (vastMode === \"adstorm\") {\n if (!this.config.licenseKey) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n );\n }\n return;\n }\n\n const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n this.apiVastTagUrl = vastEndpoint;\n\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n vastEndpoint\n );\n }\n return;\n }\n\n if (this.config.vastTagUrl) {\n this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n return;\n }\n\n const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n apiUrl\n );\n }\n\n const headers: Record<string, string> = {};\n if (this.config.licenseKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n }\n\n const response = await fetch(apiUrl, { headers });\n if (!response.ok) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n );\n }\n return;\n }\n\n const data: StormcloudApiResponse = await response.json();\n\n const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n if (imaPayload) {\n let decodedPayload = imaPayload;\n try {\n decodedPayload = decodeURIComponent(imaPayload);\n } catch {\n console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n }\n console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n } else {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n );\n }\n }\n\n const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n if (numberAds != null && numberAds > 0) {\n this.apiNumberAds = numberAds;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n this.apiNumberAds\n );\n }\n }\n }\n\n private async fetchAndParseVmap(vmapUrl: string): Promise<void> {\n if (!vmapUrl.trim()) {\n return;\n }\n\n try {\n const response = await fetch(vmapUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch VMAP (${response.status})`);\n }\n\n const vmapXml = await response.text();\n this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n this.consumedVmapBreakIds.clear();\n\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n vmapUrl\n );\n }\n } catch (error) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n }\n }\n }\n\n private parseVmapToBreaks(vmapXml: string): AdBreak[] {\n if (typeof DOMParser === \"undefined\") {\n return [];\n }\n\n const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n }\n return [];\n }\n\n const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(\n doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n );\n }\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n (el) => el.localName === \"AdBreak\"\n );\n }\n const parsed: AdBreak[] = [];\n\n adBreakNodes.forEach((node, index) => {\n const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n if (startTimeMs == null) {\n return;\n }\n\n let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n if (!adTagNode) {\n adTagNode =\n (node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") as Element | null) ??\n undefined;\n }\n const adTagUrl = (adTagNode?.textContent || \"\").trim();\n if (!adTagUrl) {\n return;\n }\n\n const breakId =\n node.getAttribute(\"breakId\") ||\n `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n parsed.push({\n id: breakId,\n startTimeMs,\n vastTagUrl: adTagUrl,\n });\n });\n\n parsed.sort((a, b) => {\n const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n return aStart - bStart;\n });\n\n return parsed;\n }\n\n private parseVmapTimeOffsetToMs(timeOffset: string): number | undefined {\n if (!timeOffset) {\n return undefined;\n }\n\n const normalized = timeOffset.trim().toLowerCase();\n if (normalized === \"start\") {\n return 0;\n }\n\n if (normalized === \"end\") {\n return -1;\n }\n\n const hms = timeOffset.match(\n /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n );\n if (hms) {\n const [, hh, mm, ss, ms = \"0\"] = hms;\n const hours = Number(hh);\n const minutes = Number(mm);\n const seconds = Number(ss);\n const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n return ((hours * 3600 + minutes * 60 + seconds) * 1000) + millis;\n }\n\n const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percent) {\n const ratio = Number(percent[1]) / 100;\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1000 * ratio);\n }\n return undefined;\n }\n\n return undefined;\n }\n\n getAdBreakKey(adBreak: AdBreak): string {\n if (adBreak.id) {\n return adBreak.id;\n }\n return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n }\n\n resolveBreakStartMs(adBreak: AdBreak): number | undefined {\n if (adBreak.startTimeMs >= 0) {\n return adBreak.startTimeMs;\n }\n\n if (adBreak.startTimeMs === -1) {\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1000);\n }\n }\n\n return undefined;\n }\n\n findCurrentOrNextBreak(nowMs: number): AdBreak | undefined {\n const schedule: AdBreak[] = this.vmapBreaks;\n let candidate: AdBreak | undefined;\n const tol = this.config.driftToleranceMs ?? 1000;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (\n breakStartMs <= nowMs + tol &&\n (candidate == null ||\n breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))\n ) {\n candidate = b;\n }\n }\n return candidate;\n }\n\n findBreakForTime(nowMs: number): AdBreak | undefined {\n const schedule: AdBreak[] = this.vmapBreaks;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n\n if (b.durationMs) {\n const end = breakStartMs + b.durationMs;\n if (nowMs >= breakStartMs && nowMs < end) {\n return b;\n }\n continue;\n }\n\n if (nowMs >= breakStartMs) {\n return b;\n }\n }\n return undefined;\n }\n\n selectVastTagsForBreak(b?: AdBreak): string[] | undefined {\n if (!b || !b.vastTagUrl) return undefined;\n if (b.vastTagUrl.includes(\",\")) {\n return b.vastTagUrl\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n }\n return [b.vastTagUrl];\n }\n\n beginNewAdPod(): void {\n this.podCounter++;\n }\n\n private readonly defaultPodMaxAds: number = 6;\n private readonly defaultPodMaxDurationMs: number = 120000;\n\n resolvePodParams(breakDurationMs?: number): {\n maxAds: number;\n minDurationMs: number;\n maxDurationMs: number;\n } {\n const maxDurationMs =\n breakDurationMs != null && breakDurationMs > 0\n ? breakDurationMs\n : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0\n ? this.config.podMaxDurationMs\n : this.defaultPodMaxDurationMs;\n\n const maxAds =\n this.config.podMaxAds && this.config.podMaxAds > 0\n ? this.config.podMaxAds\n : this.apiNumberAds && this.apiNumberAds > 0\n ? this.apiNumberAds\n : this.defaultPodMaxAds;\n\n const minDurationMs =\n this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n\n return { maxAds, minDurationMs, maxDurationMs };\n }\n\n getPalDescriptionUrl(): string | undefined {\n if (!this.apiVastTagUrl) return undefined;\n try {\n const params = new URL(this.apiVastTagUrl).searchParams;\n return params.get(\"description_url\") || params.get(\"url\") || undefined;\n } catch {\n return undefined;\n }\n }\n\n generatePodVastUrl(\n baseUrl: string,\n podParams: { maxAds: number; minDurationMs: number; maxDurationMs: number },\n adPlayer: AdController,\n palNonce: PalNonceManager,\n inAdBreak: boolean\n ): string {\n const adWillPlayMuted = inAdBreak\n ? adPlayer.getOriginalMutedState()\n : this.video.muted;\n const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n\n const urlWithMacros = applyVastMacros(baseUrl, {\n correlator: this.viewCorrelator,\n streamCorrelator: this.streamCorrelator,\n pod: this.podCounter > 0 ? this.podCounter : undefined,\n podMaxAds: podParams.maxAds,\n podMinDurationMs: podParams.minDurationMs,\n podMaxDurationMs: podParams.maxDurationMs,\n isCtv: envSignals.isCtv,\n pageUrl:\n !envSignals.isCtv && typeof window !== \"undefined\"\n ? toDevSafeUrl(window.location.href)\n : undefined,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n sessionId: envSignals.sessionId,\n deviceId: envSignals.deviceId,\n deviceIdType: envSignals.deviceIdType,\n limitAdTracking: envSignals.limitAdTracking,\n deviceTypeHint: envSignals.deviceTypeHint,\n adTest: this.config.adTest,\n ...(this.config.programTitle\n ? { programTitle: this.config.programTitle }\n : {}),\n consent: this.consentSignals,\n });\n\n const finalUrl = palNonce.injectNonce(urlWithMacros);\n console.log(\n `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n finalUrl\n );\n return finalUrl;\n }\n\n // --- Tracking ---\n\n initializeTracking(): void {\n sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config))\n .then(() => {\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5000);\n })\n .catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n error\n );\n }\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5000);\n });\n }\n\n private sendHeartbeatIfNeeded(): void {\n const now = Date.now();\n if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 30000) {\n this.lastHeartbeatTime = now;\n sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n error\n );\n }\n });\n }\n }\n\n destroyTracking(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = undefined;\n }\n }\n}\n","import type { AdController, StormcloudVideoPlayerConfig, Scte35Marker } from \"../types\";\n\nexport interface AdTimingCallbacks {\n onAdStopTimerFired(): void;\n onAdStartTimerFired(marker: Scte35Marker, cueKey: string | undefined): void;\n onWatchdogTimeout(): void;\n onFailsafeTimeout(): void;\n getAdState(): { inAdBreak: boolean; showAds: boolean; adPlaying: boolean };\n}\n\nexport class AdTimingService {\n private adStopTimerId: number | undefined;\n private adStartTimerId: number | undefined;\n private adFailsafeTimerId: number | undefined;\n private adRequestWatchdogId: number | undefined;\n private adRequestWatchdogToken: number | null = null;\n private adFailsafeToken: number | null = null;\n\n ptsDriftEmaMs = 0;\n expectedAdBreakDurationMs: number | undefined;\n currentAdBreakStartWallClockMs: number | undefined;\n scteAdBreakEndWallClockMs: number | undefined;\n adBreakPlayedDurationMs: number = 0;\n adBreakEpoch: number = 0;\n\n adRequestTokenCounter = 0;\n activeAdRequestToken: number | null = null;\n currentAdIndex: number = 0;\n totalAdsInBreak: number = 0;\n totalAdRequestsInBreak: number = 0;\n readonly maxTotalAdRequestsPerBreak: number = 10;\n lastAdRequestTime: number = 0;\n consecutiveFailures: number = 0;\n readonly maxConsecutiveFailures: number = 5;\n readonly minAdRequestIntervalMs: number = 3000;\n readonly backoffBaseMs: number = 1000;\n readonly maxBackoffMs: number = 15000;\n private readonly defaultMinRemainingMsToStartAd: number = 4000;\n\n failedVastUrls: Set<string> = new Set();\n temporaryFailureUrls: Map<string, number> = new Map();\n private readonly temporaryFailureCooldownMs: number = 30000;\n\n private globalConsecutiveNoFills: number = 0;\n private readonly globalNoFillThreshold: number = 3;\n private globalNoFillCooldownUntil: number = 0;\n private readonly globalNoFillBackoffBaseMs: number = 5000;\n private readonly globalNoFillBackoffMaxMs: number = 60000;\n private globalLastGamRequestTime: number = 0;\n private readonly globalMinGamIntervalMs: number = 3000;\n\n private config: StormcloudVideoPlayerConfig;\n private video: HTMLVideoElement;\n private callbacks: AdTimingCallbacks;\n\n constructor(\n config: StormcloudVideoPlayerConfig,\n video: HTMLVideoElement,\n callbacks: AdTimingCallbacks\n ) {\n this.config = config;\n this.video = video;\n this.callbacks = callbacks;\n }\n\n get debug(): boolean {\n return !!this.config.debugAdTiming;\n }\n\n // --- Ad stop timer ---\n\n scheduleAdStopCountdown(remainingMs: number): void {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.ensureAdStoppedByTimer();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.ensureAdStoppedByTimer();\n }, ms) as unknown as number;\n }\n\n clearAdStopTimer(): void {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = undefined;\n }\n }\n\n private ensureAdStoppedByTimer(): void {\n this.adStopTimerId = undefined;\n this.callbacks.onAdStopTimerFired();\n }\n\n // --- Ad start timer ---\n\n scheduleAdStartIn(\n delayMs: number,\n marker: Scte35Marker = { type: \"start\" } as Scte35Marker,\n cueKey?: string\n ): void {\n this.clearAdStartTimer();\n const ms = Math.max(0, Math.floor(delayMs));\n if (ms === 0) {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n return;\n }\n this.adStartTimerId = window.setTimeout(() => {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n }, ms) as unknown as number;\n }\n\n clearAdStartTimer(): void {\n if (this.adStartTimerId != null) {\n clearTimeout(this.adStartTimerId);\n this.adStartTimerId = undefined;\n }\n }\n\n // --- PTS drift ---\n\n updatePtsDrift(ptsSecondsSample: number): void {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1000;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 60000) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n\n resolveScteBreakStartWallClockMs(marker: Scte35Marker): number {\n const nowWallClockMs = Date.now();\n if (typeof marker.ptsSeconds !== \"number\") {\n return nowWallClockMs;\n }\n\n const nowMs = this.video.currentTime * 1000;\n const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n const deltaMs = marker.ptsSeconds * 1000 - estimatedCurrentPtsMs;\n if (!Number.isFinite(deltaMs)) {\n return nowWallClockMs;\n }\n\n return nowWallClockMs + Math.floor(deltaMs);\n }\n\n // --- Duration boundary ---\n\n setAdBreakDurationBoundary(durationMs: number | undefined): void {\n this.expectedAdBreakDurationMs = durationMs;\n if (\n durationMs != null &&\n this.currentAdBreakStartWallClockMs != null\n ) {\n this.scteAdBreakEndWallClockMs =\n this.currentAdBreakStartWallClockMs + durationMs;\n } else {\n this.scteAdBreakEndWallClockMs = undefined;\n }\n }\n\n scheduleAdStopAtBreakBoundary(): void {\n if (this.expectedAdBreakDurationMs == null) {\n return;\n }\n this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n }\n\n // --- Duration budget ---\n\n getWallClockRemainingAdMs(): number {\n const endWallClockMs = this.getAdBreakEndWallClockMs();\n if (endWallClockMs != null) {\n return Math.max(0, endWallClockMs - Date.now());\n }\n return 0;\n }\n\n getAdBreakEndWallClockMs(): number | undefined {\n if (this.scteAdBreakEndWallClockMs != null) {\n return this.scteAdBreakEndWallClockMs;\n }\n if (\n this.expectedAdBreakDurationMs == null ||\n this.currentAdBreakStartWallClockMs == null\n ) {\n return undefined;\n }\n return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n }\n\n getDurationBudgetRemainingMs(): number {\n if (this.expectedAdBreakDurationMs == null) {\n return 0;\n }\n return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n }\n\n getLoadedAdDurationMs(adController: AdController): number {\n const durationSec = adController.getLoadedAdDuration?.();\n if (durationSec == null || durationSec <= 0) {\n return 0;\n }\n return Math.round(durationSec * 1000);\n }\n\n adFitsRemainingBudget(durationMs: number): boolean {\n if (durationMs <= 0) {\n return true;\n }\n return durationMs <= this.getDurationBudgetRemainingMs();\n }\n\n logAdDurationDecision(\n accepted: boolean,\n durationMs: number,\n adController: AdController\n ): void {\n if (!this.debug) {\n return;\n }\n const remainingBudget = this.getDurationBudgetRemainingMs();\n const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n if (accepted) {\n console.log(\n `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n );\n } else {\n console.log(\n `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms — requesting another ad`\n );\n }\n }\n\n recordPlayedAdDuration(adController: AdController): void {\n const durationMs = this.getLoadedAdDurationMs(adController);\n if (durationMs <= 0) {\n return;\n }\n this.adBreakPlayedDurationMs += durationMs;\n if (this.debug) {\n console.log(\n `[AD-DURATION] Played ${durationMs}ms — total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n );\n }\n }\n\n ensureLoadedAdFitsBudget(adController: AdController): boolean {\n const durationMs = this.getLoadedAdDurationMs(adController);\n const fits = this.adFitsRemainingBudget(durationMs);\n this.logAdDurationDecision(fits, durationMs, adController);\n return fits;\n }\n\n rejectLoadedAdForDuration(adController: AdController): void {\n try {\n adController.destroy();\n } catch {}\n }\n\n markAdStarted(): void {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n this.totalAdRequestsInBreak++;\n this.lastAdRequestTime = Date.now();\n }\n\n notePodAdStarted(): void {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n }\n\n getRemainingAdMs(): number {\n const wallClockRemaining = this.getWallClockRemainingAdMs();\n const budgetRemaining = this.getDurationBudgetRemainingMs();\n if (this.expectedAdBreakDurationMs == null) {\n return wallClockRemaining;\n }\n return Math.min(wallClockRemaining, budgetRemaining);\n }\n\n getMinRemainingMsToStartAd(): number {\n const configured = this.config.minRemainingMsToStartAd;\n if (typeof configured === \"number\" && configured >= 0) {\n return configured;\n }\n return this.defaultMinRemainingMsToStartAd;\n }\n\n hasTimeToStartAnotherAd(): boolean {\n const minRemaining = this.getMinRemainingMsToStartAd();\n return (\n this.getWallClockRemainingAdMs() > minRemaining &&\n this.getDurationBudgetRemainingMs() > minRemaining\n );\n }\n\n // --- Circuit breaker ---\n\n isTemporaryAdError(error: Error): boolean {\n const message = error?.message?.toLowerCase() || \"\";\n\n if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n return true;\n }\n if (message.includes(\"timeout\")) {\n return true;\n }\n if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n return true;\n }\n if (message.includes(\"ad playback error\")) {\n return true;\n }\n return false;\n }\n\n isUrlInCooldown(vastTagUrl: string): boolean {\n const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n if (failureTime == null) {\n return false;\n }\n\n const elapsed = Date.now() - failureTime;\n if (elapsed >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(vastTagUrl);\n return false;\n }\n\n return true;\n }\n\n cleanupTemporaryFailures(): void {\n const now = Date.now();\n for (const [url, timestamp] of this.temporaryFailureUrls) {\n if (now - timestamp >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(url);\n }\n }\n }\n\n isGamInCooldown(): boolean {\n return Date.now() < this.globalNoFillCooldownUntil;\n }\n\n recordGamNoFill(): void {\n this.globalConsecutiveNoFills++;\n\n if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n const backoff = Math.min(\n this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n this.globalNoFillBackoffMaxMs\n );\n this.globalNoFillCooldownUntil = Date.now() + backoff;\n\n if (this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n );\n }\n }\n }\n\n resetGamNoFillCounter(): void {\n if (this.globalConsecutiveNoFills > 0 && this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n );\n }\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillCooldownUntil = 0;\n }\n\n async enforceGlobalRateLimit(): Promise<void> {\n const now = Date.now();\n const elapsed = now - this.globalLastGamRequestTime;\n if (elapsed < this.globalMinGamIntervalMs) {\n const waitMs = this.globalMinGamIntervalMs - elapsed;\n if (this.debug) {\n console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n }\n await new Promise(resolve => setTimeout(resolve, waitMs));\n }\n this.globalLastGamRequestTime = Date.now();\n }\n\n // --- Watchdog ---\n\n startAdRequestWatchdog(token: number): void {\n this.clearAdRequestWatchdog();\n\n const timeoutMs = this.config.adFailsafeTimeoutMs ?? 10000;\n this.adRequestWatchdogToken = token;\n this.adRequestWatchdogId = window.setTimeout(() => {\n if (this.adRequestWatchdogToken !== token) {\n return;\n }\n\n this.adRequestWatchdogId = undefined;\n this.adRequestWatchdogToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n\n this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n this.callbacks.onWatchdogTimeout();\n }, timeoutMs) as unknown as number;\n\n this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n }\n\n clearAdRequestWatchdog(): void {\n if (this.adRequestWatchdogId != null) {\n clearTimeout(this.adRequestWatchdogId);\n this.adRequestWatchdogId = undefined;\n }\n\n if (this.adRequestWatchdogToken != null) {\n this.logAdState(\"ad_request_watchdog_cleared\", {\n token: this.adRequestWatchdogToken,\n });\n this.adRequestWatchdogToken = null;\n }\n }\n\n // --- Failsafe ---\n\n startAdFailsafeTimer(token: number): void {\n this.clearAdFailsafeTimer();\n\n const failsafeMs = this.config.adFailsafeTimeoutMs ?? 10000;\n this.adFailsafeToken = token;\n\n this.adFailsafeTimerId = window.setTimeout(() => {\n if (this.adFailsafeToken !== token) {\n return;\n }\n\n this.adFailsafeTimerId = undefined;\n this.adFailsafeToken = null;\n\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n\n this.logAdState(\"ad_failsafe_triggered\", {\n token,\n failsafeMs,\n videoPaused: this.video.paused,\n });\n\n this.callbacks.onFailsafeTimeout();\n }, failsafeMs) as unknown as number;\n\n this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n }\n\n clearAdFailsafeTimer(): void {\n if (this.adFailsafeTimerId != null) {\n clearTimeout(this.adFailsafeTimerId);\n this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n this.adFailsafeTimerId = undefined;\n }\n\n this.adFailsafeToken = null;\n }\n\n logAdState(event: string, extra: Record<string, unknown> = {}): void {\n if (!this.debug) {\n return;\n }\n\n const { inAdBreak, showAds, adPlaying } = this.callbacks.getAdState();\n\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: new Date().toISOString(),\n showAds,\n adPlaying,\n inAdBreak,\n activeAdRequestToken: this.activeAdRequestToken,\n ...extra,\n });\n }\n\n // --- Reset for ad break end ---\n\n resetForBreakEnd(): void {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdRequestWatchdog();\n this.clearAdFailsafeTimer();\n this.activeAdRequestToken = null;\n this.expectedAdBreakDurationMs = undefined;\n this.currentAdBreakStartWallClockMs = undefined;\n this.scteAdBreakEndWallClockMs = undefined;\n this.adBreakPlayedDurationMs = 0;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.consecutiveFailures = 0;\n this.globalConsecutiveNoFills = 0;\n this.adBreakEpoch++;\n }\n\n destroy(): void {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdFailsafeTimer();\n this.clearAdRequestWatchdog();\n }\n}\n","export class PlaceholderLayer {\n private container: HTMLDivElement | undefined;\n private debug: boolean;\n private video: HTMLVideoElement;\n\n constructor(video: HTMLVideoElement, debug: boolean) {\n this.video = video;\n this.debug = debug;\n }\n\n private ensureContainer(): void {\n if (this.container) {\n return;\n }\n\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.left = \"0\";\n el.style.top = \"0\";\n el.style.right = \"0\";\n el.style.bottom = \"0\";\n el.style.display = \"none\";\n el.style.alignItems = \"center\";\n el.style.justifyContent = \"center\";\n el.style.pointerEvents = \"none\";\n el.style.zIndex = \"5\";\n el.style.backgroundColor = \"#000\";\n el.style.transition = \"opacity 0.3s ease-in-out\";\n el.style.opacity = \"0\";\n\n if (!this.video.parentElement) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n }\n return;\n }\n\n this.video.parentElement.appendChild(el);\n this.container = el;\n }\n\n show(): void {\n this.ensureContainer();\n\n if (!this.container) {\n return;\n }\n\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n }\n }\n\n const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n if (wasHidden) {\n this.container.style.transition = \"none\";\n } else {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n\n this.container.style.backgroundColor = \"#000\";\n this.container.style.display = \"flex\";\n this.container.offsetHeight;\n this.container.style.opacity = \"1\";\n this.container.style.pointerEvents = \"auto\";\n\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (this.container) {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n }\n }\n\n hide(): void {\n if (!this.container) {\n return;\n }\n\n this.container.style.opacity = \"0\";\n setTimeout(() => {\n if (this.container) {\n this.container.style.display = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.backgroundColor = \"#000\";\n }\n }, 300);\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n }\n }\n\n destroy(): void {\n if (this.container) {\n if (this.container.parentElement) {\n this.container.parentElement.removeChild(this.container);\n }\n this.container = undefined;\n }\n }\n}\n","import Hls from \"hls.js\";\nimport type {\n StormcloudVideoPlayerConfig,\n Scte35Marker,\n Id3TagInfo,\n} from \"../types\";\nimport type { Scte35CueContext } from \"./playerTypes\";\nimport {\n parseScte35FromId3,\n parseScte35FromTsPackets,\n normalizeFragmentPayload,\n getFragmentStartSeconds,\n parseCueOutDuration,\n parseCueOutCont,\n parseAttributeList,\n toNumber,\n} from \"./Scte35Parser\";\nimport type { Scte35CueManager } from \"./Scte35CueManager\";\nimport type { AdTimingService } from \"./AdTimingService\";\n\nexport interface HlsEngineCallbacks {\n onManifestParsed(isLive: boolean): Promise<void>;\n onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void;\n activatePendingCuesForFragment(frag: any): void;\n onFatalDestroy(): void;\n isInAdBreak(): boolean;\n hasPendingAdBreak(): boolean;\n}\n\nexport class HlsEngine {\n hls: Hls | undefined;\n isLiveStream: boolean = false;\n nativeHlsMode: boolean = false;\n videoSrcProtection: string | null = null;\n reloadingLiveStream: boolean = false;\n\n private bufferedSegmentsCount: number = 0;\n private shouldAutoplayAfterBuffering: boolean = false;\n private hasInitialBufferCompleted: boolean = false;\n\n private detectedLowLatencyStream: boolean | undefined;\n private latencyProfileApplied: boolean = false;\n\n private readonly config: StormcloudVideoPlayerConfig;\n private readonly video: HTMLVideoElement;\n private readonly cueManager: Scte35CueManager;\n private readonly timing: AdTimingService;\n private readonly callbacks: HlsEngineCallbacks;\n\n constructor(\n config: StormcloudVideoPlayerConfig,\n video: HTMLVideoElement,\n cueManager: Scte35CueManager,\n timing: AdTimingService,\n callbacks: HlsEngineCallbacks\n ) {\n this.config = config;\n this.video = video;\n this.cueManager = cueManager;\n this.timing = timing;\n this.callbacks = callbacks;\n }\n\n private get debug(): boolean {\n return !!this.config.debugAdTiming;\n }\n\n shouldUseNativeHls(getStreamType: () => \"hls\" | \"other\"): boolean {\n const streamType = getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n\n async setupNativeHls(): Promise<void> {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n\n this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n\n if (this.debug) {\n const adBehavior = this.isLiveStream\n ? \"live (main video continues muted during ads)\"\n : \"vod (main video pauses during ads)\";\n console.log(\n \"[StormcloudVideoPlayer] Using native HLS playback:\",\n {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior,\n }\n );\n }\n\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\n }\n }\n\n setupHls(): void {\n this.hls = new Hls({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: 1.1,\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1000 * 1000,\n maxBufferHole: 1,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.2,\n nudgeMaxRetry: 5,\n startPosition: -1,\n });\n\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n\n this.hls.on(Hls.Events.MANIFEST_PARSED, async (_, _data: any) => {\n this.isLiveStream =\n this.config.isLiveStream ??\n (this.hls?.levels?.some(\n (level) =>\n level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false);\n\n await this.callbacks.onManifestParsed(this.isLiveStream);\n\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n this.latencyProfileApplied = false;\n this.detectedLowLatencyStream = undefined;\n\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\n }\n }\n\n this.reloadingLiveStream = false;\n });\n\n this.hls.on(Hls.Events.LEVEL_LOADED, (_evt, data: any) => {\n this.applyStreamLatencyProfile(data?.details);\n\n if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n return;\n }\n\n const details = data?.details;\n if (!details || !details.fragments || details.fragments.length === 0) {\n return;\n }\n\n const fragmentsToScan = Math.min(5, details.fragments.length);\n\n for (let i = 0; i < fragmentsToScan; i++) {\n const frag = details.fragments[i];\n const tagList: any[] | undefined = frag?.tagList;\n\n if (!Array.isArray(tagList)) continue;\n\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n }\n }\n\n if (!tag) continue;\n\n if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = tag.includes(\"EXT-X-DATERANGE\")\n ? parseAttributeList(value)\n : {};\n const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") ||\n \"SCTE35-OUT\" in attrs ||\n attrs[\"SCTE35-OUT\"] !== undefined;\n\n if (hasScteOut) {\n const durationSeconds = parseCueOutDuration(value);\n const marker: Scte35Marker = {\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { tag, value, earlyDetection: true },\n } as Scte35Marker;\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n }\n\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag),\n });\n return;\n }\n }\n }\n }\n });\n\n this.hls.on(Hls.Events.FRAG_BUFFERED, async (_evt, _data: any) => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n\n if (this.shouldAutoplayAfterBuffering) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n\n this.hls.on(Hls.Events.FRAG_PARSING_METADATA, (_evt, data: any) => {\n const id3Tags: Id3TagInfo[] = (data?.samples || []).map((s: any) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts,\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n\n this.hls.on(Hls.Events.FRAG_LOADED, (_evt, data: any) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n getFragmentStartSeconds(data?.frag)\n );\n });\n\n this.hls.on(Hls.Events.FRAG_DECRYPTED, (_evt, data: any) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n getFragmentStartSeconds(data?.frag)\n );\n });\n\n this.hls.on(Hls.Events.FRAG_CHANGED, (_evt, data: any) => {\n const frag = data?.frag;\n const tagList: any[] | undefined = frag?.tagList;\n if (!Array.isArray(tagList)) {\n this.callbacks.activatePendingCuesForFragment(frag);\n return;\n }\n\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = parseCueOutCont(value);\n const marker: Scte35Marker = {\n type: \"progress\",\n ...(prog?.duration !== undefined\n ? { durationSeconds: prog.duration }\n : {}),\n ...(prog?.elapsed !== undefined\n ? { ptsSeconds: prog.elapsed }\n : {}),\n raw: { tag, value },\n } as Scte35Marker;\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = parseCueOutDuration(value);\n const marker: Scte35Marker = {\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { tag, value },\n } as Scte35Marker;\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n }\n );\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = parseAttributeList(value);\n const hasScteOut =\n \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n const hasScteIn =\n \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker: Scte35Marker = {\n type: \"start\",\n ...(duration !== undefined ? { durationSeconds: duration } : {}),\n raw: { tag, value, attrs },\n } as Scte35Marker;\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n });\n }\n if (hasScteIn) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value, attrs } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n }\n );\n }\n }\n }\n this.callbacks.activatePendingCuesForFragment(frag);\n });\n\n this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.callbacks.onFatalDestroy();\n break;\n }\n }\n });\n\n this.hls.attachMedia(this.video);\n }\n\n isLowLatencyStream(): boolean | undefined {\n return this.detectedLowLatencyStream;\n }\n\n private applyStreamLatencyProfile(details: any): void {\n if (this.latencyProfileApplied || !this.hls) {\n return;\n }\n if (!details) {\n return;\n }\n\n if (details.live !== true) {\n this.latencyProfileApplied = true;\n this.detectedLowLatencyStream = false;\n return;\n }\n\n const isLowLatencyManifest = this.isLowLatencyManifest(details);\n const useLowLatency = isLowLatencyManifest && !!this.config.lowLatencyMode;\n\n this.detectedLowLatencyStream = useLowLatency;\n this.latencyProfileApplied = true;\n\n const cfg = this.hls.config as any;\n if (useLowLatency) {\n cfg.maxLiveSyncPlaybackRate = 1.5;\n cfg.maxBufferHole = 0.5;\n delete cfg.liveSyncDuration;\n } else {\n cfg.maxLiveSyncPlaybackRate = 1.1;\n cfg.maxBufferHole = 1;\n delete cfg.liveSyncDuration;\n cfg.liveSyncDurationCount = 3;\n }\n\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live latency profile: ${\n useLowLatency ? \"LL-HLS (low latency)\" : \"standard live (stability)\"\n }`,\n {\n isLowLatencyManifest,\n lowLatencyModeRequested: !!this.config.lowLatencyMode,\n canBlockReload: details.canBlockReload,\n partTarget: details.partTarget,\n partHoldBack: details.partHoldBack,\n partListLength: Array.isArray(details.partList)\n ? details.partList.length\n : 0,\n targetDuration: details.targetduration ?? details.targetDuration,\n maxLiveSyncPlaybackRate: cfg.maxLiveSyncPlaybackRate,\n maxBufferHole: cfg.maxBufferHole,\n }\n );\n }\n }\n\n private isLowLatencyManifest(details: any): boolean {\n if (!details) {\n return false;\n }\n const hasParts =\n Array.isArray(details.partList) && details.partList.length > 0;\n const hasPartTarget =\n typeof details.partTarget === \"number\" && details.partTarget > 0;\n const hasPartHoldBack =\n typeof details.partHoldBack === \"number\" && details.partHoldBack > 0;\n const canBlockReload = details.canBlockReload === true;\n return hasParts || hasPartTarget || hasPartHoldBack || canBlockReload;\n }\n\n private onId3Tag(tag: Id3TagInfo): void {\n if (typeof tag.ptsSeconds === \"number\") {\n this.timing.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = parseScte35FromId3(tag);\n if (marker) {\n this.callbacks.onScte35Cue(marker, {\n source: \"id3\",\n readiness: \"playback\",\n });\n }\n }\n\n private processFragmentScte35Payload(\n payloadData: unknown,\n fragmentSn?: number,\n fragmentStartSeconds?: number\n ): void {\n const payload = normalizeFragmentPayload(payloadData);\n if (!payload) {\n return;\n }\n\n const markers = parseScte35FromTsPackets(\n payload,\n this.cueManager.tsScte35Pids,\n this.cueManager.pmtPids,\n this.cueManager.processedTsScte35Sections\n );\n markers.forEach((marker) => {\n const context: Scte35CueContext = {\n source: \"ts\",\n readiness: \"early\",\n };\n if (fragmentSn !== undefined) {\n context.fragmentSn = fragmentSn;\n }\n if (fragmentStartSeconds !== undefined) {\n context.fragmentStartSeconds = fragmentStartSeconds;\n }\n this.callbacks.onScte35Cue(marker, context);\n });\n }\n\n getLiveSyncPosition(): number | undefined {\n const pos = this.hls?.liveSyncPosition;\n return typeof pos === \"number\" && Number.isFinite(pos) ? pos : undefined;\n }\n\n restartLoadAt(position: number): void {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.stopLoad();\n this.hls.startLoad(position);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to restart HLS load at live edge:\", error);\n }\n }\n }\n\n recoverMediaError(): void {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.recoverMediaError();\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] recoverMediaError() failed:\", error);\n }\n }\n }\n\n reloadLiveStream(): void {\n const hls = this.hls;\n if (!hls) {\n return;\n }\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls → reset video → fresh setupHls)\"\n );\n }\n\n try {\n this.reloadingLiveStream = true;\n hls.stopLoad();\n hls.detachMedia();\n hls.destroy();\n this.hls = undefined;\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch (error) {\n console.warn(\"[StormcloudVideoPlayer] video.load() threw after src removal:\", error);\n }\n } catch (error) {\n this.reloadingLiveStream = false;\n this.hls = undefined;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to tear down during hard-reload:\", error);\n }\n return;\n }\n\n const recreateDelayMs = 600;\n window.setTimeout(() => {\n if (this.hls) {\n this.reloadingLiveStream = false;\n return;\n }\n try {\n this.setupHls();\n } catch (error) {\n this.reloadingLiveStream = false;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:\", error);\n }\n }\n }, recreateDelayMs);\n }\n\n destroy(): void {\n this.hls?.destroy();\n this.hls = undefined;\n }\n}\n","import type { AdController } from \"../types\";\n\nexport function getAdAudioVolume(adPlayer: AdController): number {\n return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\n\nexport function toggleMute(\n video: HTMLVideoElement,\n adPlayer: AdController,\n debug: boolean\n): void {\n if (adPlayer.isAdPlaying()) {\n const newMutedState = !adPlayer.getOriginalMutedState();\n const restoreVolume = adPlayer.getOriginalVolume() || 1;\n\n adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n newMutedState\n );\n }\n } else {\n video.muted = !video.muted;\n adPlayer.updateOriginalMutedState(video.muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n }\n }\n}\n\nexport function toggleFullscreen(\n video: HTMLVideoElement,\n debug: boolean\n): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container\n .requestFullscreen()\n .then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n }\n resolve();\n })\n .catch((err) => {\n if (debug) {\n console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n }\n reject(err);\n });\n } else {\n document\n .exitFullscreen()\n .then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n }\n resolve();\n })\n .catch((err) => {\n if (debug) {\n console.error(\n \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n err\n );\n }\n reject(err);\n });\n }\n });\n}\n\nexport function isMuted(\n video: HTMLVideoElement,\n adPlayer: AdController\n): boolean {\n if (adPlayer.isAdPlaying()) {\n return adPlayer.getOriginalMutedState();\n }\n return video.muted;\n}\n\nexport function setMuted(\n video: HTMLVideoElement,\n adPlayer: AdController,\n muted: boolean,\n debug: boolean\n): void {\n const adPlaying = adPlayer.isAdPlaying();\n\n if (adPlaying && muted === video.muted) {\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n { muted }\n );\n }\n return;\n }\n\n video.muted = muted;\n\n if (adPlaying) {\n adPlayer.updateOriginalMutedState(muted, video.volume);\n adPlayer.setAdVolume(muted ? 0 : 1);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n muted,\n });\n }\n return;\n }\n\n adPlayer.updateOriginalMutedState(muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n }\n}\n\nexport function setVolume(\n video: HTMLVideoElement,\n adPlayer: AdController,\n volume: number,\n debug: boolean\n): void {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n const adPlaying = adPlayer.isAdPlaying();\n\n if (adPlaying) {\n adPlayer.setAdVolume(clampedVolume);\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n volume: clampedVolume,\n });\n }\n } else {\n video.volume = clampedVolume;\n video.muted = clampedVolume === 0;\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n }\n }\n}\n\nexport function getVolume(\n video: HTMLVideoElement,\n adPlayer: AdController\n): number {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n return adPlayer.getAdVolume();\n }\n return video.volume;\n}\n\nexport function isFullscreen(): boolean {\n return !!document.fullscreenElement;\n}\n\nexport function resizePlayer(\n video: HTMLVideoElement,\n adPlayer: AdController,\n debug: boolean\n): void {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Resizing player\");\n }\n\n if (adPlayer && adPlayer.isAdPlaying()) {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n\n if (debug) {\n console.log(\n `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n );\n }\n\n adPlayer.resize(width, height);\n }\n}\n","import type {\n StormcloudVideoPlayerConfig,\n Scte35Marker,\n AdController,\n} from \"../types\";\nimport {\n buildAnalyticsContext,\n sendAdLoadedTracking,\n sendAdImpressionTracking,\n} from \"../utils/tracking\";\nimport type { AdTimingService } from \"./AdTimingService\";\nimport type { AdConfigManager } from \"./AdConfigManager\";\nimport type { Scte35CueManager } from \"./Scte35CueManager\";\nimport type { PlaceholderLayer } from \"./PlaceholderLayer\";\nimport { getAdAudioVolume } from \"./PlayerControls\";\n\nexport interface AdBreakOrchestratorHost {\n readonly config: StormcloudVideoPlayerConfig;\n readonly video: HTMLVideoElement;\n getAdPlayer(): AdController;\n setAdPlayer(player: AdController): void;\n createAdPlayer(continueLiveStreamDuringAds: boolean): AdController;\n shouldContinueLiveStreamDuringAds(): boolean;\n isLiveStream(): boolean;\n getLiveSyncPosition(): number | undefined;\n restartHlsLoad(position: number): void;\n reloadLiveStream(): void;\n recoverMediaError(): void;\n requiresMediaPipelineResetAfterAds(): boolean;\n generatePodVastUrl(baseUrl: string, breakDurationMs?: number): string;\n}\n\nexport class AdBreakOrchestrator {\n inAdBreak = false;\n showAds: boolean = false;\n isShowingPlaceholder: boolean = false;\n adDetectSentForCurrentBreak: boolean = false;\n\n private continuousFetchingActive: boolean = false;\n private continuousFetchLoopRunning = false;\n adRequestQueue: string[] = [];\n adPodQueue: string[] = [];\n private readonly maxPlaceholderDurationMs: number = 5000;\n\n pendingAdBreak: {\n marker: Scte35Marker;\n detectedAtFragmentSn?: number;\n vastUrls: string[];\n isFetching: boolean;\n fetchStartTime?: number;\n } | null = null;\n prefetchTimerId: number | undefined;\n\n private readonly host: AdBreakOrchestratorHost;\n private readonly timing: AdTimingService;\n private readonly adConfig: AdConfigManager;\n private readonly cueManager: Scte35CueManager;\n private readonly placeholder: PlaceholderLayer;\n\n constructor(\n host: AdBreakOrchestratorHost,\n timing: AdTimingService,\n adConfig: AdConfigManager,\n cueManager: Scte35CueManager,\n placeholder: PlaceholderLayer\n ) {\n this.host = host;\n this.timing = timing;\n this.adConfig = adConfig;\n this.cueManager = cueManager;\n this.placeholder = placeholder;\n }\n\n private get debug(): boolean {\n return !!this.host.config.debugAdTiming;\n }\n\n private get analyticsContext() {\n return buildAnalyticsContext(this.host.config);\n }\n\n // ───────────────────────────────────────────────────────────────\n // IMA event listeners\n // ───────────────────────────────────────────────────────────────\n\n private nextAdRequestUrl(baseVastUrl: string): string {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n const breakDurationMs = remaining > 0 ? remaining : undefined;\n return this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n\n attachImaEventListeners(): void {\n const adPlayer = this.host.getAdPlayer();\n adPlayer.on(\"pod_ad_started\", (payload?: any) => {\n this.timing.notePodAdStarted();\n if (this.debug) {\n console.log(\n `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n );\n }\n });\n adPlayer.on(\"all_ads_completed\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: new Date().toISOString() },\n this.analyticsContext\n ).catch(() => {});\n\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n\n this.timing.consecutiveFailures = 0;\n\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n\n if (this.inAdBreak) {\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n }\n });\n adPlayer.on(\"ad_error\", (errorPayload?: any) => {\n let errorMessage = \"Ad playback failed\";\n\n if (errorPayload) {\n const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n const vastErrorCode = errorPayload.vastErrorCode;\n const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n\n errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n\n if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n }\n\n if (cause) {\n const causeMessage = typeof cause === \"string\" ? cause : (cause.message || String(cause));\n errorMessage += `. Caused by: ${causeMessage}`;\n }\n }\n\n console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n this.handleAdFailure();\n });\n adPlayer.on(\"content_pause\", () => {\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = true;\n this.timing.resetGamNoFillCounter();\n\n if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n }\n }\n\n this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n\n if (this.isShowingPlaceholder) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n }\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n });\n adPlayer.on(\"content_resume\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: new Date().toISOString() },\n this.analyticsContext\n ).catch(() => {});\n\n if (!this.host.video.muted) {\n this.host.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n }\n }\n\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = false;\n\n if (!this.inAdBreak) {\n return;\n }\n\n this.timing.consecutiveFailures = 0;\n\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n });\n }\n\n recreateAdController(): void {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n }\n\n const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n const adPlayer = this.host.getAdPlayer();\n if (shouldShowPlaceholder && adPlayer) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n }\n this.placeholder.show();\n adPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n\n const preservedMutedState = adPlayer.getOriginalMutedState();\n const preservedVolumeState = adPlayer.getOriginalVolume();\n\n if (adPlayer) {\n try {\n adPlayer.destroy();\n this.host.video.muted = true;\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n }\n }\n }\n\n const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n this.host.setAdPlayer(newAdPlayer);\n\n newAdPlayer.initialize();\n newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n this.attachImaEventListeners();\n\n if (shouldShowPlaceholder) {\n this.placeholder.show();\n newAdPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n }\n\n clearPendingAdBreak(): void {\n if (this.prefetchTimerId != null) {\n clearTimeout(this.prefetchTimerId);\n this.prefetchTimerId = undefined;\n }\n this.pendingAdBreak = null;\n this.cueManager.pendingScte35CueKey = undefined;\n this.adConfig.podAssignedByPrefetch = false;\n }\n\n // ───────────────────────────────────────────────────────────────\n // Ad break start\n // ───────────────────────────────────────────────────────────────\n\n async handleAdStart(_marker: Scte35Marker): Promise<void> {\n const scheduled = this.adConfig.findCurrentOrNextBreak(\n this.host.video.currentTime * 1000\n );\n if (scheduled) {\n this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n }\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n\n let baseVastUrl: string;\n\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n this.clearPendingAdBreak();\n return;\n }\n\n const adBreakDurationMs =\n _marker.durationSeconds != null\n ? _marker.durationSeconds * 1000\n : scheduled?.durationMs;\n\n if (this.debug) {\n const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n console.log(\n `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n );\n }\n\n this.timing.failedVastUrls.clear();\n this.timing.temporaryFailureUrls.clear();\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.isShowingPlaceholder = false;\n this.timing.totalAdRequestsInBreak = 0;\n\n if (this.adConfig.podAssignedByPrefetch) {\n this.adConfig.podAssignedByPrefetch = false;\n } else {\n this.adConfig.beginNewAdPod();\n }\n\n const currentMuted = this.host.video.muted;\n const currentVolume = this.host.video.volume;\n this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n\n this.inAdBreak = true;\n this.timing.adBreakPlayedDurationMs = 0;\n this.timing.currentAdIndex = 0;\n this.timing.totalAdsInBreak = 0;\n this.adPodQueue = [];\n this.showAds = false;\n\n if (\n this.timing.expectedAdBreakDurationMs == null &&\n adBreakDurationMs != null\n ) {\n this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n }\n\n const podPlayed = await this.startOptimizedPod(\n baseVastUrl,\n adBreakDurationMs,\n currentMuted,\n currentVolume\n );\n\n if (!podPlayed) {\n if (this.debug) {\n console.log(\"[POD] Initial pod request did not fill; attempting top-up pod request\");\n }\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n }\n }\n\n // ───────────────────────────────────────────────────────────────\n // Optimized pod (single multi-ad request)\n // ───────────────────────────────────────────────────────────────\n\n private async startOptimizedPod(\n baseVastUrl: string,\n breakDurationMs: number | undefined,\n currentMuted: boolean,\n currentVolume: number\n ): Promise<boolean> {\n let podUrl: string | undefined;\n if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n podUrl = this.pendingAdBreak.vastUrls[0];\n this.clearPendingAdBreak();\n } else {\n podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n\n if (!podUrl) {\n return false;\n }\n\n this.continuousFetchingActive = false;\n\n this.recreateAdController();\n\n const adPlayer = this.host.getAdPlayer();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n await adPlayer.requestAds(podUrl);\n this.timing.clearAdRequestWatchdog();\n\n if (this.timing.activeAdRequestToken !== requestToken) {\n return true;\n }\n\n const podCount = adPlayer.getPodAdCount?.() ?? 1;\n if (podCount < 1) {\n return false;\n }\n\n if (this.debug) {\n console.log(\n podCount === 1\n ? \"[POD] Response contained a single ad; playing it and enabling pod top-up\"\n : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n );\n }\n\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: podUrl, timestamp: new Date().toISOString() },\n this.analyticsContext\n ).catch(() => {});\n\n this.timing.startAdFailsafeTimer(requestToken);\n await adPlayer.play();\n this.timing.markAdStarted();\n\n if (\n this.timing.expectedAdBreakDurationMs != null &&\n this.timing.getAdBreakEndWallClockMs() == null\n ) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n\n adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n this.timing.consecutiveFailures = 0;\n\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n\n return true;\n } catch (error) {\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n if (this.debug) {\n console.warn(\"[POD] Optimized pod request/play failed:\", error);\n }\n\n if (this.timing.isTemporaryAdError(error as Error)) {\n this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n }\n\n this.continuousFetchingActive = true;\n this.recreateAdController();\n return false;\n }\n }\n\n // ───────────────────────────────────────────────────────────────\n // Continuous fetching\n // ───────────────────────────────────────────────────────────────\n\n private startContinuousFetching(baseVastUrl: string): void {\n if (!this.continuousFetchingActive) {\n return;\n }\n\n if (this.continuousFetchLoopRunning) {\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n }\n return;\n }\n\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n }\n\n this.continuousFetchLoopRunning = true;\n this.continuousFetchLoop(baseVastUrl);\n }\n\n private async continuousFetchLoop(baseVastUrl: string): Promise<void> {\n const epoch = this.timing.adBreakEpoch;\n while (\n this.continuousFetchingActive &&\n this.inAdBreak &&\n epoch === this.timing.adBreakEpoch\n ) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n\n if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n }\n break;\n }\n\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n }\n break;\n }\n\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n }\n break;\n }\n\n if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n }\n break;\n }\n\n const maxQueueSize = 5;\n if (this.adRequestQueue.length >= maxQueueSize) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n }\n await new Promise(resolve => setTimeout(resolve, 1000));\n continue;\n }\n\n const newAdUrl = this.nextAdRequestUrl(baseVastUrl);\n\n if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n await new Promise(resolve => setTimeout(resolve, 500));\n continue;\n }\n\n if (this.debug) {\n const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n console.log(\n `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n { queuedUrls: queuedUrlsPreview }\n );\n }\n\n this.adRequestQueue.push(newAdUrl);\n\n const generationDelay = this.timing.consecutiveFailures > 0\n ? Math.min(1000 * Math.pow(2, this.timing.consecutiveFailures), 5000)\n : 500;\n await new Promise(resolve => setTimeout(resolve, generationDelay));\n }\n\n this.continuousFetchLoopRunning = false;\n\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n }\n\n stopContinuousFetching(): void {\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n\n this.placeholder.hide();\n\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n }\n }\n\n // ───────────────────────────────────────────────────────────────\n // Ad iteration\n // ───────────────────────────────────────────────────────────────\n\n async tryNextAvailableAdWithRateLimit(): Promise<void> {\n if (!this.inAdBreak) {\n return;\n }\n\n const epoch = this.timing.adBreakEpoch;\n\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n }\n this.handleAdPodComplete();\n return;\n }\n\n const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n\n const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n if (timeSinceLastRequest < effectiveMinInterval) {\n const waitTime = effectiveMinInterval - timeSinceLastRequest;\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n }\n await new Promise(resolve => setTimeout(resolve, waitTime));\n }\n\n if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n return;\n }\n\n return this.tryNextAvailableAd(0);\n }\n\n private async tryNextAvailableAd(retryCount: number = 0): Promise<void> {\n if (!this.inAdBreak) {\n return;\n }\n\n const remaining = this.timing.getRemainingAdMs();\n\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n }\n this.handleAdPodComplete();\n return;\n }\n\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n\n this.timing.cleanupTemporaryFailures();\n\n while (this.adRequestQueue.length > 0) {\n const nextAdUrl = this.adRequestQueue.shift();\n\n if (!nextAdUrl) continue;\n\n if (this.timing.failedVastUrls.has(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n continue;\n }\n\n if (this.timing.isUrlInCooldown(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n continue;\n }\n\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n }\n\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = (error as Error).message;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n\n const maxRetries = 3;\n if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2000) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n }\n await new Promise(resolve => setTimeout(resolve, 500));\n await this.tryNextAvailableAd(retryCount + 1);\n return;\n }\n\n if (!this.isShowingPlaceholder && remaining > 1000) {\n this.showPlaceholderAndWaitForAds();\n } else {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n this.handleAdPodComplete();\n }\n }\n\n // ───────────────────────────────────────────────────────────────\n // Single ad playback\n // ───────────────────────────────────────────────────────────────\n\n async playSingleAd(vastTagUrl: string): Promise<void> {\n const adPlayer = this.host.getAdPlayer();\n if (adPlayer.isAdPlaying()) return;\n\n if (this.timing.failedVastUrls.has(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n throw new Error(\"VAST URL permanently failed\");\n }\n\n if (this.timing.isUrlInCooldown(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n throw new Error(\"VAST URL in cooldown after no-fill\");\n }\n\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n throw new Error(\"Too many consecutive failures\");\n }\n\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n throw new Error(\"GAM in cooldown\");\n }\n\n this.recreateAdController();\n\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n const ap = this.host.getAdPlayer();\n await ap.requestAds(vastTagUrl);\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: vastTagUrl, timestamp: new Date().toISOString() },\n this.analyticsContext\n ).catch(() => {});\n\n this.timing.clearAdRequestWatchdog();\n\n if (this.timing.activeAdRequestToken !== requestToken) return;\n\n if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n this.timing.rejectLoadedAdForDuration(ap);\n this.recreateAdController();\n throw new Error(\"ad_duration_exceeds_budget\");\n }\n\n try {\n this.timing.startAdFailsafeTimer(requestToken);\n await ap.play();\n this.timing.markAdStarted();\n\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n\n ap.setAdVolume(getAdAudioVolume(ap));\n this.timing.consecutiveFailures = 0;\n this.timing.temporaryFailureUrls.delete(vastTagUrl);\n } catch (playError) {\n if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n\n if (this.timing.isTemporaryAdError(playError as Error)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n }\n\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw playError;\n }\n } catch (error) {\n const errorMessage = (error as Error)?.message || \"\";\n if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n\n if (this.timing.isTemporaryAdError(error as Error)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n }\n\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw error;\n }\n }\n\n // ───────────────────────────────────────────────────────────────\n // Placeholder wait\n // ───────────────────────────────────────────────────────────────\n\n private async showPlaceholderAndWaitForAds(): Promise<void> {\n const remaining = this.timing.getRemainingAdMs();\n const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n this.handleAdPodComplete();\n return;\n }\n\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n this.handleAdPodComplete();\n return;\n }\n\n if (waitTime < 1000) {\n this.handleAdPodComplete();\n return;\n }\n\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n }\n\n this.isShowingPlaceholder = true;\n this.host.getAdPlayer().showPlaceholder();\n\n const checkInterval = 300;\n const maxChecks = Math.floor(waitTime / checkInterval);\n\n for (let i = 0; i < maxChecks; i++) {\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n\n if (!this.inAdBreak) return;\n\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n break;\n }\n\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n break;\n }\n\n while (this.adRequestQueue.length > 0) {\n if (!this.timing.hasTimeToStartAnotherAd()) break;\n\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = (error as Error).message;\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n }\n\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n this.handleAdPodComplete();\n }\n\n // ───────────────────────────────────────────────────────────────\n // Ad break completion\n // ───────────────────────────────────────────────────────────────\n\n handleAdPodComplete(): void {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n }\n\n this.timing.resetForBreakEnd();\n\n this.stopContinuousFetching();\n this.clearPendingAdBreak();\n\n if (this.isShowingPlaceholder) {\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n\n this.adRequestQueue = [];\n\n this.inAdBreak = false;\n this.adDetectSentForCurrentBreak = false;\n this.cueManager.activeScte35BreakKey = undefined;\n this.cueManager.scheduledScte35BreakKey = undefined;\n this.adPodQueue = [];\n this.showAds = false;\n\n this.host.getAdPlayer().stop().catch(() => {});\n\n const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n\n if (this.host.video.muted !== restoredMuted) {\n this.host.video.muted = restoredMuted;\n }\n if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n this.host.video.volume = restoredVolume;\n }\n\n this.host.video.style.visibility = \"visible\";\n this.host.video.style.opacity = \"1\";\n\n if (this.host.isLiveStream()) {\n if (this.host.requiresMediaPipelineResetAfterAds()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Live break end — hard-reloading stream to reacquire decoder (single-decoder platform)\"\n );\n }\n this.host.reloadLiveStream();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n\n const liveSyncPos = this.host.getLiveSyncPosition();\n if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live break end — snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s → ${liveSyncPos.toFixed(2)}s`\n );\n }\n this.host.video.currentTime = liveSyncPos;\n this.host.restartHlsLoad(liveSyncPos);\n }\n this.resumeContentPlayback();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n\n this.resumeContentPlayback();\n }\n\n private getBufferedAhead(): number {\n const video = this.host.video;\n const t = video.currentTime;\n const ranges = video.buffered;\n for (let i = 0; i < ranges.length; i++) {\n if (t >= ranges.start(i) - 0.5 && t <= ranges.end(i)) {\n return ranges.end(i) - t;\n }\n }\n return 0;\n }\n\n private describeVideoState(): string {\n const v = this.host.video;\n const networkStates = [\"EMPTY\", \"IDLE\", \"LOADING\", \"NO_SOURCE\"];\n const readyStates = [\n \"HAVE_NOTHING\",\n \"HAVE_METADATA\",\n \"HAVE_CURRENT_DATA\",\n \"HAVE_FUTURE_DATA\",\n \"HAVE_ENOUGH_DATA\",\n ];\n const net = networkStates[v.networkState] ?? String(v.networkState);\n const ready = readyStates[v.readyState] ?? String(v.readyState);\n const err = v.error\n ? `code=${v.error.code}${v.error.message ? ` (${v.error.message})` : \"\"}`\n : \"none\";\n const ranges: string[] = [];\n for (let i = 0; i < v.buffered.length; i++) {\n ranges.push(`[${v.buffered.start(i).toFixed(2)}–${v.buffered.end(i).toFixed(2)}]`);\n }\n return (\n `t=${v.currentTime.toFixed(2)}s paused=${v.paused} ended=${v.ended} seeking=${v.seeking} ` +\n `readyState=${ready} networkState=${net} error=${err} ` +\n `buffered=${ranges.length ? ranges.join(\",\") : \"none\"}`\n );\n }\n\n private monitorLiveResumeStall(resumeBaseline: number): void {\n const needsReset = this.host.requiresMediaPipelineResetAfterAds();\n const pollIntervalMs = 1000;\n const graceMs = needsReset ? 8000 : 5000;\n const recoveryCooldownMs = needsReset ? 7000 : 5000;\n const maxRecoveries = 3;\n const maxMonitorMs = 45000;\n\n const startTime = Date.now();\n let baseline = resumeBaseline;\n let recoveries = 0;\n let lastRecoveryAt = 0;\n\n const video = this.host.video;\n let listenersAttached = false;\n let onMediaEvent: ((e: Event) => void) | undefined;\n const diagEvents = [\n \"loadstart\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"stalled\",\n \"suspend\",\n \"seeking\",\n \"seeked\",\n \"emptied\",\n \"error\",\n \"ended\",\n ];\n if (this.debug) {\n onMediaEvent = (e: Event) => {\n const dt = ((Date.now() - startTime) / 1000).toFixed(1);\n console.log(\n `[ResumeDiag] +${dt}s event=${e.type} — ${this.describeVideoState()}`\n );\n };\n for (const name of diagEvents) {\n video.addEventListener(name, onMediaEvent);\n }\n listenersAttached = true;\n console.log(\n `[ResumeDiag] +0.0s monitor start — ${this.describeVideoState()}`\n );\n }\n\n const cleanup = (): void => {\n if (listenersAttached && onMediaEvent) {\n for (const name of diagEvents) {\n video.removeEventListener(name, onMediaEvent);\n }\n listenersAttached = false;\n }\n };\n\n const poll = (): void => {\n if (this.inAdBreak) {\n cleanup();\n return;\n }\n\n const currentTime = video.currentTime;\n const advanced = currentTime > baseline + 0.5;\n const playing = !video.paused && video.readyState >= 3;\n\n if (advanced && playing) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live stream resumed successfully after ad break — ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n\n if (video.paused) {\n video.play()?.catch(() => {});\n }\n\n const elapsed = Date.now() - startTime;\n const bufferedAhead = this.getBufferedAhead();\n const wedged = bufferedAhead < 0.5 && !advanced;\n\n if (elapsed >= maxMonitorMs) {\n if (this.debug && !advanced) {\n console.warn(\n `[StormcloudVideoPlayer] Live stream failed to resume after ${(maxMonitorMs / 1000).toFixed(0)}s — ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n\n const canRecover =\n wedged &&\n elapsed >= graceMs &&\n Date.now() - lastRecoveryAt >= recoveryCooldownMs &&\n recoveries < maxRecoveries;\n\n if (canRecover) {\n recoveries++;\n lastRecoveryAt = Date.now();\n\n if (needsReset) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break — hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) — ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n } else if (recoveries === 1) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break — calling recoverMediaError() (recovery ${recoveries}/${maxRecoveries}) — ${this.describeVideoState()}`\n );\n }\n this.host.recoverMediaError();\n } else if (recoveries === 2) {\n const liveSyncPos = this.host.getLiveSyncPosition();\n const reloadPos =\n liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;\n\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break — restarting HLS load at ${reloadPos.toFixed(2)}s (recovery ${recoveries}/${maxRecoveries}) — ${this.describeVideoState()}`\n );\n }\n\n if (liveSyncPos != null && liveSyncPos > currentTime) {\n video.currentTime = liveSyncPos;\n }\n this.host.restartHlsLoad(reloadPos);\n } else {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break — hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) — ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n }\n\n baseline = video.currentTime;\n if (video.paused) {\n video.play()?.catch(() => {});\n }\n }\n\n window.setTimeout(poll, pollIntervalMs);\n };\n\n window.setTimeout(poll, pollIntervalMs);\n }\n\n private resumeContentPlayback(attempt: number = 0): void {\n const maxAttempts = 5;\n const video = this.host.video;\n\n if (!video.paused) {\n if (this.debug && attempt === 0) {\n console.log(\"[StormcloudVideoPlayer] Content video already playing after ads\");\n }\n return;\n }\n\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Resuming content playback after ads (attempt ${attempt + 1}/${maxAttempts}, readyState=${video.readyState})`\n );\n }\n\n if (video.readyState < 3) {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] readyState never reached HAVE_FUTURE_DATA, forcing play()\"\n );\n }\n video.play()?.catch(() => {});\n return;\n }\n\n const onReady = (): void => {\n video.removeEventListener(\"canplay\", onReady);\n this.resumeContentPlayback(attempt + 1);\n };\n video.addEventListener(\"canplay\", onReady);\n\n const backoffMs = 500 * (attempt + 1);\n window.setTimeout(() => {\n video.removeEventListener(\"canplay\", onReady);\n if (video.paused) {\n this.resumeContentPlayback(attempt + 1);\n }\n }, backoffMs);\n return;\n }\n\n const playResult = video.play();\n if (playResult && typeof playResult.catch === \"function\") {\n playResult.catch((error) => {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to resume content playback after ads:\",\n error\n );\n }\n return;\n }\n const backoffMs = 250 * (attempt + 1);\n window.setTimeout(() => {\n this.resumeContentPlayback(attempt + 1);\n }, backoffMs);\n });\n }\n }\n\n handleAdFailure(): void {\n this.timing.consecutiveFailures++;\n this.timing.recordGamNoFill();\n const remaining = this.timing.getRemainingAdMs();\n\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n this.handleAdPodComplete();\n return;\n }\n\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n this.handleAdPodComplete();\n }\n }\n}\n","import type {\n StormcloudVideoPlayerConfig,\n Scte35Marker,\n AdController,\n AdBreak,\n} from \"../types\";\nimport { createHlsAdPlayer } from \"../sdk/hlsAdPlayer\";\nimport { createPalNonceManager } from \"../sdk/pal\";\nimport type { PalNonceManager } from \"../sdk/pal\";\nimport {\n buildAnalyticsContext,\n sendAdDetectTracking,\n} from \"../utils/tracking\";\nimport { initializePolyfills } from \"../utils/polyfills\";\nimport { fetchConsentSignals } from \"../utils/vastMacros\";\nimport {\n logBrowserInfo,\n getBrowserConfigOverrides,\n requiresMediaPipelineResetAfterAds,\n} from \"../utils/browserCompat\";\n\nimport { isManifestBasedMarker } from \"./Scte35Parser\";\nimport { Scte35CueManager } from \"./Scte35CueManager\";\nimport { AdConfigManager } from \"./AdConfigManager\";\nimport { AdTimingService } from \"./AdTimingService\";\nimport { PlaceholderLayer } from \"./PlaceholderLayer\";\nimport { HlsEngine } from \"./HlsEngine\";\nimport { AdBreakOrchestrator } from \"./AdBreakOrchestrator\";\nimport {\n toggleMute as ctrlToggleMute,\n toggleFullscreen as ctrlToggleFullscreen,\n isMuted as ctrlIsMuted,\n setMuted as ctrlSetMuted,\n setVolume as ctrlSetVolume,\n getVolume as ctrlGetVolume,\n isFullscreen as ctrlIsFullscreen,\n resizePlayer as ctrlResizePlayer,\n} from \"./PlayerControls\";\n\nexport class StormcloudVideoPlayer {\n private readonly video: HTMLVideoElement;\n private readonly config: StormcloudVideoPlayerConfig;\n private adPlayer: AdController;\n private attached = false;\n\n private timeUpdateHandler?: (event: Event) => void;\n private endedHandler?: (event: Event) => void;\n private emptiedHandler?: (event: Event) => void;\n\n private palNonce: PalNonceManager;\n private palPlaybackStarted: boolean = false;\n\n private readonly cueManager: Scte35CueManager;\n private readonly adConfig: AdConfigManager;\n private readonly timing: AdTimingService;\n private readonly placeholder: PlaceholderLayer;\n private readonly hlsEngine: HlsEngine;\n private readonly adBreak: AdBreakOrchestrator;\n\n constructor(config: StormcloudVideoPlayerConfig) {\n initializePolyfills();\n\n const browserOverrides = getBrowserConfigOverrides();\n\n this.config = { ...browserOverrides, ...config };\n this.video = config.videoElement;\n\n logBrowserInfo(config.debugAdTiming);\n\n this.adPlayer = this.createAdPlayer(false);\n this.palNonce = createPalNonceManager();\n\n this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {\n onEarlyStartCue: (marker, fragmentSn, cueKey) => {\n this.startAdPrefetch(marker, fragmentSn, cueKey);\n },\n onPlaybackCue: (marker, cueKey) => {\n this.onScte35Marker(marker, cueKey);\n },\n isInAdBreak: () => this.adBreak.inAdBreak,\n });\n\n this.adConfig = new AdConfigManager(this.config, this.video);\n\n this.timing = new AdTimingService(this.config, this.video, {\n onAdStopTimerFired: () => this.onAdStopTimerFired(),\n onAdStartTimerFired: (marker, cueKey) => {\n this.startScte35AdBreak(\n marker,\n cueKey,\n marker.durationSeconds != null ? marker.durationSeconds * 1000 : this.timing.expectedAdBreakDurationMs\n );\n },\n onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n onFailsafeTimeout: () => this.adBreak.handleAdFailure(),\n getAdState: () => ({\n inAdBreak: this.adBreak.inAdBreak,\n showAds: this.adBreak.showAds,\n adPlaying: this.adPlayer.isAdPlaying(),\n }),\n });\n\n this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n\n this.hlsEngine = new HlsEngine(this.config, this.video, this.cueManager, this.timing, {\n onManifestParsed: async (isLive) => this.onManifestParsed(isLive),\n onScte35Cue: (marker, context) => this.cueManager.onScte35Cue(marker, context),\n activatePendingCuesForFragment: (frag) => this.cueManager.activatePendingScte35CuesForFragment(frag),\n onFatalDestroy: () => this.destroy(),\n isInAdBreak: () => this.adBreak.inAdBreak,\n hasPendingAdBreak: () => this.adBreak.pendingAdBreak !== null,\n });\n\n this.adBreak = new AdBreakOrchestrator(\n {\n config: this.config,\n video: this.video,\n getAdPlayer: () => this.adPlayer,\n setAdPlayer: (p) => { this.adPlayer = p; },\n createAdPlayer: (c) => this.createAdPlayer(c),\n shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n isLiveStream: () => this.hlsEngine.isLiveStream,\n getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n restartHlsLoad: (position) => this.hlsEngine.restartLoadAt(position),\n reloadLiveStream: () => this.hlsEngine.reloadLiveStream(),\n recoverMediaError: () => this.hlsEngine.recoverMediaError(),\n requiresMediaPipelineResetAfterAds: () => requiresMediaPipelineResetAfterAds(),\n generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs),\n },\n this.timing,\n this.adConfig,\n this.cueManager,\n this.placeholder\n );\n }\n\n private get debug(): boolean {\n return !!this.config.debugAdTiming;\n }\n\n private createAdPlayer(continueLiveStreamDuringAds: boolean): AdController {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n }\n return createHlsAdPlayer(this.video, {\n continueLiveStreamDuringAds,\n ...(this.config.licenseKey\n ? { licenseKey: this.config.licenseKey }\n : {}),\n ...(this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}),\n });\n }\n\n private generatePodVastUrl(baseUrl: string, breakDurationMs?: number): string {\n const podParams = this.adConfig.resolvePodParams(breakDurationMs);\n return this.adConfig.generatePodVastUrl(\n baseUrl, podParams, this.adPlayer, this.palNonce, this.adBreak.inAdBreak\n );\n }\n\n // ───────────────────────────────────────────────────────────────\n // Lifecycle\n // ───────────────────────────────────────────────────────────────\n\n async load(): Promise<void> {\n if (!this.attached) {\n this.attach();\n }\n\n try {\n await this.adConfig.fetchAdConfiguration();\n } catch (error) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n error\n );\n }\n }\n\n const palDescriptionUrl = this.adConfig.getPalDescriptionUrl();\n this.palNonce.generateNonce({\n videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,\n videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,\n adWillAutoPlay: !!this.config.autoplay,\n adWillPlayMuted: true,\n playerVolume: 0,\n continuousPlayback: this.config.lowLatencyMode ?? false,\n ...(palDescriptionUrl ? { descriptionUrl: palDescriptionUrl } : {}),\n }).catch(() => {});\n\n fetchConsentSignals()\n .then((signals) => {\n this.adConfig.consentSignals = signals;\n })\n .catch(() => {});\n\n this.adConfig.initializeTracking();\n\n if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n await this.hlsEngine.setupNativeHls();\n\n const continueLiveStreamDuringAds = this.shouldContinueLiveStreamDuringAds();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Native HLS ad behavior:\", {\n isLive: this.hlsEngine.isLiveStream,\n continueLiveStreamDuringAds,\n });\n }\n\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n this.adPlayer.initialize();\n return;\n }\n\n this.hlsEngine.setupHls();\n }\n\n private async onManifestParsed(isLive: boolean): Promise<void> {\n if (this.hlsEngine.reloadingLiveStream) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Manifest re-parsed after hard reload — skipping ad-player setup\");\n }\n return;\n }\n\n if (\n !this.adConfig.isVmapEnabled() &&\n !isLive &&\n this.adConfig.vmapBreaks.length === 0 &&\n this.adConfig.apiVastTagUrl\n ) {\n const prerollKey = \"synthetic-vod-preroll\";\n if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {\n this.adConfig.vmapBreaks = [\n { id: prerollKey, startTimeMs: 0, vastTagUrl: this.adConfig.apiVastTagUrl },\n ];\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Injected synthetic VOD preroll from apiVastTagUrl\"\n );\n }\n }\n }\n\n if (this.debug) {\n const adBehavior = this.shouldContinueLiveStreamDuringAds()\n ? \"live (main video continues muted during ads)\"\n : \"vod (main video pauses during ads)\";\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior,\n });\n }\n\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n this.adPlayer.initialize();\n }\n\n private attach(): void {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n\n this.adPlayer.initialize();\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.attachImaEventListeners();\n\n this.video.addEventListener(\"play\", () => {\n if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n this.palPlaybackStarted = true;\n this.palNonce.sendPlaybackStart();\n }\n });\n\n this.endedHandler = () => {\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.onVideoEnded();\n };\n this.video.addEventListener(\"ended\", this.endedHandler);\n\n this.video.addEventListener(\"mousedown\", (e) => {\n this.palNonce.sendAdTouch(e as MouseEvent);\n });\n\n this.video.addEventListener(\"touchstart\", (e) => {\n this.palNonce.sendAdTouch(e as TouchEvent);\n });\n\n this.timeUpdateHandler = () => {\n this.onTimeUpdate(this.video.currentTime);\n };\n this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n\n this.emptiedHandler = () => {\n if (\n this.hlsEngine.nativeHlsMode &&\n this.hlsEngine.videoSrcProtection &&\n !this.adPlayer.isAdPlaying()\n ) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Video src was cleared, restoring:\",\n this.hlsEngine.videoSrcProtection\n );\n }\n const currentTime = this.video.currentTime;\n const wasPaused = this.video.paused;\n this.video.src = this.hlsEngine.videoSrcProtection;\n this.video.currentTime = currentTime;\n if (!wasPaused) {\n this.video.play().catch(() => {});\n }\n }\n };\n this.video.addEventListener(\"emptied\", this.emptiedHandler);\n }\n\n private shouldContinueLiveStreamDuringAds(): boolean {\n if (this.config.pauseContentDuringAds) {\n return false;\n }\n\n if (this.hlsEngine.isLiveStream) {\n return true;\n }\n\n const duration = this.video.duration;\n if (!Number.isFinite(duration) || duration === Infinity) {\n return true;\n }\n\n return false;\n }\n\n // ───────────────────────────────────────────────────────────────\n // SCTE-35 marker orchestration\n // ───────────────────────────────────────────────────────────────\n\n private onScte35Marker(marker: Scte35Marker, cueKey?: string): void {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n type: marker.type,\n ptsSeconds: marker.ptsSeconds,\n durationSeconds: marker.durationSeconds,\n currentTime: this.video.currentTime,\n raw: marker.raw,\n hasPendingAdBreak: !!this.adBreak.pendingAdBreak,\n });\n }\n\n if (marker.type === \"start\") {\n if (this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n const newDurationMs = marker.durationSeconds * 1000;\n if (this.timing.expectedAdBreakDurationMs == null || newDurationMs > this.timing.expectedAdBreakDurationMs) {\n this.timing.setAdBreakDurationBoundary(newDurationMs);\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Updated ad break duration from subsequent marker: ${newDurationMs}ms, remaining: ${this.timing.getWallClockRemainingAdMs()}ms`\n );\n }\n }\n }\n return;\n }\n\n if (!this.adBreak.adDetectSentForCurrentBreak) {\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload: {\n durationSeconds?: number;\n ptsSeconds?: number;\n detectedAtFragmentSn?: number;\n } = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: new Date().toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {});\n }\n\n const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n\n const durationMs =\n marker.durationSeconds != null\n ? marker.durationSeconds * 1000\n : (this.adBreak.pendingAdBreak?.marker.durationSeconds != null\n ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1000\n : undefined);\n\n const isManifest = isManifestBasedMarker(marker);\n const forceImmediate = this.config.immediateManifestAds ?? true;\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n isManifestMarker: isManifest,\n forceImmediate,\n hasPts: typeof marker.ptsSeconds === \"number\",\n hasPrefetchedAds,\n });\n }\n\n if (isManifest && forceImmediate) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Starting ad immediately (manifest-based)${hasPrefetchedAds ? \" with prefetched ads\" : \"\"}`\n );\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n } else if (typeof marker.ptsSeconds === \"number\") {\n const tol = this.config.driftToleranceMs ?? 1000;\n const nowMs = this.video.currentTime * 1000;\n const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n const deltaMs = Math.floor(marker.ptsSeconds * 1000 - estCurrentPtsMs);\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n nowMs,\n estCurrentPtsMs,\n markerPtsMs: marker.ptsSeconds * 1000,\n deltaMs,\n tolerance: tol,\n });\n }\n\n if (deltaMs > tol) {\n if (this.debug) {\n console.log(`[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`);\n }\n this.timing.expectedAdBreakDurationMs = durationMs;\n this.cueManager.scheduledScte35BreakKey = cueKey;\n this.timing.scheduleAdStartIn(deltaMs, marker, cueKey);\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (fallback)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n return;\n }\n if (marker.type === \"progress\" && this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.timing.setAdBreakDurationBoundary(marker.durationSeconds * 1000);\n }\n this.timing.scheduleAdStopAtBreakBoundary();\n\n if (\n !this.adPlayer.isAdPlaying() &&\n this.timing.activeAdRequestToken === null &&\n this.adBreak.adRequestQueue.length > 0 &&\n this.timing.hasTimeToStartAnotherAd()\n ) {\n this.adBreak.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n if (marker.type === \"end\") {\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on SCTE end marker\");\n }\n }\n\n const remaining = this.timing.getRemainingAdMs();\n const adPlaying = this.adPlayer.isAdPlaying();\n const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 end marker received:\", {\n remaining,\n adPlaying,\n hasQueuedAds,\n activeAdRequest: this.timing.activeAdRequestToken !== null,\n });\n }\n\n this.timing.scteAdBreakEndWallClockMs = Date.now();\n this.timing.clearAdStartTimer();\n this.timing.clearAdStopTimer();\n\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {});\n }\n\n this.adBreak.handleAdPodComplete();\n return;\n }\n }\n\n private startScte35AdBreak(\n marker: Scte35Marker,\n cueKey: string | undefined,\n durationMs: number | undefined\n ): void {\n this.adBreak.inAdBreak = true;\n this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n this.cueManager.scheduledScte35BreakKey = undefined;\n this.timing.currentAdBreakStartWallClockMs =\n this.timing.resolveScteBreakStartWallClockMs(marker);\n this.timing.setAdBreakDurationBoundary(durationMs);\n\n this.adBreak.handleAdStart(marker);\n\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n\n private onAdStopTimerFired(): void {\n if (!this.adBreak.inAdBreak) return;\n\n const adPlaying = this.adPlayer.isAdPlaying();\n const checkIntervalMs = Math.max(\n 250,\n Math.floor(this.config.adBreakCheckIntervalMs ?? 1000)\n );\n const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n const maxExtensionMs =\n typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0\n ? maxExtensionMsConfig\n : 0;\n\n const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n\n const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n\n if (shouldExtendAdBreak) {\n this.timing.scheduleAdStopCountdown(checkIntervalMs);\n return;\n }\n\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Ad break boundary reached (overrun=${overrunMs}ms) - hard-stopping ads and resuming stream`\n );\n }\n\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {});\n }\n\n this.adBreak.handleAdPodComplete();\n }\n\n // ───────────────────────────────────────────────────────────────\n // Ad prefetch\n // ───────────────────────────────────────────────────────────────\n\n private startAdPrefetch(\n marker: Scte35Marker,\n fragmentSn?: number,\n cueKey?: string\n ): void {\n if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n\n const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1000);\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n\n let baseVastUrl: string;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n if (this.debug) console.warn(\"[StormcloudVideoPlayer] No VAST URL available for prefetch\");\n return;\n }\n\n this.adConfig.beginNewAdPod();\n this.adConfig.podAssignedByPrefetch = true;\n\n const breakDurationMs =\n marker.durationSeconds != null ? marker.durationSeconds * 1000 : undefined;\n\n const generatedUrls = [this.generatePodVastUrl(baseVastUrl, breakDurationMs)];\n\n this.adBreak.pendingAdBreak = {\n marker,\n ...(fragmentSn !== undefined ? { detectedAtFragmentSn: fragmentSn } : {}),\n vastUrls: generatedUrls,\n isFetching: false,\n fetchStartTime: Date.now(),\n };\n this.cueManager.pendingScte35CueKey = cueKey;\n\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload: {\n durationSeconds?: number;\n ptsSeconds?: number;\n detectedAtFragmentSn?: number;\n } = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n if (fragmentSn !== undefined) detectPayload.detectedAtFragmentSn = fragmentSn;\n \n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: new Date().toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {});\n\n if (this.debug) {\n console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n console.log(`[PREFETCH] Pre-generated pod request URL`);\n }\n }\n\n // ───────────────────────────────────────────────────────────────\n // VMAP time-based ad breaks\n // ───────────────────────────────────────────────────────────────\n\n private onTimeUpdate(currentTimeSec: number): void {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n const nowMs = currentTimeSec * 1000;\n const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n if (breakToPlay) {\n void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n }\n });\n }\n }\n\n private onVideoEnded(): void {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n\n const durationMs = Number.isFinite(this.video.duration)\n ? Math.floor(this.video.duration * 1000)\n : 0;\n const postroll = this.adConfig.vmapBreaks.find(\n (b) =>\n b.startTimeMs === -1 &&\n !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n );\n\n if (postroll) {\n void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n }\n });\n }\n }\n\n private async handleVmapAdBreak(\n adBreak: AdBreak,\n nowMs: number\n ): Promise<void> {\n const key = this.adConfig.getAdBreakKey(adBreak);\n if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n\n const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n if (breakStartMs == null) return;\n\n const durationMs = adBreak.durationMs ?? 0;\n const endMs = breakStartMs + durationMs;\n const inWindow =\n durationMs > 0\n ? nowMs >= breakStartMs && nowMs < endMs\n : nowMs >= breakStartMs;\n\n if (inWindow) {\n this.adConfig.consumedVmapBreakIds.add(key);\n const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n if (!tags || tags.length === 0) return;\n\n const first = tags[0] as string;\n const rest = tags.slice(1);\n this.adBreak.adPodQueue = rest;\n\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.showAds = true;\n this.adBreak.inAdBreak = true;\n this.timing.currentAdBreakStartWallClockMs = Date.now();\n\n try {\n await this.adBreak.playSingleAd(first);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n }\n this.adBreak.handleAdPodComplete();\n }\n }\n }\n\n // ───────────────────────────────────────────────────────────────\n // Public API\n // ───────────────────────────────────────────────────────────────\n\n getCurrentAdIndex(): number {\n return this.timing.currentAdIndex;\n }\n\n getTotalAdsInBreak(): number {\n return this.timing.totalAdsInBreak;\n }\n\n getAdRemainingMs(): number {\n return this.timing.getRemainingAdMs();\n }\n\n isAdPlaying(): boolean {\n return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n }\n\n isShowingAds(): boolean {\n return this.adBreak.showAds;\n }\n\n getStreamType(): \"hls\" | \"other\" {\n const url = this.config.src.toLowerCase();\n if (\n url.includes(\".m3u8\") ||\n url.includes(\"/hls/\") ||\n url.includes(\"application/vnd.apple.mpegurl\")\n ) {\n return \"hls\";\n }\n return \"other\";\n }\n\n shouldShowNativeControls(): boolean {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(\n this.config.allowNativeHls && !(this.config.showCustomControls ?? false)\n );\n }\n\n isLive(): boolean {\n return this.hlsEngine.isLiveStream;\n }\n\n isLowLatencyStream(): boolean | undefined {\n return this.hlsEngine.isLowLatencyStream();\n }\n\n get videoElement(): HTMLVideoElement {\n return this.video;\n }\n\n toggleMute(): void {\n ctrlToggleMute(this.video, this.adPlayer, this.debug);\n }\n\n toggleFullscreen(): Promise<void> {\n return ctrlToggleFullscreen(this.video, this.debug);\n }\n\n isMuted(): boolean {\n return ctrlIsMuted(this.video, this.adPlayer);\n }\n\n setMuted(muted: boolean): void {\n ctrlSetMuted(this.video, this.adPlayer, muted, this.debug);\n }\n\n setVolume(volume: number): void {\n ctrlSetVolume(this.video, this.adPlayer, volume, this.debug);\n }\n\n getVolume(): number {\n return ctrlGetVolume(this.video, this.adPlayer);\n }\n\n isFullscreen(): boolean {\n return ctrlIsFullscreen();\n }\n\n resize(): void {\n ctrlResizePlayer(this.video, this.adPlayer, this.debug);\n }\n\n // ───────────────────────────────────────────────────────────────\n // Destroy\n // ───────────────────────────────────────────────────────────────\n\n destroy(): void {\n this.adBreak.stopContinuousFetching();\n this.timing.destroy();\n this.adBreak.clearPendingAdBreak();\n this.placeholder.destroy();\n\n if (this.timeUpdateHandler) {\n this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n delete this.timeUpdateHandler;\n }\n if (this.endedHandler) {\n this.video.removeEventListener(\"ended\", this.endedHandler);\n delete this.endedHandler;\n }\n if (this.emptiedHandler) {\n this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n delete this.emptiedHandler;\n }\n\n this.adConfig.destroyTracking();\n this.hlsEngine.destroy();\n this.adPlayer?.destroy();\n\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.palNonce.reset();\n\n this.adBreak.adRequestQueue = [];\n this.timing.consecutiveFailures = 0;\n }\n}\n","import React, { Component, Suspense } from \"react\";\nimport type { BaseStormcloudPlayerProps } from \"./props\";\nimport { defaultProps } from \"./props\";\nimport { omit } from \"./utils\";\nimport players from \"./players\";\nimport type { PlayerConfig } from \"./players\";\nimport Player from \"./Player.js\";\n\nconst IS_BROWSER = typeof window !== \"undefined\" && window.document;\nconst IS_GLOBAL =\n typeof globalThis !== \"undefined\" &&\n globalThis.window &&\n globalThis.window.document;\nconst UniversalSuspense = IS_BROWSER || IS_GLOBAL ? Suspense : () => null;\n\nconst SUPPORTED_PROPS = [\n \"src\",\n \"playing\",\n \"loop\",\n \"controls\",\n \"volume\",\n \"muted\",\n \"playbackRate\",\n \"width\",\n \"height\",\n \"style\",\n \"progressInterval\",\n \"playsInline\",\n \"autoplay\",\n \"preload\",\n \"poster\",\n \"className\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"allowNativeHls\",\n \"lowLatencyMode\",\n \"isLiveStream\",\n \"driftToleranceMs\",\n \"immediateManifestAds\",\n \"debugAdTiming\",\n \"showCustomControls\",\n \"licenseKey\",\n \"isVmap\",\n \"vmapUrl\",\n \"adFailsafeTimeoutMs\",\n \"minSegmentsBeforePlay\",\n \"ctvAdRequest\",\n \"onReady\",\n \"onStart\",\n \"onPlay\",\n \"onPause\",\n \"onBuffer\",\n \"onBufferEnd\",\n \"onEnded\",\n \"onError\",\n \"onDuration\",\n \"onSeek\",\n \"onProgress\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\",\n];\n\nexport interface StormcloudPlayerProps extends BaseStormcloudPlayerProps {\n fallback?: React.ReactElement;\n wrapper?: React.ComponentType<{ children: React.ReactNode }> | string;\n}\n\ninterface StormcloudPlayerState {\n showPreview: boolean;\n}\n\nconst customPlayers: PlayerConfig[] = [];\n\nexport const createStormcloudPlayer = (\n playerList: PlayerConfig[],\n fallback?: PlayerConfig\n) => {\n return class StormcloudPlayerClass extends Component<\n StormcloudPlayerProps,\n StormcloudPlayerState\n > {\n static displayName = \"StormcloudPlayer\";\n\n static defaultProps = {\n ...defaultProps,\n fallback: null,\n wrapper: \"div\",\n };\n\n static addCustomPlayer = (player: PlayerConfig) => {\n customPlayers.push(player);\n };\n\n static removeCustomPlayers = () => {\n customPlayers.length = 0;\n };\n\n static canPlay = (src: string): boolean => {\n for (const Player of [...customPlayers, ...playerList]) {\n if (Player.canPlay(src)) {\n return true;\n }\n }\n return false;\n };\n\n static canEnablePIP = (src: string): boolean => {\n for (const Player of [...customPlayers, ...playerList]) {\n if (Player.canEnablePIP && Player.canEnablePIP(src)) {\n return true;\n }\n }\n return false;\n };\n\n state: StormcloudPlayerState = {\n showPreview: false,\n };\n\n public wrapper?: HTMLElement;\n public player?: any;\n\n references = {\n wrapper: (wrapper: HTMLElement) => {\n this.wrapper = wrapper;\n },\n player: (player: any) => {\n this.player = player;\n },\n };\n\n getActivePlayer = (src?: string): PlayerConfig | null => {\n if (!src) return null;\n\n for (const player of [...customPlayers, ...playerList]) {\n if (player.canPlay(src)) {\n return player;\n }\n }\n\n if (fallback) {\n return fallback;\n }\n\n return null;\n };\n\n getAttributes = (src?: string) => {\n return omit(this.props, SUPPORTED_PROPS as any);\n };\n\n handleReady = () => {\n this.props.onReady?.(this as any);\n };\n\n seekTo = (\n fraction: number,\n type?: \"seconds\" | \"fraction\",\n keepPlaying?: boolean\n ) => {\n if (!this.player) return null;\n this.player.seekTo(fraction, type, keepPlaying);\n };\n\n getCurrentTime = (): number | null => {\n if (!this.player) return null;\n return this.player.getCurrentTime();\n };\n\n getSecondsLoaded = (): number | null => {\n if (!this.player) return null;\n return this.player.getSecondsLoaded();\n };\n\n getDuration = (): number | null => {\n if (!this.player) return null;\n return this.player.getDuration();\n };\n\n getInternalPlayer = (key = \"player\") => {\n if (!this.player) return null;\n return this.player.getInternalPlayer(key);\n };\n\n renderActivePlayer = (src?: string) => {\n if (!src) return null;\n\n const activePlayer = this.getActivePlayer(src);\n if (!activePlayer) return null;\n\n return React.createElement(Player, {\n ...this.props,\n key: activePlayer.key,\n ref: this.references.player,\n activePlayer: activePlayer.lazyPlayer || activePlayer,\n onReady: this.handleReady,\n });\n };\n\n render() {\n const {\n src,\n style,\n width,\n height,\n fallback: fallbackElement,\n wrapper: Wrapper,\n } = this.props;\n const attributes = this.getAttributes(src);\n const wrapperRef =\n typeof Wrapper === \"string\" ? this.references.wrapper : undefined;\n\n return React.createElement(\n Wrapper as any,\n {\n ref: wrapperRef,\n style: { ...style, width, height },\n ...attributes,\n },\n React.createElement(\n UniversalSuspense,\n { fallback: fallbackElement },\n this.renderActivePlayer(src)\n )\n );\n }\n };\n};\n\nconst StormcloudPlayer = createStormcloudPlayer(\n players,\n players[players.length - 1]\n);\n\nexport default StormcloudPlayer;\n","import type { CSSProperties } from \"react\";\nimport { StormcloudVideoPlayer } from \"./player/StormcloudVideoPlayer\";\n\nexport interface OnProgressProps {\n played: number;\n playedSeconds: number;\n loaded: number;\n loadedSeconds: number;\n}\n\nexport interface BaseStormcloudPlayerProps {\n src?: string;\n playing?: boolean;\n loop?: boolean;\n controls?: boolean;\n volume?: number;\n muted?: boolean;\n playbackRate?: number;\n width?: string | number;\n height?: string | number;\n style?: CSSProperties;\n progressInterval?: number;\n playsInline?: boolean;\n autoplay?: boolean;\n preload?: string;\n poster?: string;\n className?: string;\n wrapperClassName?: string;\n wrapperStyle?: CSSProperties;\n\n allowNativeHls?: boolean;\n lowLatencyMode?: boolean;\n isLiveStream?: boolean;\n driftToleranceMs?: number;\n immediateManifestAds?: boolean;\n debugAdTiming?: boolean;\n showCustomControls?: boolean;\n hideLoadingIndicator?: boolean;\n licenseKey?: string;\n isVmap?: boolean;\n vmapUrl?: string;\n adFailsafeTimeoutMs?: number;\n minSegmentsBeforePlay?: number;\n ctvAdRequest?: boolean;\n\n onReady?: (player: StormcloudVideoPlayer) => void;\n onStart?: () => void;\n onPlay?: () => void;\n onPause?: (e?: any) => void;\n onBuffer?: () => void;\n onBufferEnd?: () => void;\n onEnded?: () => void;\n onError?: (\n error: any,\n data?: any,\n hlsInstance?: any,\n hlsGlobal?: any\n ) => void;\n onDuration?: (duration: number) => void;\n onSeek?: (seconds: number) => void;\n onProgress?: (state: OnProgressProps) => void;\n onVolumeToggle?: () => void;\n onFullscreenToggle?: () => void;\n onControlClick?: () => void;\n\n [otherProps: string]: any;\n}\n\nconst noop = () => {};\n\nexport const defaultProps: Required<\n Omit<\n BaseStormcloudPlayerProps,\n | \"src\"\n | \"onReady\"\n | \"children\"\n | \"ctvAdRequest\"\n | keyof React.VideoHTMLAttributes<HTMLVideoElement>\n >\n> = {\n playing: false,\n loop: false,\n controls: true,\n volume: 1,\n muted: false,\n playbackRate: 1,\n width: \"100%\",\n height: \"auto\",\n style: {},\n progressInterval: 1000,\n playsInline: false,\n autoplay: false,\n preload: \"metadata\",\n poster: \"\",\n className: \"\",\n wrapperClassName: \"\",\n wrapperStyle: {},\n\n allowNativeHls: false,\n lowLatencyMode: false,\n driftToleranceMs: 1000,\n immediateManifestAds: true,\n debugAdTiming: false,\n showCustomControls: false,\n hideLoadingIndicator: false,\n licenseKey: \"\",\n isVmap: false,\n vmapUrl: \"\",\n adFailsafeTimeoutMs: 10000,\n minSegmentsBeforePlay: 2,\n\n onStart: noop,\n onPlay: noop,\n onPause: noop,\n onBuffer: noop,\n onBufferEnd: noop,\n onEnded: noop,\n onError: noop,\n onDuration: noop,\n onSeek: noop,\n onProgress: noop,\n onVolumeToggle: noop,\n onFullscreenToggle: noop,\n onControlClick: noop,\n};\n","import { lazy as reactLazy } from \"react\";\n\nexport const lazy = reactLazy;\n\nexport const omit = <T extends Record<string, any>, K extends keyof T>(\n object: T,\n keys: K[]\n): Omit<T, K> => {\n const result = { ...object };\n keys.forEach((key) => {\n delete result[key];\n });\n return result;\n};\n\nexport const isMediaStream = (url: any): url is MediaStream => {\n return (\n typeof window !== \"undefined\" &&\n window.MediaStream &&\n url instanceof window.MediaStream\n );\n};\n\nexport const supportsWebKitPresentationMode = (): boolean => {\n if (typeof window === \"undefined\") return false;\n const video = document.createElement(\"video\");\n return \"webkitSupportsPresentationMode\" in video;\n};\n\nexport const randomString = (): string => {\n return Math.random().toString(36).substr(2, 9);\n};\n\nexport const parseQuery = (url: string): Record<string, string> => {\n const query: Record<string, string> = {};\n const queryString = url.split(\"?\")[1] || \"\";\n\n if (!queryString) return query;\n\n const manualParse = (qs: string) => {\n qs.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n try {\n query[decodeURIComponent(key)] = value\n ? decodeURIComponent(value.replace(/\\+/g, \" \"))\n : \"\";\n } catch (e) {\n query[key] = value || \"\";\n }\n }\n });\n };\n\n if (typeof URLSearchParams !== \"undefined\") {\n try {\n const params = new URLSearchParams(queryString);\n params.forEach((value, key) => {\n query[key] = value;\n });\n return query;\n } catch (e) {\n manualParse(queryString);\n }\n } else {\n manualParse(queryString);\n }\n\n return query;\n};\n\nexport const merge = <T extends Record<string, any>>(\n target: T,\n ...sources: Partial<T>[]\n): T => {\n if (!sources.length) return target;\n const source = sources.shift();\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n merge(target[key] as any, source[key] as any);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n\n return merge(target, ...sources);\n};\n\nconst isObject = (item: any): item is Record<string, any> => {\n return item && typeof item === \"object\" && !Array.isArray(item);\n};\n\nexport const IS_BROWSER = typeof window !== \"undefined\" && window.document;\nexport const IS_GLOBAL =\n typeof globalThis !== \"undefined\" &&\n globalThis.window &&\n globalThis.window.document;\nexport const IS_IOS =\n IS_BROWSER && /iPad|iPhone|iPod/.test(navigator.userAgent);\nexport const IS_SAFARI =\n IS_BROWSER && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nexport const SUPPORTS_HLS = (): boolean => {\n if (!IS_BROWSER) return false;\n const video = document.createElement(\"video\");\n return Boolean(video.canPlayType(\"application/vnd.apple.mpegurl\"));\n};\n\nexport const SUPPORTS_DASH = (): boolean => {\n if (!IS_BROWSER) return false;\n const video = document.createElement(\"video\");\n return Boolean(video.canPlayType(\"application/dash+xml\"));\n};\n","export const HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nexport const HLS_PATHS = /\\/hls\\//i;\nexport const DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nexport const VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nexport const AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\n\nexport const canPlay = {\n hls: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n },\n\n dash: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return DASH_EXTENSIONS.test(url);\n },\n\n video: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url);\n },\n\n audio: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return AUDIO_EXTENSIONS.test(url);\n },\n\n file: (url: string): boolean => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n },\n};\n","import { Component } from \"react\";\nimport { StormcloudVideoPlayer } from \"../player/StormcloudVideoPlayer\";\nimport type { StormcloudVideoPlayerConfig } from \"../types\";\nimport { canPlay } from \"../patterns\";\n\nexport interface HlsPlayerProps extends StormcloudVideoPlayerConfig {\n onMount?: (player: any) => void;\n onReady?: () => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoaded?: () => void;\n onError?: (error: any) => void;\n}\n\nexport default class HlsPlayer extends Component<HlsPlayerProps> {\n static displayName = \"HlsPlayer\";\n\n static canPlay = canPlay.hls;\n\n private player: StormcloudVideoPlayer | null = null;\n private mounted = false;\n\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n\n componentWillUnmount() {\n this.mounted = false;\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n }\n\n componentDidUpdate(prevProps: HlsPlayerProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n\n load = async () => {\n if (!this.props.videoElement || !this.props.src) return;\n\n try {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n\n const config: StormcloudVideoPlayerConfig = {\n src: this.props.src,\n videoElement: this.props.videoElement,\n };\n\n if (this.props.autoplay !== undefined)\n config.autoplay = this.props.autoplay;\n if (this.props.muted !== undefined) config.muted = this.props.muted;\n if (this.props.lowLatencyMode !== undefined)\n config.lowLatencyMode = this.props.lowLatencyMode;\n if (this.props.allowNativeHls !== undefined)\n config.allowNativeHls = this.props.allowNativeHls;\n if (this.props.isLiveStream !== undefined)\n config.isLiveStream = this.props.isLiveStream;\n if (this.props.driftToleranceMs !== undefined)\n config.driftToleranceMs = this.props.driftToleranceMs;\n if (this.props.immediateManifestAds !== undefined)\n config.immediateManifestAds = this.props.immediateManifestAds;\n if (this.props.debugAdTiming !== undefined)\n config.debugAdTiming = this.props.debugAdTiming;\n if (this.props.showCustomControls !== undefined)\n config.showCustomControls = this.props.showCustomControls;\n if (this.props.onVolumeToggle !== undefined)\n config.onVolumeToggle = this.props.onVolumeToggle;\n if (this.props.onFullscreenToggle !== undefined)\n config.onFullscreenToggle = this.props.onFullscreenToggle;\n if (this.props.onControlClick !== undefined)\n config.onControlClick = this.props.onControlClick;\n if (this.props.licenseKey !== undefined)\n config.licenseKey = this.props.licenseKey;\n if (this.props.adFailsafeTimeoutMs !== undefined)\n config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n if (this.props.minSegmentsBeforePlay !== undefined)\n config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n if (this.props.ctvAdRequest !== undefined)\n config.ctvAdRequest = this.props.ctvAdRequest;\n\n this.player = new StormcloudVideoPlayer(config);\n\n this.props.onMount?.(this);\n\n await this.player.load();\n\n if (this.mounted) {\n this.props.onReady?.();\n }\n } catch (error) {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n }\n };\n\n play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource =\n video.src ||\n (video.currentSrc && video.currentSrc !== \"\") ||\n video.readyState >= 1;\n\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[HlsPlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n this.props.onPlay?.();\n } else {\n console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n }\n }\n };\n\n pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n this.props.onPause?.();\n }\n };\n\n stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n\n seekTo = (seconds: number, keepPlaying?: boolean) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n\n setVolume = (volume: number) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n\n mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n\n unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n\n setPlaybackRate = (rate: number) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n\n getDuration = (): number | null => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n\n getCurrentTime = (): number | null => {\n if (\n this.props.videoElement &&\n isFinite(this.props.videoElement.currentTime)\n ) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n\n getSecondsLoaded = (): number | null => {\n if (\n this.props.videoElement &&\n this.props.videoElement.buffered.length > 0\n ) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n\n getInternalPlayer = (key = \"player\") => {\n if (key === \"player\") return this.player;\n if (key === \"video\") return this.props.videoElement;\n if (key === \"hls\" && this.player) return (this.player as any).hls;\n return null;\n };\n\n render() {\n return null;\n }\n}\n","import { Component } from \"react\";\nimport { canPlay } from \"../patterns\";\n\nexport interface FilePlayerProps {\n src: string;\n videoElement?: HTMLVideoElement;\n onMount?: (player: any) => void;\n onReady?: () => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoaded?: () => void;\n onError?: (error: any) => void;\n autoplay?: boolean;\n muted?: boolean;\n loop?: boolean;\n controls?: boolean;\n playsInline?: boolean;\n preload?: string;\n poster?: string;\n}\n\nexport default class FilePlayer extends Component<FilePlayerProps> {\n static displayName = \"FilePlayer\";\n\n static canPlay = canPlay.file;\n\n private mounted = false;\n private ready = false;\n\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n componentDidUpdate(prevProps: FilePlayerProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n\n load = () => {\n if (!this.props.videoElement || !this.props.src) return;\n\n const video = this.props.videoElement;\n\n const handleLoadedMetadata = () => {\n if (this.mounted && !this.ready) {\n this.ready = true;\n this.props.onReady?.();\n }\n };\n\n const handlePlay = () => {\n if (this.mounted) {\n this.props.onPlay?.();\n }\n };\n\n const handlePause = () => {\n if (this.mounted) {\n this.props.onPause?.();\n }\n };\n\n const handleEnded = () => {\n if (this.mounted) {\n this.props.onEnded?.();\n }\n };\n\n const handleError = (error: any) => {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n };\n\n const handleLoadedData = () => {\n if (this.mounted) {\n this.props.onLoaded?.();\n }\n };\n\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n\n video.src = this.props.src;\n if (this.props.autoplay !== undefined) video.autoplay = this.props.autoplay;\n if (this.props.muted !== undefined) video.muted = this.props.muted;\n if (this.props.loop !== undefined) video.loop = this.props.loop;\n if (this.props.controls !== undefined) video.controls = this.props.controls;\n if (this.props.playsInline !== undefined)\n video.playsInline = this.props.playsInline;\n if (this.props.preload !== undefined)\n video.preload = this.props.preload as \"\" | \"metadata\" | \"none\" | \"auto\";\n if (this.props.poster !== undefined) video.poster = this.props.poster;\n\n this.props.onMount?.(this);\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n };\n };\n\n play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource =\n video.src ||\n (video.currentSrc && video.currentSrc !== \"\") ||\n video.readyState >= 1;\n\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[FilePlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n } else {\n console.warn(\"[FilePlayer] Cannot play: video has no valid source\");\n }\n }\n };\n\n pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n }\n };\n\n stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n\n seekTo = (seconds: number, keepPlaying?: boolean) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n\n setVolume = (volume: number) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n\n mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n\n unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n\n setPlaybackRate = (rate: number) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n\n setLoop = (loop: boolean) => {\n if (this.props.videoElement) {\n this.props.videoElement.loop = loop;\n }\n };\n\n getDuration = (): number | null => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n\n getCurrentTime = (): number | null => {\n if (\n this.props.videoElement &&\n isFinite(this.props.videoElement.currentTime)\n ) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n\n getSecondsLoaded = (): number | null => {\n if (\n this.props.videoElement &&\n this.props.videoElement.buffered.length > 0\n ) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n\n getInternalPlayer = (key = \"player\") => {\n if (key === \"video\") return this.props.videoElement;\n return null;\n };\n\n enablePIP = async () => {\n if (\n this.props.videoElement &&\n \"requestPictureInPicture\" in this.props.videoElement\n ) {\n try {\n await (this.props.videoElement as any).requestPictureInPicture();\n } catch (error) {\n console.warn(\"Picture-in-Picture failed:\", error);\n }\n }\n };\n\n disablePIP = async () => {\n if (document.pictureInPictureElement) {\n try {\n await document.exitPictureInPicture();\n } catch (error) {\n console.warn(\"Exit Picture-in-Picture failed:\", error);\n }\n }\n };\n\n render() {\n return null;\n }\n}\n","import { lazy } from \"../utils\";\nimport { canPlay } from \"../patterns\";\nimport HlsPlayer from \"./HlsPlayer\";\nimport FilePlayer from \"./FilePlayer\";\n\nexport interface PlayerConfig {\n key: string;\n name: string;\n canPlay: (url: string) => boolean;\n canEnablePIP?: (url: string) => boolean;\n lazyPlayer?: any;\n}\n\nconst players: PlayerConfig[] = [\n {\n key: \"hls\",\n name: \"HLS Player\",\n canPlay: canPlay.hls,\n lazyPlayer: lazy(() => Promise.resolve({ default: HlsPlayer })),\n },\n {\n key: \"file\",\n name: \"File Player\",\n canPlay: canPlay.file,\n canEnablePIP: (url: string) => {\n return (\n canPlay.file(url) &&\n (document.pictureInPictureEnabled ||\n typeof (document as any).webkitSupportsPresentationMode ===\n \"function\")\n );\n },\n lazyPlayer: lazy(() => Promise.resolve({ default: FilePlayer })),\n },\n];\n\nexport default players;\n","import React, { Component } from \"react\";\nimport type { BaseStormcloudPlayerProps, OnProgressProps } from \"./props\";\nimport { defaultProps } from \"./props\";\nimport { isMediaStream } from \"./utils\";\n\nconst SEEK_ON_PLAY_EXPIRY = 5000;\n\nexport interface PlayerProps extends BaseStormcloudPlayerProps {\n activePlayer: any;\n onReady: () => void;\n}\n\nexport default class Player extends Component<PlayerProps> {\n static displayName = \"Player\";\n static defaultProps = defaultProps;\n\n private mounted = false;\n private isReady = false;\n private isPlaying = false;\n private isLoading = true;\n private loadOnReady: string | null = null;\n private startOnPlay = true;\n private seekOnPlay: number | null = null;\n private onDurationCalled = false;\n private progressTimeout?: number;\n private durationCheckTimeout?: number;\n private prevPlayed?: number;\n private prevLoaded?: number;\n private player?: any;\n\n componentDidMount() {\n this.mounted = true;\n }\n\n componentWillUnmount() {\n clearTimeout(this.progressTimeout);\n clearTimeout(this.durationCheckTimeout);\n this.mounted = false;\n }\n\n componentDidUpdate(prevProps: PlayerProps) {\n if (!this.player) return;\n\n const { src, playing, volume, muted, playbackRate, loop, activePlayer } =\n this.props;\n\n if (prevProps.src !== src) {\n if (this.isLoading && !activePlayer.forceLoad && !isMediaStream(src)) {\n console.warn(\n `StormcloudPlayer: the attempt to load ${src} is being deferred until the player has loaded`\n );\n this.loadOnReady = src || null;\n return;\n }\n this.isLoading = true;\n this.startOnPlay = true;\n this.onDurationCalled = false;\n this.player.load(src, this.isReady);\n }\n\n if (!prevProps.playing && playing && !this.isPlaying) {\n this.player.play();\n }\n\n if (prevProps.playing && !playing && this.isPlaying) {\n this.player.pause();\n }\n\n if (prevProps.volume !== volume && volume !== null) {\n this.player.setVolume(volume);\n }\n\n if (prevProps.muted !== muted) {\n if (muted) {\n this.player.mute();\n } else {\n this.player.unmute();\n if (volume !== null) {\n setTimeout(() => this.player.setVolume(volume));\n }\n }\n }\n\n if (\n prevProps.playbackRate !== playbackRate &&\n this.player.setPlaybackRate\n ) {\n this.player.setPlaybackRate(playbackRate);\n }\n\n if (prevProps.loop !== loop && this.player.setLoop) {\n this.player.setLoop(loop);\n }\n }\n\n handlePlayerMount = (player: any) => {\n if (this.player) {\n this.progress();\n return;\n }\n\n this.player = player;\n this.player.load(this.props.src);\n this.progress();\n };\n\n getInternalPlayer = (key?: string) => {\n if (!this.player) return null;\n return this.player.getInternalPlayer(key);\n };\n\n progress = () => {\n if (this.props.src && this.player && this.isReady) {\n const playedSeconds = this.getCurrentTime() || 0;\n const loadedSeconds = this.getSecondsLoaded();\n const duration = this.getDuration();\n\n if (duration) {\n const progress: OnProgressProps = {\n playedSeconds,\n played: playedSeconds / duration,\n loaded: 0,\n loadedSeconds: 0,\n };\n\n if (loadedSeconds !== null) {\n progress.loadedSeconds = loadedSeconds;\n progress.loaded = loadedSeconds / duration;\n }\n\n if (\n progress.playedSeconds !== this.prevPlayed ||\n progress.loadedSeconds !== this.prevLoaded\n ) {\n this.props.onProgress?.(progress);\n }\n\n this.prevPlayed = progress.playedSeconds;\n this.prevLoaded = progress.loadedSeconds;\n }\n }\n\n this.progressTimeout = window.setTimeout(\n this.progress,\n this.props.progressInterval || 1000\n );\n };\n\n handleReady = () => {\n if (!this.mounted) return;\n\n this.isReady = true;\n this.isLoading = false;\n\n const { onReady, playing, volume, muted } = this.props;\n onReady();\n\n if (!muted && volume !== null) {\n this.player.setVolume(volume);\n }\n\n if (this.loadOnReady) {\n this.player.load(this.loadOnReady, true);\n this.loadOnReady = null;\n } else if (playing) {\n this.player.play();\n }\n\n this.handleDurationCheck();\n };\n\n handlePlay = () => {\n this.isPlaying = true;\n this.isLoading = false;\n\n const { onStart, onPlay, playbackRate } = this.props;\n\n if (this.startOnPlay) {\n if (this.player.setPlaybackRate && playbackRate !== 1) {\n this.player.setPlaybackRate(playbackRate);\n }\n onStart?.();\n this.startOnPlay = false;\n }\n\n onPlay?.();\n\n if (this.seekOnPlay) {\n this.seekTo(this.seekOnPlay);\n this.seekOnPlay = null;\n }\n\n this.handleDurationCheck();\n };\n\n handlePause = (e?: any) => {\n this.isPlaying = false;\n if (!this.isLoading) {\n this.props.onPause?.(e);\n }\n };\n\n handleEnded = () => {\n const { activePlayer, loop, onEnded } = this.props;\n if (activePlayer.loopOnEnded && loop) {\n this.seekTo(0);\n }\n if (!loop) {\n this.isPlaying = false;\n onEnded?.();\n }\n };\n\n handleError = (...args: any[]) => {\n this.isLoading = false;\n this.props.onError?.(args[0], args[1], args[2], args[3]);\n };\n\n handleDurationCheck = () => {\n clearTimeout(this.durationCheckTimeout);\n const duration = this.getDuration();\n if (duration) {\n if (!this.onDurationCalled) {\n this.props.onDuration?.(duration);\n this.onDurationCalled = true;\n }\n } else {\n this.durationCheckTimeout = window.setTimeout(\n this.handleDurationCheck,\n 100\n );\n }\n };\n\n handleLoaded = () => {\n this.isLoading = false;\n };\n\n getDuration(): number | null {\n if (!this.isReady) return null;\n return this.player.getDuration();\n }\n\n getCurrentTime(): number | null {\n if (!this.isReady) return null;\n return this.player.getCurrentTime();\n }\n\n getSecondsLoaded(): number | null {\n if (!this.isReady) return null;\n return this.player.getSecondsLoaded();\n }\n\n seekTo(amount: number, type?: \"seconds\" | \"fraction\", keepPlaying?: boolean) {\n if (!this.isReady) {\n if (amount !== 0) {\n this.seekOnPlay = amount;\n setTimeout(() => {\n this.seekOnPlay = null;\n }, SEEK_ON_PLAY_EXPIRY);\n }\n return;\n }\n\n const isFraction = !type ? amount > 0 && amount < 1 : type === \"fraction\";\n if (isFraction) {\n const duration = this.player.getDuration();\n if (!duration) {\n console.warn(\n \"StormcloudPlayer: could not seek using fraction – duration not yet available\"\n );\n return;\n }\n this.player.seekTo(duration * amount, keepPlaying);\n return;\n }\n this.player.seekTo(amount, keepPlaying);\n }\n\n render() {\n const Player = this.props.activePlayer;\n if (!Player) {\n return null;\n }\n\n return React.createElement(Player, {\n ...this.props,\n onMount: this.handlePlayerMount,\n onReady: this.handleReady,\n onPlay: this.handlePlay,\n onPause: this.handlePause,\n onEnded: this.handleEnded,\n onLoaded: this.handleLoaded,\n onError: this.handleError,\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\index.cjs"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","index_exports","DEFAULT_TRACKING_INGEST_CONFIG","IS_BROWSER","IS_GLOBAL","IS_IOS","IS_SAFARI","SUPPORTS_DASH","SUPPORTS_HLS","StormcloudPlayer","StormcloudPlayer_default","StormcloudVideoPlayer","StormcloudVideoPlayerComponent","applyTrackingIngestConfig","buildAnalyticsContext","canPlay","configureTrackingIngest","createHlsAdPlayer","createPalNonceManager","createStormcloudPlayer","default","detectBrowser","getBrowserConfigOverrides","getBrowserID","getClientInfo","ingestPlayerTracking","initializePolyfills","isMediaStream","isTrackingIngestEnabled","lazy","logBrowserInfo","merge","omit","parseQuery","players","players_default","randomString","requiresMediaPipelineResetAfterAds","sendAdDetectTracking","sendAdImpressionTracking","sendAdLoadedTracking","sendHeartbeat","sendInitialTracking","supportsFeature","supportsModernJS","supportsWebKitPresentationMode","trackingIngestConfig","module","exports","import_react","require","import_hls","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","version","majorVersion","isSmartTV","isLegacyTV","supportsModernJS2","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams","browser","overrides","allowNativeHls","pauseContentDuringAds","Array","assign","forEach","String","includes","e","debug","console","log","feature","TextEncoder","fetch","crypto","subtle","VAST_MACRO_PATTERN","CACHEBUSTING_ALIASES","KNOWN_VAST_MACROS","generateCachebuster","Math","floor","random","formatPlayhead","seconds","Number","isFinite","total","hh","padStart","mm","ss","ms","resolveMacroValues","ctx","values","set","adPlayhead","adPlayheadSeconds","contentPlayheadSeconds","assetUri","mediaMime","Date","toISOString","errorCode","playerWidth","playerHeight","round","deviceId","deviceIdType","limitAdTracking","pageUrl","URL","hostname","clientUa","podSequence","adServingId","reason","substituteVastTrackingMacros","url","replace","encodeURIComponent","has","LINEAR_TRACKING_EVENTS","textOf","el","textContent","trim","parseVastTime","length","map","p","parseFloat","h","m","s","every","n","parseProgressOffset","offset","trimmed","endsWith","percent","offsetPercent","offsetSeconds","MAX_VAST_WRAPPER_DEPTH","BEACON_TIMEOUT_MS","inFlightBeacons","VAST_ERROR_MEDIA_DISPLAY","VAST_ERROR_WRAPPER_TIMEOUT","VAST_ERROR_WRAPPER_LIMIT","VAST_ERROR_WRAPPER_NO_ADS","VAST_ERROR_NO_SUPPORTED_MEDIA","VERIFICATION_NOT_SUPPORTED_REASON","VIEWABLE_MIN_VISIBLE_RATIO","VIEWABLE_MIN_CONTINUOUS_S","toVastMediaErrorCode","error","code","contentVideo","options","adPlaying","originalMutedState","originalVolume","max","min","volume","listeners","mainHlsInstance","AD_CONTAINER_PROP","AD_VIDEO_PROP","FRAME_COUNTER_RELIABLE_PROP","RVFC_RELIABLE_PROP","adVideoElement","adHls","adContainerEl","adEventHandlers","containerHandlers","currentAd","currentAdMediaFile","podAds","podIndex","preloadedAds","preloadingAds","destroyed","pendingTimeouts","STALL_TIMEOUT_MS","STALL_CHECK_INTERVAL_MS","BLACKFRAME_MIN_PLAYBACK_S","stallWatchdogId","lastAdProgressTime","lastAdProgressPosition","sawDecodedVideoFrame","videoFrameCallbackHandle","pendingPlayPromise","createTrackingState","impression","loaded","start","firstQuartile","midpoint","thirdQuartile","complete","viewabilitySettled","lastMuted","progressFired","trackingFired","resolvedAds","viewObserver","visibleRatio","continuousVisibleS","lastViewSampleTime","lastPlayerExpanded","documentHandlers","emit","event","payload","fn","warn","buildTrackingMacroContext","options2","ad","context","currentTime","type","clientWidth","clientHeight","location","href","fireTrackingPixels","urls","macroContext","trackingUrl","img","Image","add","timeoutId","release","clearTimeout","onload","onerror","delete","setTimeout","src","getMainStreamQuality","levels","currentLevel","autoLevel","loadLevel","level2","width","height","bitrate","level","selectBestMediaFile","mediaFiles","Error","firstFile","mainQuality","scoredFiles","file","widthDiff","abs","heightDiff","resolutionDiff","fileBitrate","bitrateDiff","score","sort","a","b","bestMatch","resolution","isHlsMediaFile","mediaFile","toLowerCase","isProgressiveMediaFile","startsWith","isAudioMediaFile","collectVideoMediaFiles","linear","verbose","mediaFileElements","querySelectorAll","mf","index","getAttribute","apiFramework","toUpperCase","bitrateAttr","bitrateValue","hasExplicitDimensions","push","createEmptyTrackingUrls","clickTracking","viewable","notViewable","viewUndetermined","verificationNotExecuted","progress","pushUrls","elements","collectLinearTracking","into","indexOf","collectAdLevelTracking","adBody","verification","mergeTrackingUrls","source","targetLists","sourceLists","keys","incoming","concat","parseXml","xmlString","xmlDoc","DOMParser","parseFromString","parserError","querySelector","getAdSequence","adElement","sequence","emptyVastResult","root","errorUrls","parseVastXml","adElements","documentElement","find","parsed","parseAdElement","vastAdTagUri","wrapper","trackingUrls2","linear2","trackingUrls","rules","followAdditionalWrappers","inLine","candidate","files","id","title","duration","clickThrough","fetchVastXml","vastTagUrl","credentials","requestVast","response","creds","mode","headers","referrerPolicy","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","substring","fetchAndParsePod","trimmedXml","empty","resolveAd","podElements","buffet","ads","filter","shift","createAdVideoElement","video","document","createElement","style","position","left","top","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","onTimeUpdate","noteAdProgress","sampleViewability","threshold","onLoadedMetadata","videoWidth","videoHeight","handleVideoDecodeFailure","onCanPlay","onPlaying","startStallWatchdog","creativeView","adId","onEnded","settleViewability","advanceToNextPodAd","handleAdComplete","onError","reportCurrentAdError","handleAdError","onVolumeChange","mute","unmute","isTrackablePlayback","ended","onPause","pause","onPlay","resume","handler","addEventListener","teardownAdEventListeners","removeEventListener","handleAdClick","window","open","fireNotUsedForUnplayedAds","notUsed","now","inView","visibilityState","paused","handleFullscreenChange","fullscreenEl","fullscreenElement","webkitFullscreenElement","expanded","contains","fullscreen","playerExpand","exitFullscreen","playerCollapse","attachContainerHandlers","onClick","onInteraction","onFullscreenChange","IntersectionObserver","entries","entry","isIntersecting","intersectionRatio","observe","detachContainerHandlers","disconnect","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","resetAdTracking","isRvfcSupported","requestVideoFrameCallback","settlePendingPlay","startAdPlayback","playPromise","play","catch","finally","prepareVideoElementForNewSource","destroy","removeAttribute","load","recreateAdVideoElement","remove","appendChild","loadCurrentAdMedia","isHlsAd","isSupported","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","ERROR","_event","data","fatal","canPlayType","clearStallWatchdog","clearInterval","cancelVideoFrameProbe","handleAdStall","getDecodedVideoFrameCount","getVideoPlaybackQuality","quality","totalVideoFrames","legacyCount","webkitDecodedFrameCount","isFrameCounterReliable","markFrameCounterReliable","isRvfcReliable","markRvfcReliable","cancelVideoFrameCallback","startVideoFrameProbe","rvfc","onPresentedFrame","blackFrameDetectionEnabled","setInterval","decodedFrames","timeAdvancing","releaseAdDecoder","display","pointerEvents","continueLiveStreamDuringAds","visibility","opacity","initialize","container","right","bottom","alignItems","justifyContent","zIndex","parentElement","requestAds","preloaded","reject","resolve","contentVolume","stop","previousMutedState","clear","isAdPlaying","resize","listener","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","PRIVATE_HOST_PATTERNS","isLocalDevHost","host","some","pattern","toDevSafeUrl","rawUrl","protocol","cleanPath","pathname","PAL_SDK_URL","_nonceLoader","_nonceLoaderAllowStorage","_palLoadPromise","loadPalSdk","goog","pal","existing","timeout","script","async","setAttribute","head","getOrCreateNonceLoader","allowStorage","consentSettings","ConsentSettings","NonceLoader","currentNonce","currentNonceManager","generateNonce","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","iconsSupported","playerType","playerVersion","supportedApiFrameworks","ppid","sessionId","JSON","stringify","loadNonceManager","getNonce","getCurrentNonce","injectNonce","searchParams","base","sep","sendPlaybackStart","sendPlaybackEnd","sendAdClick","sendAdTouch","reset","enabled","baseUrl","normalizeIngestBaseUrl","buildTrackingIngestUrl","channel","licenseKey","body","method","Authorization","status","CTV_SESSION_STORAGE_KEY","WEB_SESSION_STORAGE_KEY","inMemoryWebSessionId","PLAYER_ID_STORAGE_KEY","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","resolveVastEnvironmentSignals","isCtv","platformLat","bridgeSignals","readNativeBridgeSignals","platformDevice","readPlatformNativeDeviceId","realDeviceId","readStoredDeviceId","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","dpid","getOrCreateStoredUuid","deviceTypeHint","resolveDeviceTypeHint","getOrCreateCtvSessionId","webSessionId","getOrCreateWebSessionId","DEVICE_TYPE_HINT","FEATURE_PHONE","SMARTPHONE","DESKTOP","TABLET","CONNECTED_TV","GAME_CONSOLE","SET_TOP_BOX","DEVICE_TYPE_HINT_ALIASES","featurephone","smartphone","mobile","phone","desktop","pc","tablet","ctv","tv","connectedtv","smarttv","gameconsole","stb","settopbox","SET_TOP_BOX_UA","GAME_CONSOLE_UA","CONNECTED_TV_UA","FEATURE_PHONE_UA","override","readDeviceTypeHintOverride","inferDeviceTypeHint","fallback","maxTouchPoints","fromGlobal","normalizeDeviceTypeHint","__STORMCLOUD_DTH__","getNativeBridgeSources","normalized","safeCall","isInteger","thisArg","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","resolveNativeDeviceId","includeStored","isMacroPlaceholder","isZeroedAdId","storageKey","readPersistentId","writePersistentId","createUuid","sessionStorage","getItem","setItem","readCookie","localStorage","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","cookie","part","decodeURIComponent","slice","bytes","randomUUID","Uint8Array","getRandomValues","seed","performanceNow","i","hex","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","contentUrl","readBridgeValue","appId","appName","readBridgeBoolean","__STORMCLOUD_CTV_AD_INFO__","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","Boolean","result","normalizeBoolean","cachedBrowserId","config","debugAdTiming","isLiveStream","inputStreamType","screen","vendor","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","os","model","isAndroid","isWebView","isWebApp","webosMatch","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","origin","path","language","languages","join","cookieEnabled","doNotTrack","referrer","sha256Hex","input","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","digest","encode","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","metricEvent","events","adDetectInfo","adLoadedInfo","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","polyfillPromiseFinally","constructor","then","polyfillObjectAssign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","getValue","correlator","isMacroPlaceholder2","generateCorrelator","buf","Uint32Array","MAX_SAFE_INTEGER","expandInlineMacroPlaceholders","applyDeviceIdentityParams","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","_match","val","applyVastMacros","expandedUrl","replaceCorrelatorFallback","streamCorrelator","pod","podMinDurationMs","podMaxDurationMs","podMaxAds","existingUrl","consent","gdpr","gdprConsent","usPrivacy","adTest","programTitle","channelName","staleKeys","correlatorRegex","fetchConsentSignals","timeoutMs","signals","tasks","tcfApi","__tcfapi","settled","tcData","success","eventStatus","gdprApplies","storageAllowed","purpose","consents","tcString","listenerId","uspApi","__uspapi","uspString","parseCueOutDuration","num","dStr","d","parseCueOutCont","res","elapsedMatch","durationMatch","elapsed","slashMatch","parseAttributeList","attrs","regex","exec","rawVal","toNumber","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","decode","out","fromCharCode","getFragmentStartSeconds","frag","candidates","startPTS","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","packetSize","tsPayloadOffset","matchedPackets","packetStart","getPsiSectionStart","payloadUnitStart","pointerField","sectionStart","getPsiSectionLength","parsePatSection","pmtPids","sectionLength","sectionEnd","programNumber","pid","descriptorsIdentifyScte35","end","descriptorStart","descriptorEnd","registration","parsePmtSection","tsScte35Pids","programInfoLength","streamType","elementaryPid","esInfoLength","hasProcessedTsScte35Section","section","processedSections","checksum","size","firstKey","next","addScte35SectionMarker","markers","appendScte35Bytes","assemblers","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","bitPos","readBits","numBits","remainingInByte","toRead","currentByte","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","parseScte35SegmentationDescriptor","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","durationTicks","segmentationUpidLength","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorLength","descriptorDataStart","descriptorDataEnd","descriptorMarker","ptsAdjHigh","ptsAdjLow","spliceCommandLength","spliceCommandType","spliceEventId","commandBodyStart","cancel","outOfNetwork","programSpliceFlag","durationFlag","spliceImmediateFlag","componentPtsSeconds","expectedDescriptorOffset","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","inAdBreak","isInAdBreak","hasRecentlyHandledScte35Cue","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","getScte35CueKey","getScte35MarkerRaw","toIdentityString","daterangeId","ID","scteValue","isStrongScte35CueKey","recentKey","AdConfigManager","vmapBreaks","consumedVmapBreakIds","viewCorrelator","consentSignals","podCounter","podAssignedByPrefetch","lastHeartbeatTime","defaultPodMaxAds","defaultPodMaxDurationMs","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","vastMode","vastEndpoint","apiUrl","imaPayload","decodedPayload","numberAds","fetchAndParseVmap","apiVastTagUrl","json","ima","vast","cue_tones","number_ads","apiNumberAds","vmapXml","parseVmapToBreaks","doc","VMAP_NS","adBreakNodes","getElementsByTagNameNS","getElementsByTagName","localName","node","timeOffsetRaw","startTimeMs","parseVmapTimeOffsetToMs","adTagNode","adTagUrl","breakId","aStart","bStart","timeOffset","hms","hours","minutes","millis","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","beginNewAdPod","resolvePodParams","breakDurationMs","maxDurationMs","maxAds","minDurationMs","podExactDuration","getPalDescriptionUrl","generatePodVastUrl","podParams","adPlayer","palNonce","envSignals","ctvAdRequest","urlWithMacros","autoplay","finalUrl","initializeTracking","heartbeatInterval","sendHeartbeatIfNeeded","destroyTracking","AdTimingService","adRequestWatchdogToken","adFailsafeToken","ptsDriftEmaMs","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","temporaryFailureCooldownMs","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillCooldownUntil","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalLastGamRequestTime","globalMinGamIntervalMs","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","ensureAdStoppedByTimer","adStopTimerId","onAdStopTimerFired","scheduleAdStartIn","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","adStartTimerId","updatePtsDrift","ptsSecondsSample","sampleMs","alpha","resolveScteBreakStartWallClockMs","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","expectedAdBreakDurationMs","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","scheduleAdStopAtBreakBoundary","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","getDurationBudgetRemainingMs","getLoadedAdDurationMs","adController","adFitsRemainingBudget","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","notePodAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","getMinRemainingMsToStartAd","configured","minRemainingMsToStartAd","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","message","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","exponent","backoff","pow","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adFailsafeTimeoutMs","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeTimerId","videoPaused","onFailsafeTimeout","extra","getAdState","showAds","resetForBreakEnd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","offsetHeight","requestAnimationFrame","hide","removeChild","import_hls2","HlsEngine","cueManager","timing","nativeHlsMode","videoSrcProtection","reloadingLiveStream","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","latencyProfileApplied","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","setupHls","hls","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","details","live","onManifestParsed","detectedLowLatencyStream","minSegmentsBeforePlay","LEVEL_LOADED","_evt","applyStreamLatencyProfile","hasPendingAdBreak","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","err","FRAG_PARSING_METADATA","id3Tags","samples","pts","onId3Tag","FRAG_LOADED","processFragmentScte35Payload","FRAG_DECRYPTED","FRAG_CHANGED","activatePendingCuesForFragment","prog","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","onFatalDestroy","isLowLatencyStream","isLowLatencyManifest","useLowLatency","cfg","liveSyncDuration","liveSyncDurationCount","lowLatencyModeRequested","canBlockReload","partTarget","partHoldBack","partListLength","partList","targetDuration","targetduration","hasParts","hasPartTarget","hasPartHoldBack","payloadData","getLiveSyncPosition","liveSyncPosition","restartLoadAt","stopLoad","reloadLiveStream","detachMedia","recreateDelayMs","getAdAudioVolume","toggleMute","newMutedState","restoreVolume","toggleFullscreen","requestFullscreen","isMuted","setMuted","setVolume","clampedVolume","getVolume","isFullscreen","resizePlayer","AdBreakOrchestrator","adConfig","placeholder","isShowingPlaceholder","adDetectSentForCurrentBreak","continuousFetchingActive","continuousFetchLoopRunning","adRequestQueue","adPodQueue","maxPlaceholderDurationMs","pendingAdBreak","analyticsContext","nextAdRequestUrl","baseVastUrl","remaining","attachImaEventListeners","getAdPlayer","onAdClick","onAdInteraction","adIndex","queuedUrls","tryNextAvailableAdWithRateLimit","handleAdPodComplete","errorPayload","errorMessage","vastErrorCode","cause","innerError","causeMessage","handleAdFailure","recreateAdController","shouldShowPlaceholder","preservedMutedState","preservedVolumeState","shouldContinueLiveStreamDuringAds","newAdPlayer","createAdPlayer","setAdPlayer","clearPendingAdBreak","prefetchTimerId","handleAdStart","_marker","scheduled","tags","adBreakDurationMs","currentMuted","currentVolume","podPlayed","startOptimizedPod","startContinuousFetching","podUrl","requestToken","podCount","vastUrls","vastUrl","continuousFetchLoop","epoch","maxQueueSize","newAdUrl","queuedUrlsPreview","generationDelay","stopContinuousFetching","backoffMultiplier","backoffDelay","effectiveMinInterval","timeSinceLastRequest","waitTime","tryNextAvailableAd","retryCount","nextAdUrl","maxRetries","playSingleAd","showPlaceholderAndWaitForAds","ap","playError","checkInterval","maxChecks","restoredMuted","restoredVolume","monitorLiveResumeStall","liveSyncPos","toFixed","restartHlsLoad","resumeContentPlayback","getBufferedAhead","ranges","buffered","describeVideoState","networkStates","readyStates","v","net","networkState","ready","readyState","seeking","resumeBaseline","needsReset","pollIntervalMs","graceMs","recoveryCooldownMs","maxRecoveries","maxMonitorMs","startTime","baseline","recoveries","lastRecoveryAt","listenersAttached","onMediaEvent","diagEvents","dt","cleanup","poll","advanced","playing","bufferedAhead","wedged","canRecover","reloadPos","attempt","maxAttempts","onReady","backoffMs","playResult","attached","palPlaybackStarted","browserOverrides","videoElement","startAdPrefetch","onScte35Marker","startScte35AdBreak","hlsEngine","c","palDescriptionUrl","attach","offsetWidth","prerollKey","endedHandler","onVideoEnded","timeUpdateHandler","emptiedHandler","wasPaused","Infinity","newDurationMs","detectPayload","hasPrefetchedAds","isManifest","forceImmediate","immediateManifestAds","isManifestMarker","hasPts","estCurrentPtsMs","markerPtsMs","tolerance","hasQueuedAds","activeAdRequest","checkIntervalMs","adBreakCheckIntervalMs","maxExtensionMsConfig","maxAdBreakExtensionMs","maxExtensionMs","overrunMs","shouldExtendAdBreak","generatedUrls","detectedAtFragmentSn","isFetching","fetchStartTime","currentTimeSec","breakToPlay","handleVmapAdBreak","postroll","endMs","inWindow","first","rest","getCurrentAdIndex","getTotalAdsInBreak","getAdRemainingMs","isShowingAds","shouldShowNativeControls","showCustomControls","import_fa","import_jsx_runtime","ExpandIcon","jsxs","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","focusable","children","jsx","CompressIcon","CRITICAL_PROPS","CONTROLS_HIDE_DELAY","DEFAULT_PLAYER_ASPECT_RATIO","memo","props","hideLoadingIndicator","onVolumeToggle","onFullscreenToggle","onControlClick","wrapperClassName","wrapperStyle","className","controls","preload","poster","restVideoAttrs","videoRef","useRef","playerRef","bufferingTimeoutRef","controlsTimerRef","wrapperRef","useState","currentIndex","totalAds","remainingSeconds","adStatus","setAdStatus","setShouldShowNativeControls","isMuted2","setIsMuted","isFullscreen2","setIsFullscreen","setIsPlaying","setCurrentTime","setDuration","setVolume2","playbackRate","setPlaybackRate","showVolumeSlider","setShowVolumeSlider","showSpeedMenu","setShowSpeedMenu","isLoading","setIsLoading","isBuffering","setIsBuffering","showCenterPlay","setShowCenterPlay","showLicenseWarning","setShowLicenseWarning","controlsVisible","setControlsVisible","innerWidth","viewportWidth","setViewportWidth","innerHeight","isPortrait","setIsPortrait","playerAspectRatio","setPlayerAspectRatio","getResponsiveScale","responsiveScale","resetControlsTimer","useCallback","current","handleWrapperMouseMove","handleWrapperMouseLeave","formatTime","handlePlayPause","hasValidSource","currentSrc","handleCenterPlayClick","handleTimelineSeek","rect","currentTarget","getBoundingClientRect","clickX","clientX","newTime","handleVolumeChange","newVolume","handlePlaybackRateChange","rate","isHlsStream","isLiveUiMode","shouldShowEnhancedControls","criticalPropsKey","useMemo","prop","useEffect","player","showNative","checkAdStatus","showAdsFromMethod","showAdsFromAttribute","ceil","prev","interval","handleResize","updateStates","currentTimeValue","durationValue","volumeValue","rateValue","handleLoadedMetadata","video2","handleLoadedData","handleLoadStart","handleCanPlay","handleCanPlayThrough","handleWaiting","handlePlaying","handlePause","isAdActive","handleEnded","progressPercent","VolumeIcon","FaVolumeMute","FaVolumeDown","FaVolumeUp","Fragment","ref","onMouseMove","onMouseLeave","overflow","minHeight","aspectRatio","maxWidth","maxHeight","borderRadius","boxShadow","transform","animation","inset","border","borderTopColor","borderRightColor","background","backdropFilter","color","padding","textAlign","margin","fontSize","fontWeight","marginBottom","letterSpacing","lineHeight","gap","textTransform","cursor","onMouseEnter","FaPlay","marginLeft","minWidth","FaPause","paddingRight","paddingLeft","onMouseDown","preventDefault","move","ev","r2","up","stopPropagation","fontFamily","fontVariantNumeric","userSelect","WebkitBackdropFilter","speed","flexShrink","textShadow","flexDirection","prevProps","nextProps","uiProps","callbackProps","import_react6","noop","defaultProps","loop","progressInterval","onStart","onBuffer","onBufferEnd","onDuration","onSeek","onProgress","import_react2","object","MediaStream","substr","queryString","manualParse","qs","isObject","item","globalThis","HLS_EXTENSIONS","HLS_PATHS","DASH_EXTENSIONS","VIDEO_EXTENSIONS","AUDIO_EXTENSIONS","dash","audio","import_react3","HlsPlayer","arguments","mounted","onMount","seekTo","keepPlaying","getDuration","getCurrentTime","getSecondsLoaded","getInternalPlayer","componentDidMount","componentWillUnmount","componentDidUpdate","render","Component","displayName","import_react4","FilePlayer","handlePlay","handleError","onLoaded","setLoop","enablePIP","requestPictureInPicture","disablePIP","pictureInPictureElement","exitPictureInPicture","lazyPlayer","canEnablePIP","pictureInPictureEnabled","webkitSupportsPresentationMode","import_react5","SEEK_ON_PLAY_EXPIRY","Player","isReady","loadOnReady","startOnPlay","seekOnPlay","onDurationCalled","handlePlayerMount","playedSeconds","loadedSeconds","played","prevPlayed","prevLoaded","progressTimeout","handleReady","handleDurationCheck","activePlayer","loopOnEnded","args","durationCheckTimeout","handleLoaded","forceLoad","amount","isFraction","Player2","IS_BROWSER2","IS_GLOBAL2","UniversalSuspense","Suspense","SUPPORTED_PROPS","customPlayers","playerList","_a","state","showPreview","references","getActivePlayer","getAttributes","fraction","renderActivePlayer","fallbackElement","Wrapper","attributes","addCustomPlayer","removeCustomPlayers"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/index.ts\nvar index_exports = {};\n__export(index_exports, {\n DEFAULT_TRACKING_INGEST_CONFIG: () => DEFAULT_TRACKING_INGEST_CONFIG,\n IS_BROWSER: () => IS_BROWSER,\n IS_GLOBAL: () => IS_GLOBAL,\n IS_IOS: () => IS_IOS,\n IS_SAFARI: () => IS_SAFARI,\n SUPPORTS_DASH: () => SUPPORTS_DASH,\n SUPPORTS_HLS: () => SUPPORTS_HLS,\n StormcloudPlayer: () => StormcloudPlayer_default,\n StormcloudVideoPlayer: () => StormcloudVideoPlayer,\n StormcloudVideoPlayerComponent: () => StormcloudVideoPlayerComponent,\n applyTrackingIngestConfig: () => applyTrackingIngestConfig,\n buildAnalyticsContext: () => buildAnalyticsContext,\n canPlay: () => canPlay,\n configureTrackingIngest: () => configureTrackingIngest,\n createHlsAdPlayer: () => createHlsAdPlayer,\n createPalNonceManager: () => createPalNonceManager,\n createStormcloudPlayer: () => createStormcloudPlayer,\n default: () => StormcloudVideoPlayerComponent,\n detectBrowser: () => detectBrowser,\n getBrowserConfigOverrides: () => getBrowserConfigOverrides,\n getBrowserID: () => getBrowserID,\n getClientInfo: () => getClientInfo,\n ingestPlayerTracking: () => ingestPlayerTracking,\n initializePolyfills: () => initializePolyfills,\n isMediaStream: () => isMediaStream,\n isTrackingIngestEnabled: () => isTrackingIngestEnabled,\n lazy: () => lazy,\n logBrowserInfo: () => logBrowserInfo,\n merge: () => merge,\n omit: () => omit,\n parseQuery: () => parseQuery,\n players: () => players_default,\n randomString: () => randomString,\n requiresMediaPipelineResetAfterAds: () => requiresMediaPipelineResetAfterAds,\n sendAdDetectTracking: () => sendAdDetectTracking,\n sendAdImpressionTracking: () => sendAdImpressionTracking,\n sendAdLoadedTracking: () => sendAdLoadedTracking,\n sendHeartbeat: () => sendHeartbeat,\n sendInitialTracking: () => sendInitialTracking,\n supportsFeature: () => supportsFeature,\n supportsModernJS: () => supportsModernJS,\n supportsWebKitPresentationMode: () => supportsWebKitPresentationMode,\n trackingIngestConfig: () => trackingIngestConfig\n});\nmodule.exports = __toCommonJS(index_exports);\n\n// src/ui/StormcloudVideoPlayer.tsx\nvar import_react = __toESM(require(\"react\"), 1);\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS2 = true;\n let webOSVersion;\n let tizenVersion;\n let chromeVersionNum;\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n if (match && match[1]) {\n version = match[1];\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = \"6.0\";\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = \"5.0\";\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = \"4.0\";\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = \"3.0\";\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = \"2.0\";\n majorVersion = 2;\n }\n } else {\n version = \"Unknown\";\n webOSVersion = void 0;\n }\n isLegacyTV = webOSVersion !== void 0 && webOSVersion < 3;\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n isLegacyTV = tizenVersion !== void 0 && tizenVersion < 3;\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else {\n if (chromeVersion > 0) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n if (chromeVersion < 50) {\n supportsModernJS2 = false;\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS2 = false;\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS2 = false;\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS2 = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS: supportsModernJS2,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum\n };\n}\nfunction requiresMediaPipelineResetAfterAds() {\n const browser = detectBrowser();\n return browser.name === \"Samsung Tizen\" && (browser.tizenVersion ?? 0) >= 5;\n}\nfunction getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n overrides.pauseContentDuringAds = true;\n }\n return overrides;\n}\nfunction supportsModernJS() {\n try {\n return typeof Promise !== \"undefined\" && typeof Map !== \"undefined\" && typeof Set !== \"undefined\" && typeof Array.from !== \"undefined\" && typeof Object.assign !== \"undefined\" && typeof Array.prototype.forEach !== \"undefined\" && typeof String.prototype.includes !== \"undefined\";\n } catch (e) {\n return false;\n }\n}\nfunction logBrowserInfo(debug = false) {\n if (!debug) return;\n const browser = detectBrowser();\n console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n ...browser.webOSVersion !== void 0 ? { webOSVersion: browser.webOSVersion } : {},\n ...browser.tizenVersion !== void 0 ? { tizenVersion: browser.tizenVersion } : {},\n ...browser.chromeVersion !== void 0 ? { chromeVersion: browser.chromeVersion } : {},\n userAgent: navigator.userAgent\n });\n}\nfunction supportsFeature(feature) {\n switch (feature) {\n case \"urlsearchparams\":\n return typeof URLSearchParams !== \"undefined\";\n case \"textencoder\":\n return typeof TextEncoder !== \"undefined\";\n case \"promises\":\n return typeof Promise !== \"undefined\";\n case \"fetch\":\n return typeof fetch !== \"undefined\";\n case \"crypto\":\n return typeof crypto !== \"undefined\" && typeof crypto.subtle !== \"undefined\";\n default:\n return false;\n }\n}\n\n// src/utils/vastTrackingMacros.ts\nvar VAST_MACRO_PATTERN = /\\[([A-Z][A-Z0-9_]*)\\]/g;\nvar CACHEBUSTING_ALIASES = /\\[CACHEBUSTER\\]|\\[cachebuster\\]|\\[timestamp\\]|\\[random\\]|\\[INSERT_RANDOM_NUMBER\\]|%%CACHEBUSTER%%|%%CACHEBUST%%|\\$\\{CACHEBUSTER\\}|\\$\\{CACHEBUSTING\\}|\\{cachebuster\\}|\\{random\\}/g;\nvar KNOWN_VAST_MACROS = /* @__PURE__ */ new Set([\n \"ADCATEGORIES\",\n \"ADCOUNT\",\n \"ADPLAYHEAD\",\n \"ADSERVINGID\",\n \"ADTYPE\",\n \"APIFRAMEWORKS\",\n \"APPBUNDLE\",\n \"ASSETURI\",\n \"BLOCKEDADCATEGORIES\",\n \"BREAKMAXADLENGTH\",\n \"BREAKMAXADS\",\n \"BREAKMAXDURATION\",\n \"BREAKMINADLENGTH\",\n \"BREAKPOSITION\",\n \"CACHEBUSTING\",\n \"CLICKPOS\",\n \"CLICKTYPE\",\n \"CLIENTUA\",\n \"CONTENTID\",\n \"CONTENTPLAYHEAD\",\n \"CONTENTURI\",\n \"DEVICEIP\",\n \"DEVICEUA\",\n \"DOMAIN\",\n \"ERRORCODE\",\n \"EXTENSIONS\",\n \"GDPRCONSENT\",\n \"IFA\",\n \"IFATYPE\",\n \"INVENTORYSTATE\",\n \"LATLONG\",\n \"LIMITADTRACKING\",\n \"MEDIAMIME\",\n \"MEDIAPLAYHEAD\",\n \"OMIDPARTNER\",\n \"PAGEURL\",\n \"PLACEMENTTYPE\",\n \"PLAYERCAPABILITIES\",\n \"PLAYERSIZE\",\n \"PLAYERSTATE\",\n \"PODSEQUENCE\",\n \"REASON\",\n \"REGULATIONS\",\n \"SERVERSIDE\",\n \"SERVERUA\",\n \"TIMESTAMP\",\n \"TRANSACTIONID\",\n \"UNIVERSALADID\",\n \"VASTVERSIONS\",\n \"VERIFICATIONVENDORS\"\n]);\nfunction generateCachebuster() {\n return String(Math.floor(Math.random() * 9e7) + 1e7);\n}\nfunction formatPlayhead(seconds) {\n if (seconds == null || !Number.isFinite(seconds) || seconds < 0) {\n return void 0;\n }\n const total = Math.floor(seconds);\n const hh = String(Math.floor(total / 3600)).padStart(2, \"0\");\n const mm = String(Math.floor(total % 3600 / 60)).padStart(2, \"0\");\n const ss = String(total % 60).padStart(2, \"0\");\n const ms = String(Math.floor((seconds - total) * 1e3)).padStart(3, \"0\");\n return `${hh}:${mm}:${ss}.${ms}`;\n}\nfunction resolveMacroValues(ctx) {\n const values = /* @__PURE__ */ new Map();\n const set = (key, value) => {\n if (value != null && value !== \"\") values.set(key, value);\n };\n const adPlayhead = formatPlayhead(ctx.adPlayheadSeconds);\n set(\"ADPLAYHEAD\", adPlayhead);\n set(\"MEDIAPLAYHEAD\", adPlayhead);\n set(\"CONTENTPLAYHEAD\", formatPlayhead(ctx.contentPlayheadSeconds));\n set(\"ASSETURI\", ctx.assetUri);\n set(\"MEDIAMIME\", ctx.mediaMime);\n set(\"TIMESTAMP\", (/* @__PURE__ */ new Date()).toISOString());\n set(\"SERVERSIDE\", \"0\");\n if (ctx.errorCode != null && ctx.errorCode !== \"\") {\n set(\"ERRORCODE\", String(ctx.errorCode));\n }\n if (ctx.playerWidth != null && ctx.playerHeight != null) {\n set(\"PLAYERSIZE\", `${Math.round(ctx.playerWidth)},${Math.round(ctx.playerHeight)}`);\n }\n set(\"IFA\", ctx.deviceId);\n set(\"IFATYPE\", ctx.deviceIdType);\n if (ctx.limitAdTracking != null) {\n set(\"LIMITADTRACKING\", ctx.limitAdTracking ? \"1\" : \"0\");\n }\n set(\"PAGEURL\", ctx.pageUrl);\n if (ctx.pageUrl) {\n try {\n set(\"DOMAIN\", new URL(ctx.pageUrl).hostname);\n } catch {\n }\n }\n set(\"CLIENTUA\", ctx.clientUa);\n set(\"DEVICEUA\", ctx.clientUa);\n if (ctx.podSequence != null) {\n set(\"PODSEQUENCE\", String(ctx.podSequence));\n }\n set(\"ADSERVINGID\", ctx.adServingId);\n if (ctx.reason != null && ctx.reason !== \"\") {\n set(\"REASON\", String(ctx.reason));\n }\n return values;\n}\nfunction substituteVastTrackingMacros(url, ctx = {}) {\n if (!url) return url;\n const values = resolveMacroValues(ctx);\n return url.replace(CACHEBUSTING_ALIASES, () => generateCachebuster()).replace(VAST_MACRO_PATTERN, (match, name) => {\n if (name === \"CACHEBUSTING\") return generateCachebuster();\n const value = values.get(name);\n if (value != null) return encodeURIComponent(value);\n return KNOWN_VAST_MACROS.has(name) ? \"\" : match;\n });\n}\n\n// src/sdk/hlsAdPlayer.ts\nvar LINEAR_TRACKING_EVENTS = [\n \"creativeView\",\n \"loaded\",\n \"start\",\n \"firstQuartile\",\n \"midpoint\",\n \"thirdQuartile\",\n \"complete\",\n \"mute\",\n \"unmute\",\n \"pause\",\n \"resume\",\n \"fullscreen\",\n \"exitFullscreen\",\n \"playerExpand\",\n \"playerCollapse\",\n \"notUsed\"\n];\nfunction textOf(el) {\n const value = el?.textContent?.trim();\n return value ? value : void 0;\n}\nfunction parseVastTime(value) {\n if (!value) return void 0;\n const parts = value.trim().split(\":\");\n if (parts.length !== 3) return void 0;\n const [h, m, s] = parts.map((p) => parseFloat(p));\n if (![h, m, s].every((n) => n !== void 0 && Number.isFinite(n))) {\n return void 0;\n }\n return h * 3600 + m * 60 + s;\n}\nfunction parseProgressOffset(offset) {\n if (!offset) return void 0;\n const trimmed = offset.trim();\n if (trimmed.endsWith(\"%\")) {\n const percent = parseFloat(trimmed);\n return Number.isFinite(percent) ? { offsetPercent: percent } : void 0;\n }\n const seconds = parseVastTime(trimmed);\n return seconds !== void 0 ? { offsetSeconds: seconds } : void 0;\n}\nvar MAX_VAST_WRAPPER_DEPTH = 5;\nvar BEACON_TIMEOUT_MS = 3e4;\nvar inFlightBeacons = /* @__PURE__ */ new Set();\nvar VAST_ERROR_MEDIA_DISPLAY = 405;\nvar VAST_ERROR_WRAPPER_TIMEOUT = 301;\nvar VAST_ERROR_WRAPPER_LIMIT = 302;\nvar VAST_ERROR_WRAPPER_NO_ADS = 303;\nvar VAST_ERROR_NO_SUPPORTED_MEDIA = 403;\nvar VERIFICATION_NOT_SUPPORTED_REASON = 2;\nvar VIEWABLE_MIN_VISIBLE_RATIO = 0.5;\nvar VIEWABLE_MIN_CONTINUOUS_S = 2;\nfunction toVastMediaErrorCode(error) {\n switch (error?.code) {\n case 1:\n return 400;\n case 2:\n return 401;\n case 4:\n return 403;\n default:\n return VAST_ERROR_MEDIA_DISPLAY;\n }\n}\nfunction createHlsAdPlayer(contentVideo, options) {\n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = /* @__PURE__ */ new Map();\n const mainHlsInstance = options?.mainHlsInstance;\n const AD_CONTAINER_PROP = \"__stormcloudAdContainer\";\n const AD_VIDEO_PROP = \"__stormcloudAdVideo\";\n const FRAME_COUNTER_RELIABLE_PROP = \"__stormcloudFrameCounterReliable\";\n const RVFC_RELIABLE_PROP = \"__stormcloudRvfcReliable\";\n let adVideoElement = contentVideo[AD_VIDEO_PROP] ?? void 0;\n let adHls;\n let adContainerEl = contentVideo[AD_CONTAINER_PROP] ?? void 0;\n let adEventHandlers = [];\n let containerHandlers = [];\n let currentAd;\n let currentAdMediaFile;\n let podAds = [];\n let podIndex = 0;\n const preloadedAds = /* @__PURE__ */ new Map();\n const preloadingAds = /* @__PURE__ */ new Map();\n let destroyed = false;\n let pendingTimeouts = [];\n const STALL_TIMEOUT_MS = 4e3;\n const STALL_CHECK_INTERVAL_MS = 1e3;\n const BLACKFRAME_MIN_PLAYBACK_S = 1.5;\n let stallWatchdogId;\n let lastAdProgressTime = 0;\n let lastAdProgressPosition = 0;\n let sawDecodedVideoFrame = false;\n let videoFrameCallbackHandle;\n let pendingPlayPromise;\n function createTrackingState() {\n return {\n impression: false,\n loaded: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n viewabilitySettled: false,\n lastMuted: void 0,\n progressFired: /* @__PURE__ */ new Set()\n };\n }\n let trackingFired = createTrackingState();\n const resolvedAds = /* @__PURE__ */ new Set();\n let viewObserver;\n let visibleRatio = 0;\n let continuousVisibleS = 0;\n let lastViewSampleTime;\n let lastPlayerExpanded = false;\n let documentHandlers = [];\n function emit(event, payload) {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(\n `[HlsAdPlayer] Error in event listener for ${event}:`,\n error\n );\n }\n }\n }\n function buildTrackingMacroContext(options2 = {}) {\n const { errorCode, reason } = options2;\n const ad = options2.ad ?? currentAd;\n const context = {\n adPlayheadSeconds: adVideoElement?.currentTime,\n contentPlayheadSeconds: contentVideo.currentTime,\n assetUri: currentAdMediaFile?.url,\n mediaMime: currentAdMediaFile?.type,\n playerWidth: adVideoElement?.clientWidth || adContainerEl?.clientWidth,\n playerHeight: adVideoElement?.clientHeight || adContainerEl?.clientHeight\n };\n if (errorCode != null) {\n context.errorCode = errorCode;\n }\n if (typeof navigator !== \"undefined\" && navigator.userAgent) {\n context.clientUa = navigator.userAgent;\n }\n if (typeof location !== \"undefined\" && location.href) {\n context.pageUrl = location.href;\n }\n if (podAds.length > 0) {\n context.podSequence = podIndex + 1;\n }\n if (ad?.adServingId) {\n context.adServingId = ad.adServingId;\n }\n if (reason != null) {\n context.reason = reason;\n }\n return context;\n }\n function fireTrackingPixels(urls, options2) {\n if (!urls || urls.length === 0) return;\n const macroContext = buildTrackingMacroContext(options2);\n urls.forEach((url) => {\n try {\n const trackingUrl = substituteVastTrackingMacros(url, macroContext);\n const img = new Image(1, 1);\n inFlightBeacons.add(img);\n let timeoutId;\n const release = () => {\n if (timeoutId !== void 0) clearTimeout(timeoutId);\n img.onload = null;\n img.onerror = null;\n inFlightBeacons.delete(img);\n };\n img.onload = release;\n img.onerror = release;\n timeoutId = setTimeout(release, BEACON_TIMEOUT_MS);\n img.src = trackingUrl;\n console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n }\n });\n }\n function getMainStreamQuality() {\n if (!mainHlsInstance || !mainHlsInstance.levels) {\n return null;\n }\n const currentLevel = mainHlsInstance.currentLevel;\n if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n const autoLevel = mainHlsInstance.loadLevel;\n if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n const level2 = mainHlsInstance.levels[autoLevel];\n return {\n width: level2.width || 1920,\n height: level2.height || 1080,\n bitrate: level2.bitrate || 5e6\n };\n }\n return null;\n }\n const level = mainHlsInstance.levels[currentLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5e6\n };\n }\n function selectBestMediaFile(mediaFiles) {\n if (mediaFiles.length === 0) {\n throw new Error(\"No media files available\");\n }\n const firstFile = mediaFiles[0];\n if (!firstFile) {\n throw new Error(\"No media files available\");\n }\n if (mediaFiles.length === 1) {\n return firstFile;\n }\n const mainQuality = getMainStreamQuality();\n if (!mainQuality) {\n console.log(\n \"[HlsAdPlayer] No main stream quality info, using first media file\"\n );\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n const scoredFiles = mediaFiles.map((file) => {\n const widthDiff = Math.abs(file.width - mainQuality.width);\n const heightDiff = Math.abs(file.height - mainQuality.height);\n const resolutionDiff = widthDiff + heightDiff;\n const fileBitrate = (file.bitrate || 5e3) * 1e3;\n const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n const score = resolutionDiff * 2 + bitrateDiff / 1e3;\n return { file, score, resolutionDiff, bitrateDiff };\n });\n scoredFiles.sort((a, b) => a.score - b.score);\n const bestMatch = scoredFiles[0];\n if (!bestMatch) {\n console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Selected media file:\", {\n url: bestMatch.file.url,\n resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n bitrate: bestMatch.file.bitrate,\n score: bestMatch.score,\n resolutionDiff: bestMatch.resolutionDiff,\n bitrateDiff: bestMatch.bitrateDiff\n });\n return bestMatch.file;\n }\n function isHlsMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type === \"application/x-mpegurl\" || type === \"application/vnd.apple.mpegurl\" || type.includes(\"mpegurl\") || url.includes(\".m3u8\");\n }\n function isProgressiveMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type.startsWith(\"video/\") || url.endsWith(\".mp4\") || url.includes(\".mp4?\");\n }\n function isAudioMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = (mediaFile.url.toLowerCase().split(\"?\")[0] || \"\").trim();\n return type.startsWith(\"audio/\") || url.endsWith(\".mp3\") || url.endsWith(\".aac\") || url.endsWith(\".m4a\") || url.endsWith(\".ogg\") || url.endsWith(\".oga\") || url.endsWith(\".opus\") || url.endsWith(\".wav\") || url.endsWith(\".weba\");\n }\n function collectVideoMediaFiles(linear, verbose) {\n const mediaFileElements = linear.querySelectorAll(\n \":scope > MediaFiles > MediaFile\"\n );\n const mediaFiles = [];\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n }\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n }\n if (!url) {\n if (verbose) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n }\n return;\n }\n const apiFramework = (mf.getAttribute(\"apiFramework\") || \"\").toUpperCase();\n if (apiFramework === \"VPAID\") {\n if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (VPAID creatives are not supported)`\n );\n }\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n const mediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0\n };\n if (isAudioMediaFile(mediaFile)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (audio-only, type=\"${type}\") \\u2014 audio ads are not played to avoid a black screen`\n );\n return;\n }\n const hasExplicitDimensions = mf.getAttribute(\"width\") != null && mf.getAttribute(\"height\") != null;\n if (!isHlsMediaFile(mediaFile) && hasExplicitDimensions && (mediaFile.width <= 1 || mediaFile.height <= 1)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (degenerate dimensions ${mediaFile.width}x${mediaFile.height}, type=\"${type}\") \\u2014 likely an audio-only placeholder rendition`\n );\n return;\n }\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n }\n } else if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\n return mediaFiles;\n }\n function createEmptyTrackingUrls() {\n const urls = {\n impression: [],\n clickTracking: [],\n error: [],\n viewable: [],\n notViewable: [],\n viewUndetermined: [],\n verificationNotExecuted: [],\n progress: []\n };\n for (const event of LINEAR_TRACKING_EVENTS) {\n urls[event] = [];\n }\n return urls;\n }\n function pushUrls(target, elements) {\n elements.forEach((el) => {\n const url = textOf(el);\n if (url) target.push(url);\n });\n }\n function collectLinearTracking(linear, into) {\n linear.querySelectorAll(\":scope > TrackingEvents > Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = textOf(el);\n if (!event || !url) return;\n if (event === \"progress\") {\n const offset = parseProgressOffset(el.getAttribute(\"offset\"));\n if (offset) into.progress.push({ url, ...offset });\n return;\n }\n if (LINEAR_TRACKING_EVENTS.indexOf(event) !== -1) {\n into[event].push(url);\n }\n });\n pushUrls(\n into.clickTracking,\n linear.querySelectorAll(\":scope > VideoClicks > ClickTracking\")\n );\n }\n function collectAdLevelTracking(adBody, into) {\n pushUrls(into.impression, adBody.querySelectorAll(\":scope > Impression\"));\n pushUrls(into.error, adBody.querySelectorAll(\":scope > Error\"));\n pushUrls(\n into.viewable,\n adBody.querySelectorAll(\":scope > ViewableImpression > Viewable\")\n );\n pushUrls(\n into.notViewable,\n adBody.querySelectorAll(\":scope > ViewableImpression > NotViewable\")\n );\n pushUrls(\n into.viewUndetermined,\n adBody.querySelectorAll(\":scope > ViewableImpression > ViewUndetermined\")\n );\n adBody.querySelectorAll(\n ':scope > AdVerifications > Verification, :scope > Extensions > Extension[type=\"AdVerifications\"] > AdVerifications > Verification'\n ).forEach((verification) => {\n pushUrls(\n into.verificationNotExecuted,\n verification.querySelectorAll(\n ':scope > TrackingEvents > Tracking[event=\"verificationNotExecuted\"]'\n )\n );\n });\n }\n function mergeTrackingUrls(target, source) {\n const targetLists = target;\n const sourceLists = source;\n for (const key of Object.keys(targetLists)) {\n const incoming = sourceLists[key];\n if (incoming && incoming.length > 0) {\n targetLists[key] = targetLists[key].concat(incoming);\n }\n }\n return target;\n }\n function parseXml(xmlString) {\n const xmlDoc = new DOMParser().parseFromString(xmlString, \"text/xml\");\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n parserError.textContent\n );\n return null;\n }\n return xmlDoc;\n }\n function getAdSequence(adElement) {\n const sequence = parseInt(adElement.getAttribute(\"sequence\") || \"\", 10);\n return Number.isFinite(sequence) ? sequence : void 0;\n }\n function emptyVastResult(root) {\n const errorUrls = [];\n pushUrls(errorUrls, root.querySelectorAll(\":scope > Error\"));\n return { type: \"empty\", errorUrls, errorCode: VAST_ERROR_WRAPPER_NO_ADS };\n }\n function parseVastXml(xmlString) {\n try {\n const xmlDoc = parseXml(xmlString);\n if (!xmlDoc) return { type: \"empty\" };\n const root = xmlDoc.documentElement;\n const adElements = Array.from(root.querySelectorAll(\":scope > Ad\"));\n const adElement = adElements.find((el) => getAdSequence(el) === void 0) ?? adElements[0];\n if (!adElement) {\n console.warn(\n `[HlsAdPlayer] No Ad element found in VAST ${root.getAttribute(\"version\") ?? \"\"} response`\n );\n return emptyVastResult(root);\n }\n const parsed = parseAdElement(adElement, true);\n if (parsed.type === \"wrapper\") {\n console.log(\n `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${parsed.vastAdTagUri}`\n );\n }\n return parsed;\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return { type: \"empty\" };\n }\n }\n function parseAdElement(adElement, verbose = false) {\n try {\n const wrapper = adElement.querySelector(\":scope > Wrapper\");\n if (wrapper) {\n const vastAdTagUri = textOf(\n wrapper.querySelector(\":scope > VASTAdTagURI\")\n );\n if (!vastAdTagUri) {\n console.warn(\"[HlsAdPlayer] <Wrapper> has no VASTAdTagURI\");\n return { type: \"empty\" };\n }\n const trackingUrls2 = createEmptyTrackingUrls();\n collectAdLevelTracking(wrapper, trackingUrls2);\n wrapper.querySelectorAll(\":scope > Creatives > Creative > Linear\").forEach((linear2) => collectLinearTracking(linear2, trackingUrls2));\n return {\n type: \"wrapper\",\n vastAdTagUri,\n trackingUrls: trackingUrls2,\n rules: {\n followAdditionalWrappers: wrapper.getAttribute(\"followAdditionalWrappers\") !== \"false\"\n }\n };\n }\n const inLine = adElement.querySelector(\":scope > InLine\");\n if (!inLine) {\n console.warn(\"[HlsAdPlayer] <Ad> has neither <InLine> nor <Wrapper>\");\n return { type: \"empty\" };\n }\n const errorUrls = [];\n pushUrls(errorUrls, inLine.querySelectorAll(\":scope > Error\"));\n if (adElement.getAttribute(\"conditionalAd\") === \"true\") {\n console.warn(\"[HlsAdPlayer] Skipping conditional <Ad> (VPAID-only)\");\n return { type: \"empty\", errorUrls, errorCode: VAST_ERROR_NO_SUPPORTED_MEDIA };\n }\n let linear;\n let mediaFiles = [];\n for (const candidate of Array.from(\n inLine.querySelectorAll(\":scope > Creatives > Creative > Linear\")\n )) {\n const files = collectVideoMediaFiles(candidate, verbose);\n if (files.length > 0) {\n linear = candidate;\n mediaFiles = files;\n break;\n }\n }\n if (!linear) {\n console.warn(\"[HlsAdPlayer] No supported linear media files in <Ad>\");\n return { type: \"empty\", errorUrls, errorCode: VAST_ERROR_NO_SUPPORTED_MEDIA };\n }\n const trackingUrls = createEmptyTrackingUrls();\n collectAdLevelTracking(inLine, trackingUrls);\n collectLinearTracking(linear, trackingUrls);\n return {\n type: \"inline\",\n ad: {\n id: adElement.getAttribute(\"id\") || \"unknown\",\n title: textOf(inLine.querySelector(\":scope > AdTitle\")) || \"Ad\",\n duration: parseVastTime(textOf(linear.querySelector(\":scope > Duration\"))) ?? 30,\n mediaFiles,\n trackingUrls,\n clickThrough: textOf(\n linear.querySelector(\":scope > VideoClicks > ClickThrough\")\n ),\n adServingId: textOf(inLine.querySelector(\":scope > AdServingId\"))\n }\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing <Ad> element:\", error);\n return { type: \"empty\" };\n }\n }\n async function fetchVastXml(vastTagUrl, credentials = \"include\") {\n const requestVast = (creds) => fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: creds,\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\"\n },\n referrerPolicy: \"no-referrer-when-downgrade\"\n });\n let response;\n try {\n response = await requestVast(credentials);\n } catch (error) {\n if (credentials !== \"omit\") {\n console.warn(\n `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n error\n );\n response = await requestVast(\"omit\");\n } else {\n throw error;\n }\n }\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n return response.text();\n }\n async function fetchAndParseVastAd(vastTagUrl, depth = 0, accumulatedTracking = createEmptyTrackingUrls(), rules = { followAdditionalWrappers: true }) {\n let vastXml;\n try {\n vastXml = await fetchVastXml(\n vastTagUrl,\n depth === 0 ? \"include\" : \"omit\"\n );\n } catch (error) {\n if (depth === 0) throw error;\n console.warn(\"[HlsAdPlayer] Wrapped VAST request failed:\", error);\n fireTrackingPixels(accumulatedTracking.error, {\n errorCode: VAST_ERROR_WRAPPER_TIMEOUT\n });\n return null;\n }\n console.log(\"[HlsAdPlayer] VAST XML received\");\n console.log(\n \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n const parsed = parseVastXml(vastXml);\n if (parsed.type === \"empty\") {\n fireTrackingPixels(\n (parsed.errorUrls ?? []).concat(accumulatedTracking.error),\n { errorCode: parsed.errorCode ?? VAST_ERROR_WRAPPER_NO_ADS }\n );\n return null;\n }\n if (parsed.type === \"wrapper\") {\n if (depth >= MAX_VAST_WRAPPER_DEPTH || !rules.followAdditionalWrappers) {\n console.warn(\n rules.followAdditionalWrappers ? `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain` : '[HlsAdPlayer] Parent wrapper set followAdditionalWrappers=\"false\"; rejecting nested wrapper'\n );\n fireTrackingPixels(\n accumulatedTracking.error.concat(parsed.trackingUrls.error),\n { errorCode: VAST_ERROR_WRAPPER_LIMIT }\n );\n return null;\n }\n mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n return fetchAndParseVastAd(\n parsed.vastAdTagUri,\n depth + 1,\n accumulatedTracking,\n parsed.rules\n );\n }\n mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n return parsed.ad;\n }\n async function fetchAndParsePod(vastTagUrl) {\n const vastXml = await fetchVastXml(vastTagUrl);\n console.log(\n `[HlsAdPlayer] Pod VAST XML received (length=${vastXml.length})`\n );\n const trimmedXml = vastXml.trim();\n if (trimmedXml.length === 0) {\n console.warn(\n \"[HlsAdPlayer] Pod VAST response body is empty (no fill)\"\n );\n return [];\n }\n const xmlDoc = parseXml(vastXml);\n if (!xmlDoc) {\n console.error(\n \"[HlsAdPlayer] Pod VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n return [];\n }\n const root = xmlDoc.documentElement;\n const adElements = Array.from(root.querySelectorAll(\":scope > Ad\"));\n if (adElements.length === 0) {\n console.warn(\n `[HlsAdPlayer] No <Ad> elements in VAST ${root.getAttribute(\"version\") ?? \"\"} pod response (no fill)`\n );\n const empty = emptyVastResult(root);\n if (empty.type === \"empty\" && empty.errorUrls?.length) {\n fireTrackingPixels(empty.errorUrls, {\n errorCode: empty.errorCode ?? VAST_ERROR_WRAPPER_NO_ADS\n });\n }\n return [];\n }\n const resolveAd = async (adElement) => {\n const parsed = parseAdElement(adElement);\n if (parsed.type === \"inline\") return parsed.ad;\n if (parsed.type === \"wrapper\") {\n return fetchAndParseVastAd(\n parsed.vastAdTagUri,\n 1,\n parsed.trackingUrls,\n parsed.rules\n );\n }\n if (parsed.errorUrls?.length) {\n fireTrackingPixels(parsed.errorUrls, {\n errorCode: parsed.errorCode ?? VAST_ERROR_NO_SUPPORTED_MEDIA\n });\n }\n return null;\n };\n const podElements = adElements.filter((el) => getAdSequence(el) !== void 0).sort((a, b) => getAdSequence(a) - getAdSequence(b));\n const buffet = adElements.filter((el) => getAdSequence(el) === void 0);\n const ads = [];\n if (podElements.length === 0) {\n for (const adElement of buffet) {\n const ad = await resolveAd(adElement);\n if (ad) ads.push(ad);\n }\n } else {\n for (const adElement of podElements) {\n let ad = await resolveAd(adElement);\n while (!ad && buffet.length > 0) {\n ad = await resolveAd(buffet.shift());\n }\n if (ad) ads.push(ad);\n }\n }\n console.log(\n `[HlsAdPlayer] Parsed ${ads.length} ad(s) from VAST ${root.getAttribute(\"version\") ?? \"\"} pod response`\n );\n return ads;\n }\n function createAdVideoElement() {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.playsInline = true;\n video.muted = false;\n video.volume = 1;\n console.log(\n `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n );\n return video;\n }\n function setupAdEventListeners() {\n if (!adVideoElement || !currentAd) return;\n if (adEventHandlers.length > 0) return;\n const onTimeUpdate = () => {\n if (!currentAd || !adVideoElement) return;\n noteAdProgress();\n sampleViewability();\n const currentTime = adVideoElement.currentTime;\n if (trackingFired.start) {\n for (const event of currentAd.trackingUrls.progress) {\n if (trackingFired.progressFired.has(event)) continue;\n const threshold = event.offsetSeconds ?? (event.offsetPercent ?? 0) / 100 * currentAd.duration;\n if (currentTime >= threshold) {\n trackingFired.progressFired.add(event);\n fireTrackingPixels([event.url]);\n }\n }\n }\n if (!(currentAd.duration > 0)) return;\n const progress = currentTime / currentAd.duration;\n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n }\n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(currentAd.trackingUrls.midpoint);\n }\n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n }\n };\n const onLoadedMetadata = () => {\n if (!adPlaying || !adVideoElement) return;\n const { videoWidth, videoHeight } = adVideoElement;\n if (videoWidth <= 1 || videoHeight <= 1) {\n console.warn(\n `[HlsAdPlayer] Ad creative has no usable video dimensions (${videoWidth}x${videoHeight}) - skipping this creative`\n );\n handleVideoDecodeFailure();\n }\n };\n const onCanPlay = () => {\n if (!currentAd || trackingFired.loaded) return;\n trackingFired.loaded = true;\n fireTrackingPixels(currentAd.trackingUrls.loaded);\n };\n const onPlaying = () => {\n startStallWatchdog();\n if (!currentAd || !adVideoElement) return;\n if (!trackingFired.impression) {\n trackingFired.impression = true;\n resolvedAds.add(currentAd);\n fireTrackingPixels(currentAd.trackingUrls.impression);\n fireTrackingPixels(currentAd.trackingUrls.creativeView);\n fireTrackingPixels(currentAd.trackingUrls.verificationNotExecuted, {\n reason: VERIFICATION_NOT_SUPPORTED_REASON\n });\n emit(\"ad_impression\", {\n adId: currentAd.id,\n index: podIndex,\n total: podAds.length || 1\n });\n }\n if (trackingFired.start) return;\n trackingFired.start = true;\n trackingFired.lastMuted = adVideoElement.muted || adVideoElement.volume === 0;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n };\n const onEnded = () => {\n if (!currentAd || trackingFired.complete) return;\n sampleViewability();\n settleViewability();\n trackingFired.complete = true;\n fireTrackingPixels(currentAd.trackingUrls.complete);\n console.log(\"[HlsAdPlayer] Ad completed\");\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdComplete();\n };\n const onError = (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n reportCurrentAdError(toVastMediaErrorCode(adVideoElement?.error));\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n };\n const onVolumeChange = () => {\n if (!currentAd || !adVideoElement) return;\n const muted = adVideoElement.muted || adVideoElement.volume === 0;\n if (!trackingFired.start) {\n trackingFired.lastMuted = muted;\n return;\n }\n if (muted === trackingFired.lastMuted) return;\n trackingFired.lastMuted = muted;\n fireTrackingPixels(\n muted ? currentAd.trackingUrls.mute : currentAd.trackingUrls.unmute\n );\n };\n const isTrackablePlayback = () => adPlaying && !!currentAd && !!adVideoElement && trackingFired.start && !trackingFired.complete && !adVideoElement.ended;\n const onPause = () => {\n continuousVisibleS = 0;\n if (isTrackablePlayback()) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n };\n const onPlay = () => {\n if (isTrackablePlayback()) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n };\n adEventHandlers = [\n { type: \"timeupdate\", handler: onTimeUpdate },\n { type: \"loadedmetadata\", handler: onLoadedMetadata },\n { type: \"canplay\", handler: onCanPlay },\n { type: \"playing\", handler: onPlaying },\n { type: \"ended\", handler: onEnded },\n { type: \"error\", handler: onError },\n { type: \"volumechange\", handler: onVolumeChange },\n { type: \"pause\", handler: onPause },\n { type: \"play\", handler: onPlay }\n ];\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.addEventListener(type, handler);\n }\n }\n function teardownAdEventListeners() {\n if (adVideoElement) {\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.removeEventListener(type, handler);\n }\n }\n adEventHandlers = [];\n }\n function handleAdClick() {\n if (!adPlaying || !currentAd) return;\n fireTrackingPixels(currentAd.trackingUrls.clickTracking);\n emit(\"ad_click\", { adId: currentAd.id, clickThrough: currentAd.clickThrough });\n if (currentAd.clickThrough) {\n try {\n window.open(currentAd.clickThrough, \"_blank\", \"noopener\");\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Failed to open ClickThrough URL:\", error);\n }\n }\n }\n function reportCurrentAdError(errorCode) {\n if (!currentAd) return;\n resolvedAds.add(currentAd);\n fireTrackingPixels(currentAd.trackingUrls.error, { errorCode });\n }\n function fireNotUsedForUnplayedAds() {\n for (const ad of podAds) {\n if (resolvedAds.has(ad)) continue;\n resolvedAds.add(ad);\n fireTrackingPixels(ad.trackingUrls.notUsed, { ad });\n }\n }\n function sampleViewability() {\n if (!currentAd || !adVideoElement || !viewObserver || !trackingFired.impression || trackingFired.viewabilitySettled) {\n return;\n }\n const now = adVideoElement.currentTime;\n const inView = visibleRatio >= VIEWABLE_MIN_VISIBLE_RATIO && document.visibilityState === \"visible\" && !adVideoElement.paused;\n if (!inView) {\n continuousVisibleS = 0;\n } else if (lastViewSampleTime !== void 0 && now >= lastViewSampleTime) {\n continuousVisibleS += now - lastViewSampleTime;\n }\n lastViewSampleTime = now;\n if (continuousVisibleS >= VIEWABLE_MIN_CONTINUOUS_S) {\n trackingFired.viewabilitySettled = true;\n fireTrackingPixels(currentAd.trackingUrls.viewable);\n }\n }\n function settleViewability() {\n if (!currentAd || !trackingFired.impression || trackingFired.viewabilitySettled) {\n return;\n }\n trackingFired.viewabilitySettled = true;\n fireTrackingPixels(\n viewObserver ? currentAd.trackingUrls.notViewable : currentAd.trackingUrls.viewUndetermined\n );\n }\n function handleFullscreenChange() {\n if (!adPlaying || !currentAd || !adContainerEl || !trackingFired.start) return;\n const fullscreenEl = document.fullscreenElement ?? document.webkitFullscreenElement;\n const expanded = !!fullscreenEl && fullscreenEl.contains(adContainerEl);\n if (expanded === lastPlayerExpanded) return;\n lastPlayerExpanded = expanded;\n const urls = currentAd.trackingUrls;\n fireTrackingPixels(\n expanded ? urls.fullscreen.concat(urls.playerExpand) : urls.exitFullscreen.concat(urls.playerCollapse)\n );\n }\n function attachContainerHandlers() {\n if (!adContainerEl || containerHandlers.length > 0) return;\n const onClick = () => handleAdClick();\n const onInteraction = (event) => {\n if (adPlaying) emit(\"ad_interaction\", event);\n };\n containerHandlers = [\n { type: \"click\", handler: onClick },\n { type: \"mousedown\", handler: onInteraction },\n { type: \"touchstart\", handler: onInteraction }\n ];\n for (const { type, handler } of containerHandlers) {\n adContainerEl.addEventListener(type, handler);\n }\n const onFullscreenChange = () => handleFullscreenChange();\n documentHandlers = [\n { type: \"fullscreenchange\", handler: onFullscreenChange },\n { type: \"webkitfullscreenchange\", handler: onFullscreenChange }\n ];\n for (const { type, handler } of documentHandlers) {\n document.addEventListener(type, handler);\n }\n if (typeof IntersectionObserver !== \"undefined\") {\n viewObserver = new IntersectionObserver(\n (entries) => {\n const entry = entries[entries.length - 1];\n if (entry) {\n visibleRatio = entry.isIntersecting ? entry.intersectionRatio : 0;\n }\n },\n { threshold: [0, 0.25, 0.5, 0.75, 1] }\n );\n viewObserver.observe(adContainerEl);\n }\n }\n function detachContainerHandlers() {\n if (adContainerEl) {\n for (const { type, handler } of containerHandlers) {\n adContainerEl.removeEventListener(type, handler);\n }\n }\n containerHandlers = [];\n for (const { type, handler } of documentHandlers) {\n document.removeEventListener(type, handler);\n }\n documentHandlers = [];\n viewObserver?.disconnect();\n viewObserver = void 0;\n }\n function setAdPlayingFlag(isPlaying) {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n function resetAdTracking() {\n trackingFired = createTrackingState();\n continuousVisibleS = 0;\n lastViewSampleTime = void 0;\n }\n function isRvfcSupported(video) {\n return typeof video.requestVideoFrameCallback === \"function\";\n }\n function settlePendingPlay() {\n pendingPlayPromise = void 0;\n }\n function startAdPlayback(context) {\n if (!adVideoElement) return;\n const playPromise = adVideoElement.play();\n pendingPlayPromise = playPromise;\n playPromise.catch((error) => {\n if (pendingPlayPromise !== playPromise) {\n return;\n }\n console.error(`[HlsAdPlayer] Error starting ${context}:`, error);\n handleAdError();\n }).finally(() => {\n if (pendingPlayPromise === playPromise) {\n pendingPlayPromise = void 0;\n }\n });\n }\n function prepareVideoElementForNewSource() {\n settlePendingPlay();\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (!adVideoElement) return;\n try {\n adVideoElement.pause();\n adVideoElement.removeAttribute(\"src\");\n adVideoElement.load();\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error preparing ad video for new source:\",\n error\n );\n }\n }\n function recreateAdVideoElement() {\n console.log(\n \"[HlsAdPlayer] Recreating ad video element (single-decoder platform)\"\n );\n teardownAdEventListeners();\n prepareVideoElementForNewSource();\n if (adVideoElement) {\n try {\n adVideoElement.remove();\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error removing ad video element:\", error);\n }\n }\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n contentVideo[AD_VIDEO_PROP] = adVideoElement;\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n }\n function loadCurrentAdMedia() {\n if (!adVideoElement || !currentAd) {\n throw new Error(\"No ad video element or ad to load\");\n }\n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n currentAdMediaFile = mediaFile;\n const isHlsAd = isHlsMediaFile(mediaFile);\n console.log(\n `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n );\n if (isHlsAd && import_hls.default.isSupported()) {\n if (adHls) {\n adHls.destroy();\n }\n adHls = new import_hls.default({\n enableWorker: true,\n lowLatencyMode: false\n });\n adHls.loadSource(mediaFile.url);\n adHls.attachMedia(adVideoElement);\n adHls.on(import_hls.default.Events.MANIFEST_PARSED, () => {\n console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n startAdPlayback(\"HLS ad playback\");\n });\n adHls.on(import_hls.default.Events.ERROR, (_event, data) => {\n console.error(\"[HlsAdPlayer] HLS error:\", data);\n if (data.fatal) {\n handleAdError();\n }\n });\n } else if (isHlsAd && adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")) {\n adVideoElement.src = mediaFile.url;\n startAdPlayback(\"native HLS ad playback\");\n } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n adVideoElement.src = mediaFile.url;\n adVideoElement.load();\n startAdPlayback(\"progressive ad playback\");\n } else {\n throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n }\n }\n function advanceToNextPodAd() {\n if (podIndex >= podAds.length - 1) {\n return false;\n }\n settleViewability();\n podIndex++;\n currentAd = podAds[podIndex];\n currentAdMediaFile = void 0;\n resetAdTracking();\n if (currentAd) {\n console.log(\n `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n );\n }\n clearStallWatchdog();\n if (requiresMediaPipelineResetAfterAds()) {\n recreateAdVideoElement();\n setupAdEventListeners();\n } else {\n prepareVideoElementForNewSource();\n }\n try {\n loadCurrentAdMedia();\n emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n return true;\n } catch (error) {\n console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n return false;\n }\n }\n function clearStallWatchdog() {\n if (stallWatchdogId != null) {\n clearInterval(stallWatchdogId);\n stallWatchdogId = void 0;\n }\n cancelVideoFrameProbe();\n }\n function noteAdProgress() {\n lastAdProgressTime = Date.now();\n if (adVideoElement) {\n lastAdProgressPosition = adVideoElement.currentTime;\n }\n }\n function handleAdStall() {\n console.warn(\n \"[HlsAdPlayer] Ad playback stalled (no progress) - recovering to avoid a blank frame\"\n );\n clearStallWatchdog();\n reportCurrentAdError(VAST_ERROR_MEDIA_DISPLAY);\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n }\n function getDecodedVideoFrameCount(video) {\n try {\n if (typeof video.getVideoPlaybackQuality === \"function\") {\n const quality = video.getVideoPlaybackQuality();\n if (quality && typeof quality.totalVideoFrames === \"number\") {\n return quality.totalVideoFrames;\n }\n }\n const legacyCount = video.webkitDecodedFrameCount;\n if (typeof legacyCount === \"number\") {\n return legacyCount;\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Unable to read decoded video frame count:\",\n error\n );\n }\n return void 0;\n }\n function isFrameCounterReliable() {\n return contentVideo[FRAME_COUNTER_RELIABLE_PROP] === true;\n }\n function markFrameCounterReliable() {\n contentVideo[FRAME_COUNTER_RELIABLE_PROP] = true;\n }\n function isRvfcReliable() {\n return contentVideo[RVFC_RELIABLE_PROP] === true;\n }\n function markRvfcReliable() {\n contentVideo[RVFC_RELIABLE_PROP] = true;\n }\n function cancelVideoFrameProbe() {\n if (videoFrameCallbackHandle != null && adVideoElement && typeof adVideoElement.cancelVideoFrameCallback === \"function\") {\n try {\n adVideoElement.cancelVideoFrameCallback(\n videoFrameCallbackHandle\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error cancelling video frame callback:\",\n error\n );\n }\n }\n videoFrameCallbackHandle = void 0;\n }\n function startVideoFrameProbe() {\n cancelVideoFrameProbe();\n if (!adVideoElement) return;\n const rvfc = adVideoElement.requestVideoFrameCallback;\n if (typeof rvfc !== \"function\") return;\n const onPresentedFrame = () => {\n videoFrameCallbackHandle = void 0;\n if (!adPlaying) return;\n sawDecodedVideoFrame = true;\n markRvfcReliable();\n };\n try {\n videoFrameCallbackHandle = rvfc.call(\n adVideoElement,\n onPresentedFrame\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error requesting video frame callback:\",\n error\n );\n videoFrameCallbackHandle = void 0;\n }\n }\n function handleVideoDecodeFailure() {\n console.warn(\n \"[HlsAdPlayer] Ad audio is advancing but no video frames decoded (black screen) - skipping this creative\"\n );\n clearStallWatchdog();\n reportCurrentAdError(VAST_ERROR_MEDIA_DISPLAY);\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n }\n function startStallWatchdog() {\n clearStallWatchdog();\n noteAdProgress();\n sawDecodedVideoFrame = false;\n startVideoFrameProbe();\n const blackFrameDetectionEnabled = !requiresMediaPipelineResetAfterAds();\n stallWatchdogId = window.setInterval(() => {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n if (blackFrameDetectionEnabled && !sawDecodedVideoFrame && !adVideoElement.paused) {\n const decodedFrames = getDecodedVideoFrameCount(adVideoElement);\n if (decodedFrames !== void 0 && decodedFrames > 0) {\n sawDecodedVideoFrame = true;\n markFrameCounterReliable();\n } else if (adVideoElement.currentTime >= BLACKFRAME_MIN_PLAYBACK_S) {\n const timeAdvancing = adVideoElement.currentTime > lastAdProgressPosition + 0.05;\n if (isRvfcSupported(adVideoElement) && timeAdvancing && isRvfcReliable()) {\n handleVideoDecodeFailure();\n return;\n }\n if (decodedFrames === 0 && timeAdvancing && isFrameCounterReliable()) {\n handleVideoDecodeFailure();\n return;\n }\n }\n }\n if (adVideoElement.currentTime > lastAdProgressPosition + 0.05) {\n noteAdProgress();\n return;\n }\n if (adVideoElement.paused) {\n noteAdProgress();\n return;\n }\n if (Date.now() - lastAdProgressTime >= STALL_TIMEOUT_MS) {\n handleAdStall();\n }\n }, STALL_CHECK_INTERVAL_MS);\n }\n function releaseAdDecoder() {\n prepareVideoElementForNewSource();\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }\n function handleAdComplete() {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n settleViewability();\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n releaseAdDecoder();\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode:\", error);\n });\n } else {\n console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n }\n }\n emit(\"content_resume\");\n }\n function handleAdError() {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n settleViewability();\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n releaseAdDecoder();\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n emit(\"ad_error\");\n }\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n contentVideo[AD_CONTAINER_PROP] = adContainerEl;\n attachContainerHandlers();\n },\n async requestAds(vastTagUrl) {\n console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n if (adPlaying) {\n console.warn(\n \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n );\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n try {\n let ads = [];\n if (preloadedAds.has(vastTagUrl)) {\n const preloaded = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n if (preloaded) {\n ads = [preloaded];\n }\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ads = await fetchAndParsePod(vastTagUrl);\n }\n if (!ads.length) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.reject(new Error(\"No ads available from VAST response\"));\n }\n podAds = ads;\n podIndex = 0;\n currentAd = ads[0];\n currentAdMediaFile = void 0;\n console.log(\n `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n );\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n async play() {\n if (!currentAd) {\n console.warn(\n \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n );\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n console.log(\"[HlsAdPlayer] Starting ad playback\");\n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n contentVideo[AD_VIDEO_PROP] = adVideoElement;\n }\n setupAdEventListeners();\n resetAdTracking();\n const contentVolume = contentVideo.volume;\n originalVolume = Math.max(\n 0,\n Math.min(1, contentVolume || originalVolume)\n );\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.pause();\n console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n } else {\n console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n }\n console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n contentVideo.muted = true;\n adPlaying = true;\n setAdPlayingFlag(true);\n if (adVideoElement) {\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n console.log(\n `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n );\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n emit(\"content_pause\");\n loadCurrentAdMedia();\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {\n });\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n }\n },\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n settleViewability();\n fireNotUsedForUnplayedAds();\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n console.log(\n `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n );\n releaseAdDecoder();\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode on stop:\", error);\n });\n }\n }\n currentAd = void 0;\n currentAdMediaFile = void 0;\n podAds = [];\n podIndex = 0;\n },\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n settleViewability();\n fireNotUsedForUnplayedAds();\n destroyed = true;\n clearStallWatchdog();\n for (const timeoutId of pendingTimeouts) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts = [];\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n teardownAdEventListeners();\n detachContainerHandlers();\n releaseAdDecoder();\n currentAd = void 0;\n currentAdMediaFile = void 0;\n podAds = [];\n podIndex = 0;\n listeners.clear();\n preloadedAds.clear();\n preloadingAds.clear();\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width, height) {\n console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n on(event, listener) {\n if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());\n listeners.get(event).add(listener);\n },\n off(event, listener) {\n listeners.get(event)?.delete(listener);\n },\n updateOriginalMutedState(muted, volume) {\n const nextVolume = typeof volume === \"number\" && !Number.isNaN(volume) ? Math.max(0, Math.min(1, volume)) : originalVolume;\n console.log(\n `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n );\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume) {\n if (adVideoElement && adPlaying) {\n const clamped = Math.max(0, Math.min(1, volume));\n adVideoElement.volume = clamped;\n adVideoElement.muted = clamped === 0;\n }\n },\n getAdVolume() {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n showPlaceholder() {\n contentVideo.style.opacity = \"0\";\n contentVideo.style.visibility = \"hidden\";\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl && !adPlaying) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n if (!adPlaying) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n },\n getLoadedAdDuration() {\n return currentAd?.duration;\n },\n getLoadedAdId() {\n return currentAd?.id;\n },\n getPodAdCount() {\n return podAds.length;\n },\n getPodTotalDurationMs() {\n return podAds.reduce(\n (total, ad) => total + (ad.duration > 0 ? ad.duration * 1e3 : 0),\n 0\n );\n }\n };\n}\n\n// src/utils/devUrl.ts\nvar PRIVATE_HOST_PATTERNS = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/\n];\nfunction isLocalDevHost(hostname) {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\nfunction toDevSafeUrl(rawUrl) {\n if (!rawUrl) return rawUrl ?? \"\";\n let url;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _nonceLoaderAllowStorage;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n if (_palLoadPromise) return _palLoadPromise;\n _palLoadPromise = new Promise((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n );\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 1e4\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader(allowStorage) {\n if (_nonceLoader && _nonceLoaderAllowStorage === allowStorage) {\n return _nonceLoader;\n }\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = allowStorage;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n _nonceLoaderAllowStorage = allowStorage;\n return _nonceLoader;\n}\nfunction createPalNonceManager() {\n let currentNonce = \"\";\n let currentNonceManager;\n return {\n async generateNonce(options = {}) {\n try {\n await loadPalSdk();\n const loader = getOrCreateNonceLoader(options.allowStorage ?? true);\n const goog = window.goog;\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId\n }, null, 2)\n );\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce();\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = void 0;\n return \"\";\n }\n },\n getCurrentNonce() {\n return currentNonce;\n },\n injectNonce(vastTagUrl) {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n sendPlaybackStart() {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {\n }\n },\n sendPlaybackEnd() {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {\n }\n },\n sendAdClick() {\n try {\n currentNonceManager?.sendAdClick();\n } catch {\n }\n },\n sendAdTouch(event) {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {\n }\n },\n reset() {\n currentNonce = \"\";\n currentNonceManager = void 0;\n }\n };\n}\n\n// src/utils/trackingIngest.ts\nvar DEFAULT_TRACKING_INGEST_CONFIG = {\n enabled: true,\n baseUrl: \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\"\n};\nvar trackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG\n};\nfunction applyTrackingIngestConfig(overrides) {\n Object.assign(trackingIngestConfig, overrides);\n}\nfunction configureTrackingIngest(overrides) {\n applyTrackingIngestConfig(overrides);\n}\nfunction isTrackingIngestEnabled() {\n return trackingIngestConfig.enabled === true;\n}\nfunction normalizeIngestBaseUrl(baseUrl) {\n return baseUrl.replace(/\\/+$/, \"\");\n}\nfunction buildTrackingIngestUrl(channel) {\n const base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);\n if (channel === \"impressions\") {\n return `${base}/impressions/ingest`;\n }\n return `${base}/metrics/ingest`;\n}\nasync function ingestPlayerTracking(licenseKey, channel, body) {\n if (!isTrackingIngestEnabled() || !licenseKey) {\n return false;\n }\n try {\n const response = await fetch(buildTrackingIngestUrl(channel), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `License-Key ${licenseKey}`\n },\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest failed (${response.status}) for ${channel}`\n );\n return false;\n }\n return true;\n } catch (error) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest error for ${channel}:`,\n error\n );\n return false;\n }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar WEB_SESSION_STORAGE_KEY = \"stormcloud.web.sid\";\nvar inMemoryWebSessionId;\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar DEVICE_ID_STORAGE_KEYS = [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"advertising_id\",\n \"deviceAdvertisingId\",\n \"aaid\",\n \"adid\",\n \"rida\",\n \"tifa\",\n \"lgudid\"\n];\nvar ANDROID_ID_TYPES = /* @__PURE__ */ new Set([\"aaid\", \"adid\"]);\nfunction resolveVastEnvironmentSignals(isCtv) {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const realDeviceId = bridgeSignals.deviceId || (isCtv ? readStoredDeviceId() : void 0) || platformDevice.deviceId;\n let deviceId = realDeviceId;\n let deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType();\n const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n let limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n if (!deviceId && isCtv) {\n const dpid = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (dpid) {\n deviceId = dpid;\n deviceIdType = \"dpid\";\n limitAdTracking = platformLat ?? readStoredLimitAdTracking() ?? false;\n }\n }\n const deviceTypeHint = resolveDeviceTypeHint(isCtv);\n if (isCtv) {\n return {\n isCtv: true,\n sessionId: getOrCreateCtvSessionId(),\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {},\n deviceTypeHint\n };\n }\n const webSessionId = getOrCreateWebSessionId();\n return {\n isCtv: false,\n ...webSessionId ? { sessionId: webSessionId } : {},\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {},\n deviceTypeHint\n };\n}\nvar DEVICE_TYPE_HINT = {\n FEATURE_PHONE: 1,\n SMARTPHONE: 2,\n DESKTOP: 3,\n TABLET: 4,\n CONNECTED_TV: 5,\n GAME_CONSOLE: 6,\n SET_TOP_BOX: 7\n};\nvar DEVICE_TYPE_HINT_ALIASES = {\n featurephone: DEVICE_TYPE_HINT.FEATURE_PHONE,\n smartphone: DEVICE_TYPE_HINT.SMARTPHONE,\n mobile: DEVICE_TYPE_HINT.SMARTPHONE,\n phone: DEVICE_TYPE_HINT.SMARTPHONE,\n desktop: DEVICE_TYPE_HINT.DESKTOP,\n pc: DEVICE_TYPE_HINT.DESKTOP,\n tablet: DEVICE_TYPE_HINT.TABLET,\n ctv: DEVICE_TYPE_HINT.CONNECTED_TV,\n tv: DEVICE_TYPE_HINT.CONNECTED_TV,\n connectedtv: DEVICE_TYPE_HINT.CONNECTED_TV,\n smarttv: DEVICE_TYPE_HINT.CONNECTED_TV,\n console: DEVICE_TYPE_HINT.GAME_CONSOLE,\n gameconsole: DEVICE_TYPE_HINT.GAME_CONSOLE,\n stb: DEVICE_TYPE_HINT.SET_TOP_BOX,\n settopbox: DEVICE_TYPE_HINT.SET_TOP_BOX\n};\nvar SET_TOP_BOX_UA = /LGSTB|\\bSTB\\b|STB\\d|Set-?Top|SetTopBox|TV ?Box|Kaon|Humax|Arris|Technicolor|Sagemcom|Infomir|MAG\\d{3}|KreaTV|Amino|Formuler|Dune ?HD|TiVo|MiBOX|Mi Box|SHIELD Android TV|\\bAFT[A-Z]|Roku|AppleTV|Apple TV|CrKey/i;\nvar GAME_CONSOLE_UA = /PlayStation|Xbox|Nintendo/i;\nvar CONNECTED_TV_UA = /Web0S|webOS|Tizen|SMART-TV|SmartTV|NetCast|BRAVIA|HbbTV|VIDAA|Hisense|Philips|Viera|AQUOS|Android TV|Google TV|\\bTV\\b/i;\nvar FEATURE_PHONE_UA = /KAIOS|MIDP|J2ME|Series40|Opera Mini/i;\nfunction resolveDeviceTypeHint(isCtv) {\n const override = readDeviceTypeHintOverride(isCtv);\n if (override != null) return override;\n return inferDeviceTypeHint(isCtv);\n}\nfunction inferDeviceTypeHint(isCtv) {\n const fallback = isCtv ? DEVICE_TYPE_HINT.CONNECTED_TV : DEVICE_TYPE_HINT.DESKTOP;\n if (typeof navigator === \"undefined\") return fallback;\n const ua = navigator.userAgent || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n if (SET_TOP_BOX_UA.test(ua)) return DEVICE_TYPE_HINT.SET_TOP_BOX;\n if (GAME_CONSOLE_UA.test(ua)) return DEVICE_TYPE_HINT.GAME_CONSOLE;\n if (CONNECTED_TV_UA.test(ua) && !/Mobile/i.test(ua)) {\n return DEVICE_TYPE_HINT.CONNECTED_TV;\n }\n if (FEATURE_PHONE_UA.test(ua)) return DEVICE_TYPE_HINT.FEATURE_PHONE;\n if (/iPad/i.test(ua) || /Macintosh/i.test(ua) && maxTouchPoints > 1) {\n return DEVICE_TYPE_HINT.TABLET;\n }\n if (/iPhone|iPod/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;\n if (/Android/i.test(ua)) {\n if (/Mobile/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;\n if (maxTouchPoints === 0) return DEVICE_TYPE_HINT.SET_TOP_BOX;\n return DEVICE_TYPE_HINT.TABLET;\n }\n if (/Mobile|Windows Phone|BlackBerry/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;\n return fallback;\n}\nfunction readDeviceTypeHintOverride(isCtv) {\n if (typeof window === \"undefined\") return void 0;\n const keys = [\"dth\", \"deviceTypeHint\"];\n const fromGlobal = normalizeDeviceTypeHint(window.__STORMCLOUD_DTH__);\n if (fromGlobal != null) return fromGlobal;\n for (const source of getNativeBridgeSources()) {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeDeviceTypeHint(\n typeof value === \"function\" ? safeCall(value, source) : value\n );\n if (normalized != null) return normalized;\n }\n }\n if (!isCtv) return void 0;\n for (const key of [\"stormcloud.dth\", \"dth\"]) {\n const normalized = normalizeDeviceTypeHint(readStoredString(key));\n if (normalized != null) return normalized;\n }\n return void 0;\n}\nfunction normalizeDeviceTypeHint(value) {\n if (typeof value === \"number\") {\n return Number.isInteger(value) && value >= 1 && value <= 7 ? value : void 0;\n }\n if (typeof value !== \"string\") return void 0;\n const trimmed = value.trim();\n if (/^[1-7]$/.test(trimmed)) return parseInt(trimmed, 10);\n return DEVICE_TYPE_HINT_ALIASES[trimmed.toLowerCase().replace(/[\\s_-]/g, \"\")];\n}\nfunction safeCall(fn, thisArg) {\n try {\n return fn.call(thisArg);\n } catch {\n return void 0;\n }\n}\nfunction inferDeviceIdType() {\n if (typeof navigator === \"undefined\") {\n return void 0;\n }\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return void 0;\n}\nfunction isEquivalentDeviceIdType(tagType, runtimeType) {\n if (!tagType || !runtimeType) return false;\n const tag = tagType.toLowerCase();\n const runtime = runtimeType.toLowerCase();\n if (tag === runtime) return true;\n return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\nfunction resolveNativeDeviceId(includeStored = true) {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const deviceId = bridgeSignals.deviceId || (includeStored ? readStoredDeviceId() : void 0) || platformDevice.deviceId;\n if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n return void 0;\n }\n return deviceId;\n}\nfunction getOrCreateStoredUuid(storageKey) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n const existing = readPersistentId(storageKey);\n if (existing) {\n writePersistentId(storageKey, existing);\n return existing;\n }\n const id = createUuid();\n writePersistentId(storageKey, id);\n return id;\n}\nfunction getOrCreateCtvSessionId() {\n const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n if (existing) {\n writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n return existing;\n }\n const sessionId = createUuid();\n writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n return sessionId;\n}\nfunction getOrCreateWebSessionId() {\n if (typeof window === \"undefined\") return void 0;\n try {\n const existing = window.sessionStorage?.getItem(WEB_SESSION_STORAGE_KEY);\n if (existing && !isMacroPlaceholder(existing)) return existing;\n } catch {\n }\n const sessionId = inMemoryWebSessionId || createUuid();\n inMemoryWebSessionId = sessionId;\n try {\n window.sessionStorage?.setItem(WEB_SESSION_STORAGE_KEY, sessionId);\n } catch {\n }\n return sessionId;\n}\nfunction readPersistentId(storageKey) {\n return readStoredString(storageKey) || readCookie(storageKey);\n}\nfunction writePersistentId(storageKey, value) {\n try {\n window.localStorage?.setItem(storageKey, value);\n } catch {\n }\n writeCookie(storageKey, value);\n}\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\nfunction readCookie(name) {\n if (typeof document === \"undefined\") {\n return void 0;\n }\n try {\n const prefix = encodeURIComponent(name) + \"=\";\n const parts = document.cookie ? document.cookie.split(\";\") : [];\n for (const part of parts) {\n const entry = part.trim();\n if (entry.startsWith(prefix)) {\n return decodeURIComponent(entry.slice(prefix.length)) || void 0;\n }\n }\n } catch {\n }\n return void 0;\n}\nfunction writeCookie(name, value) {\n if (typeof document === \"undefined\") {\n return;\n }\n try {\n document.cookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value) + \";path=/;max-age=\" + PERSISTENT_ID_COOKIE_MAX_AGE + \";SameSite=Lax\";\n } catch {\n }\n}\nfunction createUuid() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const bytes = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(bytes);\n } else {\n let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n for (let i = 0; i < 16; i++) {\n seed = seed * 1103515245 + 12345 & 2147483647;\n bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;\n }\n }\n bytes[6] = (bytes[6] ?? 0) & 15 | 64;\n bytes[8] = (bytes[8] ?? 0) & 63 | 128;\n let hex = \"\";\n for (let i = 0; i < 16; i++) {\n hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n }\n return hex.slice(0, 8) + \"-\" + hex.slice(8, 12) + \"-\" + hex.slice(12, 16) + \"-\" + hex.slice(16, 20) + \"-\" + hex.slice(20, 32);\n}\nfunction performanceNow() {\n try {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n } catch {\n }\n return 0;\n}\nfunction readPlatformNativeDeviceId() {\n if (typeof window === \"undefined\") return {};\n try {\n const adinfo = window.webapis?.adinfo;\n if (adinfo) {\n const tifa = typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n const lat = typeof adinfo.isLATEnabled === \"function\" ? adinfo.isLATEnabled() : void 0;\n return {\n deviceId: tifa,\n deviceIdType: \"tifa\",\n ...typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}\n };\n }\n }\n } catch {\n }\n try {\n const webOSDev = window.webOSDev;\n if (webOSDev) {\n const lgudid = typeof webOSDev.LGUDID === \"function\" ? webOSDev.LGUDID() : webOSDev.lgudid ?? webOSDev.LGUDID;\n if (typeof lgudid === \"string\" && lgudid) {\n if (isZeroedAdId(lgudid)) {\n return { deviceIdType: \"lgudid\", limitAdTracking: true };\n }\n if (!isMacroPlaceholder(lgudid)) {\n return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n }\n }\n }\n } catch {\n }\n try {\n const roku = window.Roku;\n if (roku) {\n const rida = typeof roku.getPublisherUniqueId === \"function\" ? roku.getPublisherUniqueId() : roku.rida;\n if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n }\n }\n } catch {\n }\n return {};\n}\nvar ZEROED_AD_ID_PATTERNS = /* @__PURE__ */ new Set([\n \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n \"00000000-0000-0000-0000-000000000000\"\n]);\nfunction isMacroPlaceholder(value) {\n const t = value.trim();\n return !t || /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) || /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) || ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\nfunction isZeroedAdId(value) {\n return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\nfunction readNativeBridgeSignals() {\n for (const source of getNativeBridgeSources()) {\n const contentUrl = readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) || void 0;\n const appId = readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) || void 0;\n const appName = readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || void 0;\n const deviceId = readBridgeValue(source, [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"adId\",\n \"deviceId\",\n \"lgudid\",\n \"LGUDID\",\n \"tifa\",\n \"rida\",\n \"afai\",\n \"aaid\"\n ]) || void 0;\n if (!contentUrl && !deviceId && !appId && !appName) continue;\n const deviceIdType = readBridgeValue(source, [\n \"idtype\",\n \"deviceIdType\",\n \"advertisingIdType\",\n \"idType\"\n ]) || inferDeviceIdType();\n const limitAdTracking = readBridgeBoolean(source, [\n \"is_lat\",\n \"limitAdTracking\",\n \"limitedAdTracking\",\n \"lat\"\n ]);\n return {\n ...contentUrl ? { contentUrl } : {},\n ...appId ? { appId } : {},\n ...appName ? { appName } : {},\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n };\n }\n return {};\n}\nfunction getNativeBridgeSources() {\n if (typeof window === \"undefined\") {\n return [];\n }\n return [\n window.__STORMCLOUD_CTV_AD_INFO__,\n window.__STORMCLOUD_CTV__,\n window.stormcloudCtv,\n window.AiryTV,\n window.Android,\n window.webOS,\n window.tizen,\n window.amazon\n ].filter(Boolean);\n}\nfunction readBridgeValue(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n if (typeof value === \"string\" && value) {\n return value;\n }\n if (typeof value === \"function\") {\n try {\n const result = value.call(source);\n if (typeof result === \"string\" && result) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readBridgeBoolean(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeBoolean(value);\n if (normalized != null) {\n return normalized;\n }\n if (typeof value === \"function\") {\n try {\n const result = normalizeBoolean(value.call(source));\n if (result != null) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readStoredDeviceId() {\n for (const key of DEVICE_ID_STORAGE_KEYS) {\n const value = readStoredString(key);\n if (value) {\n return value;\n }\n }\n return void 0;\n}\nfunction readStoredString(key) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n try {\n const value = window.localStorage?.getItem(key);\n return value || void 0;\n } catch {\n return void 0;\n }\n}\nfunction readStoredLimitAdTracking() {\n return normalizeBoolean(\n readStoredString(\"limitAdTracking\") || readStoredString(\"limitedAdTracking\") || readStoredString(\"is_lat\")\n );\n}\nfunction normalizeBoolean(value) {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n }\n return void 0;\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction buildAnalyticsContext(config) {\n const context = {};\n if (config.debugAdTiming) {\n context.debugAdTiming = true;\n }\n if (config.isLiveStream !== void 0) {\n context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n }\n return context;\n}\nfunction getClientInfo() {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = navigator.deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: screen?.orientation?.type || \"\",\n pixelDepth: screen?.pixelDepth\n };\n let deviceType = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState\n };\n}\nasync function sha256Hex(input) {\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n let encodedData;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(input);\n } else {\n const utf8 = unescape(encodeURIComponent(input));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\nfunction resolvePlayerIdentitySeed(clientInfo) {\n const nativeDeviceId = resolveNativeDeviceId(clientInfo.isSmartTV);\n if (nativeDeviceId) {\n return `device:${nativeDeviceId}`;\n }\n const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (persistedId) {\n return `persisted:${persistedId}`;\n }\n return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\nasync function getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n return Boolean(isTrackingIngestEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n const clientInfo = getClientInfo();\n const debugAdTiming = !!context.debugAdTiming;\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n }\n const playerId = await getBrowserID(clientInfo);\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n }\n const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n };\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n adLoaded: false,\n adDetect: false\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n await ingestPlayerTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp\n }\n ]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [heartbeatData]\n });\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n\n// src/utils/polyfills.ts\nfunction polyfillURLSearchParams() {\n if (typeof URLSearchParams !== \"undefined\") {\n return;\n }\n class URLSearchParamsPolyfill {\n constructor(init) {\n this.params = /* @__PURE__ */ new Map();\n if (typeof init === \"string\") {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n parseQueryString(query) {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return;\n cleanQuery.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n this.append(decodedKey, decodedValue);\n }\n });\n }\n safeDecodeURIComponent(str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\n } catch (e) {\n return str;\n }\n }\n append(name, value) {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n delete(name) {\n this.params.delete(name);\n }\n get(name) {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n }\n getAll(name) {\n return this.params.get(name) || [];\n }\n has(name) {\n return this.params.has(name);\n }\n set(name, value) {\n this.params.set(name, [String(value)]);\n }\n forEach(callback) {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n toString() {\n const parts = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join(\"&\");\n }\n }\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n if (typeof TextEncoder !== \"undefined\") {\n return;\n }\n class TextEncoderPolyfill {\n constructor() {\n this.encoding = \"utf-8\";\n }\n encode(str) {\n const utf8 = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 128) {\n utf8.push(charcode);\n } else if (charcode < 2048) {\n utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n } else if (charcode < 55296 || charcode >= 57344) {\n utf8.push(\n 224 | charcode >> 12,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n } else {\n i++;\n charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n utf8.push(\n 240 | charcode >> 18,\n 128 | charcode >> 12 & 63,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n Promise.prototype.finally = function(callback) {\n const constructor = this.constructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) => constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\nfunction polyfillObjectAssign() {\n if (typeof Object.assign !== \"function\") {\n Object.assign = function(target, ...sources) {\n if (target == null) {\n throw new TypeError(\"Cannot convert undefined or null to object\");\n }\n const to = Object(target);\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n }\n}\nfunction polyfillArrayFrom() {\n if (!Array.from) {\n Array.from = function(arrayLike, mapFn, thisArg) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError(\"Array.from requires an array-like object\");\n }\n const len = items.length >>> 0;\n const result = new Array(len);\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n return result;\n };\n }\n}\nfunction polyfillStringStartsWith() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(search, pos) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\nfunction polyfillStringEndsWith() {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function(search, length) {\n if (length === void 0 || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\nfunction polyfillStringIncludes() {\n if (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n if (typeof start !== \"number\") {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\nfunction initializePolyfills() {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n// src/utils/vastMacros.ts\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nvar INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nvar EXAMPLE_COM_URL = /example\\.com/i;\nvar CTV_UNSUPPORTED_PARAMS = [\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\"\n];\nvar INLINE_DEVICE_MACRO_REPLACEMENTS = [\n { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator }\n];\nfunction isMacroPlaceholder2(value) {\n if (value == null) return true;\n const trimmed = value.trim();\n if (!trimmed) return true;\n if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\nfunction generateCorrelator() {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nfunction expandInlineMacroPlaceholders(baseUrl, ctx) {\n let url = baseUrl;\n for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n const value = getValue(ctx);\n if (value != null && value !== \"\") {\n url = url.replace(pattern, encodeURIComponent(value));\n }\n }\n return url;\n}\nfunction applyDeviceIdentityParams(params, ctx) {\n const runtimeId = ctx.deviceId?.trim();\n const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n const tagRdid = params.get(\"rdid\");\n const tagType = params.get(\"idtype\");\n const tagLat = params.get(\"is_lat\");\n const latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0;\n if (runtimeId) {\n params.set(\"rdid\", runtimeId);\n params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n params.set(\"is_lat\", latValue ?? (isMacroPlaceholder2(tagLat) ? \"0\" : tagLat));\n return;\n }\n if (!ctx.isCtv) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder2(tagRdid));\n const tagTypeValid = Boolean(tagType && !isMacroPlaceholder2(tagType));\n if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n if (tagRdidValid) {\n if (isMacroPlaceholder2(tagType) && runtimeType) {\n params.set(\"idtype\", runtimeType);\n }\n if (isMacroPlaceholder2(tagLat)) {\n params.set(\"is_lat\", latValue ?? \"0\");\n }\n return;\n }\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n}\nfunction removeBrokenAppNameOrphans(params, appName) {\n const toDelete = [];\n params.forEach((_value, key) => {\n if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n toDelete.push(key);\n }\n });\n if (appName && appName.includes(\"&\")) {\n for (const suffix of appName.split(\"&\").slice(1)) {\n const trimmed = suffix.replace(/^\\s+/, \"\");\n if (!trimmed) continue;\n toDelete.push(suffix, ` ${trimmed}`, trimmed);\n }\n }\n for (const key of new Set(toDelete)) {\n if (key) params.delete(key);\n }\n}\nfunction normalizeVastTagUrl(raw) {\n if (!raw) return raw;\n try {\n const url = new URL(raw);\n const anValue = url.searchParams.get(\"an\");\n if (anValue !== null) {\n const orphanFragments = [];\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n orphanFragments.push(key.trim());\n }\n });\n if (orphanFragments.length > 0) {\n const reconstructed = [anValue.replace(/\\s+$/, \"\"), ...orphanFragments].filter(Boolean).join(\" & \");\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n url.searchParams.delete(key);\n }\n });\n url.searchParams.set(\"an\", reconstructed);\n return url.toString().replace(\n /([?&]an=)([^&]*)/,\n (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n );\n }\n }\n removeBrokenAppNameOrphans(url.searchParams);\n return url.toString();\n } catch {\n return raw;\n }\n}\nfunction applyVastMacros(baseUrl, ctx) {\n const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n let url;\n try {\n url = new URL(normalizeVastTagUrl(expandedUrl));\n } catch {\n return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n }\n const params = url.searchParams;\n removeBrokenAppNameOrphans(params);\n params.set(\"correlator\", ctx.correlator);\n params.set(\"scor\", ctx.streamCorrelator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n }\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n params.delete(\"ppos\");\n params.delete(\"lip\");\n if (ctx.podMinDurationMs != null) {\n params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n }\n if (ctx.podMaxDurationMs != null) {\n params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n }\n if (ctx.podMaxAds != null) {\n params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n }\n const existingUrl = params.get(\"url\") || \"\";\n if (EXAMPLE_COM_URL.test(existingUrl)) {\n params.delete(\"url\");\n params.delete(\"description_url\");\n }\n if (!ctx.isCtv && ctx.pageUrl) {\n if (isMacroPlaceholder2(params.get(\"url\"))) {\n params.set(\"url\", ctx.pageUrl);\n }\n if (isMacroPlaceholder2(params.get(\"description_url\"))) {\n params.set(\"description_url\", params.get(\"url\") || ctx.pageUrl);\n }\n }\n if (!ctx.isCtv) {\n params.delete(\"an\");\n params.delete(\"msid\");\n params.delete(\"sid\");\n }\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n applyDeviceIdentityParams(params, ctx);\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n if (ctx.programTitle) {\n params.set(\"ct_ti\", ctx.programTitle);\n }\n if (ctx.channelName) {\n params.set(\"ct_ch\", ctx.channelName);\n }\n const staleKeys = [];\n params.forEach((value, key) => {\n if (isMacroPlaceholder2(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n removeBrokenAppNameOrphans(params);\n return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n const signals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n const tasks = [];\n const tcfApi = window.__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData, success) => {\n if (settled) return;\n if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n signals.storageAllowed = tcData.gdprApplies ? tcData.purpose?.consents?.[1] === true : true;\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {\n }, tcData.listenerId);\n } catch {\n }\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n const uspApi = window.__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data, success) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n return Promise.all(tasks).then(() => signals);\n}\n\n// src/player/Scte35Parser.ts\nfunction parseCueOutDuration(value) {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match = value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) || value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const dStr = match[1];\n const d = parseFloat(dStr);\n return Number.isNaN(d) ? void 0 : d;\n }\n return void 0;\n}\nfunction parseCueOutCont(value) {\n const res = {};\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n if (slashMatch && slashMatch[1] && slashMatch[2]) {\n const elapsed = parseFloat(slashMatch[1]);\n const duration = parseFloat(slashMatch[2]);\n if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n }\n }\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return void 0;\n}\nfunction parseAttributeList(value) {\n const attrs = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match;\n while ((match = regex.exec(value)) !== null) {\n const key = match[1] ?? \"\";\n let rawVal = match[3] ?? match[4] ?? \"\";\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n}\nfunction toNumber(val) {\n if (val == null) return void 0;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? void 0 : n;\n}\nfunction isManifestBasedMarker(marker) {\n const raw = marker.raw;\n if (!raw) return false;\n if (raw.tag) {\n const tag = String(raw.tag);\n return tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-CUE-IN\") || tag.includes(\"EXT-X-DATERANGE\");\n }\n if (raw.id3) return false;\n if (raw.splice_command_type) return false;\n return false;\n}\nfunction decodeId3ValueToText(value) {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++)\n out += String.fromCharCode(value[i]);\n return out;\n } catch {\n return void 0;\n }\n}\nfunction getFragmentStartSeconds(frag) {\n const candidates = [frag?.start, frag?.startPTS];\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n }\n return void 0;\n}\nfunction parseScte35FromId3(tag) {\n const text = decodeId3ValueToText(tag.value);\n if (!text) return void 0;\n const cueOutMatch = text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) || text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = parseCueOutDuration(arg);\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...dur !== void 0 ? { durationSeconds: dur } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = parseCueOutCont(arg);\n const marker = {\n type: \"progress\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...cont?.duration !== void 0 ? { durationSeconds: cont.duration } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n if (daterangeMatch) {\n const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { id3: text, attrs }\n };\n return marker;\n }\n if (hasScteIn) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text, attrs }\n };\n return marker;\n }\n }\n if (/SCTE35-OUT/i.test(text)) {\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n if (/SCTE35-IN/i.test(text)) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n if (tag.value instanceof Uint8Array) {\n const bin = parseScte35Binary(tag.value);\n if (bin) return bin;\n }\n return void 0;\n}\nfunction normalizeFragmentPayload(payload) {\n if (payload instanceof Uint8Array) {\n return payload;\n }\n if (payload instanceof ArrayBuffer) {\n return new Uint8Array(payload);\n }\n if (ArrayBuffer.isView(payload)) {\n const view = payload;\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n }\n return void 0;\n}\nfunction detectTsPacketFormat(data) {\n const packetSizes = [188, 192, 204];\n for (const packetSize of packetSizes) {\n const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n for (let offset = 0; offset < packetSize; offset++) {\n let matchedPackets = 0;\n for (let packetStart = offset; packetStart + tsPayloadOffset < data.length && matchedPackets < 5; packetStart += packetSize) {\n if (data[packetStart + tsPayloadOffset] !== 71) {\n break;\n }\n matchedPackets++;\n }\n if (matchedPackets >= 2) {\n return { offset, packetSize, tsPayloadOffset };\n }\n }\n }\n return void 0;\n}\nfunction getPsiSectionStart(payload, payloadUnitStart) {\n if (!payloadUnitStart) {\n return void 0;\n }\n const pointerField = payload[0];\n if (pointerField == null) {\n return void 0;\n }\n const sectionStart = 1 + pointerField;\n return sectionStart < payload.length ? sectionStart : void 0;\n}\nfunction getPsiSectionLength(data, offset) {\n return ((data[offset + 1] ?? 0) & 15) << 8 | (data[offset + 2] ?? 0);\n}\nfunction parsePatSection(payload, payloadUnitStart, pmtPids) {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 8 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 0) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n const programNumber = (payload[offset] ?? 0) << 8 | (payload[offset + 1] ?? 0);\n const pid = ((payload[offset + 2] ?? 0) & 31) << 8 | (payload[offset + 3] ?? 0);\n if (programNumber !== 0) {\n pmtPids.add(pid);\n }\n }\n}\nfunction descriptorsIdentifyScte35(data, start, end) {\n let offset = start;\n while (offset + 2 <= end) {\n const tag = data[offset] ?? 0;\n const length = data[offset + 1] ?? 0;\n const descriptorStart = offset + 2;\n const descriptorEnd = descriptorStart + length;\n if (descriptorEnd > end) {\n return false;\n }\n const registration = length >= 4 ? String.fromCharCode(\n data[descriptorStart] ?? 0,\n data[descriptorStart + 1] ?? 0,\n data[descriptorStart + 2] ?? 0,\n data[descriptorStart + 3] ?? 0\n ) : \"\";\n if (tag === 138 || registration === \"CUEI\" || registration === \"SCTE\") {\n return true;\n }\n offset = descriptorEnd;\n }\n return false;\n}\nfunction parsePmtSection(payload, payloadUnitStart, tsScte35Pids) {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 12 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 2) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n const programInfoLength = ((payload[sectionStart + 10] ?? 0) & 15) << 8 | (payload[sectionStart + 11] ?? 0);\n let offset = sectionStart + 12 + programInfoLength;\n while (offset + 5 <= sectionEnd - 4) {\n const streamType = payload[offset] ?? 0;\n const elementaryPid = ((payload[offset + 1] ?? 0) & 31) << 8 | (payload[offset + 2] ?? 0);\n const esInfoLength = ((payload[offset + 3] ?? 0) & 15) << 8 | (payload[offset + 4] ?? 0);\n const descriptorStart = offset + 5;\n const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n if (streamType === 134 || streamType === 6 && descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd)) {\n tsScte35Pids.add(elementaryPid);\n }\n offset = descriptorStart + esInfoLength;\n }\n}\nfunction hasProcessedTsScte35Section(section, processedSections) {\n let checksum = 0;\n for (let i = 0; i < section.length; i++) {\n checksum = checksum * 31 + (section[i] ?? 0) >>> 0;\n }\n const key = `${section.length}:${checksum}`;\n if (processedSections.has(key)) {\n return true;\n }\n processedSections.add(key);\n if (processedSections.size > 200) {\n const firstKey = processedSections.values().next().value;\n if (firstKey) {\n processedSections.delete(firstKey);\n }\n }\n return false;\n}\nfunction addScte35SectionMarker(section, markers, processedSections) {\n if (section[0] !== 252 || hasProcessedTsScte35Section(section, processedSections)) {\n return;\n }\n const marker = parseScte35Binary(section);\n if (!marker) {\n return;\n }\n marker.raw = {\n ...typeof marker.raw === \"object\" && marker.raw ? marker.raw : {},\n source: \"ts-packet\"\n };\n markers.push(marker);\n}\nfunction appendScte35Bytes(pid, bytes, assemblers, markers, processedSections) {\n const assembler = assemblers.get(pid);\n if (!assembler) {\n return;\n }\n for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n assembler.bytes.push(bytes[i] ?? 0);\n }\n if (assembler.bytes.length >= assembler.expectedLength) {\n assemblers.delete(pid);\n addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n }\n}\nfunction collectScte35SectionsFromPayload(pid, payload, payloadUnitStart, assemblers, markers, processedSections) {\n if (payload.length === 0) {\n return;\n }\n let offset = 0;\n if (payloadUnitStart) {\n const pointerField = payload[0] ?? 0;\n const previousAssembler = assemblers.get(pid);\n if (previousAssembler && pointerField > 0) {\n appendScte35Bytes(\n pid,\n payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n assemblers,\n markers,\n processedSections\n );\n }\n assemblers.delete(pid);\n offset = 1 + pointerField;\n } else {\n appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n return;\n }\n while (offset + 3 <= payload.length) {\n const tableId = payload[offset];\n if (tableId == null || tableId === 255) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, offset);\n const totalLength = 3 + sectionLength;\n if (sectionLength <= 0 || totalLength <= 3) {\n return;\n }\n if (offset + totalLength <= payload.length) {\n addScte35SectionMarker(\n payload.subarray(offset, offset + totalLength),\n markers,\n processedSections\n );\n offset += totalLength;\n } else {\n assemblers.set(pid, {\n bytes: Array.from(payload.subarray(offset)),\n expectedLength: totalLength\n });\n return;\n }\n }\n}\nfunction parseScte35FromTsPackets(data, tsScte35Pids, pmtPids, processedSections) {\n const packetInfo = detectTsPacketFormat(data);\n if (!packetInfo) {\n return [];\n }\n const markers = [];\n const sectionAssemblers = /* @__PURE__ */ new Map();\n for (let packetStart = packetInfo.offset; packetStart + packetInfo.packetSize <= data.length; packetStart += packetInfo.packetSize) {\n const tsStart = packetStart + packetInfo.tsPayloadOffset;\n if (data[tsStart] !== 71) {\n continue;\n }\n const secondByte = data[tsStart + 1];\n const thirdByte = data[tsStart + 2];\n const fourthByte = data[tsStart + 3];\n if (secondByte == null || thirdByte == null || fourthByte == null || (secondByte & 128) !== 0) {\n continue;\n }\n const payloadUnitStart = (secondByte & 64) !== 0;\n const pid = (secondByte & 31) << 8 | thirdByte;\n const adaptationFieldControl = fourthByte >> 4 & 3;\n const hasPayload = adaptationFieldControl === 1 || adaptationFieldControl === 3;\n if (!hasPayload) {\n continue;\n }\n let payloadStart = tsStart + 4;\n if (adaptationFieldControl === 3) {\n const adaptationLength = data[payloadStart];\n if (adaptationLength == null) {\n continue;\n }\n payloadStart += 1 + adaptationLength;\n }\n const payloadEnd = Math.min(tsStart + 188, data.length);\n if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n continue;\n }\n const payload = data.subarray(payloadStart, payloadEnd);\n if (pid === 0) {\n parsePatSection(payload, payloadUnitStart, pmtPids);\n } else if (pmtPids.has(pid)) {\n parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n } else if (tsScte35Pids.has(pid)) {\n collectScte35SectionsFromPayload(\n pid,\n payload,\n payloadUnitStart,\n sectionAssemblers,\n markers,\n processedSections\n );\n }\n }\n return markers;\n}\nvar BitReader = class {\n constructor(buf) {\n this.buf = buf;\n this.bytePos = 0;\n this.bitPos = 0;\n }\n readBits(numBits) {\n let result = 0;\n while (numBits > 0) {\n if (this.bytePos >= this.buf.length) return result;\n const remainingInByte = 8 - this.bitPos;\n const toRead = Math.min(numBits, remainingInByte);\n const currentByte = this.buf[this.bytePos];\n const shift = remainingInByte - toRead;\n const mask = (1 << toRead) - 1 & 255;\n const bits = currentByte >> shift & mask;\n result = result << toRead | bits;\n this.bitPos += toRead;\n if (this.bitPos >= 8) {\n this.bitPos = 0;\n this.bytePos += 1;\n }\n numBits -= toRead;\n }\n return result >>> 0;\n }\n skipBits(n) {\n this.readBits(n);\n }\n get bytePosition() {\n return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n }\n};\nfunction readSpliceTime(r, ptsAdjustmentTicks) {\n const timeSpecifiedFlag = r.readBits(1) === 1;\n if (!timeSpecifiedFlag) {\n r.readBits(7);\n return void 0;\n }\n r.readBits(6);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const ptsTicks = (high * 4294967296 + low + ptsAdjustmentTicks) % 8589934592;\n return ptsTicks / 9e4;\n}\nfunction markerTypeFromSegmentationTypeId(segmentationTypeId) {\n switch (segmentationTypeId) {\n case 16:\n case 34:\n case 48:\n case 50:\n case 52:\n case 54:\n return \"start\";\n case 17:\n case 35:\n case 49:\n case 51:\n case 53:\n case 55:\n return \"end\";\n default:\n return void 0;\n }\n}\nfunction parseScte35SegmentationDescriptor(descriptor) {\n if (descriptor.length < 11) {\n return void 0;\n }\n const identifier = String.fromCharCode(\n descriptor[0] ?? 0,\n descriptor[1] ?? 0,\n descriptor[2] ?? 0,\n descriptor[3] ?? 0\n );\n if (identifier !== \"CUEI\") {\n return void 0;\n }\n const segmentationEventId = (descriptor[4] ?? 0) * 16777216 + ((descriptor[5] ?? 0) << 16) + ((descriptor[6] ?? 0) << 8) + (descriptor[7] ?? 0);\n const cancelIndicator = ((descriptor[8] ?? 0) & 128) !== 0;\n if (cancelIndicator) {\n return void 0;\n }\n const flags = descriptor[9] ?? 0;\n const programSegmentationFlag = (flags & 128) !== 0;\n const segmentationDurationFlag = (flags & 64) !== 0;\n let offset = 10;\n if (!programSegmentationFlag) {\n const componentCount = descriptor[offset] ?? 0;\n offset += 1 + componentCount * 6;\n if (offset > descriptor.length) {\n return void 0;\n }\n }\n let durationSeconds = void 0;\n if (segmentationDurationFlag) {\n if (offset + 5 > descriptor.length) {\n return void 0;\n }\n const durationTicks = (descriptor[offset] ?? 0) * 4294967296 + (descriptor[offset + 1] ?? 0) * 16777216 + ((descriptor[offset + 2] ?? 0) << 16) + ((descriptor[offset + 3] ?? 0) << 8) + (descriptor[offset + 4] ?? 0);\n durationSeconds = durationTicks / 9e4;\n offset += 5;\n }\n if (offset + 2 > descriptor.length) {\n return void 0;\n }\n offset += 1;\n const segmentationUpidLength = descriptor[offset] ?? 0;\n offset += 1 + segmentationUpidLength;\n if (offset >= descriptor.length) {\n return void 0;\n }\n const segmentationTypeId = descriptor[offset] ?? 0;\n const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n if (!markerType) {\n return void 0;\n }\n return {\n type: markerType,\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n segmentationEventId\n };\n}\nfunction parseScte35SegmentationDescriptors(data, offset) {\n if (offset + 2 > data.length) {\n return void 0;\n }\n const descriptorLoopLength = (data[offset] ?? 0) << 8 | (data[offset + 1] ?? 0);\n let descriptorOffset = offset + 2;\n const descriptorEnd = Math.min(\n data.length,\n descriptorOffset + descriptorLoopLength\n );\n while (descriptorOffset + 2 <= descriptorEnd) {\n const descriptorTag = data[descriptorOffset] ?? 0;\n const descriptorLength = data[descriptorOffset + 1] ?? 0;\n const descriptorDataStart = descriptorOffset + 2;\n const descriptorDataEnd = descriptorDataStart + descriptorLength;\n if (descriptorDataEnd > descriptorEnd) {\n return void 0;\n }\n if (descriptorTag === 2) {\n const descriptorMarker = parseScte35SegmentationDescriptor(\n data.subarray(descriptorDataStart, descriptorDataEnd)\n );\n if (descriptorMarker) {\n return descriptorMarker;\n }\n }\n descriptorOffset = descriptorDataEnd;\n }\n return void 0;\n}\nfunction parseScte35Binary(data) {\n const r = new BitReader(data);\n const tableId = r.readBits(8);\n if (tableId !== 252) return void 0;\n r.readBits(1);\n r.readBits(1);\n r.readBits(2);\n const sectionLength = r.readBits(12);\n if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n return void 0;\n }\n r.readBits(8);\n r.readBits(1);\n r.readBits(6);\n const ptsAdjHigh = r.readBits(1);\n const ptsAdjLow = r.readBits(32);\n const ptsAdjustmentTicks = ptsAdjHigh * 4294967296 + ptsAdjLow;\n r.readBits(8);\n r.readBits(12);\n const spliceCommandLength = r.readBits(12);\n const spliceCommandType = r.readBits(8);\n let markerType;\n let durationSeconds = void 0;\n let ptsSeconds = void 0;\n let spliceEventId = void 0;\n const commandBodyStart = r.bytePosition;\n if (spliceCommandType === 5) {\n spliceEventId = r.readBits(32);\n const cancel = r.readBits(1) === 1;\n r.readBits(7);\n if (cancel) return void 0;\n const outOfNetwork = r.readBits(1) === 1;\n const programSpliceFlag = r.readBits(1) === 1;\n const durationFlag = r.readBits(1) === 1;\n const spliceImmediateFlag = r.readBits(1) === 1;\n r.readBits(4);\n markerType = outOfNetwork ? \"start\" : \"end\";\n if (programSpliceFlag && !spliceImmediateFlag) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else if (!programSpliceFlag) {\n const componentCount = r.readBits(8);\n for (let i = 0; i < componentCount; i++) {\n r.readBits(8);\n if (!spliceImmediateFlag) {\n const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n if (ptsSeconds === void 0) {\n ptsSeconds = componentPtsSeconds;\n }\n }\n }\n }\n if (durationFlag) {\n r.readBits(6);\n r.readBits(1);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const durationTicks = high * 4294967296 + low;\n durationSeconds = durationTicks / 9e4;\n }\n r.readBits(16);\n r.readBits(8);\n r.readBits(8);\n } else if (spliceCommandType === 6) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else {\n return void 0;\n }\n const expectedDescriptorOffset = spliceCommandLength === 4095 ? r.bytePosition : commandBodyStart + spliceCommandLength;\n const descriptorMarker = parseScte35SegmentationDescriptors(\n data,\n expectedDescriptorOffset\n );\n if (descriptorMarker) {\n markerType = descriptorMarker.type;\n if (durationSeconds === void 0) {\n durationSeconds = descriptorMarker.durationSeconds;\n }\n }\n if (!markerType) {\n return void 0;\n }\n const marker = {\n type: markerType,\n ...ptsSeconds !== void 0 ? { ptsSeconds } : {},\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: {\n splice_command_type: spliceCommandType,\n ...spliceEventId !== void 0 ? { splice_event_id: spliceEventId } : {},\n ...descriptorMarker?.segmentationEventId !== void 0 ? { segmentation_event_id: descriptorMarker.segmentationEventId } : {}\n }\n };\n return marker;\n}\n\n// src/player/Scte35CueManager.ts\nvar Scte35CueManager = class {\n constructor(debug, callbacks) {\n this.pendingScte35Cues = /* @__PURE__ */ new Map();\n this.recentScte35CueKeys = /* @__PURE__ */ new Map();\n this.recentScte35CueLimit = 200;\n this.tsScte35Pids = /* @__PURE__ */ new Set();\n this.pmtPids = /* @__PURE__ */ new Set();\n this.processedTsScte35Sections = /* @__PURE__ */ new Set();\n this.debug = debug;\n this.callbacks = callbacks;\n }\n get pendingScte35CueKey() {\n return this.pendingScte35CueKeyValue;\n }\n set pendingScte35CueKey(value) {\n this.pendingScte35CueKeyValue = value;\n }\n get activeScte35BreakKey() {\n return this.activeScte35BreakKeyValue;\n }\n set activeScte35BreakKey(value) {\n this.activeScte35BreakKeyValue = value;\n }\n get scheduledScte35BreakKey() {\n return this.scheduledScte35BreakKeyValue;\n }\n set scheduledScte35BreakKey(value) {\n this.scheduledScte35BreakKeyValue = value;\n }\n createScte35CueContext(source, readiness, frag) {\n const context = { source, readiness };\n if (typeof frag?.sn === \"number\") {\n context.fragmentSn = frag.sn;\n }\n const fragmentStartSec = getFragmentStartSeconds(frag);\n if (fragmentStartSec !== void 0) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n return context;\n }\n onScte35Cue(marker, context) {\n const cue = this.createScte35Cue(marker, context);\n const pendingKey = this.getPendingScte35CueKey(cue);\n if (context.readiness === \"early\") {\n this.pendingScte35Cues.set(pendingKey, cue);\n this.trimRecentScte35CueMaps();\n if (marker.type === \"start\") {\n this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n }\n return;\n }\n if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n key: cue.key,\n activeScte35BreakKey: this.activeScte35BreakKeyValue,\n inAdBreak: this.callbacks.isInAdBreak(),\n source: cue.source\n });\n }\n return;\n }\n if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n key: cue.key,\n source: cue.source\n });\n }\n return;\n }\n this.pendingScte35Cues.delete(pendingKey);\n this.markScte35CueHandled(cue);\n this.callbacks.onPlaybackCue(marker, cue.key);\n }\n activatePendingScte35CuesForFragment(frag) {\n const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : void 0;\n if (fragmentSn === void 0) {\n return;\n }\n const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n ([, cue]) => cue.fragmentSn === fragmentSn\n );\n matchingCues.forEach(([pendingKey, cue]) => {\n this.pendingScte35Cues.delete(pendingKey);\n const context = {\n source: cue.source,\n readiness: \"playback\"\n };\n context.fragmentSn = fragmentSn;\n const fragmentStartSec = cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n if (fragmentStartSec !== void 0) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n this.onScte35Cue(cue.marker, context);\n });\n }\n createScte35Cue(marker, context) {\n const cue = {\n marker,\n source: context.source,\n readiness: context.readiness,\n key: this.getScte35CueKey(marker, context)\n };\n if (context.fragmentSn !== void 0) {\n cue.fragmentSn = context.fragmentSn;\n }\n if (context.fragmentStartSeconds !== void 0) {\n cue.fragmentStartSeconds = context.fragmentStartSeconds;\n }\n return cue;\n }\n getScte35CueKey(marker, context) {\n const raw = this.getScte35MarkerRaw(marker);\n const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n if (spliceEventId) {\n return `splice:${spliceEventId}`;\n }\n const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n if (segmentationEventId) {\n return `segmentation:${segmentationEventId}`;\n }\n const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n if (daterangeId) {\n return `daterange:${daterangeId}`;\n }\n const scteValue = this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) || this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n if (scteValue) {\n return `daterange-scte:${scteValue}`;\n }\n if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n }\n if (context.fragmentSn !== void 0) {\n return `fragment:${context.fragmentSn}`;\n }\n return `${context.source}:wallclock:${Math.floor(Date.now() / 1e3)}`;\n }\n getPendingScte35CueKey(cue) {\n return `${cue.marker.type}:${cue.key}:${cue.fragmentSn !== void 0 ? cue.fragmentSn : \"unknown\"}`;\n }\n getScte35MarkerRaw(marker) {\n return typeof marker.raw === \"object\" && marker.raw !== null ? marker.raw : {};\n }\n toIdentityString(value) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n return void 0;\n }\n isStrongScte35CueKey(key) {\n return !!(key && (key.startsWith(\"splice:\") || key.startsWith(\"segmentation:\") || key.startsWith(\"daterange:\") || key.startsWith(\"daterange-scte:\")));\n }\n hasRecentlyHandledScte35Cue(cue) {\n if (this.activeScte35BreakKeyValue === cue.key || this.scheduledScte35BreakKeyValue === cue.key) {\n return true;\n }\n const recentKey = `${cue.marker.type}:${cue.key}`;\n return this.recentScte35CueKeys.has(recentKey);\n }\n markScte35CueHandled(cue) {\n this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n this.trimRecentScte35CueMaps();\n }\n trimRecentScte35CueMaps() {\n while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n const firstKey = this.recentScte35CueKeys.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.recentScte35CueKeys.delete(firstKey);\n }\n while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n const firstKey = this.pendingScte35Cues.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.pendingScte35Cues.delete(firstKey);\n }\n }\n shouldAcceptScte35EndCue(cue) {\n if (!this.callbacks.isInAdBreak()) {\n return false;\n }\n if (this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) && this.isStrongScte35CueKey(cue.key) && this.activeScte35BreakKeyValue !== cue.key) {\n return false;\n }\n return true;\n }\n};\n\n// src/player/AdConfigManager.ts\nvar AdConfigManager = class {\n constructor(config, video) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds = /* @__PURE__ */ new Set();\n this.streamCorrelator = generateCorrelator();\n this.viewCorrelator = generateCorrelator();\n this.consentSignals = {};\n this.podCounter = 0;\n this.podAssignedByPrefetch = false;\n this.lastHeartbeatTime = 0;\n this.defaultPodMaxAds = 6;\n this.defaultPodMaxDurationMs = 12e4;\n this.config = config;\n this.video = video;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n isVmapEnabled() {\n return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n }\n async fetchAdConfiguration() {\n if (this.isVmapEnabled()) {\n await this.fetchAndParseVmap(this.config.vmapUrl);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n }\n return;\n }\n const vastMode = this.config.vastMode || \"default\";\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n }\n if (vastMode === \"adstorm\") {\n if (!this.config.licenseKey) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n );\n }\n return;\n }\n const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n this.apiVastTagUrl = vastEndpoint;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n vastEndpoint\n );\n }\n return;\n }\n if (this.config.vastTagUrl) {\n this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n return;\n }\n const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n apiUrl\n );\n }\n const headers = {};\n if (this.config.licenseKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n }\n const response = await fetch(apiUrl, { headers });\n if (!response.ok) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n );\n }\n return;\n }\n const data = await response.json();\n const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n if (imaPayload) {\n let decodedPayload = imaPayload;\n try {\n decodedPayload = decodeURIComponent(imaPayload);\n } catch {\n console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n }\n console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n } else {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n );\n }\n }\n const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n if (numberAds != null && numberAds > 0) {\n this.apiNumberAds = numberAds;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n this.apiNumberAds\n );\n }\n }\n }\n async fetchAndParseVmap(vmapUrl) {\n if (!vmapUrl.trim()) {\n return;\n }\n try {\n const response = await fetch(vmapUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch VMAP (${response.status})`);\n }\n const vmapXml = await response.text();\n this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n vmapUrl\n );\n }\n } catch (error) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n }\n }\n }\n parseVmapToBreaks(vmapXml) {\n if (typeof DOMParser === \"undefined\") {\n return [];\n }\n const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n }\n return [];\n }\n const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(\n doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n );\n }\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n (el) => el.localName === \"AdBreak\"\n );\n }\n const parsed = [];\n adBreakNodes.forEach((node, index) => {\n const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n if (startTimeMs == null) {\n return;\n }\n let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n if (!adTagNode) {\n adTagNode = node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") ?? void 0;\n }\n const adTagUrl = (adTagNode?.textContent || \"\").trim();\n if (!adTagUrl) {\n return;\n }\n const breakId = node.getAttribute(\"breakId\") || `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n parsed.push({\n id: breakId,\n startTimeMs,\n vastTagUrl: adTagUrl\n });\n });\n parsed.sort((a, b) => {\n const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n return aStart - bStart;\n });\n return parsed;\n }\n parseVmapTimeOffsetToMs(timeOffset) {\n if (!timeOffset) {\n return void 0;\n }\n const normalized = timeOffset.trim().toLowerCase();\n if (normalized === \"start\") {\n return 0;\n }\n if (normalized === \"end\") {\n return -1;\n }\n const hms = timeOffset.match(\n /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n );\n if (hms) {\n const [, hh, mm, ss, ms = \"0\"] = hms;\n const hours = Number(hh);\n const minutes = Number(mm);\n const seconds = Number(ss);\n const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n return (hours * 3600 + minutes * 60 + seconds) * 1e3 + millis;\n }\n const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percent) {\n const ratio = Number(percent[1]) / 100;\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1e3 * ratio);\n }\n return void 0;\n }\n return void 0;\n }\n getAdBreakKey(adBreak) {\n if (adBreak.id) {\n return adBreak.id;\n }\n return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n }\n resolveBreakStartMs(adBreak) {\n if (adBreak.startTimeMs >= 0) {\n return adBreak.startTimeMs;\n }\n if (adBreak.startTimeMs === -1) {\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1e3);\n }\n }\n return void 0;\n }\n findCurrentOrNextBreak(nowMs) {\n const schedule = this.vmapBreaks;\n let candidate;\n const tol = this.config.driftToleranceMs ?? 1e3;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (breakStartMs <= nowMs + tol && (candidate == null || breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))) {\n candidate = b;\n }\n }\n return candidate;\n }\n findBreakForTime(nowMs) {\n const schedule = this.vmapBreaks;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (b.durationMs) {\n const end = breakStartMs + b.durationMs;\n if (nowMs >= breakStartMs && nowMs < end) {\n return b;\n }\n continue;\n }\n if (nowMs >= breakStartMs) {\n return b;\n }\n }\n return void 0;\n }\n selectVastTagsForBreak(b) {\n if (!b || !b.vastTagUrl) return void 0;\n if (b.vastTagUrl.includes(\",\")) {\n return b.vastTagUrl.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n }\n return [b.vastTagUrl];\n }\n beginNewAdPod() {\n this.podCounter++;\n }\n resolvePodParams(breakDurationMs) {\n const maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0 ? this.config.podMaxDurationMs : this.defaultPodMaxDurationMs;\n const maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;\n const minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n return { maxAds, minDurationMs, maxDurationMs };\n }\n getPalDescriptionUrl() {\n if (!this.apiVastTagUrl) return void 0;\n try {\n const params = new URL(this.apiVastTagUrl).searchParams;\n return params.get(\"description_url\") || params.get(\"url\") || void 0;\n } catch {\n return void 0;\n }\n }\n generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {\n const adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;\n const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n const urlWithMacros = applyVastMacros(baseUrl, {\n correlator: this.viewCorrelator,\n streamCorrelator: this.streamCorrelator,\n pod: this.podCounter > 0 ? this.podCounter : void 0,\n podMaxAds: podParams.maxAds,\n podMinDurationMs: podParams.minDurationMs,\n podMaxDurationMs: podParams.maxDurationMs,\n isCtv: envSignals.isCtv,\n pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? toDevSafeUrl(window.location.href) : void 0,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n sessionId: envSignals.isCtv || this.consentSignals.storageAllowed !== false ? envSignals.sessionId : void 0,\n deviceId: envSignals.deviceId,\n deviceIdType: envSignals.deviceIdType,\n limitAdTracking: envSignals.limitAdTracking,\n deviceTypeHint: envSignals.deviceTypeHint,\n adTest: this.config.adTest,\n ...this.config.programTitle ? { programTitle: this.config.programTitle } : {},\n ...this.config.channelName ? { channelName: this.config.channelName } : {},\n consent: this.consentSignals\n });\n const finalUrl = palNonce.injectNonce(urlWithMacros);\n console.log(\n `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n finalUrl\n );\n return finalUrl;\n }\n // --- Tracking ---\n initializeTracking() {\n sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config)).then(() => {\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5e3);\n }).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n error\n );\n }\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5e3);\n });\n }\n sendHeartbeatIfNeeded() {\n const now = Date.now();\n if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 3e4) {\n this.lastHeartbeatTime = now;\n sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n error\n );\n }\n });\n }\n }\n destroyTracking() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = void 0;\n }\n }\n};\n\n// src/player/AdTimingService.ts\nvar AdTimingService = class {\n constructor(config, video, callbacks) {\n this.adRequestWatchdogToken = null;\n this.adFailsafeToken = null;\n this.ptsDriftEmaMs = 0;\n this.adBreakPlayedDurationMs = 0;\n this.adBreakEpoch = 0;\n this.adRequestTokenCounter = 0;\n this.activeAdRequestToken = null;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.totalAdRequestsInBreak = 0;\n this.maxTotalAdRequestsPerBreak = 10;\n this.lastAdRequestTime = 0;\n this.consecutiveFailures = 0;\n this.maxConsecutiveFailures = 5;\n this.minAdRequestIntervalMs = 3e3;\n this.backoffBaseMs = 1e3;\n this.maxBackoffMs = 15e3;\n this.defaultMinRemainingMsToStartAd = 4e3;\n this.failedVastUrls = /* @__PURE__ */ new Set();\n this.temporaryFailureUrls = /* @__PURE__ */ new Map();\n this.temporaryFailureCooldownMs = 3e4;\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillThreshold = 3;\n this.globalNoFillCooldownUntil = 0;\n this.globalNoFillBackoffBaseMs = 5e3;\n this.globalNoFillBackoffMaxMs = 6e4;\n this.globalLastGamRequestTime = 0;\n this.globalMinGamIntervalMs = 3e3;\n this.config = config;\n this.video = video;\n this.callbacks = callbacks;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n // --- Ad stop timer ---\n scheduleAdStopCountdown(remainingMs) {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.ensureAdStoppedByTimer();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.ensureAdStoppedByTimer();\n }, ms);\n }\n clearAdStopTimer() {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = void 0;\n }\n }\n ensureAdStoppedByTimer() {\n this.adStopTimerId = void 0;\n this.callbacks.onAdStopTimerFired();\n }\n // --- Ad start timer ---\n scheduleAdStartIn(delayMs, marker = { type: \"start\" }, cueKey) {\n this.clearAdStartTimer();\n const ms = Math.max(0, Math.floor(delayMs));\n if (ms === 0) {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n return;\n }\n this.adStartTimerId = window.setTimeout(() => {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n }, ms);\n }\n clearAdStartTimer() {\n if (this.adStartTimerId != null) {\n clearTimeout(this.adStartTimerId);\n this.adStartTimerId = void 0;\n }\n }\n // --- PTS drift ---\n updatePtsDrift(ptsSecondsSample) {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1e3;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 6e4) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n resolveScteBreakStartWallClockMs(marker) {\n const nowWallClockMs = Date.now();\n if (typeof marker.ptsSeconds !== \"number\") {\n return nowWallClockMs;\n }\n const nowMs = this.video.currentTime * 1e3;\n const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n const deltaMs = marker.ptsSeconds * 1e3 - estimatedCurrentPtsMs;\n if (!Number.isFinite(deltaMs)) {\n return nowWallClockMs;\n }\n return nowWallClockMs + Math.floor(deltaMs);\n }\n // --- Duration boundary ---\n setAdBreakDurationBoundary(durationMs) {\n this.expectedAdBreakDurationMs = durationMs;\n if (durationMs != null && this.currentAdBreakStartWallClockMs != null) {\n this.scteAdBreakEndWallClockMs = this.currentAdBreakStartWallClockMs + durationMs;\n } else {\n this.scteAdBreakEndWallClockMs = void 0;\n }\n }\n scheduleAdStopAtBreakBoundary() {\n if (this.expectedAdBreakDurationMs == null) {\n return;\n }\n this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n }\n // --- Duration budget ---\n getWallClockRemainingAdMs() {\n const endWallClockMs = this.getAdBreakEndWallClockMs();\n if (endWallClockMs != null) {\n return Math.max(0, endWallClockMs - Date.now());\n }\n return 0;\n }\n getAdBreakEndWallClockMs() {\n if (this.scteAdBreakEndWallClockMs != null) {\n return this.scteAdBreakEndWallClockMs;\n }\n if (this.expectedAdBreakDurationMs == null || this.currentAdBreakStartWallClockMs == null) {\n return void 0;\n }\n return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n }\n getDurationBudgetRemainingMs() {\n if (this.expectedAdBreakDurationMs == null) {\n return 0;\n }\n return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n }\n getLoadedAdDurationMs(adController) {\n const durationSec = adController.getLoadedAdDuration?.();\n if (durationSec == null || durationSec <= 0) {\n return 0;\n }\n return Math.round(durationSec * 1e3);\n }\n adFitsRemainingBudget(durationMs) {\n if (durationMs <= 0) {\n return true;\n }\n return durationMs <= this.getDurationBudgetRemainingMs();\n }\n logAdDurationDecision(accepted, durationMs, adController) {\n if (!this.debug) {\n return;\n }\n const remainingBudget = this.getDurationBudgetRemainingMs();\n const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n if (accepted) {\n console.log(\n `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n );\n } else {\n console.log(\n `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms \\u2014 requesting another ad`\n );\n }\n }\n recordPlayedAdDuration(adController) {\n const durationMs = this.getLoadedAdDurationMs(adController);\n if (durationMs <= 0) {\n return;\n }\n this.adBreakPlayedDurationMs += durationMs;\n if (this.debug) {\n console.log(\n `[AD-DURATION] Played ${durationMs}ms \\u2014 total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n );\n }\n }\n ensureLoadedAdFitsBudget(adController) {\n const durationMs = this.getLoadedAdDurationMs(adController);\n const fits = this.adFitsRemainingBudget(durationMs);\n this.logAdDurationDecision(fits, durationMs, adController);\n return fits;\n }\n rejectLoadedAdForDuration(adController) {\n try {\n adController.destroy();\n } catch {\n }\n }\n markAdStarted() {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n this.totalAdRequestsInBreak++;\n this.lastAdRequestTime = Date.now();\n }\n notePodAdStarted() {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n }\n getRemainingAdMs() {\n const wallClockRemaining = this.getWallClockRemainingAdMs();\n const budgetRemaining = this.getDurationBudgetRemainingMs();\n if (this.expectedAdBreakDurationMs == null) {\n return wallClockRemaining;\n }\n return Math.min(wallClockRemaining, budgetRemaining);\n }\n getMinRemainingMsToStartAd() {\n const configured = this.config.minRemainingMsToStartAd;\n if (typeof configured === \"number\" && configured >= 0) {\n return configured;\n }\n return this.defaultMinRemainingMsToStartAd;\n }\n hasTimeToStartAnotherAd() {\n const minRemaining = this.getMinRemainingMsToStartAd();\n return this.getWallClockRemainingAdMs() > minRemaining && this.getDurationBudgetRemainingMs() > minRemaining;\n }\n // --- Circuit breaker ---\n isTemporaryAdError(error) {\n const message = error?.message?.toLowerCase() || \"\";\n if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n return true;\n }\n if (message.includes(\"timeout\")) {\n return true;\n }\n if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n return true;\n }\n if (message.includes(\"ad playback error\")) {\n return true;\n }\n return false;\n }\n isUrlInCooldown(vastTagUrl) {\n const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n if (failureTime == null) {\n return false;\n }\n const elapsed = Date.now() - failureTime;\n if (elapsed >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(vastTagUrl);\n return false;\n }\n return true;\n }\n cleanupTemporaryFailures() {\n const now = Date.now();\n for (const [url, timestamp] of this.temporaryFailureUrls) {\n if (now - timestamp >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(url);\n }\n }\n }\n isGamInCooldown() {\n return Date.now() < this.globalNoFillCooldownUntil;\n }\n recordGamNoFill() {\n this.globalConsecutiveNoFills++;\n if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n const backoff = Math.min(\n this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n this.globalNoFillBackoffMaxMs\n );\n this.globalNoFillCooldownUntil = Date.now() + backoff;\n if (this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n );\n }\n }\n }\n resetGamNoFillCounter() {\n if (this.globalConsecutiveNoFills > 0 && this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n );\n }\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillCooldownUntil = 0;\n }\n async enforceGlobalRateLimit() {\n const now = Date.now();\n const elapsed = now - this.globalLastGamRequestTime;\n if (elapsed < this.globalMinGamIntervalMs) {\n const waitMs = this.globalMinGamIntervalMs - elapsed;\n if (this.debug) {\n console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n this.globalLastGamRequestTime = Date.now();\n }\n // --- Watchdog ---\n startAdRequestWatchdog(token) {\n this.clearAdRequestWatchdog();\n const timeoutMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n this.adRequestWatchdogToken = token;\n this.adRequestWatchdogId = window.setTimeout(() => {\n if (this.adRequestWatchdogToken !== token) {\n return;\n }\n this.adRequestWatchdogId = void 0;\n this.adRequestWatchdogToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n this.callbacks.onWatchdogTimeout();\n }, timeoutMs);\n this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n }\n clearAdRequestWatchdog() {\n if (this.adRequestWatchdogId != null) {\n clearTimeout(this.adRequestWatchdogId);\n this.adRequestWatchdogId = void 0;\n }\n if (this.adRequestWatchdogToken != null) {\n this.logAdState(\"ad_request_watchdog_cleared\", {\n token: this.adRequestWatchdogToken\n });\n this.adRequestWatchdogToken = null;\n }\n }\n // --- Failsafe ---\n startAdFailsafeTimer(token) {\n this.clearAdFailsafeTimer();\n const failsafeMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n this.adFailsafeToken = token;\n this.adFailsafeTimerId = window.setTimeout(() => {\n if (this.adFailsafeToken !== token) {\n return;\n }\n this.adFailsafeTimerId = void 0;\n this.adFailsafeToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n this.logAdState(\"ad_failsafe_triggered\", {\n token,\n failsafeMs,\n videoPaused: this.video.paused\n });\n this.callbacks.onFailsafeTimeout();\n }, failsafeMs);\n this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n }\n clearAdFailsafeTimer() {\n if (this.adFailsafeTimerId != null) {\n clearTimeout(this.adFailsafeTimerId);\n this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n this.adFailsafeTimerId = void 0;\n }\n this.adFailsafeToken = null;\n }\n logAdState(event, extra = {}) {\n if (!this.debug) {\n return;\n }\n const { inAdBreak, showAds, adPlaying } = this.callbacks.getAdState();\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n showAds,\n adPlaying,\n inAdBreak,\n activeAdRequestToken: this.activeAdRequestToken,\n ...extra\n });\n }\n // --- Reset for ad break end ---\n resetForBreakEnd() {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdRequestWatchdog();\n this.clearAdFailsafeTimer();\n this.activeAdRequestToken = null;\n this.expectedAdBreakDurationMs = void 0;\n this.currentAdBreakStartWallClockMs = void 0;\n this.scteAdBreakEndWallClockMs = void 0;\n this.adBreakPlayedDurationMs = 0;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.consecutiveFailures = 0;\n this.globalConsecutiveNoFills = 0;\n this.adBreakEpoch++;\n }\n destroy() {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdFailsafeTimer();\n this.clearAdRequestWatchdog();\n }\n};\n\n// src/player/PlaceholderLayer.ts\nvar PlaceholderLayer = class {\n constructor(video, debug) {\n this.video = video;\n this.debug = debug;\n }\n ensureContainer() {\n if (this.container) {\n return;\n }\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.left = \"0\";\n el.style.top = \"0\";\n el.style.right = \"0\";\n el.style.bottom = \"0\";\n el.style.display = \"none\";\n el.style.alignItems = \"center\";\n el.style.justifyContent = \"center\";\n el.style.pointerEvents = \"none\";\n el.style.zIndex = \"5\";\n el.style.backgroundColor = \"#000\";\n el.style.transition = \"opacity 0.3s ease-in-out\";\n el.style.opacity = \"0\";\n if (!this.video.parentElement) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n }\n return;\n }\n this.video.parentElement.appendChild(el);\n this.container = el;\n }\n show() {\n this.ensureContainer();\n if (!this.container) {\n return;\n }\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n }\n }\n const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n if (wasHidden) {\n this.container.style.transition = \"none\";\n } else {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n this.container.style.backgroundColor = \"#000\";\n this.container.style.display = \"flex\";\n this.container.offsetHeight;\n this.container.style.opacity = \"1\";\n this.container.style.pointerEvents = \"auto\";\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (this.container) {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n }\n }\n hide() {\n if (!this.container) {\n return;\n }\n this.container.style.opacity = \"0\";\n setTimeout(() => {\n if (this.container) {\n this.container.style.display = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.backgroundColor = \"#000\";\n }\n }, 300);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n }\n }\n destroy() {\n if (this.container) {\n if (this.container.parentElement) {\n this.container.parentElement.removeChild(this.container);\n }\n this.container = void 0;\n }\n }\n};\n\n// src/player/HlsEngine.ts\nvar import_hls2 = __toESM(require(\"hls.js\"), 1);\nvar HlsEngine = class {\n constructor(config, video, cueManager, timing, callbacks) {\n this.isLiveStream = false;\n this.nativeHlsMode = false;\n this.videoSrcProtection = null;\n this.reloadingLiveStream = false;\n this.bufferedSegmentsCount = 0;\n this.shouldAutoplayAfterBuffering = false;\n this.hasInitialBufferCompleted = false;\n this.latencyProfileApplied = false;\n this.config = config;\n this.video = video;\n this.cueManager = cueManager;\n this.timing = timing;\n this.callbacks = callbacks;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n shouldUseNativeHls(getStreamType) {\n const streamType = getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n async setupNativeHls() {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n if (this.debug) {\n const adBehavior = this.isLiveStream ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n console.log(\n \"[StormcloudVideoPlayer] Using native HLS playback:\",\n {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior\n }\n );\n }\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n setupHls() {\n this.hls = new import_hls2.default({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: 1.1,\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1e3 * 1e3,\n maxBufferHole: 1,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.2,\n nudgeMaxRetry: 5,\n startPosition: -1\n });\n this.hls.on(import_hls2.default.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n this.hls.on(import_hls2.default.Events.MANIFEST_PARSED, async (_, _data) => {\n this.isLiveStream = this.config.isLiveStream ?? (this.hls?.levels?.some(\n (level) => level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false);\n await this.callbacks.onManifestParsed(this.isLiveStream);\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n this.latencyProfileApplied = false;\n this.detectedLowLatencyStream = void 0;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n this.reloadingLiveStream = false;\n });\n this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\n this.applyStreamLatencyProfile(data?.details);\n if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n return;\n }\n const details = data?.details;\n if (!details || !details.fragments || details.fragments.length === 0) {\n return;\n }\n const fragmentsToScan = Math.min(5, details.fragments.length);\n for (let i = 0; i < fragmentsToScan; i++) {\n const frag = details.fragments[i];\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) continue;\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = tag.includes(\"EXT-X-DATERANGE\") ? parseAttributeList(value) : {};\n const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") || \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n if (hasScteOut) {\n const durationSeconds = parseCueOutDuration(value);\n const marker = {\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value, earlyDetection: true }\n };\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n }\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag)\n });\n return;\n }\n }\n }\n }\n });\n this.hls.on(import_hls2.default.Events.FRAG_BUFFERED, async (_evt, _data) => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n if (this.shouldAutoplayAfterBuffering) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n this.hls.on(import_hls2.default.Events.FRAG_PARSING_METADATA, (_evt, data) => {\n const id3Tags = (data?.samples || []).map((s) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n this.hls.on(import_hls2.default.Events.FRAG_LOADED, (_evt, data) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n getFragmentStartSeconds(data?.frag)\n );\n });\n this.hls.on(import_hls2.default.Events.FRAG_DECRYPTED, (_evt, data) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n getFragmentStartSeconds(data?.frag)\n );\n });\n this.hls.on(import_hls2.default.Events.FRAG_CHANGED, (_evt, data) => {\n const frag = data?.frag;\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) {\n this.callbacks.activatePendingCuesForFragment(frag);\n return;\n }\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = parseCueOutCont(value);\n const marker = {\n type: \"progress\",\n ...prog?.duration !== void 0 ? { durationSeconds: prog.duration } : {},\n ...prog?.elapsed !== void 0 ? { ptsSeconds: prog.elapsed } : {},\n raw: { tag, value }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = parseCueOutDuration(value);\n const marker = {\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n }\n );\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = parseAttributeList(value);\n const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker = {\n type: \"start\",\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { tag, value, attrs }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n }\n if (hasScteIn) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value, attrs } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n }\n );\n }\n }\n }\n this.callbacks.activatePendingCuesForFragment(frag);\n });\n this.hls.on(import_hls2.default.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case import_hls2.default.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case import_hls2.default.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.callbacks.onFatalDestroy();\n break;\n }\n }\n });\n this.hls.attachMedia(this.video);\n }\n isLowLatencyStream() {\n return this.detectedLowLatencyStream;\n }\n applyStreamLatencyProfile(details) {\n if (this.latencyProfileApplied || !this.hls) {\n return;\n }\n if (!details) {\n return;\n }\n if (details.live !== true) {\n this.latencyProfileApplied = true;\n this.detectedLowLatencyStream = false;\n return;\n }\n const isLowLatencyManifest = this.isLowLatencyManifest(details);\n const useLowLatency = isLowLatencyManifest && !!this.config.lowLatencyMode;\n this.detectedLowLatencyStream = useLowLatency;\n this.latencyProfileApplied = true;\n const cfg = this.hls.config;\n if (useLowLatency) {\n cfg.maxLiveSyncPlaybackRate = 1.5;\n cfg.maxBufferHole = 0.5;\n delete cfg.liveSyncDuration;\n } else {\n cfg.maxLiveSyncPlaybackRate = 1.1;\n cfg.maxBufferHole = 1;\n delete cfg.liveSyncDuration;\n cfg.liveSyncDurationCount = 3;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live latency profile: ${useLowLatency ? \"LL-HLS (low latency)\" : \"standard live (stability)\"}`,\n {\n isLowLatencyManifest,\n lowLatencyModeRequested: !!this.config.lowLatencyMode,\n canBlockReload: details.canBlockReload,\n partTarget: details.partTarget,\n partHoldBack: details.partHoldBack,\n partListLength: Array.isArray(details.partList) ? details.partList.length : 0,\n targetDuration: details.targetduration ?? details.targetDuration,\n maxLiveSyncPlaybackRate: cfg.maxLiveSyncPlaybackRate,\n maxBufferHole: cfg.maxBufferHole\n }\n );\n }\n }\n isLowLatencyManifest(details) {\n if (!details) {\n return false;\n }\n const hasParts = Array.isArray(details.partList) && details.partList.length > 0;\n const hasPartTarget = typeof details.partTarget === \"number\" && details.partTarget > 0;\n const hasPartHoldBack = typeof details.partHoldBack === \"number\" && details.partHoldBack > 0;\n const canBlockReload = details.canBlockReload === true;\n return hasParts || hasPartTarget || hasPartHoldBack || canBlockReload;\n }\n onId3Tag(tag) {\n if (typeof tag.ptsSeconds === \"number\") {\n this.timing.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = parseScte35FromId3(tag);\n if (marker) {\n this.callbacks.onScte35Cue(marker, {\n source: \"id3\",\n readiness: \"playback\"\n });\n }\n }\n processFragmentScte35Payload(payloadData, fragmentSn, fragmentStartSeconds) {\n const payload = normalizeFragmentPayload(payloadData);\n if (!payload) {\n return;\n }\n const markers = parseScte35FromTsPackets(\n payload,\n this.cueManager.tsScte35Pids,\n this.cueManager.pmtPids,\n this.cueManager.processedTsScte35Sections\n );\n markers.forEach((marker) => {\n const context = {\n source: \"ts\",\n readiness: \"early\"\n };\n if (fragmentSn !== void 0) {\n context.fragmentSn = fragmentSn;\n }\n if (fragmentStartSeconds !== void 0) {\n context.fragmentStartSeconds = fragmentStartSeconds;\n }\n this.callbacks.onScte35Cue(marker, context);\n });\n }\n getLiveSyncPosition() {\n const pos = this.hls?.liveSyncPosition;\n return typeof pos === \"number\" && Number.isFinite(pos) ? pos : void 0;\n }\n restartLoadAt(position) {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.stopLoad();\n this.hls.startLoad(position);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to restart HLS load at live edge:\", error);\n }\n }\n }\n recoverMediaError() {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.recoverMediaError();\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] recoverMediaError() failed:\", error);\n }\n }\n }\n reloadLiveStream() {\n const hls = this.hls;\n if (!hls) {\n return;\n }\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls \\u2192 reset video \\u2192 fresh setupHls)\"\n );\n }\n try {\n this.reloadingLiveStream = true;\n hls.stopLoad();\n hls.detachMedia();\n hls.destroy();\n this.hls = void 0;\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch (error) {\n console.warn(\"[StormcloudVideoPlayer] video.load() threw after src removal:\", error);\n }\n } catch (error) {\n this.reloadingLiveStream = false;\n this.hls = void 0;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to tear down during hard-reload:\", error);\n }\n return;\n }\n const recreateDelayMs = 600;\n window.setTimeout(() => {\n if (this.hls) {\n this.reloadingLiveStream = false;\n return;\n }\n try {\n this.setupHls();\n } catch (error) {\n this.reloadingLiveStream = false;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:\", error);\n }\n }\n }, recreateDelayMs);\n }\n destroy() {\n this.hls?.destroy();\n this.hls = void 0;\n }\n};\n\n// src/player/PlayerControls.ts\nfunction getAdAudioVolume(adPlayer) {\n return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\nfunction toggleMute(video, adPlayer, debug) {\n if (adPlayer.isAdPlaying()) {\n const newMutedState = !adPlayer.getOriginalMutedState();\n const restoreVolume = adPlayer.getOriginalVolume() || 1;\n adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n newMutedState\n );\n }\n } else {\n video.muted = !video.muted;\n adPlayer.updateOriginalMutedState(video.muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n }\n }\n}\nfunction toggleFullscreen(video, debug) {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container.requestFullscreen().then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n }\n resolve();\n }).catch((err) => {\n if (debug) {\n console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n }\n reject(err);\n });\n } else {\n document.exitFullscreen().then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n }\n resolve();\n }).catch((err) => {\n if (debug) {\n console.error(\n \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n err\n );\n }\n reject(err);\n });\n }\n });\n}\nfunction isMuted(video, adPlayer) {\n if (adPlayer.isAdPlaying()) {\n return adPlayer.getOriginalMutedState();\n }\n return video.muted;\n}\nfunction setMuted(video, adPlayer, muted, debug) {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying && muted === video.muted) {\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n { muted }\n );\n }\n return;\n }\n video.muted = muted;\n if (adPlaying) {\n adPlayer.updateOriginalMutedState(muted, video.volume);\n adPlayer.setAdVolume(muted ? 0 : 1);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n muted\n });\n }\n return;\n }\n adPlayer.updateOriginalMutedState(muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n }\n}\nfunction setVolume(video, adPlayer, volume, debug) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n adPlayer.setAdVolume(clampedVolume);\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n volume: clampedVolume\n });\n }\n } else {\n video.volume = clampedVolume;\n video.muted = clampedVolume === 0;\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n }\n }\n}\nfunction getVolume(video, adPlayer) {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n return adPlayer.getAdVolume();\n }\n return video.volume;\n}\nfunction isFullscreen() {\n return !!document.fullscreenElement;\n}\nfunction resizePlayer(video, adPlayer, debug) {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Resizing player\");\n }\n if (adPlayer && adPlayer.isAdPlaying()) {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n if (debug) {\n console.log(\n `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n );\n }\n adPlayer.resize(width, height);\n }\n}\n\n// src/player/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator = class {\n constructor(host, timing, adConfig, cueManager, placeholder) {\n this.inAdBreak = false;\n this.showAds = false;\n this.isShowingPlaceholder = false;\n this.adDetectSentForCurrentBreak = false;\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.adRequestQueue = [];\n this.adPodQueue = [];\n this.maxPlaceholderDurationMs = 5e3;\n this.pendingAdBreak = null;\n this.host = host;\n this.timing = timing;\n this.adConfig = adConfig;\n this.cueManager = cueManager;\n this.placeholder = placeholder;\n }\n get debug() {\n return !!this.host.config.debugAdTiming;\n }\n get analyticsContext() {\n return buildAnalyticsContext(this.host.config);\n }\n // ───────────────────────────────────────────────────────────────\n // IMA event listeners\n // ───────────────────────────────────────────────────────────────\n nextAdRequestUrl(baseVastUrl) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n const breakDurationMs = remaining > 0 ? remaining : void 0;\n return this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n attachImaEventListeners() {\n const adPlayer = this.host.getAdPlayer();\n adPlayer.on(\"pod_ad_started\", (payload) => {\n this.timing.notePodAdStarted();\n if (this.debug) {\n console.log(\n `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n );\n }\n });\n adPlayer.on(\"ad_click\", () => {\n this.host.onAdClick();\n });\n adPlayer.on(\"ad_interaction\", (event) => {\n if (event) this.host.onAdInteraction(event);\n });\n adPlayer.on(\"all_ads_completed\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n this.timing.consecutiveFailures = 0;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.inAdBreak) {\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n }\n });\n adPlayer.on(\"ad_error\", (errorPayload) => {\n let errorMessage = \"Ad playback failed\";\n if (errorPayload) {\n const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n const vastErrorCode = errorPayload.vastErrorCode;\n const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n }\n if (cause) {\n const causeMessage = typeof cause === \"string\" ? cause : cause.message || String(cause);\n errorMessage += `. Caused by: ${causeMessage}`;\n }\n }\n console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n this.handleAdFailure();\n });\n adPlayer.on(\"content_pause\", () => {\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = true;\n this.timing.resetGamNoFillCounter();\n if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n }\n }\n this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n if (this.isShowingPlaceholder) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n }\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n });\n adPlayer.on(\"content_resume\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n if (!this.host.video.muted) {\n this.host.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n }\n }\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = false;\n if (!this.inAdBreak) {\n return;\n }\n this.timing.consecutiveFailures = 0;\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n });\n }\n recreateAdController() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n }\n const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n const adPlayer = this.host.getAdPlayer();\n if (shouldShowPlaceholder && adPlayer) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n }\n this.placeholder.show();\n adPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n const preservedMutedState = adPlayer.getOriginalMutedState();\n const preservedVolumeState = adPlayer.getOriginalVolume();\n if (adPlayer) {\n try {\n adPlayer.destroy();\n this.host.video.muted = true;\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n }\n }\n }\n const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n this.host.setAdPlayer(newAdPlayer);\n newAdPlayer.initialize();\n newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n this.attachImaEventListeners();\n if (shouldShowPlaceholder) {\n this.placeholder.show();\n newAdPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n }\n clearPendingAdBreak() {\n if (this.prefetchTimerId != null) {\n clearTimeout(this.prefetchTimerId);\n this.prefetchTimerId = void 0;\n }\n this.pendingAdBreak = null;\n this.cueManager.pendingScte35CueKey = void 0;\n this.adConfig.podAssignedByPrefetch = false;\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break start\n // ───────────────────────────────────────────────────────────────\n async handleAdStart(_marker) {\n const scheduled = this.adConfig.findCurrentOrNextBreak(\n this.host.video.currentTime * 1e3\n );\n if (scheduled) {\n this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n }\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n this.clearPendingAdBreak();\n return;\n }\n const adBreakDurationMs = _marker.durationSeconds != null ? _marker.durationSeconds * 1e3 : scheduled?.durationMs;\n if (this.debug) {\n const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n console.log(\n `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n );\n }\n this.timing.failedVastUrls.clear();\n this.timing.temporaryFailureUrls.clear();\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.isShowingPlaceholder = false;\n this.timing.totalAdRequestsInBreak = 0;\n if (this.adConfig.podAssignedByPrefetch) {\n this.adConfig.podAssignedByPrefetch = false;\n } else {\n this.adConfig.beginNewAdPod();\n }\n const currentMuted = this.host.video.muted;\n const currentVolume = this.host.video.volume;\n this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n this.inAdBreak = true;\n this.timing.adBreakPlayedDurationMs = 0;\n this.timing.currentAdIndex = 0;\n this.timing.totalAdsInBreak = 0;\n this.adPodQueue = [];\n this.showAds = false;\n if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {\n this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n }\n const podPlayed = await this.startOptimizedPod(\n baseVastUrl,\n adBreakDurationMs,\n currentMuted,\n currentVolume\n );\n if (!podPlayed) {\n if (this.debug) {\n console.log(\"[POD] Initial pod request did not fill; attempting top-up pod request\");\n }\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Optimized pod (single multi-ad request)\n // ───────────────────────────────────────────────────────────────\n async startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {\n let podUrl;\n if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n podUrl = this.pendingAdBreak.vastUrls[0];\n this.clearPendingAdBreak();\n } else {\n podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n if (!podUrl) {\n return false;\n }\n this.continuousFetchingActive = false;\n this.recreateAdController();\n const adPlayer = this.host.getAdPlayer();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n await adPlayer.requestAds(podUrl);\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) {\n return true;\n }\n const podCount = adPlayer.getPodAdCount?.() ?? 1;\n if (podCount < 1) {\n return false;\n }\n if (this.debug) {\n console.log(\n podCount === 1 ? \"[POD] Response contained a single ad; playing it and enabling pod top-up\" : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n );\n }\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: podUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.startAdFailsafeTimer(requestToken);\n await adPlayer.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n return true;\n } catch (error) {\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n if (this.debug) {\n console.warn(\"[POD] Optimized pod request/play failed:\", error);\n }\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n }\n this.continuousFetchingActive = true;\n this.recreateAdController();\n return false;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Continuous fetching\n // ───────────────────────────────────────────────────────────────\n startContinuousFetching(baseVastUrl) {\n if (!this.continuousFetchingActive) {\n return;\n }\n if (this.continuousFetchLoopRunning) {\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n }\n return;\n }\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n }\n this.continuousFetchLoopRunning = true;\n this.continuousFetchLoop(baseVastUrl);\n }\n async continuousFetchLoop(baseVastUrl) {\n const epoch = this.timing.adBreakEpoch;\n while (this.continuousFetchingActive && this.inAdBreak && epoch === this.timing.adBreakEpoch) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n }\n break;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n }\n break;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n }\n break;\n }\n if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n }\n break;\n }\n const maxQueueSize = 5;\n if (this.adRequestQueue.length >= maxQueueSize) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n }\n await new Promise((resolve) => setTimeout(resolve, 1e3));\n continue;\n }\n const newAdUrl = this.nextAdRequestUrl(baseVastUrl);\n if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n continue;\n }\n if (this.debug) {\n const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n console.log(\n `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n { queuedUrls: queuedUrlsPreview }\n );\n }\n this.adRequestQueue.push(newAdUrl);\n const generationDelay = this.timing.consecutiveFailures > 0 ? Math.min(1e3 * Math.pow(2, this.timing.consecutiveFailures), 5e3) : 500;\n await new Promise((resolve) => setTimeout(resolve, generationDelay));\n }\n this.continuousFetchLoopRunning = false;\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n }\n stopContinuousFetching() {\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.placeholder.hide();\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Ad iteration\n // ───────────────────────────────────────────────────────────────\n async tryNextAvailableAdWithRateLimit() {\n if (!this.inAdBreak) {\n return;\n }\n const epoch = this.timing.adBreakEpoch;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n }\n this.handleAdPodComplete();\n return;\n }\n const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n if (timeSinceLastRequest < effectiveMinInterval) {\n const waitTime = effectiveMinInterval - timeSinceLastRequest;\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n return;\n }\n return this.tryNextAvailableAd(0);\n }\n async tryNextAvailableAd(retryCount = 0) {\n if (!this.inAdBreak) {\n return;\n }\n const remaining = this.timing.getRemainingAdMs();\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n this.timing.cleanupTemporaryFailures();\n while (this.adRequestQueue.length > 0) {\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n continue;\n }\n if (this.timing.isUrlInCooldown(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n continue;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n }\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n const maxRetries = 3;\n if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2e3) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n await this.tryNextAvailableAd(retryCount + 1);\n return;\n }\n if (!this.isShowingPlaceholder && remaining > 1e3) {\n this.showPlaceholderAndWaitForAds();\n } else {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n this.handleAdPodComplete();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Single ad playback\n // ───────────────────────────────────────────────────────────────\n async playSingleAd(vastTagUrl) {\n const adPlayer = this.host.getAdPlayer();\n if (adPlayer.isAdPlaying()) return;\n if (this.timing.failedVastUrls.has(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n throw new Error(\"VAST URL permanently failed\");\n }\n if (this.timing.isUrlInCooldown(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n throw new Error(\"VAST URL in cooldown after no-fill\");\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n throw new Error(\"Too many consecutive failures\");\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n throw new Error(\"GAM in cooldown\");\n }\n this.recreateAdController();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n const ap = this.host.getAdPlayer();\n await ap.requestAds(vastTagUrl);\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: vastTagUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) return;\n if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n this.timing.rejectLoadedAdForDuration(ap);\n this.recreateAdController();\n throw new Error(\"ad_duration_exceeds_budget\");\n }\n try {\n this.timing.startAdFailsafeTimer(requestToken);\n await ap.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n ap.setAdVolume(getAdAudioVolume(ap));\n this.timing.consecutiveFailures = 0;\n this.timing.temporaryFailureUrls.delete(vastTagUrl);\n } catch (playError) {\n if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n if (this.timing.isTemporaryAdError(playError)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n }\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw playError;\n }\n } catch (error) {\n const errorMessage = error?.message || \"\";\n if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n }\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw error;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Placeholder wait\n // ───────────────────────────────────────────────────────────────\n async showPlaceholderAndWaitForAds() {\n const remaining = this.timing.getRemainingAdMs();\n const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n this.handleAdPodComplete();\n return;\n }\n if (waitTime < 1e3) {\n this.handleAdPodComplete();\n return;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n }\n this.isShowingPlaceholder = true;\n this.host.getAdPlayer().showPlaceholder();\n const checkInterval = 300;\n const maxChecks = Math.floor(waitTime / checkInterval);\n for (let i = 0; i < maxChecks; i++) {\n await new Promise((resolve) => setTimeout(resolve, checkInterval));\n if (!this.inAdBreak) return;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n break;\n }\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n break;\n }\n while (this.adRequestQueue.length > 0) {\n if (!this.timing.hasTimeToStartAnotherAd()) break;\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n }\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n this.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break completion\n // ───────────────────────────────────────────────────────────────\n handleAdPodComplete() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n }\n this.timing.resetForBreakEnd();\n this.stopContinuousFetching();\n this.clearPendingAdBreak();\n if (this.isShowingPlaceholder) {\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n this.adRequestQueue = [];\n this.inAdBreak = false;\n this.adDetectSentForCurrentBreak = false;\n this.cueManager.activeScte35BreakKey = void 0;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.adPodQueue = [];\n this.showAds = false;\n this.host.getAdPlayer().stop().catch(() => {\n });\n const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n if (this.host.video.muted !== restoredMuted) {\n this.host.video.muted = restoredMuted;\n }\n if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n this.host.video.volume = restoredVolume;\n }\n this.host.video.style.visibility = \"visible\";\n this.host.video.style.opacity = \"1\";\n if (this.host.isLiveStream()) {\n if (this.host.requiresMediaPipelineResetAfterAds()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Live break end \\u2014 hard-reloading stream to reacquire decoder (single-decoder platform)\"\n );\n }\n this.host.reloadLiveStream();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n const liveSyncPos = this.host.getLiveSyncPosition();\n if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live break end \\u2014 snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s \\u2192 ${liveSyncPos.toFixed(2)}s`\n );\n }\n this.host.video.currentTime = liveSyncPos;\n this.host.restartHlsLoad(liveSyncPos);\n }\n this.resumeContentPlayback();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n this.resumeContentPlayback();\n }\n getBufferedAhead() {\n const video = this.host.video;\n const t = video.currentTime;\n const ranges = video.buffered;\n for (let i = 0; i < ranges.length; i++) {\n if (t >= ranges.start(i) - 0.5 && t <= ranges.end(i)) {\n return ranges.end(i) - t;\n }\n }\n return 0;\n }\n describeVideoState() {\n const v = this.host.video;\n const networkStates = [\"EMPTY\", \"IDLE\", \"LOADING\", \"NO_SOURCE\"];\n const readyStates = [\n \"HAVE_NOTHING\",\n \"HAVE_METADATA\",\n \"HAVE_CURRENT_DATA\",\n \"HAVE_FUTURE_DATA\",\n \"HAVE_ENOUGH_DATA\"\n ];\n const net = networkStates[v.networkState] ?? String(v.networkState);\n const ready = readyStates[v.readyState] ?? String(v.readyState);\n const err = v.error ? `code=${v.error.code}${v.error.message ? ` (${v.error.message})` : \"\"}` : \"none\";\n const ranges = [];\n for (let i = 0; i < v.buffered.length; i++) {\n ranges.push(`[${v.buffered.start(i).toFixed(2)}\\u2013${v.buffered.end(i).toFixed(2)}]`);\n }\n return `t=${v.currentTime.toFixed(2)}s paused=${v.paused} ended=${v.ended} seeking=${v.seeking} readyState=${ready} networkState=${net} error=${err} buffered=${ranges.length ? ranges.join(\",\") : \"none\"}`;\n }\n monitorLiveResumeStall(resumeBaseline) {\n const needsReset = this.host.requiresMediaPipelineResetAfterAds();\n const pollIntervalMs = 1e3;\n const graceMs = needsReset ? 8e3 : 5e3;\n const recoveryCooldownMs = needsReset ? 7e3 : 5e3;\n const maxRecoveries = 3;\n const maxMonitorMs = 45e3;\n const startTime = Date.now();\n let baseline = resumeBaseline;\n let recoveries = 0;\n let lastRecoveryAt = 0;\n const video = this.host.video;\n let listenersAttached = false;\n let onMediaEvent;\n const diagEvents = [\n \"loadstart\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"stalled\",\n \"suspend\",\n \"seeking\",\n \"seeked\",\n \"emptied\",\n \"error\",\n \"ended\"\n ];\n if (this.debug) {\n onMediaEvent = (e) => {\n const dt = ((Date.now() - startTime) / 1e3).toFixed(1);\n console.log(\n `[ResumeDiag] +${dt}s event=${e.type} \\u2014 ${this.describeVideoState()}`\n );\n };\n for (const name of diagEvents) {\n video.addEventListener(name, onMediaEvent);\n }\n listenersAttached = true;\n console.log(\n `[ResumeDiag] +0.0s monitor start \\u2014 ${this.describeVideoState()}`\n );\n }\n const cleanup = () => {\n if (listenersAttached && onMediaEvent) {\n for (const name of diagEvents) {\n video.removeEventListener(name, onMediaEvent);\n }\n listenersAttached = false;\n }\n };\n const poll = () => {\n if (this.inAdBreak) {\n cleanup();\n return;\n }\n const currentTime = video.currentTime;\n const advanced = currentTime > baseline + 0.5;\n const playing = !video.paused && video.readyState >= 3;\n if (advanced && playing) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live stream resumed successfully after ad break \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n const elapsed = Date.now() - startTime;\n const bufferedAhead = this.getBufferedAhead();\n const wedged = bufferedAhead < 0.5 && !advanced;\n if (elapsed >= maxMonitorMs) {\n if (this.debug && !advanced) {\n console.warn(\n `[StormcloudVideoPlayer] Live stream failed to resume after ${(maxMonitorMs / 1e3).toFixed(0)}s \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n const canRecover = wedged && elapsed >= graceMs && Date.now() - lastRecoveryAt >= recoveryCooldownMs && recoveries < maxRecoveries;\n if (canRecover) {\n recoveries++;\n lastRecoveryAt = Date.now();\n if (needsReset) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n } else if (recoveries === 1) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 calling recoverMediaError() (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.recoverMediaError();\n } else if (recoveries === 2) {\n const liveSyncPos = this.host.getLiveSyncPosition();\n const reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 restarting HLS load at ${reloadPos.toFixed(2)}s (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n if (liveSyncPos != null && liveSyncPos > currentTime) {\n video.currentTime = liveSyncPos;\n }\n this.host.restartHlsLoad(reloadPos);\n } else {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n }\n baseline = video.currentTime;\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n }\n window.setTimeout(poll, pollIntervalMs);\n };\n window.setTimeout(poll, pollIntervalMs);\n }\n resumeContentPlayback(attempt = 0) {\n const maxAttempts = 5;\n const video = this.host.video;\n if (!video.paused) {\n if (this.debug && attempt === 0) {\n console.log(\"[StormcloudVideoPlayer] Content video already playing after ads\");\n }\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Resuming content playback after ads (attempt ${attempt + 1}/${maxAttempts}, readyState=${video.readyState})`\n );\n }\n if (video.readyState < 3) {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] readyState never reached HAVE_FUTURE_DATA, forcing play()\"\n );\n }\n video.play()?.catch(() => {\n });\n return;\n }\n const onReady = () => {\n video.removeEventListener(\"canplay\", onReady);\n this.resumeContentPlayback(attempt + 1);\n };\n video.addEventListener(\"canplay\", onReady);\n const backoffMs = 500 * (attempt + 1);\n window.setTimeout(() => {\n video.removeEventListener(\"canplay\", onReady);\n if (video.paused) {\n this.resumeContentPlayback(attempt + 1);\n }\n }, backoffMs);\n return;\n }\n const playResult = video.play();\n if (playResult && typeof playResult.catch === \"function\") {\n playResult.catch((error) => {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to resume content playback after ads:\",\n error\n );\n }\n return;\n }\n const backoffMs = 250 * (attempt + 1);\n window.setTimeout(() => {\n this.resumeContentPlayback(attempt + 1);\n }, backoffMs);\n });\n }\n }\n handleAdFailure() {\n this.timing.consecutiveFailures++;\n this.timing.recordGamNoFill();\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n this.handleAdPodComplete();\n }\n }\n};\n\n// src/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer = class {\n constructor(config) {\n this.attached = false;\n this.palPlaybackStarted = false;\n initializePolyfills();\n const browserOverrides = getBrowserConfigOverrides();\n this.config = { ...browserOverrides, ...config };\n this.video = config.videoElement;\n logBrowserInfo(config.debugAdTiming);\n this.adPlayer = this.createAdPlayer(false);\n this.palNonce = createPalNonceManager();\n this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {\n onEarlyStartCue: (marker, fragmentSn, cueKey) => {\n this.startAdPrefetch(marker, fragmentSn, cueKey);\n },\n onPlaybackCue: (marker, cueKey) => {\n this.onScte35Marker(marker, cueKey);\n },\n isInAdBreak: () => this.adBreak.inAdBreak\n });\n this.adConfig = new AdConfigManager(this.config, this.video);\n this.timing = new AdTimingService(this.config, this.video, {\n onAdStopTimerFired: () => this.onAdStopTimerFired(),\n onAdStartTimerFired: (marker, cueKey) => {\n this.startScte35AdBreak(\n marker,\n cueKey,\n marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.timing.expectedAdBreakDurationMs\n );\n },\n onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n onFailsafeTimeout: () => this.adBreak.handleAdFailure(),\n getAdState: () => ({\n inAdBreak: this.adBreak.inAdBreak,\n showAds: this.adBreak.showAds,\n adPlaying: this.adPlayer.isAdPlaying()\n })\n });\n this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n this.hlsEngine = new HlsEngine(this.config, this.video, this.cueManager, this.timing, {\n onManifestParsed: async (isLive) => this.onManifestParsed(isLive),\n onScte35Cue: (marker, context) => this.cueManager.onScte35Cue(marker, context),\n activatePendingCuesForFragment: (frag) => this.cueManager.activatePendingScte35CuesForFragment(frag),\n onFatalDestroy: () => this.destroy(),\n isInAdBreak: () => this.adBreak.inAdBreak,\n hasPendingAdBreak: () => this.adBreak.pendingAdBreak !== null\n });\n this.adBreak = new AdBreakOrchestrator(\n {\n config: this.config,\n video: this.video,\n getAdPlayer: () => this.adPlayer,\n setAdPlayer: (p) => {\n this.adPlayer = p;\n },\n createAdPlayer: (c) => this.createAdPlayer(c),\n shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n isLiveStream: () => this.hlsEngine.isLiveStream,\n getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n restartHlsLoad: (position) => this.hlsEngine.restartLoadAt(position),\n reloadLiveStream: () => this.hlsEngine.reloadLiveStream(),\n recoverMediaError: () => this.hlsEngine.recoverMediaError(),\n requiresMediaPipelineResetAfterAds: () => requiresMediaPipelineResetAfterAds(),\n generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs),\n onAdClick: () => this.palNonce.sendAdClick(),\n onAdInteraction: (event) => this.palNonce.sendAdTouch(event)\n },\n this.timing,\n this.adConfig,\n this.cueManager,\n this.placeholder\n );\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n createAdPlayer(continueLiveStreamDuringAds) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n }\n return createHlsAdPlayer(this.video, {\n continueLiveStreamDuringAds,\n ...this.config.licenseKey ? { licenseKey: this.config.licenseKey } : {},\n ...this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}\n });\n }\n generatePodVastUrl(baseUrl, breakDurationMs) {\n const podParams = this.adConfig.resolvePodParams(breakDurationMs);\n return this.adConfig.generatePodVastUrl(\n baseUrl,\n podParams,\n this.adPlayer,\n this.palNonce,\n this.adBreak.inAdBreak\n );\n }\n // ───────────────────────────────────────────────────────────────\n // Lifecycle\n // ───────────────────────────────────────────────────────────────\n async load() {\n if (!this.attached) {\n this.attach();\n }\n try {\n await this.adConfig.fetchAdConfiguration();\n } catch (error) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n error\n );\n }\n }\n const palDescriptionUrl = this.config.ctvAdRequest ? this.adConfig.getPalDescriptionUrl() : void 0;\n fetchConsentSignals().catch(() => ({})).then((signals) => {\n this.adConfig.consentSignals = signals;\n const muted = this.video.muted;\n return this.palNonce.generateNonce({\n videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,\n videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,\n adWillAutoPlay: !!this.config.autoplay,\n adWillPlayMuted: muted,\n playerVolume: muted ? 0 : this.video.volume,\n continuousPlayback: this.config.lowLatencyMode ?? false,\n ...palDescriptionUrl ? { descriptionUrl: palDescriptionUrl } : {},\n ...signals.storageAllowed != null ? { allowStorage: signals.storageAllowed } : {}\n });\n }).catch(() => {\n });\n this.adConfig.initializeTracking();\n if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n await this.hlsEngine.setupNativeHls();\n const continueLiveStreamDuringAds = this.shouldContinueLiveStreamDuringAds();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Native HLS ad behavior:\", {\n isLive: this.hlsEngine.isLiveStream,\n continueLiveStreamDuringAds\n });\n }\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n this.adPlayer.initialize();\n return;\n }\n this.hlsEngine.setupHls();\n }\n async onManifestParsed(isLive) {\n if (this.hlsEngine.reloadingLiveStream) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Manifest re-parsed after hard reload \\u2014 skipping ad-player setup\");\n }\n return;\n }\n if (!this.adConfig.isVmapEnabled() && !isLive && this.adConfig.vmapBreaks.length === 0 && this.adConfig.apiVastTagUrl) {\n const prerollKey = \"synthetic-vod-preroll\";\n if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {\n this.adConfig.vmapBreaks = [\n { id: prerollKey, startTimeMs: 0, vastTagUrl: this.adConfig.apiVastTagUrl }\n ];\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Injected synthetic VOD preroll from apiVastTagUrl\"\n );\n }\n }\n }\n if (this.debug) {\n const adBehavior = this.shouldContinueLiveStreamDuringAds() ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior\n });\n }\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n this.adPlayer.initialize();\n }\n attach() {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n this.adPlayer.initialize();\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.attachImaEventListeners();\n this.video.addEventListener(\"play\", () => {\n if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n this.palPlaybackStarted = true;\n this.palNonce.sendPlaybackStart();\n }\n });\n this.endedHandler = () => {\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.onVideoEnded();\n };\n this.video.addEventListener(\"ended\", this.endedHandler);\n this.video.addEventListener(\"mousedown\", (e) => {\n this.palNonce.sendAdTouch(e);\n });\n this.video.addEventListener(\"touchstart\", (e) => {\n this.palNonce.sendAdTouch(e);\n });\n this.timeUpdateHandler = () => {\n this.onTimeUpdate(this.video.currentTime);\n };\n this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n this.emptiedHandler = () => {\n if (this.hlsEngine.nativeHlsMode && this.hlsEngine.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Video src was cleared, restoring:\",\n this.hlsEngine.videoSrcProtection\n );\n }\n const currentTime = this.video.currentTime;\n const wasPaused = this.video.paused;\n this.video.src = this.hlsEngine.videoSrcProtection;\n this.video.currentTime = currentTime;\n if (!wasPaused) {\n this.video.play().catch(() => {\n });\n }\n }\n };\n this.video.addEventListener(\"emptied\", this.emptiedHandler);\n }\n shouldContinueLiveStreamDuringAds() {\n if (this.config.pauseContentDuringAds) {\n return false;\n }\n if (this.hlsEngine.isLiveStream) {\n return true;\n }\n const duration = this.video.duration;\n if (!Number.isFinite(duration) || duration === Infinity) {\n return true;\n }\n return false;\n }\n // ───────────────────────────────────────────────────────────────\n // SCTE-35 marker orchestration\n // ───────────────────────────────────────────────────────────────\n onScte35Marker(marker, cueKey) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n type: marker.type,\n ptsSeconds: marker.ptsSeconds,\n durationSeconds: marker.durationSeconds,\n currentTime: this.video.currentTime,\n raw: marker.raw,\n hasPendingAdBreak: !!this.adBreak.pendingAdBreak\n });\n }\n if (marker.type === \"start\") {\n if (this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n const newDurationMs = marker.durationSeconds * 1e3;\n if (this.timing.expectedAdBreakDurationMs == null || newDurationMs > this.timing.expectedAdBreakDurationMs) {\n this.timing.setAdBreakDurationBoundary(newDurationMs);\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Updated ad break duration from subsequent marker: ${newDurationMs}ms, remaining: ${this.timing.getWallClockRemainingAdMs()}ms`\n );\n }\n }\n }\n return;\n }\n if (!this.adBreak.adDetectSentForCurrentBreak) {\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n });\n }\n const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n const durationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.adBreak.pendingAdBreak?.marker.durationSeconds != null ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1e3 : void 0;\n const isManifest = isManifestBasedMarker(marker);\n const forceImmediate = this.config.immediateManifestAds ?? true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n isManifestMarker: isManifest,\n forceImmediate,\n hasPts: typeof marker.ptsSeconds === \"number\",\n hasPrefetchedAds\n });\n }\n if (isManifest && forceImmediate) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Starting ad immediately (manifest-based)${hasPrefetchedAds ? \" with prefetched ads\" : \"\"}`\n );\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n } else if (typeof marker.ptsSeconds === \"number\") {\n const tol = this.config.driftToleranceMs ?? 1e3;\n const nowMs = this.video.currentTime * 1e3;\n const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n const deltaMs = Math.floor(marker.ptsSeconds * 1e3 - estCurrentPtsMs);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n nowMs,\n estCurrentPtsMs,\n markerPtsMs: marker.ptsSeconds * 1e3,\n deltaMs,\n tolerance: tol\n });\n }\n if (deltaMs > tol) {\n if (this.debug) {\n console.log(`[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`);\n }\n this.timing.expectedAdBreakDurationMs = durationMs;\n this.cueManager.scheduledScte35BreakKey = cueKey;\n this.timing.scheduleAdStartIn(deltaMs, marker, cueKey);\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (fallback)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n return;\n }\n if (marker.type === \"progress\" && this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.timing.setAdBreakDurationBoundary(marker.durationSeconds * 1e3);\n }\n this.timing.scheduleAdStopAtBreakBoundary();\n if (!this.adPlayer.isAdPlaying() && this.timing.activeAdRequestToken === null && this.adBreak.adRequestQueue.length > 0 && this.timing.hasTimeToStartAnotherAd()) {\n this.adBreak.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n if (marker.type === \"end\") {\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on SCTE end marker\");\n }\n }\n const remaining = this.timing.getRemainingAdMs();\n const adPlaying = this.adPlayer.isAdPlaying();\n const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 end marker received:\", {\n remaining,\n adPlaying,\n hasQueuedAds,\n activeAdRequest: this.timing.activeAdRequestToken !== null\n });\n }\n this.timing.scteAdBreakEndWallClockMs = Date.now();\n this.timing.clearAdStartTimer();\n this.timing.clearAdStopTimer();\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {\n });\n }\n this.adBreak.handleAdPodComplete();\n return;\n }\n }\n startScte35AdBreak(marker, cueKey, durationMs) {\n this.adBreak.inAdBreak = true;\n this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.timing.currentAdBreakStartWallClockMs = this.timing.resolveScteBreakStartWallClockMs(marker);\n this.timing.setAdBreakDurationBoundary(durationMs);\n this.adBreak.handleAdStart(marker);\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n onAdStopTimerFired() {\n if (!this.adBreak.inAdBreak) return;\n const adPlaying = this.adPlayer.isAdPlaying();\n const checkIntervalMs = Math.max(\n 250,\n Math.floor(this.config.adBreakCheckIntervalMs ?? 1e3)\n );\n const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n const maxExtensionMs = typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0 ? maxExtensionMsConfig : 0;\n const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n if (shouldExtendAdBreak) {\n this.timing.scheduleAdStopCountdown(checkIntervalMs);\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Ad break boundary reached (overrun=${overrunMs}ms) - hard-stopping ads and resuming stream`\n );\n }\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {\n });\n }\n this.adBreak.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad prefetch\n // ───────────────────────────────────────────────────────────────\n startAdPrefetch(marker, fragmentSn, cueKey) {\n if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1e3);\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n if (this.debug) console.warn(\"[StormcloudVideoPlayer] No VAST URL available for prefetch\");\n return;\n }\n this.adConfig.beginNewAdPod();\n this.adConfig.podAssignedByPrefetch = true;\n const breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;\n const generatedUrls = [this.generatePodVastUrl(baseVastUrl, breakDurationMs)];\n this.adBreak.pendingAdBreak = {\n marker,\n ...fragmentSn !== void 0 ? { detectedAtFragmentSn: fragmentSn } : {},\n vastUrls: generatedUrls,\n isFetching: false,\n fetchStartTime: Date.now()\n };\n this.cueManager.pendingScte35CueKey = cueKey;\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n if (fragmentSn !== void 0) detectPayload.detectedAtFragmentSn = fragmentSn;\n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n });\n if (this.debug) {\n console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n console.log(`[PREFETCH] Pre-generated pod request URL`);\n }\n }\n // ───────────────────────────────────────────────────────────────\n // VMAP time-based ad breaks\n // ───────────────────────────────────────────────────────────────\n onTimeUpdate(currentTimeSec) {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n const nowMs = currentTimeSec * 1e3;\n const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n if (breakToPlay) {\n void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n }\n });\n }\n }\n onVideoEnded() {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n const durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;\n const postroll = this.adConfig.vmapBreaks.find(\n (b) => b.startTimeMs === -1 && !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n );\n if (postroll) {\n void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n }\n });\n }\n }\n async handleVmapAdBreak(adBreak, nowMs) {\n const key = this.adConfig.getAdBreakKey(adBreak);\n if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n if (breakStartMs == null) return;\n const durationMs = adBreak.durationMs ?? 0;\n const endMs = breakStartMs + durationMs;\n const inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;\n if (inWindow) {\n this.adConfig.consumedVmapBreakIds.add(key);\n const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n if (!tags || tags.length === 0) return;\n const first = tags[0];\n const rest = tags.slice(1);\n this.adBreak.adPodQueue = rest;\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.showAds = true;\n this.adBreak.inAdBreak = true;\n this.timing.currentAdBreakStartWallClockMs = Date.now();\n try {\n await this.adBreak.playSingleAd(first);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n }\n this.adBreak.handleAdPodComplete();\n }\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Public API\n // ───────────────────────────────────────────────────────────────\n getCurrentAdIndex() {\n return this.timing.currentAdIndex;\n }\n getTotalAdsInBreak() {\n return this.timing.totalAdsInBreak;\n }\n getAdRemainingMs() {\n return this.timing.getRemainingAdMs();\n }\n isAdPlaying() {\n return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n }\n isShowingAds() {\n return this.adBreak.showAds;\n }\n getStreamType() {\n const url = this.config.src.toLowerCase();\n if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n return \"hls\";\n }\n return \"other\";\n }\n shouldShowNativeControls() {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n }\n isLive() {\n return this.hlsEngine.isLiveStream;\n }\n isLowLatencyStream() {\n return this.hlsEngine.isLowLatencyStream();\n }\n get videoElement() {\n return this.video;\n }\n toggleMute() {\n toggleMute(this.video, this.adPlayer, this.debug);\n }\n toggleFullscreen() {\n return toggleFullscreen(this.video, this.debug);\n }\n isMuted() {\n return isMuted(this.video, this.adPlayer);\n }\n setMuted(muted) {\n setMuted(this.video, this.adPlayer, muted, this.debug);\n }\n setVolume(volume) {\n setVolume(this.video, this.adPlayer, volume, this.debug);\n }\n getVolume() {\n return getVolume(this.video, this.adPlayer);\n }\n isFullscreen() {\n return isFullscreen();\n }\n resize() {\n resizePlayer(this.video, this.adPlayer, this.debug);\n }\n // ───────────────────────────────────────────────────────────────\n // Destroy\n // ───────────────────────────────────────────────────────────────\n destroy() {\n this.adBreak.stopContinuousFetching();\n this.timing.destroy();\n this.adBreak.clearPendingAdBreak();\n this.placeholder.destroy();\n if (this.timeUpdateHandler) {\n this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n delete this.timeUpdateHandler;\n }\n if (this.endedHandler) {\n this.video.removeEventListener(\"ended\", this.endedHandler);\n delete this.endedHandler;\n }\n if (this.emptiedHandler) {\n this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n delete this.emptiedHandler;\n }\n this.adConfig.destroyTracking();\n this.hlsEngine.destroy();\n this.adPlayer?.destroy();\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.palNonce.reset();\n this.adBreak.adRequestQueue = [];\n this.timing.consecutiveFailures = 0;\n }\n};\n\n// src/ui/StormcloudVideoPlayer.tsx\nvar import_fa = require(\"react-icons/fa\");\nvar import_jsx_runtime = require(\"react/jsx-runtime\");\nvar ExpandIcon = ({ size = 18 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"svg\",\n {\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M9 4H4v5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M20 9V4h-5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M15 20h5v-5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M4 15v5h5\" })\n ]\n }\n);\nvar CompressIcon = ({ size = 18 }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"svg\",\n {\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M4 9h5V4\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M15 4v5h5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M20 15h-5v5\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"path\", { d: \"M9 20v-5H4\" })\n ]\n }\n);\nvar CRITICAL_PROPS = [\n \"src\",\n \"allowNativeHls\",\n \"isLiveStream\",\n \"licenseKey\",\n \"isVmap\",\n \"vmapUrl\",\n \"lowLatencyMode\",\n \"driftToleranceMs\",\n \"vastMode\",\n \"ctvAdRequest\"\n];\nvar CONTROLS_HIDE_DELAY = 3e3;\nvar DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;\nvar StormcloudVideoPlayerComponent = import_react.default.memo(\n (props) => {\n const {\n src,\n autoplay,\n muted,\n lowLatencyMode,\n allowNativeHls,\n isLiveStream,\n driftToleranceMs,\n immediateManifestAds,\n debugAdTiming,\n showCustomControls,\n hideLoadingIndicator,\n onVolumeToggle,\n onFullscreenToggle,\n onControlClick,\n onReady,\n wrapperClassName,\n wrapperStyle,\n className,\n style,\n controls,\n playsInline,\n preload,\n poster,\n children,\n licenseKey,\n vastMode,\n vastTagUrl,\n isVmap,\n vmapUrl,\n minSegmentsBeforePlay,\n ctvAdRequest,\n programTitle,\n channelName,\n ...restVideoAttrs\n } = props;\n const videoRef = (0, import_react.useRef)(null);\n const playerRef = (0, import_react.useRef)(null);\n const bufferingTimeoutRef = (0, import_react.useRef)(null);\n const controlsTimerRef = (0, import_react.useRef)(null);\n const wrapperRef = (0, import_react.useRef)(null);\n const [adStatus, setAdStatus] = import_react.default.useState({ showAds: false, currentIndex: 0, totalAds: 0, remainingSeconds: 0 });\n const [shouldShowNativeControls, setShouldShowNativeControls] = import_react.default.useState(true);\n const [isMuted2, setIsMuted] = import_react.default.useState(false);\n const [isFullscreen2, setIsFullscreen] = import_react.default.useState(false);\n const [isPlaying, setIsPlaying] = import_react.default.useState(false);\n const [currentTime, setCurrentTime] = import_react.default.useState(0);\n const [duration, setDuration] = import_react.default.useState(0);\n const [volume, setVolume2] = import_react.default.useState(1);\n const [playbackRate, setPlaybackRate] = import_react.default.useState(1);\n const [showVolumeSlider, setShowVolumeSlider] = import_react.default.useState(false);\n const [showSpeedMenu, setShowSpeedMenu] = import_react.default.useState(false);\n const [isLoading, setIsLoading] = import_react.default.useState(true);\n const [isBuffering, setIsBuffering] = import_react.default.useState(false);\n const [showCenterPlay, setShowCenterPlay] = import_react.default.useState(false);\n const [showLicenseWarning, setShowLicenseWarning] = import_react.default.useState(false);\n const [controlsVisible, setControlsVisible] = import_react.default.useState(true);\n const [viewportWidth, setViewportWidth] = import_react.default.useState(\n typeof window !== \"undefined\" ? window.innerWidth : 1920\n );\n const [isPortrait, setIsPortrait] = import_react.default.useState(\n typeof window !== \"undefined\" ? window.innerHeight > window.innerWidth : false\n );\n const [playerAspectRatio, setPlayerAspectRatio] = import_react.default.useState(\n DEFAULT_PLAYER_ASPECT_RATIO\n );\n const getResponsiveScale = () => {\n if (viewportWidth < 480) return 0.7;\n if (viewportWidth < 768) return 0.8;\n if (viewportWidth < 1024) return 0.9;\n return 1;\n };\n const responsiveScale = getResponsiveScale();\n const resetControlsTimer = (0, import_react.useCallback)(() => {\n if (controlsTimerRef.current) {\n clearTimeout(controlsTimerRef.current);\n }\n setControlsVisible(true);\n controlsTimerRef.current = window.setTimeout(() => {\n if (!showVolumeSlider && !showSpeedMenu) {\n setControlsVisible(false);\n }\n }, CONTROLS_HIDE_DELAY);\n }, [showVolumeSlider, showSpeedMenu]);\n const handleWrapperMouseMove = (0, import_react.useCallback)(() => {\n resetControlsTimer();\n }, [resetControlsTimer]);\n const handleWrapperMouseLeave = (0, import_react.useCallback)(() => {\n if (!showVolumeSlider && !showSpeedMenu) {\n setControlsVisible(false);\n }\n }, [showVolumeSlider, showSpeedMenu]);\n const formatTime = (seconds) => {\n if (!isFinite(seconds)) return \"0:00:00\";\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor(seconds % 3600 / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return `${hours}:${minutes.toString().padStart(2, \"0\")}:${remainingSeconds.toString().padStart(2, \"0\")}`;\n };\n const handlePlayPause = () => {\n if (videoRef.current) {\n if (videoRef.current.paused) {\n const hasValidSource = videoRef.current.src || videoRef.current.currentSrc && videoRef.current.currentSrc !== \"\" || videoRef.current.readyState >= 1;\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n } else {\n videoRef.current.pause();\n setShowCenterPlay(true);\n }\n }\n resetControlsTimer();\n };\n const handleCenterPlayClick = () => {\n if (videoRef.current && videoRef.current.paused) {\n const hasValidSource = videoRef.current.src || videoRef.current.currentSrc && videoRef.current.currentSrc !== \"\" || videoRef.current.readyState >= 1;\n if (hasValidSource) {\n videoRef.current.play()?.catch((error) => {\n console.error(\"[StormcloudVideoPlayer] Failed to play:\", error);\n });\n setShowCenterPlay(false);\n } else {\n console.warn(\n \"[StormcloudVideoPlayer] Cannot play: video has no valid source\"\n );\n }\n }\n };\n const handleTimelineSeek = (e) => {\n if (videoRef.current && duration > 0 && isFinite(duration)) {\n const rect = e.currentTarget.getBoundingClientRect();\n const clickX = e.clientX - rect.left;\n const progress = Math.max(0, Math.min(1, clickX / rect.width));\n const newTime = progress * duration;\n if (isFinite(newTime) && newTime >= 0 && newTime <= duration) {\n videoRef.current.currentTime = newTime;\n }\n }\n resetControlsTimer();\n };\n const handleVolumeChange = (newVolume) => {\n if (playerRef.current && isFinite(newVolume)) {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n playerRef.current.setVolume(clampedVolume);\n }\n };\n const handlePlaybackRateChange = (rate) => {\n if (videoRef.current && isFinite(rate) && rate > 0) {\n videoRef.current.playbackRate = rate;\n }\n setShowSpeedMenu(false);\n };\n const isHlsStream = src?.toLowerCase().includes(\".m3u8\") || src?.toLowerCase().includes(\"/hls/\");\n const isLiveUiMode = isLiveStream === true;\n const shouldShowEnhancedControls = showCustomControls && (isHlsStream ? !isLiveUiMode : true);\n const criticalPropsKey = (0, import_react.useMemo)(() => {\n return CRITICAL_PROPS.map((prop) => `${prop}:${props[prop]}`).join(\"|\");\n }, [\n src,\n allowNativeHls,\n isLiveStream,\n licenseKey,\n isVmap,\n vmapUrl,\n lowLatencyMode,\n driftToleranceMs,\n vastMode\n ]);\n (0, import_react.useEffect)(() => {\n if (typeof window === \"undefined\") return;\n const el = videoRef.current;\n if (!el || !src) return;\n if (!licenseKey) {\n setShowLicenseWarning(true);\n setIsLoading(false);\n console.warn(\n \"StormcloudVideoPlayer: License key is required but not provided. Please set the licenseKey prop to use the player.\"\n );\n return;\n }\n setShowLicenseWarning(false);\n if (debugAdTiming) {\n console.log(\"[StormcloudUI] Initializing player, isLoading=true\");\n }\n if (playerRef.current) {\n try {\n playerRef.current.destroy();\n } catch {\n }\n playerRef.current = null;\n }\n const cfg = {\n src,\n videoElement: el\n };\n if (autoplay !== void 0) cfg.autoplay = autoplay;\n if (muted !== void 0) cfg.muted = muted;\n if (lowLatencyMode !== void 0) cfg.lowLatencyMode = lowLatencyMode;\n if (allowNativeHls !== void 0) cfg.allowNativeHls = allowNativeHls;\n if (isLiveStream !== void 0) cfg.isLiveStream = isLiveStream;\n if (driftToleranceMs !== void 0)\n cfg.driftToleranceMs = driftToleranceMs;\n if (immediateManifestAds !== void 0)\n cfg.immediateManifestAds = immediateManifestAds;\n if (debugAdTiming !== void 0) cfg.debugAdTiming = debugAdTiming;\n if (showCustomControls !== void 0)\n cfg.showCustomControls = showCustomControls;\n if (onVolumeToggle !== void 0) cfg.onVolumeToggle = onVolumeToggle;\n if (onFullscreenToggle !== void 0)\n cfg.onFullscreenToggle = onFullscreenToggle;\n if (onControlClick !== void 0) cfg.onControlClick = onControlClick;\n if (licenseKey !== void 0) cfg.licenseKey = licenseKey;\n if (vastMode !== void 0) cfg.vastMode = vastMode;\n if (vastTagUrl !== void 0) cfg.vastTagUrl = vastTagUrl;\n if (isVmap !== void 0) cfg.isVmap = isVmap;\n if (vmapUrl !== void 0) cfg.vmapUrl = vmapUrl;\n if (minSegmentsBeforePlay !== void 0)\n cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;\n if (ctvAdRequest !== void 0) cfg.ctvAdRequest = ctvAdRequest;\n if (programTitle !== void 0) cfg.programTitle = programTitle;\n if (channelName !== void 0) cfg.channelName = channelName;\n const player = new StormcloudVideoPlayer(cfg);\n playerRef.current = player;\n player.load().then(() => {\n const showNative = player.shouldShowNativeControls();\n setShouldShowNativeControls(showNative);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Player loaded successfully, waiting for video ready\"\n );\n }\n onReady?.(player);\n }).catch((error) => {\n console.error(\n \"StormcloudVideoPlayer: Failed to load player:\",\n error\n );\n setIsLoading(false);\n onReady?.(player);\n });\n return () => {\n try {\n player.destroy();\n } catch {\n }\n playerRef.current = null;\n };\n }, [criticalPropsKey]);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current) return;\n try {\n if (autoplay !== void 0 && playerRef.current.videoElement) {\n playerRef.current.videoElement.autoplay = autoplay;\n }\n if (muted !== void 0 && !playerRef.current.isShowingAds()) {\n playerRef.current.setMuted(muted);\n }\n } catch (error) {\n console.warn(\"Failed to update player properties:\", error);\n }\n }, [autoplay, muted]);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current) return;\n const checkAdStatus = () => {\n if (playerRef.current) {\n const showAdsFromMethod = playerRef.current.isShowingAds();\n const showAdsFromAttribute = videoRef.current?.dataset?.stormcloudAdPlaying === \"true\";\n const showAds = showAdsFromMethod || showAdsFromAttribute;\n const currentIndex = playerRef.current.getCurrentAdIndex();\n const totalAds = playerRef.current.getTotalAdsInBreak();\n const remainingMs = playerRef.current.getAdRemainingMs();\n const remainingSeconds = showAds ? Math.max(0, Math.ceil(remainingMs / 1e3)) : 0;\n setAdStatus((prev) => {\n if (prev.showAds !== showAds || prev.currentIndex !== currentIndex || prev.totalAds !== totalAds || prev.remainingSeconds !== remainingSeconds) {\n if (showAds && !prev.showAds) {\n setShowCenterPlay(false);\n }\n return { showAds, currentIndex, totalAds, remainingSeconds };\n }\n return prev;\n });\n }\n };\n const interval = setInterval(checkAdStatus, 50);\n return () => clearInterval(interval);\n }, []);\n (0, import_react.useEffect)(() => {\n if (typeof window === \"undefined\" || !playerRef.current) return;\n const handleResize = () => {\n if (playerRef.current && videoRef.current) {\n if (typeof playerRef.current.resize === \"function\") {\n playerRef.current.resize();\n }\n }\n setViewportWidth(window.innerWidth);\n setIsPortrait(window.innerHeight > window.innerWidth);\n };\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n (0, import_react.useEffect)(() => {\n if (!playerRef.current || !videoRef.current) return;\n const updateStates = () => {\n if (playerRef.current && videoRef.current) {\n setIsMuted(playerRef.current.isMuted());\n setIsPlaying(!videoRef.current.paused);\n const currentTimeValue = videoRef.current.currentTime;\n setCurrentTime(isFinite(currentTimeValue) ? currentTimeValue : 0);\n const durationValue = videoRef.current.duration;\n setDuration(isFinite(durationValue) ? durationValue : 0);\n const volumeValue = playerRef.current.getVolume();\n setVolume2(\n isFinite(volumeValue) ? Math.max(0, Math.min(1, volumeValue)) : 1\n );\n const rateValue = videoRef.current.playbackRate;\n setPlaybackRate(\n isFinite(rateValue) && rateValue > 0 ? rateValue : 1\n );\n }\n setIsFullscreen(\n document.fullscreenElement === wrapperRef.current\n );\n };\n const interval = setInterval(updateStates, 200);\n const handleFullscreenChange = () => {\n setIsFullscreen(\n document.fullscreenElement === wrapperRef.current\n );\n };\n document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n return () => {\n clearInterval(interval);\n document.removeEventListener(\n \"fullscreenchange\",\n handleFullscreenChange\n );\n };\n }, []);\n (0, import_react.useEffect)(() => {\n if (!videoRef.current) return;\n const handleLoadedMetadata = () => {\n const video2 = videoRef.current;\n if (video2) {\n if (video2.videoWidth > 0 && video2.videoHeight > 0) {\n setPlayerAspectRatio(video2.videoWidth / video2.videoHeight);\n }\n void video2.offsetHeight;\n }\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadedmetadata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleLoadedData = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadeddata, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleLoadStart = () => {\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: loadstart, readyState:\",\n videoRef.current?.readyState\n );\n }\n };\n const handleCanPlay = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplay, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n const handleCanPlayThrough = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: canplaythrough, readyState:\",\n videoRef.current?.readyState,\n \"- clearing loading state, isLoading=false\"\n );\n }\n };\n const handleWaiting = () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n }\n bufferingTimeoutRef.current = window.setTimeout(() => {\n setIsBuffering(true);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video buffering detected (after 300ms delay), readyState:\",\n videoRef.current?.readyState,\n \"- showing spinner, isBuffering=true\"\n );\n }\n }, 300);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: waiting, readyState:\",\n videoRef.current?.readyState,\n \"- buffering delay started (300ms)\"\n );\n }\n };\n const handlePlaying = () => {\n setIsLoading(false);\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n setIsBuffering(false);\n setShowCenterPlay(false);\n if (debugAdTiming) {\n console.log(\n \"[StormcloudUI] Video event: playing, readyState:\",\n videoRef.current?.readyState,\n \"- playback started, isLoading=false, isBuffering=false\"\n );\n }\n };\n const handlePause = () => {\n const isAdActive = playerRef.current?.isShowingAds() || videoRef.current?.dataset?.stormcloudAdPlaying === \"true\";\n if (playerRef.current && !isAdActive) {\n setShowCenterPlay(true);\n } else {\n setShowCenterPlay(false);\n }\n };\n const handleEnded = () => {\n setShowCenterPlay(true);\n };\n const video = videoRef.current;\n video.addEventListener(\"loadstart\", handleLoadStart);\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.addEventListener(\"canplay\", handleCanPlay);\n video.addEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n if (video.paused) {\n setShowCenterPlay(true);\n }\n return () => {\n if (bufferingTimeoutRef.current) {\n clearTimeout(bufferingTimeoutRef.current);\n bufferingTimeoutRef.current = null;\n }\n video.removeEventListener(\"loadstart\", handleLoadStart);\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n video.removeEventListener(\"canplay\", handleCanPlay);\n video.removeEventListener(\"canplaythrough\", handleCanPlayThrough);\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n };\n }, [debugAdTiming]);\n (0, import_react.useEffect)(() => {\n setPlayerAspectRatio(DEFAULT_PLAYER_ASPECT_RATIO);\n }, [src]);\n (0, import_react.useEffect)(() => {\n return () => {\n if (controlsTimerRef.current) {\n clearTimeout(controlsTimerRef.current);\n }\n };\n }, []);\n const progressPercent = duration > 0 ? currentTime / duration * 100 : 0;\n const VolumeIcon = isMuted2 || volume === 0 ? import_fa.FaVolumeMute : volume < 0.5 ? import_fa.FaVolumeDown : import_fa.FaVolumeUp;\n return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"style\", { children: `\n @keyframes sc-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @keyframes sc-loading-glow {\n 0%, 100% { opacity: 0.85; transform: scale(1); }\n 50% { opacity: 1; transform: scale(1.05); }\n }\n @keyframes sc-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n }\n @keyframes sc-fade-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .sc-wrapper:fullscreen,\n .sc-wrapper:has(*:fullscreen) {\n border-radius: 0 !important;\n box-shadow: none !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n z-index: 999999 !important;\n background: #000 !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n }\n .sc-ctrl-btn {\n background: none;\n border: none;\n color: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n padding: 8px;\n transition: background 0.15s ease, opacity 0.15s ease;\n opacity: 0.9;\n }\n .sc-ctrl-btn:hover {\n opacity: 1;\n background: rgba(255, 255, 255, 0.1);\n }\n .sc-ctrl-btn:active {\n opacity: 0.7;\n }\n .sc-controls-bar {\n transition: opacity 0.35s ease, transform 0.35s ease;\n }\n .sc-progress-track:hover .sc-progress-thumb {\n transform: translate(-50%, -50%) scale(1) !important;\n }\n .sc-loading-hidden .sc-loading-indicator {\n display: none !important;\n }\n ` }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n ref: wrapperRef,\n className: `sc-wrapper ${wrapperClassName || \"\"}`,\n onMouseMove: handleWrapperMouseMove,\n onMouseLeave: handleWrapperMouseLeave,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: isFullscreen2 ? \"fixed\" : \"relative\",\n top: isFullscreen2 ? 0 : void 0,\n left: isFullscreen2 ? 0 : void 0,\n overflow: \"hidden\",\n width: isFullscreen2 ? \"100vw\" : \"100%\",\n height: isFullscreen2 ? \"100vh\" : \"auto\",\n minHeight: isFullscreen2 ? \"100vh\" : \"auto\",\n aspectRatio: isFullscreen2 ? void 0 : playerAspectRatio,\n maxWidth: isFullscreen2 ? \"100vw\" : \"100%\",\n maxHeight: isFullscreen2 ? \"100vh\" : \"none\",\n zIndex: isFullscreen2 ? 999999 : void 0,\n backgroundColor: \"#000\",\n borderRadius: isFullscreen2 ? 0 : void 0,\n boxShadow: isFullscreen2 ? \"none\" : void 0,\n ...wrapperStyle\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"video\",\n {\n ref: videoRef,\n className,\n style: {\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n maxWidth: \"100%\",\n maxHeight: isFullscreen2 ? \"100%\" : \"none\",\n objectFit: isFullscreen2 ? \"cover\" : \"contain\",\n backgroundColor: \"#000\",\n aspectRatio: isFullscreen2 ? \"unset\" : void 0,\n ...style\n },\n controls: shouldShowNativeControls && controls && !showCustomControls,\n playsInline,\n preload,\n poster,\n ...restVideoAttrs,\n children\n }\n ),\n (isLoading || isBuffering) && !hideLoadingIndicator && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: \"sc-loading-indicator\",\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 20,\n width: `${Math.max(34, 38 * responsiveScale)}px`,\n height: `${Math.max(34, 38 * responsiveScale)}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n animation: \"sc-loading-glow 1.4s ease-in-out infinite\",\n filter: \"drop-shadow(0 6px 14px rgba(0, 0, 0, 0.55))\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n border: \"3px solid rgba(255, 255, 255, 0.25)\",\n borderTopColor: \"#ff0000\",\n borderRightColor: \"rgba(255, 255, 255, 0.85)\",\n animation: \"sc-spin 0.8s linear infinite\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n width: \"7px\",\n height: \"7px\",\n borderRadius: \"50%\",\n background: \"#ff0000\",\n boxShadow: \"0 0 10px rgba(255, 0, 0, 0.65)\"\n }\n }\n )\n ]\n }\n ),\n showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 25,\n background: \"rgba(220, 38, 38, 0.92)\",\n backdropFilter: \"blur(24px)\",\n color: \"white\",\n padding: \"28px 36px\",\n borderRadius: \"14px\",\n border: \"1px solid rgba(255, 255, 255, 0.15)\",\n boxShadow: \"0 24px 64px rgba(0, 0, 0, 0.5)\",\n textAlign: \"center\",\n maxWidth: \"400px\",\n margin: \"0 16px\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"div\", { style: { fontSize: \"18px\", fontWeight: \"700\", marginBottom: \"10px\", letterSpacing: \"-0.02em\" }, children: \"License Key Required\" }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\"div\", { style: { fontSize: \"13px\", lineHeight: \"1.6\", color: \"rgba(255, 255, 255, 0.85)\" }, children: [\n \"Please provide a valid license key to use the Stormcloud Video Player.\",\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"br\", {}),\n \"Contact your administrator for licensing information.\"\n ] })\n ]\n }\n ),\n adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: `${12 * responsiveScale}px`,\n left: `${12 * responsiveScale}px`,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n pointerEvents: \"none\",\n animation: \"sc-fade-in 0.3s ease\"\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n background: \"rgba(234, 179, 8, 0.95)\",\n color: \"#111\",\n padding: `${4 * responsiveScale}px ${12 * responsiveScale}px`,\n borderRadius: \"6px\",\n fontSize: `${11 * responsiveScale}px`,\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n boxShadow: \"0 2px 12px rgba(234, 179, 8, 0.35)\"\n },\n children: `Ad ${Math.max(1, adStatus.currentIndex)}`\n }\n )\n }\n ),\n showCenterPlay && !isLoading && !isBuffering && !showLicenseWarning && !adStatus.showAds && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n onClick: handleCenterPlayClick,\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n zIndex: 15,\n cursor: \"pointer\",\n background: \"rgba(0, 0, 0, 0.55)\",\n backdropFilter: \"blur(8px)\",\n borderRadius: \"50%\",\n width: `${92 * responsiveScale}px`,\n height: `${92 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"background 0.2s ease, transform 0.2s ease\",\n animation: \"sc-fade-in 0.2s ease\"\n },\n onMouseEnter: (e) => {\n e.currentTarget.style.background = \"rgba(0, 0, 0, 0.72)\";\n e.currentTarget.style.transform = \"translate(-50%, -50%) scale(1.06)\";\n },\n onMouseLeave: (e) => {\n e.currentTarget.style.background = \"rgba(0, 0, 0, 0.55)\";\n e.currentTarget.style.transform = \"translate(-50%, -50%) scale(1)\";\n },\n title: \"Play\",\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n import_fa.FaPlay,\n {\n size: Math.max(24, 32 * responsiveScale),\n color: \"white\",\n style: { marginLeft: \"4px\" }\n }\n )\n }\n ),\n shouldShowEnhancedControls && !showLicenseWarning ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: \"sc-controls-bar\",\n style: {\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n background: \"linear-gradient(0deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.35) 60%, transparent 100%)\",\n padding: `${20 * responsiveScale}px ${12 * responsiveScale}px ${8 * responsiveScale}px`,\n zIndex: 10,\n opacity: controlsVisible || adStatus.showAds ? 1 : 0,\n transform: controlsVisible || adStatus.showAds ? \"translateY(0)\" : \"translateY(6px)\",\n pointerEvents: controlsVisible || adStatus.showAds ? \"auto\" : \"none\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: \"sc-progress-track\",\n style: {\n width: \"100%\",\n height: \"3px\",\n background: \"rgba(255, 255, 255, 0.2)\",\n borderRadius: \"1.5px\",\n marginBottom: `${8 * responsiveScale}px`,\n cursor: \"pointer\",\n position: \"relative\",\n transition: \"height 0.1s ease\"\n },\n onClick: handleTimelineSeek,\n onMouseEnter: (e) => {\n e.currentTarget.style.height = \"5px\";\n },\n onMouseLeave: (e) => {\n e.currentTarget.style.height = \"3px\";\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n bottom: 0,\n background: adStatus.showAds ? \"#f5c518\" : \"#ff0000\",\n borderRadius: \"1.5px\",\n width: `${progressPercent}%`,\n transition: \"width 0.15s linear\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n className: \"sc-progress-thumb\",\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: `${progressPercent}%`,\n transform: \"translate(-50%, -50%) scale(0)\",\n width: \"13px\",\n height: \"13px\",\n background: adStatus.showAds ? \"#f5c518\" : \"#ff0000\",\n borderRadius: \"50%\",\n boxShadow: \"0 0 4px rgba(0, 0, 0, 0.3)\",\n transition: \"transform 0.1s ease, left 0.15s linear\"\n }\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n color: \"white\",\n gap: `${8 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: `${8 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: handlePlayPause,\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`\n },\n title: isPlaying ? \"Pause\" : \"Play\",\n children: isPlaying ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaPause, { size: Math.max(14, 18 * responsiveScale) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaPlay, { size: Math.max(14, 18 * responsiveScale), style: { marginLeft: \"2px\" } })\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n paddingRight: `${6 * responsiveScale}px`\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false),\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n if (playerRef.current) playerRef.current.toggleMute();\n onVolumeToggle?.();\n resetControlsTimer();\n },\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`\n },\n title: isMuted2 ? \"Unmute\" : \"Mute\",\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(VolumeIcon, { size: Math.max(14, 18 * responsiveScale) })\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n width: showVolumeSlider ? `${68 * responsiveScale}px` : \"0px\",\n overflow: \"hidden\",\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n display: \"flex\",\n alignItems: \"center\",\n paddingLeft: showVolumeSlider ? `${3 * responsiveScale}px` : \"0\",\n paddingRight: showVolumeSlider ? `${8 * responsiveScale}px` : \"0\"\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n width: `${56 * responsiveScale}px`,\n height: \"3px\",\n cursor: \"pointer\",\n borderRadius: \"1.5px\"\n },\n onMouseDown: (e) => {\n e.preventDefault();\n const el = e.currentTarget;\n const move = (ev) => {\n const r2 = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (ev.clientX - r2.left) / r2.width)));\n };\n const up = () => {\n document.removeEventListener(\"mousemove\", move);\n document.removeEventListener(\"mouseup\", up);\n };\n document.addEventListener(\"mousemove\", move);\n document.addEventListener(\"mouseup\", up);\n const r = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n },\n onClick: (e) => {\n e.stopPropagation();\n const r = e.currentTarget.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"div\", { style: { position: \"absolute\", inset: 0, background: \"rgba(255, 255, 255, 0.2)\", borderRadius: \"1.5px\" } }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n bottom: 0,\n width: `${(isMuted2 ? 0 : volume) * 100}%`,\n background: \"#fff\",\n borderRadius: \"1.5px\",\n transition: \"width 0.1s ease-out\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: `${(isMuted2 ? 0 : volume) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n width: \"12px\",\n height: \"12px\",\n background: \"#fff\",\n borderRadius: \"50%\",\n boxShadow: \"0 0 3px rgba(0, 0, 0, 0.3)\",\n transition: \"left 0.1s ease-out\"\n }\n }\n )\n ]\n }\n )\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n fontSize: `${13 * responsiveScale}px`,\n fontFamily: \"Roboto, 'Segoe UI', Arial, sans-serif\",\n color: \"rgba(255, 255, 255, 0.9)\",\n display: viewportWidth < 480 ? \"none\" : \"block\",\n fontVariantNumeric: \"tabular-nums\",\n userSelect: \"none\",\n marginLeft: `${4 * responsiveScale}px`\n },\n children: [\n formatTime(currentTime),\n \" \",\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"span\", { style: { color: \"rgba(255,255,255,0.5)\" }, children: \"/\" }),\n \" \",\n formatTime(duration)\n ]\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: `${8 * responsiveScale}px`\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\"div\", { style: { position: \"relative\", display: viewportWidth < 600 ? \"none\" : \"block\" }, children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n setShowSpeedMenu(!showSpeedMenu);\n resetControlsTimer();\n },\n style: {\n padding: `${6 * responsiveScale}px ${10 * responsiveScale}px`,\n borderRadius: `${6 * responsiveScale}px`,\n fontSize: `${13 * responsiveScale}px`,\n fontFamily: \"'SF Mono', 'Cascadia Code', monospace\",\n fontWeight: \"600\",\n minHeight: `${32 * responsiveScale}px`\n },\n title: \"Playback Speed\",\n children: [\n playbackRate,\n \"x\"\n ]\n }\n ),\n showSpeedMenu && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n bottom: \"100%\",\n right: 0,\n marginBottom: \"8px\",\n background: \"rgba(0, 0, 0, 0.8)\",\n backdropFilter: \"blur(24px)\",\n WebkitBackdropFilter: \"blur(24px)\",\n borderRadius: \"10px\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n overflow: \"hidden\",\n minWidth: \"80px\",\n boxShadow: \"0 12px 40px rgba(0, 0, 0, 0.5)\",\n animation: \"sc-fade-in 0.15s ease\"\n },\n children: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2].map((speed) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"button\",\n {\n onClick: () => handlePlaybackRateChange(speed),\n style: {\n display: \"block\",\n width: \"100%\",\n padding: `${8 * responsiveScale}px ${14 * responsiveScale}px`,\n background: playbackRate === speed ? \"rgba(255, 255, 255, 0.12)\" : \"transparent\",\n border: \"none\",\n color: playbackRate === speed ? \"#fff\" : \"rgba(255, 255, 255, 0.7)\",\n cursor: \"pointer\",\n fontSize: `${12 * responsiveScale}px`,\n fontFamily: \"'SF Mono', monospace\",\n fontWeight: playbackRate === speed ? \"700\" : \"500\",\n textAlign: \"center\",\n transition: \"background 0.15s ease, color 0.15s ease\"\n },\n onMouseEnter: (e) => {\n if (playbackRate !== speed) {\n e.target.style.background = \"rgba(255, 255, 255, 0.08)\";\n e.target.style.color = \"#fff\";\n }\n },\n onMouseLeave: (e) => {\n if (playbackRate !== speed) {\n e.target.style.background = \"transparent\";\n e.target.style.color = \"rgba(255, 255, 255, 0.7)\";\n }\n },\n children: [\n speed,\n \"x\"\n ]\n },\n speed\n ))\n }\n )\n ] }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (wrapperRef.current) {\n if (!document.fullscreenElement) {\n wrapperRef.current.requestFullscreen().catch(() => {\n });\n } else {\n document.exitFullscreen().catch(() => {\n });\n }\n }\n resetControlsTimer();\n },\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`\n },\n title: isFullscreen2 ? \"Exit Fullscreen\" : \"Enter Fullscreen\",\n children: isFullscreen2 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CompressIcon, { size: Math.max(14, 18 * responsiveScale) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ExpandIcon, { size: Math.max(14, 18 * responsiveScale) })\n }\n )\n ]\n }\n )\n ]\n }\n )\n ]\n }\n ) : showCustomControls && !showLicenseWarning && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: `${10 * responsiveScale}px`,\n left: `${10 * responsiveScale}px`,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n zIndex: 10,\n opacity: controlsVisible ? 1 : 0,\n transition: \"opacity 0.35s ease\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"50%\",\n background: \"#ff3b30\",\n animation: \"sc-pulse 1.5s ease-in-out infinite\",\n flexShrink: 0\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"span\",\n {\n style: {\n fontSize: `${12 * responsiveScale}px`,\n fontFamily: \"'SF Pro Display', 'Segoe UI', Arial, sans-serif\",\n fontWeight: 700,\n letterSpacing: \"0.08em\",\n color: \"#fff\",\n textShadow: \"0 1px 3px rgba(0,0,0,0.6)\",\n userSelect: \"none\"\n },\n children: \"LIVE\"\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n className: \"sc-controls-bar\",\n style: {\n position: \"absolute\",\n bottom: `${10 * responsiveScale}px`,\n right: `${10 * responsiveScale}px`,\n display: \"flex\",\n flexDirection: isPortrait ? \"column\" : \"row\",\n alignItems: isPortrait ? \"flex-end\" : \"center\",\n gap: `${8 * responsiveScale}px`,\n zIndex: 10,\n opacity: controlsVisible ? 1 : 0,\n transform: controlsVisible ? \"translateY(0)\" : \"translateY(4px)\",\n pointerEvents: controlsVisible ? \"auto\" : \"none\"\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n background: \"rgba(0, 0, 0, 0.6)\",\n borderRadius: `${18 * responsiveScale}px`,\n padding: \"2px\",\n paddingRight: `${8 * responsiveScale}px`\n },\n onMouseEnter: () => setShowVolumeSlider(true),\n onMouseLeave: () => setShowVolumeSlider(false),\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n if (playerRef.current) playerRef.current.toggleMute();\n onVolumeToggle?.();\n resetControlsTimer();\n },\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`\n },\n title: isMuted2 ? \"Unmute\" : \"Mute\",\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(VolumeIcon, { size: Math.max(14, 18 * responsiveScale) })\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n width: showVolumeSlider ? `${68 * responsiveScale}px` : \"0px\",\n overflow: \"hidden\",\n transition: \"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)\",\n display: \"flex\",\n alignItems: \"center\",\n paddingLeft: showVolumeSlider ? `${3 * responsiveScale}px` : \"0\",\n paddingRight: showVolumeSlider ? `${10 * responsiveScale}px` : \"0\"\n },\n children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(\n \"div\",\n {\n style: {\n position: \"relative\",\n width: `${56 * responsiveScale}px`,\n height: \"3px\",\n cursor: \"pointer\",\n borderRadius: \"1.5px\"\n },\n onMouseDown: (e) => {\n e.preventDefault();\n const el = e.currentTarget;\n const move = (ev) => {\n const r2 = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (ev.clientX - r2.left) / r2.width)));\n };\n const up = () => {\n document.removeEventListener(\"mousemove\", move);\n document.removeEventListener(\"mouseup\", up);\n };\n document.addEventListener(\"mousemove\", move);\n document.addEventListener(\"mouseup\", up);\n const r = el.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n },\n onClick: (e) => {\n e.stopPropagation();\n const r = e.currentTarget.getBoundingClientRect();\n handleVolumeChange(Math.max(0, Math.min(1, (e.clientX - r.left) / r.width)));\n },\n children: [\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\"div\", { style: { position: \"absolute\", inset: 0, background: \"rgba(255, 255, 255, 0.2)\", borderRadius: \"1.5px\" } }),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n bottom: 0,\n width: `${(isMuted2 ? 0 : volume) * 100}%`,\n background: \"#fff\",\n borderRadius: \"1.5px\",\n transition: \"width 0.1s ease-out\"\n }\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"50%\",\n left: `${(isMuted2 ? 0 : volume) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n width: \"12px\",\n height: \"12px\",\n background: \"#fff\",\n borderRadius: \"50%\",\n boxShadow: \"0 0 3px rgba(0, 0, 0, 0.3)\",\n transition: \"left 0.1s ease-out\"\n }\n }\n )\n ]\n }\n )\n }\n )\n ]\n }\n ),\n /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"button\",\n {\n className: \"sc-ctrl-btn\",\n onClick: () => {\n if (onFullscreenToggle) {\n onFullscreenToggle();\n } else if (wrapperRef.current) {\n if (!document.fullscreenElement) {\n wrapperRef.current.requestFullscreen().catch(() => {\n });\n } else {\n document.exitFullscreen().catch(() => {\n });\n }\n }\n resetControlsTimer();\n },\n style: {\n padding: `${8 * responsiveScale}px`,\n borderRadius: \"50%\",\n minWidth: `${36 * responsiveScale}px`,\n minHeight: `${36 * responsiveScale}px`,\n background: \"rgba(0, 0, 0, 0.6)\"\n },\n title: isFullscreen2 ? \"Exit Fullscreen\" : \"Enter Fullscreen\",\n children: isFullscreen2 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CompressIcon, { size: Math.max(14, 18 * responsiveScale) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ExpandIcon, { size: Math.max(14, 18 * responsiveScale) })\n }\n )\n ]\n }\n )\n ] }),\n onControlClick && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(\n \"div\",\n {\n onClick: onControlClick,\n style: {\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1,\n cursor: \"pointer\"\n }\n }\n )\n ]\n }\n )\n ] });\n },\n (prevProps, nextProps) => {\n for (const prop of CRITICAL_PROPS) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n const uiProps = [\n \"autoplay\",\n \"muted\",\n \"controls\",\n \"showCustomControls\",\n \"className\",\n \"style\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"playsInline\",\n \"preload\",\n \"poster\",\n \"children\"\n ];\n for (const prop of uiProps) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n const callbackProps = [\n \"onReady\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\"\n ];\n for (const prop of callbackProps) {\n if (prevProps[prop] !== nextProps[prop]) {\n return false;\n }\n }\n return true;\n }\n);\n\n// src/StormcloudPlayer.tsx\nvar import_react6 = __toESM(require(\"react\"), 1);\n\n// src/props.ts\nvar noop = () => {\n};\nvar defaultProps = {\n playing: false,\n loop: false,\n controls: true,\n volume: 1,\n muted: false,\n playbackRate: 1,\n width: \"100%\",\n height: \"auto\",\n style: {},\n progressInterval: 1e3,\n playsInline: false,\n autoplay: false,\n preload: \"metadata\",\n poster: \"\",\n className: \"\",\n wrapperClassName: \"\",\n wrapperStyle: {},\n allowNativeHls: false,\n lowLatencyMode: false,\n driftToleranceMs: 1e3,\n immediateManifestAds: true,\n debugAdTiming: false,\n showCustomControls: false,\n hideLoadingIndicator: false,\n licenseKey: \"\",\n isVmap: false,\n vmapUrl: \"\",\n adFailsafeTimeoutMs: 1e4,\n minSegmentsBeforePlay: 2,\n onStart: noop,\n onPlay: noop,\n onPause: noop,\n onBuffer: noop,\n onBufferEnd: noop,\n onEnded: noop,\n onError: noop,\n onDuration: noop,\n onSeek: noop,\n onProgress: noop,\n onVolumeToggle: noop,\n onFullscreenToggle: noop,\n onControlClick: noop\n};\n\n// src/utils.ts\nvar import_react2 = require(\"react\");\nvar lazy = import_react2.lazy;\nvar omit = (object, keys) => {\n const result = { ...object };\n keys.forEach((key) => {\n delete result[key];\n });\n return result;\n};\nvar isMediaStream = (url) => {\n return typeof window !== \"undefined\" && window.MediaStream && url instanceof window.MediaStream;\n};\nvar supportsWebKitPresentationMode = () => {\n if (typeof window === \"undefined\") return false;\n const video = document.createElement(\"video\");\n return \"webkitSupportsPresentationMode\" in video;\n};\nvar randomString = () => {\n return Math.random().toString(36).substr(2, 9);\n};\nvar parseQuery = (url) => {\n const query = {};\n const queryString = url.split(\"?\")[1] || \"\";\n if (!queryString) return query;\n const manualParse = (qs) => {\n qs.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n try {\n query[decodeURIComponent(key)] = value ? decodeURIComponent(value.replace(/\\+/g, \" \")) : \"\";\n } catch (e) {\n query[key] = value || \"\";\n }\n }\n });\n };\n if (typeof URLSearchParams !== \"undefined\") {\n try {\n const params = new URLSearchParams(queryString);\n params.forEach((value, key) => {\n query[key] = value;\n });\n return query;\n } catch (e) {\n manualParse(queryString);\n }\n } else {\n manualParse(queryString);\n }\n return query;\n};\nvar merge = (target, ...sources) => {\n if (!sources.length) return target;\n const source = sources.shift();\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) Object.assign(target, { [key]: {} });\n merge(target[key], source[key]);\n } else {\n Object.assign(target, { [key]: source[key] });\n }\n }\n }\n return merge(target, ...sources);\n};\nvar isObject = (item) => {\n return item && typeof item === \"object\" && !Array.isArray(item);\n};\nvar IS_BROWSER = typeof window !== \"undefined\" && window.document;\nvar IS_GLOBAL = typeof globalThis !== \"undefined\" && globalThis.window && globalThis.window.document;\nvar IS_IOS = IS_BROWSER && /iPad|iPhone|iPod/.test(navigator.userAgent);\nvar IS_SAFARI = IS_BROWSER && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\nvar SUPPORTS_HLS = () => {\n if (!IS_BROWSER) return false;\n const video = document.createElement(\"video\");\n return Boolean(video.canPlayType(\"application/vnd.apple.mpegurl\"));\n};\nvar SUPPORTS_DASH = () => {\n if (!IS_BROWSER) return false;\n const video = document.createElement(\"video\");\n return Boolean(video.canPlayType(\"application/dash+xml\"));\n};\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n hls: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n },\n dash: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return DASH_EXTENSIONS.test(url);\n },\n video: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url);\n },\n audio: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return AUDIO_EXTENSIONS.test(url);\n },\n file: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n }\n};\n\n// src/players/HlsPlayer.tsx\nvar import_react3 = require(\"react\");\nvar HlsPlayer = class extends import_react3.Component {\n constructor() {\n super(...arguments);\n this.player = null;\n this.mounted = false;\n this.load = async () => {\n if (!this.props.videoElement || !this.props.src) return;\n try {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n const config = {\n src: this.props.src,\n videoElement: this.props.videoElement\n };\n if (this.props.autoplay !== void 0)\n config.autoplay = this.props.autoplay;\n if (this.props.muted !== void 0) config.muted = this.props.muted;\n if (this.props.lowLatencyMode !== void 0)\n config.lowLatencyMode = this.props.lowLatencyMode;\n if (this.props.allowNativeHls !== void 0)\n config.allowNativeHls = this.props.allowNativeHls;\n if (this.props.isLiveStream !== void 0)\n config.isLiveStream = this.props.isLiveStream;\n if (this.props.driftToleranceMs !== void 0)\n config.driftToleranceMs = this.props.driftToleranceMs;\n if (this.props.immediateManifestAds !== void 0)\n config.immediateManifestAds = this.props.immediateManifestAds;\n if (this.props.debugAdTiming !== void 0)\n config.debugAdTiming = this.props.debugAdTiming;\n if (this.props.showCustomControls !== void 0)\n config.showCustomControls = this.props.showCustomControls;\n if (this.props.onVolumeToggle !== void 0)\n config.onVolumeToggle = this.props.onVolumeToggle;\n if (this.props.onFullscreenToggle !== void 0)\n config.onFullscreenToggle = this.props.onFullscreenToggle;\n if (this.props.onControlClick !== void 0)\n config.onControlClick = this.props.onControlClick;\n if (this.props.licenseKey !== void 0)\n config.licenseKey = this.props.licenseKey;\n if (this.props.adFailsafeTimeoutMs !== void 0)\n config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n if (this.props.minSegmentsBeforePlay !== void 0)\n config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n if (this.props.ctvAdRequest !== void 0)\n config.ctvAdRequest = this.props.ctvAdRequest;\n this.player = new StormcloudVideoPlayer(config);\n this.props.onMount?.(this);\n await this.player.load();\n if (this.mounted) {\n this.props.onReady?.();\n }\n } catch (error) {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n }\n };\n this.play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[HlsPlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n this.props.onPlay?.();\n } else {\n console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n }\n }\n };\n this.pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n this.props.onPause?.();\n }\n };\n this.stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n this.seekTo = (seconds, keepPlaying) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n this.setVolume = (volume) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n this.mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n this.unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n this.setPlaybackRate = (rate) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n this.getDuration = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n this.getCurrentTime = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n this.getSecondsLoaded = () => {\n if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (key === \"player\") return this.player;\n if (key === \"video\") return this.props.videoElement;\n if (key === \"hls\" && this.player) return this.player.hls;\n return null;\n };\n }\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n componentWillUnmount() {\n this.mounted = false;\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n }\n componentDidUpdate(prevProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n render() {\n return null;\n }\n};\nHlsPlayer.displayName = \"HlsPlayer\";\nHlsPlayer.canPlay = canPlay.hls;\n\n// src/players/FilePlayer.tsx\nvar import_react4 = require(\"react\");\nvar FilePlayer = class extends import_react4.Component {\n constructor() {\n super(...arguments);\n this.mounted = false;\n this.ready = false;\n this.load = () => {\n if (!this.props.videoElement || !this.props.src) return;\n const video = this.props.videoElement;\n const handleLoadedMetadata = () => {\n if (this.mounted && !this.ready) {\n this.ready = true;\n this.props.onReady?.();\n }\n };\n const handlePlay = () => {\n if (this.mounted) {\n this.props.onPlay?.();\n }\n };\n const handlePause = () => {\n if (this.mounted) {\n this.props.onPause?.();\n }\n };\n const handleEnded = () => {\n if (this.mounted) {\n this.props.onEnded?.();\n }\n };\n const handleError = (error) => {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n };\n const handleLoadedData = () => {\n if (this.mounted) {\n this.props.onLoaded?.();\n }\n };\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.src = this.props.src;\n if (this.props.autoplay !== void 0) video.autoplay = this.props.autoplay;\n if (this.props.muted !== void 0) video.muted = this.props.muted;\n if (this.props.loop !== void 0) video.loop = this.props.loop;\n if (this.props.controls !== void 0) video.controls = this.props.controls;\n if (this.props.playsInline !== void 0)\n video.playsInline = this.props.playsInline;\n if (this.props.preload !== void 0)\n video.preload = this.props.preload;\n if (this.props.poster !== void 0) video.poster = this.props.poster;\n this.props.onMount?.(this);\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n };\n };\n this.play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[FilePlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n } else {\n console.warn(\"[FilePlayer] Cannot play: video has no valid source\");\n }\n }\n };\n this.pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n }\n };\n this.stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n this.seekTo = (seconds, keepPlaying) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n this.setVolume = (volume) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n this.mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n this.unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n this.setPlaybackRate = (rate) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n this.setLoop = (loop) => {\n if (this.props.videoElement) {\n this.props.videoElement.loop = loop;\n }\n };\n this.getDuration = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n this.getCurrentTime = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n this.getSecondsLoaded = () => {\n if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (key === \"video\") return this.props.videoElement;\n return null;\n };\n this.enablePIP = async () => {\n if (this.props.videoElement && \"requestPictureInPicture\" in this.props.videoElement) {\n try {\n await this.props.videoElement.requestPictureInPicture();\n } catch (error) {\n console.warn(\"Picture-in-Picture failed:\", error);\n }\n }\n };\n this.disablePIP = async () => {\n if (document.pictureInPictureElement) {\n try {\n await document.exitPictureInPicture();\n } catch (error) {\n console.warn(\"Exit Picture-in-Picture failed:\", error);\n }\n }\n };\n }\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n componentWillUnmount() {\n this.mounted = false;\n }\n componentDidUpdate(prevProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n render() {\n return null;\n }\n};\nFilePlayer.displayName = \"FilePlayer\";\nFilePlayer.canPlay = canPlay.file;\n\n// src/players/index.ts\nvar players = [\n {\n key: \"hls\",\n name: \"HLS Player\",\n canPlay: canPlay.hls,\n lazyPlayer: lazy(() => Promise.resolve({ default: HlsPlayer }))\n },\n {\n key: \"file\",\n name: \"File Player\",\n canPlay: canPlay.file,\n canEnablePIP: (url) => {\n return canPlay.file(url) && (document.pictureInPictureEnabled || typeof document.webkitSupportsPresentationMode === \"function\");\n },\n lazyPlayer: lazy(() => Promise.resolve({ default: FilePlayer }))\n }\n];\nvar players_default = players;\n\n// src/Player.tsx\nvar import_react5 = __toESM(require(\"react\"), 1);\nvar SEEK_ON_PLAY_EXPIRY = 5e3;\nvar Player = class extends import_react5.Component {\n constructor() {\n super(...arguments);\n this.mounted = false;\n this.isReady = false;\n this.isPlaying = false;\n this.isLoading = true;\n this.loadOnReady = null;\n this.startOnPlay = true;\n this.seekOnPlay = null;\n this.onDurationCalled = false;\n this.handlePlayerMount = (player) => {\n if (this.player) {\n this.progress();\n return;\n }\n this.player = player;\n this.player.load(this.props.src);\n this.progress();\n };\n this.getInternalPlayer = (key) => {\n if (!this.player) return null;\n return this.player.getInternalPlayer(key);\n };\n this.progress = () => {\n if (this.props.src && this.player && this.isReady) {\n const playedSeconds = this.getCurrentTime() || 0;\n const loadedSeconds = this.getSecondsLoaded();\n const duration = this.getDuration();\n if (duration) {\n const progress = {\n playedSeconds,\n played: playedSeconds / duration,\n loaded: 0,\n loadedSeconds: 0\n };\n if (loadedSeconds !== null) {\n progress.loadedSeconds = loadedSeconds;\n progress.loaded = loadedSeconds / duration;\n }\n if (progress.playedSeconds !== this.prevPlayed || progress.loadedSeconds !== this.prevLoaded) {\n this.props.onProgress?.(progress);\n }\n this.prevPlayed = progress.playedSeconds;\n this.prevLoaded = progress.loadedSeconds;\n }\n }\n this.progressTimeout = window.setTimeout(\n this.progress,\n this.props.progressInterval || 1e3\n );\n };\n this.handleReady = () => {\n if (!this.mounted) return;\n this.isReady = true;\n this.isLoading = false;\n const { onReady, playing, volume, muted } = this.props;\n onReady();\n if (!muted && volume !== null) {\n this.player.setVolume(volume);\n }\n if (this.loadOnReady) {\n this.player.load(this.loadOnReady, true);\n this.loadOnReady = null;\n } else if (playing) {\n this.player.play();\n }\n this.handleDurationCheck();\n };\n this.handlePlay = () => {\n this.isPlaying = true;\n this.isLoading = false;\n const { onStart, onPlay, playbackRate } = this.props;\n if (this.startOnPlay) {\n if (this.player.setPlaybackRate && playbackRate !== 1) {\n this.player.setPlaybackRate(playbackRate);\n }\n onStart?.();\n this.startOnPlay = false;\n }\n onPlay?.();\n if (this.seekOnPlay) {\n this.seekTo(this.seekOnPlay);\n this.seekOnPlay = null;\n }\n this.handleDurationCheck();\n };\n this.handlePause = (e) => {\n this.isPlaying = false;\n if (!this.isLoading) {\n this.props.onPause?.(e);\n }\n };\n this.handleEnded = () => {\n const { activePlayer, loop, onEnded } = this.props;\n if (activePlayer.loopOnEnded && loop) {\n this.seekTo(0);\n }\n if (!loop) {\n this.isPlaying = false;\n onEnded?.();\n }\n };\n this.handleError = (...args) => {\n this.isLoading = false;\n this.props.onError?.(args[0], args[1], args[2], args[3]);\n };\n this.handleDurationCheck = () => {\n clearTimeout(this.durationCheckTimeout);\n const duration = this.getDuration();\n if (duration) {\n if (!this.onDurationCalled) {\n this.props.onDuration?.(duration);\n this.onDurationCalled = true;\n }\n } else {\n this.durationCheckTimeout = window.setTimeout(\n this.handleDurationCheck,\n 100\n );\n }\n };\n this.handleLoaded = () => {\n this.isLoading = false;\n };\n }\n componentDidMount() {\n this.mounted = true;\n }\n componentWillUnmount() {\n clearTimeout(this.progressTimeout);\n clearTimeout(this.durationCheckTimeout);\n this.mounted = false;\n }\n componentDidUpdate(prevProps) {\n if (!this.player) return;\n const { src, playing, volume, muted, playbackRate, loop, activePlayer } = this.props;\n if (prevProps.src !== src) {\n if (this.isLoading && !activePlayer.forceLoad && !isMediaStream(src)) {\n console.warn(\n `StormcloudPlayer: the attempt to load ${src} is being deferred until the player has loaded`\n );\n this.loadOnReady = src || null;\n return;\n }\n this.isLoading = true;\n this.startOnPlay = true;\n this.onDurationCalled = false;\n this.player.load(src, this.isReady);\n }\n if (!prevProps.playing && playing && !this.isPlaying) {\n this.player.play();\n }\n if (prevProps.playing && !playing && this.isPlaying) {\n this.player.pause();\n }\n if (prevProps.volume !== volume && volume !== null) {\n this.player.setVolume(volume);\n }\n if (prevProps.muted !== muted) {\n if (muted) {\n this.player.mute();\n } else {\n this.player.unmute();\n if (volume !== null) {\n setTimeout(() => this.player.setVolume(volume));\n }\n }\n }\n if (prevProps.playbackRate !== playbackRate && this.player.setPlaybackRate) {\n this.player.setPlaybackRate(playbackRate);\n }\n if (prevProps.loop !== loop && this.player.setLoop) {\n this.player.setLoop(loop);\n }\n }\n getDuration() {\n if (!this.isReady) return null;\n return this.player.getDuration();\n }\n getCurrentTime() {\n if (!this.isReady) return null;\n return this.player.getCurrentTime();\n }\n getSecondsLoaded() {\n if (!this.isReady) return null;\n return this.player.getSecondsLoaded();\n }\n seekTo(amount, type, keepPlaying) {\n if (!this.isReady) {\n if (amount !== 0) {\n this.seekOnPlay = amount;\n setTimeout(() => {\n this.seekOnPlay = null;\n }, SEEK_ON_PLAY_EXPIRY);\n }\n return;\n }\n const isFraction = !type ? amount > 0 && amount < 1 : type === \"fraction\";\n if (isFraction) {\n const duration = this.player.getDuration();\n if (!duration) {\n console.warn(\n \"StormcloudPlayer: could not seek using fraction \\u2013 duration not yet available\"\n );\n return;\n }\n this.player.seekTo(duration * amount, keepPlaying);\n return;\n }\n this.player.seekTo(amount, keepPlaying);\n }\n render() {\n const Player2 = this.props.activePlayer;\n if (!Player2) {\n return null;\n }\n return import_react5.default.createElement(Player2, {\n ...this.props,\n onMount: this.handlePlayerMount,\n onReady: this.handleReady,\n onPlay: this.handlePlay,\n onPause: this.handlePause,\n onEnded: this.handleEnded,\n onLoaded: this.handleLoaded,\n onError: this.handleError\n });\n }\n};\nPlayer.displayName = \"Player\";\nPlayer.defaultProps = defaultProps;\n\n// src/StormcloudPlayer.tsx\nvar IS_BROWSER2 = typeof window !== \"undefined\" && window.document;\nvar IS_GLOBAL2 = typeof globalThis !== \"undefined\" && globalThis.window && globalThis.window.document;\nvar UniversalSuspense = IS_BROWSER2 || IS_GLOBAL2 ? import_react6.Suspense : () => null;\nvar SUPPORTED_PROPS = [\n \"src\",\n \"playing\",\n \"loop\",\n \"controls\",\n \"volume\",\n \"muted\",\n \"playbackRate\",\n \"width\",\n \"height\",\n \"style\",\n \"progressInterval\",\n \"playsInline\",\n \"autoplay\",\n \"preload\",\n \"poster\",\n \"className\",\n \"wrapperClassName\",\n \"wrapperStyle\",\n \"allowNativeHls\",\n \"lowLatencyMode\",\n \"isLiveStream\",\n \"driftToleranceMs\",\n \"immediateManifestAds\",\n \"debugAdTiming\",\n \"showCustomControls\",\n \"licenseKey\",\n \"isVmap\",\n \"vmapUrl\",\n \"adFailsafeTimeoutMs\",\n \"minSegmentsBeforePlay\",\n \"ctvAdRequest\",\n \"onReady\",\n \"onStart\",\n \"onPlay\",\n \"onPause\",\n \"onBuffer\",\n \"onBufferEnd\",\n \"onEnded\",\n \"onError\",\n \"onDuration\",\n \"onSeek\",\n \"onProgress\",\n \"onVolumeToggle\",\n \"onFullscreenToggle\",\n \"onControlClick\"\n];\nvar customPlayers = [];\nvar createStormcloudPlayer = (playerList, fallback) => {\n var _a;\n return _a = class extends import_react6.Component {\n constructor() {\n super(...arguments);\n this.state = {\n showPreview: false\n };\n this.references = {\n wrapper: (wrapper) => {\n this.wrapper = wrapper;\n },\n player: (player) => {\n this.player = player;\n }\n };\n this.getActivePlayer = (src) => {\n if (!src) return null;\n for (const player of [...customPlayers, ...playerList]) {\n if (player.canPlay(src)) {\n return player;\n }\n }\n if (fallback) {\n return fallback;\n }\n return null;\n };\n this.getAttributes = (src) => {\n return omit(this.props, SUPPORTED_PROPS);\n };\n this.handleReady = () => {\n this.props.onReady?.(this);\n };\n this.seekTo = (fraction, type, keepPlaying) => {\n if (!this.player) return null;\n this.player.seekTo(fraction, type, keepPlaying);\n };\n this.getCurrentTime = () => {\n if (!this.player) return null;\n return this.player.getCurrentTime();\n };\n this.getSecondsLoaded = () => {\n if (!this.player) return null;\n return this.player.getSecondsLoaded();\n };\n this.getDuration = () => {\n if (!this.player) return null;\n return this.player.getDuration();\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (!this.player) return null;\n return this.player.getInternalPlayer(key);\n };\n this.renderActivePlayer = (src) => {\n if (!src) return null;\n const activePlayer = this.getActivePlayer(src);\n if (!activePlayer) return null;\n return import_react6.default.createElement(Player, {\n ...this.props,\n key: activePlayer.key,\n ref: this.references.player,\n activePlayer: activePlayer.lazyPlayer || activePlayer,\n onReady: this.handleReady\n });\n };\n }\n render() {\n const {\n src,\n style,\n width,\n height,\n fallback: fallbackElement,\n wrapper: Wrapper\n } = this.props;\n const attributes = this.getAttributes(src);\n const wrapperRef = typeof Wrapper === \"string\" ? this.references.wrapper : void 0;\n return import_react6.default.createElement(\n Wrapper,\n {\n ref: wrapperRef,\n style: { ...style, width, height },\n ...attributes\n },\n import_react6.default.createElement(\n UniversalSuspense,\n { fallback: fallbackElement },\n this.renderActivePlayer(src)\n )\n );\n }\n }, _a.displayName = \"StormcloudPlayer\", _a.defaultProps = {\n ...defaultProps,\n fallback: null,\n wrapper: \"div\"\n }, _a.addCustomPlayer = (player) => {\n customPlayers.push(player);\n }, _a.removeCustomPlayers = () => {\n customPlayers.length = 0;\n }, _a.canPlay = (src) => {\n for (const Player2 of [...customPlayers, ...playerList]) {\n if (Player2.canPlay(src)) {\n return true;\n }\n }\n return false;\n }, _a.canEnablePIP = (src) => {\n for (const Player2 of [...customPlayers, ...playerList]) {\n if (Player2.canEnablePIP && Player2.canEnablePIP(src)) {\n return true;\n }\n }\n return false;\n }, _a;\n};\nvar StormcloudPlayer = createStormcloudPlayer(\n players_default,\n players_default[players_default.length - 1]\n);\nvar StormcloudPlayer_default = StormcloudPlayer;\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n DEFAULT_TRACKING_INGEST_CONFIG,\n IS_BROWSER,\n IS_GLOBAL,\n IS_IOS,\n IS_SAFARI,\n SUPPORTS_DASH,\n SUPPORTS_HLS,\n StormcloudPlayer,\n StormcloudVideoPlayer,\n StormcloudVideoPlayerComponent,\n applyTrackingIngestConfig,\n buildAnalyticsContext,\n canPlay,\n configureTrackingIngest,\n createHlsAdPlayer,\n createPalNonceManager,\n createStormcloudPlayer,\n detectBrowser,\n getBrowserConfigOverrides,\n getBrowserID,\n getClientInfo,\n ingestPlayerTracking,\n initializePolyfills,\n isMediaStream,\n isTrackingIngestEnabled,\n lazy,\n logBrowserInfo,\n merge,\n omit,\n parseQuery,\n players,\n randomString,\n requiresMediaPipelineResetAfterAds,\n sendAdDetectTracking,\n sendAdImpressionTracking,\n sendAdLoadedTracking,\n sendHeartbeat,\n sendInitialTracking,\n supportsFeature,\n supportsModernJS,\n supportsWebKitPresentationMode,\n trackingIngestConfig\n});\n"]}