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.
- package/LICENSE +21 -21
- package/README.md +1369 -1369
- package/dist/stormcloud-vp.min.js +3 -1
- package/lib/Player.cjs +548 -0
- package/lib/Player.cjs.map +1 -0
- package/lib/Player.d.cts +146 -0
- package/lib/{index.js → StormcloudPlayer.cjs} +1193 -1908
- package/lib/StormcloudPlayer.cjs.map +1 -0
- package/lib/{index.d.ts → StormcloudPlayer.d.cts} +7 -400
- package/lib/index.cjs +1064 -280
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +18 -4032
- package/lib/patterns.cjs +111 -0
- package/lib/patterns.cjs.map +1 -0
- package/lib/patterns.d.cts +14 -0
- package/lib/player/AdBreakOrchestrator.cjs +51 -16
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +3 -1
- package/lib/player/AdConfigManager.cjs +206 -26
- package/lib/player/AdConfigManager.cjs.map +1 -1
- package/lib/player/AdConfigManager.d.cts +1 -1
- package/lib/player/AdTimingService.cjs.map +1 -1
- package/lib/player/AdTimingService.d.cts +1 -1
- package/lib/player/HlsEngine.cjs.map +1 -1
- package/lib/player/HlsEngine.d.cts +1 -1
- package/lib/player/PlaceholderLayer.cjs.map +1 -1
- package/lib/player/PlayerControls.cjs.map +1 -1
- package/lib/player/PlayerControls.d.cts +1 -1
- package/lib/player/Scte35CueManager.cjs.map +1 -1
- package/lib/player/Scte35CueManager.d.cts +1 -1
- package/lib/player/Scte35Parser.cjs.map +1 -1
- package/lib/player/Scte35Parser.d.cts +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +1060 -278
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/player/playerTypes.cjs.map +1 -1
- package/lib/player/playerTypes.d.cts +1 -1
- package/lib/players/FilePlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.cjs +1060 -278
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +1060 -278
- package/lib/players/index.cjs.map +1 -1
- package/lib/props.cjs +186 -0
- package/lib/props.cjs.map +1 -0
- package/lib/props.d.cts +62 -0
- package/lib/sdk/hlsAdPlayer.cjs +884 -234
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/sdk/pal.cjs +9 -5
- package/lib/sdk/pal.cjs.map +1 -1
- package/lib/sdk/pal.d.cts +1 -0
- package/lib/types.cjs +49 -0
- package/lib/types.cjs.map +1 -0
- package/lib/{types-52ASml2N.d.cts → types.d.cts} +48 -1
- package/lib/ui/StormcloudVideoPlayer.cjs +1064 -280
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/browserCompat.cjs.map +1 -1
- package/lib/utils/ctvVastSignals.cjs +178 -19
- package/lib/utils/ctvVastSignals.cjs.map +1 -1
- package/lib/utils/devUrl.cjs.map +1 -1
- package/lib/utils/polyfills.cjs.map +1 -1
- package/lib/utils/tracking.cjs +45 -16
- package/lib/utils/tracking.cjs.map +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/trackingIngest.cjs.map +1 -1
- package/lib/utils/vastEnvironmentSignals.cjs +192 -20
- package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
- package/lib/utils/vastEnvironmentSignals.d.cts +13 -2
- package/lib/utils/vastMacros.cjs +50 -4
- package/lib/utils/vastMacros.cjs.map +1 -1
- package/lib/utils/vastMacros.d.cts +2 -0
- package/lib/utils/vastTrackingMacros.cjs +5 -0
- package/lib/utils/vastTrackingMacros.cjs.map +1 -1
- package/lib/utils/vastTrackingMacros.d.cts +2 -0
- package/lib/utils.cjs +292 -0
- package/lib/utils.cjs.map +1 -0
- package/lib/utils.d.cts +17 -0
- package/package.json +91 -91
- package/rollup.config.js +90 -90
- package/lib/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/ui/StormcloudVideoPlayer.cjs","../../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"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__getProtoOf","__esModule","value","__toCommonJS","StormcloudVideoPlayer_exports","StormcloudVideoPlayerComponent","module","exports","import_react","require","import_hls","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","detectBrowser","version","majorVersion","isSmartTV","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams","requiresMediaPipelineResetAfterAds","browser","overrides","allowNativeHls","pauseContentDuringAds","logBrowserInfo","debug","console","log","CACHEBUSTING_ALIASES","KNOWN_VAST_MACROS","generateCachebuster","String","Math","floor","random","formatPlayhead","seconds","Number","isFinite","total","hh","padStart","mm","ss","ms","resolveMacroValues","ctx","values","set","adPlayhead","adPlayheadSeconds","url","contentPlayheadSeconds","assetUri","mediaMime","Date","toISOString","errorCode","playerWidth","playerHeight","round","deviceId","deviceIdType","limitAdTracking","pageUrl","URL","hostname","clientUa","podSequence","substituteVastTrackingMacros","replace","VAST_MACRO_PATTERN","encodeURIComponent","MAX_VAST_WRAPPER_DEPTH","BEACON_TIMEOUT_MS","inFlightBeacons","VAST_ERROR_MEDIA_DISPLAY","toVastMediaErrorCode","error","code","createHlsAdPlayer","contentVideo","options","adPlaying","originalMutedState","AD_CONTAINER_PROP","originalVolume","max","min","volume","listeners","mainHlsInstance","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","stallWatchdogId","lastAdProgressTime","lastAdProgressPosition","sawDecodedVideoFrame","videoFrameCallbackHandle","pendingPlayPromise","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","Array","fn","warn","currentTime","type","clientWidth","clientHeight","context","location","href","length","fireTrackingPixels","urls","forEach","trackingUrl","macroContext","img","Image","add","timeoutId","release","onload","onerror","delete","Error","firstFile","scoredFiles","mediaFiles","map","file","setTimeout","src","getMainStreamQuality","levels","currentLevel","autoLevel","loadLevel","width","level","height","bitrate","selectBestMediaFile","mainQuality","widthDiff","heightDiff","abs","resolutionDiff","score","bitrateDiff","sort","a","b","bestMatch","resolution","isHlsMediaFile","mediaFile","toLowerCase","includes","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","duration","durationParts","ad","id","parseAdElement","fetchVastXml","vastTagUrl","credentials","requestVast","response","creds","fetch","mode","headers","referrerPolicy","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","substring","trimmedXml","adElements","ads","resolved","aSeq","bSeq","aVal","MAX_SAFE_INTEGER","bVal","setupAdEventListeners","createAdVideoElement","video","document","createElement","style","position","left","top","objectFit","backgroundColor","muted","onTimeUpdate","noteAdProgress","progress","videoWidth","onLoadedMetadata","videoHeight","handleVideoDecodeFailure","onPlaying","startStallWatchdog","onEnded","advanceToNextPodAd","handleAdComplete","onError","e","handleAdError","onVolumeChange","onPause","ended","onPlay","handler","addEventListener","teardownAdEventListeners","removeEventListener","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","getVideoPlaybackQuality","quality","totalVideoFrames","legacyCount","webkitDecodedFrameCount","isFrameCounterReliable","markFrameCounterReliable","isRvfcReliable","markRvfcReliable","cancelVideoFrameCallback","startVideoFrameProbe","rvfc","onPresentedFrame","blackFrameDetectionEnabled","window","setInterval","decodedFrames","getDecodedVideoFrameCount","paused","BLACKFRAME_MIN_PLAYBACK_S","timeAdvancing","releaseAdDecoder","display","pointerEvents","setAdPlayingFlag","continueLiveStreamDuringAds","visibility","opacity","initialize","container","right","bottom","alignItems","justifyContent","zIndex","parentElement","requestAds","preloaded","reject","has","fetchAndParsePod","resolve","contentVolume","stop","previousMutedState","clearTimeout","clear","isAdPlaying","resize","listener","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","isLocalDevHost","PRIVATE_HOST_PATTERNS","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","createPalNonceManager","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","isTrackingIngestEnabled","DEFAULT_TRACKING_INGEST_CONFIG","enabled","baseUrl","trackingIngestConfig","normalizeIngestBaseUrl","buildTrackingIngestUrl","channel","ingestPlayerTracking","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","writePersistentId","createUuid","readPersistentId","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","cookie","part","entry","decodeURIComponent","slice","bytes","crypto","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","buildAnalyticsContext","config","debugAdTiming","isLiveStream","inputStreamType","getClientInfo","screen","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","os","model","isAndroid","isWebView","isWebApp","brand","webosMatch","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","origin","path","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","subtle","digest","TextEncoder","encode","input","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","getBrowserID","sha256Hex","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","sendInitialTracking","metricEvent","events","sendAdDetectTracking","adDetectInfo","sendHeartbeat","sendAdLoadedTracking","adLoadedInfo","sendAdImpressionTracking","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","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","indexOf","initializePolyfills","polyfillPromiseFinally","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","latValue","tagLat","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","raw","anValue","orphanFragments","reconstructed","_match","val","applyVastMacros","expandedUrl","normalizeVastTagUrl","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","num","dStr","d","parseFloat","parseCueOutCont","res","elapsedMatch","durationMatch","elapsed","slashMatch","parseAttributeList","regex","exec","rawVal","attrs","toNumber","n","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","decode","out","fromCharCode","getFragmentStartSeconds","frag","startPTS","candidate","parseScte35FromId3","cueOutMatch","arg","dur","parseCueOutDuration","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","packetSize","tsPayloadOffset","offset","matchedPackets","packetStart","payloadUnitStart","getPsiSectionStart","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","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","descriptor","parseScte35SegmentationDescriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","durationTicks","segmentationUpidLength","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorDataStart","descriptorDataEnd","descriptorLength","descriptorMarker","ptsAdjHigh","ptsAdjLow","spliceCommandType","spliceCommandLength","spliceEventId","commandBodyStart","bytePosition","cancel","outOfNetwork","programSpliceFlag","durationFlag","spliceImmediateFlag","componentPtsSeconds","expectedDescriptorOffset","splice_event_id","Scte35CueManager","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","callbacks","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","segmentation_event_id","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","adBreak","findCurrentOrNextBreak","minutes","millis","hours","percent","ratio","durationSec","getAdBreakKey","resolveBreakStartMs","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","beginNewAdPod","resolvePodParams","breakDurationMs","minDurationMs","podExactDuration","maxDurationMs","maxAds","getPalDescriptionUrl","generatePodVastUrl","podParams","adPlayer","palNonce","envSignals","ctvAdRequest","urlWithMacros","autoplay","finalUrl","initializeTracking","heartbeatInterval","sendHeartbeatIfNeeded","destroyTracking","adRequestWatchdogToken","globalNoFillBackoffBaseMs","scheduleAdStopCountdown","AdTimingService","adFailsafeToken","ptsDriftEmaMs","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","temporaryFailureCooldownMs","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillCooldownUntil","globalNoFillBackoffMaxMs","globalLastGamRequestTime","globalMinGamIntervalMs","remainingMs","clearAdStopTimer","ensureAdStoppedByTimer","adStopTimerId","onAdStopTimerFired","scheduleAdStartIn","scheduleAdStopAtBreakBoundary","expectedAdBreakDurationMs","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","adStartTimerId","updatePtsDrift","ptsSecondsSample","sampleMs","alpha","resolveScteBreakStartWallClockMs","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","accepted","adController","getDurationBudgetRemainingMs","getLoadedAdDurationMs","adFitsRemainingBudget","logAdDurationDecision","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","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeTimeoutMs","adFailsafeTimerId","videoPaused","onFailsafeTimeout","extra","getAdState","showAds","resetForBreakEnd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","offsetHeight","requestAnimationFrame","hide","removeChild","HlsEngine","cueManager","timing","videoSrcProtection","reloadingLiveStream","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","latencyProfileApplied","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","nativeHlsMode","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","reloadLiveStream","restartLoadAt","stopLoad","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","analyticsContext","nextAdRequestUrl","baseVastUrl","remaining","attachImaEventListeners","getAdPlayer","adIndex","queuedUrls","tryNextAvailableAdWithRateLimit","handleAdPodComplete","errorPayload","errorMessage","vastErrorCode","cause","innerError","causeMessage","handleAdFailure","recreateAdController","shouldShowPlaceholder","preservedMutedState","preservedVolumeState","shouldContinueLiveStreamDuringAds","setAdPlayer","newAdPlayer","clearPendingAdBreak","prefetchTimerId","pendingAdBreak","handleAdStart","_marker","scheduled","tags","adBreakDurationMs","currentMuted","currentVolume","podPlayed","startOptimizedPod","startContinuousFetching","requestToken","podCount","vastUrl","podUrl","continuousFetchLoop","maxQueueSize","newAdUrl","queuedUrlsPreview","generationDelay","epoch","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"],"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/ui/StormcloudVideoPlayer.tsx\nvar StormcloudVideoPlayer_exports = {};\n__export(StormcloudVideoPlayer_exports, {\n StormcloudVideoPlayerComponent: () => StormcloudVideoPlayerComponent\n});\nmodule.exports = __toCommonJS(StormcloudVideoPlayer_exports);\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 supportsModernJS = 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 supportsModernJS = false;\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS = false;\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS = false;\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}\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 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}\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 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// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n StormcloudVideoPlayerComponent\n});\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"]}
|
|
1
|
+
{"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\ui\\StormcloudVideoPlayer.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","StormcloudVideoPlayer_exports","StormcloudVideoPlayerComponent","module","exports","import_react","require","import_hls","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","detectBrowser","version","majorVersion","isSmartTV","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams","requiresMediaPipelineResetAfterAds","browser","getBrowserConfigOverrides","overrides","allowNativeHls","pauseContentDuringAds","logBrowserInfo","debug","console","log","VAST_MACRO_PATTERN","CACHEBUSTING_ALIASES","KNOWN_VAST_MACROS","generateCachebuster","String","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","createHlsAdPlayer","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","Array","fn","warn","buildTrackingMacroContext","options2","ad","context","currentTime","type","clientWidth","clientHeight","location","href","fireTrackingPixels","urls","macroContext","forEach","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","includes","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","fetch","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","e","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","default","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","createPalNonceManager","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","DEFAULT_TRACKING_INGEST_CONFIG","enabled","baseUrl","trackingIngestConfig","isTrackingIngestEnabled","normalizeIngestBaseUrl","buildTrackingIngestUrl","channel","ingestPlayerTracking","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","crypto","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","buildAnalyticsContext","config","debugAdTiming","isLiveStream","inputStreamType","getClientInfo","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","subtle","digest","TextEncoder","encode","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","getBrowserID","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","sendInitialTracking","metricEvent","events","sendAdDetectTracking","adDetectInfo","sendHeartbeat","sendAdLoadedTracking","adLoadedInfo","sendAdImpressionTracking","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","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","initializePolyfills","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","StormcloudVideoPlayer","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"],"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/ui/StormcloudVideoPlayer.tsx\nvar StormcloudVideoPlayer_exports = {};\n__export(StormcloudVideoPlayer_exports, {\n StormcloudVideoPlayerComponent: () => StormcloudVideoPlayerComponent\n});\nmodule.exports = __toCommonJS(StormcloudVideoPlayer_exports);\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 supportsModernJS = 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 supportsModernJS = false;\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS = false;\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS = false;\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}\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 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}\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 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// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n StormcloudVideoPlayerComponent\n});\n"]}
|