{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/player/StormcloudVideoPlayer.cjs","../../src/player/StormcloudVideoPlayer.ts","../../src/sdk/hlsAdPlayer.ts","../../src/sdk/pal.ts","../../src/utils/mqttConfig.ts","../../src/utils/mqttClient.ts","../../src/utils/vastEnvironmentSignals.ts","../../src/utils/tracking.ts","../../src/utils/polyfills.ts","../../src/utils/vastMacros.ts","../../src/utils/browserCompat.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"],"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","StormcloudVideoPlayer_exports","value","__toCommonJS","StormcloudVideoPlayer","exports","import_hls","require","MAX_VAST_WRAPPER_DEPTH","createHlsAdPlayer","contentVideo","options","adPlaying","originalMutedState","originalVolume","Math","max","min","volume","listeners","Map","licenseKey","mainHlsInstance","adVideoElement","adHls","adContainerEl","currentAd","podAds","podIndex","sessionId","preloadedAds","preloadingAds","destroyed","pendingTimeouts","impression","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","Array","fn","error","console","warn","generateSessionId","Date","now","random","toString","substr","urls","length","trackingUrl","includes","img","Image","log","src","getMainStreamQuality","currentLevel","levels","autoLevel","loadLevel","level","height","bitrate","width","mediaFiles","resolutionDiff","widthDiff","heightDiff","fileBitrate","bitrateDiff","bestMatch","selectBestMediaFile","Error","firstFile","mainQuality","scoredFiles","map","file","abs","score","a","b","isHlsMediaFile","mediaFile","type","toLowerCase","url","isProgressiveMediaFile","startsWith","endsWith","createEmptyTrackingUrls","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","extractTrackingUrls","scope","trackingUrls","querySelectorAll","forEach","el","textContent","trim","push","getAttribute","eventKey","mergeTrackingUrls","source","keys","concat","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","adElement","adId","title","clickThrough","wrapperUri","vastAdTagUri","isNoAdAvailable","durationText","durationParts","split","duration","parseInt","mediaFileElements","mf","index","bitrateAttr","bitrateValue","ad","id","parseAdElement","fetchVastXml","vastTagUrl","credentials","requestVast","response","creds","mode","headers","referrerPolicy","ok","statusText","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","substring","fetchAndParsePod","adElements","ads","resolved","sort","aSeq","bSeq","aVal","Number","isFinite","MAX_SAFE_INTEGER","bVal","createAdVideoElement","video","document","createElement","style","position","left","top","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","addEventListener","progress","currentTime","trackingFired","fireTrackingPixels","advanceToNextPodAd","handleAdComplete","e","handleAdError","ended","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","preserveImpression","loadCurrentAdMedia","isHlsAd","Hls","isSupported","destroy","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","play","catch","ERROR","_event","data","fatal","canPlayType","load","resetQuartileTracking","total","display","pointerEvents","continueLiveStreamDuringAds","paused","initialize","container","right","bottom","alignItems","justifyContent","zIndex","parentElement","appendChild","requestAds","preloaded","Promise","reject","has","delete","resolve","contentVolume","stop","previousMutedState","visibility","opacity","timeoutId","clearTimeout","remove","removeChild","clear","isAdPlaying","resize","listener","Set","add","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","PAL_SDK_URL","_nonceLoader","_palLoadPromise","loadPalSdk","window","goog","pal","existing","timeout","setTimeout","script","async","setAttribute","onload","onerror","head","getOrCreateNonceLoader","consentSettings","ConsentSettings","allowStorage","NonceLoader","currentNonce","currentNonceManager","generateNonce","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","location","href","isMQTTEnabled","buildMQTTBrokerUrl","password","iconsSupported","playerType","playerVersion","supportedApiFrameworks","videoWidth","videoHeight","ppid","loadNonceManager","getNonce","getCurrentNonce","injectNonce","URL","searchParams","base","replace","sep","encodeURIComponent","sendPlaybackStart","sendPlaybackEnd","sendAdClick","sendAdTouch","reset","DEFAULT_MQTT_CONFIG","enabled","brokerAddress","brokerPort","wsPort","username","topicPrefix","qos","mqttConfig","brokerUrl","buildPlayerTopic","channel","import_mqtt","LOG","client","status","initMQTTClient","clientId","slice","mqtt","connect","keepalive","clean","reconnectPeriod","connectTimeout","queueQoSZero","err","info","message","ensureMQTTClient","publishMQTT","topic","publish","stringify","JSON","AIRY_ANDROID_APP_ID","AIRY_WEBOS_APP_ID","AIRY_TIZEN_APP_ID","AIRY_ROKU_APP_ID","AIRY_APP_NAME","_lgTestDeviceId","getDefaultAppId","AIRY_DEFAULT_CONTENT_URL","CTV_SESSION_STORAGE_KEY","LG_TEST_CONTENT_URL","PLAYER_ID_STORAGE_KEY","LG_TEST_APP_ID","LG_TEST_APP_NAME","getLgTestDeviceId","createUuid","isLgWebOS","navigator","test","userAgent","ua","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","platformLat","bridgeSignals","readNativeBridgeSignals","limitAdTracking","deviceId","readStoredLimitAdTracking","lg","isCtv","readStoredDeviceId","platformDevice","deviceIdType","readStoredString","inferDeviceIdType","appName","getOrCreateCtvSessionId","deviceTypeHint","tagType","runtimeType","tag","resolveNativeDeviceId","runtime","getOrCreateStoredUuid","storageKey","readPersistentId","writePersistentId","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","parts","cookie","part","entry","decodeURIComponent","crypto","randomUUID","bytes","Uint8Array","getRandomValues","seed","floor","performanceNow","i","hex","padStart","performance","readPlatformNativeDeviceId","adinfo","webapis","tifa","getTIFA","isMacroPlaceholder","lat","isLATEnabled","webOSDev","lgudid","LGUDID","isZeroedAdId","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","readBridgeBoolean","result","normalized","normalizeBoolean","getItem","cachedBrowserId","buildAnalyticsContext","config","context","debugAdTiming","isLiveStream","inputStreamType","getClientInfo","screen","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","webosMatch","match","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","hostname","origin","path","pathname","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","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","toISOString","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","publishTracking","body","sendInitialTracking","metricEvent","events","sendAdDetectTracking","adDetectInfo","sendHeartbeat","sendAdLoadedTracking","adLoadedInfo","sendAdImpressionTracking","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","values","String","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","polyfillPromiseFinally","finally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","indexOf","initializePolyfills","CTV_UNSUPPORTED_PARAMS","getValue","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","INLINE_DEVICE_MACRO_REPLACEMENTS","pattern","ctx","correlator","trimmed","generateCorrelator","buf","Uint32Array","expandInlineMacroPlaceholders","baseUrl","applyDeviceIdentityParams","tagRdid","tagLat","latValue","runtimeId","tagTypeValid","tagRdidValid","isEquivalentDeviceIdType","removeBrokenAppNameOrphans","toDelete","_value","suffix","trimStart","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","trimEnd","_match","val","expandedUrl","applyVastMacros","replaceCorrelatorFallback","streamCorrelator","pod","podMinDurationMs","round","podMaxDurationMs","podMaxAds","requestUrl","pageUrl","existingUrl","consent","gdpr","gdprConsent","usPrivacy","adTest","staleKeys","tasks","correlatorRegex","fetchConsentSignals","timeoutMs","signals","tcfApi","__tcfapi","settled","tcData","success","eventStatus","gdprApplies","tcString","listenerId","uspApi","__uspapi","uspString","getChromeVersion","getPlatform","userAgentData","detectBrowser","version","majorVersion","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","getWebKitVersion","getBrowserConfigOverrides","browser","overrides","allowNativeHls","logBrowserInfo","debug","parseCueOutDuration","num","parseFloat","dStr","d","parseCueOutCont","res","elapsedMatch","durationMatch","elapsed","rawVal","slashMatch","parseAttributeList","attrs","regex","exec","toNumber","n","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","text","decode","out","fromCharCode","getFragmentStartSeconds","frag","startPTS","candidate","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","packetSize","offset","matchedPackets","packetStart","tsPayloadOffset","getPsiSectionStart","payloadUnitStart","pointerField","sectionStart","getPsiSectionLength","parsePatSection","pmtPids","sectionLength","sectionEnd","programNumber","pid","descriptorsIdentifyScte35","end","descriptorStart","descriptorEnd","registration","parsePmtSection","tsScte35Pids","programInfoLength","streamType","esInfoLength","hasProcessedTsScte35Section","section","processedSections","checksum","size","firstKey","next","addScte35SectionMarker","markers","appendScte35Bytes","assemblers","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","bitPos","readBits","numBits","remainingInByte","toRead","currentByte","shift","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","componentCount","segmentationDurationFlag","durationTicks","segmentationUpidLength","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorLength","descriptorDataStart","descriptorMarker","descriptorDataEnd","parseScte35SegmentationDescriptor","ptsAdjHigh","ptsAdjLow","spliceCommandLength","spliceCommandType","spliceEventId","commandBodyStart","cancel","outOfNetwork","programSpliceFlag","durationFlag","spliceImmediateFlag","componentPtsSeconds","expectedDescriptorOffset","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","hasRecentlyHandledScte35Cue","pendingScte35Cues","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","entries","getScte35CueKey","getScte35MarkerRaw","toIdentityString","daterangeId","scteValue","isStrongScte35CueKey","recentKey","isInAdBreak","AdConfigManager","vmapBreaks","consumedVmapBreakIds","viewCorrelator","consentSignals","podCounter","podAssignedByPrefetch","lastHeartbeatTime","defaultPodMaxAds","defaultPodMaxDurationMs","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","vastMode","vastEndpoint","apiUrl","imaPayload","decodedPayload","numberAds","fetchAndParseVmap","apiVastTagUrl","fetch","json","ima","vast","cue_tones","number_ads","apiNumberAds","vmapXml","parseVmapToBreaks","doc","VMAP_NS","adBreakNodes","getElementsByTagNameNS","getElementsByTagName","localName","node","timeOffsetRaw","startTimeMs","parseVmapTimeOffsetToMs","percent","adTagNode","adTagUrl","breakId","aStart","bStart","timeOffset","hms","hh","mm","ss","ms","hours","minutes","seconds","millis","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","beginNewAdPod","resolvePodParams","maxDurationMs","breakDurationMs","maxAds","minDurationMs","podExactDuration","generatePodVastUrl","podParams","adPlayer","palNonce","inAdBreak","envSignals","resolveVastEnvironmentSignals","ctvAdRequest","urlWithMacros","autoplay","heartbeatInterval","sendHeartbeatIfNeeded","finalUrl","initializeTracking","setInterval","minAdRequestIntervalMs","backoffBaseMs","destroyTracking","clearInterval","AdTimingService","adRequestWatchdogToken","adFailsafeToken","ptsDriftEmaMs","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","consecutiveFailures","maxConsecutiveFailures","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillCooldownUntil","globalNoFillBackoffBaseMs","globalLastGamRequestTime","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","ensureAdStoppedByTimer","adStopTimerId","scheduleAdStartIn","onAdStopTimerFired","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","adStartTimerId","updatePtsDrift","ptsSecondsSample","sampleMs","alpha","resolveScteBreakStartWallClockMs","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","getAdBreakEndWallClockMs","getDurationBudgetRemainingMs","adController","scheduleAdStopAtBreakBoundary","expectedAdBreakDurationMs","getWallClockRemainingAdMs","endWallClockMs","getLoadedAdDurationMs","adFitsRemainingBudget","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","lastAdRequestTime","notePodAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","getMinRemainingMsToStartAd","configured","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","isUrlInCooldown","failureTime","temporaryFailureCooldownMs","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","exponent","enforceGlobalRateLimit","backoff","pow","globalNoFillBackoffMaxMs","resetGamNoFillCounter","waitMs","globalMinGamIntervalMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adFailsafeTimeoutMs","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","adFailsafeTimerId","failsafeMs","videoPaused","onFailsafeTimeout","extra","showAds","resetForBreakEnd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","offsetHeight","requestAnimationFrame","hide","HlsEngine","cueManager","timing","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","setupHls","hls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","_","_data","minSegments","some","details","live","onManifestParsed","minSegmentsBeforePlay","LEVEL_LOADED","_evt","hasPendingAdBreak","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection"],"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/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer_exports = {};\n__export(StormcloudVideoPlayer_exports, {\n  StormcloudVideoPlayer: () => StormcloudVideoPlayer\n});\nmodule.exports = __toCommonJS(StormcloudVideoPlayer_exports);\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\nvar MAX_VAST_WRAPPER_DEPTH = 5;\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 licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n  let adVideoElement;\n  let adHls;\n  let adContainerEl;\n  let currentAd;\n  let podAds = [];\n  let podIndex = 0;\n  let sessionId;\n  const preloadedAds = /* @__PURE__ */ new Map();\n  const preloadingAds = /* @__PURE__ */ new Map();\n  let destroyed = false;\n  let pendingTimeouts = [];\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 generateSessionId() {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n  function fireTrackingPixels(urls) {\n    if (!urls || urls.length === 0) return;\n    urls.forEach((url) => {\n      try {\n        let trackingUrl = url;\n        if (sessionId) {\n          trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}session_id=${sessionId}`;\n        }\n        if (licenseKey) {\n          trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}license_key=${licenseKey}`;\n        }\n        const img = new Image(1, 1);\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 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 mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n      const mediaFiles = [];\n      console.log(\n        `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\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        console.log(\n          `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n        );\n        const mediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: void 0\n        };\n        if (!url) {\n          console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n          return;\n        }\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n        mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n          console.log(\n            `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n          );\n        } else {\n          console.log(\n            `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n          );\n        }\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      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 mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n      const mediaFiles = [];\n      mediaFileElements.forEach((mf) => {\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 (!url) return;\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 (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n        }\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      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(\"[HlsAdPlayer] Pod VAST XML received\");\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n    if (xmlDoc.querySelector(\"parsererror\")) {\n      console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n      return [];\n    }\n    const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n    if (adElements.length === 0) {\n      console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\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    adVideoElement.addEventListener(\"timeupdate\", () => {\n      if (!currentAd || !adVideoElement) return;\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    adVideoElement.addEventListener(\"playing\", () => {\n      if (!currentAd || trackingFired.start) return;\n      trackingFired.start = true;\n      fireTrackingPixels(currentAd.trackingUrls.start);\n      console.log(\"[HlsAdPlayer] Ad started playing\");\n    });\n    adVideoElement.addEventListener(\"ended\", () => {\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    adVideoElement.addEventListener(\"error\", (e) => {\n      if (!adPlaying) return;\n      console.error(\"[HlsAdPlayer] Ad video error:\", e);\n      if (currentAd) {\n        fireTrackingPixels(currentAd.trackingUrls.error);\n      }\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n      handleAdError();\n    });\n    adVideoElement.addEventListener(\"volumechange\", () => {\n      if (!currentAd) return;\n      if (adVideoElement.muted) {\n        fireTrackingPixels(currentAd.trackingUrls.mute);\n      } else {\n        fireTrackingPixels(currentAd.trackingUrls.unmute);\n      }\n    });\n    adVideoElement.addEventListener(\"pause\", () => {\n      if (currentAd && !adVideoElement.ended) {\n        fireTrackingPixels(currentAd.trackingUrls.pause);\n      }\n    });\n    adVideoElement.addEventListener(\"play\", () => {\n      if (currentAd && adVideoElement.currentTime > 0) {\n        fireTrackingPixels(currentAd.trackingUrls.resume);\n      }\n    });\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 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    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        adVideoElement.play().catch((error) => {\n          console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n          handleAdError();\n        });\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      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n        handleAdError();\n      });\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      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n        handleAdError();\n      });\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    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    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 handleAdComplete() {\n    console.log(\"[HlsAdPlayer] Handling ad completion\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n    contentVideo.muted = true;\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\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(() => {\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    adPlaying = false;\n    setAdPlayingFlag(false);\n    contentVideo.muted = true;\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\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    },\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        sessionId = generateSessionId();\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        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          setupAdEventListeners();\n        }\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      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      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\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(() => {\n          });\n        }\n      }\n      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n      }\n      currentAd = void 0;\n      podAds = [];\n      podIndex = 0;\n    },\n    destroy() {\n      console.log(\"[HlsAdPlayer] Destroying\");\n      destroyed = true;\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      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n        adVideoElement.remove();\n        adVideoElement = void 0;\n      }\n      if (adContainerEl?.parentElement) {\n        adContainerEl.parentElement.removeChild(adContainerEl);\n      }\n      adContainerEl = void 0;\n      currentAd = 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) {\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/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 = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.iconsSupported = true;\n        request.playerType = \"StormcloudVideoPlayer\";\n        request.playerVersion = \"1.0\";\n        request.supportedApiFrameworks = \"2,7,9\";\n        request.url = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\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(\"[PAL] NonceRequest before generateNonce:\", {\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        });\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/mqttConfig.ts\nvar DEFAULT_MQTT_CONFIG = {\n  enabled: true,\n  brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n  brokerPort: 8883,\n  wsPort: 8084,\n  username: \"for-sonifi\",\n  password: \"sonifi-mqtt\",\n  topicPrefix: \"adstorm/players\",\n  qos: 1\n};\nvar mqttConfig = { ...DEFAULT_MQTT_CONFIG };\nfunction isMQTTEnabled() {\n  return mqttConfig.enabled;\n}\nfunction buildMQTTBrokerUrl() {\n  if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n  return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\nfunction buildPlayerTopic(licenseKey, channel) {\n  return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n\n// src/utils/mqttClient.ts\nvar import_mqtt = __toESM(require(\"mqtt\"), 1);\nvar LOG = \"[StormcloudVideoPlayer][MQTT]\";\nvar client = null;\nvar status = \"disconnected\";\nfunction initMQTTClient() {\n  if (client || !isMQTTEnabled()) return;\n  const url = buildMQTTBrokerUrl();\n  status = \"connecting\";\n  const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n  try {\n    client = import_mqtt.default.connect(url, {\n      clientId,\n      username: mqttConfig.username,\n      password: mqttConfig.password,\n      keepalive: 60,\n      clean: true,\n      reconnectPeriod: 5e3,\n      connectTimeout: 1e4,\n      queueQoSZero: false\n    });\n  } catch (err) {\n    status = \"error\";\n    console.warn(`${LOG} connect() threw:`, err);\n    return;\n  }\n  client.on(\"connect\", () => {\n    status = \"connected\";\n    console.info(`${LOG} connected to ${url}`);\n  });\n  client.on(\"reconnect\", () => {\n    status = \"connecting\";\n    console.info(`${LOG} reconnecting\\u2026`);\n  });\n  client.on(\"offline\", () => {\n    status = \"disconnected\";\n    console.warn(`${LOG} offline`);\n  });\n  client.on(\"error\", (err) => {\n    status = \"error\";\n    console.warn(`${LOG} error:`, err.message);\n  });\n  client.on(\"close\", () => {\n    if (status === \"connected\") {\n      status = \"disconnected\";\n    }\n  });\n}\nfunction ensureMQTTClient() {\n  if (isMQTTEnabled() && !client) {\n    initMQTTClient();\n  }\n}\nfunction publishMQTT(topic, payload) {\n  if (!isMQTTEnabled()) {\n    return false;\n  }\n  ensureMQTTClient();\n  if (!client) {\n    return false;\n  }\n  try {\n    client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n    return true;\n  } catch (err) {\n    console.warn(`${LOG} publish failed on ${topic}:`, err);\n    return false;\n  }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nvar AIRY_WEBOS_APP_ID = \"com.freeairytv.webos\";\nvar AIRY_TIZEN_APP_ID = \"com.freeairytv.samsung\";\nvar AIRY_ROKU_APP_ID = \"com.freeairytv.roku\";\nvar AIRY_APP_NAME = \"AiryTV Movies & TV\";\nvar AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar LG_TEST_APP_ID = \"com.hulu.plus\";\nvar LG_TEST_APP_NAME = \"Hulu\";\nvar LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\nvar _lgTestDeviceId;\nfunction getLgTestDeviceId() {\n  if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n  return _lgTestDeviceId;\n}\nfunction isLgWebOS() {\n  if (typeof navigator === \"undefined\") return false;\n  return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\nfunction getDefaultAppId() {\n  if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n  const ua = navigator.userAgent;\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n  if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;\n  if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;\n  return AIRY_ANDROID_APP_ID;\n}\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 lg = isCtv && isLgWebOS();\n  const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId || (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : void 0);\n  const deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType() || (lg ? \"lgudid\" : void 0);\n  const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n  const limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n  if (isCtv) {\n    return {\n      isCtv: true,\n      contentUrl: bridgeSignals.contentUrl || readStoredString(\"contentUrl\") || (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n      appId: bridgeSignals.appId || readStoredString(\"appId\") || readStoredString(\"msid\") || (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n      appName: bridgeSignals.appName || readStoredString(\"appName\") || readStoredString(\"an\") || (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n      sessionId: getOrCreateCtvSessionId(),\n      ...deviceId ? { deviceId } : {},\n      ...deviceIdType ? { deviceIdType } : {},\n      ...limitAdTracking != null ? { limitAdTracking } : {},\n      deviceTypeHint: 5\n    };\n  }\n  return {\n    isCtv: false,\n    ...deviceId ? { deviceId } : {},\n    ...deviceIdType ? { deviceIdType } : {},\n    ...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(isMQTTEnabled() && 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}\nfunction publishTracking(licenseKey, channel, body) {\n  ensureMQTTClient();\n  publishMQTT(buildPlayerTopic(licenseKey, channel), body);\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    publishTracking(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    publishTracking(licenseKey, \"heartbeat\", metricEvent);\n    publishTracking(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    publishTracking(licenseKey, \"heartbeat\", heartbeatData);\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  \"description_url\",\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: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n  { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\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.trimStart();\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.trimEnd(), ...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, ctx.appName);\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 requestUrl = ctx.contentUrl || ctx.pageUrl;\n  if (requestUrl) {\n    params.set(\"url\", requestUrl);\n    if (!ctx.isCtv) {\n      params.set(\"description_url\", requestUrl);\n    }\n  } else {\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  if (ctx.appId) {\n    params.set(\"msid\", ctx.appId);\n  }\n  if (ctx.appName) {\n    removeBrokenAppNameOrphans(params, ctx.appName);\n    params.set(\"an\", ctx.appName);\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  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, ctx.appName);\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/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 getBrowserConfigOverrides() {\n  const browser = detectBrowser();\n  const overrides = {};\n  if (browser.isSmartTV) {\n    overrides.allowNativeHls = 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/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  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      contentUrl: envSignals.contentUrl,\n      pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? window.location.href : void 0,\n      adWillPlayMuted,\n      adWillAutoPlay: !!this.config.autoplay,\n      appId: envSignals.appId,\n      appName: envSignals.appName,\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      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 = {}, adPlayer, inAdBreak, showAds) {\n    if (!this.debug) {\n      return;\n    }\n    console.log(\"[StormcloudVideoPlayer][AdState]\", {\n      event,\n      timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n      showAds: showAds ?? false,\n      adPlaying: adPlayer?.isAdPlaying() ?? false,\n      inAdBreak: inAdBreak ?? false,\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.bufferedSegmentsCount = 0;\n    this.shouldAutoplayAfterBuffering = false;\n    this.hasInitialBufferCompleted = 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: this.config.lowLatencyMode ? 1.5 : 1,\n      ...this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {},\n      maxBufferLength: 30,\n      maxMaxBufferLength: 600,\n      maxBufferSize: 60 * 1e3 * 1e3,\n      maxBufferHole: 0.5,\n      highBufferWatchdogPeriod: 2,\n      nudgeOffset: 0.1,\n      nudgeMaxRetry: 3,\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      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    });\n    this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\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  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  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  /**\n   * Produces the next pod ad-request URL for the current break. Every request\n   * (initial and continuous-fetch top-up) carries pod macros (pmad/pmnd/pmxd,\n   * no ppos); pmxd tracks the remaining break time so top-up pods only ask for\n   * what still fits.\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    if (this.host.shouldContinueLiveStreamDuringAds()) {\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      }\n      if (this.host.video.paused) {\n        if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video paused in live mode after ads, resuming playback\");\n        this.host.video.play()?.catch(() => {\n        });\n      } else {\n        if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video already playing in live mode after ads\");\n      }\n    } else if (this.host.video.paused) {\n      this.host.video.play()?.catch(() => {\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    });\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        getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\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    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    }).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.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.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        this.adBreak.adPodQueue = [];\n        this.adBreak.inAdBreak = false;\n        this.adBreak.showAds = false;\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n        }\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  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// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n  StormcloudVideoPlayer\n});\n","import type {\n  StormcloudVideoPlayerConfig,\n  Scte35Marker,\n  AdController,\n  AdBreak,\n} from \"../types\";\nimport { createHlsAdPlayer } from \"../sdk/hlsAdPlayer\";\nimport { createPalNonceManager } from \"../sdk/pal\";\nimport type { PalNonceManager } from \"../sdk/pal\";\nimport {\n  buildAnalyticsContext,\n  sendAdDetectTracking,\n} from \"../utils/tracking\";\nimport { initializePolyfills } from \"../utils/polyfills\";\nimport { fetchConsentSignals } from \"../utils/vastMacros\";\nimport {\n  logBrowserInfo,\n  getBrowserConfigOverrides,\n} from \"../utils/browserCompat\";\n\nimport { isManifestBasedMarker } from \"./Scte35Parser\";\nimport { Scte35CueManager } from \"./Scte35CueManager\";\nimport { AdConfigManager } from \"./AdConfigManager\";\nimport { AdTimingService } from \"./AdTimingService\";\nimport { PlaceholderLayer } from \"./PlaceholderLayer\";\nimport { HlsEngine } from \"./HlsEngine\";\nimport { AdBreakOrchestrator } from \"./AdBreakOrchestrator\";\nimport {\n  toggleMute as ctrlToggleMute,\n  toggleFullscreen as ctrlToggleFullscreen,\n  isMuted as ctrlIsMuted,\n  setMuted as ctrlSetMuted,\n  setVolume as ctrlSetVolume,\n  getVolume as ctrlGetVolume,\n  isFullscreen as ctrlIsFullscreen,\n  resizePlayer as ctrlResizePlayer,\n} from \"./PlayerControls\";\n\nexport class StormcloudVideoPlayer {\n  private readonly video: HTMLVideoElement;\n  private readonly config: StormcloudVideoPlayerConfig;\n  private adPlayer: AdController;\n  private attached = false;\n\n  private timeUpdateHandler?: (event: Event) => void;\n  private endedHandler?: (event: Event) => void;\n  private emptiedHandler?: (event: Event) => void;\n\n  private palNonce: PalNonceManager;\n  private palPlaybackStarted: boolean = false;\n\n  private readonly cueManager: Scte35CueManager;\n  private readonly adConfig: AdConfigManager;\n  private readonly timing: AdTimingService;\n  private readonly placeholder: PlaceholderLayer;\n  private readonly hlsEngine: HlsEngine;\n  private readonly adBreak: AdBreakOrchestrator;\n\n  constructor(config: StormcloudVideoPlayerConfig) {\n    initializePolyfills();\n\n    const browserOverrides = getBrowserConfigOverrides();\n\n    this.config = { ...browserOverrides, ...config };\n    this.video = config.videoElement;\n\n    logBrowserInfo(config.debugAdTiming);\n\n    this.adPlayer = this.createAdPlayer(false);\n    this.palNonce = createPalNonceManager();\n\n    this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {\n      onEarlyStartCue: (marker, fragmentSn, cueKey) => {\n        this.startAdPrefetch(marker, fragmentSn, cueKey);\n      },\n      onPlaybackCue: (marker, cueKey) => {\n        this.onScte35Marker(marker, cueKey);\n      },\n      isInAdBreak: () => this.adBreak.inAdBreak,\n    });\n\n    this.adConfig = new AdConfigManager(this.config, this.video);\n\n    this.timing = new AdTimingService(this.config, this.video, {\n      onAdStopTimerFired: () => this.onAdStopTimerFired(),\n      onAdStartTimerFired: (marker, cueKey) => {\n        this.startScte35AdBreak(\n          marker,\n          cueKey,\n          marker.durationSeconds != null ? marker.durationSeconds * 1000 : this.timing.expectedAdBreakDurationMs\n        );\n      },\n      onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n      onFailsafeTimeout: () => this.adBreak.handleAdFailure(),\n    });\n\n    this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n\n    this.hlsEngine = new HlsEngine(this.config, this.video, this.cueManager, this.timing, {\n      onManifestParsed: async (isLive) => this.onManifestParsed(isLive),\n      onScte35Cue: (marker, context) => this.cueManager.onScte35Cue(marker, context),\n      activatePendingCuesForFragment: (frag) => this.cueManager.activatePendingScte35CuesForFragment(frag),\n      onFatalDestroy: () => this.destroy(),\n      isInAdBreak: () => this.adBreak.inAdBreak,\n      hasPendingAdBreak: () => this.adBreak.pendingAdBreak !== null,\n    });\n\n    this.adBreak = new AdBreakOrchestrator(\n      {\n        config: this.config,\n        video: this.video,\n        getAdPlayer: () => this.adPlayer,\n        setAdPlayer: (p) => { this.adPlayer = p; },\n        createAdPlayer: (c) => this.createAdPlayer(c),\n        shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n        getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n        generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs),\n      },\n      this.timing,\n      this.adConfig,\n      this.cueManager,\n      this.placeholder\n    );\n  }\n\n  private get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  private createAdPlayer(continueLiveStreamDuringAds: boolean): AdController {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n    }\n    return createHlsAdPlayer(this.video, {\n      continueLiveStreamDuringAds,\n      ...(this.config.licenseKey\n        ? { licenseKey: this.config.licenseKey }\n        : {}),\n      ...(this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}),\n    });\n  }\n\n  private generatePodVastUrl(baseUrl: string, breakDurationMs?: number): string {\n    const podParams = this.adConfig.resolvePodParams(breakDurationMs);\n    return this.adConfig.generatePodVastUrl(\n      baseUrl, podParams, this.adPlayer, this.palNonce, this.adBreak.inAdBreak\n    );\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  Lifecycle\n  // ───────────────────────────────────────────────────────────────\n\n  async load(): Promise<void> {\n    if (!this.attached) {\n      this.attach();\n    }\n\n    try {\n      await this.adConfig.fetchAdConfiguration();\n    } catch (error) {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n          error\n        );\n      }\n    }\n\n    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    }).catch(() => {});\n\n    fetchConsentSignals()\n      .then((signals) => {\n        this.adConfig.consentSignals = signals;\n      })\n      .catch(() => {});\n\n    this.adConfig.initializeTracking();\n\n    if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n      await this.hlsEngine.setupNativeHls();\n\n      const continueLiveStreamDuringAds = this.shouldContinueLiveStreamDuringAds();\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Native HLS ad behavior:\", {\n          isLive: this.hlsEngine.isLiveStream,\n          continueLiveStreamDuringAds,\n        });\n      }\n\n      this.adPlayer.destroy();\n      this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n      this.adPlayer.initialize();\n      return;\n    }\n\n    this.hlsEngine.setupHls();\n  }\n\n  private async onManifestParsed(isLive: boolean): Promise<void> {\n    if (\n      !this.adConfig.isVmapEnabled() &&\n      !isLive &&\n      this.adConfig.vmapBreaks.length === 0 &&\n      this.adConfig.apiVastTagUrl\n    ) {\n      const prerollKey = \"synthetic-vod-preroll\";\n      if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {\n        this.adConfig.vmapBreaks = [\n          { id: prerollKey, startTimeMs: 0, vastTagUrl: this.adConfig.apiVastTagUrl },\n        ];\n        if (this.debug) {\n          console.log(\n            \"[StormcloudVideoPlayer] Injected synthetic VOD preroll from apiVastTagUrl\"\n          );\n        }\n      }\n    }\n\n    if (this.debug) {\n      const adBehavior = this.shouldContinueLiveStreamDuringAds()\n        ? \"live (main video continues muted during ads)\"\n        : \"vod (main video pauses during ads)\";\n      console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n        isLive,\n        allowNativeHls: this.config.allowNativeHls,\n        adBehavior,\n      });\n    }\n\n    this.adPlayer.destroy();\n    this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n    this.adPlayer.initialize();\n  }\n\n  private attach(): void {\n    if (this.attached) return;\n    this.attached = true;\n    this.video.autoplay = !!this.config.autoplay;\n    this.video.muted = !!this.config.muted;\n\n    this.adPlayer.initialize();\n    this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n    this.adBreak.attachImaEventListeners();\n\n    this.video.addEventListener(\"play\", () => {\n      if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n        this.palPlaybackStarted = true;\n        this.palNonce.sendPlaybackStart();\n      }\n    });\n\n    this.endedHandler = () => {\n      if (this.palPlaybackStarted) {\n        this.palPlaybackStarted = false;\n        this.palNonce.sendPlaybackEnd();\n      }\n      this.onVideoEnded();\n    };\n    this.video.addEventListener(\"ended\", this.endedHandler);\n\n    this.video.addEventListener(\"mousedown\", (e) => {\n      this.palNonce.sendAdTouch(e as MouseEvent);\n    });\n\n    this.video.addEventListener(\"touchstart\", (e) => {\n      this.palNonce.sendAdTouch(e as TouchEvent);\n    });\n\n    this.timeUpdateHandler = () => {\n      this.onTimeUpdate(this.video.currentTime);\n    };\n    this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n\n    this.emptiedHandler = () => {\n      if (\n        this.hlsEngine.nativeHlsMode &&\n        this.hlsEngine.videoSrcProtection &&\n        !this.adPlayer.isAdPlaying()\n      ) {\n        if (this.debug) {\n          console.log(\n            \"[StormcloudVideoPlayer] Video src was cleared, restoring:\",\n            this.hlsEngine.videoSrcProtection\n          );\n        }\n        const currentTime = this.video.currentTime;\n        const wasPaused = this.video.paused;\n        this.video.src = this.hlsEngine.videoSrcProtection;\n        this.video.currentTime = currentTime;\n        if (!wasPaused) {\n          this.video.play().catch(() => {});\n        }\n      }\n    };\n    this.video.addEventListener(\"emptied\", this.emptiedHandler);\n  }\n\n  private shouldContinueLiveStreamDuringAds(): boolean {\n    if (this.hlsEngine.isLiveStream) {\n      return true;\n    }\n\n    const duration = this.video.duration;\n    if (!Number.isFinite(duration) || duration === Infinity) {\n      return true;\n    }\n\n    return false;\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  SCTE-35 marker orchestration\n  // ───────────────────────────────────────────────────────────────\n\n  private onScte35Marker(marker: Scte35Marker, cueKey?: string): void {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n        type: marker.type,\n        ptsSeconds: marker.ptsSeconds,\n        durationSeconds: marker.durationSeconds,\n        currentTime: this.video.currentTime,\n        raw: marker.raw,\n        hasPendingAdBreak: !!this.adBreak.pendingAdBreak,\n      });\n    }\n\n    if (marker.type === \"start\") {\n      if (this.adBreak.inAdBreak) {\n        if (marker.durationSeconds != null) {\n          const newDurationMs = marker.durationSeconds * 1000;\n          if (this.timing.expectedAdBreakDurationMs == null || newDurationMs > this.timing.expectedAdBreakDurationMs) {\n            this.timing.setAdBreakDurationBoundary(newDurationMs);\n            this.timing.scheduleAdStopAtBreakBoundary();\n            if (this.debug) {\n              console.log(\n                `[StormcloudVideoPlayer] Updated ad break duration from subsequent marker: ${newDurationMs}ms, remaining: ${this.timing.getWallClockRemainingAdMs()}ms`\n              );\n            }\n          }\n        }\n        return;\n      }\n\n      if (!this.adBreak.adDetectSentForCurrentBreak) {\n        this.adBreak.adDetectSentForCurrentBreak = true;\n        const detectPayload: {\n          durationSeconds?: number;\n          ptsSeconds?: number;\n          detectedAtFragmentSn?: number;\n        } = {};\n        if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n        if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n        sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: new Date().toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {});\n      }\n\n      const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n\n      const durationMs =\n        marker.durationSeconds != null\n          ? marker.durationSeconds * 1000\n          : (this.adBreak.pendingAdBreak?.marker.durationSeconds != null\n              ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1000\n              : undefined);\n\n      const isManifest = isManifestBasedMarker(marker);\n      const forceImmediate = this.config.immediateManifestAds ?? true;\n\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n          isManifestMarker: isManifest,\n          forceImmediate,\n          hasPts: typeof marker.ptsSeconds === \"number\",\n          hasPrefetchedAds,\n        });\n      }\n\n      if (isManifest && forceImmediate) {\n        if (this.debug) {\n          console.log(\n            `[StormcloudVideoPlayer] Starting ad immediately (manifest-based)${hasPrefetchedAds ? \" with prefetched ads\" : \"\"}`\n          );\n        }\n        this.timing.clearAdStartTimer();\n        this.startScte35AdBreak(marker, cueKey, durationMs);\n      } else if (typeof marker.ptsSeconds === \"number\") {\n        const tol = this.config.driftToleranceMs ?? 1000;\n        const nowMs = this.video.currentTime * 1000;\n        const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n        const deltaMs = Math.floor(marker.ptsSeconds * 1000 - estCurrentPtsMs);\n\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n            nowMs,\n            estCurrentPtsMs,\n            markerPtsMs: marker.ptsSeconds * 1000,\n            deltaMs,\n            tolerance: tol,\n          });\n        }\n\n        if (deltaMs > tol) {\n          if (this.debug) {\n            console.log(`[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`);\n          }\n          this.timing.expectedAdBreakDurationMs = durationMs;\n          this.cueManager.scheduledScte35BreakKey = cueKey;\n          this.timing.scheduleAdStartIn(deltaMs, marker, cueKey);\n        } else {\n          if (this.debug) {\n            console.log(\"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\");\n          }\n          this.timing.clearAdStartTimer();\n          this.startScte35AdBreak(marker, cueKey, durationMs);\n        }\n      } else {\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Starting ad immediately (fallback)\");\n        }\n        this.timing.clearAdStartTimer();\n        this.startScte35AdBreak(marker, cueKey, durationMs);\n      }\n      return;\n    }\n    if (marker.type === \"progress\" && this.adBreak.inAdBreak) {\n      if (marker.durationSeconds != null) {\n        this.timing.setAdBreakDurationBoundary(marker.durationSeconds * 1000);\n      }\n      this.timing.scheduleAdStopAtBreakBoundary();\n\n      if (\n        !this.adPlayer.isAdPlaying() &&\n        this.timing.activeAdRequestToken === null &&\n        this.adBreak.adRequestQueue.length > 0 &&\n        this.timing.hasTimeToStartAnotherAd()\n      ) {\n        this.adBreak.tryNextAvailableAdWithRateLimit();\n      }\n      return;\n    }\n    if (marker.type === \"end\") {\n      if (!this.video.muted) {\n        this.video.muted = true;\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Muted video on SCTE end marker\");\n        }\n      }\n\n      const remaining = this.timing.getRemainingAdMs();\n      const adPlaying = this.adPlayer.isAdPlaying();\n      const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] SCTE-35 end marker received:\", {\n          remaining,\n          adPlaying,\n          hasQueuedAds,\n          activeAdRequest: this.timing.activeAdRequestToken !== null,\n        });\n      }\n\n      this.timing.scteAdBreakEndWallClockMs = Date.now();\n      this.timing.clearAdStartTimer();\n      this.timing.clearAdStopTimer();\n\n      if (adPlaying) {\n        this.adPlayer.stop().catch(() => {});\n      }\n\n      this.adBreak.handleAdPodComplete();\n      return;\n    }\n  }\n\n  private startScte35AdBreak(\n    marker: Scte35Marker,\n    cueKey: string | undefined,\n    durationMs: number | undefined\n  ): void {\n    this.adBreak.inAdBreak = true;\n    this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n    this.cueManager.scheduledScte35BreakKey = undefined;\n    this.timing.currentAdBreakStartWallClockMs =\n      this.timing.resolveScteBreakStartWallClockMs(marker);\n    this.timing.setAdBreakDurationBoundary(durationMs);\n\n    this.adBreak.handleAdStart(marker);\n\n    this.timing.scheduleAdStopAtBreakBoundary();\n  }\n\n  private onAdStopTimerFired(): void {\n    if (!this.adBreak.inAdBreak) return;\n\n    const adPlaying = this.adPlayer.isAdPlaying();\n    const checkIntervalMs = Math.max(\n      250,\n      Math.floor(this.config.adBreakCheckIntervalMs ?? 1000)\n    );\n    const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n    const maxExtensionMs =\n      typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0\n        ? maxExtensionMsConfig\n        : 0;\n\n    const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n    const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n\n    const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n\n    if (shouldExtendAdBreak) {\n      this.timing.scheduleAdStopCountdown(checkIntervalMs);\n      return;\n    }\n\n    if (this.debug) {\n      console.log(\n        `[StormcloudVideoPlayer] Ad break boundary reached (overrun=${overrunMs}ms) - hard-stopping ads and resuming stream`\n      );\n    }\n\n    if (adPlaying) {\n      this.adPlayer.stop().catch(() => {});\n    }\n\n    this.adBreak.handleAdPodComplete();\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  Ad prefetch\n  // ───────────────────────────────────────────────────────────────\n\n  private startAdPrefetch(\n    marker: Scte35Marker,\n    fragmentSn?: number,\n    cueKey?: string\n  ): void {\n    if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n\n    const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1000);\n    const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n\n    let baseVastUrl: string;\n    if (tags && tags.length > 0 && tags[0]) {\n      baseVastUrl = tags[0];\n    } else if (this.adConfig.apiVastTagUrl) {\n      baseVastUrl = this.adConfig.apiVastTagUrl;\n    } else {\n      if (this.debug) console.warn(\"[StormcloudVideoPlayer] No VAST URL available for prefetch\");\n      return;\n    }\n\n    this.adConfig.beginNewAdPod();\n    this.adConfig.podAssignedByPrefetch = true;\n\n    const breakDurationMs =\n      marker.durationSeconds != null ? marker.durationSeconds * 1000 : undefined;\n\n    const generatedUrls = [this.generatePodVastUrl(baseVastUrl, breakDurationMs)];\n\n    this.adBreak.pendingAdBreak = {\n      marker,\n      ...(fragmentSn !== undefined ? { detectedAtFragmentSn: fragmentSn } : {}),\n      vastUrls: generatedUrls,\n      isFetching: false,\n      fetchStartTime: Date.now(),\n    };\n    this.cueManager.pendingScte35CueKey = cueKey;\n\n    this.adBreak.adDetectSentForCurrentBreak = true;\n    const detectPayload: {\n      durationSeconds?: number;\n      ptsSeconds?: number;\n      detectedAtFragmentSn?: number;\n    } = {};\n    if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n    if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n    if (fragmentSn !== undefined) detectPayload.detectedAtFragmentSn = fragmentSn;\n    \n    sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: new Date().toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {});\n\n    if (this.debug) {\n      console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n      console.log(`[PREFETCH] Pre-generated pod request URL`);\n    }\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  VMAP time-based ad breaks\n  // ───────────────────────────────────────────────────────────────\n\n  private onTimeUpdate(currentTimeSec: number): void {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const nowMs = currentTimeSec * 1000;\n    const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n    if (breakToPlay) {\n      void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n        }\n      });\n    }\n  }\n\n  private onVideoEnded(): void {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n\n    const durationMs = Number.isFinite(this.video.duration)\n      ? Math.floor(this.video.duration * 1000)\n      : 0;\n    const postroll = this.adConfig.vmapBreaks.find(\n      (b) =>\n        b.startTimeMs === -1 &&\n        !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n    );\n\n    if (postroll) {\n      void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n        }\n      });\n    }\n  }\n\n  private async handleVmapAdBreak(\n    adBreak: AdBreak,\n    nowMs: number\n  ): Promise<void> {\n    const key = this.adConfig.getAdBreakKey(adBreak);\n    if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n\n    const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n    if (breakStartMs == null) return;\n\n    const durationMs = adBreak.durationMs ?? 0;\n    const endMs = breakStartMs + durationMs;\n    const inWindow =\n      durationMs > 0\n        ? nowMs >= breakStartMs && nowMs < endMs\n        : nowMs >= breakStartMs;\n\n    if (inWindow) {\n      this.adConfig.consumedVmapBreakIds.add(key);\n      const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n      if (!tags || tags.length === 0) return;\n\n      const first = tags[0] as string;\n      const rest = tags.slice(1);\n      this.adBreak.adPodQueue = rest;\n\n      this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n      this.adBreak.showAds = true;\n      this.adBreak.inAdBreak = true;\n      this.timing.currentAdBreakStartWallClockMs = Date.now();\n\n      try {\n        await this.adBreak.playSingleAd(first);\n      } catch (error) {\n        this.adBreak.adPodQueue = [];\n        this.adBreak.inAdBreak = false;\n        this.adBreak.showAds = false;\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n        }\n      }\n    }\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  Public API\n  // ───────────────────────────────────────────────────────────────\n\n  getCurrentAdIndex(): number {\n    return this.timing.currentAdIndex;\n  }\n\n  getTotalAdsInBreak(): number {\n    return this.timing.totalAdsInBreak;\n  }\n\n  getAdRemainingMs(): number {\n    return this.timing.getRemainingAdMs();\n  }\n\n  isAdPlaying(): boolean {\n    return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n  }\n\n  isShowingAds(): boolean {\n    return this.adBreak.showAds;\n  }\n\n  getStreamType(): \"hls\" | \"other\" {\n    const url = this.config.src.toLowerCase();\n    if (\n      url.includes(\".m3u8\") ||\n      url.includes(\"/hls/\") ||\n      url.includes(\"application/vnd.apple.mpegurl\")\n    ) {\n      return \"hls\";\n    }\n    return \"other\";\n  }\n\n  shouldShowNativeControls(): boolean {\n    const streamType = this.getStreamType();\n    if (streamType === \"other\") {\n      return !(this.config.showCustomControls ?? false);\n    }\n    return !!(\n      this.config.allowNativeHls && !(this.config.showCustomControls ?? false)\n    );\n  }\n\n  isLive(): boolean {\n    return this.hlsEngine.isLiveStream;\n  }\n\n  get videoElement(): HTMLVideoElement {\n    return this.video;\n  }\n\n  toggleMute(): void {\n    ctrlToggleMute(this.video, this.adPlayer, this.debug);\n  }\n\n  toggleFullscreen(): Promise<void> {\n    return ctrlToggleFullscreen(this.video, this.debug);\n  }\n\n  isMuted(): boolean {\n    return ctrlIsMuted(this.video, this.adPlayer);\n  }\n\n  setMuted(muted: boolean): void {\n    ctrlSetMuted(this.video, this.adPlayer, muted, this.debug);\n  }\n\n  setVolume(volume: number): void {\n    ctrlSetVolume(this.video, this.adPlayer, volume, this.debug);\n  }\n\n  getVolume(): number {\n    return ctrlGetVolume(this.video, this.adPlayer);\n  }\n\n  isFullscreen(): boolean {\n    return ctrlIsFullscreen();\n  }\n\n  resize(): void {\n    ctrlResizePlayer(this.video, this.adPlayer, this.debug);\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  Destroy\n  // ───────────────────────────────────────────────────────────────\n\n  destroy(): void {\n    this.adBreak.stopContinuousFetching();\n    this.timing.destroy();\n    this.adBreak.clearPendingAdBreak();\n    this.placeholder.destroy();\n\n    if (this.timeUpdateHandler) {\n      this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n      delete this.timeUpdateHandler;\n    }\n    if (this.endedHandler) {\n      this.video.removeEventListener(\"ended\", this.endedHandler);\n      delete this.endedHandler;\n    }\n    if (this.emptiedHandler) {\n      this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n      delete this.emptiedHandler;\n    }\n\n    this.adConfig.destroyTracking();\n    this.hlsEngine.destroy();\n    this.adPlayer?.destroy();\n\n    if (this.palPlaybackStarted) {\n      this.palPlaybackStarted = false;\n      this.palNonce.sendPlaybackEnd();\n    }\n    this.palNonce.reset();\n\n    this.adBreak.adRequestQueue = [];\n    this.timing.consecutiveFailures = 0;\n  }\n}\n","import type { AdController } from \"../types\";\nimport Hls from \"hls.js\";\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;\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 licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n\n  let adVideoElement: HTMLVideoElement | undefined;\n  let adHls: Hls | undefined;\n  let adContainerEl: HTMLDivElement | undefined;\n  let currentAd: VastAd | undefined;\n  let podAds: VastAd[] = [];\n  let podIndex = 0;\n  let sessionId: string | undefined;\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  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 generateSessionId(): string {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  function fireTrackingPixels(urls: string[]): void {\n    if (!urls || urls.length === 0) return;\n\n    urls.forEach((url) => {\n      try {\n        let trackingUrl = url;\n\n        if (sessionId) {\n          trackingUrl = `${trackingUrl}${\n            trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n          }session_id=${sessionId}`;\n        }\n\n        if (licenseKey) {\n          trackingUrl = `${trackingUrl}${\n            trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n          }license_key=${licenseKey}`;\n        }\n\n        const img = new Image(1, 1);\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 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 mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n      const mediaFiles: VastMediaFile[] = [];\n\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\n        console.log(\n          `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n        );\n\n        const mediaFile: VastMediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: undefined,\n        };\n\n        if (!url) {\n          console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n          return;\n        }\n\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr\n          ? parseInt(bitrateAttr, 10)\n          : undefined;\n        mediaFile.bitrate =\n          bitrateValue && bitrateValue > 0 ? bitrateValue : undefined;\n\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n          console.log(\n            `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n          );\n        } else {\n          console.log(\n            `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n          );\n        }\n      });\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 mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n      const mediaFiles: VastMediaFile[] = [];\n\n      mediaFileElements.forEach((mf) => {\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 (!url) return;\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 (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n        }\n      });\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(\"[HlsAdPlayer] Pod VAST XML received\");\n\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n\n    if (xmlDoc.querySelector(\"parsererror\")) {\n      console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n      return [];\n    }\n\n    const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n    if (adElements.length === 0) {\n      console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\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\n    adVideoElement.addEventListener(\"timeupdate\", () => {\n      if (!currentAd || !adVideoElement) return;\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    adVideoElement.addEventListener(\"playing\", () => {\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    adVideoElement.addEventListener(\"ended\", () => {\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    adVideoElement.addEventListener(\"error\", (e) => {\n      if (!adPlaying) return;\n      console.error(\"[HlsAdPlayer] Ad video error:\", e);\n      if (currentAd) {\n        fireTrackingPixels(currentAd.trackingUrls.error);\n      }\n\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n\n      handleAdError();\n    });\n\n    adVideoElement.addEventListener(\"volumechange\", () => {\n      if (!currentAd) return;\n      if (adVideoElement!.muted) {\n        fireTrackingPixels(currentAd.trackingUrls.mute);\n      } else {\n        fireTrackingPixels(currentAd.trackingUrls.unmute);\n      }\n    });\n\n    adVideoElement.addEventListener(\"pause\", () => {\n      if (currentAd && !adVideoElement!.ended) {\n        fireTrackingPixels(currentAd.trackingUrls.pause);\n      }\n    });\n\n    adVideoElement.addEventListener(\"play\", () => {\n      if (currentAd && adVideoElement!.currentTime > 0) {\n        fireTrackingPixels(currentAd.trackingUrls.resume);\n      }\n    });\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 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    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        adVideoElement!.play().catch((error) => {\n          console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n          handleAdError();\n        });\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      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n        handleAdError();\n      });\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      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n        handleAdError();\n      });\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    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    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 handleAdComplete(): void {\n    console.log(\"[HlsAdPlayer] Handling ad completion\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n\n    contentVideo.muted = true;\n\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\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(() => {});\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    adPlaying = false;\n    setAdPlayingFlag(false);\n\n    contentVideo.muted = true;\n\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n\n    emit(\"ad_error\");\n  }\n\n  return {\n    initialize() {\n      console.log(\"[HlsAdPlayer] Initializing\");\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 = \"30\";\n        container.style.backgroundColor = \"#000\";\n\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\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        sessionId = generateSessionId();\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        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          setupAdEventListeners();\n        }\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      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      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\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(() => {});\n        }\n      }\n\n      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n      }\n\n      currentAd = undefined;\n      podAds = [];\n      podIndex = 0;\n    },\n\n    destroy() {\n      console.log(\"[HlsAdPlayer] Destroying\");\n      destroyed = true;\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      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n        adVideoElement.remove();\n        adVideoElement = undefined;\n      }\n\n      if (adContainerEl?.parentElement) {\n        adContainerEl.parentElement.removeChild(adContainerEl);\n      }\n\n      adContainerEl = undefined;\n      currentAd = 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) {\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","declare 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 =\n          options.descriptionUrl ||\n          (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.iconsSupported = true;\n        request.playerType = \"StormcloudVideoPlayer\";\n        request.playerVersion = \"1.0\";\n        request.supportedApiFrameworks = \"2,7,9\";\n        request.url =\n          options.descriptionUrl ||\n          (typeof window !== \"undefined\" ? window.location.href : \"\");\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(\"[PAL] NonceRequest before generateNonce:\", {\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        });\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 const MQTT_CA_CERT_FILE = \"src/certs/emqxsl-ca.crt\";\n\nexport type MQTTConfig = {\n  enabled: boolean;\n  brokerAddress: string;\n  brokerPort: number;\n  wsPort: number;\n  username: string;\n  password: string;\n  topicPrefix: string;\n  qos: 0 | 1 | 2;\n  brokerUrl?: string;\n};\n\nexport const DEFAULT_MQTT_CONFIG: MQTTConfig = {\n  enabled: true,\n  brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n  brokerPort: 8883,\n  wsPort: 8084,\n  username: \"for-sonifi\",\n  password: \"sonifi-mqtt\",\n  topicPrefix: \"adstorm/players\",\n  qos: 1,\n};\n\nexport const mqttConfig: MQTTConfig = { ...DEFAULT_MQTT_CONFIG };\n\nexport function applyMQTTConfig(overrides: Partial<MQTTConfig>): void {\n  Object.assign(mqttConfig, overrides);\n}\n\nexport function isMQTTEnabled(): boolean {\n  return mqttConfig.enabled;\n}\n\nexport function buildMQTTBrokerUrl(): string {\n  if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n  return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\n\nexport function buildPlayerTopic(\n  licenseKey: string,\n  channel: \"metrics\" | \"impressions\" | \"heartbeat\"\n): string {\n  return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n","import mqtt from \"mqtt\";\nimport type { MqttClient } from \"mqtt\";\nimport {\n  applyMQTTConfig,\n  buildMQTTBrokerUrl,\n  isMQTTEnabled,\n  mqttConfig,\n} from \"./mqttConfig\";\nimport type { MQTTConfig } from \"./mqttConfig\";\n\nconst LOG = \"[StormcloudVideoPlayer][MQTT]\";\n\nexport type MQTTStatus = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nlet client: MqttClient | null = null;\nlet status: MQTTStatus = \"disconnected\";\n\nexport function getMQTTStatus(): MQTTStatus {\n  return status;\n}\n\nexport function isMQTTConnected(): boolean {\n  return status === \"connected\" && client !== null && client.connected;\n}\n\nexport function isMQTTConfigured(): boolean {\n  return isMQTTEnabled();\n}\n\nexport function configureMQTT(overrides: Partial<MQTTConfig>): void {\n  applyMQTTConfig(overrides);\n  disconnectMQTT();\n}\n\nexport function initMQTTClient(): void {\n  if (client || !isMQTTEnabled()) return;\n\n  const url = buildMQTTBrokerUrl();\n  status = \"connecting\";\n\n  const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n\n  try {\n    client = mqtt.connect(url, {\n      clientId,\n      username: mqttConfig.username,\n      password: mqttConfig.password,\n      keepalive: 60,\n      clean: true,\n      reconnectPeriod: 5000,\n      connectTimeout: 10_000,\n      queueQoSZero: false,\n    });\n  } catch (err) {\n    status = \"error\";\n    console.warn(`${LOG} connect() threw:`, err);\n    return;\n  }\n\n  client.on(\"connect\", () => {\n    status = \"connected\";\n    console.info(`${LOG} connected to ${url}`);\n  });\n\n  client.on(\"reconnect\", () => {\n    status = \"connecting\";\n    console.info(`${LOG} reconnecting…`);\n  });\n\n  client.on(\"offline\", () => {\n    status = \"disconnected\";\n    console.warn(`${LOG} offline`);\n  });\n\n  client.on(\"error\", (err) => {\n    status = \"error\";\n    console.warn(`${LOG} error:`, err.message);\n  });\n\n  client.on(\"close\", () => {\n    if (status === \"connected\") {\n      status = \"disconnected\";\n    }\n  });\n}\n\nexport function ensureMQTTClient(): void {\n  if (isMQTTEnabled() && !client) {\n    initMQTTClient();\n  }\n}\n\nexport function publishMQTT(\n  topic: string,\n  payload: Record<string, unknown>\n): boolean {\n  if (!isMQTTEnabled()) {\n    return false;\n  }\n\n  ensureMQTTClient();\n\n  if (!client) {\n    return false;\n  }\n\n  try {\n    client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n    return true;\n  } catch (err) {\n    console.warn(`${LOG} publish failed on ${topic}:`, err);\n    return false;\n  }\n}\n\nexport function disconnectMQTT(): void {\n  if (client) {\n    client.end(true);\n    client = null;\n    status = \"disconnected\";\n  }\n}\n","export interface VastEnvironmentSignals {\n  isCtv: boolean;\n  contentUrl?: string;\n  appId?: string;\n  appName?: string;\n  sessionId?: string;\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n  deviceTypeHint?: number;\n}\n\nconst AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nconst AIRY_WEBOS_APP_ID    = \"com.freeairytv.webos\";\nconst AIRY_TIZEN_APP_ID    = \"com.freeairytv.samsung\";\nconst AIRY_ROKU_APP_ID     = \"com.freeairytv.roku\";\nconst AIRY_APP_NAME = \"AiryTV Movies & TV\";\nconst AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nconst CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nexport const PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\n\nconst LG_TEST_APP_ID      = \"com.hulu.plus\";\nconst LG_TEST_APP_NAME    = \"Hulu\";\nconst LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\n\nlet _lgTestDeviceId: string | undefined;\nfunction getLgTestDeviceId(): string {\n  if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n  return _lgTestDeviceId;\n}\n\nfunction isLgWebOS(): boolean {\n  if (typeof navigator === \"undefined\") return false;\n  return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\n\nfunction getDefaultAppId(): string {\n  if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n  const ua = navigator.userAgent;\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n  if (/Tizen|Samsung/i.test(ua))                       return AIRY_TIZEN_APP_ID;\n  if (/Roku/i.test(ua))                                return AIRY_ROKU_APP_ID;\n  return AIRY_ANDROID_APP_ID;\n}\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  const lg = isCtv && isLgWebOS();\n\n  const deviceId =\n    bridgeSignals.deviceId  ||\n    readStoredDeviceId()    ||\n    platformDevice.deviceId ||\n    (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : undefined);\n  const deviceIdType =\n    bridgeSignals.deviceIdType  ||\n    readStoredString(\"deviceIdType\") ||\n    readStoredString(\"idtype\") ||\n    platformDevice.deviceIdType ||\n    inferDeviceIdType() ||\n    (lg ? \"lgudid\" : undefined);\n  const platformLat = bridgeSignals.deviceId\n    ? bridgeSignals.limitAdTracking\n    : platformDevice.limitAdTracking;\n  const limitAdTracking =\n    deviceId != null\n      ? platformLat ?? readStoredLimitAdTracking() ?? false\n      : undefined;\n\n  if (isCtv) {\n    return {\n      isCtv: true,\n      contentUrl:\n        bridgeSignals.contentUrl ||\n        readStoredString(\"contentUrl\") ||\n        (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n      appId:\n        bridgeSignals.appId ||\n        readStoredString(\"appId\") ||\n        readStoredString(\"msid\") ||\n        (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n      appName:\n        bridgeSignals.appName ||\n        readStoredString(\"appName\") ||\n        readStoredString(\"an\") ||\n        (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n      sessionId: getOrCreateCtvSessionId(),\n      ...(deviceId ? { deviceId } : {}),\n      ...(deviceIdType ? { deviceIdType } : {}),\n      ...(limitAdTracking != null ? { limitAdTracking } : {}),\n      deviceTypeHint: 5,\n    };\n  }\n\n  return {\n    isCtv: false,\n    ...(deviceId ? { deviceId } : {}),\n    ...(deviceIdType ? { deviceIdType } : {}),\n    ...(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 { buildPlayerTopic, isMQTTEnabled } from \"./mqttConfig\";\nimport { ensureMQTTClient, publishMQTT } from \"./mqttClient\";\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(isMQTTEnabled() && 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\nfunction publishTracking(\n  licenseKey: string,\n  channel: \"metrics\" | \"impressions\" | \"heartbeat\",\n  body: Record<string, unknown>\n): void {\n  ensureMQTTClient();\n  publishMQTT(buildPlayerTopic(licenseKey, channel), body);\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    publishTracking(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    publishTracking(licenseKey, \"heartbeat\", metricEvent);\n    publishTracking(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    publishTracking(licenseKey, \"heartbeat\", heartbeatData);\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  contentUrl?: string | undefined;\n  pageUrl?: string | undefined;\n  adWillPlayMuted?: boolean | undefined;\n  adWillAutoPlay?: boolean | undefined;\n  appId?: string | undefined;\n  appName?: string | 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  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  \"description_url\",\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: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n  { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\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.trimStart();\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.trimEnd(), ...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, ctx.appName);\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  const requestUrl = ctx.contentUrl || ctx.pageUrl;\n  if (requestUrl) {\n    params.set(\"url\", requestUrl);\n    if (!ctx.isCtv) {\n      params.set(\"description_url\", requestUrl);\n    }\n  } else {\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\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.appId) {\n    params.set(\"msid\", ctx.appId);\n  }\n  if (ctx.appName) {\n    removeBrokenAppNameOrphans(params, ctx.appName);\n    params.set(\"an\", ctx.appName);\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  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, ctx.appName);\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","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 getBrowserConfigOverrides(): {\n  allowNativeHls?: boolean;\n} {\n  const browser = detectBrowser();\n  const overrides: { allowNativeHls?: boolean } = {};\n\n  if (browser.isSmartTV) {\n    overrides.allowNativeHls = 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","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 {\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  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      contentUrl: envSignals.contentUrl,\n      pageUrl:\n        !envSignals.isCtv && typeof window !== \"undefined\"\n          ? window.location.href\n          : undefined,\n      adWillPlayMuted,\n      adWillAutoPlay: !!this.config.autoplay,\n      appId: envSignals.appId,\n      appName: envSignals.appName,\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      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}\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> = {}, adPlayer?: AdController, inAdBreak?: boolean, showAds?: boolean): void {\n    if (!this.debug) {\n      return;\n    }\n\n    console.log(\"[StormcloudVideoPlayer][AdState]\", {\n      event,\n      timestamp: new Date().toISOString(),\n      showAds: showAds ?? false,\n      adPlaying: adPlayer?.isAdPlaying() ?? false,\n      inAdBreak: inAdBreak ?? false,\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\n  private bufferedSegmentsCount: number = 0;\n  private shouldAutoplayAfterBuffering: boolean = false;\n  private hasInitialBufferCompleted: 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: this.config.lowLatencyMode ? 1.5 : 1.0,\n      ...(this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {}),\n      maxBufferLength: 30,\n      maxMaxBufferLength: 600,\n      maxBufferSize: 60 * 1000 * 1000,\n      maxBufferHole: 0.5,\n      highBufferWatchdogPeriod: 2,\n      nudgeOffset: 0.1,\n      nudgeMaxRetry: 3,\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\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\n    this.hls.on(Hls.Events.LEVEL_LOADED, (_evt, data: any) => {\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  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  destroy(): void {\n    this.hls?.destroy();\n    this.hls = undefined;\n  }\n}\n"]}