bitmovin-analytics 2.27.3 → 2.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bitmovinanalytics.min.js +2 -2
- package/bitmovinanalytics.min.js.map +1 -1
- package/js/adapters/ShakaAdapter.d.ts +1 -0
- package/js/adapters/internal/Bitmovin7InternalAdapter.d.ts +2 -1
- package/js/adapters/internal/Bitmovin8InternalAdapter.d.ts +2 -1
- package/js/adapters/internal/CAFv3InternalAdapter.d.ts +3 -1
- package/js/adapters/internal/HTML5InternalAdapter.d.ts +3 -1
- package/js/adapters/internal/HlsInternalAdapter.d.ts +1 -0
- package/js/adapters/internal/InternalAdapterAPI.d.ts +2 -1
- package/js/adapters/internal/ShakaInternalAdapter.d.ts +1 -1
- package/js/adapters/internal/VideojsInternalAdapter.d.ts +2 -1
- package/js/analyticsStateMachines/AnalyticsStateMachine.d.ts +2 -1
- package/js/analyticsStateMachines/Bitmovin7AnalyticsStateMachine.d.ts +2 -1
- package/js/analyticsStateMachines/Bitmovin8AnalyticsStateMachine.d.ts +2 -1
- package/js/analyticsStateMachines/HTML5AnalyticsStateMachine.d.ts +2 -1
- package/js/analyticsStateMachines/VideoJsAnalyticsStateMachine.d.ts +2 -1
- package/js/types/AnalyticsConfig.d.ts +23 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://bitmovin.analytics/webpack/universalModuleDefinition","webpack://bitmovin.analytics/webpack/bootstrap","webpack://bitmovin.analytics/./js/utils/Logger.ts","webpack://bitmovin.analytics/./js/utils/Utils.ts","webpack://bitmovin.analytics/./js/enums/Event.ts","webpack://bitmovin.analytics/./js/enums/Player.ts","webpack://bitmovin.analytics/./js/core/Analytics.ts","webpack://bitmovin.analytics/./js/adapters/Adapter.ts","webpack://bitmovin.analytics/./js/utils/Settings.ts","webpack://bitmovin.analytics/./js/features/errordetails/ErrorDetailBackend.ts","webpack://bitmovin.analytics/./js/features/errordetails/ErrorDetailTracking.ts","webpack://bitmovin.analytics/./js/enums/MIMETypes.ts","webpack://bitmovin.analytics/./js/enums/PlayerSize.ts","webpack://bitmovin.analytics/./js/adapters/internal/InternalAdapter.ts","webpack://bitmovin.analytics/./js/enums/ErrorCode.ts","webpack://bitmovin.analytics/./node_modules/javascript-state-machine/state-machine.js","webpack://bitmovin.analytics/./js/analyticsStateMachines/AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/adapters/internal/HTML5InternalAdapter.ts","webpack://bitmovin.analytics/./js/Version.ts","webpack://bitmovin.analytics/./js/utils/Http.ts","webpack://bitmovin.analytics/./js/core/NoOpBackend.ts","webpack://bitmovin.analytics/./js/core/EventDispatcher.ts","webpack://bitmovin.analytics/./js/core/VideoCompletionTracker.ts","webpack://bitmovin.analytics/./js/types/CustomDataValues.ts","webpack://bitmovin.analytics/./js/utils/EventDebugging.ts","webpack://bitmovin.analytics/./js/enums/CastTech.ts","webpack://bitmovin.analytics/./js/utils/BitmovinProgressiveSourceHelper.ts","webpack://bitmovin.analytics/./js/core/DownloadSpeedMeter.ts","webpack://bitmovin.analytics/./js/analyticsStateMachines/HTML5AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/enums/StreamTypes.ts","webpack://bitmovin.analytics/./js/core/BitmovinAnalyticsExport.ts","webpack://bitmovin.analytics/./js/adapters/Bitmovin7Adapter.ts","webpack://bitmovin.analytics/./js/features/FeatureManager.ts","webpack://bitmovin.analytics/./js/utils/CodecHelper.ts","webpack://bitmovin.analytics/./js/enums/PageLoadType.ts","webpack://bitmovin.analytics/./js/core/AdAnalytics.ts","webpack://bitmovin.analytics/./js/types/AdAnalyticsSample.ts","webpack://bitmovin.analytics/./js/types/AdBreakSample.ts","webpack://bitmovin.analytics/./js/types/AdSample.ts","webpack://bitmovin.analytics/./js/utils/ViewportTracker.ts","webpack://bitmovin.analytics/./js/core/BackendFactory.ts","webpack://bitmovin.analytics/./js/utils/LicenseCall.ts","webpack://bitmovin.analytics/./js/core/DebuggingBackend.ts","webpack://bitmovin.analytics/./js/core/LicenseCheckingBackend.ts","webpack://bitmovin.analytics/./js/types/LicensingRequest.ts","webpack://bitmovin.analytics/./js/core/QueueBackend.ts","webpack://bitmovin.analytics/./js/core/RemoteBackend.ts","webpack://bitmovin.analytics/./js/utils/AnalyticsCall.ts","webpack://bitmovin.analytics/./js/core/LongPlaytimeFilteringBackend.ts","webpack://bitmovin.analytics/./js/core/SequenceNumberBackend.ts","webpack://bitmovin.analytics/./js/core/SessionPersistenceHandler.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin7InternalAdapter.ts","webpack://bitmovin.analytics/./js/analyticsStateMachines/Bitmovin7AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/enums/VideoStartFailedReason.ts","webpack://bitmovin.analytics/./js/features/Feature.ts","webpack://bitmovin.analytics/./js/types/StateMachineCallbacks.ts","webpack://bitmovin.analytics/./js/utils/WindowEventTracker.ts","webpack://bitmovin.analytics/./js/adapters/Bitmovin8Adapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin8InternalAdapter.ts","webpack://bitmovin.analytics/./js/analyticsStateMachines/Bitmovin8AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/utils/Converter.ts","webpack://bitmovin.analytics/./js/core/Measure.ts","webpack://bitmovin.analytics/./js/core/SegmentTracker.ts","webpack://bitmovin.analytics/./js/features/httprequesttracking/HttpRequestTracking.ts","webpack://bitmovin.analytics/./js/utils/Queue.ts","webpack://bitmovin.analytics/./js/adapters/internal/ads/Bitmovin8AdModule.ts","webpack://bitmovin.analytics/./js/adapters/internal/ads/AdModuleAPI.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin8HttpRequestTrackingAdapter.ts","webpack://bitmovin.analytics/./js/features/httprequesttracking/HttpRequestType.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin8SegmentTrackerAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin8SpeedMeterAdapter.ts","webpack://bitmovin.analytics/./js/adapters/CAFv3Adapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/CAFv3InternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/DashjsAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/DashjsInternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/HlsAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/HlsInternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/HlsSpeedMeterAdapter.ts","webpack://bitmovin.analytics/./js/adapters/HTMLVideoElementAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/HTMLVideoElementInternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/ShakaAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/ShakaInternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/VideoJsAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/VideojsInternalAdapter.ts","webpack://bitmovin.analytics/./js/analyticsStateMachines/VideoJsAnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/enums/Codecs.ts","webpack://bitmovin.analytics/./js/types/SubtitleInfo.ts","webpack://bitmovin.analytics/./js/enums/CDNProvider.ts"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Logger","showLogs","this","setLogging","logging","isLogging","log","msg","optionalParamters","_i","arguments","length","console","apply","__spreadArrays","logTable","fields","table","errorMessageToUser","error","warning","warn","warningMessageToUser","optionalParameters","padRight","str","Array","join","slice","logger","PageLoadType_1","CustomDataUtils","validString","text","isNullOrEmptyString","validBoolean","bool","validNumber","num","sanitizePath","path","replace","calculateTimeWithUndefined","time","undefined","Math","round","calculateTime","getCurrentTimestamp","Date","now","getDurationFromTimestampToNow","timestamp","generateUUID","random","toString","getCookie","cname","ca_1","document","cookie","split","charAt","substring","indexOf","noOp","getCustomDataString","customData","JSON","stringify","String","transferCustomDataFields","fromConfig","toConfig","customDataFieldCount","customDataField","getDocumentPropWithPrefix","prop","pascalCase","toUpperCase","prefixes_1","prefix","isVideoInFullscreen","fullscreenProp","nodeName","getHiddenProp","getPageLoadType","hiddenProp","PAGE_LOAD_TYPE","BACKGROUND","FOREGROUND","getHostnameAndPathFromUrl","url","domElement","createElement","href","hostname","pathname","calculatePercentage","numerator","denominator","getBrowserInfo","tem","ua","navigator","userAgent","M","match","test","version","exec","appName","appVersion","splice","getURLResourceName","pop","joinUrls","args","reduce","prev","current","endsWith","substr","startsWith","suffix","Event","Player","ErrorCode_1","PlayerSize_1","FeatureManager_1","CustomDataValues_1","CodecHelper_1","Logger_1","Settings","Utils","Version_1","AdAnalytics_1","BackendFactory_1","EventDispatcher_1","NoOpBackend_1","SessionPersistenceHandler_1","Analytics","config","adapter","backendFactory","_this","BackendFactory","pageLoadTime","playerStartupTime","videoStartupTime","autoplay","droppedSampleFrames","startupTime","featureManager","FeatureManager","onErrorDetailEventDispatcher","EventDispatcher","authenticationCallback","authenticationCompleted","success","featureConfigs","configureFeatures","guardAgainstMissingVideoTitle","oldConfig","newConfig","title","guardAgainstMissingIsLive","isLive","sourceChange","getMergedAnalyticsConfig","setCustomDataOnce","values","__assign","setState","changeCustomData","sendAnalyticsRequestAndClearValues","setConfigParameters","setCustomData","getCurrentImpressionId","sample","impressionId","getUserId","sessionHandler","userId","input","retVal","customDataValuesKeys","forEach","that","buildDefaultAnalyticsConfigValues","errorDetailTrackingSettingsProvider","domain","getDomain","licenseKey","_a","collectorConfig","SessionPersistenceHandler","licenseKeyReceivedUnsubscriber","onLicenseKeyReceived","subscribe","eventArgs","setupSample","init","setupStateMachineCallbacks","features","initialize","registerFeatures","adModule","adAnalytics","AdAnalytics","checkForErrorsInConfig","VERSION","getPlayerInformationFromAdapter","player","getPlayerName","getPlayerVersion","playerTech","getPlayerTech","updateSamplesToCastClientConfig","samples","castClientConfig","samples_1","updateSampleToCastClientConfig","language","supportsDeferredLicenseLoading","debug","resetFeatures","backend","createBackend","generateNewImpressionId","setUserId","videoCompletionTracker","reset","clearResetQualityChangeInterval","resetQualityChangeCount","release","NoOpBackend","playerKey","getDomainFromConfig","location","cdnProvider","videoId","videoTitle","customUserId","experimentName","stateMachineCallbacks","setup","duration","state","analyticsVersion","setDuration","performance","timing","loadTime","navigationStart","startup","supportedVideoCodecs","CodecHelper","supportedVideoFormats","getAutoPlay","drmPerformance","getDrmPerformanceInfo","drmType","drmLoadTime","playing","played","setCompletionValues","unload","videoStartForClosedState","videoTimeStart","sendUnloadRequest","videoTimeEnd","setVideoTimeStart","setVideoTimeEnd","clearValues","heartbeat","sampleData","qualitychange","sendQualityChange","qualitychange_pause","qualitychange_rebuffering","videoChange","event","setVideoTimeEndFromEvent","setVideoTimeStartFromEvent","setPlaybackVideoPropertiesFromEvent","audioChange","setPlaybackAudioPropertiesFromEvent","audiotrack_changing","pause","paused","paused_seeking","seeked","end_play_seeking","rebuffering","buffered","videoStartFailed","sendRequest","videoStartFailedReason","reason","errorCode","code","errorMessage","message","dispatch","errorData","legacyData","segmentNames","segments","map","errorSegments","onError","data","ad","mute","isMuted","unMute","subtitle_changing","currentTime","manualSourceChange","resetSourceRelatedState","playlistTransition","initialSourceChange","end","customdatachange","width","videoPlaybackWidth","height","videoPlaybackHeight","bitrate","videoBitrate","codec","videoCodec","audioBitrate","audioCodec","setPlaybackInfoFromAdapter","info","getCurrentPlaybackInfo","getIsLiveFromConfigOrPlaybackInfo","size","videoDuration","streamFormat","mpdUrl","m3u8Url","progUrl","videoWindowWidth","videoWindowHeight","screenHeight","screenWidth","isCasting","castTech","audioLanguage","subtitleEnabled","subtitleLanguage","droppedFrames","max","platform","pageLoadType","userLanguage","screen","PlayerSize","Window","completedTotal","sendAnalyticsRequest","downloadSpeedInfo","copySample","sendAnalyticsRequestSynchronous","sendRequestSynchronous","completed","isLiveFromPlayback","getMergedCollectorConfig","mergedCollectorConfig","enabled","origin","addWatched","start","getCompletionPercentage","Number","isNaN","resetQualityChangeCountIntervalId","setInterval","ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL","increaseQualityChangeCount","isQualityChangeEventEnabled","ErrorCode","QUALITY_CHANGE_THRESHOLD_EXCEEDED","clearInterval","LICENSE_CALL_PENDING_TIMEOUT","PAGE_LOAD_TYPE_TIMEOUT","CAST_RECEIVER_CONFIG_MESSAGE","Adapter","guardAgainstNotInitializedAnalytics","analytics","internalAdapter","hasPlayerAlreadyBeenAugmented","__bitmovinAnalyticsHasBeenSetup","markPlayerInstanceAsAugmented","MESSAGE_NAMESPACE","ANALYTICS_BACKEND_BASE_URL","ANALYTICS_LICENSECALL_TIMEOUT","ANALYTICS_VIDEOSTART_TIMEOUT","ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD","ANALYTICS_REBUFFER_TIMEOUT","ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD","Http_1","Settings_1","Utils_1","ErrorDetailBackend","_queue","_enabled","backendUrl","copyErrorDetailTruncateStringsAndUrls","errorDetail","maxStringLength","maxUrlLength","copyErrorDataTruncateStrings","httpRequests","_b","request","copyHttpRequestTruncateUrls","httpRequest","maxLength","lastRedirectLocation","exceptionMessage","additionalData","copyErrorDetailTruncateHttpRequests","maxRequests","limitHttpRequestsOfQueuedErrorDetails","index","send","errorDetailCopy","MAX_STRING_LENGTH","MAX_URL_LENGTH","post","push","flush","copy","element","shift","removeFromQueue","clear","findIndex","ErrorDetailTracking","_super","settingsProvider","subscribables","httpRequestTracking","errorIndex","onErrorHandler","isEnabled","httpRequestsCopy","errorId","exceptionStacktrace","subscribable","__extends","disabled","disable","unsubscribe","configured","authenticated","numberOfHttpRequests","configure","extractConfig","configContainer","errorDetails","Feature","MP4","WEBM","HLS","DASH","MIMETypes","getMIMETypeFromFileExtension","toLowerCase","Event_1","StateMachineCallbacks_1","WindowEventTracker_1","InternalAdapter","opts","defaultStateMachineCallbacks","_onLicenseKeyReceived","_onLicenseCallFailed","drmPerformanceInfo","previousVideoBitrate","previousAudioBitrate","qualityChangeCount","_windowEventTracker","WindowEventTracker","eventCallback","eventType","eventObject","stateMachine","callEvent","starttime","segmentsDownloadCount","segmentsDownloadSize","segmentsDownloadTime","avgDownloadSpeed","minDownloadSpeed","maxDownloadSpeed","avgTimeToFirstByte","resetIntervals","getCommonPlaybackInfo","clearSegments","previousState","currentState","CUSTOM_DATA_CHANGE","shouldAllowVideoQualityChange","newBitrate","setPreviousVideoBitrate","shouldAllowAudioQualityChange","setPreviousAudioBitrate","isAudioMuted","playerIsMuted","currentVolume","BITMOVIN_PLAYER_LICENSING_ERROR","SETUP_MISSING_LICENSE_WHITELIST","BUFFERING_TIMEOUT_REACHED","VIDEO_STARTUP_TIMEOUT_REACHED","StateMachine","Result","SUCCEEDED","NOTRANSITION","CANCELLED","PENDING","Error","INVALID_TRANSITION","PENDING_TRANSITION","INVALID_CALLBACK","WILDCARD","ASYNC","cfg","target","initial","terminal","fsm","events","callbacks","transitions","add","e","from","isArray","to","buildEvent","is","can","transition","cannot","concat","isFinished","states","keys","sort","defer","doCallback","func","beforeAnyEvent","afterAnyEvent","leaveAnyState","enterAnyState","changeState","beforeThisEvent","afterThisEvent","leaveThisState","enterThisState","beforeEvent","afterEvent","leaveState","specific","general","enterState","cancel","leave","VideoStartFailedReason_1","REBUFFERING_HEARTBEAT_INTERVALS","AnalyticsStateMachine","onEnterStateTimestamp","videoStartupTimeoutMs","rebufferTimeoutMs","currentRebufferingIntervalIndex","createStateMachine","clearVideoStartTimeout","clearRebufferingTimeoutHandle","clearRebufferingHeartbeatHandle","startRebufferingHeartbeatInterval","resetRebufferingHelpers","startRebufferingTimeoutHandle","rebufferingHeartbeatIntervalHandle","getTime","stateDuration","min","rebufferingTimeoutHandle","setTimeout","ERROR","clearTimeout","getVideoStartupFailedEventData","getReasonForVideoStartFailure","VideoStartFailedReason","PLAYER_ERROR","UNLOAD","PAGE_CLOSED","VIDEOSTART_TIMEOUT","TIMEOUT","UNKNOWN","setVideoStartTimeout","videoStartTimeout","HTML5AnalyticsStateMachine_1","VideoCompletionTracker_1","MIMETypes_1","Player_1","StreamTypes_1","HTML5InternalAdapter","mediaElement","onBeforeUnLoadEvent","previousMutedValue","HTML5","Infinity","initializeStateMachine","mediaElEventHandlers","bufferingTimeout","isBuffering","lastIsLiveStatus","isPaused","isSeeking","previousMediaTime","previousClientTime","needsReadyEvent","needsFirstPlayIntent","mediaElementSet","default","setMediaElement","registerWindowEvents","getStreamSources","getStreamType","getStreamURL","Fullscreen","muted","qualityInfo","getCurrentQualityLevelInfo","unregisterMediaElement","registerMediaElement","onMaybeReady","getMIMEType","streamUrl","mimetype","getStreamTypeFromMIMEType","src","resetMedia","listenToMediaElementEvent","READY","readyState","checkQualityLevelAttributes","setVideoDuration","PLAY","onPaused","volume","MUTE","UN_MUTE","SEEK","SEEKED","TIMECHANGED","checkSeeking","checkPlayheadProgress","onBuffering","handler","boundHandler","addEventListener","item","removeEventListener","START_BUFFERING","PAUSE","windowEventTracker","onPageClose","ended","BUFFERING_TIMECHANGED_TIMEOUT","silent","qualityLevelInfo","eventData","VIDEO_CHANGE","getSelectedSubtitleFromMediaElement","textTracks","textTrackList_1","attr","isSubtitleDisplayed","HTML5AnalyticsStateMachine","SETUP","currentVideoTime","mediaTimeDif","abs","clientTimeDif","body","callback","async","xhttp","legacyMode","XDomainRequest","XMLHttpRequest","responseCallback","DONE","responseText","sampleResponse","parse","onload","onreadystatechange","open","setRequestHeader","sendAdRequest","TimespanOverlappingType","VideoCompletionTracker","watched","overlappingTimespan","mergeWatched","getDuration","w","time1","k","time2","overlapType","getOverlappingType","Overlapping","mergeAndReplace","getOverlappingTimespan","FirstContainedInSecond","SecondContainedInFirst","None","first","second","isMomentInTimespan","moment","timespan","firstIndex","secondIndex","newWatchedTimespan","filter","EventDebugging","CastTech","getSourceInfoFromBitmovinSourceConfig","progressive","progBitrate","playbackVideoData","getPlaybackVideoData","progressiveArrayIndex","id","Converter_1","Measure_1","DownloadSpeedMeter","measures","addMeasurement","measurement","httpStatus","measure","Measure","threshhold","Converter","bitsToBytes","speed","getInfo","ceil","totalTime","avgSpeed","minSpeed","maxSpeed","a","b","totalSpeed","speeds","numMeasurements","bytePerSecondToBitPerSecond","bps","bytesToBits","avg","timeToFirstByte","State","AnalyticsStateMachine_1","MANUAL_SOURCE_CHANGE","seekStartedAt","getAllStates","getAllStatesBut","INITIALIZED","eventName","END","SOURCE_CHANGING","STARTUP","EXIT_BEFORE_VIDEOSTART","END_BUFFERING","AUDIO_CHANGE","PLAYING","REBUFFERING","PAUSED_SEEKING","QUALITYCHANGE","QUALITYCHANGE_PAUSE","SUBTITLE_CHANGE","SUBTITLE_CHANGING","AUDIOTRACK_CHANGED","AUDIOTRACK_CHANGING","START_AD","AD","END_AD","MUTING_READY","MUTING_PLAY","MUTING_PAUSE","START_CAST","CASTING","END_CAST","SOURCE_LOADED","QUALITYCHANGE_REBUFFERING","CUSTOMDATACHANGE","PLAYLIST_TRANSITION","onenterstate","startCasting","onafterevent","FINISH_QUALITYCHANGE_PAUSE","FINISH_QUALITYCHANGE","FINISH_QUALITYCHANGE_REBUFFERING","FINISH_MUTING","onleavestate","fnName","shouldSendSample","seekDuration","callbackFunction","onseek","ontimechanged","onplayerError","mapping","mimeType","Bitmovin7Adapter_1","Bitmovin7Adapter","Bitmovin8Adapter_1","Bitmovin8Adapter","CAFv3Adapter_1","CAFv3Adapter","DashjsAdapter_1","DashjsAdapter","HlsAdapter_1","HlsAdapter","HTMLVideoElementAdapter_1","HTMLVideoElementAdapter","ShakaAdapter_1","ShakaAdapter","VideoJsAdapter_1","VideojsAdapter","CDNProvider_1","CdnProvider","AnalyticsModule","hooks","getConfig","Promise","resolve","analyticsModuleInstance","analyticsModule","PlayerModule","adapters","Analytics_1","Adapter_1","Bitmovin7InternalAdapter_1","augment","originalSetup","playerSetupPromise","analyticsConfig","Bitmovin7InternalAdapter","wrapPlayerLoad","originalLoad","load","unregisterFeatures","feature","constructor","videoFormatCodecMap","avc","vp9","av1","hevc","getOwnPropertyNames","format","some","isCodecSupported","MediaSource","isTypeSupported","AdQuartile","AdAnalyticsSample_1","AdBreakSample_1","AdSample_1","ViewportTracker_1","adManifestLoadedEvents","isPlaying","adPodPosition","adCallbacks","onAdStarted","onAdFinished","onAdBreakStarted","onAdBreakFinished","onAdClicked","onAdError","onAdManifestLoaded","onPlay","onPause","onBeforeUnload","onAdSkipped","onAdQuartile","viewportTracker","ViewportTracker","getContainer","onIntersectionChanged","clearCurrentTimeInterval","dispose","activeAdSample","isContainerInViewport","enterViewportTimestamp","timeInViewport","isInViewport","isLinearAdActive","beginPlayingTimestamp","updatePlayingTime","adTagConfig","adConfig","tag","type","AdBreakSample","adBreak","activeAdBreakSample","getAdManifestLoadedEvent","adStartupTimestamp","resetActiveAd","isLinear","AdSample","adStartupTime","startAd","adSample","completeAd","adDuration","skipped","skipPosition","skipPercentage","errorPosition","adBreakSample","ads","includes","adId","errorPercentage","onAdLinearityChanged","adClickthroughUrl","clickThroughUrl","clicked","clickPosition","clickPercentage","quartile","FIRST_QUARTILE","quartile1","MIDPOINT","midpoint","THIRD_QUARTILE","quartile3","closed","closePosition","closePercentage","createNewAdAnalyticsSample","analyticsSample","moduleInfo","getAdModuleInfo","AdAnalyticsSample","adModuleVersion","find","adImpressionId","percentageInViewport","timePlayed","started","currentTimeInterval","TIMEOUT_CURRENT_TIME_INTERVAL","exitPosition","playPercentage","MODULE_NAME","videoImpressionId","adManifestLoadedEvent","adFallbackIndex","manifestDownloadTime","downloadTiming","downloadTime","adReplaceContentDuration","replaceContentDuration","currentFallbackIndex","adBreakConfig","position","adPosition","adOffset","adPreloadOffset","preloadOffset","adIsPersistent","persistent","fallbackTags","adTagType","adTagUrl","adTagDetails","adTagServer","adTagPath","adScheduleTime","scheduleTime","adIdPlayer","mediaUrl","mediaFileUrl","mediaUrlDetails","mediaPath","mediaServer","adPlaybackHeight","adPlaybackWidth","adSystem","advertiser","advertiserName","apiFramework","creative","creativeAdId","creativeId","universalAdId","universalAdIdRegistry","idRegistry","universalAdIdValue","adDescription","minSuggestedDuration","survey","surveyUrl","uri","adTitle","wrapperAdsCount","wrapperAdIds","linearAd","adSkippableAfter","parseSkipAfter","skippableAfter","adSkippable","skippable","skipAfter","threshold","inViewport","options","rootMargin","observer","IntersectionObserver","entries","handleIntersect","observe","hidden","visibilityChange","handleVisibilityChange","isHidden","unobserve","disconnect","intersectionRatio","LicenseCall_1","DebuggingBackend_1","LicenseCheckingBackend_1","LongPlaytimeFilteringBackend_1","SequenceNumberBackend_1","licensingRequest","inner","createInnerBackend","decorateWithDebuggingBackend","DebuggingBackend","decorateWithBackendFromConfigIfAvailable","innerBackend","wrapBackend","LicenseCheckingBackend","LicenseCall","sequenceNumberAssigningBackend","SequenceNumberBackend","LongPlaytimeFilteringBackend","baseUrl","licenseServerUrl","response","underlying","debugFields","printFields","fields_1","f","LicensingRequest_1","QueueBackend_1","RemoteBackend_1","licenseCall","backendBaseUrl","licenseKeyReceived","licenseLazyLoadingTimeoutHandle","unsubscribeFromAdapter","promise","wrapLicenseCheckPromiseWithCallback","performLicenseCheck","licenseCallFailed","licenseLazyLoadingTimeout","QueueBackend","onLicenseCallFailed","status","LicensingResult","Denied","then","result","Granted","remoteBackend","RemoteBackend","flushTo","catch","err","queue","unloadQueue","syncQueue","adQueue","AnalyticsCall_1","hasAdModule","analyticsCall","AnalyticsCall","Utils_2","analyticsServerUrl","adAnalyticsServerUrl","trySendBeacon","getAnalyticsServerUrl","fallbackFunction","sendBeacon","getAdAnalyticsServerUrl","next","isPlayedAboveThreshold","sequenceNumber","updateSampleBeforeSending","BITMOVIN_ANALYTICS_UUID_COOKIE_NAME","cookiesEnabled","cookiesDomain","ensureNoCookiePresent","setupUserId","createAndSetNewUserId","generatedId","writeCookie","Bitmovin7AnalyticsStateMachine_1","CastTech_1","ErrorDetailBackend_1","ErrorDetailTracking_1","BitmovinProgressiveSourceHelper_1","BITMOVIN","getPlayerType","Bitmovin7AnalyticsStateMachine","register","errorDetailSubscribable","playback","isFullscreen","getFigure","offsetWidth","offsetHeight","getAudio","lang","isReady","getDroppedFrames","applySubtitleProperties","applyPlaybackQualityProperties","applySourceProperties","applyCastingProperties","addEventHandler","EVENT","ON_SOURCE_UNLOADED","SOURCE_UNLOADED","getCurrentTime","ON_SOURCE_LOADED","ON_READY","ON_CAST_STARTED","ON_CAST_STOPPED","ON_PLAY","ON_PAUSED","ON_TIME_CHANGED","ON_SEEK","ON_SEEKED","ON_STALL_STARTED","ON_STALL_ENDED","ON_AUDIO_PLAYBACK_QUALITY_CHANGED","quality","getPlaybackAudioData","ON_VIDEO_PLAYBACK_QUALITY_CHANGED","ON_FULLSCREEN_ENTER","START_FULLSCREEN","ON_FULLSCREEN_EXIT","END_FULLSCREEN","ON_AD_STARTED","ON_AD_FINISHED","ON_MUTED","ON_UNMUTED","ON_ERROR","ON_PLAYBACK_FINISHED","PLAYBACK_FINISHED","ON_DOWNLOAD_FINISHED","downloadType","ON_AUDIO_CHANGED","ON_SUBTITLE_CHANGED","handlePageClose","on","ON_DESTROY","source","dash","hls","progSourceInfo","subtitle","getSubtitle","videoQuality","audioQuality","isAirplayActive","AirPlay","remoteControlConfig","remotecontrol","GoogleCast","WebSocket","EventDebugging_1","debuggingStates","enabledDebugging","pausedTimestamp","seekTimestamp","seekedTimestamp","seekedTimeout","seekStarted","seekEnded","PLAY_SEEKING","END_PLAY_SEEKING","onpause","onbeforeevent","elapsedTime","PAUSE_SEEK_DELAY","PLAY_SEEK","SEEKED_PAUSE_DELAY","addStatesToLog","onseeked","getStates","setEnabledDebugging","_config","_isEnabled","payload","source_changing","ready","casting","muting_ready","trackedObjects","obj","Bitmovin8InternalAdapter_1","playerConfig","Bitmovin8InternalAdapter","ViewMode","Bitmovin8AnalyticsStateMachine_1","DownloadSpeedMeter_1","SegmentTracker_1","HttpRequestTracking_1","AnalyticsSettings","Bitmovin8AdModule_1","Bitmovin8HttpRequestTrackingAdapter_1","Bitmovin8SegmentTrackerAdapter_1","Bitmovin8SpeedMeterAdapter_1","InternalAdapter_1","Bitmovin8AnalyticsStateMachine","speedMeter","Bitmovin8SpeedMeterAdapter","getDownloadSpeedMeter","segmentTracker","Bitmovin8SegmentTrackerAdapter","SegmentTracker","getSegmentTracker","httpRequestTrackingAdapter","Bitmovin8HttpRequestTrackingAdapter","getSegments","_adModule","isAdPlaying","lastTrackedCurrentTime","currentAd","getActiveAd","registerPlayerEventListeners","registerUnloadEventListeners","Bitmovin8AdModule","requestTracking","HttpRequestTracking","getViewMode","getSource","getDroppedVideoFrames","PlayerEvent","SourceUnloaded","SourceLoaded","CastStarted","CastStopped","Play","issuer","Playing","Paused","TimeChanged","Seek","allowSeeking","Seeked","StallStarted","StallEnded","AudioPlaybackQualityChanged","VideoPlaybackQualityChanged","ViewModeChanged","AdStarted","AdFinished","AdSkipped","AdError","Muted","Unmuted","PlaybackFinished","DownloadFinished","AudioChanged","SubtitleEnabled","SubtitleDisabled","LicenseValidated","handleCollectorUnload","Destroy","enabledSubtitle","subtitles","list","seekEvent","seekTarget","INITIAL_SOURCE_CHANGE","AD_STARTUP","AD_READY","AD_PAUSE","AD_PLAYING","lastTrackedVideoEndObject","bytes","bits","bytesToKiloBytes","kiloBytesToMegaBytes","kiloByte","download","addSegment","segment","removeSegment","Queue_1","_maxRequests","DEFAULT_MAX_REQUESTS","_httpRequestQueue","Queue","onDownloadFinishedHandler","addRequest","items","limit","offer","_items","poll","maxElements","AdModuleAPI_1","AdCallbacks","getModuleInfo","AdBreakStarted","AdBreakFinished","AdClicked","AdManifestLoaded","HttpRequestType_1","eventDispatcher","playerExports","onDownloadFinished","_c","mapHttpRequestType","HttpRequestType","MANIFEST_DASH","MANIFEST_HLS_MASTER","MANIFEST_HLS_VARIANT","MANIFEST_SMOOTH","MANIFEST_ADS","MEDIA_AUDIO","MEDIA_VIDEO","MEDIA_SUBTITLES","MEDIA_THUMBNAILS","DRM_LICENSE_WIDEVINE","DRM_LICENSE_PLAYREADY","DRM_LICENSE_FAIRPLAY","DRM_LICENSE_PRIMETIME","DRM_LICENSE_CLEARKEY","DRM_CERTIFICATE_FAIRPLAY","KEY_HLS_AES","TIME_SYNC","handleSegmentPlaybackEvent","handleOnDownloadFinishEvent","SegmentPlayback","meter","CAFv3InternalAdapter_1","CAFv3InternalAdapter","context","CHROMECAST_SHAKA","currentItem","playerManager","getPlayerManager","cast","framework","getCurrentTimeSec","stats","getStats","mediaInformation","streamType","activeAudioTrack","trackContentType","activeTextTracks","audioTracksManager","getAudioTracksManager","getActiveTrack","textTracksManager","getTextTracksManager","getActiveTracks","queueManager","getQueueManager","getCurrentItem","media","currentMediaTime","detailedErrorCode","DashjsInternalAdapter_1","DashjsInternalAdapter","mediaPlayer","DASHJS","getVersion","videoEl","canPlay","getVideoElement","registerMediaElementEventsForDashJS","currentVideoQuality","getBitrateInfoListFor","getQualityFor","HlsInternalAdapter_1","HlsInternalAdapter","HlsSpeedMeterAdapter_1","HLSJS","levels","currentLevel","currentLevelObj","details","live","HlsSpeedMeterAdapter","registerHlsEvents","Events","MEDIA_ATTACHING","onMediaAttaching","MEDIA_DETACHING","onMediaDetaching","MANIFEST_LOADING","onManifestLoading","AUDIO_TRACK_SWITCHED","onAudioTrackSwitched","SUBTITLE_TRACK_SWITCH","onSubtitleLanguageSwitched","DESTROYING","onHlsError","selectedSubtitle","getSelectedSubtitleLanguage","getSelectedAudioLanguage","errorName","fatal","getErrorCodeFromHlsErrorType","audioTrack","audioTracks","subtitleDisplay","subtitleTrack","subtitleTracks","subtitleTrackController","FRAG_LOADED","handleFragmentLoadedEvent","frag","tload","trequest","total","tfirst","networkDetails","HTMLVideoElementInternalAdapter_1","HTMLVideoElementInternalAdapter","browserInfo","currentSrc","videoWidth","videoHeight","ShakaInternalAdapter_1","ShakaInternalAdapter","reject","__awaiter","sent","error_1","category","severity","getMediaElement","onUnloading","SHAKA","videoElement","onStateChangeEventListener_1","getAssetUri","activeVideoTrack","getVariantTracks","track","active","videoBandwidth","bandwidth","VideojsInternalAdapter_1","VideojsInternalAdapter","VideoJsAnalyticsStateMachine_1","SubtitleInfo_1","_subtitleInfo","previousTime","videojs","VIDEOJS","VideojsAnalyticsStateMachine","currentType","selectedAudioLanguage","getSelectedAudioTrackLanguage","codecInfo","getCodecInfo","tech","IWillNotUseThisInPlugins","getSubtitleInfo","seeking","newSubtitleInfo","hasInfoChanged","isDifferentSubtitleInfo","newSelectedAudioLanguage","vhs","mediaAttributes","getMediaAttributes","textTracks_1","sourceHandler","playlists","selectedPlaylist","attributes","BANDWIDTH","RESOLUTION","codecs","CODECS","isVideoCodec","isAudioCodec","AUDIOTRACK_CHANGED_PLAYING","SUBTITLE_CHANGED_PLAYING","FINISH_AUDIOTRACK_CHANGING","FINISH_SUBTITLE_CHANGING","videoCodecs","audioCodecs","info1","info2"],"mappings":";;;;;;;;;;CAAA,SAAAA,EAAAC,GACA,iBAAAC,SAAA,iBAAAC,OACAA,OAAAD,QAAAD,IACA,mBAAAG,eAAAC,IACAD,OAAA,GAAAH,GACA,iBAAAC,QACAA,QAAA,UAAAD,KAEAD,EAAA,SAAAA,EAAA,aAA2CA,EAAA,mBAAAC,KAR3C,CASCK,OAAA,WACD,mBCTA,IAAAC,EAAA,GAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAP,QAGA,IAAAC,EAAAI,EAAAE,GAAA,CACAC,EAAAD,EACAE,GAAA,EACAT,QAAA,IAUA,OANAU,EAAAH,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAQ,GAAA,EAGAR,EAAAD,QA0DA,OArDAM,EAAAM,EAAAF,EAGAJ,EAAAO,EAAAR,EAGAC,EAAAQ,EAAA,SAAAd,EAAAe,EAAAC,GACAV,EAAAW,EAAAjB,EAAAe,IACAG,OAAAC,eAAAnB,EAAAe,EAAA,CAA0CK,YAAA,EAAAC,IAAAL,KAK1CV,EAAAgB,EAAA,SAAAtB,GACA,oBAAAuB,eAAAC,aACAN,OAAAC,eAAAnB,EAAAuB,OAAAC,YAAA,CAAwDC,MAAA,WAExDP,OAAAC,eAAAnB,EAAA,cAAiDyB,OAAA,KAQjDnB,EAAAoB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAAnB,EAAAmB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFAxB,EAAAgB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAAnB,EAAAQ,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAvB,EAAA2B,EAAA,SAAAhC,GACA,IAAAe,EAAAf,KAAA2B,WACA,WAA2B,OAAA3B,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAK,EAAAQ,EAAAE,EAAA,IAAAA,GACAA,GAIAV,EAAAW,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD7B,EAAAgC,EAAA,mFAIAhC,IAAAiC,EAAA,sUCjFA,IAAAC,EAAA,WACE,SAAAA,EAAYC,QAAA,IAAAA,OAAA,GACTC,KAAaD,SAAWA,EA8C7B,OA3CSD,EAAAJ,UAAAO,WAAP,SAAkBC,GACfF,KAAaD,SAAWG,GAGpBJ,EAAAJ,UAAAS,UAAP,WACE,OAAQH,KAAaD,UAGhBD,EAAAJ,UAAAU,IAAP,SAAWC,OAAa,IAAAC,EAAA,GAAAC,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,IAAAD,EAAAC,EAAA,GAAAC,UAAAD,GAChBP,KAAaD,UAInBW,QAAQN,IAAGO,MAAXD,QAAOE,EAAA,CAAKP,GAAQC,KAGfR,EAAAJ,UAAAmB,SAAP,SAAgBC,GACdJ,QAAQK,MAAMD,IAGThB,EAAAJ,UAAAsB,mBAAP,SAA0BX,OAAa,IAAAC,EAAA,GAAAC,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,IAAAD,EAAAC,EAAA,GAAAC,UAAAD,GACrCG,QAAQO,MAAKN,MAAbD,QAAOE,EAAA,CAAOP,GAAQC,KAGjBR,EAAAJ,UAAAuB,MAAP,SAAaZ,OAAyB,IAAAC,EAAA,GAAAC,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,IAAAD,EAAAC,EAAA,GAAAC,UAAAD,GAC9BP,KAAaD,UAInBW,QAAQO,MAAKN,MAAbD,QAAOE,EAAA,CAAOP,GAAQC,KAGjBR,EAAAJ,UAAAwB,QAAP,SAAeb,GACPL,KAAaD,UAInBW,QAAQS,KAAKd,IAGRP,EAAAJ,UAAA0B,qBAAP,SAA4Bf,OAAa,IAAAgB,EAAA,GAAAd,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,IAAAc,EAAAd,EAAA,GAAAC,UAAAD,GACvCG,QAAQS,KAAIR,MAAZD,QAAOE,EAAA,CAAMP,GAAQgB,KAEzBvB,EAhDA,GAkDaxC,EAAAgE,SAAW,SAACC,EAAyBd,GAEhD,OAAQc,EADO,IAAIC,MAAMf,GAAQgB,KAAK,MAChBC,MAAM,EAAGjB,IAGpBnD,EAAAqE,OAAS,IAAI7B,6iBCxD1B,IAAA8B,EAAAhE,EAAA,IACAiE,EAAAjE,EAAA,IAIaN,EAAAwE,YAAc,SAACC,GAC1B,OAAe,MAARA,GAAgC,iBAATA,GAGnBzE,EAAA0E,oBAAsB,SAACD,GAClC,OAAe,MAARA,GAA+B,iBAARA,GAAoC,IAAhBA,EAAKtB,QAG5CnD,EAAA2E,aAAe,SAACC,GAC3B,OAAe,MAARA,GAAgC,kBAATA,GAGnB5E,EAAA6E,YAAc,SAACC,GAC1B,OAAc,MAAPA,GAA8B,iBAARA,GAGlB9E,EAAA+E,aAAe,SAACC,GAC3B,OAAOA,EAAKC,QAAQ,OAAQ,KAIjBjF,EAAAkF,2BAA6B,SAACC,GACzC,YAAaC,IAATD,EACKA,GAETA,GAAc,IACPE,KAAKC,MAAMH,KAGPnF,EAAAuF,cAAgB,SAACJ,GAE5B,OADAA,GAAc,IACPE,KAAKC,MAAMH,IAMPnF,EAAAwF,oBAAsB,WACjC,OAAOC,KAAKC,OAGD1F,EAAA2F,8BAAgC,SAACC,GAC5C,OAAO5F,EAAAwF,sBAAwBI,GAGpB5F,EAAA6F,aAAe,WAC1B,MAAO,uCAAuCZ,QAAQ,QAAS,SAACpE,GAE9D,IAAMS,EAAqB,GAAhB+D,KAAKS,SAAiB,EAGjC,OADgB,MAANjF,EAAYS,EAAS,EAAJA,EAAW,GAC7ByE,SAAS,OAIT/F,EAAAgG,UAAY,SAACC,GAGxB,IAFA,IAAMlF,EAAOkF,EAAQ,IAEPhD,EAAA,EAAAiD,EADHC,SAASC,OAAOC,MAAM,KACnBpD,EAAAiD,EAAA/C,OAAAF,IAAI,CAChB,IADG,IAAIpC,EAACqF,EAAAjD,GACe,MAAhBpC,EAAEyF,OAAO,IACdzF,EAAIA,EAAE0F,UAAU,GAElB,GAAwB,IAApB1F,EAAE2F,QAAQzF,GACZ,OAAOF,EAAE0F,UAAUxF,EAAKoC,OAAQtC,EAAEsC,QAGtC,MAAO,IAGInD,EAAAyG,KAAO,aAEPzG,EAAA0G,oBAAsB,SAACC,GAClC,MAA0B,iBAAfA,EACFC,KAAKC,UAAUF,GACS,mBAAfA,EACT3G,EAAA0G,oBAAoBC,UACI,IAAfA,EACTA,EACwB,iBAAfA,EACTG,OAAOH,GAGTA,GAGI3G,EAAA+G,yBAA2B,SAACC,EAA8BC,GACrE,IAAK,IAAIzG,EAAI,EAAGA,GAAK+D,EAAgB2C,qBAAsB1G,IAAK,CAC9D,IAAM2G,EAAkB,aAAa3G,EACrCyG,EAASE,GAAmBnH,EAAA0G,oBAAoBM,EAAWG,MAIlDnH,EAAAoH,0BAA4B,SAACC,GAExC,GAAIA,KAAQlB,SACV,OAAOkB,EAIT,IADA,IAAMC,EAAaD,EAAKf,OAAO,GAAGiB,cAAgBF,EAAKjD,MAAM,GACxCnB,EAAA,EAAAuE,EANJ,CAAC,SAAU,MAAO,KAAM,KAMpBvE,EAAAuE,EAAArE,OAAAF,IAAU,CAA1B,IAAMwE,EAAMD,EAAAvE,GACf,GAAIwE,EAASH,KAAcnB,SACzB,OAAOsB,EAASH,IAMTtH,EAAA0H,oBAAsB,WACjC,IAAMC,EAAiB3H,EAAAoH,0BAA0B,qBACjD,YAA0BhC,IAAnBuC,GAAgCxB,SAASwB,IAAyD,UAAtCxB,SAASwB,GAAgBC,UAGjF5H,EAAA6H,cAAgB,WAC3B,OAAO7H,EAAAoH,0BAA0B,WAGnCpH,EAAA8H,gBAAA,WACE,IAAMC,EAAa/H,EAAA6H,gBACnB,OAAkB,MAAdE,IAA+C,IAAzB5B,SAAS4B,GAC1BzD,EAAA0D,eAAeC,WAEjB3D,EAAA0D,eAAeE,YAGXlI,EAAAmI,0BAA4B,SAACC,GACxC,IAAMC,EAAalC,SAASmC,cAAc,KAG1C,OAFAD,EAAWE,KAAOH,EAEX,CAACI,SAAUH,EAAWG,SAAUxD,KAAMqD,EAAWI,WAG7CzI,EAAA0I,oBAAsB,SAACC,EAAoBC,GACtD,QAAoBxD,IAAhBwD,GAA6C,IAAhBA,EAGjC,OAAOvD,KAAKC,OAAQqD,GAAa,GAAKC,EAAe,MAI1C5I,EAAA6I,eAAiB,WAC5B,IACEC,EADEC,EAAKC,UAAUC,UAEjBC,EAAIH,EAAGI,MAAM,iEAAmE,GAClF,MAAI,WAAWC,KAAKF,EAAE,IAEb,CAACnI,KAAM,KAAMsI,SADpBP,EAAM,kBAAkBQ,KAAKP,IAAO,IACH,IAAM,IAE5B,WAATG,EAAE,IAEO,OADXJ,EAAMC,EAAGI,MAAM,wBACS,CAACpI,KAAM+H,EAAI,GAAG7D,QAAQ,MAAO,SAAUoE,QAASP,EAAI,KAE9EI,EAAIA,EAAE,GAAK,CAACA,EAAE,GAAIA,EAAE,IAAM,CAACF,UAAUO,QAASP,UAAUQ,WAAY,MACzB,OAAtCV,EAAMC,EAAGI,MAAM,qBAA6BD,EAAEO,OAAO,EAAG,EAAGX,EAAI,IAC7D,CAAC/H,KAAMmI,EAAE,GAAIG,QAASH,EAAE,MAIpBlJ,EAAA0J,mBAAqB,SAACtB,GACjC,OAAmB,IAAfA,EAAIjF,OACC,GAEFiF,EAAI/B,MAAM,KAAKsD,OAAS,IAGpB3J,EAAA4J,SAAW,eAAC,IAAAC,EAAA,GAAA5G,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,IAAA4G,EAAA5G,GAAAC,UAAAD,GACvB,OAAO4G,EAAKC,OAAO,SAACC,EAAMC,GAGxB,OAFqBhK,EAAAiK,SAASF,EAAM,WAAoB3E,IAAZ4E,EAAwBD,EAAKG,OAAO,EAAGH,EAAK5G,OAAS,GAAK4G,GAEhF,KADD/J,EAAAmK,WAAWH,EAAS,KAAOA,EAAQE,OAAO,GAAKF,MAK3DhK,EAAAiK,SAAW,SAAChG,EAAamG,GACpC,OAAiC,MAA7BtD,OAAO1E,UAAU6H,SACZhG,EAAIgG,SAASG,GAGfnG,EAAIsC,UAAUtC,EAAId,OAASiH,EAAOjH,UAAYiH,GAG1CpK,EAAAmK,WAAa,SAAClG,EAAawD,GACtC,OAAmC,MAA/BX,OAAO1E,UAAU+H,WACZlG,EAAIkG,WAAW1C,GAEjBxD,EAAIsC,UAAU,EAAGkB,EAAOtE,UAAYsE,iGCrL7C,SAAY4C,GACVA,EAAA,cACAA,EAAA,cACAA,EAAA,6BACAA,EAAA,YACAA,EAAA,kBACAA,EAAA,cACAA,EAAA,0BACAA,EAAA,YACAA,EAAA,gBACAA,EAAA,0BACAA,EAAA,sBACAA,EAAA,iCACAA,EAAA,6BACAA,EAAA,uCACAA,EAAA,2BACAA,EAAA,2BACAA,EAAA,mCACAA,EAAA,+BACAA,EAAA,mBACAA,EAAA,iCACAA,EAAA,eACAA,EAAA,YACAA,EAAA,iBACAA,EAAA,oBACAA,EAAA,wBACAA,EAAA,uBACAA,EAAA,gBACAA,EAAA,UACAA,EAAA,iCACAA,EAAA,mDACAA,EAAA,wCACAA,EAAA,sCACAA,EAAA,yCAjCF,CAAYrK,EAAAqK,QAAArK,EAAAqK,MAAK,oGCRjB,SAAYC,GACVA,EAAA,oBACAA,EAAA,QACAA,EAAA,kBACAA,EAAA,kBACAA,EAAA,cACAA,EAAA,cACAA,EAAA,gBACAA,EAAA,cACAA,EAAA,oCATF,CAAYtK,EAAAsK,SAAAtK,EAAAsK,OAAM,+UCClB,IAAAC,EAAAjK,EAAA,IACAkK,EAAAlK,EAAA,IAGAmK,EAAAnK,EAAA,IAIAoK,EAAApK,EAAA,IAKAqK,EAAArK,EAAA,IACAsK,EAAAtK,EAAA,GACAuK,EAAAvK,EAAA,GACAwK,EAAAxK,EAAA,GACAyK,EAAAzK,EAAA,IACA0K,EAAA1K,EAAA,IAEA2K,EAAA3K,EAAA,IACA4K,EAAA5K,EAAA,IACA6K,EAAA7K,EAAA,IACA8K,EAAA9K,EAAA,IAEA+K,EAAA,WAqCE,SAAAA,EACEC,EACAC,EACAC,GAHF,IAAAC,EAAA/I,UAGE,IAAA8I,MAAA,IAAqCP,EAAAS,gBA/BhChJ,KAAAiJ,aAAuB,EACvBjJ,KAAAkJ,kBAA4B,EAC5BlJ,KAAAmJ,iBAA2B,EAC3BnJ,KAAAoJ,cAAgC1G,EAU/B1C,KAAAqJ,oBAA8B,EAC9BrJ,KAAAsJ,YAAsB,EAItBtJ,KAAAuJ,eAAiB,IAAIxB,EAAAyB,eACrBxJ,KAAAyJ,6BAA+B,IAAIjB,EAAAkB,gBAGnC1J,KAAA2J,uBAAiD,CACvDC,wBAAyB,SAACC,EAAkBC,GAC1Cf,EAAKQ,eAAeQ,kBAAkBF,EAASC,KAma5C9J,KAAAgK,8BAAgC,SAACC,EAA4BC,GAC9DD,GAAaC,GAAaD,EAAUE,QAAUD,EAAUC,OAE1DjC,EAAAvG,OAAOV,MAAM,qEAIVjB,KAAAoK,0BAA4B,SAACH,EAA4BC,GAC7C,MAAbD,GAAkC,MAAbC,GAAqBD,EAAUI,QAA8B,MAApBH,EAAUG,QAC1EnC,EAAAvG,OAAOV,MACL,yMAKCjB,KAAAsK,aAAe,SAAC1B,GACrBV,EAAAvG,OAAOvB,IAAI,yCAA0CwI,GAErDG,EAAKiB,8BAA8BjB,EAAKH,OAAQA,GAChDG,EAAKqB,0BAA0BrB,EAAKH,OAAQA,GAE5C,IAAMsB,EAAYnB,EAAKwB,yBAAyB3B,GAEhDG,EAAKF,QAAQyB,aAAaJ,EAAW9B,EAAMtF,wBAGtC9C,KAAAwK,kBAAoB,SAACC,GAC1B,IAAMR,EAASS,EAAA,GAAO3B,EAAKH,QAC3BG,EAAK4B,SAAS,oBACd5B,EAAK6B,iBAAiBH,GACtB1B,EAAK8B,qCAKL9B,EAAKH,OAAM8B,EAAA,GAAOT,GAClBlB,EAAK+B,uBAGA9K,KAAA+K,cAAgB,SAACN,GACtB1B,EAAKF,QAAQkC,cAAcN,IAGtBzK,KAAAgL,uBAAyB,WAC9B,OAAOjC,EAAKkC,OAAOC,cAGdlL,KAAAmL,UAAY,WACjB,OAAOpC,EAAKqC,eAAeC,QA8OrBrL,KAAA4K,iBAAmB,SAACH,GAC1B,IAA8Ba,EACtBC,EASRxC,EAAKH,OAAM8B,IAAA,GACN3B,EAAKH,SAXoB0C,EAYJb,EAXlBc,EAA2B,GACjCvD,EAAAwD,qBAAqBC,QAAQ,SAACpM,GACxBiM,EAAMjM,KACRkM,EAAOlM,GAAOiM,EAAMjM,MAGjBkM,IAOTxC,EAAK+B,uBAvsBL,IAAMY,EAAO1L,KACbA,KAAK4I,OAAS5I,KAAK2L,kCAAkC/C,GACrD5I,KAAK4L,oCAAsC,CACzCC,aACE,OAAOH,EAAKI,UAAUJ,EAAK9C,SAE7BmD,uBACE,OAAsB,QAAtBC,EAAON,EAAK9C,OAAOvJ,WAAG,IAAA2M,IAAI,IAE5Bd,yBACE,OAAoC,QAApCc,EAAON,EAAKV,gCAAwB,IAAAgB,IAAI,IAE1CC,sBACE,OAAOP,EAAK9C,OAAOA,SAIvB5I,KAAK6I,QAAUA,EACf7I,KAAK8I,eAAiBA,EACtB9I,KAAKoL,eAAiB,IAAI1C,EAAAwD,0BAA0BtD,GAEpD,IAAMuD,EAAiCnM,KAAK6I,QAAQuD,qBAAqBC,UACvE,SAACC,GACMvD,EAAKH,OAAOvJ,MACf0J,EAAKH,OAAOvJ,IAAMiN,EAAUP,YAE9BI,MAIJnM,KAAKiL,OAASjL,KAAKuM,cACnBvM,KAAKwM,OACLxM,KAAKyM,6BACL,IAAMC,EAAW1M,KAAK6I,QAAQ8D,WAAW3M,MACzCA,KAAKuJ,eAAeqD,iBAAiBF,GAEjC1M,KAAK6I,QAAQgE,WACf7M,KAAK8M,YAAc,IAAIxE,EAAAyE,YAAY/M,KAAMA,KAAK6I,QAAQgE,WAGxD7M,KAAKgN,uBAAuBpE,GA2vBhC,OA50BEpK,OAAAC,eAAWkK,EAAAjJ,UAAA,UAAO,KAAlB,WACE,OAAO2I,EAAA4E,yCAcTzO,OAAAC,eAAWkK,EAAAjJ,UAAA,0BAAuB,KAAlC,WACE,OAAOM,KAAKyJ,8DAoEPd,EAAAjJ,UAAAwN,gCAAP,WACE,IAAMC,EAASnN,KAAK4I,OAAOuE,QAAUnN,KAAK6I,QAAQuE,gBAClD,MAAO,CACLD,OAAMA,EACNxG,QAASwG,EAAS,IAAMnN,KAAK6I,QAAQwE,mBACrCC,WAAYtN,KAAK6I,QAAQ0E,kBAItB5E,EAAAjJ,UAAA8N,gCAAP,SAAuCC,EAAmBC,GACxD,IAAqB,IAAAnN,EAAA,EAAAoN,EAAAF,EAAAlN,EAAAoN,EAAAlN,OAAAF,IAAS,CAAzB,IAAM0K,EAAM0C,EAAApN,GACfP,KAAK4N,+BAA+B3C,EAAQyC,KAIzC/E,EAAAjJ,UAAAkO,+BAAP,SAAsC3C,EAAgByC,GAC7C,IAAA9E,EAAmE8E,EAAgB9E,OAA3EyC,EAA2DqC,EAAgBrC,OAAnEH,EAAmDwC,EAAgBxC,aAArDW,EAAqC6B,EAAgB7B,OAA7CvJ,EAA6BoL,EAAgBpL,KAAvCuL,EAAuBH,EAAgBG,SAA7BtH,EAAamH,EAAgBnH,UAC1F0E,EAAOC,aAAeA,EACtBD,EAAOI,OAASA,EAChBJ,EAAO1E,UAAYA,EACnB0E,EAAOY,OAASA,EAChBZ,EAAO3I,KAAOA,EACd2I,EAAO4C,SAAWA,EAElB7N,KAAK8K,oBAAoBG,EAAQrC,IAG5BD,EAAAjJ,UAAA8M,KAAP,YAEoD,IAAhDxM,KAAK6I,QAAQiF,gCACQ,KAApB9N,KAAK4I,OAAOvJ,KAAe+I,EAAMtG,YAAY9B,KAAK4I,OAAOvJ,MAM5D6I,EAAAvG,OAAO1B,WAAYD,KAAK4I,OAAOmF,QAAqB,GAEpD/N,KAAKuJ,eAAeyE,gBACpBhO,KAAKiO,QAAUjO,KAAKkO,cAAclO,KAAK4I,QACvC5I,KAAKmJ,iBAAmB,EAExBnJ,KAAK8K,sBAEL9K,KAAKmO,0BACLnO,KAAKoO,YAEDpO,KAAK6I,QAAQwF,wBACfrO,KAAK6I,QAAQwF,uBAAuBC,QAEtCtO,KAAKuO,kCACLvO,KAAK6I,QAAQ2F,2BAnBXtG,EAAAvG,OAAOV,MAAM,2CAsBV0H,EAAAjJ,UAAA+O,QAAP,iBACEzO,KAAKiO,QAAU,IAAIxF,EAAAiG,YACH,QAAhB1C,EAAAhM,KAAK8M,mBAAW,IAAAd,KAAEyC,UAClBzO,KAAKuO,mCAGA5F,EAAAjJ,UAAAoL,oBAAP,SAA2BG,EAAsBrC,QAAtB,IAAAqC,MAASjL,KAAKiL,aAAQ,IAAArC,MAAS5I,KAAK4I,QAC7DqC,EAAO5L,IAAMuJ,EAAOvJ,IACpB4L,EAAO0D,UAAY/F,EAAO+F,UACtB/F,EAAOuE,SACTlC,EAAOkC,OAASvE,EAAOuE,QAEzBlC,EAAOY,OAAS7L,KAAK4O,oBAAoBhG,IAAWR,EAAM/F,aAAa3E,OAAOmR,SAAS/I,UACvFmF,EAAO6D,YAAclG,EAAOkG,YAC5B7D,EAAO8D,QAAUnG,EAAOmG,QACxB9D,EAAO+D,WAAapG,EAAOuB,MAC3Bc,EAAOgE,aAAgC,MAAjBrG,EAAOyC,OAAiBzC,EAAOyC,OAASzC,EAAOqG,aAErE7G,EAAM/D,yBAAyBuE,EAAQqC,GAEvCA,EAAOiE,eAAiBtG,EAAOsG,gBAG1BvG,EAAAjJ,UAAAyO,wBAAP,WACEnO,KAAKiL,OAAOC,aAAe9C,EAAMjF,gBAG5BwF,EAAAjJ,UAAA0O,UAAP,WACEpO,KAAKiL,OAAOI,OAASrL,KAAKoL,eAAeC,QAGpC1C,EAAAjJ,UAAA+M,2BAAP,eAAA1D,EAAA/I,KAGEA,KAAK6I,QAAQsG,sBAAsBC,MAAQ,SAACC,EAAkBC,GAS5D,GARApH,EAAAvG,OAAOvB,IACL,4BAA8B2I,EAAKkC,OAAOsE,iBAAmB,uBAAyBxG,EAAKkC,OAAOC,cAGpGnC,EAAKyG,YAAYH,GACjBtG,EAAK4B,SAAS2E,GACdvG,EAAKG,kBAAoBH,EAAKkC,OAAO/B,kBAAoBmG,EAErD3R,OAAO+R,aAAe/R,OAAO+R,YAAYC,OAAQ,CACnD,IAAMC,EAAWvH,EAAMtF,sBAAwBpF,OAAO+R,YAAYC,OAAOE,gBACzE7G,EAAKE,aAAeF,EAAKkC,OAAOhC,aAAe0G,EAGjD5G,EAAKO,YAAc+F,EAEnBtG,EAAK8B,qCAEL9B,EAAKkC,OAAOhC,aAAe,GAG7BjJ,KAAK6I,QAAQsG,sBAAsBU,QAAU,SAACR,EAAkBC,GAC9DvG,EAAKyG,YAAYH,GACjBtG,EAAKI,iBAAmBJ,EAAKkC,OAAO9B,iBAAmBkG,EACvDtG,EAAKkC,OAAO6E,qBAAuB7H,EAAA8H,YAAYC,sBAC/CjH,EAAK4B,SAAS2E,GAEVvG,EAAKO,YAAc,IACrBP,EAAKO,aAAe+F,GAEtBtG,EAAKkC,OAAO3B,YAAcP,EAAKO,YAC/BP,EAAKK,SAAWL,EAAKkC,OAAO7B,SAAWL,EAAKF,QAAQoH,cAEpD,IAAMC,EAAiBnH,EAAKF,QAAQsH,wBACd,MAAlBD,IACFnH,EAAKkC,OAAOmF,QAAUF,EAAeE,QACrCrH,EAAKkC,OAAOoF,YAAcH,EAAeG,aAG3CtH,EAAK8B,qCACL9B,EAAKkC,OAAO7B,cAAW1G,GAGzB1C,KAAK6I,QAAQsG,sBAAsBmB,QAAU,SAACjB,EAAkBC,GAC9DvG,EAAKyG,YAAYH,GACjBtG,EAAK4B,SAAS2E,GACdvG,EAAKkC,OAAOsF,OAASlB,EACrBtG,EAAKyH,sBACLzH,EAAK8B,sCAGP7K,KAAK6I,QAAQsG,sBAAsBsB,OAAS,SAACpB,EAAkBC,GAC7D,IAAIoB,EAA2B3H,EAAKkC,OAAO0F,eAC7B,YAAVrB,IACFvG,EAAKyG,YAAYH,GACjBtG,EAAK4B,SAAS2E,GACdvG,EAAKkC,OAAOsF,OAASlB,EACrBtG,EAAKyH,sBACLzH,EAAK6H,oBACDxI,EAAMjG,YAAY4G,EAAKkC,OAAO4F,gBAChCH,EAA2B3H,EAAKkC,OAAO4F,eAIvC9H,EAAKI,iBAAmB,IAC1BJ,EAAK+H,kBAAkBJ,GACvB3H,EAAKgI,gBAAgBL,GACrB3H,EAAKiI,cACLjI,EAAK4B,SAAS,UACd5B,EAAK6H,sBAIT5Q,KAAK6I,QAAQsG,sBAAsB8B,UAAY,SAC7C5B,EACAC,EACA4B,GAEAnI,EAAK4B,SAAS2E,GACdvG,EAAKyG,YAAYH,GAEjBtG,EAAKkC,OAAMP,IAAA,GACN3B,EAAKkC,QACLiG,GAGS,YAAV5B,GACFvG,EAAKyH,sBAGPzH,EAAK8B,sCAGP7K,KAAK6I,QAAQsG,sBAAsBgC,cAAgB,SAAC9B,EAAkBC,GACpEvG,EAAKqI,kBAAkB9B,EAAOD,IAGhCrP,KAAK6I,QAAQsG,sBAAsBkC,oBAAsB,SAAChC,EAAkBC,GAC1EvG,EAAKqI,kBAAkB9B,EAAOD,IAGhCrP,KAAK6I,QAAQsG,sBAAsBmC,0BAA4B,SAACjC,EAAkBC,GAChFvG,EAAKqI,kBAAkB9B,EAAOD,IAGhCrP,KAAK6I,QAAQsG,sBAAsBoC,YAAc,SAACC,GAChDzI,EAAKF,QAAQsG,sBAAsBsC,yBAAyBD,GAC5DzI,EAAKF,QAAQsG,sBAAsBuC,2BAA2BF,GAC9DzI,EAAK4I,oCAAoCH,IAG3CxR,KAAK6I,QAAQsG,sBAAsByC,YAAc,SAACJ,GAChDzI,EAAKF,QAAQsG,sBAAsBsC,yBAAyBD,GAC5DzI,EAAKF,QAAQsG,sBAAsBuC,2BAA2BF,GAC9DzI,EAAK8I,oCAAoCL,IAG3CxR,KAAK6I,QAAQsG,sBAAsB2C,oBAAsB,WACvD/I,EAAK8B,sCAGP7K,KAAK6I,QAAQsG,sBAAsB4C,MAAQ,SAAC1C,EAAkBC,GAC5DvG,EAAKyG,YAAYH,GACjBtG,EAAK4B,SAAS2E,GAEdvG,EAAKkC,OAAO+G,OAAS3C,EAErBtG,EAAK8B,sCAGP7K,KAAK6I,QAAQsG,sBAAsB8C,eAAiB,SAAC5C,EAAkBC,GACrEvG,EAAKyG,YAAYH,GACjBtG,EAAK4B,SAAS2E,GAEdvG,EAAKkC,OAAOiH,OAAS7C,EAErBtG,EAAK8B,sCAGP7K,KAAK6I,QAAQsG,sBAAsBgD,iBAAmB,SAAC9C,EAAkBC,GACvEvG,EAAK4B,SAAS2E,GACdvG,EAAKyG,YAAYH,GAEjBtG,EAAKkC,OAAOiH,OAAS7C,EAErBtG,EAAK8B,sCAGP7K,KAAK6I,QAAQsG,sBAAsBiD,YAAc,SAAC/C,EAAkBC,GAClEvG,EAAKyG,YAAYH,GACjBtG,EAAK4B,SAAS2E,GAEdvG,EAAKkC,OAAOoH,SAAWhD,EAEvBtG,EAAK8B,sCAGP7K,KAAK6I,QAAQsG,sBAAsBmD,iBAAmB,SACpDd,EACAe,QAAA,IAAAA,OAAA,GAEAxJ,EAAKkC,OAAOqH,kBAAmB,EAC/BvJ,EAAKkC,OAAOuH,uBAAyBhB,EAAMiB,OAAOA,OACpB,MAA1BjB,EAAMiB,OAAOC,YACf3J,EAAKkC,OAAOyH,UAAYlB,EAAMiB,OAAOC,UAAUC,KAC/C5J,EAAKkC,OAAO2H,aAAepB,EAAMiB,OAAOC,UAAUG,QAC9CN,GACFxJ,EAAKU,6BAA6BqJ,SAAQpI,EAAA,GACrC8G,EAAMiB,OAAOC,aAIlBH,GACFxJ,EAAK8B,sCAIT7K,KAAK6I,QAAQsG,sBAAsBlO,MAAQ,SAACuQ,GAC1CzI,EAAKF,QAAQsG,sBAAsBsC,yBAAyBD,GAC5DzI,EAAKF,QAAQsG,sBAAsBuC,2BAA2BF,GAE9DzI,EAAK4B,SAAS,SACd5B,EAAKkC,OAAOyH,UAAYlB,EAAMmB,KAC9B5J,EAAKkC,OAAO2H,aAAepB,EAAMqB,QACjC9J,EAAKkC,OAAO8H,UAAY7O,KAAKC,UAAUqN,EAAMwB,YAE7C,IAAMC,EAAelK,EAAKF,QAAQqK,SAASC,IAAI,SAACtT,GAAM,OAAAA,EAAExB,OACxD0K,EAAKkC,OAAOmI,cAAgBH,EAExBlK,EAAKF,QAAQwK,SACftK,EAAKF,QAAQwK,UAGftK,EAAKU,6BAA6BqJ,SAAS,CACzCH,KAAMnB,EAAMmB,KACZE,QAASrB,EAAMqB,QACfE,UAAWvB,EAAM8B,OAEnBvK,EAAK8B,4CAEE9B,EAAKkC,OAAOyH,iBACZ3J,EAAKkC,OAAO2H,oBACZ7J,EAAKkC,OAAO8H,WAGrB/S,KAAK6I,QAAQsG,sBAAsBoE,GAAK,SAAClE,EAAkBC,GACzDvG,EAAKyG,YAAYH,GACjBtG,EAAK4B,SAAS2E,GACdvG,EAAKkC,OAAOsI,GAAKlE,EACjBtG,EAAK8B,sCAGP7K,KAAK6I,QAAQsG,sBAAsBqE,KAAO,WACxCzK,EAAKkC,OAAOwI,SAAU,GAGxBzT,KAAK6I,QAAQsG,sBAAsBuE,OAAS,WAC1C3K,EAAKkC,OAAOwI,SAAU,GAGxBzT,KAAK6I,QAAQsG,sBAAsBwE,kBAAoB,WACrD5K,EAAK8B,sCAGP7K,KAAK6I,QAAQsG,sBAAsBsC,yBAA2B,SAACD,GACzDpJ,EAAMjG,YAAYqP,EAAMoC,cAC1B7K,EAAKgI,gBAAgB3I,EAAMvF,cAAc2O,EAAMoC,eAInD5T,KAAK6I,QAAQsG,sBAAsBuC,2BAA6B,SAACF,GAC3DpJ,EAAMjG,YAAYqP,EAAMoC,cAC1B7K,EAAK+H,kBAAkB1I,EAAMvF,cAAc2O,EAAMoC,eAIrD5T,KAAK6I,QAAQsG,sBAAsB0E,mBAAqB,SAACrC,GACvDzI,EAAKF,QAAQiL,0BACb/K,EAAKkC,OAASlC,EAAKwD,cACnBxD,EAAKO,YAAc,EACnBP,EAAKH,OAAS4I,EAAM5I,OAAS4I,EAAM5I,OAASG,EAAKH,OACjDG,EAAKyD,QAGPxM,KAAK6I,QAAQsG,sBAAsB4E,mBAAqB,SAACvC,GACvDzI,EAAKkC,OAASlC,EAAKwD,cACnBxD,EAAKO,YAAc,EAGnBP,EAAKyD,QAGPxM,KAAK6I,QAAQsG,sBAAsB6E,oBAAsB,SAACxC,GACxDzI,EAAKH,OAAS4I,EAAM5I,OACpBG,EAAK+B,uBAIP9K,KAAK6I,QAAQsG,sBAAsB8E,IAAM,WACvClL,EAAKkC,OAASlC,EAAKwD,cACnBxD,EAAKO,YAAc,EACnBP,EAAKyD,QAGPxM,KAAK6I,QAAQsG,sBAAsBV,QAAU,WAC3C1F,EAAK0F,WAGPzO,KAAK6I,QAAQsG,sBAAsB+E,iBAAmB,SACpD7E,EACAC,EACAkC,GAEIA,GAASA,EAAM/G,QACjB1B,EAAK6B,iBAAiB4G,EAAM/G,UAwD3B9B,EAAAjJ,UAAA8P,YAAP,SAAmBH,GACjBrP,KAAKiL,OAAOoE,SAAWA,GAGlB1G,EAAAjJ,UAAAiL,SAAP,SAAgB2E,GACdtP,KAAKiL,OAAOqE,MAAQA,GAGf3G,EAAAjJ,UAAAiS,oCAAP,SAA2CH,GACrCpJ,EAAMjG,YAAYqP,EAAM2C,SAC1BnU,KAAKiL,OAAOmJ,mBAAqB5C,EAAM2C,OAErC/L,EAAMjG,YAAYqP,EAAM6C,UAC1BrU,KAAKiL,OAAOqJ,oBAAsB9C,EAAM6C,QAEtCjM,EAAMjG,YAAYqP,EAAM+C,WAC1BvU,KAAKiL,OAAOuJ,aAAehD,EAAM+C,SAE/BnM,EAAMtG,YAAY0P,EAAMiD,SAC1BzU,KAAKiL,OAAOyJ,WAAalD,EAAMiD,QAI5B9L,EAAAjJ,UAAAmS,oCAAP,SAA2CL,GACrCpJ,EAAMjG,YAAYqP,EAAM+C,WAC1BvU,KAAKiL,OAAO0J,aAAenD,EAAM+C,SAE/BnM,EAAMtG,YAAY0P,EAAMiD,SAC1BzU,KAAKiL,OAAO2J,WAAapD,EAAMiD,QAI5B9L,EAAAjJ,UAAAmV,2BAAP,WACE,IAAMC,EAAO9U,KAAK6I,QAAQkM,yBACrBD,IAIL9U,KAAKiL,OAAOZ,OAASrK,KAAKgV,kCAAkChV,KAAK4I,OAAQkM,EAAKzK,QAE1EjC,EAAMtG,YAAYgT,EAAKG,QACzBjV,KAAKiL,OAAOgK,KAAOH,EAAKG,MAEtB7M,EAAMtG,YAAYgT,EAAKxH,cACzBtN,KAAKiL,OAAOqC,WAAawH,EAAKxH,YAE5BlF,EAAMjG,YAAY2S,EAAKI,iBACzBlV,KAAKiL,OAAOiK,cAAgB9M,EAAMvF,cAAciS,EAAKI,eAAiB,IAEpE9M,EAAMtG,YAAYgT,EAAKK,gBACzBnV,KAAKiL,OAAOkK,aAAeL,EAAKK,cAE9B/M,EAAMtG,YAAYgT,EAAKM,UACzBpV,KAAKiL,OAAOmK,OAASN,EAAKM,QAExBhN,EAAMtG,YAAYgT,EAAKO,WACzBrV,KAAKiL,OAAOoK,QAAUP,EAAKO,SAEzBjN,EAAMtG,YAAYgT,EAAKQ,WACzBtV,KAAKiL,OAAOqK,QAAUR,EAAKQ,SAEzBlN,EAAMjG,YAAY2S,EAAKS,oBACzBvV,KAAKiL,OAAOsK,iBAAmBT,EAAKS,kBAElCnN,EAAMjG,YAAY2S,EAAKU,qBACzBxV,KAAKiL,OAAOuK,kBAAoBV,EAAKU,mBAEnCpN,EAAMjG,YAAY2S,EAAKW,gBACzBzV,KAAKiL,OAAOwK,aAAeX,EAAKW,cAE9BrN,EAAMjG,YAAY2S,EAAKY,eACzB1V,KAAKiL,OAAOyK,YAAcZ,EAAKY,aAE7BtN,EAAMjG,YAAY2S,EAAKR,uBACzBtU,KAAKiL,OAAOqJ,oBAAsBQ,EAAKR,qBAErClM,EAAMjG,YAAY2S,EAAKV,sBACzBpU,KAAKiL,OAAOmJ,mBAAqBU,EAAKV,oBAEpChM,EAAMjG,YAAY2S,EAAKN,gBACzBxU,KAAKiL,OAAOuJ,aAAeM,EAAKN,cAE9BpM,EAAMjG,YAAY2S,EAAKH,gBACzB3U,KAAKiL,OAAO0J,aAAeG,EAAKH,cAE9BvM,EAAMnG,aAAa6S,EAAKrB,WAC1BzT,KAAKiL,OAAOwI,QAAUqB,EAAKrB,SAEzBrL,EAAMnG,aAAa6S,EAAKa,aAC1B3V,KAAKiL,OAAO0K,UAAYb,EAAKa,WAE3BvN,EAAMtG,YAAYgT,EAAKc,YACzB5V,KAAKiL,OAAO2K,SAAWd,EAAKc,UAE1BxN,EAAMtG,YAAYgT,EAAK9F,cAAgBhP,KAAK4I,OAAOuB,QACrDnK,KAAKiL,OAAO+D,WAAa8F,EAAK9F,YAE5B5G,EAAMtG,YAAYgT,EAAKF,cACzB5U,KAAKiL,OAAO2J,WAAaE,EAAKF,YAE5BxM,EAAMtG,YAAYgT,EAAKJ,cACzB1U,KAAKiL,OAAOyJ,WAAaI,EAAKJ,YAE5BtM,EAAMtG,YAAYgT,EAAKe,iBACzB7V,KAAKiL,OAAO4K,cAAgBf,EAAKe,eAE/BzN,EAAMnG,aAAa6S,EAAKgB,mBAC1B9V,KAAKiL,OAAO6K,gBAAkBhB,EAAKgB,iBAEjC1N,EAAMtG,YAAYgT,EAAKiB,kBACzB/V,KAAKiL,OAAO8K,iBAAmBjB,EAAKiB,iBAEpC/V,KAAKiL,OAAO8K,sBAAmBrT,EAE7B0F,EAAMjG,YAAY2S,EAAKkB,iBACzBhW,KAAKiL,OAAO+K,cAAgBrT,KAAKsT,IAAInB,EAAKkB,cAAgBhW,KAAKqJ,oBAAqB,GACpFrJ,KAAKqJ,oBAAsByL,EAAKkB,iBAI7BrN,EAAAjJ,UAAA6M,YAAP,WAGE,OAFAvM,KAAKqJ,oBAAsB,EAE3BqB,EAAA,CACEwL,SAAU,MACVhN,kBAAmB,EACnBiN,aAAc/N,EAAMhD,kBACpB9C,KAAM8F,EAAM/F,aAAa3E,OAAOmR,SAAS9I,UACzC8H,SAAUvH,UAAUuH,UAAavH,UAAkB8P,aACnD7P,UAAWD,UAAUC,UACrBmP,YAAaW,OAAOlC,MACpBsB,aAAcY,OAAOhC,OACrBhK,QAAQ,EACR6K,cAAe,EACfD,KAAMnN,EAAAwO,WAAWC,OACjB9T,KAAM,EACN8S,iBAAkB,EAClBC,kBAAmB,EACnBQ,cAAe,EACfzF,OAAQ,EACR8B,SAAU,EACVL,OAAQ,EACRuB,GAAI,EACJrB,OAAQ,EACRkC,mBAAoB,EACpBE,oBAAqB,EACrBE,aAAc,EACdG,aAAc,EACdhE,eAAgB,EAChBE,aAAc,EACd1H,iBAAkB,EAClBkG,SAAU,EACV/F,YAAa,EACbiG,iBAAkBlH,EAAA4E,QAClBhE,aAAc,EACduN,eAAgB,GACbxW,KAAKkN,oCAILvE,EAAAjJ,UAAA+W,qBAAP,WACEzW,KAAK6U,6BACL7U,KAAKiL,OAAOxI,KAAO2F,EAAMtF,sBACzB9C,KAAKiL,OAAOyL,kBAAoB1W,KAAK6I,QAAQ6N,kBAE7C,IAAMC,EAAUjM,EAAA,GAAO1K,KAAKiL,QAC5BjL,KAAKiO,QAAQsE,YAAYoE,IAGpBhO,EAAAjJ,UAAAmL,mCAAP,WACE7K,KAAKyW,uBACLzW,KAAKgR,eAGArI,EAAAjJ,UAAAkR,kBAAP,WACE5Q,KAAKiO,QAAQ2C,kBAAkB5Q,KAAKiL,SAG/BtC,EAAAjJ,UAAAkX,gCAAP,WACE5W,KAAKiO,QAAQ4I,uBAAuB7W,KAAKiL,SAGpCtC,EAAAjJ,UAAAsR,YAAP,WACEhR,KAAKiL,OAAOsI,GAAK,EACjBvT,KAAKiL,OAAO+G,OAAS,EACrBhS,KAAKiL,OAAOsF,OAAS,EACrBvQ,KAAKiL,OAAOiH,OAAS,EACrBlS,KAAKiL,OAAOoH,SAAW,EAEvBrS,KAAKiL,OAAO/B,kBAAoB,EAChClJ,KAAKiL,OAAO9B,iBAAmB,EAC/BnJ,KAAKiL,OAAO3B,YAAc,EAC1BtJ,KAAKiL,OAAO2K,cAAWlT,EAEvB1C,KAAKiL,OAAOoE,SAAW,EACvBrP,KAAKiL,OAAO+K,cAAgB,EAE5BhW,KAAKiL,OAAOoF,iBAAc3N,EAE1B1C,KAAKiL,OAAOqH,sBAAmB5P,EAC/B1C,KAAKiL,OAAOuH,4BAAyB9P,EAErC1C,KAAKiL,OAAO6L,eAAYpU,EACxB1C,KAAK6I,QAAQmI,eAGRrI,EAAAjJ,UAAAsV,kCAAP,SAAyCpM,EAAyBmO,GAChE,OAA0B,MAAtBA,EACKnO,EAAOyB,SAAU,IAEnBjC,EAAMnG,aAAa8U,IAAsBA,GAG3CpO,EAAAjJ,UAAAsX,yBAAP,SAAgC9M,EAA4BD,QAAA,IAAAA,MAAYjK,KAAK4I,QAC3E,IAAIqO,GAAyBhN,GAAa,IAAIrB,OAI9C,OAHiB,MAAbsB,IACF+M,EAAqBvM,MAAA,GAAOuM,GAAqB,CAAEC,SAAS,IAAShN,EAAUtB,SAE1EqO,GAGFtO,EAAAjJ,UAAA6K,yBAAP,SAAgCL,EAA4BD,QAAA,IAAAA,MAAYjK,KAAK4I,QAC3E,IAAMqO,EAAwBjX,KAAKgX,yBAAyB9M,EAAWD,GAMvE,OALkBS,MAAA,GACbT,GACAC,GACA,CAACtB,OAAQqO,KA2BRtO,EAAAjJ,UAAAiM,kCAAR,SAA0C/C,GAIxC,OAHKR,EAAMnG,aAAa2G,EAAOyB,UAC7BzB,EAAOyB,QAAS,GAEXzB,GAGDD,EAAAjJ,UAAAsN,uBAAR,SAA+BpE,GACF,MAAvBA,EAAOqG,cAAyC,MAAjBrG,EAAOyC,QACxCnD,EAAAvG,OAAOT,QACL,iLAKEyH,EAAAjJ,UAAAkP,oBAAR,SAA4BhG,GAC1B,IAAMqD,EAAkBrD,EAAOA,OAC/B,OAA0B,MAAnBqD,GAAqD,MAA1BA,EAAgBkL,OAAiBlL,EAAgBkL,YAASzU,GAGtFiG,EAAAjJ,UAAAwO,cAAR,SAAsBtF,GACpB,IAAMiD,EAAS7L,KAAK8L,UAAUlD,GAC9B,OAAO5I,KAAK8I,eAAeoF,cACzBtF,EACA,CAACvJ,IAAKuJ,EAAOvJ,IAAKwM,OAAMA,EAAElF,QAAS0B,EAAA4E,SACnCjN,KAAK6I,QACL7I,KAAK2J,yBAIDhB,EAAAjJ,UAAAoM,UAAR,SAAkBlD,GAEhB,OADyB5I,KAAK4O,oBAAoBhG,IACvBR,EAAM/F,aAAa3E,OAAOmR,SAAS/I,WAGxD6C,EAAAjJ,UAAA8Q,oBAAR,WACE,GAAIxQ,KAAK6I,QAAQwF,uBAAwB,CACvC,IAAMyI,EAAY9W,KAAK6I,QAAQwF,uBAAuB+I,WAAW,CAC/DC,MAAOrX,KAAKiL,OAAO0F,eACnBsD,IAAKjU,KAAKiL,OAAO4F,eAEb2F,EAAiBxW,KAAK6I,QAAQwF,uBAAuBiJ,0BAEtDC,OAAOC,MAAMV,IAAeS,OAAOC,MAAMhB,KAC5CxW,KAAKiL,OAAO6L,UAAYA,EACxB9W,KAAKiL,OAAOuL,eAAiBA,KAK3B7N,EAAAjJ,UAAAoR,kBAAR,SAA0B/R,GACxBiB,KAAKiL,OAAO0F,eAAiB5R,GAGvB4J,EAAAjJ,UAAAqR,gBAAR,SAAwBhS,GACtBiB,KAAKiL,OAAO4F,aAAe9R,GAGrB4J,EAAAjJ,UAAA0R,kBAAR,SAA0B9B,EAAeD,GAAzC,IAAAtG,EAAA/I,KACgD,MAA1CA,KAAKyX,oCACPzX,KAAKyX,kCAAoC/Z,OAAOga,YAAY,WAC1D3O,EAAKF,QAAQ2F,2BACZrG,EAASwP,gDAGd3X,KAAK6I,QAAQ+O,6BACR5X,KAAK6I,QAAQgP,+BAWhB7X,KAAKwP,YAAYH,GACjBrP,KAAK2K,SAAS2E,GACdtP,KAAK6K,uCAZL7K,KAAKwP,YAAYH,GACjBrP,KAAK6I,QAAQsG,sBAAsBlO,MAAKyJ,IAAA,GACnC7C,EAAAiQ,UAAUC,mCAAiC,CAC9C/E,gBAAYtQ,EACZkR,iBAAalR,EACb4Q,KAAM,QAWJ3K,EAAAjJ,UAAA6O,gCAAR,WACgD,MAA1CvO,KAAKyX,oCACP/Z,OAAOsa,cAAchY,KAAKyX,0CACnBzX,KAAKyX,oCAt0BF9O,EAAAhC,QAAkB0B,EAAA4E,QAClBtE,EAAAsP,6BAA+B,IAC/BtP,EAAAuP,uBAAyB,IACzBvP,EAAAwP,6BAA+B,+BAs0B/CxP,EA70BA,GAAarL,EAAAqL,4GCvBb,IAAAT,EAAAtK,EAAA,GAGAwa,EAAA,oBAAAA,KAuDA,OAnDSA,EAAA1Y,UAAAsL,uBAAP,WACE,GAAKhL,KAAKqY,sCAGV,OAAOrY,KAAKsY,UAAUtN,0BAGjBoN,EAAA1Y,UAAAyL,UAAP,WACE,GAAKnL,KAAKqY,sCAGV,OAAOrY,KAAKsY,UAAUnN,aAGjBiN,EAAA1Y,UAAAqL,cAAP,SAAqBN,GACdzK,KAAKqY,uCAGVrY,KAAKuY,gBAAgBxN,cAAcN,IAG9B2N,EAAA1Y,UAAA8K,kBAAP,SAAyBC,GAClBzK,KAAKqY,uCAGVrY,KAAKsY,UAAU9N,kBAAkBC,IAG5B2N,EAAA1Y,UAAA4K,aAAP,SAAoB1B,GACb5I,KAAKqY,uCAGVrY,KAAKsY,UAAUhO,aAAa1B,IAIpBwP,EAAA1Y,UAAA8Y,8BAAV,SAAwCrL,GACtC,OAAQA,EAAesL,iCAGfL,EAAA1Y,UAAAgZ,8BAAV,SAAwCvL,GACrCA,EAAesL,iCAAkC,GAG5CL,EAAA1Y,UAAA2Y,oCAAR,WACE,QAAKrY,KAAKsY,YACRpQ,EAAAvG,OAAOvB,IAAI,4DACJ,IAIbgY,EAvDA,GAAsB9a,EAAA8a,kXCNT9a,EAAAqb,kBAAoB,yCACpBrb,EAAAsb,2BAA6B,gDAE7Btb,EAAAub,8BAAgC,IAChCvb,EAAAwb,6BAA+B,IAE/Bxb,EAAAyb,yCAA2C,GAC3Czb,EAAAqa,8CAAgD,KAKhDra,EAAA0b,2BAA6B,KAK7B1b,EAAA2b,wCAA0C,wiBChBvD,IAAAC,EAAAtb,EAAA,IACAub,EAAAvb,EAAA,GACAwb,EAAAxb,EAAA,GAKAyb,EAAA,WAwDE,SAAAA,EAAYpN,SAHKjM,KAAAsZ,OAAwB,GACjCtZ,KAAAuZ,UAAoB,EAG1BvZ,KAAKwZ,WAAaJ,EAAAlS,SAAoC,QAA5B8E,EAACC,aAAe,EAAfA,EAAiBuN,kBAAU,IAAAxN,IAAImN,EAAAP,2BAA4B,oBA0C1F,OAlGEpa,OAAAC,eAAW4a,EAAA3Z,UAAA,QAAK,KAAhB,WACE,OAAOM,KAAKsZ,wCAGd9a,OAAAC,eAAW4a,EAAA3Z,UAAA,UAAO,KAAlB,WACE,OAAOM,KAAKuZ,cAGd,SAAmBxa,GACjBiB,KAAKuZ,SAAWxa,mCAGJsa,EAAAI,sCAAd,SACEC,EACAC,EACAC,GAHF,QAAA7Q,EAAA/I,KAKE,OAAA0K,IAAA,GACKgP,GAAW,CACd7G,QAA4B,QAArB7G,EAAE0N,EAAY7G,eAAO,IAAA7G,OAAA,EAAAA,EAAExE,OAAO,EAAGmS,GACxCrG,KAAMtT,KAAK6Z,6BAA6BH,EAAYpG,KAAMqG,GAC1DG,aAAsC,QAA1BC,EAAEL,EAAYI,oBAAY,IAAAC,OAAA,EAAAA,EAAE5G,IAAI,SAAC6G,GAAY,OAAAjR,EAAKkR,4BAA4BD,EAASJ,QAIzFP,EAAAY,4BAAd,SAA0CC,EAA0BC,WAClE,OAAAzP,IAAA,GACKwP,GAAW,CACdxU,IAAoB,QAAjBsG,EAAEkO,EAAYxU,WAAG,IAAAsG,OAAA,EAAAA,EAAExE,OAAO,EAAG2S,GAChCC,qBAAsD,QAAlCL,EAAEG,EAAYE,4BAAoB,IAAAL,OAAA,EAAAA,EAAEvS,OAAO,EAAG2S,MAIxDd,EAAAQ,6BAAd,SAA2C9G,EAAsB4G,WAC/D,OAAAjP,IAAA,GACKqI,GAAS,CACZsH,iBAA4C,QAA5BrO,EAAE+G,EAAUsH,wBAAgB,IAAArO,OAAA,EAAAA,EAAExE,OAAO,EAAGmS,GACxDW,eAAwC,QAA1BP,EAAEhH,EAAUuH,sBAAc,IAAAP,OAAA,EAAAA,EAAEvS,OAAO,EAAGmS,MAI1CN,EAAAkB,oCAAd,SAAkDb,EAA0Bc,SAC1E,OAAA9P,IAAA,GACKgP,GAAW,CACdI,aAAsC,QAA1B9N,EAAE0N,EAAYI,oBAAY,IAAA9N,OAAA,EAAAA,EAAEtK,OAAO8Y,MAe5CnB,EAAA3Z,UAAA+a,sCAAP,SAA6CxE,GAA7C,IAAAlN,EAAA/I,KACEA,KAAKsZ,OAAO7N,QAAQ,SAAC1M,EAAO2b,GAC1B3R,EAAKuQ,OAAOoB,GAASrB,EAAmBkB,oCAAoCxb,EAAOkX,MAIhFoD,EAAA3Z,UAAAib,KAAP,SAAYjB,GACV,IAAMkB,EAAkBvB,EAAmBI,sCACzCC,EACAL,EAAmBwB,kBACnBxB,EAAmByB,gBAEjB9a,KAAKkX,QACPgC,EAAA6B,KAAK/a,KAAKwZ,WAAYoB,EAAiB,cAEvC5a,KAAKsZ,OAAO0B,KAAKJ,IAIdvB,EAAA3Z,UAAAub,MAAP,WAGE,IAFA,IAAMC,EAAIta,EAAOZ,KAAKsZ,QAClB6B,EAAUD,EAAKE,QACD,MAAXD,GACLnb,KAAKqb,gBAAgBF,GACrBnb,KAAK2a,KAAKQ,GACVA,EAAUD,EAAKE,SAIZ/B,EAAA3Z,UAAA4b,MAAP,WACEtb,KAAKsZ,OAAOvS,OAAO,EAAG/G,KAAKsZ,OAAO7Y,SAG5B4Y,EAAA3Z,UAAA2b,gBAAR,SAAwBF,GACtB,IAAMT,EAAQ1a,KAAKsZ,OAAOiC,UAAU,SAACxc,GAAU,OAAAA,IAAUoc,IACrDT,GAAS,GACX1a,KAAKsZ,OAAOvS,OAAO2T,EAAO,IA/CfrB,EAAAyB,eAAiB,IACjBzB,EAAAwB,kBAAoB,IAiDrCxB,EAnGA,GAAa/b,EAAA+b,oqBCLb,IAAAnR,EAAAtK,EAAA,GACAwb,EAAAxb,EAAA,GACAyK,EAAAzK,EAAA,IAeA4d,EAAA,SAAAC,GAGE,SAAAD,EACUE,EACAzN,EACA0N,EACAC,GAJV,IAAA7S,EAME0S,EAAAxd,KAAA+B,OAAOA,YALC+I,EAAA2S,mBACA3S,EAAAkF,UACAlF,EAAA4S,gBACA5S,EAAA6S,sBANF7S,EAAA8S,WAAa,EAuCb9S,EAAA+S,eAAiB,SAACtK,WACxB,IACE,IAAKzI,EAAKgT,UACR,OAGF,IAAMjC,EAAuC,QAA3B9N,EAAGjD,EAAK6S,2BAAmB,IAAA5P,OAAA,EAAAA,EAAE8N,aACzCkC,EAAmC,MAAhBlC,OAAuBpX,EAAW9B,EAAKkZ,GAC1D+B,EAAa9S,EAAK8S,WACxB9S,EAAK8S,aAEL,IAAMnC,EAA2B,CAC/BxD,SAAU,MACVnK,WAAYhD,EAAK2S,iBAAiB3P,WAClCF,OAAQ9C,EAAK2S,iBAAiB7P,OAC9BX,aAAcnC,EAAK2S,iBAAiBxQ,aACpCqE,iBAAkBlH,EAAA4E,QAClBgP,QAASJ,EACT3Y,UAAWkW,EAAAtW,sBACX6P,KAAMnB,EAAMmB,KACZE,QAASrB,EAAMqB,QACfS,KAAqB,QAAjByG,EAAEvI,EAAMuB,iBAAS,IAAAgH,IAAI,CACvBO,oBAAgB5X,EAChB2X,sBAAkB3X,EAClBwZ,yBAAqBxZ,GAEvBoX,aAAckC,GAGhB9T,EAAAvG,OAAOvB,IAAI,gCAAgC8D,KAAKC,UAAUuV,IAC1D3Q,EAAKkF,QAAQ0M,KAAKjB,GAClB,MAAOzY,GACPiH,EAAAvG,OAAOV,MAAM,gDAAiDA,KA9DhE0a,EAAclQ,QAAQ,SAAC0Q,GAAiB,OAAAA,EAAa9P,UAAUtD,EAAK+S,oBAiExE,OA3EyCM,EAAAZ,EAAAC,GAahCD,EAAA9b,UAAA4O,MAAP,iBAC0B,QAAxBtC,EAAAhM,KAAK4b,2BAAmB,IAAA5P,KAAEsC,QAC1BtO,KAAK6b,WAAa,GAGbL,EAAA9b,UAAAwX,QAAP,WACElX,KAAKiO,QAAQiJ,SAAU,EACvBlX,KAAKiO,QAAQgN,SAGRO,EAAA9b,UAAA2c,SAAP,iBAAAtT,EAAA/I,KACEA,KAAK6b,WAAa,EACM,QAAxB7P,EAAAhM,KAAK4b,2BAAmB,IAAA5P,KAAEsQ,UAC1Btc,KAAKiO,QAAQqN,QACbtb,KAAK2b,cAAclQ,QAAQ,SAAC0Q,GAAiB,OAAAA,EAAaI,YAAYxT,EAAK+S,mBAGtEN,EAAA9b,UAAA8c,WAAP,SAAkBC,EAAwB7T,WAClC4R,EAAc7X,KAAKsT,IAAgC,QAA7BjK,EAACpD,aAAM,EAANA,EAAQ8T,4BAAoB,IAAA1Q,IAAI,EAAG,GACxC,QAAxB+N,EAAA/Z,KAAK4b,2BAAmB,IAAA7B,KAAE4C,UAAUnC,GACpCxa,KAAKiO,QAAQwM,sCAAsCD,IAG9CgB,EAAA9b,UAAAkd,cAAP,SAAqBC,GACnB,OAAOA,EAAgBC,cAsC3BtB,EA3EA,CAdA5d,EAAA,IAcyCmf,SAA5Bzf,EAAAke,uJCpBb,IAAApC,EAAAxb,EAAA,GAEMof,EAAM,YACNC,EAAO,aACPC,EAAM,wBACNC,EAAO,uBAGA7f,EAAA8f,UAAY,CACvBJ,IAAGA,EACHC,KAAIA,EACJC,IAAGA,EACHC,KAAIA,GAGN7f,EAAA+f,6BAAA,SAA6C/a,GAG3C,OAFAA,EAAOA,EAAKqB,MAAM,QAAQ,GAAG2Z,cAEzBlE,EAAA7R,SAASjF,EAAM,SACV4a,EAEL9D,EAAA7R,SAASjF,EAAM,SAAW8W,EAAA7R,SAASjF,EAAM,SAAW8W,EAAA7R,SAASjF,EAAM,QAC9D0a,EAEL5D,EAAA7R,SAASjF,EAAM,SACV2a,EAEL7D,EAAA7R,SAASjF,EAAM,QACV6a,OADT,sGC3BF,SAAY7G,GACVA,EAAA,gBACAA,EAAA,wBAFF,CAAYhZ,EAAAgZ,aAAAhZ,EAAAgZ,WAAU,qVCCtB,IAAA9N,EAAA5K,EAAA,IACA2f,EAAA3f,EAAA,GAOA4f,EAAA5f,EAAA,IACAsK,EAAAtK,EAAA,GACAub,EAAAvb,EAAA,GACAwb,EAAAxb,EAAA,GACA6f,EAAA7f,EAAA,IAOA8f,EAAA,WA6CE,SAAAA,EAAYC,GAAZ,IAAA5U,EAAA/I,KA5COA,KAAAmP,sBAAqBzE,EAAA,GAA8B8S,EAAAI,8BAKhD5d,KAAA6d,sBAA+D,IAAIrV,EAAAkB,gBACnE1J,KAAA8d,qBAA4C,IAAItV,EAAAkB,gBAEhD1J,KAAA+d,wBAAqDrb,EACrD1C,KAAAge,qBAA+B,EAC/Bhe,KAAAie,qBAA+B,EAC/Bje,KAAAke,mBAA6B,EAG/Ble,KAAAme,oBAA0C,IAAIV,EAAAW,mBAkD/Cpe,KAAAqe,cAAgB,SACrBC,EACAC,GAEAA,EAAcA,GAAe,GACxBxV,EAAKyV,aAGRzV,EAAKyV,aAAaC,UAAUH,EAAWC,EAAanF,EAAAtW,uBAFpDoF,EAAAvG,OAAOvB,IAAI,qDAzBRud,IACHA,EAAO,CACLe,eAAWhc,IAGVib,EAAKe,YACRf,EAAKe,UAAYtF,EAAAtW,uBAGnB9C,KAAK2d,KAAOA,EAqGhB,OA3IEnf,OAAAC,eAAIif,EAAAhe,UAAA,qBAAkB,KAAtB,WACE,OAAOM,KAAKme,qDAGd3f,OAAAC,eAAIif,EAAAhe,UAAA,uBAAoB,KAAxB,WACE,OAAOM,KAAK6d,uDAGdrf,OAAAC,eAAIif,EAAAhe,UAAA,sBAAmB,KAAvB,WACE,OAAOM,KAAK8d,sDAGdtf,OAAAC,eAAIif,EAAAhe,UAAA,oBAAiB,KAArB,WACE,MAAO,CACLif,sBAAuB,EACvBC,qBAAsB,EACtBC,qBAAsB,EACtBC,iBAAkB,EAClBC,iBAAkB,EAClBC,iBAAkB,EAClBC,mBAAoB,oCAIxBzgB,OAAAC,eAAIif,EAAAhe,UAAA,WAAQ,KAAZ,WACE,MAAO,oCAgBFge,EAAAhe,UAAA+O,QAAP,WACEzO,KAAKwe,aAAaU,iBAClBlf,KAAKmP,sBAAsBV,UAC3BzO,KAAK8T,0BACL9T,KAAKme,oBAAoB1P,WAepBiP,EAAAhe,UAAAyf,sBAAP,WACE,MAAO,CACL1J,aAAcY,OAAOhC,OACrBqB,YAAaW,OAAOlC,QAIjBuJ,EAAAhe,UAAAsR,YAAP,aAIO0M,EAAAhe,UAAA0f,cAAP,aAIO1B,EAAAhe,UAAAkY,2BAAP,WACE5X,KAAKke,sBAGAR,EAAAhe,UAAA8O,wBAAP,WACExO,KAAKke,mBAAqB,GAGrBR,EAAAhe,UAAAoU,wBAAP,WACE9T,KAAK+d,wBAAqBrb,GAGrBgb,EAAAhe,UAAAmY,4BAAP,WACE,OAAO7X,KAAKke,oBAAsB/E,EAAAJ,0CAG7B2E,EAAAhe,UAAAqL,cAAP,SAAqBN,GACnB,IAAM4U,EAAgBrf,KAAKwe,aAAac,cAGtCtf,KAAKwe,aAAac,cACkB,UAAnCtf,KAAKwe,aAAac,cAA+D,YAAnCtf,KAAKwe,aAAac,aAUjEtf,KAAKmP,sBAAsB+E,sBAAiBxR,OAAWA,EAAW,CAAC+H,OAAMA,KARzEzK,KAAKqe,cAAcd,EAAA5V,MAAM4X,mBAAoB,CAC3C3L,YAAa5T,KAAK4T,cAEpB5T,KAAKqe,cAAcd,EAAA5V,MAAM0X,GAAgB,CACvC5U,OAAMA,EACNmJ,YAAa5T,KAAK4T,gBAOd8J,EAAAhe,UAAA8f,8BAAV,SAAwCC,GACtC,OACgB,MAAdA,IACCjI,MAAMiI,IACPzf,KAAKge,uBAAyByB,GAC9Bzf,KAAK6X,+BAIC6F,EAAAhe,UAAAggB,wBAAV,SAAkCD,GAChCzf,KAAKge,qBAAuByB,GAGpB/B,EAAAhe,UAAAigB,8BAAV,SAAwCF,GACtC,OACgB,MAAdA,IACCjI,MAAMiI,IACPzf,KAAKie,uBAAyBwB,GAC9Bzf,KAAK6X,+BAIC6F,EAAAhe,UAAAkgB,wBAAV,SAAkCH,GAChCzf,KAAKie,qBAAuBwB,GAGpB/B,EAAAhe,UAAAmgB,aAAV,SAAuBC,EAAwBC,GAC7C,OAAOD,GAAiBC,EA5JR,KA8JpBrC,EA5JA,GAAsBpgB,EAAAogB,oHCpBtB,IAAA5F,EAAA,WAOE,SAAAA,EAAoCnF,EAA8BE,GAA9B7S,KAAA2S,OAA8B3S,KAAA6S,UACpE,OAPgBiF,EAAAkI,gCAAkC,IAAIlI,EAAU,KAAM,IACtDA,EAAAmI,gCAAkC,IAAInI,EAAU,KAAM,IACtDA,EAAAC,kCAAoC,IAAID,EAAU,IAAO,+CACzDA,EAAAoI,0BAA4B,IAAIpI,EAAU,MAAO,uCACjDA,EAAAqI,8BAAgC,IAAIrI,EAAU,MAAO,wCAGrEA,EARA,GAAaxa,EAAAwa,6BCSb,IAEAsI,IAAA,CAIAnT,QAAA,QAIAoT,OAAA,CACAC,UAAA,EACAC,aAAA,EACAC,UAAA,EACAC,QAAA,GAGAC,MAAA,CACAC,mBAAA,IACAC,mBAAA,IACAC,iBAAA,KAGAC,SAAA,IACAC,MAAA,QAIA3hB,OAAA,SAAA4hB,EAAAC,GAEA,IAAAC,EAAA,iBAAAF,EAAAE,QAAA,CAA6D5R,MAAA0R,EAAAE,SAAqBF,EAAAE,QAClFC,EAAAH,EAAAG,UAAAH,EAAA,MACAI,EAAAH,GAAAD,EAAAC,QAAA,GACAI,EAAAL,EAAAK,QAAA,GACAC,EAAAN,EAAAM,WAAA,GACAnO,EAAA,GACAoO,EAAA,GAEAC,EAAA,SAAAC,GACA,IAAAC,EAAAlgB,MAAAmgB,QAAAF,EAAAC,MAAAD,EAAAC,KAAAD,EAAAC,KAAA,CAAAD,EAAAC,MAAA,CAAAtB,EAAAU,UACA3N,EAAAsO,EAAApjB,MAAA8U,EAAAsO,EAAApjB,OAAA,GACA,QAAAkB,EAAA,EAAwBA,EAAAmiB,EAAAjhB,OAAkBlB,IAC1CgiB,EAAAG,EAAAniB,IAAAgiB,EAAAG,EAAAniB,KAAA,GACAgiB,EAAAG,EAAAniB,IAAAyb,KAAAyG,EAAApjB,MAEA8U,EAAAsO,EAAApjB,MAAAqjB,EAAAniB,IAAAkiB,EAAAG,IAAAF,EAAAniB,GAEAkiB,EAAAG,KACAL,EAAAE,EAAAG,IAAAL,EAAAE,EAAAG,KAAA,KAGAV,IACAA,EAAA1P,MAAA0P,EAAA1P,OAAA,UACAgQ,EAAA,CAAanjB,KAAA6iB,EAAA1P,MAAAkQ,KAAA,OAAAE,GAAAV,EAAA5R,SAGb,QAAA/P,EAAA,EAAqBA,EAAA8hB,EAAA5gB,OAAoBlB,IACzCiiB,EAAAH,EAAA9hB,IAEA,QAAAlB,KAAA8U,EACAA,EAAAxT,eAAAtB,KACA+iB,EAAA/iB,GAAA+hB,EAAAyB,WAAAxjB,EAAA8U,EAAA9U,KAGA,QAAAA,KAAAijB,EACAA,EAAA3hB,eAAAtB,KACA+iB,EAAA/iB,GAAAijB,EAAAjjB,IAeA,OAZA+iB,EAAA9Z,QAAA,OACA8Z,EAAAU,GAAA,SAAAxS,GAAyC,OAAA9N,MAAAmgB,QAAArS,KAAAxL,QAAA9D,KAAAsH,UAAA,EAAAtH,KAAAsH,UAAAgI,GACzC8R,EAAAW,IAAA,SAAAvQ,GAAyC,OAAAxR,KAAAgiB,iBAAAtf,IAAAyQ,EAAA3B,KAAA2B,EAAA3B,GAAA7R,eAAAK,KAAAsH,UAAA6L,EAAA3B,GAAA7R,eAAAygB,EAAAU,YACzCM,EAAAa,OAAA,SAAAzQ,GAAyC,OAAAxR,KAAA+hB,IAAAvQ,IACzC4P,EAAAG,YAAA,WAAyC,OAAAA,EAAAvhB,KAAAsH,UAAA,IAAA4a,OAAAX,EAAAnB,EAAAU,WAAA,KACzCM,EAAAe,WAAA,WAAyC,OAAAniB,KAAA8hB,GAAAX,IACzCC,EAAAngB,MAAA+f,EAAA/f,OAAA,SAAA5C,EAAAqjB,EAAAE,EAAAza,EAAAlG,EAAAZ,EAAAohB,GAAoF,MAAAA,GAAAphB,GACpF+gB,EAAAgB,OAAA,WAAoC,OAAA5jB,OAAA6jB,KAAAd,GAAAe,QAEpCpB,MAAAqB,OACAnB,EAAAF,EAAA1P,SAEA4P,GAMAoB,WAAA,SAAApB,EAAAqB,EAAApkB,EAAAqjB,EAAAE,EAAAza,GACA,GAAAsb,EACA,IACA,OAAAA,EAAA9hB,MAAAygB,EAAA,CAAA/iB,EAAAqjB,EAAAE,GAAAM,OAAA/a,IAEA,MAAAsa,GACA,OAAAL,EAAAngB,MAAA5C,EAAAqjB,EAAAE,EAAAza,EAAAiZ,EAAAM,MAAAG,iBAAA,+DAAAY,KAKAiB,eAAA,SAAAtB,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GAA0D,OAAAiZ,EAAAoC,WAAApB,IAAA,cAAA/iB,EAAAqjB,EAAAE,EAAAza,IAC1Dwb,cAAA,SAAAvB,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GAA0D,OAAAiZ,EAAAoC,WAAApB,IAAA,cAAAA,EAAA,QAAA/iB,EAAAqjB,EAAAE,EAAAza,IAC1Dyb,cAAA,SAAAxB,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GAA0D,OAAAiZ,EAAAoC,WAAApB,IAAA,aAAA/iB,EAAAqjB,EAAAE,EAAAza,IAC1D0b,cAAA,SAAAzB,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GAA0D,OAAAiZ,EAAAoC,WAAApB,IAAA,cAAAA,EAAA,QAAA/iB,EAAAqjB,EAAAE,EAAAza,IAC1D2b,YAAA,SAAA1B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GAA0D,OAAAiZ,EAAAoC,WAAApB,IAAA,cAAA/iB,EAAAqjB,EAAAE,EAAAza,IAE1D4b,gBAAA,SAAA3B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GAA0D,OAAAiZ,EAAAoC,WAAApB,IAAA,WAAA/iB,KAAAqjB,EAAAE,EAAAza,IAC1D6b,eAAA,SAAA5B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GAA0D,OAAAiZ,EAAAoC,WAAApB,IAAA,UAAA/iB,IAAA+iB,EAAA,KAAA/iB,KAAAqjB,EAAAE,EAAAza,IAC1D8b,eAAA,SAAA7B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GAA0D,OAAAiZ,EAAAoC,WAAApB,IAAA,UAAAM,GAAArjB,EAAAqjB,EAAAE,EAAAza,IAC1D+b,eAAA,SAAA9B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GAA0D,OAAAiZ,EAAAoC,WAAApB,IAAA,UAAAQ,IAAAR,EAAA,KAAAQ,GAAAvjB,EAAAqjB,EAAAE,EAAAza,IAE1Dgc,YAAA,SAAA/B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACA,QAAAiZ,EAAA2C,gBAAA3B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,KACA,IAAAiZ,EAAAsC,eAAAtB,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACA,UAGAic,WAAA,SAAAhC,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACAiZ,EAAA4C,eAAA5B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACAiZ,EAAAuC,cAAAvB,EAAA/iB,EAAAqjB,EAAAE,EAAAza,IAGAkc,WAAA,SAAAjC,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACA,IAAAmc,EAAAlD,EAAA6C,eAAA7B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACAoc,EAAAnD,EAAAwC,cAAAxB,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACA,WAAAmc,IAAA,IAAAC,IAEAnD,EAAAW,QAAAuC,GAAAlD,EAAAW,QAAAwC,EACAnD,EAAAW,WADA,IAIAyC,WAAA,SAAApC,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACAiZ,EAAA8C,eAAA9B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACAiZ,EAAAyC,cAAAzB,EAAA/iB,EAAAqjB,EAAAE,EAAAza,IAKA0a,WAAA,SAAAxjB,EAAA8U,GACA,kBAEA,IAAAuO,EAAA1hB,KAAAsH,QACAsa,EAAAzO,EAAAuO,KAAAvO,EAAAiN,EAAAU,WAAAV,EAAAU,SAAA3N,EAAAiN,EAAAU,UAAAY,MACAva,EAAA3F,MAAA9B,UAAAgC,MAAAzD,KAAAuC,WAEA,GAAAR,KAAAgiB,WACA,OAAAhiB,KAAAiB,MAAA5C,EAAAqjB,EAAAE,EAAAza,EAAAiZ,EAAAM,MAAAE,mBAAA,SAAAviB,EAAA,+DAEA,GAAA2B,KAAAiiB,OAAA5jB,GACA,OAAA2B,KAAAiB,MAAA5C,EAAAqjB,EAAAE,EAAAza,EAAAiZ,EAAAM,MAAAC,mBAAA,SAAAtiB,EAAA,mCAAA2B,KAAAsH,SAEA,QAAA8Y,EAAA+C,YAAAnjB,KAAA3B,EAAAqjB,EAAAE,EAAAza,GACA,OAAAiZ,EAAAC,OAAAG,UAEA,GAAAkB,IAAAE,EAEA,OADAxB,EAAAgD,WAAApjB,KAAA3B,EAAAqjB,EAAAE,EAAAza,GACAiZ,EAAAC,OAAAE,aAIA,IAAAa,EAAAphB,KACAA,KAAAgiB,WAAA,WAMA,OALAZ,EAAAY,WAAA,KACAZ,EAAA9Z,QAAAsa,EACAxB,EAAAoD,WAAApC,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACAiZ,EAAA0C,YAAA1B,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACAiZ,EAAAgD,WAAAhC,EAAA/iB,EAAAqjB,EAAAE,EAAAza,GACAiZ,EAAAC,OAAAC,WAEAtgB,KAAAgiB,WAAAyB,OAAA,WACArC,EAAAY,WAAA,KACA5B,EAAAgD,WAAAhC,EAAA/iB,EAAAqjB,EAAAE,EAAAza,IAGA,IAAAuc,EAAAtD,EAAAiD,WAAArjB,KAAA3B,EAAAqjB,EAAAE,EAAAza,GACA,WAAAuc,GACA1jB,KAAAgiB,WAAA,KACA5B,EAAAC,OAAAG,WAEAJ,EAAAW,QAAA2C,EACAtD,EAAAC,OAAAI,QAGAzgB,KAAAgiB,WACAhiB,KAAAgiB,kBADA,KAeqCzkB,EAAAD,UACrCA,EAAAC,EAAAD,QAAA8iB,GAEA9iB,EAAA8iB,qWChNA,IAAAvY,EAAAjK,EAAA,IACA2f,EAAA3f,EAAA,GACA+lB,EAAA/lB,EAAA,IAKAuK,EAAAvK,EAAA,GACAwK,EAAAxK,EAAA,GAEMgmB,EAAkC,CAAC,IAAM,IAAM,IAAO,IAAO,OAEnEC,EAAA,WAYE,SAAAA,EAAsB1U,EAA8CwO,GAA9C3d,KAAAmP,wBAVZnP,KAAA8jB,sBAAgC,EAEvB9jB,KAAA+jB,sBAAgC5b,EAAS2Q,6BACzC9Y,KAAAgkB,kBAA4B7b,EAAS6Q,2BAGhDhZ,KAAAikB,gCAA0C,EAKhDjkB,KAAKwe,aAAexe,KAAKkkB,mBAAmBvG,GA6HhD,OAlHEnf,OAAAC,eAAWolB,EAAAnkB,UAAA,eAAY,KAAvB,WACE,OAAOM,KAAKwe,aAAalX,yCAGpBuc,EAAAnkB,UAAAwf,eAAP,WACElf,KAAKmkB,yBACLnkB,KAAKokB,+BAA8B,GACnCpkB,KAAKqkB,mCAKGR,EAAAnkB,UAAA4kB,kCAAV,SAA4ChW,GAA5C,IAAAvF,EAAA/I,UAA4C,IAAAsO,OAAA,GAC1CtO,KAAKukB,wBAAwBjW,GAE7BtO,KAAKwkB,gCAELxkB,KAAKykB,mCAAqC/mB,OAAOga,YAAY,WAC3D,GAAgD,gBAA5C3O,EAAKyV,aAAalX,QAAQgW,cAA9B,CAIA,IAAMpa,GAAY,IAAIH,MAAO2hB,UACvBC,EAAgBzhB,EAAY6F,EAAK+a,sBACvC/a,EAAKoG,sBAAsB8B,UAAU0T,EAAe5b,EAAKyV,aAAalX,QAAQgW,cAAe,CAC3FjL,SAAUsS,IAEZ5b,EAAK+a,sBAAwB5gB,EAC7B6F,EAAKkb,gCAAkCthB,KAAKiiB,IAC1C7b,EAAKkb,gCAAkC,EACvCL,EAAgCnjB,OAAS,GAE3CsI,EAAKub,mCAAkC,QAbrCvb,EAAKwb,2BAcNX,EAAgC5jB,KAAKikB,mCAGhCJ,EAAAnkB,UAAA6kB,wBAAV,SAAkCjW,QAAA,IAAAA,OAAA,GAC5BA,IACFtO,KAAKikB,gCAAkC,GAEzCjkB,KAAKqkB,kCACLrkB,KAAKokB,8BAA8B9V,IAG3BuV,EAAAnkB,UAAA2kB,gCAAV,WACiD,MAA3CrkB,KAAKykB,qCACP/mB,OAAOsa,cAAchY,KAAKykB,oCAC1BzkB,KAAKykB,wCAAqC/hB,IAIpCmhB,EAAAnkB,UAAA8kB,8BAAV,eAAAzb,EAAA/I,KACMA,KAAKikB,gCAAkC,IAG3CjkB,KAAK6kB,yBAA2BnnB,OAAOonB,WAAW,WAChD/b,EAAK0V,UACHlB,EAAA5V,MAAMod,MAAKra,IAAA,GAEN7C,EAAAiQ,UAAUoI,2BAAyB,CACtC5M,KAAM,CACJgH,eAAgB,gCAAgCvR,EAAKib,kBAAiB,mCAG1E5b,EAAMtF,uBAERiG,EAAKoG,sBAAsBV,WAC1BzO,KAAKgkB,qBAGAH,EAAAnkB,UAAA0kB,8BAAV,SAAwC9V,GAClCA,GAA0C,MAAjCtO,KAAK6kB,2BAChBnnB,OAAOsnB,aAAahlB,KAAK6kB,0BACzB7kB,KAAK6kB,8BAA2BniB,IAO1BmhB,EAAAnkB,UAAAulB,+BAAV,SAAyCrR,EAAqBpC,EAAgB+M,GAG5E,MADmD,CAAC3K,YAAWA,EAAEnB,OADlDzS,KAAKklB,8BAA8B1T,KAK1CqS,EAAAnkB,UAAAwlB,8BAAV,SAAwC1T,GACtC,OAAQA,GACN,KAAK+L,EAAA5V,MAAMod,MACT,OAAOpB,EAAAwB,uBAAuBC,aAChC,KAAK7H,EAAA5V,MAAM0d,OACT,OAAO1B,EAAAwB,uBAAuBG,YAChC,KAAK/H,EAAA5V,MAAM4d,mBACT,OAAO5B,EAAAwB,uBAAuBK,QAChC,QACE,OAAO7B,EAAAwB,uBAAuBM,UAI1B5B,EAAAnkB,UAAAgmB,qBAAV,eAAA3c,EAAA/I,KACgC,MAA1BA,KAAK2lB,mBACP3lB,KAAKmkB,yBAEPnkB,KAAK2lB,kBAAoBjoB,OAAOonB,WAAW,WACzC/b,EAAK0V,UAAUlB,EAAA5V,MAAM4d,mBAAoB,GAAInd,EAAMtF,uBACnDiG,EAAKoG,sBAAsBV,WAC1BzO,KAAK+jB,wBAGAF,EAAAnkB,UAAAykB,uBAAV,WACEzmB,OAAOsnB,aAAahlB,KAAK2lB,mBACzB3lB,KAAK2lB,uBAAoBjjB,GAG7BmhB,EA1IA,GAAsBvmB,EAAAumB,yrBCZtB,IAAA+B,EAAAhoB,EAAA,IAEAioB,EAAAjoB,EAAA,IACA2f,EAAA3f,EAAA,GACAkoB,EAAAloB,EAAA,GACAmoB,EAAAnoB,EAAA,GACAkK,EAAAlK,EAAA,IACAooB,EAAApoB,EAAA,IAWAwK,EAAAxK,EAAA,GACAwb,EAAAxb,EAAA,GAIAqoB,EAAA,SAAAxK,GAuBE,SAAAwK,EAAsBC,EAAuCvI,GAA7D,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAM2d,IAAK3d,YADS+I,EAAAmd,eAbdnd,EAAAod,qBAA+B,EAW/Bpd,EAAAqd,oBAA8B,EAkB/Brd,EAAAqE,cAAgB,WAAM,OAAA2Y,EAAAne,OAAOye,OAC7Btd,EAAAwE,cAAgB,WAAM,eACtBxE,EAAAkH,YAAc,WAAM,QAAClH,EAAKmd,cAAend,EAAKmd,aAAa9c,UAC3DL,EAAAoH,sBAAwB,WAAsC,OAAApH,EAAKgV,oBAUnEhV,EAAAsB,OAAS,WAAM,QAACtB,EAAKmd,cAAend,EAAKmd,aAAa7W,WAAaiX,KA3BxEvd,EAAKwd,yBACLxd,EAAKyd,qBAAuB,GAC5Bzd,EAAK0d,sBAAmB/jB,EACxBqG,EAAK2d,aAAc,EACnB3d,EAAK4d,kBAAmB,EACxB5d,EAAK6d,UAAW,EAChB7d,EAAK8d,WAAY,EACjB9d,EAAK+d,kBAAoB,EACzB/d,EAAKge,mBAAqB,EAC1Bhe,EAAKie,iBAAkB,EACvBje,EAAKke,sBAAuB,EAC5Ble,EAAKme,iBAAkB,EACvBne,EAAKsF,uBAAyB,IAAIwX,EAAAsB,UA4kBtC,OAjnBmD/K,EAAA6J,EAAAxK,GACjDjd,OAAAC,eAAIwnB,EAAAvmB,UAAA,WAAQ,KAAZ,WACE,MAAO,oCA0CFumB,EAAAvmB,UAAAiN,WAAP,SAAkB2L,GAKhB,OAJItY,KAAKkmB,cACPlmB,KAAKonB,kBAEPpnB,KAAKqnB,uBACE,IAOFpB,EAAAvmB,UAAA4nB,iBAAP,SAAwB5hB,GACtB,IAAKA,EACH,MAAO,GAGT,OADmB1F,KAAKunB,iBAEtB,IAAK,MACH,MAAO,CAAClS,QAAS3P,GACnB,IAAK,OACH,MAAO,CAAC0P,OAAQ1P,GAClB,QACE,MAAO,CAAC4P,QAAS5P,KAIhBugB,EAAAvmB,UAAAqV,uBAAP,WACE,IAAID,EAAIpK,MAAA,GACH1K,KAAKmf,yBACLnf,KAAKsnB,iBAAiBtnB,KAAKwnB,iBAAe,CAC7CrS,aAAcnV,KAAKunB,gBACnBld,OAAQrK,KAAKqK,SACb4K,KAAMmE,EAAApU,sBAAwB8C,EAAAwO,WAAWmR,WAAa3f,EAAAwO,WAAWC,OACjEjJ,WAAYtN,KAAKuN,gBACjByI,cAAe,IAMbhW,KAAKkmB,eACPpR,EAAIpK,IAAA,GACCoK,GAAI,CACPI,cAAelV,KAAKkmB,aAAa7W,SACjCoE,QAASzT,KAAKkmB,aAAawB,MAC3BlS,kBAAmBxV,KAAKkmB,aAAa7R,OACrCkB,iBAAkBvV,KAAKkmB,aAAa/R,SAIxC,IAAMwT,EAAc3nB,KAAK4nB,6BAUzB,OATID,IACF7S,EAAIpK,IAAA,GACCoK,GAAI,CACPR,oBAAqBqT,EAAYtT,OACjCD,mBAAoBuT,EAAYxT,MAChCK,aAAcmT,EAAYpT,WAIvBO,GAGTtW,OAAAC,eAAcwnB,EAAAvmB,UAAA,cAAW,KAAzB,WACE,IAAKM,KAAKkmB,aACR,MAAM,IAAIxF,MAAM,qBAGlB,OAAO1gB,KAAKkmB,aAAatS,6CAqBpBqS,EAAAvmB,UAAA0nB,gBAAP,SAAuBlB,GAarB,QAbqB,IAAAA,MAAA,MAEjBA,GAAgBlmB,KAAKkmB,eACvBlmB,KAAK6nB,yBACL7nB,KAAKknB,iBAAkB,GAKrBhB,IACFlmB,KAAKkmB,aAAeA,IAGjBlmB,KAAKkmB,aACR,MAAM,IAAIxF,MAAM,0BAGlB,GAAI1gB,KAAKknB,gBACP,MAAM,IAAIxG,MAAM,mDAElB1gB,KAAKknB,iBAAkB,EAEvBlnB,KAAK8nB,uBACL9nB,KAAK+nB,gBASA9B,EAAAvmB,UAAAsoB,YAAP,WACE,IAAMC,EAAYjoB,KAAKwnB,eACvB,GAAKS,QAA2BvlB,IAAdulB,EAGlB,OAAOnC,EAAAzI,6BAA6B4K,IAO/BhC,EAAAvmB,UAAA6nB,cAAP,WACE,IAAMW,EAAWloB,KAAKgoB,cACtB,GAAIE,EACF,OAAOlC,EAAAmC,0BAA0BD,IAQ9BjC,EAAAvmB,UAAA8nB,aAAP,WACE,IAAMtB,EAAelmB,KAAKkmB,aAC1B,GAAKA,EAIL,OAAOA,EAAakC,KAGfnC,EAAAvmB,UAAA2oB,WAAP,WACEroB,KAAKkmB,aAAe,KACpBlmB,KAAKwmB,qBAAuB,GAC5B9oB,OAAOsnB,aAAahlB,KAAKymB,mBAGpBR,EAAAvmB,UAAAooB,qBAAP,eAAA/e,EAAA/I,KACQkmB,EAAelmB,KAAKkmB,aACrBA,IAILlmB,KAAKsoB,0BAA0B,YAAa,WAC1Cvf,EAAKsV,cAAcd,EAAA5V,MAAM4gB,MAAO,MAGlCvoB,KAAKsoB,0BAA0B,iBAAkB,WAYf,IAA5BpC,EAAasC,aAMjBzf,EAAK0f,6BAA4B,GAoCR,MAArB1f,EAAKmd,eACPnd,EAAKsF,uBAAuBC,QAC5BvF,EAAKsF,uBAAuBqa,iBAAiB3f,EAAKmd,aAAa7W,UAC/DtG,EAAKqd,mBAAqBrd,EAAKmd,aAAawB,UAOhD1nB,KAAKsoB,0BAA0B,OAAQ,WAC9B,IAAA1U,EAAesS,EAAYtS,YAElC7K,EAAKke,sBAAuB,EAE5Ble,EAAKsV,cAAcd,EAAA5V,MAAMghB,KAAM,CAC7B/U,YAAWA,MAIf5T,KAAKsoB,0BAA0B,QAAS,WACtCvf,EAAK6f,aAGP5oB,KAAKsoB,0BAA0B,UAAW,WACxCtD,aAAajc,EAAK0d,kBAClB1d,EAAK6d,UAAW,IAGlB5mB,KAAKsoB,0BAA0B,QAAS,mBAC/B1U,EAAsBsS,EAAYtS,YAArB3S,EAASilB,EAAYjlB,MAEzC8H,EAAKsV,cAAcd,EAAA5V,MAAMod,MAAO,CAC9BnR,YAAWA,EAEXjB,KAAiB,QAAb3G,EAAE/K,aAAK,EAALA,EAAO0R,YAAI,IAAA3G,SAAItJ,EACrBmQ,QAAuB,QAAhBkH,EAAE9Y,aAAK,EAALA,EAAO4R,eAAO,IAAAkH,SAAIrX,EAC3B4Q,KAAM,OAIVtT,KAAKsoB,0BAA0B,eAAgB,WACtC,IAAAZ,EAA8BxB,EAAYwB,MAAnC9T,EAAuBsS,EAAYtS,YAAtBiV,EAAU3C,EAAY2C,OAC3CpV,EAAU1K,EAAK8W,aAAa6H,EAAOmB,GAErC9f,EAAKqd,qBAAuB3S,IAC1BA,EACF1K,EAAKsV,cAAcd,EAAA5V,MAAMmhB,KAAM,CAC7BlV,YAAWA,IAGb7K,EAAKsV,cAAcd,EAAA5V,MAAMohB,QAAS,CAChCnV,YAAWA,IAGf7K,EAAKqd,mBAAqB3S,KAI9BzT,KAAKsoB,0BAA0B,UAAW,WACjC,IAAA1U,EAAesS,EAAYtS,YAElC7K,EAAKsV,cAAcd,EAAA5V,MAAMqhB,KAAM,CAC7BpV,YAAWA,MAIf5T,KAAKsoB,0BAA0B,SAAU,WAChC,IAAA1U,EAAesS,EAAYtS,YAElCoR,aAAajc,EAAK0d,kBAElB1d,EAAKsV,cAAcd,EAAA5V,MAAMshB,OAAQ,CAC/BrV,YAAWA,MAIf5T,KAAKsoB,0BAA0B,aAAc,WACpC,IAAA1U,EAAesS,EAAYtS,YAElC7K,EAAK2d,aAAc,EACnB3d,EAAK8d,WAAY,EAGb9d,EAAKke,uBAIJle,EAAK6d,UACR7d,EAAKsV,cAAcd,EAAA5V,MAAMuhB,YAAa,CACpCtV,YAAWA,IAIf7K,EAAK0f,8BAEL1f,EAAKogB,eAMLpgB,EAAKqgB,wBAELrgB,EAAK+d,kBAAoBlT,KAM3B5T,KAAKsoB,0BAA0B,UAAW,cAU1CtoB,KAAKsoB,0BAA0B,UAAW,WAGxCvf,EAAKogB,eACLpgB,EAAKsgB,kBAOFpD,EAAAvmB,UAAA4oB,0BAAP,SAAiC9W,EAAY8X,GAC3C,IAAKtpB,KAAKkmB,aACR,MAAM,IAAIxF,MAAM,qBAGlB,IAAM6I,EAAeD,EAAQhqB,KAAKU,MAElCA,KAAKwmB,qBAAqBxL,KAAK,CAACxJ,MAAKA,EAAE8X,QAASC,IAChDvpB,KAAKkmB,aAAasD,iBAAiBhY,EAAO+X,GAAc,IAGnDtD,EAAAvmB,UAAAqoB,aAAP,WACE,GAAK/nB,KAAKgnB,iBAAoBhnB,KAAKkmB,aAAnC,CAIAlmB,KAAKgnB,iBAAkB,EAEVhnB,KAAK+U,yBAElB/U,KAAKqO,uBAAuBC,QAC5BtO,KAAKqO,uBAAuBqa,iBAAiB1oB,KAAKkmB,aAAa7W,UAC/DrP,KAAKqe,cAAcd,EAAA5V,MAAM4gB,MAAO,CAAC3U,YAAa5T,KAAK4T,gBAM9CqS,EAAAvmB,UAAAmoB,uBAAP,WACE,IAAK7nB,KAAKkmB,aACR,MAAM,IAAIxF,MAAM,qBAGlB,IAAMwF,EAAelmB,KAAKkmB,aAE1BlmB,KAAKwmB,qBAAqB/a,QAAQ,SAACge,GACjCvD,EAAawD,oBAAoBD,EAAKjY,MAAOiY,EAAKH,WAGpDtpB,KAAKqoB,cAGApC,EAAAvmB,UAAA2pB,YAAP,WACE,IAAKrpB,KAAKkmB,aACR,MAAM,IAAIxF,MAAM,qBAEX,IAAA9M,EAAe5T,KAAKkmB,aAAYtS,YAKnC5T,KAAK0mB,aAAgB1mB,KAAK4mB,WAAa5mB,KAAK6mB,YAI5C7mB,KAAK6mB,UACP7mB,KAAKqe,cAAcd,EAAA5V,MAAMqhB,KAAM,CAC7BpV,YAAWA,IAGb5T,KAAKqe,cAAcd,EAAA5V,MAAMgiB,gBAAiB,CACxC/V,YAAWA,IAGf5T,KAAK0mB,aAAc,IAGdT,EAAAvmB,UAAAkpB,SAAP,SAAgBhV,GACd,IAAI5T,KAAK4mB,SAAT,CAGA,IAAK5mB,KAAKkmB,aACR,MAAM,IAAIxF,MAAM,qBAGb9M,IACHA,EAAc5T,KAAKkmB,aAAatS,aAGlC5T,KAAKqe,cAAcd,EAAA5V,MAAMiiB,MAAO,CAC9BhW,YAAWA,IAGb5T,KAAK4mB,UAAW,IAGXX,EAAAvmB,UAAA2nB,qBAAP,WACErnB,KAAK6pB,mBAAmBL,iBAAiB,eAAgBxpB,KAAK8pB,YAAYxqB,KAAKU,OAC/EA,KAAK6pB,mBAAmBL,iBAAiB,SAAUxpB,KAAK8pB,YAAYxqB,KAAKU,QAGpEimB,EAAAvmB,UAAAoqB,YAAP,WACE,IAAK9pB,KAAKmmB,oBAAqB,CAC7BnmB,KAAKmmB,qBAAsB,EAC3B,IAAMD,EAAelmB,KAAKkmB,aACtBtS,OAAW,EACK,MAAhBsS,IACFtS,EAAcsS,EAAatS,aAE7B5T,KAAKqe,cAAcd,EAAA5V,MAAM0d,OAAQ,CAC/BzR,YAAWA,IAGf5T,KAAKyO,WAGAwX,EAAAvmB,UAAA0pB,sBAAP,eAAArgB,EAAA/I,KACE,IAAKA,KAAKkmB,aACR,MAAM,IAAIxF,MAAM,qBAElB,IAAMwF,EAAelmB,KAAKkmB,aACtBA,EAAalU,QACfhS,KAAK4oB,WAGP5D,aAAahlB,KAAKymB,kBAElBzmB,KAAKymB,iBAAmB/oB,OAAOonB,WAAW,WACpCoB,EAAalU,QAAWkU,EAAa6D,QAAUhhB,EAAK2d,aAItCR,EAAatS,YAAc7K,EAAK+d,kBAElCb,EAAqB+D,+BACnCjhB,EAAKsgB,eAENpD,EAAqB+D,gCAGnB/D,EAAAvmB,UAAA+oB,4BAAP,SAAmCwB,GACjC,QADiC,IAAAA,OAAA,IAC5BjqB,KAAKkmB,aACR,MAAM,IAAIxF,MAAM,qBAGlB,IAAMwF,EAAelmB,KAAKkmB,aAEpBgE,EAAmBlqB,KAAK4nB,6BAC9B,GAAKsC,EAAL,CAIO,IAAA3V,EAA0B2V,EAAgB3V,QAAjCJ,EAAiB+V,EAAgB/V,MAA1BE,EAAU6V,EAAgB7V,OAE3ChK,EAASrK,KAAKqK,SAcpB,GAXIA,IAAWrK,KAAK2mB,mBAClB3mB,KAAK2mB,iBAAmBtc,GAUX,MAAXkK,GAAmBvU,KAAKwf,8BAA8BjL,GAAU,CAClEvU,KAAK0f,wBAAwBnL,GAC7B,IAAM4V,EAAY,CAChBhW,MAAKA,EACLE,OAAMA,EACNE,QAAOA,EACPX,YAAasS,EAAatS,aAGvBqW,GACHjqB,KAAKqe,cAAcd,EAAA5V,MAAMyiB,aAAcD,MAKtClE,EAAAvmB,UAAA4K,aAAP,SAAoB1B,EAAa1F,GAC/BlD,KAAKwe,aAAalU,aAAa1B,EAAQ1F,EAAWlD,KAAKkmB,aAAelmB,KAAKkmB,aAAatS,iBAAclR,IAGjGujB,EAAAvmB,UAAA2qB,oCAAP,SAA2CnE,GACzC,GAA+B,MAA3BA,EAAaoE,WAAjB,CAIA,IADA,IACmB/pB,EAAA,EAAAgqB,EADGrE,EAAaoE,WAChB/pB,EAAAgqB,EAAA9pB,OAAAF,IAAe,CAA7B,IAAMiqB,EAAID,EAAAhqB,GACb,GAAiB,MAAbiqB,EAAKvrB,MAA8B,YAAdurB,EAAKvrB,KAAoB,CAChD,IAAMwrB,EAAuC,MAAjBD,EAAK3c,UAAoB2c,EAAK3c,SAASpN,OAAS,EAC5E,MAAO,CACLyW,QAASuT,EACT5c,SAAU4c,EAAsBD,EAAK3c,cAAWnL,IAItD,MAAO,CACLwU,SAAS,KAIH+O,EAAAvmB,UAAA6mB,uBAAV,WACEvmB,KAAKwe,aAAe,IAAIoH,EAAA8E,2BAA2B1qB,KAAKmP,sBAAuBnP,KAAK2d,MACpF3d,KAAKwe,aAAaC,UAAUlB,EAAA5V,MAAMgjB,MAAO,GAAI,IAGvC1E,EAAAvmB,UAAAypB,aAAR,WACE,IAAKnpB,KAAKkmB,aACR,MAAM,IAAIxF,MAAM,qBAElB,IAAMkK,EAAmB5qB,KAAKkmB,aAAatS,YAErCiX,EAAeloB,KAAKmoB,IAAIF,EAAmB5qB,KAAK8mB,mBAIhDiE,GAHoB3iB,EAAMtF,sBAGW9C,KAAK+mB,oBAAsB,IAQlE8D,EAA+B,EAAhBE,IACjB/qB,KAAK6mB,WAAY,EACjB7mB,KAAK4oB,SAAS5oB,KAAK8mB,kBAAoBiE,IAGzC/qB,KAAK+mB,mBAAqB3e,EAAMtF,uBA1mBnBmjB,EAAA+D,8BAAgC,IA4mBjD/D,EAjnBA,CAHAroB,EAAA,IAGmD8f,iBAA7BpgB,EAAA2oB,uHCtBT3oB,EAAA2P,QAAkB,uGCD/B,IAAA/E,EAAAtK,EAAA,GAGAN,EAAAyd,KAAA,SAAqBrV,EAAaslB,EAAWC,EAAoBC,GAC/D,IAAIC,OAD2D,IAAAD,OAAA,GAE/D,IAAIE,GAAa,EAEZ1tB,OAAe2tB,iBAClBD,GAAa,GAIbD,EADEC,EACM,IAAK1tB,OAAe2tB,eAEpB,IAAIC,eAGd,IAAMC,EAAmB,WAEvB,GAAIJ,EAAM3C,YAAc8C,eAAeE,KAAM,CAC3C,GAAIL,EAAMM,cAAgB,EACxB,OAGF,IAAMC,EAAiBxnB,KAAKynB,MAAMR,EAAMM,cAExCR,EAASS,KAITN,EACFD,EAAMS,OAASL,EAEfJ,EAAMU,mBAAqBN,EAG7B,IACEJ,EAAMW,KAAK,OAAQpmB,EAAKwlB,GACnBE,GACHD,EAAMY,iBAAiB,eAAgB,cAEzCZ,EAAMxQ,KAAKzW,KAAKC,UAAU6mB,IAC1B,MAAOvJ,GACPvZ,EAAAvG,OAAOV,MAAM,+BAAgCwgB,yGCrCjD,IAAA/S,EAAA,oBAAAA,KAKA,OAJSA,EAAAhP,UAAA6S,YAAP,SAAmBtH,KACZyD,EAAAhP,UAAAkR,kBAAP,SAAyB3F,KAClByD,EAAAhP,UAAAmX,uBAAP,SAA8B5L,KACvByD,EAAAhP,UAAAssB,cAAP,SAAqB/gB,KACvByD,EALA,GAAapR,EAAAoR,sHCCb,IAAAhF,EAAA,oBAAAA,IACU1J,KAAAshB,UAAwC,GAyBlD,OAvBS5X,EAAAhK,UAAA2M,UAAP,SAAiB4e,GAAjB,IAAAliB,EAAA/I,KAGE,OAFAA,KAAKshB,UAAUtG,KAAKiQ,GAEb,WAAM,OAAAliB,EAAKwT,YAAY0O,KAGzBvhB,EAAAhK,UAAAoT,SAAP,SAAgB3L,GACInH,KAAKshB,UAAU5f,MAAM,GAC7B+J,QAAQ,SAACwf,GACjBA,EAAS9jB,MAINuC,EAAAhK,UAAA6c,YAAP,SAAmB0O,GACjB,IAAMvQ,EAAQ1a,KAAKshB,UAAUxd,QAAQmnB,GACjCvQ,GAAS,GACX1a,KAAKshB,UAAUva,OAAO2T,EAAO,IAIjClc,OAAAC,eAAWiL,EAAAhK,UAAA,kBAAe,KAA1B,WACE,OAAOM,KAAKshB,UAAU7gB,wCAE1BiJ,EA1BA,GAAapM,EAAAoM,gDCLb,IAAKuiB,mDAAL,SAAKA,GACHA,IAAA,eACAA,IAAA,6BACAA,IAAA,mDACAA,IAAA,mDAJF,CAAKA,MAAuB,KAO5B,IAAAC,EAAA,oBAAAA,IACUlsB,KAAAmsB,QAAsB,GACtBnsB,KAAAkV,cAA+B,KA+GzC,OA7GSgX,EAAAxsB,UAAA4O,MAAP,WACEtO,KAAKmsB,QAAU,IAOVD,EAAAxsB,UAAAgpB,iBAAP,SAAwBxT,GACtBlV,KAAKkV,cAAgC,IAAhBA,GAQhBgX,EAAAxsB,UAAA0X,WAAP,SAAkB+U,GAChB,GAA0B,MAAtBnsB,KAAKkV,cACP,MAAM,IAAIwL,MAAM,gDAGlB1gB,KAAKmsB,QAAQnR,KAAKmR,GAClB,IAAMC,EAAsBpsB,KAAKqsB,aAAarsB,KAAKmsB,SACnD,OAAQnsB,KAAKssB,YAAYH,GAAWC,GAAuBpsB,KAAKkV,eAM3DgX,EAAAxsB,UAAA4X,wBAAP,WACE,GAA0B,MAAtBtX,KAAKkV,cACP,MAAM,IAAIwL,MAAM,gDAIlB,IADA,IAAIyL,EAAU,EACE5rB,EAAA,EAAAyL,EAAAhM,KAAKmsB,QAAL5rB,EAAAyL,EAAAvL,OAAAF,IAAc,CAAzB,IAAMgsB,EAACvgB,EAAAzL,GACV4rB,GAAWnsB,KAAKssB,YAAYC,GAE9B,OAAOJ,EAAUnsB,KAAKkV,eAShBgX,EAAAxsB,UAAA2sB,aAAR,SAAqBF,GACnB,IAAK,IAAIruB,EAAI,EAAGA,EAAIquB,EAAQ1rB,OAAQ3C,IAElC,IADA,IAAM0uB,EAAQL,EAAQruB,GACb2uB,EAAI3uB,EAAI,EAAG2uB,EAAIN,EAAQ1rB,OAAQgsB,IAAK,CAC3C,IAAMC,EAAQP,EAAQM,GAClBL,EAAsB,EACpBO,EAAc3sB,KAAK4sB,mBAAmBJ,EAAOE,GAYnD,GAVIC,IAAgBV,EAAwBY,aAC1C7sB,KAAK8sB,gBAAgBN,EAAO1uB,EAAG4uB,EAAOD,GACtCL,EAAsBpsB,KAAK+sB,uBAAuBP,EAAOE,IAChDC,IAAgBV,EAAwBe,wBACjDhtB,KAAKmsB,QAAQplB,OAAOjJ,EAAG,GACvBsuB,EAAsBpsB,KAAKssB,YAAYE,IAC9BG,IAAgBV,EAAwBgB,yBACjDjtB,KAAKmsB,QAAQplB,OAAO0lB,EAAG,GACvBL,EAAsBpsB,KAAKssB,YAAYI,IAErCC,IAAgBV,EAAwBiB,KAC1C,OAAOd,EAAsBpsB,KAAKqsB,aAAarsB,KAAKmsB,SAI1D,OAAO,GAGDD,EAAAxsB,UAAAktB,mBAAR,SAA2BO,EAAiBC,GAC1C,OACGptB,KAAKqtB,mBAAmBF,EAAMlZ,IAAKmZ,IAAWD,EAAM9V,MAAQ+V,EAAO/V,OACnErX,KAAKqtB,mBAAmBF,EAAM9V,MAAO+V,IAAWD,EAAMlZ,IAAMmZ,EAAOnZ,IAE7DgY,EAAwBY,YACtB7sB,KAAKqtB,mBAAmBF,EAAM9V,MAAO+V,IAAWptB,KAAKqtB,mBAAmBF,EAAMlZ,IAAKmZ,GACrFnB,EAAwBe,uBACtBhtB,KAAKqtB,mBAAmBD,EAAO/V,MAAO8V,IAAUntB,KAAKqtB,mBAAmBD,EAAOnZ,IAAKkZ,GACtFlB,EAAwBgB,uBAE1BhB,EAAwBiB,MAGzBhB,EAAAxsB,UAAA2tB,mBAAR,SAA2BC,EAAgBC,GACzC,OAAOD,GAAUC,EAASlW,OAASiW,EAASC,EAAStZ,KAG/CiY,EAAAxsB,UAAAotB,gBAAR,SAAwBK,EAAiBK,EAAoBJ,EAAkBK,GAC7E,IAAMxZ,EAAMkZ,EAAMlZ,IAAMmZ,EAAOnZ,IAAMkZ,EAAMlZ,IAAMmZ,EAAOnZ,IAElDyZ,EAA+B,CAACrW,MADxB8V,EAAM9V,MAAQ+V,EAAO/V,MAAQ8V,EAAM9V,MAAQ+V,EAAO/V,MACnBpD,IAAGA,GAChDjU,KAAKmsB,QAAQplB,OAAOymB,EAAY,EAAGE,GACnC1tB,KAAKmsB,QAAQplB,OAAO0mB,EAAa,IAG3BvB,EAAAxsB,UAAAqtB,uBAAR,SAA+BI,EAAiBC,GAG9C,OAFYD,EAAMlZ,IAAMmZ,EAAOnZ,IAAMkZ,EAAMlZ,IAAMmZ,EAAOnZ,MAC1CkZ,EAAM9V,OAAS+V,EAAO/V,MAAQ8V,EAAM9V,MAAQ+V,EAAO/V,QAI3D6U,EAAAxsB,UAAA4sB,YAAR,SAAoBH,GAClB,OAAOxpB,KAAKmoB,IAAIqB,EAAQlY,IAAMkY,EAAQ9U,QAE1C6U,EAjHA,mJC4Ba5uB,EAAAkO,qBAAsD,CACjE,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,kBAMWlO,EAAAkH,qBAAuBlH,EAAAkO,qBAAqBmiB,OAAO,SAAC7vB,GAAM,OAAAA,EAAE2I,MAAM,oBAAmBhG,8GC1ElG,IAAAmtB,EAAA,WAoBA,OAbE,SACEpc,EACAkQ,EACAE,EACA1e,EACAqb,GAEAve,KAAKwR,MAAQA,EACbxR,KAAK0hB,KAAOA,EACZ1hB,KAAK4hB,GAAKA,EACV5hB,KAAKkD,UAAYA,EACjBlD,KAAKue,YAAcA,GAlBvB,GAAajhB,EAAAswB,kHCAb,SAAYC,GACVA,EAAA,kBACAA,EAAA,sBACAA,EAAA,wBAHF,CAAYvwB,EAAAuwB,WAAAvwB,EAAAuwB,SAAQ,mICGPvwB,EAAAwwB,sCAAwC,SACnDC,EACA5gB,GAEA,IAAK4gB,EACH,MAAO,CACLC,iBAAatrB,EACb4S,aAAS5S,GAIb,GAA2B,iBAAhBqrB,EACT,MAAO,CACLC,YAAa,EACb1Y,QAASyY,GAIb,GAAIvsB,MAAMmgB,QAAQoM,IAAgBA,EAAYttB,OAAS,EAAG,CACxD,IAAMwtB,EAAoB9gB,EAAO+gB,uBAC7BC,EAAwB,EAM5B,OAJIF,SAAkEzW,OAAOyW,EAAkBG,MAC7FD,GAAyBF,EAAkBG,IAGtC,CACLJ,YAAaD,EAAYI,GAAuB5Z,SAAW,EAC3De,QAASyY,EAAYI,GAAuBzoB,KAIhD,MAA2B,iBAAhBqoB,GAA6BvsB,MAAMmgB,QAAQoM,GAO/C,CACLC,iBAAatrB,EACb4S,aAAS5S,GARF,CACLsrB,YAAaD,EAAYxZ,SAAW,EACpCe,QAASyY,EAAYroB,iHCpC3B,IAAA2oB,EAAAzwB,EAAA,IACA0wB,EAAA1wB,EAAA,IAEA2wB,EAAA,WAGE,SAAAA,IACEvuB,KAAKwuB,SAAW,GA4FpB,OAzFSD,EAAA7uB,UAAA4O,MAAP,WACEtO,KAAKwuB,SAAW,IAGXD,EAAA7uB,UAAA+uB,eAAP,SAAsBC,GACpB,KAAIA,EAAYC,YAAc,KAA9B,CAGA,IAAMC,EAAU,IAAIN,EAAAO,QAAQH,GAEtBI,EAAaT,EAAAU,UAAUC,YAAY,KACrCJ,EAAQK,OAASH,GAIrB9uB,KAAKwuB,SAASxT,KAAK4T,KAGdL,EAAA7uB,UAAAwvB,QAAP,WACE,MAAO,CACLvQ,sBAAuB3e,KAAKwuB,SAAS/tB,OACrCme,qBAAsB5e,KAAKwuB,SAASrb,IAAI,SAACjV,GAAM,OAAAA,EAAE+W,OAAM7N,OAAOpH,KAAKwhB,IAAK,GACxE3C,qBAAsBlc,KAAKwsB,KAAwB,IAAnBnvB,KAAKovB,aACrCtQ,iBAAkB9e,KAAKqvB,WACvBtQ,iBAAkB/e,KAAKsvB,WACvBtQ,iBAAkBhf,KAAKuvB,WACvBtQ,mBAAoBjf,KAAKif,uBAIrBsP,EAAA7uB,UAAA8hB,IAAR,SAAYgO,EAAWC,GACrB,OAAOD,EAAIC,GAGLlB,EAAA7uB,UAAA2vB,SAAR,WACE,GAA6B,IAAzBrvB,KAAKwuB,SAAS/tB,OAChB,OAAO,EAET,IAAMivB,EAAa1vB,KAAK2vB,SAASvoB,OAAO,SAACooB,EAAGC,GAC1C,OAAOD,EAAIC,GACV,GACGG,EAAkB5vB,KAAKwuB,SAAS/tB,OACtC,OAAOT,KAAK6vB,4BAA4BH,EAAaE,IAG/CrB,EAAA7uB,UAAAmwB,4BAAR,SAAoCC,GAClC,OAAOzB,EAAAU,UAAUgB,YAAYD,IAGvBvB,EAAA7uB,UAAA4vB,SAAR,WACE,OAA6B,IAAzBtvB,KAAKwuB,SAAS/tB,OACT,EAEFT,KAAK6vB,4BAA4BltB,KAAKiiB,IAAGjkB,MAARgC,KAAY3C,KAAK2vB,YAGnDpB,EAAA7uB,UAAAiwB,OAAR,WACE,OAAO3vB,KAAKwuB,SAASrb,IAAI,SAACjV,GACxB,OAAOA,EAAE+wB,SAILV,EAAA7uB,UAAA6vB,SAAR,WACE,OAA6B,IAAzBvvB,KAAKwuB,SAAS/tB,OACT,EAEFT,KAAK6vB,4BAA4BltB,KAAKsT,IAAGtV,MAARgC,KAAY3C,KAAK2vB,YAGnDpB,EAAA7uB,UAAA0vB,UAAR,WACE,OAA6B,IAAzBpvB,KAAKwuB,SAAS/tB,OACT,EAEFT,KAAKwuB,SAASpnB,OAAO,SAACooB,EAAGC,GAC9B,OAAOD,EAAIC,EAAEpgB,UACZ,IAGGkf,EAAA7uB,UAAAuf,mBAAR,WACE,GAA6B,IAAzBjf,KAAKwuB,SAAS/tB,OAChB,OAAO,EAET,IAAMuvB,EACJhwB,KAAKwuB,SAASpnB,OAAO,SAACooB,EAAGC,GACvB,OAAOD,EAAwB,IAApBC,EAAEQ,iBACZ,GAAKjwB,KAAKwuB,SAAS/tB,OAExB,OAAOkC,KAAKwsB,KAAKa,IAErBzB,EAhGA,GAAajxB,EAAAixB,2qBCLb,IASK2B,EATL9P,EAAAxiB,EAAA,IACA2f,EAAA3f,EAAA,GAIAsK,EAAAtK,EAAA,GACAwK,EAAAxK,EAAA,GACAuyB,EAAAvyB,EAAA,KAEA,SAAKsyB,GACHA,EAAA,0BACAA,EAAA,cACAA,EAAA,kBACAA,EAAA,cACAA,EAAA,kBACAA,EAAA,0BACAA,EAAA,cACAA,EAAA,8BACAA,EAAA,gCACAA,EAAA,0CACAA,EAAA,sDACAA,EAAA,UACAA,EAAA,cACAA,EAAA,QACAA,EAAA,kCACAA,EAAA,4BACAA,EAAA,0BACAA,EAAA,4BACAA,EAAA,kBACAA,EAAA,sCACAA,EAAA,0CACAA,EAAA,gDACAA,EAAA,oCAvBF,CAAKA,MAAK,KA0BV,IAAAxF,EAAA,SAAAjP,GAGE,SAAAiP,EAAYvb,EAA8CwO,GAA1D,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAMmP,EAAuBwO,IAAK3d,YAiV7B+I,EAAAuB,aAAe,SAAC1B,EAAa1F,EAAmB0Q,GACrD7K,EAAK0V,UAAUlB,EAAA5V,MAAMyoB,qBAAsB,CAACxnB,OAAMA,EAAEgL,YAAWA,GAAG1Q,IAjVlE6F,EAAKsnB,cAAgB,KAErBtnB,EAAKmb,mBAAmBvG,KAiV5B,OAxVgDvB,EAAAsO,EAAAjP,GAUvCiP,EAAAhrB,UAAA4wB,aAAP,WACE,OAAA1vB,EACKpC,OAAO6jB,KAAK6N,GAAO/c,IAAI,SAAC9T,GAAQ,OAAA6wB,EAAM7wB,KAAK,CAC9C,6BACA,uBACA,sCAIGqrB,EAAAhrB,UAAA6wB,gBAAP,SAAuBnO,GACrB,OAAOpiB,KAAKswB,eAAe3C,OAAO,SAAC7vB,GAAM,OAAAskB,EAAOte,QAAQhG,GAAK,KAGxD4sB,EAAAhrB,UAAAwkB,mBAAP,SAA0BvG,GAA1B,IAAA5U,EAAA/I,KACE,OAAOogB,EAAahhB,OAAO,CACzB8hB,QAASgP,EAAMM,YACfvvB,MAAO,SAACwvB,EAAW/O,EAAME,EAAIza,EAAMuL,EAAWE,GAC5C1K,EAAAvG,OAAOV,MAAM,0BAA4B2R,IAE3CyO,OAAQ,CACN,CAAChjB,KAAMkf,EAAA5V,MAAMgjB,MAAOjJ,KAAMwO,EAAMM,YAAa5O,GAAIsO,EAAMvF,OACvD,CAACtsB,KAAMkf,EAAA5V,MAAMgjB,MAAOjJ,KAAMwO,EAAMvF,MAAO/I,GAAIsO,EAAMvF,OACjD,CAACtsB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMvF,MAAO/I,GAAIsO,EAAMvF,OACvD,CAACtsB,KAAMkf,EAAA5V,MAAM4gB,MAAO7G,KAAM,CAACwO,EAAMvF,MAAOuF,EAAMnL,MAAOmL,EAAMQ,IAAKR,EAAMS,iBAAkB/O,GAAIsO,EAAM3H,OAClG,CAAClqB,KAAMkf,EAAA5V,MAAM4gB,MAAO7G,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OACjD,CAAClqB,KAAMkf,EAAA5V,MAAM4gB,MAAO7G,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAEnD,CAACvyB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAMU,SAEhD,CAACvyB,KAAMkf,EAAA5V,MAAMod,MAAOrD,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMW,wBACnD,CAACxyB,KAAMkf,EAAA5V,MAAM0d,OAAQ3D,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMW,wBACpD,CAACxyB,KAAMkf,EAAA5V,MAAM4d,mBAAoB7D,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMW,wBAEhE,CAACxyB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC7D,CAACvyB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC3D,CAACvyB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC1D,CAACvyB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAE1D,CAACvyB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAMU,SACvD,CAACvyB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMc,SACzD,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SACzD,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OACvD,CAACvrB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAEvD,CAACvrB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAElD,CAACvrB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SAC3D,CAAC3yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMe,aAC7D,CAAC5yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aAEjE,CAAC5yB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMc,SACtD,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMc,SAG7D,CAAC3yB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAClD,CAACvyB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBAEzD,CAAC7yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMtG,OACnD,CAACvrB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMtG,OAEvD,CAACvrB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMc,SAChD,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMc,SAEvD,CAAC3yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMiB,eAC1D,CAAC9yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMiB,eAC1D,CAAC9yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMiB,eAChE,CAAC9yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMiB,eAChE,CAAC9yB,KAAM,uBAAwBqjB,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMc,SAEpE,CAAC3yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMkB,qBACxD,CAAC/yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMkB,qBACxD,CACE/yB,KAAMkf,EAAA5V,MAAMyiB,aACZ1I,KAAMwO,EAAMkB,oBACZxP,GAAIsO,EAAMkB,qBAEZ,CACE/yB,KAAMkf,EAAA5V,MAAMopB,aACZrP,KAAMwO,EAAMkB,oBACZxP,GAAIsO,EAAMkB,qBAEZ,CAAC/yB,KAAM,6BAA8BqjB,KAAMwO,EAAMkB,oBAAqBxP,GAAIsO,EAAMtG,OAEhF,CAACvrB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMgB,gBAChD,CAAC7yB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACzD,CAAC7yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACjE,CAAC7yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACjE,CAAC7yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACpE,CAAC7yB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBAClE,CAAC7yB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMtG,OAC3D,CAACvrB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMc,SAChE,CAAC3yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMtG,OAE1D,CAACvrB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMQ,KACxD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMQ,KACjD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMQ,KAC/C,CAACryB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAC/C,CAACryB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAC9C,CAACryB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAChD,CAACryB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACrD,CAACryB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACvD,CAACryB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACzD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAG7C,CAACryB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SACpD,CAAC3yB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SAElD,CAAC3yB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMc,SAE9C,CAAC3yB,KAAMkf,EAAA5V,MAAMod,MAAOrD,KAAM1hB,KAAKuwB,gBAAgB,CAACL,EAAMU,UAAWhP,GAAIsO,EAAMnL,OAC3E,CAAC1mB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMnL,MAAOnD,GAAIsO,EAAMnL,OAEjD,CAAC1mB,KAAMkf,EAAA5V,MAAM0d,OAAQ3D,KAAM1hB,KAAKuwB,gBAAgB,CAACL,EAAMU,UAAWhP,GAAIsO,EAAMQ,KAE5E,CAACryB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMoB,mBAC7D,CAACjzB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAC3D,CAACvrB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAC3D,CAAClqB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC7D,CAACvyB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aACjE,CAAC5yB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMoB,kBAAmB1P,GAAIsO,EAAMoB,mBACvE,CAACjzB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMoB,kBAAmB1P,GAAIsO,EAAMc,SAEnE,CAAC3yB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMsB,qBAChE,CAACnzB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAC9D,CAACvrB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAC9D,CAAClqB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAChE,CAACvyB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aACpE,CAAC5yB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMsB,oBAAqB5P,GAAIsO,EAAMsB,qBAC5E,CAACnzB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMsB,oBAAqB5P,GAAIsO,EAAMc,SAErE,CAAC3yB,KAAMkf,EAAA5V,MAAM8pB,SAAU/P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMwB,IACtD,CAACrzB,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMwB,GAAI9P,GAAIsO,EAAMc,SAE/C,CAAC3yB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM0B,cAChD,CAACvzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM0B,cACnD,CAACvzB,KAAM,gBAAiBqjB,KAAMwO,EAAM0B,aAAchQ,GAAIsO,EAAM3H,OAE5D,CAAClqB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAM2B,aAClD,CAACxzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAM2B,aACrD,CAACxzB,KAAM,gBAAiBqjB,KAAMwO,EAAM2B,YAAajQ,GAAIsO,EAAMc,SAE3D,CAAC3yB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAM4B,cAChD,CAACzzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAM4B,cACnD,CAACzzB,KAAM,gBAAiBqjB,KAAMwO,EAAM4B,aAAclQ,GAAIsO,EAAMtG,OAE5D,CAACvrB,KAAMkf,EAAA5V,MAAMoqB,WAAYrQ,KAAM,CAACwO,EAAM3H,MAAO2H,EAAMtG,OAAQhI,GAAIsO,EAAM8B,SACrE,CAAC3zB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACnD,CAAC3zB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACzD,CAAC3zB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACpD,CAAC3zB,KAAMkf,EAAA5V,MAAMsqB,SAAUvQ,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM3H,OAEtD,CAAClqB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAChD,CAAClqB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAClD,CAAClqB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAEpD,CAACvyB,KAAMkf,EAAA5V,MAAMuqB,cAAexQ,KAAM1hB,KAAKswB,eAAgB1O,GAAIsO,EAAMvF,OACjE,CAACtsB,KAAMkf,EAAA5V,MAAMyoB,qBAAsB1O,KAAM1hB,KAAKswB,eAAgB1O,GAAIsO,EAAMS,iBACxE,CAACtyB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMS,gBAAiB/O,GAAIsO,EAAMS,iBACjE,CAACtyB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMS,gBAAiB/O,GAAIsO,EAAMS,iBAE3D,CAACtyB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMiC,2BAC9D,CAAC9zB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMiC,2BAC9D,CACE9zB,KAAMkf,EAAA5V,MAAMyiB,aACZ1I,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMiC,2BAEZ,CACE9zB,KAAMkf,EAAA5V,MAAMopB,aACZrP,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMiC,2BAEZ,CACE9zB,KAAM,mCACNqjB,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMe,aAGZ,CAAC5yB,KAAMkf,EAAA5V,MAAM4X,mBAAoBmC,KAAM,CAACwO,EAAMc,QAASd,EAAMtG,OAAQhI,GAAIsO,EAAMkC,kBAC/E,CAAC/zB,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAMkC,iBAAkBxQ,GAAIsO,EAAMc,SAC9D,CAAC3yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMkC,iBAAkBxQ,GAAIsO,EAAMtG,OAE5D,CAACvrB,KAAMkf,EAAA5V,MAAM0qB,oBAAqB3Q,KAAM1hB,KAAKswB,eAAgB1O,GAAIsO,EAAM3H,QAEzEjH,UAAW,CACTgR,aAAc,SAAC9gB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC5B,SAATmD,GAAmB/D,EAAKe,UAC1B3V,EAAK+a,sBAAwBnG,EAAKe,UAElC3V,EAAK+a,sBAAwB5gB,GAAakF,EAAMtF,sBAGlDoF,EAAAvG,OAAOvB,IACL,UAAU8C,EAAS,KAAKgF,EAAA5G,SAASsgB,EAAI,IAAG,WAAW1Z,EAAA5G,SAASkQ,EAAO,IAAG,UAAUtJ,EAAA5G,SAASogB,EAAM,KAG7FnD,GAAeqD,IAAOsO,EAAMgB,gBAC9BnoB,EAAKoG,sBAAsBuC,2BAA2B6M,GAGpD/M,IAAU+L,EAAA5V,MAAMoqB,YAAcnQ,IAAOsO,EAAM8B,SAC7CjpB,EAAKoG,sBAAsBojB,aAAarvB,EAAWqb,GAGjDqD,IAAOsO,EAAMe,aACfloB,EAAKub,qCAGTkO,aAAc,SAAChhB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GACrC/M,IAAU+L,EAAA5V,MAAMyoB,sBAClBrnB,EAAKoG,sBAAsB0E,mBAAmB0K,GAE5C/M,IAAU+L,EAAA5V,MAAM0qB,qBAClBtpB,EAAKoG,sBAAsB4E,mBAAmBwK,GAE5CqD,IAAOsO,EAAMkB,qBACfroB,EAAKyV,aAAaiU,2BAA2BvvB,GAE3C0e,IAAOsO,EAAMiB,eACfpoB,EAAKyV,aAAakU,qBAAqBxvB,GAErC0e,IAAOsO,EAAMiC,2BACfppB,EAAKyV,aAAamU,iCAAiCzvB,GAEjD0e,IAAOsO,EAAM0B,cAAgBhQ,IAAOsO,EAAM2B,aAAejQ,IAAOsO,EAAM4B,cACxE/oB,EAAKyV,aAAaoU,cAAc1vB,IAGpC2vB,aAAc,SAACrhB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAKzC,GAJImD,IAASwO,EAAMe,aACjBloB,EAAKwb,0BAGFrhB,EAAL,CAIAgF,EAAAvG,OAAOvB,IACL,UAAU8C,EAAS,KAAKgF,EAAA5G,SAASogB,EAAM,IAAG,WAAWxZ,EAAA5G,SAASkQ,EAAO,IAAG,QAAQtJ,EAAA5G,SAASsgB,EAAI,KAG/F,IAAM+C,EAAgBzhB,EAAY6F,EAAK+a,sBAEnCvF,GAAeqD,IAAOsO,EAAMgB,gBAC9BnoB,EAAKoG,sBAAsBsC,yBAAyB8M,GAGlDmD,IAASwO,EAAM3H,OAAS3G,IAAOsO,EAAMU,QACvC7nB,EAAK2c,uBACIhE,IAASwO,EAAMU,SAAWhP,IAAOsO,EAAMc,SAChDjoB,EAAKob,yBAGP,IAAM2O,EAAS1uB,OAAOsd,GAAMpE,cAC5B,GAAIsE,IAAOsO,EAAMW,uBAAwB,CACvC9nB,EAAKob,yBACL,IAAMgG,EAAYphB,EAAKkc,+BAA+B/hB,EAAWsO,EAAO+M,GAClEwU,EAAmBvhB,IAAU+L,EAAA5V,MAAMod,MACzChc,EAAKoG,sBAAsBmD,iBAAiB6X,EAAW4I,QAClD,GAAIrR,IAASwO,EAAMgB,eAAgB,CACxC,IAAM8B,EAAe9vB,EAAY6F,EAAKsnB,cACtCtnB,EAAKsnB,cAAgB,KACrBtnB,EAAKoG,sBAAsB2jB,GAAQE,EAAcF,EAAQvU,QACpD,GAAI/M,IAAU+L,EAAA5V,MAAM0d,OACzBtc,EAAKoG,sBAAsBsB,OAAOkU,EAAemO,QAC5C,GAAIpR,IAASwO,EAAMtG,OAAShI,IAAOsO,EAAMgB,eAC9CnoB,EAAKoG,sBAAsBuC,2BAA2BF,GACtDzI,EAAKoG,sBAAsB4C,MAAM4S,EAAemO,OAC3C,CACL,IAAMG,EAAmBlqB,EAAKoG,sBAAsB2jB,GACpB,mBAArBG,EACTA,EAAiBtO,EAAemO,EAAQvU,GAExCrW,EAAAvG,OAAOV,MAAM,wCAA0C6xB,GAIvDvU,GAAeqD,IAAOsO,EAAMgB,gBAC9BnoB,EAAKoG,sBAAsBuC,2BAA2B6M,GAGpD/M,IAAU+L,EAAA5V,MAAMyiB,aAClBrhB,EAAKoG,sBAAsBoC,YAAYgN,GAC9B/M,IAAU+L,EAAA5V,MAAMopB,aACzBhoB,EAAKoG,sBAAsByC,YAAY2M,GAC9B/M,IAAU+L,EAAA5V,MAAMmhB,KACzB/f,EAAKoG,sBAAsBqE,OAClBhC,IAAU+L,EAAA5V,MAAMohB,SACzBhgB,EAAKoG,sBAAsBuE,WAG/Bwf,OAAQ,SAAC1hB,EAAOkQ,EAAME,EAAI1e,GACxB6F,EAAKsnB,cAAgBtnB,EAAKsnB,eAAiBntB,GAE7CiwB,cAAe,SAAC3hB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1C,IAAMoG,EAAgBzhB,EAAY6F,EAAK+a,sBAEnCa,EAAgB,QAClB5b,EAAKoG,sBAAsBsC,yBAAyB8M,GAEpDxV,EAAKoG,sBAAsB8B,UAAU0T,EAAevgB,OAAOsd,GAAMpE,cAAe,CAAC/M,OAAQoU,IACzF5b,EAAK+a,sBAAwB5gB,EAE7B6F,EAAKoG,sBAAsBuC,2BAA2B6M,KAG1D6U,cAAe,SAAC5hB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1CxV,EAAKoG,sBAAsBlO,MAAMsd,QAMlCmM,EAAAhrB,UAAA+e,UAAP,SACEH,EACAC,EACArb,GAEA,IAAM0D,EAAO5G,KAAKwe,aAAaF,GAE3B1X,EACFA,EAAK3I,KAAK+B,KAAKwe,aAActb,EAAWqb,GAExCrW,EAAAvG,OAAOvB,IAAI,kBAAoBke,IAOrCoM,EAxVA,CAAgDyF,EAAAtM,uBAAnCvmB,EAAAotB,qJCnCb,IAAA5E,EAAAloB,EAAA,GAEOof,EAAwB8I,EAAA1I,UAASJ,IAA5BC,EAAmB6I,EAAA1I,UAASH,KAAtBC,EAAa4I,EAAA1I,UAASF,IAAjBC,EAAQ2I,EAAA1I,UAASD,KAElCkW,IAAOrnB,EAAA,IACVgR,GAAM,cACPhR,EAACiR,GAAO,cACRjR,EAACkR,GAAM,MACPlR,EAACmR,GAAO,UAGV7f,EAAA6qB,0BAAA,SAA0CmL,GACxC,OAAOD,EAAQC,mSCZjB,IAAAC,EAAA31B,EAAA,IAqCQY,OAAAC,eAAAnB,EAAA,oBAAAoB,YAAA,EAAAC,IAAA,kBArCA40B,EAAAC,oBACR,IAAAC,EAAA71B,EAAA,IAmCQY,OAAAC,eAAAnB,EAAA,oBAAAoB,YAAA,EAAAC,IAAA,kBAnCA80B,EAAAC,oBACR,IAAAC,EAAA/1B,EAAA,IAqCQY,OAAAC,eAAAnB,EAAA,gBAAAoB,YAAA,EAAAC,IAAA,kBArCAg1B,EAAAC,gBACR,IAAAC,EAAAj2B,EAAA,IAsCQY,OAAAC,eAAAnB,EAAA,iBAAAoB,YAAA,EAAAC,IAAA,kBAtCAk1B,EAAAC,iBACR,IAAAC,EAAAn2B,EAAA,IA+BQY,OAAAC,eAAAnB,EAAA,cAAAoB,YAAA,EAAAC,IAAA,kBA/BAo1B,EAAAC,cACR,IAAAC,EAAAr2B,EAAA,IAqCQY,OAAAC,eAAAnB,EAAA,2BAAAoB,YAAA,EAAAC,IAAA,kBArCAs1B,EAAAC,2BACR,IAAAC,EAAAv2B,EAAA,IAkCQY,OAAAC,eAAAnB,EAAA,gBAAAoB,YAAA,EAAAC,IAAA,kBAlCAw1B,EAAAC,gBACR,IAAAC,EAAAz2B,EAAA,IA+BQY,OAAAC,eAAAnB,EAAA,kBAAAoB,YAAA,EAAAC,IAAA,kBA/BA01B,EAAAC,kBACR,IAAAC,EAAA32B,EAAA,IAwBuBY,OAAAC,eAAAnB,EAAA,gBAAAoB,YAAA,EAAAC,IAAA,kBAxBf41B,EAAAC,eACR,IAAAzO,EAAAnoB,EAAA,GAsBkBY,OAAAC,eAAAnB,EAAA,WAAAoB,YAAA,EAAAC,IAAA,kBAtBVonB,EAAAne,UACR,IAAAS,EAAAzK,EAAA,IAwBmBY,OAAAC,eAAAnB,EAAA,WAAAoB,YAAA,EAAAC,IAAA,kBAxBX0J,EAAA4E,WAGR,IAAMwnB,EAAkB,CACtBp2B,KAAM,YACNd,OAAQ,CACNoL,UAAW8qB,EAAAC,kBAEbgB,MAAO,CACLtlB,MAAO,SAAC7R,EAAa4P,GACnB,IAAMvE,EAASuE,EAAOwnB,YACtB,IAAK/rB,IAA+B,IAArBA,EAAO0P,UACpB,OAAOsc,QAAQC,UAEjB,IACMC,EAA0B,IAAIC,EADZx3B,EAAOoL,WACqBwE,GACpD,OAAOynB,QAAQC,QAAQC,MAOFx3B,EAAA03B,aAAAP,EAY3B,IAAMQ,EAAW,CACfjB,WAAUD,EAAAC,WACVN,iBAAgBD,EAAAC,iBAChBF,iBAAgBD,EAAAC,iBAChBc,eAAcD,EAAAC,eACdF,aAAYD,EAAAC,aACZN,cAAaD,EAAAC,cACbF,aAAYD,EAAAC,aACZM,wBAAuBD,EAAAC,yBAVjB52B,EAAA23B,WAaR33B,EAAA6pB,QAAe,CACb6N,aAAcP,4bCxDhB,IAAAS,EAAAt3B,EAAA,GAEAsK,EAAAtK,EAAA,GACAu3B,EAAAv3B,EAAA,GACAw3B,EAAAx3B,EAAA,IAEA41B,EAAA,SAAA/X,GACE,SAAA+X,EAAYrmB,EAAQwQ,GAApB,IAAA5U,EACE0S,EAAAxd,KAAA+B,OAAOA,YACP+I,EAAKssB,QAAQloB,EAAQwQ,KAkDzB,OArDsCvB,EAAAoX,EAAA/X,GAM5B+X,EAAA9zB,UAAA21B,QAAR,SAAgBloB,EAAQwQ,GACtB,GAAI3d,KAAKwY,8BAA8BrL,GACrCjF,EAAAvG,OAAOX,mBAAmB,uEAD5B,CAIAhB,KAAK0Y,8BAA8BvL,GAEnC,IAAMzB,EAAO1L,KAEPs1B,EAAgBnoB,EAAOiC,MAG7BjC,EAAOiC,MAAQ,WACb,IAAMmmB,EAAqBD,EAAc30B,MAAMwM,EAAQ3M,WAEvD,GAAyB,IAArBA,UAAUC,OACZ,OAAO80B,EAET,IACMC,EADSh1B,UAAU,GACM8X,UAC/B,OAAKkd,GAKL9pB,EAAK6M,gBAAkB,IAAI6c,EAAAK,yBAAyBtoB,EAAQwQ,GAC5DjS,EAAK4M,UAAY,IAAI4c,EAAAvsB,UAAU6sB,EAAiB9pB,EAAK6M,iBACpDpL,EAAemL,UAAY5M,EAAK4M,UACjC5M,EAAKgqB,eAAevoB,EAAQzB,EAAK4M,WAE1Bid,IATLrtB,EAAAvG,OAAOV,MAAM,qDACNs0B,MAYL/B,EAAA9zB,UAAAg2B,eAAR,SAAuBvoB,EAAQmL,GAC7B,IAAMqd,EAAexoB,EAAOyoB,KAE5BzoB,EAAOyoB,KAAO,WACZ,GAAIp1B,UAAUC,OAAS,EAAG,CACxB,IAAM+0B,EAAkBh1B,UAAU,GAAG8X,UAErCA,EAAUhO,aAAakrB,GAGzB,OAAOG,EAAah1B,MAAMwM,EAAQ3M,aAGxCgzB,EArDA,CAAsC2B,EAAA/c,SAAzB9a,EAAAk2B,0HCPb,IAAAtrB,EAAAtK,EAAA,GAIA4L,EAAA,oBAAAA,IACUxJ,KAAA0M,SAA4D,GA2BtE,OAzBSlD,EAAA9J,UAAAkN,iBAAP,SAAwBF,GACtB1M,KAAK0M,SAAWA,GAGXlD,EAAA9J,UAAAm2B,mBAAP,WACE71B,KAAK0M,SAASjB,QAAQ,SAACqqB,GAAY,OAAAA,EAAQxZ,YAC3Ctc,KAAK0M,SAAW,IAGXlD,EAAA9J,UAAAsO,cAAP,WACEhO,KAAK0M,SAASjB,QAAQ,SAACqqB,GAAY,OAAAA,EAAQxnB,WAGtC9E,EAAA9J,UAAAqK,kBAAP,SAAyB0S,EAAwB3S,GAC/C9J,KAAK0M,SAAW1M,KAAK0M,SAASihB,OAAO,SAACmI,GACpC,IAAMltB,EAASktB,EAAQnZ,UAAUF,EAAe3S,GAChD,SAAK2S,IAAqC,KAApB7T,aAAM,EAANA,EAAQsO,YAC5BhP,EAAAvG,OAAOvB,IAAI,qBAAqB01B,EAAQC,YAAY13B,KAAI,uDACxDy3B,EAAQxZ,WACD,KAIXtc,KAAK0M,SAASjB,QAAQ,SAACqqB,GAAY,OAAAA,EAAQ5e,aAE/C1N,EA5BA,GAAalM,EAAAkM,qHCJb,IAAMwsB,EAAoD,CACxDC,IAAK,CAAC,mCACNC,IAAK,CAAC,qCACNC,IAAK,CAAC,qCACNC,KAAM,CAAC,wCAGTrmB,EAAA,oBAAAA,KAkBA,OAjBEvR,OAAAC,eAAkBsR,EAAA,wBAAqB,KAAvC,eAAAhH,EAAA/I,KACE,GAAM,gBAAiBtC,OAMvB,OAHec,OAAO63B,oBAAoBL,GAAqBrI,OAAO,SAAC2I,GACrE,OAAAN,EAAoBM,GAAQC,KAAK,SAAC9hB,GAAU,OAAA1L,EAAKytB,iBAAiB/hB,wCAKxD1E,EAAAymB,iBAAd,SAA+B/hB,GAC7B,MAAM,gBAAiB/W,QAIhB+4B,YAAYC,gBAAgBjiB,IAEvC1E,EAlBA,GAAazS,EAAAyS,qHCPb,SAAYzK,GACVA,IAAA,2BACAA,IAAA,2BAFF,CAAYhI,EAAAgI,iBAAAhI,EAAAgI,eAAc,iVCa1B,IASKqxB,EATLC,EAAAh5B,EAAA,IACAi5B,EAAAj5B,EAAA,IACAk5B,EAAAl5B,EAAA,IAEAsK,EAAAtK,EAAA,GACAwK,EAAAxK,EAAA,GACAm5B,EAAAn5B,EAAA,KAGA,SAAK+4B,GACHA,EAAA,+BACAA,EAAA,oBACAA,EAAA,+BAHF,CAAKA,MAAU,KAQf,IAAA5pB,EAAA,WAqBE,SAAAA,EAAYuL,EAAsBzP,GAAlC,IAAAE,EAAA/I,KAjBQA,KAAAmmB,qBAA+B,EAQ/BnmB,KAAAg3B,uBAAkD,GAIlDh3B,KAAAi3B,WAAqB,EAGrBj3B,KAAAk3B,cAAwB,EAG9Bl3B,KAAKsY,UAAYA,EACjBtY,KAAK6I,QAAUA,EAEf7I,KAAK6I,QAAQsuB,YAAYC,YAAc,SAAC5lB,GAAU,OAAAzI,EAAKquB,YAAY5lB,IACnExR,KAAK6I,QAAQsuB,YAAYE,aAAe,SAAC7lB,GAAU,OAAAzI,EAAKsuB,aAAa7lB,IACrExR,KAAK6I,QAAQsuB,YAAYG,iBAAmB,SAAC9lB,GAAU,OAAAzI,EAAKuuB,iBAAiB9lB,IAC7ExR,KAAK6I,QAAQsuB,YAAYI,kBAAoB,SAAC/lB,GAAU,OAAAzI,EAAKwuB,kBAAkB/lB,IAC/ExR,KAAK6I,QAAQsuB,YAAYK,YAAc,SAAChmB,GAAU,OAAAzI,EAAKyuB,YAAYhmB,IACnExR,KAAK6I,QAAQsuB,YAAYM,UAAY,SAACjmB,GAAU,OAAAzI,EAAK0uB,UAAUjmB,IAC/DxR,KAAK6I,QAAQsuB,YAAYO,mBAAqB,SAAClmB,GAAU,OAAAzI,EAAK2uB,mBAAmBlmB,IACjFxR,KAAK6I,QAAQsuB,YAAYQ,OAAS,WAAM,OAAA5uB,EAAK4uB,UAC7C33B,KAAK6I,QAAQsuB,YAAYS,QAAU,WAAM,OAAA7uB,EAAK6uB,WAC9C53B,KAAK6I,QAAQsuB,YAAYU,eAAiB,WAAM,OAAA9uB,EAAK8uB,kBACrD73B,KAAK6I,QAAQsuB,YAAYW,YAAc,SAACtmB,GAAU,OAAAzI,EAAK+uB,YAAYtmB,IACnExR,KAAK6I,QAAQsuB,YAAYY,aAAe,SAACvmB,GAAU,OAAAzI,EAAKgvB,aAAavmB,IAErExR,KAAKg4B,gBAAkB,IAAIjB,EAAAkB,gBAAgBj4B,KAAK6I,QAAQqvB,eAAgB,WAAM,OAAAnvB,EAAKovB,yBAAyB,IAkRhH,OA/QSprB,EAAArN,UAAA+O,QAAP,WACEzO,KAAKo4B,2BACLp4B,KAAKg4B,gBAAgBK,WAGhBtrB,EAAArN,UAAAy4B,sBAAP,WACOn4B,KAAKs4B,iBAGNt4B,KAAKu4B,wBACPv4B,KAAKw4B,uBAAyBpwB,EAAMtF,sBAEhC9C,KAAKw4B,yBACPx4B,KAAKs4B,eAAeG,gBACjBz4B,KAAKs4B,eAAeG,gBAAkB,GAAKrwB,EAAMtF,sBAAwB9C,KAAKw4B,0BAKhFzrB,EAAArN,UAAA64B,sBAAP,WACE,OAAOv4B,KAAKg4B,iBAAkBh4B,KAAKg4B,gBAAgBU,gBAG9C3rB,EAAArN,UAAAi4B,OAAP,WACE,GAAI33B,KAAK6I,SAAW7I,KAAK6I,QAAQ8vB,oBAAsB34B,KAAKs4B,eAAgB,CAC1E,IAAMp1B,EAAYkF,EAAMtF,sBACxB9C,KAAK44B,sBAAwB11B,EAC7BlD,KAAKw4B,uBAAyBt1B,EAC9BlD,KAAKi3B,WAAY,IAIdlqB,EAAArN,UAAAk4B,QAAP,WACM53B,KAAK6I,SAAW7I,KAAK6I,QAAQ8vB,oBAAsB34B,KAAKs4B,iBAC1Dt4B,KAAK64B,kBAAkB74B,KAAKs4B,gBAC5Bt4B,KAAKi3B,WAAY,IAIdlqB,EAAArN,UAAAg4B,mBAAP,SAA0BlmB,GACxB,IAAMsnB,EAActnB,EAAMunB,SACtBD,GAAeA,EAAYE,KAAgC,SAAzBF,EAAYE,IAAIC,KACpDj5B,KAAKyW,qBAAqB,IAAIogB,EAAAqC,cAAc1nB,EAAMunB,SAAUvnB,IACnDA,EAAM2nB,SACfn5B,KAAKg3B,uBAAuBhc,KAAKxJ,IAI9BzE,EAAArN,UAAA43B,iBAAP,SAAwB9lB,GACtBxR,KAAKk3B,cAAgB,EACrBl3B,KAAKo5B,oBAAsB,IAAIvC,EAAAqC,cAAc1nB,EAAM2nB,QAASn5B,KAAKq5B,yBAAyB7nB,EAAM2nB,UAChGn5B,KAAKs5B,mBAAqBlxB,EAAMtF,uBAG3BiK,EAAArN,UAAA63B,kBAAP,SAAyB/lB,GACvBxR,KAAKu5B,gBACLv5B,KAAKo5B,yBAAsB12B,GAGtBqK,EAAArN,UAAA03B,YAAP,SAAmB5lB,GACZA,EAAM+B,GAAGimB,WAIdx5B,KAAKu5B,gBACLv5B,KAAKs4B,eAAiB,IAAIxB,EAAA2C,SAASjoB,EAAM+B,IACzCvT,KAAK4T,iBAAclR,EACnB1C,KAAKs4B,eAAeoB,cAAgB15B,KAAKs5B,mBACrClxB,EAAMtF,sBAAwB9C,KAAKs5B,wBACnC52B,EAEJ1C,KAAK25B,QAAQ35B,KAAKs4B,kBAGbvrB,EAAArN,UAAA23B,aAAP,SAAoB7lB,GAClB,GAAKxR,KAAKo5B,qBAAwBp5B,KAAKs4B,eAAvC,CAIA,IAAMsB,EAAQlvB,EAAA,GAAO1K,KAAKs4B,gBAC1BsB,EAAS9iB,UAAY,EACrB9W,KAAKu5B,gBACLv5B,KAAK65B,WAAW75B,KAAKo5B,oBAAqBQ,EAAUA,EAASE,cAGxD/sB,EAAArN,UAAAo4B,YAAP,SAAmBtmB,GACjB,GAAKxR,KAAKo5B,qBAAwBp5B,KAAKs4B,eAAvC,CAIA,IAAMsB,EAAQlvB,EAAA,GAAO1K,KAAKs4B,gBAC1BsB,EAASG,QAAU,EACnBH,EAASI,aAAeh6B,KAAK4T,YAC7BgmB,EAASK,eAAiB7xB,EAAMpC,oBAC9BhG,KAAKs4B,eAAe0B,aACpBh6B,KAAKs4B,eAAewB,YAEtB95B,KAAKu5B,gBACLv5B,KAAK65B,WAAW75B,KAAKo5B,oBAAqBQ,EAAUA,EAASI,gBAGxDjtB,EAAArN,UAAA+3B,UAAP,SAAiBjmB,GAAjB,IAiBMooB,EACAM,EAlBNnxB,EAAA/I,KACQgM,EAAqCwF,EAAM8B,MAAQ,CACvD6lB,aAASz2B,EACTq2B,cAAUr2B,EACViQ,UAAMjQ,EACNmQ,aAASnQ,GAJJq2B,EAAQ/sB,EAAA+sB,SAAEI,EAAOntB,EAAAmtB,QAAExmB,EAAI3G,EAAA2G,KAAEE,EAAO7G,EAAA6G,QAOjCsnB,EAAgB,IAAItD,EAAAqC,cACxBC,GAAWJ,EACXI,EAAUn5B,KAAKq5B,yBAAyBF,QAAWz2B,GAGrDy3B,EAAcznB,UAAYC,GAAQnB,EAAMmB,KACxCwnB,EAAcpnB,UAAY7O,KAAKC,UAAUqN,EAAM8B,MAC/C6mB,EAAcvnB,aAAeC,GAAWrB,EAAMnT,KAK5C2B,KAAKs4B,gBACLa,GACAA,EAAQiB,KACPjB,EAAQiB,IAAcC,SAAS,SAAC9mB,GAAW,OAAAA,EAAG6a,KAAQrlB,EAAKuvB,eAA4BgC,SAGxFJ,GADAN,EAAW55B,KAAKs4B,gBACS4B,cAAgBl6B,KAAK4T,YAC9CgmB,EAASW,gBAAkBnyB,EAAMpC,oBAAoB4zB,EAASM,cAAeN,EAASE,aAExF95B,KAAK65B,WAAWM,EAAeP,EAAUM,IAGpCntB,EAAArN,UAAA86B,qBAAP,SAA4BhpB,KAErBzE,EAAArN,UAAA83B,YAAP,SAAmBhmB,GACZxR,KAAKs4B,iBAGVt4B,KAAKs4B,eAAemC,kBAAoBjpB,EAAMkpB,gBAC9C16B,KAAKs4B,eAAeqC,QAAU,EAC9B36B,KAAKs4B,eAAesC,cAAgB56B,KAAK4T,YACzC5T,KAAKs4B,eAAeuC,gBAAkBzyB,EAAMpC,oBAC1ChG,KAAKs4B,eAAesC,cACpB56B,KAAKs4B,eAAewB,cAIjB/sB,EAAArN,UAAAq4B,aAAP,SAAoBvmB,GACbxR,KAAKs4B,iBAGN9mB,EAAMspB,WAAanE,EAAWoE,eAChC/6B,KAAKs4B,eAAe0C,UAAY,EACvBxpB,EAAMspB,WAAanE,EAAWsE,SACvCj7B,KAAKs4B,eAAe4C,SAAW,EACtB1pB,EAAMspB,WAAanE,EAAWwE,iBACvCn7B,KAAKs4B,eAAe8C,UAAY,KAI7BruB,EAAArN,UAAAm4B,eAAP,WACE,IAAI73B,KAAKmmB,sBAGTnmB,KAAKmmB,qBAAsB,EACtBnmB,KAAKs4B,gBAAmBt4B,KAAKo5B,qBAAlC,CAIA,IAAMQ,EAAQlvB,EAAA,GAAO1K,KAAKs4B,gBAC1BsB,EAASyB,OAAS,EAClBzB,EAAS0B,cAAgBt7B,KAAK4T,YAC9BgmB,EAAS2B,gBAAkBnzB,EAAMpC,oBAAoB4zB,EAAS0B,cAAe1B,EAASE,YACtF95B,KAAKu5B,gBACLv5B,KAAK65B,WAAW75B,KAAKo5B,oBAAqBQ,EAAUA,EAAS0B,iBAGxDvuB,EAAArN,UAAA87B,2BAAP,SAAkCC,GAChC,IAAMC,EAAa17B,KAAK6I,QAAQ8yB,kBAChC,OAAAjxB,IAAA,GACK,IAAIksB,EAAAgF,kBAAkBH,IAAgB,CACzClsB,iBAAkB,UAClB1C,SAAU6uB,EAAWr9B,KACrBw9B,gBAAiBH,EAAW/0B,QAC5BuC,kBAAmBlJ,KAAKsY,UAAUpP,kBAClCD,aAAcjJ,KAAKsY,UAAUrP,aAC7BG,SAAUpJ,KAAKsY,UAAUlP,SACzB+M,aAAc/N,EAAMhD,qBAIhB2H,EAAArN,UAAA25B,yBAAR,SAAiCF,GAC/B,GAAKA,EAGL,OAAOn5B,KAAKg3B,uBAAuB8E,KAAK,SAACh+B,GAAM,OAAAA,EAAEq7B,SAAWr7B,EAAEq7B,QAAQ/K,KAAO+K,EAAQ/K,MAG/ErhB,EAAArN,UAAA+W,qBAAR,SAA6B0jB,EAA8BP,GACzD,IAAM3uB,EAAMP,MAAA,GACP1K,KAAKw7B,2BAA2Bx7B,KAAKsY,UAAUrN,SAC/CkvB,GACCP,GAAY,IAAI9C,EAAA2C,UAEtBxuB,EAAOxI,KAAO2F,EAAMtF,sBACpBmI,EAAO8wB,eAAiB3zB,EAAMjF,eAC9B8H,EAAO+wB,qBAAuB5zB,EAAMpC,oBAAoBiF,EAAOwtB,eAAgBxtB,EAAOgxB,YACtFj8B,KAAKsY,UAAUrK,QAAQ+d,cAAc/gB,IAG/B8B,EAAArN,UAAAm5B,kBAAR,SAA0Be,GACxB,IAAM12B,EAAYkF,EAAMtF,sBACpB9C,KAAK44B,uBAAyB54B,KAAKi3B,iBACTv0B,IAAxBk3B,EAASqC,aACXrC,EAASqC,YAAc/4B,EAAYlD,KAAK44B,uBAEtC54B,KAAKu4B,yBAA2Bv4B,KAAKw4B,6BAAsD91B,IAA5Bk3B,EAASnB,iBAC1EmB,EAASnB,gBAAkBv1B,EAAYlD,KAAKw4B,0BAK1CzrB,EAAArN,UAAAi6B,QAAR,SAAgBC,GAAhB,IAAA7wB,EAAA/I,KACE45B,EAASsC,QAAU,EACnBtC,EAASqC,WAAa,EACtBrC,EAASnB,eAAiB,EAC1BmB,EAAS1C,cAAgBl3B,KAAKk3B,cAC9B,IAAMh0B,EAAYkF,EAAMtF,sBACxB9C,KAAK44B,sBAAwB11B,EAC7BlD,KAAKw4B,uBAAyBx4B,KAAKu4B,wBAA0Br1B,OAAYR,EACzE1C,KAAKi3B,WAAY,EACjBj3B,KAAK4T,YAAc,EACnB5T,KAAKk3B,gBACLl3B,KAAKm8B,oBAAsBz+B,OAAOga,YAAY,WAC5C,IAEIkiB,QACwBl3B,IAAxBk3B,EAASE,YACTF,EAASE,WAAa,GACtB/wB,EAAKF,QAAQ8vB,qBAEb5vB,EAAK6K,YAAcxL,EAAMvF,cAAcF,KAAKsT,IAAIlN,EAAKF,QAAQ+K,cAAe,KAE9E,MAAO6N,GACPvZ,EAAAvG,OAAOvB,IAAI,uDAAwDqhB,GACnE1Y,EAAKwwB,kBAENxsB,EAAYqvB,gCAGTrvB,EAAArN,UAAAm6B,WAAR,SAAmBM,EAA8BP,EAAqCyC,QAArC,IAAAzC,MAAA,IAAyB9C,EAAA2C,UACxEG,EAASyC,aAAeA,EACxBzC,EAAS0C,eAAiBl0B,EAAMpC,oBAAoB4zB,EAASyC,aAAczC,EAASE,YAGpF95B,KAAKs5B,mBAAqBlxB,EAAMtF,sBAChC9C,KAAK64B,kBAAkBe,GACvB55B,KAAKi3B,WAAY,EACjBj3B,KAAKyW,qBAAqB0jB,EAAeP,IAGnC7sB,EAAArN,UAAA65B,cAAR,WACEv5B,KAAKo4B,2BACLp4B,KAAKs4B,oBAAiB51B,GAGhBqK,EAAArN,UAAA04B,yBAAR,WACE16B,OAAOsa,cAAchY,KAAKm8B,4BACnBn8B,KAAK4T,aArTS7G,EAAAwvB,YAAc,MACbxvB,EAAAqvB,8BAAgC,IAsT1DrvB,EAxTA,GAAazP,EAAAyP,wHC9Bb,IAAA3E,EAAAxK,EAAA,GAIAg+B,EAAA,WAyFA,OA/BE,SAAY3wB,GAJLjL,KAAAkW,SAAmB,MAKnBjL,IAGLjL,KAAKw8B,kBAAoBvxB,EAAOC,aAChClL,KAAKuG,UAAY0E,EAAO1E,UACxBvG,KAAK6N,SAAW5C,EAAO4C,SACvB7N,KAAK8O,YAAc7D,EAAO6D,YAE1B1G,EAAM/D,yBAAyB4G,EAAQjL,MAEvCA,KAAKiP,aAAehE,EAAOgE,aAC3BjP,KAAK6L,OAASZ,EAAOY,OACrB7L,KAAKkP,eAAiBjE,EAAOiE,eAC7BlP,KAAKX,IAAM4L,EAAO5L,IAClBW,KAAKsC,KAAO2I,EAAO3I,KACnBtC,KAAKmN,OAASlC,EAAOkC,OACrBnN,KAAK2O,UAAY1D,EAAO0D,UACxB3O,KAAKsN,WAAarC,EAAOqC,WACzBtN,KAAKyV,aAAexK,EAAOwK,aAC3BzV,KAAK0V,YAAczK,EAAOyK,YAC1B1V,KAAK2G,QAAUsE,EAAOtE,QACtB3G,KAAKiV,KAAOhK,EAAOgK,KACnBjV,KAAKqL,OAASJ,EAAOI,OACrBrL,KAAK+O,QAAU9D,EAAO8D,QACtB/O,KAAKgP,WAAa/D,EAAO+D,WACzBhP,KAAKwV,kBAAoBvK,EAAOuK,kBAChCxV,KAAKuV,iBAAmBtK,EAAOsK,iBAC/BvV,KAAK4U,WAAa3J,EAAO2J,WACzB5U,KAAK0U,WAAazJ,EAAOyJ,aAvF7B,GAAapX,EAAAs+B,0HCHb,IAAAxzB,EAAAxK,EAAA,GAEAs7B,EAAA,WAoEA,OAlDE,SAAYH,EAAqB0D,GAF1Bz8B,KAAA08B,gBAA0B,EAG3BD,IACFz8B,KAAK28B,qBAAuBv0B,EAAMvF,cAAc45B,EAAsBG,eAAeC,eAGnF9D,IACF/4B,KAAK88B,yBAA2B10B,EAAM5F,2BAA2Bu2B,EAASgE,wBAC1E/8B,KAAK08B,iBAAoB3D,EAAiBiE,uBAAyB,GAAK,GAG1E,IAAMC,EAAgBlE,EAClBkE,IAC6B,QAA3BA,EAAcC,UAAiD,SAA3BD,EAAcC,SACpDl9B,KAAKm9B,WAAaF,EAAcC,UAEhCl9B,KAAKm9B,WAAa,MAClBn9B,KAAKo9B,SAAWH,EAAcC,UAGhCl9B,KAAKq9B,gBAAkBj1B,EAAM5F,2BAA2By6B,EAAcK,gBAGxE,IAAMxE,EAAcC,EACpB,GAAID,EAAa,CACf94B,KAAKu9B,eAAiBzE,EAAY0E,WAClC,IAAIxE,EAAMF,EAAYE,IAYtB,GAVEh5B,KAAK08B,gBAAkB,GACvB5D,EAAY2E,cACZ3E,EAAY2E,aAAah9B,QAAUT,KAAK08B,kBAExC1D,EAAMF,EAAY2E,aAAaz9B,KAAK08B,gBAAkB,IAEpD1D,IACFh5B,KAAK09B,UAAY1E,EAAIC,KACrBj5B,KAAK29B,SAAW3E,EAAItzB,KAElB1F,KAAK29B,SAAU,CACjB,IAAMC,EAAex1B,EAAM3C,0BAA0BzF,KAAK29B,UAC1D39B,KAAK69B,YAAcD,EAAa93B,SAChC9F,KAAK89B,UAAYF,EAAat7B,MAIlC,IAAM62B,EAAUJ,EACZI,IACFn5B,KAAK+9B,eAAiB31B,EAAM5F,2BAA2B22B,EAAQ6E,cAC/Dh+B,KAAKi+B,WAAa9E,EAAQ/K,KAjEhC,GAAa9wB,EAAA47B,iHCFb,IAAA9wB,EAAAxK,EAAA,GAEA67B,EAAA,WAoEE,SAAAA,EAAYlmB,GACV,GA1CKvT,KAAA26B,QAAkB,EAElB36B,KAAAq7B,OAAiB,EAEjBr7B,KAAA8W,UAAoB,EAQpB9W,KAAAk7B,SAAmB,EAGnBl7B,KAAAg7B,UAAoB,EACpBh7B,KAAAo7B,UAAoB,EACpBp7B,KAAA+5B,QAAkB,EAElB/5B,KAAAk8B,QAAkB,EAuBnB3oB,EAAI,CACNvT,KAAKy6B,kBAAoBlnB,EAAGmnB,gBAC5B16B,KAAKs6B,KAAO/mB,EAAG6a,GACfpuB,KAAKk+B,SAAW3qB,EAAG4qB,aACnB,IAAMC,EAAkBh2B,EAAM3C,0BAA0BzF,KAAKk+B,UAAY,IACzEl+B,KAAKq+B,UAAYD,EAAgB97B,KACjCtC,KAAKs+B,YAAcF,EAAgBt4B,SACnC9F,KAAKw5B,SAAWjmB,EAAGimB,SACnBx5B,KAAKu+B,iBAAmBhrB,EAAGc,OAC3BrU,KAAKw+B,gBAAkBjrB,EAAGY,MAEtBZ,EAAGD,OACLtT,KAAKwU,kBAAmC9R,IAApB6Q,EAAGD,KAAKiB,aAAwB7R,EAA8B,IAAlB6Q,EAAGD,KAAKiB,QACxEvU,KAAKmV,aAAe5B,EAAGD,KAAKggB,UAK9B,IAAMhgB,EAAOC,EAAGD,KACZA,IACEA,EAAKmrB,WACPz+B,KAAKy+B,SAAWnrB,EAAKmrB,SAASpgC,MAG5BiV,EAAKorB,aACP1+B,KAAK2+B,eAAiBrrB,EAAKorB,WAAWrgC,MAMxC2B,KAAK4+B,aAAetrB,EAAKsrB,aAErBtrB,EAAKurB,WACP7+B,KAAK8+B,aAAexrB,EAAKurB,SAASvE,KAClCt6B,KAAK++B,WAAazrB,EAAKurB,SAASzQ,GAE5B9a,EAAKurB,SAASG,gBAChBh/B,KAAKi/B,sBAAwB3rB,EAAKurB,SAASG,cAAcE,WACzDl/B,KAAKm/B,mBAAqB7rB,EAAKurB,SAASG,cAAcjgC,QAG1DiB,KAAKo/B,cAAgB9rB,EAAK8rB,cAC1Bp/B,KAAKq/B,qBAAuBj3B,EAAM5F,2BAA2B8Q,EAAK+rB,sBAC9D/rB,EAAKgsB,SACPt/B,KAAKu/B,UAAYjsB,EAAKgsB,OAAOE,KAG/Bx/B,KAAKy/B,QAAUnsB,EAAKmsB,QACpBz/B,KAAK0/B,gBAAkBpsB,EAAKqsB,aAAersB,EAAKqsB,aAAal/B,OAAS,GAG1E,IAAMm/B,EAAWrsB,EACbqsB,IACF5/B,KAAK6/B,iBAAmBpG,EAASqG,eAAeF,EAASG,gBACzD//B,KAAKggC,YACHJ,EAASK,iBAAwCv9B,IAA1B1C,KAAK6/B,sBAAiCn9B,EAAY1C,KAAK6/B,kBAAoB,GACpG7/B,KAAK85B,WAAa1xB,EAAMvF,cAAc+8B,EAASvwB,WAGrD,OAhIiBoqB,EAAAqG,eAAf,SAA8BI,GAC5B,QAAkBx9B,IAAdw9B,EAGJ,OAAmB,IAAfA,EACKA,EAEF93B,EAAMvF,cAAcq9B,IAyH/BzG,EAjIA,GAAan8B,EAAAm8B,mHCHb,IAAAvxB,EAAAtK,EAAA,GACAwK,EAAAxK,EAAA,GAEAq6B,EAAA,WASE,SAAAA,EAAY9c,EAAsBgd,EAAmCgI,GAArE,IAAAp3B,EAAA/I,UAAqE,IAAAmgC,MAAA,GAL7DngC,KAAAogC,gBAAuB19B,EAM7B1C,KAAKmgC,UAAYA,EACjBngC,KAAKm4B,sBAAwBA,EAC7Bn4B,KAAKmb,QAAUA,EAEf,IACE,IAAMklB,EAAoC,CACxCjjC,KAAM,KACNkjC,WAAY,MACZH,UAASA,GAEXngC,KAAKugC,SAAW,IAAIC,qBAAqB,SAACC,EAASF,GAAa,OAAAx3B,EAAK23B,gBAAgBD,EAASF,IAAWF,GACzGrgC,KAAKugC,SAASI,QAAQxlB,GACtB,MAAOla,GACPiH,EAAAvG,OAAOvB,IAAI,qGAGbJ,KAAK4gC,OAASx4B,EAAMjD,gBAChBnF,KAAK4gC,SACP5gC,KAAK6gC,iBAAmB7gC,KAAK4gC,OAAOr+B,QAAQ,SAAU,IAAM,mBAC5DkB,SAAS+lB,iBACPxpB,KAAK6gC,iBACJ7gC,KAAK8gC,uBAAyB9gC,KAAK8gC,uBAAuBxhC,KAAKU,OAChE,IAmCR,OA9BSi4B,EAAAv4B,UAAAqhC,SAAP,WACE,OAAO/gC,KAAK4gC,QAAUn9B,SAASzD,KAAK4gC,SAG/B3I,EAAAv4B,UAAAg5B,aAAP,WACE,OAAQ14B,KAAK+gC,aAAkC,MAAnB/gC,KAAKogC,YAA4BpgC,KAAKogC,aAG7DnI,EAAAv4B,UAAA24B,QAAP,WACMr4B,KAAKugC,WACPvgC,KAAKugC,SAASS,UAAUhhC,KAAKmb,SAC7Bnb,KAAKugC,SAASU,cAEZjhC,KAAK6gC,kBACPp9B,SAASimB,oBAAoB1pB,KAAK6gC,iBAAkB7gC,KAAK8gC,wBAAwB,IAI7E7I,EAAAv4B,UAAAohC,uBAAR,WACE9gC,KAAKm4B,yBAGCF,EAAAv4B,UAAAghC,gBAAR,SAAwBD,EAAsCF,GAA9D,IAAAx3B,EAAA/I,KACEygC,EAAQh1B,QAAQ,SAAC3N,GACXA,EAAEmjB,SAAWlY,EAAKoS,UACpBpS,EAAKq3B,aAAetiC,EAAEojC,kBAAoBn4B,EAAKo3B,cAGnDngC,KAAKm4B,yBAETF,EAnEA,GAAa36B,EAAA26B,yHCCb,IAAAkJ,EAAAvjC,EAAA,IACAub,EAAAvb,EAAA,GAEAwjC,EAAAxjC,EAAA,IACAyjC,EAAAzjC,EAAA,IACA0jC,EAAA1jC,EAAA,IACA6K,EAAA7K,EAAA,IACA2jC,EAAA3jC,EAAA,IAMAoL,EAAA,oBAAAA,KAwDA,OAvDSA,EAAAtJ,UAAAwO,cAAP,SACEsnB,EACAgM,EACA34B,EACAc,GAEA,IAAK3J,KAAK+b,UAAUyZ,GAClB,OAAO,IAAI/sB,EAAAiG,YAEb,IAAM+yB,EAAQzhC,KAAK0hC,mBAAmBlM,EAAiBgM,EAAkB34B,EAASc,GAClF,OAAO3J,KAAK2hC,6BAA6BnM,EAAiBiM,IAGpDz4B,EAAAtJ,UAAAiiC,6BAAR,SAAqC/4B,EAAyBqF,GAC5D,OAAIrF,EAAOmF,MACF,IAAIqzB,EAAAQ,iBAAiBh5B,EAAQqF,GAE/BA,GAGDjF,EAAAtJ,UAAAmiC,yCAAR,SAAiDrM,EAAkCsM,GACjF,YACsBp/B,IAApB8yB,QAC2B9yB,IAA3B8yB,EAAgB5sB,aACoDlG,IAAnE8yB,EAAgB5sB,OAAmCm5B,YAE5CvM,EAAgB5sB,OAAmCm5B,YAAYD,GAGlEA,GAGD94B,EAAAtJ,UAAAqc,UAAR,SAAkByZ,GAChB,YAAkC9yB,IAA3B8yB,EAAgB5sB,SAA2D,IAAnC4sB,EAAgB5sB,OAAOsO,SAGhElO,EAAAtJ,UAAAgiC,mBAAR,SACElM,EACAgM,EACA34B,EACAc,GAEA,IAAM6P,EAAcgc,EAAgB5sB,QAAU4sB,EAAgB5sB,OAAO4Q,YAAeL,EAAAP,2BAChFkpB,EAAwB,IAAIT,EAAAW,uBAC9BR,EACAL,EAAAc,YACAzoB,EACA3Q,EACAc,GAEFm4B,EAAe9hC,KAAK6hC,yCAAyCrM,EAAiBsM,GAE9E,IAAMI,EAAiC,IAAIX,EAAAY,sBAAsBL,GACjE,OAAO,IAAIR,EAAAc,6BAA6BF,IAE5Cl5B,EAxDA,GAAa1L,EAAA0L,qHChBb,IAAAkQ,EAAAtb,EAAA,IACAwb,EAAAxb,EAAA,GAEAN,EAAA2kC,YAAA,SAA4B5iC,EAAawM,EAAgBlF,EAAiB07B,GACxE,IAAMC,EAAmBlpB,EAAAlS,SAASm7B,EAAS,cACrCb,EAAmB,CACvBjyB,iBAAkB5I,EAClBkF,OAAMA,EACNxM,IAAGA,GAGL,OAAO,IAAIu1B,QAA2B,SAACC,GACrC3b,EAAA6B,KAAKunB,EAAkBd,EAAkB,SAACe,GACxC1N,EAAQ0N,iHCRd,IAAAr6B,EAAAtK,EAAA,GAGAgkC,EAAA,WAIE,SAAAA,EAAYh5B,EAAyB45B,GACnCxiC,KAAKwiC,WAAaA,EACd55B,EAAOmF,OAAUnF,EAAOmF,MAA+BjN,SACzDd,KAAKyiC,YAAe75B,EAAOmF,MAA+BjN,QA8BhE,OA1BS8gC,EAAAliC,UAAA6S,YAAP,SAAmBtH,GACjBjL,KAAK0iC,YAAYz3B,GACjBjL,KAAKwiC,WAAWjwB,YAAYtH,IAGvB22B,EAAAliC,UAAAkR,kBAAP,SAAyB3F,GACvBjL,KAAK0iC,YAAYz3B,GACjBjL,KAAKwiC,WAAW5xB,kBAAkB3F,IAG7B22B,EAAAliC,UAAAmX,uBAAP,SAA8B5L,GAC5BjL,KAAK0iC,YAAYz3B,GACjBjL,KAAKwiC,WAAW3rB,uBAAuB5L,IAGlC22B,EAAAliC,UAAAssB,cAAP,SAAqB/gB,GACnBjL,KAAKwiC,WAAWxW,cAAc/gB,IAGxB22B,EAAAliC,UAAAgjC,YAAR,SAAoBz3B,GAClB,GAAIjL,KAAKyiC,aAAeziC,KAAKyiC,YAAYhiC,OAAQ,CAC/C,IAAMkiC,EAAS,GACf3iC,KAAKyiC,YAAYh3B,QAAQ,SAACm3B,GAAM,OAACD,EAAOC,GAAK33B,EAAO23B,KACpD16B,EAAAvG,OAAOd,SAAS,CAAC8hC,MAGvBf,EArCA,GAAatkC,EAAAskC,0WCJb,IAAAiB,EAAAjlC,EAAA,IAEAsK,EAAAtK,EAAA,GACAub,EAAAvb,EAAA,GAEA6K,EAAA7K,EAAA,IACAklC,EAAAllC,EAAA,IACAmlC,EAAAnlC,EAAA,IAEAokC,EAAA,WAME,SAAAA,EACEltB,EACQkuB,EACAC,EACAp6B,EACAc,GALV,IAAAZ,EAAA/I,KAEUA,KAAAgjC,cACAhjC,KAAAijC,iBACAjjC,KAAA6I,UACA7I,KAAA2J,yBAsEF3J,KAAAkjC,mBAAqB,SAAC52B,GAC5B0Y,aAAajc,EAAKo6B,iCAClBp6B,EAAKq6B,yBACLr6B,EAAK+L,KAAKzV,IAAMiN,EAAUP,WAC1BhD,EAAKs6B,QAAUt6B,EAAKu6B,oCAAoCv6B,EAAKw6B,sBAAuBx6B,EAAKY,yBAGnF3J,KAAAwjC,kBAAoB,WAC1Bxe,aAAajc,EAAKo6B,iCAClBp6B,EAAKq6B,yBACLr6B,EAAKkF,QAAU,IAAIxF,EAAAiG,YACnB3F,EAAKY,uBAAuBC,yBAAwB,OAAOlH,IAGrD1C,KAAAyjC,0BAA4B,WAClC16B,EAAKq6B,yBACLr6B,EAAKkF,QAAU,IAAIxF,EAAAiG,YACnB3F,EAAKY,uBAAuBC,yBAAwB,OAAOlH,IArF3D1C,KAAK8U,KAAIpK,EAAA,GAAOoK,GAChB9U,KAAKiO,QAAU,IAAI60B,EAAAY,aACnB1jC,KAAKgjC,YAAcA,OAEFtgC,IAAboS,EAAKzV,KAAkC,KAAbyV,EAAKzV,IACjCW,KAAKqjC,QAAUrjC,KAAKsjC,oCAAoCtjC,KAAKujC,sBAAuBvjC,KAAK2J,yBACrC,IAA3Cd,EAAQiF,gCACjBjF,EAAQuD,qBAAqBC,UAAUrM,KAAKkjC,oBAC5Cr6B,EAAQ86B,oBAAoBt3B,UAAUrM,KAAKwjC,mBAC3CxjC,KAAKmjC,gCAAkCzlC,OAAOonB,WAC5C9kB,KAAKyjC,0BACLtqB,EAAAN,iCAGFlP,EAAuBC,yBAAwB,OAAOlH,GACtD1C,KAAKiO,QAAU,IAAIxF,EAAAiG,aAuFzB,OAnFSszB,EAAAtiC,UAAA6jC,oBAAP,eAAAx6B,EAAA/I,KACQgM,EAAyBhM,KAAK8U,KAA7BzV,EAAG2M,EAAA3M,IAAEwM,EAAMG,EAAAH,OAAElF,EAAOqF,EAAArF,QAC3B,IAAKtH,GAAe,KAARA,EAAY,CACtB,IAAM4B,EAA2B,CAC/B2iC,OAAQf,EAAAgB,gBAAgBC,OACxBjxB,QAAS,2BAGX,OADA7S,KAAKiO,QAAU,IAAIxF,EAAAiG,YACZkmB,QAAQC,QAAQ5zB,GAGzB,OAAOjB,KAAKgjC,YAAY3jC,EAAKwM,EAAQlF,EAAS3G,KAAKijC,gBAChDc,KAAK,SAACC,GACL,GAAIA,EAAOJ,SAAWf,EAAAgB,gBAAgBI,QAKpC,MAAM,IAAIvjB,MAAMsjB,EAAOnxB,SAJvB,IAAMqxB,EAAgB,IAAInB,EAAAoB,eAAc,EAAMp7B,EAAKk6B,eAAgB5jC,GAMrE,OALG0J,EAAKkF,QAAyBm2B,QAAQF,GACvCn7B,EAAKkF,QAAUi2B,EAIVF,IAERK,MAAM,SAACC,GAON,MANoB,oDAAhBA,EAAIzxB,QACN3K,EAAAvG,OAAOV,MAAM,yDAA0DqjC,GAEvEp8B,EAAAvG,OAAOX,mBAAmB,yDAA0DsjC,GAEtFv7B,EAAKkF,QAAU,IAAIxF,EAAAiG,YACZ,CACLk1B,OAAQf,EAAAgB,gBAAgBC,OACxBjxB,QAASyxB,EAAIzxB,YAKdmvB,EAAAtiC,UAAA6S,YAAP,SAAmBtH,GACjBjL,KAAKiO,QAAQsE,YAAYtH,IAEpB+2B,EAAAtiC,UAAAkR,kBAAP,SAAyB3F,GACvBjL,KAAKiO,QAAQ2C,kBAAkB3F,IAE1B+2B,EAAAtiC,UAAAmX,uBAAP,SAA8B5L,GAC5BjL,KAAKiO,QAAQ4I,uBAAuB5L,IAE/B+2B,EAAAtiC,UAAAssB,cAAP,SAAqB/gB,GACnBjL,KAAKiO,QAAQ+d,cAAc/gB,IAuBrB+2B,EAAAtiC,UAAA0jC,uBAAR,WACEpjC,KAAK6I,QAAQuD,qBAAqBmQ,YAAYvc,KAAKkjC,oBACnDljC,KAAK6I,QAAQ86B,oBAAoBpnB,YAAYvc,KAAKwjC,oBAG5CxB,EAAAtiC,UAAA4jC,oCAAR,SACED,EACA15B,GAEA,OAAO05B,EAAQU,KAAK,SAACxB,GAEnB,OADA54B,EAAuBC,wBAAwB24B,EAASqB,SAAWf,EAAAgB,gBAAgBI,QAAS1B,EAAS71B,UAC9F61B,KAGbP,EAnHA,GAAa1kC,EAAA0kC,iICNb,SAAY6B,GACVA,EAAA,kBACAA,EAAA,gBACAA,EAAA,YAHF,CAAYvmC,EAAAumC,kBAAAvmC,EAAAumC,gBAAe,0GCF3B,IAAAH,EAAA,oBAAAA,IACS1jC,KAAAukC,MAAkB,GAClBvkC,KAAAwkC,YAAwB,GACxBxkC,KAAAykC,UAAsB,GACtBzkC,KAAA0kC,QAA+D,GA6BxE,OA3BShB,EAAAhkC,UAAA6S,YAAP,SAAmBtH,GACjBjL,KAAKukC,MAAMvpB,KAAK/P,IAEXy4B,EAAAhkC,UAAAkR,kBAAP,SAAyB3F,GACvBjL,KAAKwkC,YAAYxpB,KAAK/P,IAEjBy4B,EAAAhkC,UAAAmX,uBAAP,SAA8B5L,GAC5BjL,KAAKykC,UAAUzpB,KAAK/P,IAEfy4B,EAAAhkC,UAAAssB,cAAP,SAAqB/gB,GACnBjL,KAAK0kC,QAAQ1pB,KAAK/P,IAGby4B,EAAAhkC,UAAA0kC,QAAP,SAAen2B,GACbjO,KAAKukC,MAAM94B,QAAQ,SAACgW,GAClBxT,EAAQsE,YAAYkP,KAEtBzhB,KAAKwkC,YAAY/4B,QAAQ,SAACgW,GACxBxT,EAAQ2C,kBAAkB6Q,KAE5BzhB,KAAKykC,UAAUh5B,QAAQ,SAACgW,GACtBxT,EAAQ4I,uBAAuB4K,KAEjCzhB,KAAK0kC,QAAQj5B,QAAQ,SAACgW,GACpBxT,EAAQ+d,cAAcvK,MAG5BiiB,EAjCA,GAAapmC,EAAAomC,qHCFb,IAAAiB,EAAA/mC,EAAA,IACAwb,EAAAxb,EAAA,GAGAumC,EAAA,WAIE,SAAAA,EAAYS,EAAsB3B,EAAgCl3B,GAAA/L,KAAA+L,aAChE/L,KAAK4kC,YAAcA,EACnB5kC,KAAK6kC,cAAgB,IAAIF,EAAAG,cAAc7B,GAyB3C,OAtBSkB,EAAAzkC,UAAA6S,YAAP,SAAmBtH,GACjBA,EAAO5L,IAAMW,KAAK+L,WAClB/L,KAAK6kC,cAActyB,YAAYtH,EAAQmO,EAAArV,OAGlCogC,EAAAzkC,UAAAkR,kBAAP,SAAyB3F,GACvBA,EAAO5L,IAAMW,KAAK+L,WAClB/L,KAAK6kC,cAAcj0B,kBAAkB3F,IAGhCk5B,EAAAzkC,UAAAmX,uBAAP,SAA8B5L,GAC5BA,EAAO5L,IAAMW,KAAK+L,WAClB/L,KAAK6kC,cAAchuB,uBAAuB5L,EAAQmO,EAAArV,OAG7CogC,EAAAzkC,UAAAssB,cAAP,SAAqB/gB,GACnBA,EAAO5L,IAAMW,KAAK+L,WACb/L,KAAK4kC,aAGV5kC,KAAK6kC,cAAc7Y,cAAc/gB,IAErCk5B,EA/BA,GAAa7mC,EAAA6mC,sHCNb,IAAA/qB,EAAAxb,EAAA,GACAsb,EAAAtb,EAAA,IACAmnC,EAAAnnC,EAAA,GAEAknC,EAAA,WAIE,SAAAA,EAAYzC,GACVriC,KAAKglC,mBAAqBD,EAAA79B,SAASm7B,EAAS,aAC5CriC,KAAKilC,qBAAuBF,EAAA79B,SAASm7B,EAAS,eAyClD,OAtCSyC,EAAAplC,UAAA6S,YAAP,SAAmBtH,EAAgBggB,GACjC/R,EAAA6B,KAAK/a,KAAKglC,mBAAoB/5B,EAAQggB,IAGjC6Z,EAAAplC,UAAAkR,kBAAP,SAAyB3F,GAAzB,IAAAlC,EAAA/I,KACEA,KAAKklC,cAAc,SAAC5xB,GAAiB,OAAAvK,EAAK8N,uBAAuBvD,EAAM8F,EAAArV,OAAO/D,KAAKmlC,wBAAyBl6B,IAGvG65B,EAAAplC,UAAAwlC,cAAP,SAAqBE,EAAuC1/B,EAAa4N,QACnC,IAAzBhN,UAAU++B,WACnBD,EAAiB9xB,GAEDhN,UAAU++B,WAAW3/B,EAAKxB,KAAKC,UAAUmP,KAEvD8xB,EAAiB9xB,IAKhBwxB,EAAAplC,UAAAmX,uBAAP,SAA8B5L,EAAgBggB,GAC5C/R,EAAA6B,KAAK/a,KAAKglC,mBAAoB/5B,EAAQggB,GAAU,IAG3C6Z,EAAAplC,UAAAssB,cAAP,SAAqB/gB,GAArB,IAAAlC,EAAA/I,KACEA,KAAKklC,cACH,SAAC5xB,GAAmB,OAAA4F,EAAA6B,KAAKhS,EAAKu8B,0BAA2BhyB,EAAM8F,EAAArV,OAC/D/D,KAAKslC,0BACLr6B,IAIG65B,EAAAplC,UAAAylC,sBAAP,WACE,OAAOnlC,KAAKglC,oBAGPF,EAAAplC,UAAA4lC,wBAAP,WACE,OAAOtlC,KAAKilC,sBAEhBH,EA/CA,GAAaxnC,EAAAwnC,qICHb,IAAA1C,EAAA,WAGE,SAAAA,EAAYmD,GACVvlC,KAAKiO,QAAUs3B,EA+BnB,OA5BSnD,EAAA1iC,UAAA6S,YAAP,SAAmBtH,GACbjL,KAAKwlC,uBAAuBv6B,IAGhCjL,KAAKiO,QAAQsE,YAAYtH,IAGpBm3B,EAAA1iC,UAAAkR,kBAAP,SAAyB3F,GACnBjL,KAAKwlC,uBAAuBv6B,IAGhCjL,KAAKiO,QAAQ2C,kBAAkB3F,IAG1Bm3B,EAAA1iC,UAAAmX,uBAAP,SAA8B5L,GACxBjL,KAAKwlC,uBAAuBv6B,IAGhCjL,KAAKiO,QAAQ4I,uBAAuB5L,IAG/Bm3B,EAAA1iC,UAAAssB,cAAP,SAAqB/gB,GACnBjL,KAAKiO,QAAQ+d,cAAc/gB,IAGrBm3B,EAAA1iC,UAAA8lC,uBAAR,SAA+Bv6B,GAC7B,OAAyB,MAAjBA,EAAOsF,OAAiB,EAAItF,EAAOsF,SAAW,KAE1D6xB,EAnCA,GAAa9kC,EAAA8kC,6ICGb,IAAAD,EAAA,WAIE,SAAAA,EAAYK,GAFJxiC,KAAAylC,eAAyB,EAG/BzlC,KAAKwiC,WAAaA,EAyBtB,OAtBSL,EAAAziC,UAAA6S,YAAP,SAAmBtH,GACjBjL,KAAK0lC,0BAA0Bz6B,GAC/BjL,KAAKwiC,WAAWjwB,YAAYtH,IAGvBk3B,EAAAziC,UAAAkR,kBAAP,SAAyB3F,GACvBjL,KAAK0lC,0BAA0Bz6B,GAC/BjL,KAAKwiC,WAAW5xB,kBAAkB3F,IAG7Bk3B,EAAAziC,UAAAmX,uBAAP,SAA8B5L,GAC5BjL,KAAK0lC,0BAA0Bz6B,GAC/BjL,KAAKwiC,WAAW3rB,uBAAuB5L,IAGlCk3B,EAAAziC,UAAAssB,cAAP,SAAqB/gB,GACnBjL,KAAKwiC,WAAWxW,cAAc/gB,IAGxBk3B,EAAAziC,UAAAgmC,0BAAR,SAAkCz6B,GAChCA,EAAOw6B,eAAiBzlC,KAAKylC,kBAEjCtD,EA9BA,GAAa7kC,EAAA6kC,gLCLb,IAAA/5B,EAAAxK,EAAA,GAEaN,EAAAqoC,oCAAsC,0BAEnD,IAAAz5B,EAAA,WAME,SAAAA,EAAYtD,GACV,IAAMqD,EAAkBrD,EAAOA,OAC/B5I,KAAK4lC,eAAoC,MAAnB35B,IAA8D,IAAnCA,EAAgB25B,eAC1C,MAAnB35B,GAA4D,MAAjCA,EAAgB45B,cAC7C7lC,KAAK6lC,cAAgB55B,EAAgB45B,cAErC7lC,KAAK6lC,cAAgB,KAGlB7lC,KAAK4lC,gBACR5lC,KAAK8lC,wBAGP9lC,KAAKqL,OAASrL,KAAK+lC,cAsCvB,OAnCU75B,EAAAxM,UAAAqmC,YAAR,WACE,IAAI16B,EAASjD,EAAM9E,UAAUhG,EAAAqoC,qCAI7B,OAHIv9B,EAAMpG,oBAAoBqJ,KAC5BA,EAASrL,KAAKgmC,yBAET36B,GAGDa,EAAAxM,UAAAsmC,sBAAR,WACE,IAAMC,EAAc79B,EAAMjF,eAE1B,OADAnD,KAAKkmC,YAAYD,GACVA,GAGD/5B,EAAAxM,UAAAomC,sBAAR,WACE,IAAMz6B,EAASjD,EAAM9E,UAAUhG,EAAAqoC,qCAC/B,IAAIv9B,EAAMpG,oBAAoBqJ,GAA9B,CAGA,IAAM3H,EAAYpG,EAAAqoC,oCAAmC,oDACrDliC,SAASC,OAASA,IAGZwI,EAAAxM,UAAAwmC,YAAR,SAAoB76B,GAClB,GAAKrL,KAAK4lC,eAAV,CAGA,IAAIliC,EAAYpG,EAAAqoC,oCAAmC,IAAIt6B,EAAM,uEAEnC,MAAtBrL,KAAK6lC,gBACPniC,GAAU,YAAY1D,KAAK6lC,eAG7BpiC,SAASC,OAASA,IAEtBwI,EAzDA,GAAa5O,EAAA4O,isBCLb,IAAAi6B,EAAAvoC,EAAA,IAEAwoC,EAAAxoC,EAAA,IACA2f,EAAA3f,EAAA,GACAmoB,EAAAnoB,EAAA,GACAkK,EAAAlK,EAAA,IACAyoC,EAAAzoC,EAAA,GACA0oC,EAAA1oC,EAAA,GAOA2oC,EAAA3oC,EAAA,IAIA63B,EAAA,SAAAha,GAGE,SAAAga,EAAoBtoB,EAAawQ,GAAjC,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAM2d,IAAK3d,YADO+I,EAAAoE,SAFZpE,EAAAod,qBAA+B,EAkBhCpd,EAAAsE,iBAAmB,WAAM,OAAAtE,EAAKoE,OAAOxG,SACrCoC,EAAAqE,cAAgB,WAAM,OAAA2Y,EAAAne,OAAO4+B,UAC7Bz9B,EAAAwE,cAAgB,WAAM,OAAAxE,EAAKoE,OAAOs5B,iBAOlC19B,EAAAoH,sBAAwB,WAAsC,OAAApH,EAAKgV,oBAvBxEhV,EAAKyV,aAAe,IAAI2nB,EAAAO,+BAA+B39B,EAAKoG,sBAAuBpG,EAAK4U,QAmT5F,OAxT8CvB,EAAAqZ,EAAAha,GAQrCga,EAAA/1B,UAAAiN,WAAP,SAAkB2L,GAQhB,OAPAtY,KAAK2mC,WAOE,CANqB,IAAIL,EAAA9qB,oBAC9BlD,EAAU1M,oCACV,IAAIy6B,EAAAhtB,mBAAmBf,EAAU1M,oCAAoCK,iBACrE,CAACqM,EAAUsuB,8BACXlkC,KAQG+yB,EAAA/1B,UAAAuQ,YAAP,WACE,OAAIjQ,KAAKmN,OAAOwnB,YAAYkS,UACnB7mC,KAAKmN,OAAOwnB,YAAYkS,SAASz9B,WAEnC,GAIFqsB,EAAA/1B,UAAAqV,uBAAP,WACE,IAAMD,EAAIpK,IAAA,GACL+Q,EAAA/b,UAAMyf,sBAAqBlhB,KAAA+B,OAAE,CAChCiV,KAAMjV,KAAKmN,OAAO25B,eAAiBh/B,EAAAwO,WAAWmR,WAAa3f,EAAAwO,WAAWC,OACtEjJ,WAAYtN,KAAKuN,gBACjBlD,OAAQrK,KAAKmN,OAAO9C,SACpB6K,cAAelV,KAAKmN,OAAOmf,cAC3BnX,aAAcnV,KAAKmN,OAAOoa,gBAC1BhS,iBAAkBvV,KAAKmN,OAAO45B,YAAYC,YAC1CxxB,kBAAmBxV,KAAKmN,OAAO45B,YAAYE,aAC3CxzB,QAASzT,KAAKmN,OAAOsG,UACrBkC,UAAW3V,KAAKmN,OAAOwI,YACvBE,cAAyC,MAA1B7V,KAAKmN,OAAO+5B,WAAqBlnC,KAAKmN,OAAO+5B,WAAWC,KAAO,KAC9ErxB,iBAAiB,EACjBE,cAAehW,KAAKmN,OAAOi6B,UAAYpnC,KAAKmN,OAAOk6B,mBAAqB,IAQ1E,OALArnC,KAAKsnC,wBAAwBxyB,GAC7B9U,KAAKunC,+BAA+BzyB,GACpC9U,KAAKwnC,sBAAsB1yB,GAC3B9U,KAAKynC,uBAAuB3yB,GAErBA,GAGF2gB,EAAA/1B,UAAAinC,SAAP,eAAA59B,EAAA/I,KACEA,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMC,mBAAoB,SAACp2B,GACjEzI,EAAKsV,cAAcd,EAAA5V,MAAMkgC,gBAAiB,CACxCj0B,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMI,iBAAkB,SAACv2B,GAC/DzI,EAAK+K,0BACL/K,EAAKsV,cAAcd,EAAA5V,MAAMuqB,cAAe,MAG1ClyB,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMK,SAAU,WACtDj/B,EAAKsV,cAAcd,EAAA5V,MAAM4gB,MAAO,MAGlCvoB,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMM,gBAAiB,SAACz2B,GAC9DzI,EAAKsV,cAAcd,EAAA5V,MAAMoqB,WAAYvgB,KAGvCxR,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMO,gBAAiB,WAC7Dn/B,EAAKsV,cAAcd,EAAA5V,MAAMsqB,SAAU,CACjCre,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMQ,QAAS,WACrDp/B,EAAKsV,cAAcd,EAAA5V,MAAMghB,KAAM,CAC7B/U,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMS,UAAW,WACvDr/B,EAAKsV,cAAcd,EAAA5V,MAAMiiB,MAAO,CAC9BhW,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMU,gBAAiB,WAC7Dt/B,EAAKsV,cAAcd,EAAA5V,MAAMuhB,YAAa,CACpCtV,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMW,QAAS,WACrDv/B,EAAKsV,cAAcd,EAAA5V,MAAMqhB,KAAM,CAC7BpV,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMY,UAAW,WACvDx/B,EAAKsV,cAAcd,EAAA5V,MAAMshB,OAAQ,CAC/BrV,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMa,iBAAkB,WAC9Dz/B,EAAKsV,cAAcd,EAAA5V,MAAMgiB,gBAAiB,CACxC/V,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMc,eAAgB,WAC5D1/B,EAAKsV,cAAcd,EAAA5V,MAAMmpB,cAAe,CACtCld,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMe,kCAAmC,WAC/E,IAAMC,EAAU5/B,EAAKoE,OAAOy7B,uBAExB7/B,EAAK4W,8BAA8BgpB,EAAQp0B,WAC7CxL,EAAK6W,wBAAwB+oB,EAAQp0B,SACrCxL,EAAKsV,cAAcd,EAAA5V,MAAMopB,aAAc,CACrCxc,QAASo0B,EAAQp0B,QACjBX,YAAa7K,EAAKoE,OAAO26B,sBAK/B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMkB,kCAAmC,WAC/E,IAAMF,EAAU5/B,EAAKoE,OAAO+gB,uBACxBnlB,EAAKyW,8BAA8BmpB,EAAQp0B,WAC7CxL,EAAK2W,wBAAwBipB,EAAQp0B,SACrCxL,EAAKsV,cAAcd,EAAA5V,MAAMyiB,aAAc,CACrCjW,MAAOw0B,EAAQx0B,MACfE,OAAQs0B,EAAQt0B,OAChBE,QAASo0B,EAAQp0B,QACjBX,YAAa7K,EAAKoE,OAAO26B,sBAK/B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMmB,oBAAqB,WACjE//B,EAAKsV,cAAcd,EAAA5V,MAAMohC,iBAAkB,CACzCn1B,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMqB,mBAAoB,WAChEjgC,EAAKsV,cAAcd,EAAA5V,MAAMshC,eAAgB,CACvCr1B,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMuB,cAAe,WAC3DngC,EAAKsV,cAAcd,EAAA5V,MAAM8pB,SAAU,CACjC7d,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMwB,eAAgB,WAC5DpgC,EAAKsV,cAAcd,EAAA5V,MAAMgqB,OAAQ,CAC/B/d,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMyB,SAAU,WACtDrgC,EAAKsV,cAAcd,EAAA5V,MAAMmhB,KAAM,CAC7BlV,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAM0B,WAAY,WACxDtgC,EAAKsV,cAAcd,EAAA5V,MAAMohB,QAAS,CAChCnV,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAM2B,SAAU,SAAC93B,GACvDzI,EAAKsV,cAAcd,EAAA5V,MAAMod,MAAO,CAC9BpS,KAAMnB,EAAMmB,KACZE,QAASrB,EAAMqB,QACfe,YAAa7K,EAAKoE,OAAO26B,iBACzBx0B,KAAM,OAIVtT,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAM4B,qBAAsB,WAClExgC,EAAKsV,cAAcd,EAAA5V,MAAM6hC,kBAAmB,CAC1C51B,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAM8B,qBAAsB,SAACj4B,GAChB,IAA/CA,EAAMk4B,aAAa5lC,QAAQ,kBAC7BiF,EAAKgV,mBAAqB,CACxB3N,QAASoB,EAAMk4B,aAAannC,QAAQ,eAAgB,IACpD8N,YAAkC,IAArBmB,EAAMqrB,iBAKzB78B,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMgC,iBAAkB,SAACn4B,GAC/DzI,EAAKsV,cAAcd,EAAA5V,MAAM4pB,mBAAoB,CAC3C3d,YAAa7K,EAAKoE,OAAO26B,qBAI7B9nC,KAAKmN,OAAOu6B,gBAAgB1nC,KAAKmN,OAAOw6B,MAAMiC,oBAAqB,SAACp4B,GAClEzI,EAAKsV,cAAcd,EAAA5V,MAAM0pB,gBAAiB,CACxCzd,YAAa7K,EAAKoE,OAAO26B,qBAI7B,IAAI+B,EAAkB,WACpB,IAAK9gC,EAAKod,oBAAqB,CAC7Bpd,EAAKod,qBAAsB,EAC3B,IAAIvS,OAAW,EACI,MAAf7K,EAAKoE,SACPyG,EAAc7K,EAAKoE,OAAO26B,kBAE5B/+B,EAAKsV,cAAcd,EAAA5V,MAAM0d,OAAQ,CAC/BzR,YAAWA,IAGf7K,EAAK0F,WAEPo7B,EAAkBA,EAAgBvqC,MAAK,GAEvCU,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAOw6B,MAAMoC,WAAYF,GAC7C7pC,KAAK6pB,mBAAmBL,iBAAiB,eAAgBqgB,GACzD7pC,KAAK6pB,mBAAmBL,iBAAiB,SAAUqgB,IAG9CpU,EAAA/1B,UAAA4K,aAAP,SAAoB1B,EAAa1F,GAC/BlD,KAAKwe,aAAalU,aAAa1B,EAAQ1F,EAAWlD,KAAKmN,OAAO26B,mBAEhEtpC,OAAAC,eAAcg3B,EAAA/1B,UAAA,cAAW,KAAzB,WACE,OAAOM,KAAKmN,OAAO26B,kDAGbrS,EAAA/1B,UAAA8nC,sBAAR,SAA8B1yB,GAC5B,IAAMk1B,EAAShqC,KAAKmN,OAAOwnB,YAAYqV,OACvC,GAAc,MAAVA,EAAJ,CAGAl1B,EAAK9F,WAAag7B,EAAO7/B,MACzB2K,EAAKM,OAAS40B,EAAOC,KACrBn1B,EAAKO,QAAU20B,EAAOE,IAEtB,IAAMC,EAAiB5D,EAAAzY,sCAAsCkc,EAAOjc,YAAa/tB,KAAKmN,QACtF2H,EAAKQ,QAAU60B,EAAe70B,QACM,gBAAhCtV,KAAKmN,OAAOoa,kBACdzS,EAAKN,aAAe21B,EAAenc,eAI/ByH,EAAA/1B,UAAA4nC,wBAAR,SAAgCxyB,GAC9B,IAAMs1B,EAAWpqC,KAAKmN,OAAOk9B,eAAiB,GAE9Cv1B,EAAKgB,gBAAiC,MAAfs0B,EAAShc,GAChCtZ,EAAKiB,iBAAmBq0B,EAASjD,MAG3B1R,EAAA/1B,UAAA6nC,+BAAR,SAAuCzyB,GACrC,IAAMw1B,EAAetqC,KAAKmN,OAAO+gB,uBACZ,OAAjBoc,IACFx1B,EAAKN,aAAe81B,EAAa/1B,QACjCO,EAAKR,oBAAsBg2B,EAAaj2B,OACxCS,EAAKV,mBAAqBk2B,EAAan2B,OAGzC,IAAMo2B,EAAevqC,KAAKmN,OAAOy7B,uBACZ,OAAjB2B,IACFz1B,EAAKH,aAAe41B,EAAah2B,UAI7BkhB,EAAA/1B,UAAA+nC,uBAAR,SAA+B3yB,GAC7B,IAAMa,EAAY3V,KAAKmN,OAAOwI,aAAe3V,KAAKmN,OAAOq9B,oBAAqB,EAE9E,GADA11B,EAAKa,UAAYA,EACZA,EAKL,GAAI3V,KAAKmN,OAAOq9B,kBACd11B,EAAKc,SAAWwwB,EAAAvY,SAAS4c,YAD3B,CAMA,IAAMC,EAAsB1qC,KAAKmN,OAAOwnB,YAAYgW,cACpD,GAAID,QAIJ,OAAQA,EAAoBzR,MAC1B,IAAK,aACHnkB,EAAKc,SAAWwwB,EAAAvY,SAAS+c,WACzB,MACF,IAAK,YACH91B,EAAKc,SAAWwwB,EAAAvY,SAASgd,aAIjCpV,EAxTA,CAHA73B,EAAA,IAG8C8f,iBAAjCpgB,EAAAm4B,qrBClBb,IASKvF,EATL9P,EAAAxiB,EAAA,IACA2f,EAAA3f,EAAA,GAIAktC,EAAAltC,EAAA,IACAsK,EAAAtK,EAAA,GACAuyB,EAAAvyB,EAAA,KAEA,SAAKsyB,GACHA,EAAA,cACAA,EAAA,kBACAA,EAAA,cACAA,EAAA,kBACAA,EAAA,0BACAA,EAAA,cACAA,EAAA,8BACAA,EAAA,gCACAA,EAAA,4BACAA,EAAA,oCACAA,EAAA,0CACAA,EAAA,sDACAA,EAAA,UACAA,EAAA,cACAA,EAAA,QACAA,EAAA,4BACAA,EAAA,0BACAA,EAAA,4BACAA,EAAA,kBACAA,EAAA,kCACAA,EAAA,sCACAA,EAAA,0CACAA,EAAA,oCAvBF,CAAKA,MAAK,KA0BV,IAAAwW,EAAA,SAAAjrB,GAeE,SAAAirB,EAAYv3B,EAA8CwO,GAA1D,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAMmP,EAAuBwO,IAAK3d,YAZ5B+I,EAAAgiC,gBAAoC,GACpChiC,EAAAiiC,kBAAmB,EA+BpBjiC,EAAAuB,aAAe,SAAC1B,EAAa1F,EAAmB0Q,GACrD7K,EAAK0V,UAAUlB,EAAA5V,MAAMyoB,qBAAsB,CAACxnB,OAAMA,EAAEgL,YAAWA,GAAG1Q,IApBlE6F,EAAKkiC,gBAAkB,KACvBliC,EAAKmiC,cAAgB,EACrBniC,EAAKoiC,gBAAkB,EACvBpiC,EAAKqiC,cAAgB,EACrBriC,EAAKsiC,aAAc,EACnBtiC,EAAKuiC,WAAY,IA8YrB,OApaoDlvB,EAAAsqB,EAAAjrB,GAyB3CirB,EAAAhnC,UAAA4wB,aAAP,WACE,OAAA1vB,EACKpC,OAAO6jB,KAAK6N,GAAO/c,IAAI,SAAC9T,GAAQ,OAAA6wB,EAAM7wB,KAAK,CAC9C,sBACA,YACA,6BACA,uBACA,sCAQGqnC,EAAAhnC,UAAAwkB,mBAAP,SAA0BvG,GAA1B,IAAA5U,EAAA/I,KACE,OAAOogB,EAAahhB,OAAO,CACzB8hB,QAASgP,EAAMvF,MACf1pB,MAAO,SAACwvB,EAAW/O,EAAME,EAAIza,EAAMuL,EAAWE,GAC5C1K,EAAAvG,OAAOV,MAAM,0BAA4B2R,IAE3CyO,OAAQ,CACN,CAAChjB,KAAMkf,EAAA5V,MAAM4gB,MAAO7G,KAAM,CAACwO,EAAMvF,MAAOuF,EAAMnL,OAAQnD,GAAIsO,EAAM3H,OAChE,CAAClqB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAMU,SAEhD,CAACvyB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC7D,CAACvyB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC3D,CAACvyB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC1D,CAACvyB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC1D,CAACvyB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMc,SAEzD,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SACzD,CAAC3yB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SAC3D,CAAC3yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMe,aAC7D,CAAC5yB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMc,SAC/D,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aAE7D,CAAC5yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMtG,OACnD,CAACvrB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMtG,OACvD,CAACvrB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMc,SAEhD,CAAC3yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMiB,eAC1D,CAAC9yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMiB,eAC1D,CAAC9yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMiB,eAChE,CAAC9yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMiB,eAChE,CAAC9yB,KAAM,uBAAwBqjB,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMc,SAEpE,CAAC3yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMkB,qBACxD,CAAC/yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMkB,qBACxD,CACE/yB,KAAMkf,EAAA5V,MAAMyiB,aACZ1I,KAAMwO,EAAMkB,oBACZxP,GAAIsO,EAAMkB,qBAEZ,CACE/yB,KAAMkf,EAAA5V,MAAMopB,aACZrP,KAAMwO,EAAMkB,oBACZxP,GAAIsO,EAAMkB,qBAEZ,CAAC/yB,KAAM,6BAA8BqjB,KAAMwO,EAAMkB,oBAAqBxP,GAAIsO,EAAMtG,OAEhF,CAACvrB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMgB,gBAChD,CAAC7yB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACzD,CAAC7yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACjE,CAAC7yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACjE,CAAC7yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACpE,CAAC7yB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBAClE,CAAC7yB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMtG,OAC3D,CAACvrB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMc,SACzD,CAAC3yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMtG,OAE1D,CAACvrB,KAAM,YAAaqjB,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMqb,cACjD,CAACltC,KAAM,YAAaqjB,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMqb,cAC1D,CAACltC,KAAM,YAAaqjB,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cACxD,CAACltC,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cACvD,CAACltC,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAC/D,CAACltC,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAC/D,CAACltC,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAClE,CAACltC,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAChE,CAACltC,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAGzD,CAACltC,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMsb,kBAEvD,CAACntC,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACtE,CAACntC,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACpE,CAACntC,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBAC7D,CAACntC,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMc,SAElE,CAAC3yB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMQ,KACtD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMQ,KACxD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMQ,KACjD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMQ,KAC/C,CAACryB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAC9C,CAACryB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAChD,CAACryB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACrD,CAACryB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACvD,CAACryB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACzD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAE7C,CAACryB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMU,SAE9C,CAACvyB,KAAMkf,EAAA5V,MAAMod,MAAOrD,KAAM1hB,KAAKswB,eAAgB1O,GAAIsO,EAAMnL,OAEzD,CAAC1mB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMqb,cAC3D,CAACltC,KAAM,sBAAuBqjB,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMc,SAEtE,CAAC3yB,KAAMkf,EAAA5V,MAAM0d,OAAQ3D,KAAM1hB,KAAKswB,eAAgB1O,GAAIsO,EAAMQ,KAE1D,CAACryB,KAAMkf,EAAA5V,MAAM8pB,SAAU/P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMwB,IACtD,CAACrzB,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMwB,GAAI9P,GAAIsO,EAAMc,SAE/C,CAAC3yB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM0B,cAChD,CAACvzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM0B,cACnD,CAACvzB,KAAM,gBAAiBqjB,KAAMwO,EAAM0B,aAAchQ,GAAIsO,EAAM3H,OAE5D,CAAClqB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAM2B,aAClD,CAACxzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAM2B,aACrD,CAACxzB,KAAM,gBAAiBqjB,KAAMwO,EAAM2B,YAAajQ,GAAIsO,EAAMc,SAE3D,CAAC3yB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAM4B,cAChD,CAACzzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAM4B,cACnD,CAACzzB,KAAM,gBAAiBqjB,KAAMwO,EAAM4B,aAAclQ,GAAIsO,EAAMtG,OAE5D,CAACvrB,KAAMkf,EAAA5V,MAAMoqB,WAAYrQ,KAAM,CAACwO,EAAM3H,MAAO2H,EAAMtG,MAAOsG,EAAMc,SAAUpP,GAAIsO,EAAM8B,SACpF,CAAC3zB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACnD,CAAC3zB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACrD,CAAC3zB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACzD,CAAC3zB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACrD,CAAC3zB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACpD,CAAC3zB,KAAMkf,EAAA5V,MAAMsqB,SAAUvQ,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM3H,OAEtD,CAAClqB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAChD,CAAClqB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAClD,CAAClqB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAEpD,CAACvyB,KAAMkf,EAAA5V,MAAMyoB,qBAAsB1O,KAAM1hB,KAAKswB,eAAgB1O,GAAIsO,EAAMS,iBACxE,CAACtyB,KAAMkf,EAAA5V,MAAMkgC,gBAAiBnmB,KAAM1hB,KAAKswB,eAAgB1O,GAAIsO,EAAMS,iBAEnE,CAACtyB,KAAMkf,EAAA5V,MAAM4gB,MAAO7G,KAAMwO,EAAMS,gBAAiB/O,GAAIsO,EAAM3H,OAK3D,CAAClqB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMiC,2BAC9D,CAAC9zB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMiC,2BAC9D,CACE9zB,KAAMkf,EAAA5V,MAAMyiB,aACZ1I,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMiC,2BAEZ,CACE9zB,KAAMkf,EAAA5V,MAAMopB,aACZrP,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMiC,2BAEZ,CACE9zB,KAAM,mCACNqjB,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMe,aAEZ,CAAC5yB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMsB,qBAChE,CAACnzB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAC9D,CAACvrB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aACpE,CAAC5yB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACzE,CAACntC,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMsB,oBAAqB5P,GAAIsO,EAAMsB,qBAC5E,CAACnzB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMsB,oBAAqB5P,GAAIsO,EAAMc,SAErE,CAAC3yB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMoB,mBAC7D,CAACjzB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAC3D,CAACvrB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aACjE,CAAC5yB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACtE,CAACntC,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMoB,kBAAmB1P,GAAIsO,EAAMoB,mBACvE,CAACjzB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMoB,kBAAmB1P,GAAIsO,EAAMc,SAEnE,CAAC3yB,KAAMkf,EAAA5V,MAAM4X,mBAAoBmC,KAAM,CAACwO,EAAMc,QAASd,EAAMtG,OAAQhI,GAAIsO,EAAMkC,kBAC/E,CAAC/zB,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAMkC,iBAAkBxQ,GAAIsO,EAAMc,SAC9D,CAAC3yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMkC,iBAAkBxQ,GAAIsO,EAAMtG,QAE9DtI,UAAW,CACTmqB,QAAS,SAACj6B,EAAOkQ,EAAME,EAAI1e,GACrBwe,IAASwO,EAAMc,UACjBjoB,EAAKkiC,gBAAkB/nC,IAG3BwoC,cAAe,SAACl6B,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1C,GAAI/M,IAAU+L,EAAA5V,MAAMqhB,MAAQtH,IAASwO,EAAMtG,MAAO,CAC3C7gB,EAAKsiC,cACRtiC,EAAKmiC,cAAgBhoC,EACrB6F,EAAKsiC,aAAc,GAErB,IAAMM,EAAczoC,EAAY6F,EAAKkiC,gBACrC,GAAIU,EAAcjF,EAA+BkF,kBAAoBD,EAAc,EAEjF,OADA5iC,EAAKyV,aAAaqtB,UAAU3oC,IACrB,EAQX,OAJIsO,IAAU+L,EAAA5V,MAAMqhB,MAClBtrB,OAAOsnB,aAAajc,EAAKqiC,eAGvB55B,IAAU+L,EAAA5V,MAAMshB,QAAUvH,IAASwO,EAAMgB,gBAC3CnoB,EAAKoiC,gBAAkBjoC,EACvB6F,EAAKuiC,WAAY,EACjBviC,EAAKqiC,cAAgB1tC,OAAOonB,WAAW,WACrC/b,EAAKyV,aAAazM,MAAM7O,EAAWqb,IAClCmoB,EAA+BoF,qBAC3B,IAGLpqB,IAASwO,EAAMe,aAAerP,IAAOsO,EAAMiC,iCAA/C,GAIFK,aAAc,SAAChhB,EAAOkQ,EAAME,EAAI1e,GAC1B0e,IAAOsO,EAAMkB,qBACfroB,EAAKyV,aAAaiU,2BAA2BvvB,GAE3C0e,IAAOsO,EAAMiB,eACfpoB,EAAKyV,aAAakU,qBAAqBxvB,GAErC0e,IAAOsO,EAAMiC,2BACfppB,EAAKyV,aAAamU,iCAAiCzvB,GAEjD0e,IAAOsO,EAAM0B,cAAgBhQ,IAAOsO,EAAM2B,aAAejQ,IAAOsO,EAAM4B,cACxE/oB,EAAKyV,aAAaoU,cAAc1vB,IAGpCovB,aAAc,SACZ9gB,EACAkQ,EACAE,EACA1e,EACAqb,GAEa,SAATmD,GAAmB/D,EAAKe,UAC1B3V,EAAK+a,sBAAwBnG,EAAKe,UAElC3V,EAAK+a,sBAAwB5gB,IAAa,IAAIH,MAAO2hB,UAGvDxc,EAAAvG,OAAOvB,IAAI,WAAa8H,EAAA5G,SAASsgB,EAAI,IAAM,UAAY1Z,EAAA5G,SAASkQ,EAAO,IAAM,SAAWtJ,EAAA5G,SAASogB,EAAM,KAErGnD,GACAqD,IAAOsO,EAAMgB,gBACbtP,IAAOsO,EAAMqb,cACb3pB,IAAOsO,EAAMsb,kBAEbziC,EAAKoG,sBAAsBuC,2BAA2B6M,GAGpD/M,IAAU+L,EAAA5V,MAAMoqB,YAAcnQ,IAAOsO,EAAM8B,SAC7CjpB,EAAKoG,sBAAsBojB,aAAarvB,EAAWqb,GAGjDqD,IAAOsO,EAAMe,aACfloB,EAAKub,qCAGTuO,aAAc,SAACrhB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAKzC,GAJImD,IAASwO,EAAMe,aACjBloB,EAAKwb,0BAGFrhB,EAAL,CAGA6F,EAAKgjC,eAAev6B,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAChD,IAAMoG,EAAgBzhB,EAAY6F,EAAK+a,sBAWvC,GAREvF,GACAqD,IAAOsO,EAAMgB,gBACbtP,IAAOsO,EAAMqb,cACb3pB,IAAOsO,EAAMsb,kBAEbziC,EAAKoG,sBAAsBsC,yBAAyB8M,GAGxC,cAAV/M,GAAyBkQ,IAASwO,EAAMtG,MAC1C,OAAO,EAGT,IAAMkJ,EAAS1uB,OAAOsd,GAAMpE,cAC5B,GAAIoE,IAASwO,EAAMsb,kBAAoB9pB,IAASwO,EAAMgB,eAAgB,CACpE,IAAM8B,EAAejqB,EAAKoiC,gBAAkBpiC,EAAKmiC,cAC7CniC,EAAKsiC,aAAetiC,EAAKuiC,WAAa1pB,IAAOsO,EAAMqb,eACrDxiC,EAAKuiC,UAAYviC,EAAKsiC,aAAc,EACpCtiC,EAAKoG,sBAAsB2jB,GAAQE,EAAcF,EAAQvU,SAEtD,GAAI/M,IAAU+L,EAAA5V,MAAM0d,OACzBtc,EAAKoG,sBAAsBsB,OAAOkU,EAAemO,QAC5C,GAAIpR,IAASwO,EAAMtG,OAAShI,IAAOsO,EAAMgB,eAC9CnoB,EAAKoG,sBAAsBuC,2BAA2BF,GACtDzI,EAAKoG,sBAAsB4C,MAAM4S,EAAemO,OAC3C,CACL,IAAMG,EAAmBlqB,EAAKoG,sBAAsB2jB,GACpB,mBAArBG,EACTA,EAAiBtO,EAAemO,EAAQvU,GAExCrW,EAAAvG,OAAOV,MAAM,wCAA0C6xB,GAKzDvU,GACAqD,IAAOsO,EAAMgB,gBACbtP,IAAOsO,EAAMqb,cACb3pB,IAAOsO,EAAMsb,kBAEbziC,EAAKoG,sBAAsBuC,2BAA2B6M,GAGpD/M,IAAU+L,EAAA5V,MAAMyiB,aAClBrhB,EAAKoG,sBAAsBoC,YAAYgN,GAC9B/M,IAAU+L,EAAA5V,MAAMopB,aACzBhoB,EAAKoG,sBAAsByC,YAAY2M,GAC9B/M,IAAU+L,EAAA5V,MAAMmhB,KACzB/f,EAAKoG,sBAAsBqE,OAClBhC,IAAU+L,EAAA5V,MAAMohB,QACzBhgB,EAAKoG,sBAAsBuE,SAClBlC,IAAU+L,EAAA5V,MAAMyoB,sBACzBrnB,EAAKoG,sBAAsB0E,mBAAmB0K,KAGlD2U,OAAQ,SAAC1hB,EAAOkQ,EAAME,EAAI1e,GACnB6F,EAAKsiC,cACRtiC,EAAKmiC,cAAgBhoC,EACrB6F,EAAKsiC,aAAc,IAGvBW,SAAU,SAACx6B,EAAOkQ,EAAME,EAAI1e,GAC1B6F,EAAKoiC,gBAAkBjoC,EACvB6F,EAAKuiC,WAAY,GAEnBnY,cAAe,SAAC3hB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1C,IAAMoG,EAAgBzhB,EAAY6F,EAAK+a,sBAEnCa,EAAgB,QAClB5b,EAAKoG,sBAAsBsC,yBAAyB8M,GAEpDxV,EAAKoG,sBAAsB8B,UAAU0T,EAAevgB,OAAOsd,GAAMpE,cAAe,CAAC/M,OAAQoU,IACzF5b,EAAK+a,sBAAwB5gB,EAE7B6F,EAAKoG,sBAAsBuC,2BAA2B6M,KAG1D6U,cAAe,SAAC5hB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1CxV,EAAKoG,sBAAsBlO,MAAMsd,QAMlCmoB,EAAAhnC,UAAA+e,UAAP,SACEH,EACAC,EACArb,GAEA,IAAM0D,EAAO5G,KAAKwe,aAAaF,GAE/B,GAAI1X,EACF,IACEA,EAAK3I,KAAK+B,KAAKwe,aAActb,EAAWqb,GACxC,MAAOkD,GACPvZ,EAAAvG,OAAOV,MAAM,+CAAiDqd,EAAW1X,EAAM2X,EAAakD,QAG9FvZ,EAAAvG,OAAOvB,IAAI,kBAAoBke,IAI5BooB,EAAAhnC,UAAAqsC,eAAP,SACEv6B,EACAkQ,EACAE,EACA1e,EACAqb,GAEIve,KAAKgrC,kBACPhrC,KAAK+qC,gBAAgB/vB,KAAK,IAAI8vB,EAAAld,eAAepc,EAAOkQ,EAAME,EAAI1e,EAAWqb,KAItEmoB,EAAAhnC,UAAAusC,UAAP,WACE,OAAOjsC,KAAK+qC,iBAGPrE,EAAAhnC,UAAAwsC,oBAAP,SAA2Bh1B,GACzBlX,KAAKgrC,iBAAmB9zB,GAjaZwvB,EAAAkF,iBAAmB,IACnBlF,EAAAoF,mBAAqB,IAkarCpF,EApaA,CAAoDvW,EAAAtM,uBAAvCvmB,EAAAopC,gJCnCb,IAAA7+B,EAAAjK,EAAA,IAEAunB,EAAA,WAME,SAAAA,EAAoC1S,EAAgCC,GAAhC1S,KAAAyS,SAAgCzS,KAAA0S,YACtE,OANgByS,EAAAG,YAAc,IAAIH,EAAuB,cAAe,MACxDA,EAAAC,aAAe,IAAID,EAAuB,eAAgB,MAC1DA,EAAAK,QAAU,IAAIL,EAAuB,UAAWtd,EAAAiQ,UAAUqI,+BAC1DgF,EAAAM,QAAU,IAAIN,EAAuB,UAAW,MAGhEA,EAPA,GAAa7nB,EAAA6nB,yHCAb,IAAApI,EAAA,oBAAAA,IACU/c,KAAAmsC,aAAoBzpC,EACpB1C,KAAAosC,YAAsB,EA6BhC,OA3BE5tC,OAAAC,eAAWse,EAAArd,UAAA,SAAM,KAAjB,WACE,OAAOM,KAAKmsC,yCAGd3tC,OAAAC,eAAWse,EAAArd,UAAA,YAAS,KAApB,WACE,OAAOM,KAAKosC,4CAQPrvB,EAAArd,UAAA4c,QAAP,WACEtc,KAAKosC,YAAa,EAClBpsC,KAAKqc,YAGAU,EAAArd,UAAAid,UAAP,SAAiBF,EAAwBI,GAKvC,OAJuB,MAAnBA,IACF7c,KAAKmsC,QAAUnsC,KAAK4c,cAAcC,IAEpC7c,KAAKwc,WAAWC,EAAezc,KAAKmsC,SAC7BnsC,KAAKmsC,SAIhBpvB,EA/BA,GAAsBzf,EAAAyf,+HC2CTzf,EAAAsgB,6BAAsD,CACjExO,MAAO,SAAC3M,EAAc6M,KACtBO,QAAS,SAACpN,EAAc6M,KACxBgB,QAAS,SAAC7N,EAAc6M,KACxB2B,UAAW,SAACxO,EAAc6M,EAAe+8B,KACzCl7B,cAAe,SAAC1O,EAAc6M,KAC9B+B,oBAAqB,SAAC5O,EAAc6M,KACpCgC,0BAA2B,SAAC7O,EAAc6M,KAC1CiC,YAAa,SAACC,KACdI,YAAa,SAACJ,KACdM,oBAAqB,aACrBC,MAAO,SAACtP,EAAc6M,KACtB2C,eAAgB,SAACxP,EAAc6M,KAC/B6C,iBAAkB,SAAC1P,EAAc6M,KACjC8C,YAAa,SAAC3P,EAAc6M,KAC5BrO,MAAO,SAACuQ,KACRyC,IAAK,SAACxR,EAAc6M,KACpBmB,OAAQ,SAAChO,EAAc6M,KACvBiE,GAAI,SAAC9Q,EAAc6M,KACnBkE,KAAM,aACNE,OAAQ,aACRC,kBAAmB,aACnBlC,yBAA0B,SAACD,KAC3BE,2BAA4B,SAACF,KAC7Bc,iBAAkB,SAACd,EAAkDe,KACrE+5B,gBAAiB,SAAC7pC,EAAc6M,EAAekC,KAC/C+6B,MAAO,SAAC9pC,EAAc6M,EAAekC,KACrC+gB,aAAc,SAAC9vB,EAAc+O,KAC7Bg7B,QAAS,SAACn9B,EAAkBmC,KAC5BqC,mBAAoB,SAACrC,KACrBwC,oBAAqB,SAACxC,KACtBi7B,aAAc,SAAChqC,EAAc6M,EAAekC,KAC5C0C,iBAAkB,SAACzR,EAAe6M,EAAgBkC,KAClD/C,QAAS,aACTsF,mBAAoB,SAACvC,iHC1EvB,IAAA4M,EAAA,oBAAAA,IACUpe,KAAA0sC,eAAkC,GAiB5C,OAfStuB,EAAA1e,UAAA8pB,iBAAP,SAAwBiH,EAAmBhO,GACzCziB,KAAK0sC,eAAe1xB,KAAK,CAACyV,UAASA,EAAEhO,KAAIA,IACzC/kB,OAAO8rB,iBAAiBiH,EAAWhO,IAG9BrE,EAAA1e,UAAA+O,QAAP,WACE,KAAsC,IAA/BzO,KAAK0sC,eAAejsC,QAAc,CACvC,IAAMksC,EAAM3sC,KAAK0sC,eAAezlC,WACpBvE,IAARiqC,GAIJjvC,OAAOgsB,oBAAoBijB,EAAIlc,UAAWkc,EAAIlqB,QAGpDrE,EAlBA,GAAa9gB,EAAA8gB,8cCHb,IAAA8W,EAAAt3B,EAAA,GAGAsK,EAAAtK,EAAA,GACAu3B,EAAAv3B,EAAA,GACAgvC,EAAAhvC,EAAA,IAEA81B,EAAA,SAAAjY,GACE,SAAAiY,EAAYvmB,EAAawQ,GAAzB,IAAA5U,EACE0S,EAAAxd,KAAA+B,OAAOA,KAEP,GAAI+I,EAAKyP,8BAA8BrL,UACrCjF,EAAAvG,OAAOX,mBAAmB,qEAG5B+H,EAAK2P,8BAA8BvL,GAEnC,IAAM0/B,EAA8B1/B,EAAqBwnB,YACrDa,EAAoCqX,EAAqBv0B,sBACrC5V,IAApB8yB,IACFA,EAAkB,IAGpBA,EAAgB7mB,UAAY6mB,EAAgB7mB,WAAak+B,EAAaxtC,IAEtE0J,EAAKwP,gBAAkB,IAAIq0B,EAAAE,yBAAyB3/B,EAAQwQ,GAC5D5U,EAAKuP,UAAY,IAAI4c,EAAAvsB,UAAU6sB,EAAiBzsB,EAAKwP,iBACpDpL,EAAemL,UAAYvP,EAAKuP,UACjCvP,EAAK2sB,eAAevoB,EAAQpE,EAAKuP,aAerC,OApCsC8D,EAAAsX,EAAAjY,GAwB5BiY,EAAAh0B,UAAAg2B,eAAR,SAAuBvoB,EAAmBmL,GACxC,IAAMqd,EAAexoB,EAAOyoB,KAC5BzoB,EAAOyoB,KAAO,eAAC,IAAAzuB,EAAA,GAAA5G,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,IAAA4G,EAAA5G,GAAAC,UAAAD,GACb,GAAI4G,EAAK1G,OAAS,EAAG,CACnB,IAAM+0B,EAAmBruB,EAAK,GAAWmR,UAEzCA,EAAUhO,aAAakrB,GAGzB,OAAOG,EAAah1B,MAAMwM,EAAQhG,KAGxCusB,EApCA,CAAsCyB,EAAA/c,SAAzB9a,EAAAo2B,wrBCRb,IAgCKqZ,EAhCLC,EAAApvC,EAAA,IAEAqvC,EAAArvC,EAAA,IACAsvC,EAAAtvC,EAAA,IACAioB,EAAAjoB,EAAA,IACAwoC,EAAAxoC,EAAA,IACAiK,EAAAjK,EAAA,IACA2f,EAAA3f,EAAA,GACAmoB,EAAAnoB,EAAA,GACAkK,EAAAlK,EAAA,IACAyoC,EAAAzoC,EAAA,GACA0oC,EAAA1oC,EAAA,GAGAuvC,EAAAvvC,EAAA,IAOA2oC,EAAA3oC,EAAA,IACAsK,EAAAtK,EAAA,GACAwvC,EAAAxvC,EAAA,GAEAyvC,EAAAzvC,EAAA,IACA0vC,EAAA1vC,EAAA,IACA2vC,EAAA3vC,EAAA,IACA4vC,EAAA5vC,EAAA,IACA6vC,EAAA7vC,EAAA,KAGA,SAAKmvC,GACHA,EAAA,gBACAA,EAAA,wBACAA,EAAA,oCAHF,CAAKA,MAAQ,KAMb,IAAAD,EAAA,SAAArxB,GA0BE,SAAAqxB,EAAoB3/B,EAAmBwQ,GAAvC,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAM2d,IAAK3d,YADO+I,EAAAoE,SARZpE,EAAAod,qBAA+B,EA0DhCpd,EAAAsE,iBAAmB,WAAM,OAAAtE,EAAKoE,OAAOxG,SACrCoC,EAAAqE,cAAgB,WAAM,OAAA2Y,EAAAne,OAAO4+B,UAC7Bz9B,EAAAwE,cAAgB,WAAM,OAAAxE,EAAKoE,OAAOs5B,iBAOlC19B,EAAAoH,sBAAwB,WAAsC,OAAApH,EAAKgV,oBAzDxEhV,EAAKyV,aAAe,IAAIwuB,EAAAU,+BAA+B3kC,EAAKoG,sBAAuBpG,EAAK4U,MACxF5U,EAAK4kC,WAAa,IAAIH,EAAAI,2BAA2BzgC,EAAQ,IAAI8/B,EAAA1e,oBAAsBsf,wBACnF9kC,EAAK+kC,eAAiB,IAAIP,EAAAQ,+BAA+B5gC,EAAQ,IAAI+/B,EAAAc,gBAAkBC,oBACvFllC,EAAKmlC,2BAA6B,IAAIZ,EAAAa,oCAAoChhC,GAC1EpE,EAAKsF,uBAAyB,IAAIwX,EAAAsB,UAsZtC,OAtb8C/K,EAAA0wB,EAAArxB,GAC5Cjd,OAAAC,eAAIquC,EAAAptC,UAAA,oBAAiB,KAArB,WACE,OAAOM,KAAK2tC,WAAWze,2CAGzB1wB,OAAAC,eAAIquC,EAAAptC,UAAA,WAAQ,KAAZ,WACE,OAAOM,KAAK8tC,eAAeM,+CAG7B5vC,OAAAC,eAAIquC,EAAAptC,UAAA,WAAQ,KAAZ,WACE,OAAOM,KAAKquC,2CAGd7vC,OAAAC,eAAIquC,EAAAptC,UAAA,iCAA8B,KAAlC,WACE,OAAO,mCAoBTlB,OAAAC,eAAcquC,EAAAptC,UAAA,cAAW,KAAzB,WACE,IAIE,GAAoB,OAAhBM,KAAKmN,QAAkD,OAA/BnN,KAAKmN,OAAO26B,iBAA4B9nC,KAAKsuC,YACvE,OAAOtuC,KAAKmN,OAAO26B,iBAErB,MAAA97B,GACA9D,EAAAvG,OAAOT,QAAQ,uFAEjB,OAAOlB,KAAKuuC,uBAAyBvuC,KAAKuuC,uBAAyB,mCAGrE/vC,OAAAC,eAAcquC,EAAAptC,UAAA,cAAW,KAAzB,WACE,IAAM8uC,EAAYxuC,KAAKmN,OAAOitB,KAAOp6B,KAAKmN,OAAOitB,IAAIqU,cACrD,OAAOD,yCAGF1B,EAAAptC,UAAAiN,WAAP,SAAkB2L,GAChBtY,KAAK0uC,+BACL1uC,KAAK2uC,+BAEL3uC,KAAKquC,UAAY,IAAIhB,EAAAuB,kBAAkB5uC,KAAKmN,OAAQnN,KAAK6pB,oBACzD,IAAMglB,EAAkB,IAAI1B,EAAA2B,oBAAoB,CAAC9uC,KAAKkuC,6BAOtD,MAAO,CANqB,IAAI5H,EAAA9qB,oBAC9BlD,EAAU1M,oCACV,IAAIy6B,EAAAhtB,mBAAmBf,EAAU1M,oCAAoCK,iBACrE,CAACqM,EAAUsuB,yBACXiI,KAKG/B,EAAAptC,UAAAsR,YAAP,WACEhR,KAAK2tC,WAAWr/B,SAGXw+B,EAAAptC,UAAA0f,cAAP,WACEpf,KAAK8tC,eAAex/B,SAMfw+B,EAAAptC,UAAAuQ,YAAP,WACE,OAAIjQ,KAAKmN,OAAOwnB,YAAYkS,UAClB7mC,KAAKmN,OAAOwnB,YAAoBkS,SAASz9B,WAE5C,GAIF0jC,EAAAptC,UAAAqV,uBAAP,WACE,IAAMD,EAAIpK,IAAA,GACL+Q,EAAA/b,UAAMyf,sBAAqBlhB,KAAA+B,OAAE,CAChCiV,KAAMjV,KAAKmN,OAAO4hC,gBAAkBhC,EAAStlB,WAAa3f,EAAAwO,WAAWmR,WAAa3f,EAAAwO,WAAWC,OAC7FjJ,WAAYtN,KAAKuN,gBACjBlD,OAAQrK,KAAKmN,OAAO9C,SACpB6K,cAAelV,KAAKkV,cAAgBlV,KAAKkV,cAAgB,EACzDC,aAAcnV,KAAKmN,OAAOoa,gBAC1BhS,iBAAkBvV,KAAKmN,OAAO+qB,eAAe8O,YAC7CxxB,kBAAmBxV,KAAKmN,OAAO+qB,eAAe+O,aAC9CxzB,QAASzT,KAAKmN,OAAOsG,UACrBkC,UAAW3V,KAAKmN,OAAOwI,YACvBE,cAAyC,MAA1B7V,KAAKmN,OAAO+5B,WAAqBlnC,KAAKmN,OAAO+5B,WAAWC,UAAOzkC,EAC9EoT,iBAAiB,EACjBE,cAA0C,MAA3BhW,KAAKmN,OAAO6hC,YAAsBhvC,KAAKmN,OAAO8hC,wBAA0B,IAQzF,OALAjvC,KAAKsnC,wBAAwBxyB,GAC7B9U,KAAKunC,+BAA+BzyB,GACpC9U,KAAKynC,uBAAuB3yB,GAC5B9U,KAAKwnC,sBAAsB1yB,GAEpBA,GAGFg4B,EAAAptC,UAAA4K,aAAP,SAAoB1B,EAAQ1F,GAC1BlD,KAAKwe,aAAalU,aAAa1B,EAAQ1F,EAAWlD,KAAK4T,cAGlDk5B,EAAAptC,UAAA2T,QAAP,WACErT,KAAKof,iBAGC0tB,EAAAptC,UAAAgvC,6BAAR,eAAA3lC,EAAA/I,KACEA,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYC,eAAgB,SAAC39B,GAC9DzI,EAAK+kC,eAAex/B,QACpBvF,EAAKsV,cAAcd,EAAA5V,MAAMkgC,gBAAiB,CACxCj0B,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYE,aAAc,SAAC59B,GAC5DzI,EAAKsF,uBAAuBC,QAC5BvF,EAAK+K,0BACL/K,EAAKmM,cAAgBnM,EAAKoE,OAAOmf,cACjCvjB,EAAKsF,uBAAuBqa,iBAAiB3f,EAAKoE,OAAOmf,eACzDvjB,EAAKsV,cAAcd,EAAA5V,MAAMuqB,cAAe,MAG1ClyB,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYG,YAAa,SAAC79B,GAC3DzI,EAAKsV,cAAcd,EAAA5V,MAAMoqB,WAAYvgB,KAGvCxR,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYI,YAAa,WAC1DvmC,EAAKsV,cAAcd,EAAA5V,MAAMsqB,SAAU,CACjCre,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYK,KAAM,SAAC9tB,GACnC,YAAbA,EAAE+tB,QACJzmC,EAAKsV,cAAcd,EAAA5V,MAAMghB,KAAM,CAC7B/U,YAAa7K,EAAK6K,gBAKxB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYO,QAAS,SAAChuB,GACtC,oBAAbA,EAAE+tB,QACJzmC,EAAKsV,cAAcd,EAAA5V,MAAMqpB,QAAS,CAChCpd,YAAa7K,EAAK6K,gBAKxB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYQ,OAAQ,SAACjuB,GACrC,YAAbA,EAAE+tB,QACJzmC,EAAKsV,cAAcd,EAAA5V,MAAMiiB,MAAO,CAC9BhW,YAAa7K,EAAK6K,gBAKxB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYS,YAAa,SAACluB,GACtD1Y,EAAKulC,cACRvlC,EAAKwlC,uBAAyBxlC,EAAKoE,OAAO26B,kBAE5C/+B,EAAKsV,cAAcd,EAAA5V,MAAMuhB,YAAa,CACpCtV,YAAa7K,EAAKwlC,2BAItBvuC,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYU,KAAM,SAACnuB,GAChD1Y,EAAK8mC,aAAapuB,IACpB1Y,EAAKsV,cAAcd,EAAA5V,MAAMqhB,KAAM,CAC7BpV,YAAa7K,EAAK6K,gBAKxB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYY,OAAQ,WACrD/mC,EAAKsV,cAAcd,EAAA5V,MAAMshB,OAAQ,CAC/BrV,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYa,aAAc,WAC3DhnC,EAAKsV,cAAcd,EAAA5V,MAAMgiB,gBAAiB,CACxC/V,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYc,WAAY,WACzDjnC,EAAKsV,cAAcd,EAAA5V,MAAMmpB,cAAe,CACtCld,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYe,4BAA6B,WAC1E,IAAMtH,EAAU5/B,EAAKoE,OAAOy7B,uBAExB7/B,EAAK4W,8BAA8BgpB,EAAQp0B,WAC7CxL,EAAK6W,wBAAwB+oB,EAAQp0B,SACrCxL,EAAKsV,cAAcd,EAAA5V,MAAMopB,aAAc,CACrCxc,QAASo0B,EAAQp0B,QACjBX,YAAa7K,EAAK6K,YAClBa,MAAQk0B,EAAgBl0B,WAK9BzU,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYgB,4BAA6B,WAC1E,IAAMvH,EAAU5/B,EAAKoE,OAAO+gB,uBAExBnlB,EAAKyW,8BAA8BmpB,EAAQp0B,WAC7CxL,EAAK2W,wBAAwBipB,EAAQp0B,SACrCxL,EAAKsV,cAAcd,EAAA5V,MAAMyiB,aAAc,CACrCjW,MAAOw0B,EAAQx0B,MACfE,OAAQs0B,EAAQt0B,OAChBE,QAASo0B,EAAQp0B,QACjBX,YAAa7K,EAAK6K,YAClBa,MAAQk0B,EAAgBl0B,WAK9BzU,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYiB,gBAAiB,SAAC1uB,GAClD,eAATA,EAAEG,GACJ7Y,EAAKsV,cAAcd,EAAA5V,MAAMohC,iBAAkB,CACzCn1B,YAAa7K,EAAK6K,cAEA,eAAX6N,EAAEC,MACX3Y,EAAKsV,cAAcd,EAAA5V,MAAMshC,eAAgB,CACvCr1B,YAAa7K,EAAK6K,gBAKxB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYkB,UAAW,SAAC5+B,GACzDzI,EAAKsV,cAAcd,EAAA5V,MAAM8pB,SAAU,CACjC7d,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYmB,WAAY,SAAC7+B,GAC1DzI,EAAKsV,cAAcd,EAAA5V,MAAMgqB,OAAQ,CAC/B/d,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYoB,UAAW,SAAC9+B,GACzDzI,EAAKsV,cAAcd,EAAA5V,MAAMgqB,OAAQ,CAC/B/d,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYqB,QAAS,SAAC/+B,GACvDzI,EAAKsV,cAAcd,EAAA5V,MAAMgqB,OAAQ,CAC/B/d,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYsB,MAAO,WACpDznC,EAAKsV,cAAcd,EAAA5V,MAAMmhB,KAAM,CAC7BlV,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYuB,QAAS,WACtD1nC,EAAKsV,cAAcd,EAAA5V,MAAMohB,QAAS,CAChCnV,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYxuB,MAAO,SAAClP,GACrDzI,EAAKsV,cAAcd,EAAA5V,MAAMod,MAAO,CAC9BpS,KAAMnB,EAAMmB,KACZE,QAASrB,EAAMnT,KACf2U,WAAYxB,EAAM8B,KAClBM,YAAa7K,EAAK6K,YAClBN,KAAM,CACJgH,eAAgBpW,KAAKC,UAAUqN,EAAM8B,SAIvC9B,EAAMmB,OAAS9K,EAAAiQ,UAAUkI,gCAAgCrN,MACzDnB,EAAMmB,OAAS9K,EAAAiQ,UAAUmI,gCAAgCtN,MAEzD5J,EAAK+U,qBAAqBhL,SAAS,MAIvC9S,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYwB,iBAAkB,WAC/D3nC,EAAKsV,cAAcd,EAAA5V,MAAM6hC,kBAAmB,CAC1C51B,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYyB,iBAAkB,SAACn/B,GACb,IAA/CA,EAAMk4B,aAAa5lC,QAAQ,kBAC7BiF,EAAKgV,mBAAqB,CACxB3N,QAASoB,EAAMk4B,aAAannC,QAAQ,eAAgB,IACpD8N,YAAkC,IAArBmB,EAAMqrB,iBAKzB78B,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAY0B,aAAc,SAACp/B,GAC5DzI,EAAKsV,cAAcd,EAAA5V,MAAM4pB,mBAAoB,CAC3C3d,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAY2B,gBAAiB,SAACr/B,GAC/DzI,EAAKsV,cAAcd,EAAA5V,MAAM0pB,gBAAiB,CACxCzd,YAAa7K,EAAK6K,gBAItB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAY4B,iBAAkB,SAACt/B,GAChEzI,EAAKsV,cAAcd,EAAA5V,MAAM0pB,gBAAiB,CACxCzd,YAAa7K,EAAK6K,gBAKtB5T,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAY6B,iBAAkB,SAACv/B,GAC5DA,EAAM8B,KAAKgF,gBAA0C5V,IAA7B8O,EAAM8B,KAAKgF,UAAUjZ,IAC/C0J,EAAK8U,sBAAsB/K,SAAS,CAAC/G,WAAYyF,EAAM8B,KAAKgF,UAAUjZ,MAEtE0J,EAAK+U,qBAAqBhL,SAAS,OAKjCg6B,EAAAptC,UAAAivC,6BAAR,eAAA5lC,EAAA/I,KACMgxC,EAAwB,WAC1B,IAAKjoC,EAAKod,oBAAqB,CAC7Bpd,EAAKod,qBAAsB,EAE3B,IAAMvS,EAAc7K,EAAKwlC,uBACzBxlC,EAAKsV,cAAcd,EAAA5V,MAAM0d,OAAQ,CAACzR,YAAWA,IAE/C7K,EAAK0F,WAEPuiC,EAAwBA,EAAsB1xC,MAAK,GAEnDU,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAY+B,QAASD,GACxDhxC,KAAK6pB,mBAAmBL,iBAAiB,eAAgBwnB,GACzDhxC,KAAK6pB,mBAAmBL,iBAAiB,SAAUwnB,IAG7ClE,EAAAptC,UAAA8nC,sBAAR,SAA8B1yB,GAC5B,IAAMk1B,EAAShqC,KAAKmN,OAAO6hC,YAC3B,GAAc,MAAVhF,EAAJ,CAIAl1B,EAAK9F,WAAag7B,EAAO7/B,MACzB2K,EAAKM,OAAS40B,EAAOC,KACrBn1B,EAAKO,QAAU20B,EAAOE,IAEtB,IAAMC,EAAiB5D,EAAAzY,sCAAsCkc,EAAOjc,YAAa/tB,KAAKmN,QACtF2H,EAAKQ,QAAU60B,EAAe70B,QACM,gBAAhCtV,KAAKmN,OAAOoa,kBACdzS,EAAKN,aAAe21B,EAAenc,eAI/B8e,EAAAptC,UAAA4nC,wBAAR,SAAgCxyB,GAC9B,IAAIo8B,EACAlxC,KAAKmN,OAAOgkC,YACdD,EAAkBlxC,KAAKmN,OAAOgkC,UAAUC,OAAOtV,KAAK,SAACj8B,GAAM,OAAc,IAAdA,EAAEqX,WAG/DpC,EAAKgB,gBAAqC,MAAnBo7B,EACvBp8B,EAAKiB,iBAAsC,MAAnBm7B,EAA0BA,EAAgB/J,KAAO,MAGnE2F,EAAAptC,UAAA6nC,+BAAR,SAAuCzyB,GACrC,IAAMw1B,EAAetqC,KAAKmN,OAAO+gB,uBACZ,OAAjBoc,IACFx1B,EAAKN,aAAe81B,EAAa/1B,QACjCO,EAAKR,oBAAsBg2B,EAAaj2B,OACxCS,EAAKV,mBAAqBk2B,EAAan2B,MACvCW,EAAKJ,WAAc41B,EAAqB71B,OAG1C,IAAM81B,EAAevqC,KAAKmN,OAAOy7B,uBACZ,OAAjB2B,IACFz1B,EAAKH,aAAe41B,EAAah2B,QACjCO,EAAKF,WAAc21B,EAAqB91B,QAIpCq4B,EAAAptC,UAAA+nC,uBAAR,SAA+B3yB,GAC7B,IAAMa,EAAY3V,KAAKmN,OAAOwI,aAAe3V,KAAKmN,OAAOq9B,oBAAqB,EAE9E,GADA11B,EAAKa,UAAYA,EACZA,EAKL,GAAI3V,KAAKmN,OAAOq9B,kBACd11B,EAAKc,SAAWwwB,EAAAvY,SAAS4c,YAD3B,CAMA,IAAMC,EAAsB1qC,KAAKmN,OAAOwnB,YAAYgW,cACpD,GAAID,QAIJ,OAAQA,EAAoBzR,MAC1B,IAAK,aACHnkB,EAAKc,SAAWwwB,EAAAvY,SAAS+c,WACzB,MACF,IAAK,YACH91B,EAAKc,SAAWwwB,EAAAvY,SAASgd,aAOvBiC,EAAAptC,UAAAmwC,aAAR,SAAqBpuB,GACnB,IAAM4vB,EAAY5vB,EAElB,OADuB9e,KAAKmoB,IAAIumB,EAAUnU,SAAWmU,EAAUC,YACvClE,EAAkBn0B,yCAE9C6zB,EAtbA,CAA8CW,EAAA/vB,iBAAjCpgB,EAAAwvC,keCvCb,IAUK5c,EAVL9P,EAAAxiB,EAAA,IACA2f,EAAA3f,EAAA,GAIAktC,EAAAltC,EAAA,IACAsK,EAAAtK,EAAA,GACAwb,EAAAxb,EAAA,GACAuyB,EAAAvyB,EAAA,KAEA,SAAKsyB,GACHA,EAAA,cACAA,EAAA,kBACAA,EAAA,cACAA,EAAA,kBACAA,EAAA,0BACAA,EAAA,cACAA,EAAA,8BACAA,EAAA,4BACAA,EAAA,oCACAA,EAAA,0CACAA,EAAA,sDACAA,EAAA,UACAA,EAAA,cAEAA,EAAA,wBACAA,EAAA,oBACAA,EAAA,oBACAA,EAAA,wBACAA,EAAA,4BACAA,EAAA,0BACAA,EAAA,4BACAA,EAAA,kBACAA,EAAA,kCACAA,EAAA,8CACAA,EAAA,8BACAA,EAAA,sCACAA,EAAA,0CACAA,EAAA,gDACAA,EAAA,oCA7BF,CAAKA,MAAK,KAgCV,IAAAwd,EAAA,SAAAjyB,GAYE,SAAAiyB,EAAYv+B,EAA8CwO,GAA1D,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAMmP,EAAuBwO,IAAK3d,YAZ5B+I,EAAAgiC,gBAAoC,GACpChiC,EAAAiiC,kBAAmB,EA0BpBjiC,EAAAuB,aAAe,SAAC1B,EAAa1F,EAAmB0Q,GACrD7K,EAAK0V,UAAUlB,EAAA5V,MAAMyoB,qBAAsB,CAACxnB,OAAMA,EAAEgL,YAAWA,GAAG1Q,IAflE6F,EAAKmiC,cAAgB,EACrBniC,EAAKoiC,gBAAkB,EACvBpiC,EAAKsiC,aAAc,EACnBtiC,EAAKuiC,WAAY,IA+drB,OAhfoDlvB,EAAAsxB,EAAAjyB,GAoB3CiyB,EAAAhuC,UAAA6wB,gBAAP,SAAuBnO,GACrB,OAAOpiB,KAAKswB,eAAe3C,OAAO,SAAC7vB,GAAM,OAAAskB,EAAOte,QAAQhG,GAAK,KAGxD4vC,EAAAhuC,UAAA4wB,aAAP,WACE,OAAO9xB,OAAO6jB,KAAK6N,GAAO/c,IAAI,SAAC9T,GAAQ,OAAA6wB,EAAM7wB,MAOxCquC,EAAAhuC,UAAAwkB,mBAAP,SAA0BvG,GAA1B,IAAA5U,EAAA/I,KACE,OAAOogB,EAAahhB,OAAO,CACzB8hB,QAASgP,EAAMvF,MACf1pB,MAAO,SAACwvB,EAAW/O,EAAME,EAAIza,EAAMuL,EAAWE,GAC5C1K,EAAAvG,OAAOV,MAAM,0BAA4B2R,IAE3CyO,OAAQ,CAEN,CACEhjB,KAAMkf,EAAA5V,MAAMuqB,cACZxQ,KAAM,CAACwO,EAAMvF,MAAOuF,EAAMnL,MAAOmL,EAAMS,gBAAiBT,EAAMqhB,uBAC9D3vB,GAAIsO,EAAM3H,OAGZ,CAAClqB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAMU,SAChD,CAACvyB,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAMc,SACnD,CAAC3yB,KAAMkf,EAAA5V,MAAM4gB,MAAO7G,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OACjD,CAAClqB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OACxD,CAAClqB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAExD,CAAClqB,KAAMkf,EAAA5V,MAAMod,MAAOrD,KAAM,CAACwO,EAAMU,QAASV,EAAMshB,YAAa5vB,GAAIsO,EAAMW,wBACvE,CAACxyB,KAAMkf,EAAA5V,MAAM0d,OAAQ3D,KAAM,CAACwO,EAAMU,QAASV,EAAMshB,YAAa5vB,GAAIsO,EAAMW,wBACxE,CAACxyB,KAAMkf,EAAA5V,MAAM4d,mBAAoB7D,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMW,wBAEhE,CAACxyB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAClD,CAACvyB,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SACrD,CAACvyB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMc,SACzD,CAAC3yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC7D,CAACvyB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC3D,CAACvyB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC1D,CAACvyB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC1D,CAACvyB,KAAMkf,EAAA5V,MAAM4gB,MAAO7G,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAEnD,CAACvyB,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SACrD,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SACzD,CAAC3yB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SAC3D,CAAC3yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMe,aAC7D,CAAC5yB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMc,SAC/D,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aAE7D,CAAC5yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMtG,OACnD,CAACvrB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMtG,OACvD,CAACvrB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMc,SAEhD,CAAC3yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMiB,eAC1D,CAAC9yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMiB,eAC1D,CAAC9yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMiB,eAChE,CAAC9yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMiB,eAChE,CAAC9yB,KAAM,uBAAwBqjB,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMc,SAEpE,CAAC3yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMkB,qBACxD,CAAC/yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMkB,qBACxD,CACE/yB,KAAMkf,EAAA5V,MAAMyiB,aACZ1I,KAAMwO,EAAMkB,oBACZxP,GAAIsO,EAAMkB,qBAEZ,CACE/yB,KAAMkf,EAAA5V,MAAMopB,aACZrP,KAAMwO,EAAMkB,oBACZxP,GAAIsO,EAAMkB,qBAEZ,CAAC/yB,KAAM,6BAA8BqjB,KAAMwO,EAAMkB,oBAAqBxP,GAAIsO,EAAMtG,OAKhF,CAACvrB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMqb,cAGlD,CAACltC,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMsb,kBACvD,CAACntC,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMsb,kBAC1D,CAACntC,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMsb,kBAGzD,CAACntC,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMqb,cAG3D,CAACltC,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMc,SAC9D,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMc,SAIlE,CAAC3yB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cACvD,CAACltC,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAC/D,CAACltC,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAC/D,CAACltC,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAClE,CAACltC,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAEhE,CAACltC,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACtE,CAACntC,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACpE,CAACntC,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBAC7D,CAACntC,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBAE3D,CAACntC,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAChD,CAACvrB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAGlD,CAACvrB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SAKpD,CAAC3yB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMQ,KACtD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMQ,KACjD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMQ,KAC/C,CAACryB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAC9C,CAACryB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAChD,CAACryB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACrD,CAACryB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACvD,CAACryB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACzD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAE7C,CAACryB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMU,SAE9C,CAACvyB,KAAMkf,EAAA5V,MAAMod,MAAOrD,KAAM1hB,KAAKuwB,gBAAgB,CAACL,EAAMU,UAAWhP,GAAIsO,EAAMnL,OAE3E,CAAC1mB,KAAMkf,EAAA5V,MAAM0d,OAAQ3D,KAAM1hB,KAAKuwB,gBAAgB,CAACL,EAAMU,QAASV,EAAMshB,aAAc5vB,GAAIsO,EAAMQ,KAE9F,CAACryB,KAAMkf,EAAA5V,MAAM4X,mBAAoBmC,KAAM,CAACwO,EAAMc,QAASd,EAAMtG,OAAQhI,GAAIsO,EAAMkC,kBAC/E,CAAC/zB,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAMkC,iBAAkBxQ,GAAIsO,EAAMc,SAC9D,CAAC3yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMkC,iBAAkBxQ,GAAIsO,EAAMtG,OAE5D,CAACvrB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMoB,mBAC7D,CAACjzB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAC3D,CAACvrB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aACjE,CAAC5yB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACtE,CAACntC,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMoB,kBAAmB1P,GAAIsO,EAAMoB,mBACvE,CAACjzB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMoB,kBAAmB1P,GAAIsO,EAAMc,SAEnE,CAAC3yB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMsB,qBAChE,CAACnzB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAC9D,CAACvrB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aACpE,CAAC5yB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACzE,CAACntC,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMsB,oBAAqB5P,GAAIsO,EAAMsB,qBAC5E,CAACnzB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMsB,oBAAqB5P,GAAIsO,EAAMc,SAGrE,CAAC3yB,KAAMkf,EAAA5V,MAAM8pB,SAAU/P,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMshB,YACtD,CAACnzC,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMshB,WAAY5vB,GAAIsO,EAAMU,SACvD,CAACvyB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMshB,WAAY5vB,GAAIsO,EAAMshB,YACrD,CAACnzC,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMshB,WAAY5vB,GAAIsO,EAAMshB,YAEtD,CAACnzC,KAAMkf,EAAA5V,MAAM8pB,SAAU/P,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAMuhB,UAEpD,CAACpzC,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMuhB,SAAU7vB,GAAIsO,EAAMU,SACrD,CAACvyB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMuhB,SAAU7vB,GAAIsO,EAAMuhB,UACnD,CAACpzC,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMuhB,SAAU7vB,GAAIsO,EAAMuhB,UAEpD,CAACpzC,KAAMkf,EAAA5V,MAAM8pB,SAAU/P,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMwhB,UACpD,CAACrzC,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMwhB,SAAU9vB,GAAIsO,EAAMtG,OACrD,CAACvrB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMwhB,SAAU9vB,GAAIsO,EAAMwhB,UACnD,CAACrzC,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMwhB,SAAU9vB,GAAIsO,EAAMwhB,UAEpD,CAACrzC,KAAMkf,EAAA5V,MAAM8pB,SAAU/P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMyhB,YACtD,CAACtzC,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMyhB,WAAY/vB,GAAIsO,EAAMc,SACvD,CAAC3yB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMyhB,WAAY/vB,GAAIsO,EAAMyhB,YACrD,CAACtzC,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMyhB,WAAY/vB,GAAIsO,EAAMyhB,YACtD,CAACtzC,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMyhB,WAAY/vB,GAAIsO,EAAMQ,KAGpD,CAACryB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMshB,WAAY5vB,GAAIsO,EAAMshB,YAC5D,CAACnzC,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMuhB,SAAU7vB,GAAIsO,EAAMuhB,UAC1D,CAACpzC,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMwhB,SAAU9vB,GAAIsO,EAAMwhB,UAC1D,CAACrzC,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMyhB,WAAY/vB,GAAIsO,EAAMyhB,YAG5D,CAACtzC,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SACpD,CAAC3yB,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAClD,CAACvrB,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAClD,CAAClqB,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAGpD,CAACvyB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM0B,cAChD,CAACvzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM0B,cACnD,CAACvzB,KAAM,gBAAiBqjB,KAAMwO,EAAM0B,aAAchQ,GAAIsO,EAAM3H,OAE5D,CAAClqB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAM2B,aAClD,CAACxzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAM2B,aACrD,CAACxzB,KAAM,gBAAiBqjB,KAAMwO,EAAM2B,YAAajQ,GAAIsO,EAAMc,SAE3D,CAAC3yB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAM4B,cAChD,CAACzzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAM4B,cACnD,CAACzzB,KAAM,gBAAiBqjB,KAAMwO,EAAM4B,aAAclQ,GAAIsO,EAAMtG,OAE5D,CAACvrB,KAAMkf,EAAA5V,MAAMoqB,WAAYrQ,KAAM,CAACwO,EAAM3H,MAAO2H,EAAMtG,MAAOsG,EAAMc,SAAUpP,GAAIsO,EAAM8B,SACpF,CAAC3zB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACnD,CAAC3zB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACrD,CAAC3zB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACzD,CAAC3zB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACrD,CAAC3zB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACpD,CAAC3zB,KAAMkf,EAAA5V,MAAMsqB,SAAUvQ,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM3H,OAEtD,CAAClqB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAChD,CAAClqB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAClD,CAAClqB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAEpD,CACEvyB,KAAMkf,EAAA5V,MAAMyoB,qBACZ1O,KAAM1hB,KAAKuwB,gBAAgB,CAACL,EAAMvF,QAClC/I,GAAIsO,EAAMS,iBAEZ,CACEtyB,KAAMkf,EAAA5V,MAAMyoB,qBACZ1O,KAAMwO,EAAMvF,MACZ/I,GAAIsO,EAAMqhB,uBAEZ,CAAClzC,KAAMkf,EAAA5V,MAAMkgC,gBAAiBnmB,KAAM1hB,KAAKswB,eAAgB1O,GAAIsO,EAAMS,iBAInE,CAACtyB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMiC,2BAC9D,CAAC9zB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMiC,2BAC9D,CACE9zB,KAAMkf,EAAA5V,MAAMyiB,aACZ1I,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMiC,2BAEZ,CACE9zB,KAAMkf,EAAA5V,MAAMopB,aACZrP,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMiC,2BAEZ,CACE9zB,KAAM,mCACNqjB,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMe,cAGd3P,UAAW,CACToqB,cAAe,SAACl6B,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1C,GAAImD,IAASwO,EAAMe,aAAerP,IAAOsO,EAAMiC,0BAC7C,OAAO,GAGXK,aAAc,SAAChhB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GACrC/M,IAAU+L,EAAA5V,MAAMyoB,sBAAwB1O,IAASwO,EAAMvF,MACzD5hB,EAAKoG,sBAAsB6E,oBAAoBuK,GACtC/M,IAAU+L,EAAA5V,MAAMyoB,sBACzBrnB,EAAKoG,sBAAsB0E,mBAAmB0K,GAG5CqD,IAAOsO,EAAMkB,qBACfroB,EAAKyV,aAAaiU,2BAA2BvvB,GAE3C0e,IAAOsO,EAAMiB,eACfpoB,EAAKyV,aAAakU,qBAAqBxvB,GAErC0e,IAAOsO,EAAMiC,2BACfppB,EAAKyV,aAAamU,iCAAiCzvB,GAEjD0e,IAAOsO,EAAM0B,cAAgBhQ,IAAOsO,EAAM2B,aAAejQ,IAAOsO,EAAM4B,cACxE/oB,EAAKyV,aAAaoU,cAAc1vB,IAGpCovB,aAAc,SACZ9gB,EACAkQ,EACAE,EACA1e,EACAqb,GAEa,SAATmD,GAAmB/D,EAAKe,UAC1B3V,EAAK+a,sBAAwBnG,EAAKe,UAElC3V,EAAK+a,sBAAwB5gB,IAAa,IAAIH,MAAO2hB,UAGvDxc,EAAAvG,OAAOvB,IACL,UAAU8C,EAAS,KAAKgF,EAAA5G,SAASsgB,EAAI,IAAG,WAAW1Z,EAAA5G,SAASkQ,EAAO,IAAG,UAAUtJ,EAAA5G,SAASogB,EAAM,MAI/FnD,GACAqD,IAAOsO,EAAMsb,kBACb9pB,IAASwO,EAAMqb,cACf7pB,IAASwO,EAAMshB,YACf9vB,IAASwO,EAAMuhB,UACf/vB,IAASwO,EAAMyhB,YACfjwB,IAASwO,EAAMwhB,UACblgC,IAAU+L,EAAA5V,MAAMqhB,MAAQtH,IAASwO,EAAMsb,kBAEzCziC,EAAKoG,sBAAsBuC,2BAA2B6M,GAGpD/M,IAAU+L,EAAA5V,MAAMoqB,YAAcnQ,IAAOsO,EAAM8B,SAC7CjpB,EAAKoG,sBAAsBojB,aAAarvB,EAAWqb,GAGjDqD,IAAOsO,EAAMe,aACfloB,EAAKub,qCAGTuO,aAAc,SAACrhB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAKzC,GAJImD,IAASwO,EAAMe,aACjBloB,EAAKwb,0BAGFrhB,EAAL,CAIAgF,EAAAvG,OAAOvB,IACL,UAAU8C,EAAS,KAAKgF,EAAA5G,SAASogB,EAAM,IAAG,WAAWxZ,EAAA5G,SAASkQ,EAAO,IAAG,QAAQtJ,EAAA5G,SAASsgB,EAAI,KAG/F7Y,EAAKgjC,eAAev6B,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAChD,IAAMoG,EAAgBzhB,EAAY6F,EAAK+a,sBAEnCvF,GAAeqD,IAAOsO,EAAMsb,kBAC9BziC,EAAKoG,sBAAsBsC,yBAAyB8M,GAGlDA,GAAe/M,IAAU+L,EAAA5V,MAAMgqB,SACjC5oB,EAAK6oC,0BAA4BrzB,GAG9BmD,IAASwO,EAAM3H,OAAS7G,IAASwO,EAAMshB,YAAe5vB,IAAOsO,EAAMU,QAE7DlP,IAASwO,EAAMU,SAAYhP,IAAOsO,EAAMc,SAAWpP,IAAOsO,EAAMshB,YACzEzoC,EAAKob,yBAFLpb,EAAK2c,uBAKP,IAAMoN,EAAS1uB,OAAOsd,GAAMpE,cAC5B,GAAIsE,IAAOsO,EAAMW,uBAAwB,CACvC9nB,EAAKob,yBACL,IAAMgG,EAAYphB,EAAKkc,+BAA+B/hB,EAAWsO,EAAO+M,GAClEwU,EAAmBvhB,IAAU+L,EAAA5V,MAAMod,MACzChc,EAAKoG,sBAAsBmD,iBAAiB6X,EAAW4I,QAClD,GAAIrR,IAASwO,EAAMsb,iBAAkB,CAC1C,IAAMxY,EAAejqB,EAAKoiC,gBAAkBpiC,EAAKmiC,cAM7CniC,EAAKsiC,aAAetiC,EAAKuiC,WAAa95B,IAAU+L,EAAA5V,MAAMqhB,OACxDjgB,EAAKsiC,YAActiC,EAAKuiC,WAAY,EACpCviC,EAAKoG,sBAAsBgD,iBAAiB6gB,EAAcF,SAEvD,GAAIthB,IAAU+L,EAAA5V,MAAM0d,OACzBtc,EAAKoG,sBAAsBsB,OAAOkU,EAAemO,QAC5C,GACLpR,IAASwO,EAAMwhB,UACfhwB,IAASwO,EAAMuhB,UACf/vB,IAASwO,EAAMyhB,YACfjwB,IAASwO,EAAMshB,WAEfzoC,EAAKoG,sBAAsBuC,2BAA2B3I,EAAK6oC,2BAC3D7oC,EAAKoG,sBAAsBsC,yBAAyB1I,EAAK6oC,2BACzD7oC,EAAKoG,sBAAsBoE,GAAGoR,EAAe,WACxC,GAAInT,IAAU+L,EAAA5V,MAAM8pB,UAAY/P,IAASwO,EAAMU,QACpDxX,EAAArV,YACK,GAAIyN,IAAU+L,EAAA5V,MAAMuqB,eAAiBxQ,IAASwO,EAAMqhB,sBACzDn4B,EAAArV,YACK,GAAI2d,IAASwO,EAAMnL,MAAO,CAC/B,IAAMkO,EAAmBlqB,EAAKoG,sBAAsB2jB,GACpD,GAAgC,mBAArBG,EACT,IACEA,EAAiBtO,EAAemO,EAAQvU,GACxC,MAAOkD,GACPvZ,EAAAvG,OAAOV,MAAM,+CAAiD6xB,EAAQvU,EAAakD,QAGrFvZ,EAAAvG,OAAOV,MAAM,wCAA0C6xB,GAKzDvU,GACAqD,IAAOsO,EAAMsb,kBACb9pB,IAASwO,EAAMqb,cACf3pB,IAAOsO,EAAMqb,cACb7pB,IAASwO,EAAMshB,YACf9vB,IAASwO,EAAMuhB,UACf/vB,IAASwO,EAAMyhB,YACfjwB,IAASwO,EAAMwhB,UAEf3oC,EAAKoG,sBAAsBuC,2BAA2B6M,GAGpD/M,IAAU+L,EAAA5V,MAAMyiB,aAClBrhB,EAAKoG,sBAAsBoC,YAAYgN,GAC9B/M,IAAU+L,EAAA5V,MAAMopB,aACzBhoB,EAAKoG,sBAAsByC,YAAY2M,GAC9B/M,IAAU+L,EAAA5V,MAAMmhB,KACzB/f,EAAKoG,sBAAsBqE,OAClBhC,IAAU+L,EAAA5V,MAAMohB,SACzBhgB,EAAKoG,sBAAsBuE,WAG/Bwf,OAAQ,SAAC1hB,EAAOkQ,EAAME,EAAI1e,GACnB6F,EAAKsiC,cACRtiC,EAAKmiC,cAAgBhoC,EACrB6F,EAAKsiC,aAAc,IAGvBW,SAAU,SAACx6B,EAAOkQ,EAAME,EAAI1e,GAC1B6F,EAAKoiC,gBAAkBjoC,EACvB6F,EAAKuiC,WAAY,GAEnBnY,cAAe,SAAC3hB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1C,GAAkC,YAA9BxV,EAAKyV,aAAalX,QAAtB,CAIA,IAAMqd,EAAgBzhB,EAAY6F,EAAK+a,sBAEnCa,EAAgB,QAClB5b,EAAKoG,sBAAsBsC,yBAAyB8M,GAEpDxV,EAAKoG,sBAAsB8B,UAAU0T,EAAevgB,OAAOsd,GAAMpE,cAAe,CAAC/M,OAAQoU,IACzF5b,EAAK+a,sBAAwB5gB,EAE7B6F,EAAKoG,sBAAsBuC,2BAA2B6M,MAG1D6U,cAAe,SAAC5hB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1CxV,EAAKoG,sBAAsBlO,MAAMsd,QAMlCmvB,EAAAhuC,UAAA+e,UAAP,SACEH,EACAC,EACArb,GAEA,IAAM0D,EAAO5G,KAAKwe,aAAaF,GAE/B,GAAI1X,EACF,IACEA,EAAK3I,KAAK+B,KAAKwe,aAActb,EAAWqb,GACxC,MAAOkD,GACPvZ,EAAAvG,OAAOV,MAAM,+CAAiDqd,EAAW1X,EAAM2X,EAAakD,QAG9FvZ,EAAAvG,OAAOvB,IAAI,kBAAoBke,IAI5BovB,EAAAhuC,UAAAqsC,eAAP,SACEv6B,EACAkQ,EACAE,EACA1e,EACAqb,GAEIve,KAAKgrC,kBACPhrC,KAAK+qC,gBAAgB/vB,KAAK,IAAI8vB,EAAAld,eAAepc,EAAOkQ,EAAME,EAAI1e,EAAWqb,KAItEmvB,EAAAhuC,UAAAusC,UAAP,WACE,OAAOjsC,KAAK+qC,iBAGP2C,EAAAhuC,UAAAwsC,oBAAP,SAA2Bh1B,GACzBlX,KAAKgrC,iBAAmB9zB,GAE5Bw2B,EAhfA,CAAoDvd,EAAAtM,uBAAvCvmB,EAAAowC,mIC1Cb,IAAAtlC,EAAAxK,EAAA,GAEAmxB,EAAA,oBAAAA,KAaA,OAZgBA,EAAAgB,YAAd,SAA0B8hB,GACxB,OAAe,EAARA,GAEK9iB,EAAAC,YAAd,SAA0B8iB,GACxB,OAAOnvC,KAAKC,MAAMkvC,EAAO,IAEb/iB,EAAAgjB,iBAAd,SAA+BF,GAC7B,OAAOzpC,EAAMvF,cAAsB,IAARgvC,IAEf9iB,EAAAijB,qBAAd,SAAmCC,GACjC,OAAkB,IAAXA,GAEXljB,EAbA,GAAazxB,EAAAyxB,4GCAb,IAAAF,EAAA,WAuBE,SAAAA,EAAYqjB,GACVlyC,KAAKkyC,SAAWA,EAEpB,OAvBE1zC,OAAAC,eAAIowB,EAAAnvB,UAAA,QAAK,KAAT,WACE,OAAOM,KAAKkyC,SAASj9B,KAAOjV,KAAKkyC,SAAS7iC,0CAE5C7Q,OAAAC,eAAIowB,EAAAnvB,UAAA,WAAQ,KAAZ,WACE,OAAOM,KAAKkyC,SAAS7iC,0CAEvB7Q,OAAAC,eAAIowB,EAAAnvB,UAAA,OAAI,KAAR,WACE,OAAOM,KAAKkyC,SAASj9B,sCAEvBzW,OAAAC,eAAIowB,EAAAnvB,UAAA,kBAAe,KAAnB,WACE,OAAOM,KAAKkyC,SAASjiB,iDAEvBzxB,OAAAC,eAAIowB,EAAAnvB,UAAA,YAAS,KAAb,WACE,OAAOM,KAAKkyC,SAAShvC,2CAGvB1E,OAAAC,eAAIowB,EAAAnvB,UAAA,aAAU,KAAd,WACE,OAAOM,KAAKkyC,SAASvjB,4CAMzBE,EA1BA,GAAavxB,EAAAuxB,iHCAb,IAAAmf,EAAA,WAGE,SAAAA,IACEhuC,KAAKkT,SAAW,GAkBpB,OAfS86B,EAAAtuC,UAAA4O,MAAP,WACEtO,KAAKkT,SAAW,IAGX86B,EAAAtuC,UAAAyyC,WAAP,SAAkBC,GAChBpyC,KAAKkT,SAAS8H,KAAKo3B,IAGdpE,EAAAtuC,UAAA2yC,cAAP,SAAqB3sC,GACnB1F,KAAKkT,SAAWlT,KAAKkT,SAASya,OAAO,SAAC9tB,GAAM,OAAAA,EAAE6F,MAAQA,KAGjDsoC,EAAAtuC,UAAA0uC,YAAP,WACE,OAAOpuC,KAAKkT,UAEhB86B,EAtBA,GAAa1wC,EAAA0wC,6HCDb,IAAA9lC,EAAAtK,EAAA,GACA00C,EAAA10C,EAAA,IAIAkxC,EAAA,WAaE,SAAAA,EAAoBnzB,GAApB,IAAA5S,EAAA/I,KAAoBA,KAAA2b,gBAXZ3b,KAAAuyC,aAAuBzD,EAAoB0D,qBAC3CxyC,KAAAyyC,kBAAoB,IAAIH,EAAAI,MA4BxB1yC,KAAA2yC,0BAA4B,SAACnhC,GACnC,IACEtJ,EAAAvG,OAAOvB,IAAI,2CAA2C8D,KAAKC,UAAUqN,EAAM0I,cAC3EnR,EAAK6pC,WAAWphC,EAAM0I,aACtB,MAAOjZ,GACPiH,EAAAvG,OAAOV,MAAM,2DAA4DA,KAtB3E0a,EAAclQ,QAAQ,SAAC0Q,GAAiB,OAAAA,EAAa9P,UAAUtD,EAAK4pC,6BA8BxE,OAvCEn0C,OAAAC,eAAWqwC,EAAApvC,UAAA,cAAW,KAAtB,WACE,OAAOM,KAAKuyC,8CAGd/zC,OAAAC,eAAWqwC,EAAApvC,UAAA,eAAY,KAAvB,WACE,OAAOM,KAAKyyC,kBAAkBI,uCAOzB/D,EAAApvC,UAAAid,UAAP,SAAiBnC,GACfxa,KAAKuyC,aAAe/3B,EACpBxa,KAAKyyC,kBAAkBK,MAAMt4B,IAGxBs0B,EAAApvC,UAAA4c,QAAP,eAAAvT,EAAA/I,KACEA,KAAK2b,cAAclQ,QAAQ,SAAC0Q,GAAiB,OAAAA,EAAaI,YAAYxT,EAAK4pC,6BAC3E3yC,KAAKyyC,kBAAkBn3B,SAGlBwzB,EAAApvC,UAAA4O,MAAP,WACEtO,KAAKyyC,kBAAkBn3B,SAYjBwzB,EAAApvC,UAAAkzC,WAAR,SAAmB14B,GACjBla,KAAKyyC,kBAAkBM,MAAM74B,GAC7Bla,KAAKyyC,kBAAkBK,MAAM9yC,KAAKuyC,eAzCrBzD,EAAA0D,qBAAuB,GA2CxC1D,EA5CA,GAAaxxC,EAAAwxC,oHCNb,IAAA4D,EAAA,oBAAAA,IACmB1yC,KAAAgzC,OAAc,GA2BjC,OAzBEx0C,OAAAC,eAAWi0C,EAAAhzC,UAAA,QAAK,KAAhB,WACE,OAAOM,KAAKgzC,wCAGdx0C,OAAAC,eAAWi0C,EAAAhzC,UAAA,SAAM,KAAjB,WACE,OAAOM,KAAKgzC,OAAOvyC,wCAGdiyC,EAAAhzC,UAAAqzC,MAAP,SAAatpB,GACXzpB,KAAKgzC,OAAOh4B,KAAKyO,IAGZipB,EAAAhzC,UAAAuzC,KAAP,WACE,OAAOjzC,KAAKgzC,OAAO53B,SAGds3B,EAAAhzC,UAAA4b,MAAP,WACEtb,KAAKgzC,OAAOjsC,OAAO,IAGd2rC,EAAAhzC,UAAAozC,MAAP,SAAaI,GACX,KAAOlzC,KAAKgzC,OAAOvyC,OAASyyC,GAC1BlzC,KAAKizC,QAGXP,EA5BA,GAAap1C,EAAAo1C,kHCEb,IAAAS,EAAAv1C,EAAA,IAEAgxC,EAAA,WAGE,SAAAA,EAAoBzhC,EAA2B0c,GAA/C,IAAA9gB,EAAA/I,KAAoBA,KAAAmN,SAA2BnN,KAAA6pB,qBAFxC7pB,KAAAm3B,YAAc,IAAIgc,EAAAC,YAMlBpzC,KAAA24B,iBAAmB,WACxB,OAAI5vB,EAAKoE,OAAOitB,KACNrxB,EAAKoE,OAAOitB,IAAYzB,qBAE3B,GAEF34B,KAAAk4B,aAAe,WAAM,OAAAnvB,EAAKoE,OAAO+qB,gBACjCl4B,KAAA27B,gBAAkB,WACvB,OAAI5yB,EAAKoE,OAAOitB,IACNrxB,EAAKoE,OAAOitB,IAAYiZ,gBAE3B,CAACh1C,UAAMqE,EAAWiE,aAASjE,IAE7B1C,KAAA4T,YAAc,WAAM,OAAA7K,EAAKoE,OAAO26B,kBAhBrC9nC,KAAK2mC,WA8DT,OA5CUiI,EAAAlvC,UAAAinC,SAAR,eAAA59B,EAAA/I,KACEA,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYK,KAAM,SAAC9tB,GACnC,oBAAbA,EAAE+tB,QACJzmC,EAAKouB,YAAYQ,OAAOlW,EAAE+tB,UAG9BxvC,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYQ,OAAQ,SAACjuB,GACrC,oBAAbA,EAAE+tB,QACJzmC,EAAKouB,YAAYS,QAAQnW,EAAE+tB,UAG/BxvC,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYkB,UAAW,SAAC5+B,GACzDzI,EAAKouB,YAAYC,YAAY5lB,KAE/BxR,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYmB,WAAY,SAAC7+B,GAC1DzI,EAAKouB,YAAYE,aAAa7lB,KAEhCxR,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYoE,eAAgB,SAAC9hC,GAC9DzI,EAAKouB,YAAYG,iBAAiB9lB,KAEpCxR,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYqE,gBAAiB,SAAC/hC,GAC/DzI,EAAKouB,YAAYI,kBAAkB/lB,KAErCxR,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYsE,UAAW,SAAChiC,GACzDzI,EAAKouB,YAAYK,YAAYhmB,KAE/BxR,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYvY,WAAY,SAACnlB,GAC1DzI,EAAKouB,YAAYY,aAAavmB,KAEhCxR,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYoB,UAAW,SAAC9+B,GACzDzI,EAAKouB,YAAYW,YAAYtmB,KAE/BxR,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYqB,QAAS,SAAC/+B,GACvDzI,EAAKouB,YAAYM,UAAUjmB,KAE7BxR,KAAKmN,OAAO28B,GAAG9pC,KAAKmN,OAAO7P,QAAQ4xC,YAAYuE,iBAAkB,SAACjiC,GAChEzI,EAAKouB,YAAYO,mBAAmBlmB,KAEtC,IAAMq4B,EAAkB,WACtB9gC,EAAKouB,YAAYU,kBAEnB73B,KAAK6pB,mBAAmBL,iBAAiB,eAAgBqgB,GACzD7pC,KAAK6pB,mBAAmBL,iBAAiB,SAAUqgB,IAEvD+E,EAlEA,GAAatxC,EAAAsxC,wHCJb,IAAAwE,EAAA,WAaA,OAbA,WACSpzC,KAAAo3B,YAAc,SAAC5lB,KACfxR,KAAAq3B,aAAe,SAAC7lB,KAChBxR,KAAAs3B,iBAAmB,SAAC9lB,KACpBxR,KAAAu3B,kBAAoB,SAAC/lB,KACrBxR,KAAAw3B,YAAc,SAAChmB,KACfxR,KAAAy3B,UAAY,SAACjmB,KACbxR,KAAA03B,mBAAqB,SAAClmB,KACtBxR,KAAA+3B,aAAe,SAACvmB,KAChBxR,KAAA83B,YAAc,SAACtmB,KACfxR,KAAA23B,OAAS,SAAC6X,KACVxvC,KAAA43B,QAAU,SAAC4X,KACXxvC,KAAA63B,eAAiB,cAZ1B,GAAav6B,EAAA81C,0ICCb,IAAA5qC,EAAA5K,EAAA,IACA81C,EAAA91C,EAAA,IAEAwb,EAAAxb,EAAA,GAEAuwC,EAAA,WAIE,SAAAA,EAAYhhC,GAAZ,IAAApE,EAAA/I,KAHQA,KAAA2zC,gBAAkB,IAAInrC,EAAAkB,gBAI5B1J,KAAK4zC,cAAgBzmC,EAAO7P,QAC5B6P,EAAO28B,GAAG9pC,KAAK4zC,cAAc1E,YAAYyB,iBAAkB,SAACn/B,GAC1D,OAAAzI,EAAK8qC,mBAAmBriC,KAmE9B,OA/DS28B,EAAAzuC,UAAA2M,UAAP,SAAiB4e,GACf,OAAOjrB,KAAK2zC,gBAAgBtnC,UAAU4e,IAGjCkjB,EAAAzuC,UAAA6c,YAAP,SAAmB0O,GACjBjrB,KAAK2zC,gBAAgBp3B,YAAY0O,IAG3BkjB,EAAAzuC,UAAAm0C,mBAAR,SAA2BriC,aACzBxR,KAAK2zC,gBAAgB7gC,SAAS,CAC5BoH,YAAa,CACX2iB,aAA6D,QAAjD7wB,EAAEoN,EAAA5W,2BAA2BgP,aAAK,EAALA,EAAOqrB,qBAAa,IAAA7wB,IAAI,EACjE2iB,WAA6B,QAAnB5U,EAAEvI,aAAK,EAALA,EAAOmd,kBAAU,IAAA5U,IAAI,EACjClQ,QAAuB,QAAhBiqC,EAAEtiC,aAAK,EAALA,EAAO3H,eAAO,IAAAiqC,KACvB5wC,UAAWkW,EAAAtW,sBACX4C,IAAK8L,aAAK,EAALA,EAAO9L,IACZuP,KAAMzD,aAAK,EAALA,EAAOyD,KACbgb,gBAAiB7W,EAAA5W,2BAA2BgP,aAAK,EAALA,EAAOye,iBACnDgJ,KAAMj5B,KAAK+zC,mBAAmBviC,aAAK,EAALA,EAAOk4B,kBAKnCyE,EAAAzuC,UAAAq0C,mBAAR,SAA2BrK,GACzB,OAAQA,GACN,KAAK1pC,KAAK4zC,cAAcI,gBAAgBC,cACtC,OAAOP,EAAAM,gBAAgBC,cACzB,KAAKj0C,KAAK4zC,cAAcI,gBAAgBE,oBACtC,OAAOR,EAAAM,gBAAgBE,oBACzB,KAAKl0C,KAAK4zC,cAAcI,gBAAgBG,qBACtC,OAAOT,EAAAM,gBAAgBG,qBACzB,KAAKn0C,KAAK4zC,cAAcI,gBAAgBI,gBACtC,OAAOV,EAAAM,gBAAgBI,gBACzB,KAAKp0C,KAAK4zC,cAAcI,gBAAgBK,aACtC,OAAOX,EAAAM,gBAAgBK,aACzB,KAAKr0C,KAAK4zC,cAAcI,gBAAgBM,YACtC,OAAOZ,EAAAM,gBAAgBM,YACzB,KAAKt0C,KAAK4zC,cAAcI,gBAAgBO,YACtC,OAAOb,EAAAM,gBAAgBO,YACzB,KAAKv0C,KAAK4zC,cAAcI,gBAAgBQ,gBACtC,OAAOd,EAAAM,gBAAgBQ,gBACzB,KAAKx0C,KAAK4zC,cAAcI,gBAAgBS,iBACtC,OAAOf,EAAAM,gBAAgBS,iBACzB,KAAKz0C,KAAK4zC,cAAcI,gBAAgBU,qBACtC,OAAOhB,EAAAM,gBAAgBU,qBACzB,KAAK10C,KAAK4zC,cAAcI,gBAAgBW,sBACtC,OAAOjB,EAAAM,gBAAgBW,sBACzB,KAAK30C,KAAK4zC,cAAcI,gBAAgBY,qBACtC,OAAOlB,EAAAM,gBAAgBY,qBACzB,KAAK50C,KAAK4zC,cAAcI,gBAAgBa,sBACtC,OAAOnB,EAAAM,gBAAgBa,sBACzB,KAAK70C,KAAK4zC,cAAcI,gBAAgBc,qBACtC,OAAOpB,EAAAM,gBAAgBc,qBACzB,KAAK90C,KAAK4zC,cAAcI,gBAAgBe,yBACtC,OAAOrB,EAAAM,gBAAgBe,yBACzB,KAAK/0C,KAAK4zC,cAAcI,gBAAgBgB,YACtC,OAAOtB,EAAAM,gBAAgBgB,YACzB,KAAKh1C,KAAK4zC,cAAcI,gBAAgBiB,UACtC,OAAOvB,EAAAM,gBAAgBiB,UACzB,QACE,OAAOvB,EAAAM,gBAAgBvuB,UAG/B0oB,EA1EA,GAAa7wC,EAAA6wC,8ICNb,SAAY6F,GACVA,EAAA,4CACAA,EAAA,sBACAA,EAAA,oCACAA,EAAA,0BACAA,EAAA,0BACAA,EAAA,sCACAA,EAAA,kCACAA,EAAA,8BACAA,EAAA,4BACAA,EAAA,0CACAA,EAAA,gEACAA,EAAA,kCACAA,EAAA,oBACAA,EAAA,0BACAA,EAAA,kBACAA,EAAA,sBACAA,EAAA,oDACAA,EAAA,4CACAA,EAAA,8CACAA,EAAA,4CACAA,EAAA,8CACAA,EAAA,4BAtBF,CAAY12C,EAAA02C,kBAAA12C,EAAA02C,gBAAe,4HCG3B,IAAA5rC,EAAAxK,EAAA,GAyBAmwC,EAAA,WAGE,SAAAA,EAAY5gC,EAAmB2gC,GAA/B,IAAA/kC,EAAA/I,KAuBOA,KAAAk1C,2BAA6B,SAAC1jC,GACnCzI,EAAK+kC,eAAeuE,cAAc7gC,EAAM9L,MAvBxC1F,KAAK8tC,eAAiBA,EAEtB3gC,EAAO28B,GAAG38B,EAAO7P,QAAQ4xC,YAAYyB,iBAAkB,SAACn/B,GAAU,OAAAzI,EAAKosC,4BAA4B3jC,KACnGrE,EAAO28B,GAAG38B,EAAO7P,QAAQ4xC,YAAYkG,gBAAiB,SAAC5jC,GAAU,OAAAzI,EAAKmsC,2BAA2B1jC,KAsBrG,OAnBSu8B,EAAAruC,UAAAuuC,kBAAP,WACE,OAAOjuC,KAAK8tC,gBAGPC,EAAAruC,UAAAy1C,4BAAP,SAAmC3jC,GACjC,GAAkD,IAA9CA,EAAMk4B,aAAa5lC,QAAQ,eAAsB,CACnD,IAAM4B,EAAM8L,EAAM9L,IACZ0sC,EAAuB,CAC3B/zC,KAAM+J,EAAMpB,mBAAmBtB,GAC/BA,IAAGA,EACHxC,UAAWsO,EAAMtO,WAEnBlD,KAAK8tC,eAAeqE,WAAWC,KAOrCrE,EA7BA,GAAazwC,EAAAywC,oJCzBb,IAAAH,EAAA,WAGE,SAAAA,EAAYzgC,EAAmBkoC,GAA/B,IAAAtsC,EAAA/I,KACEA,KAAKq1C,MAAQA,EACbloC,EAAO28B,GAAG38B,EAAO7P,QAAQ4xC,YAAYyB,iBAAkB,SAACn/B,GAAU,OAAAzI,EAAKosC,4BAA4B3jC,KAqBvG,OAlBSo8B,EAAAluC,UAAAmuC,sBAAP,WACE,OAAO7tC,KAAKq1C,OAGPzH,EAAAluC,UAAAy1C,4BAAP,SAAmC3jC,GAC5BA,EAAM3H,SAGuC,IAA9C2H,EAAMk4B,aAAa5lC,QAAQ,gBAC7B9D,KAAKq1C,MAAM5mB,eAAe,CACxBpf,SAAUmC,EAAMqrB,aAChB5nB,KAAMzD,EAAMyD,KACZgb,gBAAiBze,EAAMye,gBACvB/sB,UAAW,IAAIH,KACf4rB,WAAYnd,EAAMmd,cAI1Bif,EA1BA,GAAatwC,EAAAswC,kdCFb,IAAA1Y,EAAAt3B,EAAA,GAGAsK,EAAAtK,EAAA,GACAu3B,EAAAv3B,EAAA,GACA03C,EAAA13C,EAAA,IAEAg2B,EAAA,SAAAnY,GACE,SAAAmY,EAAYhrB,EAAyBuE,EAAawQ,GAAlD,IAAA5U,EACE0S,EAAAxd,KAAA+B,OAAOA,KACP,OAAI+I,EAAKyP,8BAA8BrL,IACrCjF,EAAAvG,OAAOX,mBAAmB,uEAG5B+H,EAAK2P,8BAA8BvL,GACnCpE,EAAKwP,gBAAkB,IAAI+8B,EAAAC,qBAAqBpoC,EAAQwQ,GACxD5U,EAAKuP,UAAY,IAAI4c,EAAAvsB,UAAUC,EAAQG,EAAKwP,oBAEhD,OAXkC6D,EAAAwX,EAAAnY,GAWlCmY,EAXA,CAAkCuB,EAAA/c,SAArB9a,EAAAs2B,4cCRb,IAAAhO,EAAAhoB,EAAA,IAEA2f,EAAA3f,EAAA,GACAmoB,EAAAnoB,EAAA,GACAyoC,EAAAzoC,EAAA,GACA0oC,EAAA1oC,EAAA,GAUA23C,EAAA,SAAA95B,GAQE,SAAA85B,EAAsBC,EAAc73B,GAApC,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAM2d,IAAK3d,YADS+I,EAAAysC,UAsBfzsC,EAAAqE,cAAgB,WAAM,OAAA2Y,EAAAne,OAAO6tC,kBAC7B1sC,EAAAwE,cAAgB,WAAM,eACtBxE,EAAAkH,YAAc,WAAM,SAAClH,EAAK2sC,cAAe3sC,EAAK2sC,YAAYtsC,WAAWL,EAAK2sC,YAAYtsC,UACtFL,EAAAoH,sBAAwB,WAAsC,OAAApH,EAAKgV,oBAvBxEhV,EAAKyV,aAAe,IAAIoH,EAAA8E,2BAA2B3hB,EAAKoG,sBAAuBpG,EAAK4U,MACpF5U,EAAK4sC,cAAgBH,EAAQI,mBAC7B7sC,EAAK8d,WAAY,IAgJrB,OA5J0CzK,EAAAm5B,EAAA95B,GAejC85B,EAAA71C,UAAAiN,WAAP,SAAkB2L,GAQhB,OAPAtY,KAAK2mC,WAOE,CANqB,IAAIL,EAAA9qB,oBAC9BlD,EAAU1M,oCACV,IAAIy6B,EAAAhtB,mBAAmBf,EAAU1M,oCAAoCK,iBACrE,CAACqM,EAAUsuB,8BACXlkC,KAKG6yC,EAAA71C,UAAA2N,iBAAP,WACE,OAAQ3P,OAAem4C,MAASn4C,OAAem4C,KAAKC,UAAap4C,OAAem4C,KAAKC,UAAU7oC,QAAU,WAQpGsoC,EAAA71C,UAAA4K,aAAP,SAAoB1B,EAAa1F,GAC/BlD,KAAKwe,aAAalU,aAAa1B,EAAQ1F,EAAWlD,KAAK21C,cAAcI,sBAGhER,EAAA71C,UAAAqV,uBAAP,WACE,IAAMihC,EAASh2C,KAAK21C,cAAsBM,WAc1C,MAZ2B,CACzB5rC,OAAQrK,KAAKk2C,iBAAwD,SAArCl2C,KAAKk2C,iBAAiBC,gBAAwBzzC,EAC9E4K,WAAYtN,KAAKuN,gBACjB2H,cAAelV,KAAKk2C,iBAAmBl2C,KAAKk2C,iBAAiB7mC,cAAW3M,EACxE4R,oBAAqB0hC,EAAM3hC,OAC3BD,mBAAoB4hC,EAAM7hC,MAC1BS,WAAY5U,KAAKo2C,iBAAmBp2C,KAAKo2C,iBAAiBC,sBAAmB3zC,EAC7EmT,cAAe7V,KAAKo2C,iBAAmBp2C,KAAKo2C,iBAAiBvoC,cAAWnL,EACxEqT,iBAAkB/V,KAAKs2C,iBAAmBt2C,KAAKs2C,iBAAiBnjC,IAAI,SAACnU,GAAM,OAAAA,EAAE6O,WAAUpM,KAAK,UAAOiB,EACnGsT,cAAe,IAMZu/B,EAAA71C,UAAAinC,SAAP,eAAA59B,EAAA/I,KACEA,KAAK21C,cAAcnsB,iBAAiB,iBAAkB,SAAChY,GACrDzI,EAAKsV,cAAcd,EAAA5V,MAAMgjB,MAAO,MAGlC3qB,KAAK21C,cAAcnsB,iBAAiB,uBAAwB,SAAChY,GAC3D,IAAM+kC,EAAqBxtC,EAAK4sC,cAAca,wBAC9CztC,EAAKqtC,iBAAmBG,EAAmBE,iBAG3C,IAAMC,EAAoB3tC,EAAK4sC,cAAcgB,uBAC7C5tC,EAAKutC,iBAAmBI,EAAkBE,kBAE1C,IAAMC,EAAe9tC,EAAK4sC,cAAcmB,kBACxC/tC,EAAK2sC,YAAcmB,EAAaE,iBAEhChuC,EAAKmtC,iBAAmB1kC,EAAMwlC,MAE9BjuC,EAAKsV,cAAcd,EAAA5V,MAAM4gB,MAAO,MAGlCvoB,KAAK21C,cAAcnsB,iBAAiB,OAAQ,SAAChY,GAC3CzI,EAAKsV,cAAcd,EAAA5V,MAAMghB,KAAM,CAC7B/U,YAAapC,EAAMylC,qBAIvBj3C,KAAK21C,cAAcnsB,iBAAiB,QAAS,SAAChY,GAC5CzI,EAAK6f,SAAS7f,EAAK4sC,cAAcI,uBAGnC/1C,KAAK21C,cAAcnsB,iBAAiB,QAAS,SAAChY,GAC5C,IAAMuB,EAA2B,MAAfvB,EAAMvQ,MAAgBuQ,EAAMvQ,WAAQyB,EACtDqG,EAAKsV,cAAcd,EAAA5V,MAAMod,MAAO,CAC9BnR,YAAa7K,EAAK4sC,cAAcI,oBAChCpjC,KAAMnB,EAAM0lC,kBACZrkC,QAASrB,EAAMiB,OACfO,WAAYD,EACZO,KAAM,CAACgH,eAAgBpW,KAAKC,UAAU4O,QAI1C/S,KAAK21C,cAAcnsB,iBAAiB,UAAW,SAAChY,GAC9CzI,EAAK8d,WAAY,EACjB9d,EAAK6f,SAASpX,EAAMylC,kBACpBluC,EAAKsV,cAAcd,EAAA5V,MAAMqhB,KAAM,CAC7BpV,YAAapC,EAAMylC,qBAIvBj3C,KAAK21C,cAAcnsB,iBAAiB,SAAU,SAAChY,GAC7CzI,EAAK8d,WAAY,EACjB9d,EAAKsV,cAAcd,EAAA5V,MAAMshB,OAAQ,CAC/BrV,YAAapC,EAAMylC,qBAQvBj3C,KAAK21C,cAAcnsB,iBAAiB,UAAW,SAAChY,MAEhDxR,KAAK21C,cAAcnsB,iBAAiB,YAAa,SAAChY,IAC3CzI,EAAK8d,WAAarV,EAAMkV,aAC3B3d,EAAKsV,cAAcd,EAAA5V,MAAMgiB,gBAAiB,CACxC/V,YAAa7K,EAAK6K,gBAKxB5T,KAAK21C,cAAcnsB,iBAAiB,cAAe,SAAChY,GAC7CzI,EAAK8d,WACR9d,EAAKsV,cAAcd,EAAA5V,MAAMuhB,YAAa,CACpCtV,YAAapC,EAAMylC,qBAKzBj3C,KAAK21C,cAAcnsB,iBAAiB,eAAgB,SAAChY,GAG/CzI,EAAK2sC,aACP3sC,EAAKsV,cAAcd,EAAA5V,MAAM0qB,oBAAqB,CAC5Cze,YAAa7K,EAAK4sC,cAAcI,yBAMjCR,EAAA71C,UAAAkpB,SAAP,SAAgBhV,GACd5T,KAAKqe,cAAcd,EAAA5V,MAAMiiB,MAAO,CAC9BhW,YAAWA,KAIfpV,OAAAC,eAAc82C,EAAA71C,UAAA,cAAW,KAAzB,WACE,OAAOM,KAAK21C,cAAcI,qDAE9BR,EA5JA,CAHA33C,EAAA,IAG0C8f,iBAA7BpgB,EAAAi4C,6cCdb,IAAArgB,EAAAt3B,EAAA,GAGAsK,EAAAtK,EAAA,GACAu3B,EAAAv3B,EAAA,GACAu5C,EAAAv5C,EAAA,IAEAk2B,EAAA,SAAArY,GACE,SAAAqY,EAAYlrB,EAAyBuE,EAAawQ,GAAlD,IAAA5U,EACE0S,EAAAxd,KAAA+B,OAAOA,KACP,OAAI+I,EAAKyP,8BAA8BrL,IACrCjF,EAAAvG,OAAOX,mBAAmB,uEAG5B+H,EAAK2P,8BAA8BvL,GACnCpE,EAAKwP,gBAAkB,IAAI4+B,EAAAC,sBAAsBjqC,EAAQwQ,GACzD5U,EAAKuP,UAAY,IAAI4c,EAAAvsB,UAAUC,EAAQG,EAAKwP,oBAEhD,OAXmC6D,EAAA0X,EAAArY,GAWnCqY,EAXA,CAAmCqB,EAAA/c,SAAtB9a,EAAAw2B,8cCPb,IAAAvW,EAAA3f,EAAA,GACAkoB,EAAAloB,EAAA,GACAmoB,EAAAnoB,EAAA,GACAyoC,EAAAzoC,EAAA,GACA0oC,EAAA1oC,EAAA,GASAw5C,EAAA,SAAA37B,GACE,SAAA27B,EAAoBC,EAAkB15B,GAAtC,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAM,KAAM2d,IAAK3d,YADC+I,EAAAsuC,cA0DbtuC,EAAAqE,cAAgB,WAAM,OAAA2Y,EAAAne,OAAO0vC,QAC7BvuC,EAAAsE,iBAAmB,WAAM,OAAAtE,EAAKsuC,YAAYE,gBA+CnD,OA3G2Cn7B,EAAAg7B,EAAA37B,GAQlC27B,EAAA13C,UAAAiN,WAAP,SAAkB2L,GAAlB,IAAAvP,EAAA/I,KACEyb,EAAA/b,UAAMiN,WAAU1O,KAAA+B,KAACsY,GACjB,IAAIk/B,EAAmC,KACnCC,GAAU,EACd,IACED,EAAUx3C,KAAKq3C,YAAYK,kBAC3B,MAAOj2B,IA0BT,OAxBK+1B,GAeHx3C,KAAKonB,gBAAgBowB,GACrBx3C,KAAK23C,uCAfL33C,KAAKq3C,YAAYvN,GACf,UACA,WACM2N,IAGJD,EAAUzuC,EAAKsuC,YAAYK,kBAC3BD,GAAU,EACV1uC,EAAKqe,gBAAgBowB,GACrBzuC,EAAK4uC,wCAEP33C,MAYG,CANqB,IAAIsmC,EAAA9qB,oBAC9BlD,EAAU1M,oCACV,IAAIy6B,EAAAhtB,mBAAmBf,EAAU1M,oCAAoCK,iBACrE,CAACqM,EAAUsuB,8BACXlkC,KAKG00C,EAAA13C,UAAAi4C,oCAAP,eAAA5uC,EAAA/I,KACQkmB,EAAelmB,KAAKkmB,aAErBA,GAILlmB,KAAKsoB,0BAA0B,UAAW,WACjC,IAAA1U,EAAesS,EAAYtS,YAClC7K,EAAKke,sBAAuB,EAC5Ble,EAAKsV,cAAcd,EAAA5V,MAAMuhB,YAAa,CACpCtV,YAAWA,OAWVwjC,EAAA13C,UAAAsoB,YAAP,WACE,OAAOlC,EAAA1I,UAAUD,MAKZi6B,EAAA13C,UAAA8nB,aAAP,WACE,GAAKxnB,KAAKq3C,YAAV,CAIA,IAAMrN,EAAShqC,KAAKq3C,YAAYrI,YAChC,OAAIhF,EACKA,EAAO3mC,gBADhB,IAUK+zC,EAAA13C,UAAAkoB,2BAAP,WACE,IAAK5nB,KAAKq3C,YACR,OAAO,KAGT,IAEMO,EAFuB53C,KAAKq3C,YAAYQ,sBAAsB,SACnC73C,KAAKq3C,YAAYS,cAAc,UAGhE,OAA2B,MAAvBF,EACK,KAIF,CACLzjC,MAF+ByjC,EAAmBzjC,MAGlDE,OAH+BujC,EAAmBvjC,OAIlDE,QAJ+BqjC,EAAmBrjC,UAOxD6iC,EA3GA,CAHAx5C,EAAA,IAG2CqoB,sBAA9B3oB,EAAA85C,2cCbb,IAAAliB,EAAAt3B,EAAA,GAGAsK,EAAAtK,EAAA,GACAu3B,EAAAv3B,EAAA,GACAm6C,EAAAn6C,EAAA,IAEAo2B,EAAA,SAAAvY,GACE,SAAAuY,EAAYprB,EAAyBuE,EAAawQ,GAAlD,IAAA5U,EACE0S,EAAAxd,KAAA+B,OAAOA,KACP,OAAI+I,EAAKyP,8BAA8BrL,IACrCjF,EAAAvG,OAAOX,mBAAmB,uEAG5B+H,EAAK2P,8BAA8BvL,GACnCpE,EAAKwP,gBAAkB,IAAIw/B,EAAAC,mBAAmB7qC,EAAQwQ,GACtD5U,EAAKuP,UAAY,IAAI4c,EAAAvsB,UAAUC,EAAQG,EAAKwP,oBAEhD,OAXgC6D,EAAA4X,EAAAvY,GAWhCuY,EAXA,CAAgCmB,EAAA/c,SAAnB9a,EAAA02B,4qBCPb,IAAAiZ,EAAArvC,EAAA,IACA2f,EAAA3f,EAAA,GACAkoB,EAAAloB,EAAA,GACAmoB,EAAAnoB,EAAA,GACAyoC,EAAAzoC,EAAA,GACA0oC,EAAA1oC,EAAA,GASAq6C,EAAAr6C,EAAA,IAIAo6C,EAAA,SAAAv8B,GAOE,SAAAu8B,EAAoB9N,EAAUvsB,GAA9B,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAM,KAAM2d,IAAK3d,YADC+I,EAAAmhC,MAsBbnhC,EAAAqE,cAAgB,WAAM,OAAA2Y,EAAAne,OAAOswC,OAC7BnvC,EAAAsE,iBAAmB,WAAM,OAACtE,EAAKmhC,IAAYnU,YAAYpvB,SAyBvDoC,EAAAsB,OAAS,WACd,IAAM6/B,EAAMnhC,EAAKmhC,IACjB,IAAKA,EAAIiO,SAAWjO,EAAIkO,aACtB,OAAO,EAET,GAAIlO,EAAIkO,aAAe,EACrB,OAAO,EAET,IAAMC,EAAkBnO,EAAIiO,OAAOjO,EAAIkO,cACvC,QAAKC,GAGEA,EAAgBC,QAAQC,MA1D/BxvC,EAAKsf,aACLtf,EAAK4kC,WAAa,IAAIsK,EAAAO,qBAAqBtO,EAAK,IAAI+C,EAAA1e,oBAAsBsf,0BA4N9E,OAtOwCzxB,EAAA47B,EAAAv8B,GACtCjd,OAAAC,eAAIu5C,EAAAt4C,UAAA,oBAAiB,KAArB,WACE,OAAOM,KAAK2tC,WAAWze,2CAWlB8oB,EAAAt4C,UAAAiN,WAAP,SAAkB2L,GAShB,OARAmD,EAAA/b,UAAMiN,WAAU1O,KAAA+B,KAACsY,GACjBtY,KAAKy4C,oBAOE,CANqB,IAAInS,EAAA9qB,oBAC9BlD,EAAU1M,oCACV,IAAIy6B,EAAAhtB,mBAAmBf,EAAU1M,oCAAoCK,iBACrE,CAACqM,EAAUsuB,8BACXlkC,KAKGs1C,EAAAt4C,UAAAsR,YAAP,WACEhR,KAAK2tC,WAAWr/B,SAMX0pC,EAAAt4C,UAAAkoB,2BAAP,WACE,IAAK5nB,KAAKkqC,IAAIiO,OACZ,OAAO,KAET,IAAME,EAAkBr4C,KAAKkqC,IAAIiO,OAAOn4C,KAAKkqC,IAAIkO,cACjD,OAAKC,EAQE,CACL9jC,QALc8jC,EAAgB9jC,QAM9BJ,MALYkkC,EAAgBlkC,MAM5BE,OALagkC,EAAgBhkC,QALtB,MAmCJ2jC,EAAAt4C,UAAAsoB,YAAP,WACE,OAAOlC,EAAA1I,UAAUF,KAMZ86B,EAAAt4C,UAAA8nB,aAAP,WACE,OAAQxnB,KAAKkqC,IAAYxkC,KAGpBsyC,EAAAt4C,UAAA+4C,kBAAP,WACE,IAAMvO,EAAMlqC,KAAKkqC,IAEjBA,EAAIJ,GAAGI,EAAInU,YAAY2iB,OAAOC,gBAAiB34C,KAAK44C,iBAAiBt5C,KAAKU,OAC1EkqC,EAAIJ,GAAGI,EAAInU,YAAY2iB,OAAOG,gBAAiB74C,KAAK84C,iBAAiBx5C,KAAKU,OAC1EkqC,EAAIJ,GAAGI,EAAInU,YAAY2iB,OAAOK,iBAAkB/4C,KAAKg5C,kBAAkB15C,KAAKU,OAC5EkqC,EAAIJ,GAAGI,EAAInU,YAAY2iB,OAAOO,qBAAsBj5C,KAAKk5C,qBAAqB55C,KAAKU,OACnFkqC,EAAIJ,GAAGI,EAAInU,YAAY2iB,OAAOS,sBAAuBn5C,KAAKo5C,2BAA2B95C,KAAKU,OAC1FkqC,EAAIJ,GAAGI,EAAInU,YAAY2iB,OAAOW,WAAYr5C,KAAKyO,QAAQnP,KAAKU,OAC5DkqC,EAAIJ,GAAGI,EAAInU,YAAY2iB,OAAO3zB,MAAO/kB,KAAKs5C,WAAWh6C,KAAKU,OAOtDkqC,EAAI8M,QACNh3C,KAAK44C,mBACL54C,KAAKg5C,sBAIFhB,EAAAt4C,UAAAk5C,iBAAP,WAGM54C,KAAKkmB,eAITlmB,KAAKkmB,aAAelmB,KAAKkqC,IAAI8M,MAE7Bh3C,KAAK8nB,uBACL9nB,KAAK+nB,iBAGAiwB,EAAAt4C,UAAAo5C,iBAAP,WACE94C,KAAK6nB,0BAGAmwB,EAAAt4C,UAAAs5C,kBAAP,WACEh5C,KAAK+nB,gBAGAiwB,EAAAt4C,UAAAqV,uBAAP,WACE,IAAMwkC,EAAmBv5C,KAAKw5C,8BAS9B,OAPU9uC,IAAA,GACL+Q,EAAA/b,UAAMqV,uBAAsB9W,KAAA+B,OAAE,CACjC6V,cAAe7V,KAAKy5C,2BACpB3jC,gBAAqC,MAApByjC,EAA2BA,EAAiBriC,aAAUxU,EACvEqT,iBAAsC,MAApBwjC,EAA2BA,EAAiB1rC,cAAWnL,KAUtEs1C,EAAAt4C,UAAA45C,WAAP,SAAkBI,EAAW3mC,GAE3B,IADgBA,GAAYA,EAAU4mC,MACzB,CACX,IAAMzzB,EAAelmB,KAAKkmB,aACtBtS,OAAW,EACK,MAAhBsS,IACFtS,EAAcsS,EAAatS,aAG7B,IAAMhB,EAA4B,MAAbG,EAAuBA,EAAUkmB,KAAI,KAAKlmB,EAAUulC,aAAY51C,EACrF1C,KAAKqe,cAAcd,EAAA5V,MAAMod,MAAO,CAC9BnR,YAAWA,EACXjB,KAAM3S,KAAK45C,6BAA6B7mC,EAAUkmB,MAClDpmB,QAASD,EACTU,KAAM,OAKL0kC,EAAAt4C,UAAAw5C,qBAAP,SAA4B1nC,EAAe8B,GACzC,IACIM,EADEsS,EAAelmB,KAAKkmB,aAEN,MAAhBA,IACFtS,EAAcsS,EAAatS,aAG7B5T,KAAKqe,cAAcd,EAAA5V,MAAM4pB,mBAAoB,CAC3C3d,YAAWA,KAIRokC,EAAAt4C,UAAA05C,2BAAP,SAAkC5nC,EAAe8B,GAC/C,IACIM,EADEsS,EAAelmB,KAAKkmB,aAEN,MAAhBA,IACFtS,EAAcsS,EAAatS,aAG7B5T,KAAKqe,cAAcd,EAAA5V,MAAM0pB,gBAAiB,CACxCzd,YAAWA,KAQPokC,EAAAt4C,UAAAk6C,6BAAR,SAAqC3gB,GACnC,OAAQA,GACN,IAAK,eACH,OAAO,EACT,IAAK,aACH,OAAO,EACT,IAAK,iBACH,OAAO,EACT,IAAK,WACH,OAAO,EAET,QACE,OAAO,IAIL+e,EAAAt4C,UAAA+5C,yBAAR,WACE,KAA2B,MAAvBz5C,KAAKkqC,IAAI2P,YAAsB75C,KAAKkqC,IAAI2P,WAAa,GAGzD,OAAQ75C,KAAKkqC,IAAI4P,YAAY95C,KAAKkqC,IAAI2P,YAAoB1S,MAGpD6Q,EAAAt4C,UAAA85C,4BAAR,WAEE,GAAgC,MAA5Bx5C,KAAKkqC,IAAI6P,gBAAyB,CACpC,IAAMtvB,EAAsBzqB,KAAKkqC,IAAI8P,eAAiB,IAAkC,IAA7Bh6C,KAAKkqC,IAAI6P,gBACpE,MAAO,CACL7iC,QAASuT,EACT5c,SAAU4c,EAAsBzqB,KAAKkqC,IAAI+P,eAAej6C,KAAKkqC,IAAI8P,eAAe7S,UAAOzkC,GAGlF,IAAAw3C,EAA2Bl6C,KAAKkqC,IAAUgQ,wBACjD,GAA+B,MAA3BA,GAAoE,MAAjCA,EAAwBlD,MAC7D,OAAOh3C,KAAKqqB,oCAAoC6vB,EAAwBlD,QAKhFgB,EAtOA,CAHAp6C,EAAA,IAGwCqoB,sBAA3B3oB,EAAA06C,kICjBb,IAAAQ,EAAA,WAGE,SAAAA,EAAYtO,EAAUmL,GAAtB,IAAAtsC,EAAA/I,KACEA,KAAKq1C,MAAQA,EACbnL,EAAIJ,GAAGI,EAAInU,YAAY2iB,OAAOyB,YAAa,SAAC1pB,EAAWnd,GAAS,OAAAvK,EAAKqxC,0BAA0B9mC,KAoBnG,OAjBSklC,EAAA94C,UAAAmuC,sBAAP,WACE,OAAO7tC,KAAKq1C,OAGPmD,EAAA94C,UAAA06C,0BAAP,SAAiC9mC,GACR,SAAnBA,EAAK+mC,KAAKphB,MAIdj5B,KAAKq1C,MAAM5mB,eAAe,CACxBpf,UAAWiE,EAAK0iC,MAAMsE,MAAQhnC,EAAK0iC,MAAMuE,UAAY,IACrDtlC,KAAM3B,EAAK0iC,MAAMwE,MACjBvqB,iBAAkB3c,EAAK0iC,MAAMyE,OAASnnC,EAAK0iC,MAAMuE,UAAY,IAC7Dr3C,UAAW,IAAIH,KACf4rB,WAAYrb,EAAKonC,eAAe9W,UAGtC4U,EAzBA,GAAal7C,EAAAk7C,udCDb,IAAAtjB,EAAAt3B,EAAA,GAGAsK,EAAAtK,EAAA,GACAu3B,EAAAv3B,EAAA,GACA+8C,EAAA/8C,EAAA,IAEAs2B,EAAA,SAAAzY,GACE,SAAAyY,EAAYtrB,EAAyBuE,EAA0BwQ,GAA/D,IAAA5U,EACE0S,EAAAxd,KAAA+B,OAAOA,KACP,OAAI+I,EAAKyP,8BAA8BrL,IACrCjF,EAAAvG,OAAOX,mBAAmB,uEAG5B+H,EAAK2P,8BAA8BvL,GACnCpE,EAAKwP,gBAAkB,IAAIoiC,EAAAC,gCAAgCztC,EAAQwQ,GACnE5U,EAAKuP,UAAY,IAAI4c,EAAAvsB,UAAUC,EAAQG,EAAKwP,oBAEhD,OAX6C6D,EAAA8X,EAAAzY,GAW7CyY,EAXA,CAA6CiB,EAAA/c,SAAhC9a,EAAA42B,keCRb,IAAAnO,EAAAnoB,EAAA,GAGAwb,EAAAxb,EAAA,GAIAg9C,EAAA,SAAAn/B,GACE,SAAAm/B,EAAY10B,EAAgCvI,GAA5C,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAMkmB,EAAcvI,IAAK3d,YAGpB+I,EAAAqE,cAAgB,WAAM,OAAA2Y,EAAAne,OAAOye,OAC7Btd,EAAAsE,iBAAmB,WACxB,IAAMwtC,EAAczhC,EAAAjT,iBACpB,OAAU00C,EAAYx8C,KAAI,IAAIw8C,EAAYl0C,WAsB9C,OA9BqDyV,EAAAw+B,EAAAn/B,GAa5Cm/B,EAAAl7C,UAAA8nB,aAAP,WACE,OAAOxnB,KAAKkmB,aAAelmB,KAAKkmB,aAAa40B,gBAAap4C,GASrDk4C,EAAAl7C,UAAAkoB,2BAAP,WACE,MAAO,CACLrT,aAAS7R,EACTyR,MAAOnU,KAAKkmB,aAAelmB,KAAKkmB,aAAa60B,gBAAar4C,EAC1D2R,OAAQrU,KAAKkmB,aAAelmB,KAAKkmB,aAAa80B,iBAAct4C,IAGlEk4C,EA9BA,CAHAh9C,EAAA,IAGqDqoB,sBAAxC3oB,EAAAs9C,80DCNb,IAAA1lB,EAAAt3B,EAAA,GACA2f,EAAA3f,EAAA,GAGAsK,EAAAtK,EAAA,GACAu3B,EAAAv3B,EAAA,GACAq9C,EAAAr9C,EAAA,IAEAw2B,EAAA,SAAA3Y,GACE,SAAA2Y,EAAYxrB,EAAyBuE,EAAawQ,GAAlD,IAAA5U,EACE0S,EAAAxd,KAAA+B,OAAOA,KACP,OAAI+I,EAAKyP,8BAA8BrL,IACrCjF,EAAAvG,OAAOX,mBAAmB,uEAG5B+H,EAAK2P,8BAA8BvL,GACnCpE,EAAKwP,gBAAkB,IAAI0iC,EAAAC,qBAAqB/tC,EAAQwQ,GACxD5U,EAAKuP,UAAY,IAAI4c,EAAAvsB,UAAUC,EAAQG,EAAKwP,iBAC5CxP,EAAK2sB,eAAevoB,MA6BxB,OAvCkCiP,EAAAgY,EAAA3Y,GAiBxB2Y,EAAA10B,UAAAg2B,eAAR,SAAuBvoB,GAAvB,IAAApE,EAAA/I,KACQ21B,EAAexoB,EAAOyoB,KAE5BzoB,EAAOyoB,KAAO,eAAC,IAAAzuB,EAAA,GAAA5G,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,IAAA4G,EAAA5G,GAAAC,UAAAD,GACb,OAAO,IAAIq0B,QAAQ,SAAOC,EAASsmB,GAAM,OAAAC,EAAAryC,OAAA,6EAErC,gCAAM4sB,EAAah1B,MAAMwM,EAAQhG,kBAAjC4S,EAAAshC,sCAECr7C,KAAKuY,gBAAyC8F,cAAcd,EAAA5V,MAAMod,MAAO,CACxEnR,YAAa,EAEbjB,KAAiB,QAAb3G,EAAEsvC,aAAK,EAALA,EAAO3oC,YAAI,IAAA3G,SAAItJ,EACrBmQ,QAAS3O,KAAKC,UAAU,CAACo3C,SAAUD,aAAK,EAALA,EAAOC,SAAUC,SAAUF,aAAK,EAALA,EAAOE,WACrEloC,KAAM,CAACgH,eAAgBpW,KAAKC,UAAUm3C,aAAK,EAALA,EAAOhoC,SAG/C6nC,EAAOG,uBAETzmB,iBAIRT,EAvCA,CAAkCe,EAAA/c,SAArB9a,EAAA82B,4cCRb,IAAAtO,EAAAloB,EAAA,GACAmoB,EAAAnoB,EAAA,GACAyoC,EAAAzoC,EAAA,GACA0oC,EAAA1oC,EAAA,GASAs9C,EAAA,SAAAz/B,GACE,SAAAy/B,EAAoB/tC,EAAawQ,GAAjC,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAMmN,EAAOsuC,kBAAmB99B,IAAK3d,YADnB+I,EAAAoE,SAoCbpE,EAAA2yC,YAAc,WAWnBh+C,OAAOonB,WAAW,WAChB/b,EAAK0F,WACJ,KAGE1F,EAAAqE,cAAgB,WAAM,OAAA2Y,EAAAne,OAAO+zC,OAE7B5yC,EAAAsE,iBAAmB,WAAM,OAAAtE,EAAKoE,OAAO4oB,YAAYpvB,SAEjDoC,EAAAsB,OAAS,WACd,QAAOtB,EAAKoE,QAASpE,EAAKoE,OAAO9C,YA8CrC,OAxG0C+R,EAAA8+B,EAAAz/B,GAQjCy/B,EAAAx7C,UAAAiN,WAAP,SAAkB2L,GAAlB,IAEMsjC,EAFN7yC,EAAA/I,KACEyb,EAAA/b,UAAMiN,WAAU1O,KAAA+B,KAACsY,GAEjB,IACEsjC,EAAe57C,KAAKmN,OAAOsuC,kBAC3B,MAAOh6B,IAET,GAAoB,MAAhBm6B,EAAsB,CACxB,IAAMC,EAA6B,SAACvsC,GACd,iBAAhBA,EAAMA,QACRvG,EAAKoE,OAAOuc,oBAAoB,gBAAiBmyB,GACjDD,EAAe7yC,EAAKoE,OAAOsuC,kBAC3B1yC,EAAKqe,gBAAgBw0B,KAGzB57C,KAAKmN,OAAOqc,iBAAiB,gBAAiBqyB,GAC9C77C,KAAKmN,OAAOqc,iBAAiB,YAAaxpB,KAAK07C,kBAE/C17C,KAAKonB,gBAAgBw0B,GAQvB,MAAO,CANqB,IAAItV,EAAA9qB,oBAC9BlD,EAAU1M,oCACV,IAAIy6B,EAAAhtB,mBAAmBf,EAAU1M,oCAAoCK,iBACrE,CAACqM,EAAUsuB,8BACXlkC,KAgCGw4C,EAAAx7C,UAAAsoB,YAAP,WAEE,OAAOlC,EAAA1I,UAAUD,MAMZ+9B,EAAAx7C,UAAA8nB,aAAP,WACE,OAAOxnB,KAAKmN,OAASnN,KAAKmN,OAAO2uC,cAAgB,MAS5CZ,EAAAx7C,UAAAkoB,2BAAP,WACE,IAEMm0B,EAFgB/7C,KAAKmN,OAAO6uC,mBAG/BruB,OAAO,SAACsuB,GAAe,OAAAA,EAAMC,SAC7BvuB,OAAO,SAACsuB,GAAe,OAAAA,EAAMvnC,iBAAgChS,IAAlBu5C,EAAMltC,UAAuB,GAE3E,OAAKgtC,EASE,CACLxnC,QALcwnC,EAAiBI,gBAAkBJ,EAAiBK,UAMlEjoC,MALY4nC,EAAiB5nC,MAM7BE,OALa0nC,EAAiB1nC,QALvB,MAab6mC,EAxGA,CAHAt9C,EAAA,IAG0CqoB,sBAA7B3oB,EAAA49C,8cCZb,IAAAhmB,EAAAt3B,EAAA,GAGAsK,EAAAtK,EAAA,GACAu3B,EAAAv3B,EAAA,GACAy+C,EAAAz+C,EAAA,IAEA02B,EAAA,SAAA7Y,GACE,SAAA6Y,EAAY1rB,EAAyBuE,EAAawQ,GAAlD,IAAA5U,EACE0S,EAAAxd,KAAA+B,OAAOA,KACP,OAAI+I,EAAKyP,8BAA8BrL,IACrCjF,EAAAvG,OAAOX,mBAAmB,uEAG5B+H,EAAK2P,8BAA8BvL,GACnCpE,EAAKwP,gBAAkB,IAAI8jC,EAAAC,uBAAuBnvC,EAAkCwQ,GACpF5U,EAAKuP,UAAY,IAAI4c,EAAAvsB,UAAUC,EAAQG,EAAKwP,oBAEhD,OAXoC6D,EAAAkY,EAAA7Y,GAWpC6Y,EAXA,CAAoCa,EAAA/c,SAAvB9a,EAAAg3B,orBCPb,IAAAioB,EAAA3+C,EAAA,IAEAioB,EAAAjoB,EAAA,IACAmS,EAAAnS,EAAA,IACA2f,EAAA3f,EAAA,GACAkoB,EAAAloB,EAAA,GACAmoB,EAAAnoB,EAAA,GACAkK,EAAAlK,EAAA,IACAooB,EAAApoB,EAAA,IACAyoC,EAAAzoC,EAAA,GACA0oC,EAAA1oC,EAAA,GAUA4+C,EAAA5+C,EAAA,IAIA0+C,EAAA,SAAA7gC,GAQE,SAAA6gC,EAAoBnvC,EAAgCwQ,GAApD,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAM2d,IAAK3d,YADO+I,EAAAoE,SANZpE,EAAA0zC,cAA8B,CAACvlC,SAAS,GAExCnO,EAAAod,qBAA+B,EAC/Bpd,EAAA2zC,aAAuB,EAqBxB3zC,EAAAsE,iBAAmB,WAAM,OAAE3P,OAAei/C,QAAWj/C,OAAei/C,QAAQ1vC,QAAU,WACtFlE,EAAAqE,cAAgB,WAAM,OAAA2Y,EAAAne,OAAOg1C,SAC7B7zC,EAAAwE,cAAgB,WAAM,eACtBxE,EAAAkH,YAAc,WAAM,OAA2B,IAA3BlH,EAAKoE,OAAO/D,YAChCL,EAAAoH,sBAAwB,WAAsC,OAAApH,EAAKgV,oBApBxEhV,EAAKyV,aAAe,IAAI+9B,EAAAM,6BAA6B9zC,EAAKoG,sBAAuBpG,EAAK4U,MACtF5U,EAAKsF,uBAAyB,IAAIwX,EAAAsB,QAClCpe,EAAKqd,mBAAqBrd,EAAKoE,OAAOua,UAoV1C,OAhW4CtL,EAAAkgC,EAAA7gC,GAenC6gC,EAAA58C,UAAAiN,WAAP,SAAkB2L,GAQhB,OAPAtY,KAAK2mC,WAOE,CANqB,IAAIL,EAAA9qB,oBAC9BlD,EAAU1M,oCACV,IAAIy6B,EAAAhtB,mBAAmBf,EAAU1M,oCAAoCK,iBACrE,CAACqM,EAAUsuB,8BACXlkC,KAWG45C,EAAA58C,UAAA6nB,cAAP,SAAqB7hB,WACf4tB,EAAWxN,EAAAzI,6BAA6B3X,GAC5C,OAAI4tB,EACKtN,EAAAmC,0BAA0BmL,IAEnCA,EAAkC,QAA1BvZ,GAAG/N,EAAAhM,KAAKmN,QAAO2vC,mBAAW,IAAA/iC,OAAA,EAAAA,EAAA9b,KAAA+N,IAEzBga,EAAAmC,0BAA0BmL,QADnC,GAOKgpB,EAAA58C,UAAA4nB,iBAAP,SAAwB5hB,GAEtB,OADmB1F,KAAKunB,cAAc7hB,IAEpC,IAAK,MACH,MAAO,CAAC2P,QAAS3P,GACnB,IAAK,OACH,MAAO,CAAC0P,OAAQ1P,GAClB,QACE,MAAO,CAAC4P,QAAS5P,KAIhB42C,EAAA58C,UAAAqV,uBAAP,WACE/U,KAAK+8C,sBAAwB/8C,KAAKg9C,8BAA8Bh9C,KAAKmN,QACrE,IAAM8vC,EAAYj9C,KAAKk9C,aAAal9C,KAAKmN,OAAOgwC,KAAK,CAACC,0BAA0B,KAE1EtoC,EAAIpK,MAAA,GACL1K,KAAKmf,yBACLnf,KAAKsnB,iBAAiBtnB,KAAKmN,OAAO2tC,eAAa,CAClD3lC,aAAcnV,KAAKunB,cAAcvnB,KAAKmN,OAAO2tC,cAC7CzwC,OAAQrK,KAAKmN,OAAOkC,aAAeiX,IACnCrR,KAAMjV,KAAKmN,OAAO25B,eAAiBh/B,EAAAwO,WAAWmR,WAAa3f,EAAAwO,WAAWC,OACtEjJ,WAAYtN,KAAKuN,gBACjBkG,QAASzT,KAAKmN,OAAOua,QACrBxS,cAAelV,KAAKmN,OAAOkC,WAC3BmG,kBAAmBxV,KAAKmN,OAAOkH,SAC/BkB,iBAAkBvV,KAAKmN,OAAOgH,QAC9BG,oBAAqBtU,KAAKmN,OAAO6tC,cACjC5mC,mBAAoBpU,KAAKmN,OAAO4tC,aAChCllC,cAAe7V,KAAK+8C,sBACpBjnC,gBAAiB9V,KAAKy8C,cAAcvlC,QACpCnB,iBAAkB/V,KAAKy8C,cAAc5uC,SACrC6G,WAAYuoC,aAAS,EAATA,EAAWvoC,WACvBE,WAAYqoC,aAAS,EAATA,EAAWroC,WACvBoB,cAAe,IAMX2R,EAAc3nB,KAAK4nB,6BAOzB,OANID,IACF7S,EAAKV,mBAAqBuT,EAAYxT,OAASW,EAAKV,mBACpDU,EAAKV,mBAAqBuT,EAAYtT,QAAUS,EAAKR,oBACrDQ,EAAKN,aAAemT,EAAYpT,SAG3BO,GAGFwnC,EAAA58C,UAAAkoB,2BAAP,WAEE,OAAO,MAGF00B,EAAA58C,UAAAinC,SAAP,eAAA59B,EAAA/I,KACQ0L,EAAO1L,KACbA,KAAKmN,OAAO28B,GAAG,iBAAkB,WAC/Bp+B,EAAK2C,uBAAuBC,QAC5B5C,EAAK2C,uBAAuBqa,iBAAiB1oB,KAAKqP,YAClD3D,EAAKgxC,aAAe,EACpBhxC,EAAK2S,cAAcd,EAAA5V,MAAMuqB,cAAe,MAE1ClyB,KAAKmN,OAAOo/B,MAAM,WAChB7gC,EAAK+wC,cAAgB/wC,EAAK2xC,gBAAgBr9C,MAC1C0L,EAAK2S,cAAcd,EAAA5V,MAAM4gB,MAAO,MAElCvoB,KAAKmN,OAAO28B,GAAG,OAAQ,WACrBp+B,EAAK2S,cAAcd,EAAA5V,MAAMghB,KAAM,CAC7B/U,YAAa5T,KAAK4T,kBAGtB5T,KAAKmN,OAAO28B,GAAG,QAAS,WACjB9pC,KAAKs9C,WACR5xC,EAAK2S,cAAcd,EAAA5V,MAAMiiB,MAAO,CAC9BhW,YAAa5T,KAAK4T,kBAIxB5T,KAAKmN,OAAO28B,GAAG,QAAS,WACtB,IAAM7oC,EAAoBjB,KAAKiB,QAC/ByK,EAAK2S,cAAcd,EAAA5V,MAAMod,MAAO,CAC9BnR,YAAa5T,KAAK4T,cAClBjB,KAAM1R,EAAM0R,KACZE,QAAS5R,EAAM4R,QACfS,KAAM,OAGVtT,KAAKmN,OAAO28B,GAAG,eAAgB,WAC7B,IAAMpiB,EAAQ1nB,KAAK0nB,QACbmB,EAAS7oB,KAAK6oB,SACdpV,EAAU/H,EAAKmU,aAAa6H,EAAOmB,GAErC7oB,KAAKomB,qBAAuB3S,IAC1BA,EACF/H,EAAK2S,cAAcd,EAAA5V,MAAMmhB,KAAM,CAC7BlV,YAAa5T,KAAK4T,gBAGpBlI,EAAK2S,cAAcd,EAAA5V,MAAMohB,QAAS,CAChCnV,YAAa5T,KAAK4T,gBAGtB5T,KAAKomB,mBAAqB3S,KAG9BzT,KAAKmN,OAAO28B,GAAG,UAAW,WACxBp+B,EAAK2S,cAAcd,EAAA5V,MAAMqhB,KAAM,CAC7BpV,YAAkC,MAArBlI,EAAKgxC,aAAuBhxC,EAAKgxC,aAAe18C,KAAK4T,kBAGtE5T,KAAKmN,OAAO28B,GAAG,SAAU,WACvBp+B,EAAK2S,cAAcd,EAAA5V,MAAMshB,OAAQ,CAC/BrV,YAAa5T,KAAK4T,kBAItB5T,KAAKmN,OAAO28B,GAAG,kBAAmB,WAChC,IAAMyT,EAAkB7xC,EAAK2xC,gBAAgBr9C,MACvCw9C,EACkB,MAAtB9xC,EAAK+wC,eAA+BD,EAAAiB,wBAAwB/xC,EAAK+wC,cAAec,GAClF7xC,EAAK+wC,cAAgBc,EAEjBC,GACF9xC,EAAK2S,cAAcd,EAAA5V,MAAM0pB,gBAAiB,CACxCzd,YAAa5T,KAAK4T,kBAKJ5T,KAAKmN,OAAO2sC,cACpBhQ,GAAG,SAAU,WACvB,IAAM4T,EAA2BhyC,EAAKsxC,8BAA8BtxC,EAAKyB,QACzC,MAA5BuwC,GAAoCA,IAA6BhyC,EAAKqxC,uBACxErxC,EAAK2S,cAAcd,EAAA5V,MAAM4pB,mBAAoB,CAC3C3d,YAAalI,EAAKyB,OAAOyG,kBAK/B5T,KAAKmN,OAAO28B,GAAG,UAAW,WACxBp+B,EAAK2S,cAAcd,EAAA5V,MAAMgiB,gBAAiB,CACxC/V,YAAa5T,KAAK4T,kBAGtB5T,KAAKmN,OAAO28B,GAAG,UAAW,WACxBp+B,EAAK2S,cAAcd,EAAA5V,MAAMgiB,gBAAiB,CACxC/V,YAAa5T,KAAK4T,kBAGtB5T,KAAKmN,OAAO28B,GAAG,aAAc,WACtB9pC,KAAKs9C,YACR5xC,EAAKgxC,aAAe18C,KAAK4T,eAE3BlI,EAAK2S,cAAcd,EAAA5V,MAAMuhB,YAAa,CACpCtV,YAAa5T,KAAK4T,gBAQpB,IAAMupC,EAAOn9C,KAAKm9C,KAAK,CAACC,0BAA0B,IAGlD,GAAID,EAAKQ,KAAOR,EAAKjT,IAAK,CACxB,IAAM0T,EAAkBlyC,EAAKmyC,mBAAmBV,GAEhD,IAAKS,IAAoBA,EAAgBrpC,QACvC,OAIF,GAAI7I,EAAK8T,8BAA8Bo+B,EAAgBrpC,SAAU,CAC/D,IAAMgK,EAAgC,CACpCpK,MAAOypC,EAAgBzpC,MACvBE,OAAQupC,EAAgBvpC,OACxBE,QAASqpC,EAAgBrpC,QACzBX,YAAa5T,KAAK4T,eAGpBlI,EAAK2S,cAAcd,EAAA5V,MAAMyiB,aAAc7L,GACvC7S,EAAKgU,wBAAwBk+B,EAAgBrpC,aAKnD,IAAIs1B,EAAkB,WACpB,IAAK9gC,EAAKod,oBAAqB,CAC7Bpd,EAAKod,qBAAsB,EAC3B,IAAIvS,OAAW,EACI,MAAf7K,EAAKoE,SACPyG,EAAc7K,EAAKoE,OAAOyG,eAE5B7K,EAAKsV,cAAcd,EAAA5V,MAAM0d,OAAQ,CAC/BzR,YAAWA,IAGf7K,EAAK0F,WAGPo7B,EAAkBA,EAAgBvqC,KAAKU,MAEvCA,KAAKmN,OAAO28B,GAAG,UAAWD,GAC1B7pC,KAAK6pB,mBAAmBL,iBAAiB,eAAgBqgB,GACzD7pC,KAAK6pB,mBAAmBL,iBAAiB,SAAUqgB,IAG9CyS,EAAA58C,UAAA4K,aAAP,SAAoB1B,EAAa1F,GAC/BlD,KAAKqO,uBAAuBC,QAC5BtO,KAAKqO,uBAAuBqa,iBAAiB1oB,KAAKmN,OAAOkC,YACzDrP,KAAK08C,aAAe,EACpB18C,KAAKwe,aAAalU,aAAa1B,EAAQ1F,EAAWlD,KAAKmN,OAAOyG,gBAEhEpV,OAAAC,eAAc69C,EAAA58C,UAAA,cAAW,KAAzB,WACE,OAAOM,KAAKmN,OAAOyG,+CAGb0oC,EAAA58C,UAAAs9C,8BAAR,SAAsC7vC,GACpC,IAAoB,IAAA5M,EAAA,EAAAyL,EAAAmB,EAAO2sC,cAAPv5C,EAAAyL,EAAAvL,OAAAF,IAAsB,CAArC,IAAM07C,EAAKjwC,EAAAzL,GACd,GAAI07C,EAAM/kC,QACR,OAAO+kC,EAAMpuC,WAMXyuC,EAAA58C,UAAA29C,gBAAR,SAAwBlwC,GAItB,IAHA,IAEIU,EADAqJ,GAAU,EAEM3W,EAAA,EAAAu9C,EAHD3wC,EAAOmd,cAAgB,GAGtB/pB,EAAAu9C,EAAAr9C,OAAAF,IAAY,CAA3B,IAAM07C,EAAK6B,EAAAv9C,GACd,GAAmB,YAAf07C,EAAMh9C,KAAoB,CAC5BiY,GAAU,EACVrJ,EAAWouC,EAAMpuC,SACjB,OAGJ,MAAO,CACLqJ,QAAOA,EACPrJ,SAAQA,IAOJyuC,EAAA58C,UAAAm+C,mBAAR,SAA2BvwC,GAMzB,IAAIywC,EALJ,GAAKzwC,IAMDA,EAAWqwC,IACbI,EAAgBzwC,EAAWqwC,IAClBrwC,EAAW48B,MAEpB6T,EAAgBzwC,EAAW48B,KAKxB6T,GAAkBA,EAAcC,WAAsD,mBAAlCD,EAAcC,UAAUhH,OAAjF,CAKA,IAAMiH,EAAmBF,EAAcC,UAAUhH,QAEjD,GAAKiH,EAAL,CAIO,IAAAC,EAAcD,EAAgBC,WAErC,GAAKA,GAAiD,IAAnC1/C,OAAO6jB,KAAK67B,GAAYz9C,OAI3C,MAAO,CACL8T,QAAS2pC,EAAWC,UACpBhqC,OAAQ+pC,EAAWE,YAAc,IAAIjqC,MACrCE,QAAS6pC,EAAWE,YAAc,IAAI/pC,OACtCgqC,OAAQH,EAAWI,WAIfhC,EAAA58C,UAAAw9C,aAAR,SAAqB5vC,GACnB,IAAMswC,EAAkB59C,KAAK69C,mBAAmBvwC,GAEhD,GAAKswC,GAAoBA,EAAgBS,OAAzC,CAIA,IAAMA,EAAST,EAAgBS,OAAO16C,MAAM,KAE5C,GAAK06C,EAIL,MAAO,CACL3pC,WAAY2pC,EAAOviB,KAAK,SAACrnB,GAAkB,OAAA1E,EAAYwuC,aAAa9pC,KACpEG,WAAYypC,EAAOviB,KAAK,SAACrnB,GAAkB,OAAA1E,EAAYyuC,aAAa/pC,QAG1E6nC,EAhWA,CAHA1+C,EAAA,IAG4C8f,iBAA/BpgB,EAAAg/C,irBCzBb,IAQKpsB,EARL9P,EAAAxiB,EAAA,IACA2f,EAAA3f,EAAA,GAIAsK,EAAAtK,EAAA,GACAuyB,EAAAvyB,EAAA,KAEA,SAAKsyB,GACHA,EAAA,QACAA,EAAA,cACAA,EAAA,kBACAA,EAAA,cACAA,EAAA,kBACAA,EAAA,0BACAA,EAAA,cACAA,EAAA,8BACAA,EAAA,gCACAA,EAAA,4BACAA,EAAA,oCACAA,EAAA,0CACAA,EAAA,sDACAA,EAAA,kCACAA,EAAA,UACAA,EAAA,cACAA,EAAA,4BACAA,EAAA,0BACAA,EAAA,4BACAA,EAAA,kBACAA,EAAA,0CACAA,EAAA,wDACAA,EAAA,sCACAA,EAAA,oDACAA,EAAA,gDACAA,EAAA,oCA1BF,CAAKA,MAAK,KA6BV,IAAA2sB,EAAA,SAAAphC,GAKE,SAAAohC,EAAY1tC,EAA8CwO,GAA1D,IAAA5U,EACE0S,EAAAxd,KAAA+B,KAAMmP,EAAuBwO,IAAK3d,YAoY7B+I,EAAAuB,aAAe,SAAC1B,EAAa1F,EAAmB0Q,GACrD7K,EAAK0V,UAAUlB,EAAA5V,MAAMyoB,qBAAsB,CAACxnB,OAAMA,EAAEgL,YAAWA,GAAG1Q,IAnYlE6F,EAAKmiC,cAAgB,EACrBniC,EAAKoiC,gBAAkB,EACvBpiC,EAAKqiC,cAAgB,IAmYzB,OA7YkDhvB,EAAAygC,EAAAphC,GAazCohC,EAAAn9C,UAAA4wB,aAAP,WACE,OAAA1vB,EACKpC,OAAO6jB,KAAK6N,GAAO/c,IAAI,SAAC9T,GAAQ,OAAA6wB,EAAM7wB,KAAK,CAC9C,sBACA,YACA,6BACA,uBACA,sCAIGw9C,EAAAn9C,UAAA6wB,gBAAP,SAAuBjhB,GACrB,OAAOtP,KAAKswB,eAAe3C,OAAO,SAAC7vB,GAAM,OAAAA,IAAMwR,KAG1CutC,EAAAn9C,UAAAwkB,mBAAP,SAA0BvG,GAA1B,IAAA5U,EAAA/I,KACE,OAAOogB,EAAahhB,OAAO,CACzB8hB,QAASgP,EAAMvF,MACf1pB,MAAO,SAACwvB,EAAW/O,EAAME,EAAIza,EAAMuL,EAAWE,GAC5C1K,EAAAvG,OAAOV,MAAM,0BAA4B2R,IAE3CyO,OAAQ,CACN,CAAChjB,KAAMkf,EAAA5V,MAAMuqB,cAAexQ,KAAM,CAACwO,EAAMvF,MAAOuF,EAAMnL,MAAOmL,EAAMS,iBAAkB/O,GAAIsO,EAAM3H,OAC/F,CAAClqB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMvF,MAAO/I,GAAIsO,EAAMvF,OACvD,CAACtsB,KAAMkf,EAAA5V,MAAMuqB,cAAexQ,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OACzD,CAAClqB,KAAMkf,EAAA5V,MAAM4gB,MAAO7G,KAAM,CAACwO,EAAMvF,MAAOuF,EAAMnL,OAAQnD,GAAIsO,EAAM3H,OAChE,CAAClqB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAMU,SAEhD,CAACvyB,KAAMkf,EAAA5V,MAAMod,MAAOrD,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMW,wBACnD,CAACxyB,KAAMkf,EAAA5V,MAAM0d,OAAQ3D,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMW,wBACpD,CAACxyB,KAAMkf,EAAA5V,MAAM4d,mBAAoB7D,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMW,wBAEhE,CAACxyB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC7D,CAACvyB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC3D,CAACvyB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC1D,CAACvyB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAC1D,CAACvyB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMc,SAEzD,CAAC3yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SACzD,CAAC3yB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SAC3D,CAAC3yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMe,aAC7D,CAAC5yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aACjE,CAAC5yB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMc,SAG7D,CAAC3yB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAClD,CAACvyB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMqb,cAClD,CAACltC,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAC9D,CAACltC,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBAEhE,CAAC7yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMtG,OACnD,CAACvrB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMtG,OACvD,CAACvrB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OACvD,CAACvrB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMc,SAEhD,CAAC3yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMiB,eAC1D,CAAC9yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMiB,eAC1D,CAAC9yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMiB,eAChE,CAAC9yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMiB,eAChE,CAAC9yB,KAAM,uBAAwBqjB,KAAMwO,EAAMiB,cAAevP,GAAIsO,EAAMc,SAEpE,CAAC3yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMkB,qBACxD,CAAC/yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMkB,qBACxD,CACE/yB,KAAMkf,EAAA5V,MAAMyiB,aACZ1I,KAAMwO,EAAMkB,oBACZxP,GAAIsO,EAAMkB,qBAEZ,CACE/yB,KAAMkf,EAAA5V,MAAMopB,aACZrP,KAAMwO,EAAMkB,oBACZxP,GAAIsO,EAAMkB,qBAEZ,CAAC/yB,KAAM,6BAA8BqjB,KAAMwO,EAAMkB,oBAAqBxP,GAAIsO,EAAMtG,OAEhF,CAACvrB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMgB,gBAChD,CAAC7yB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACzD,CAAC7yB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACjE,CAAC7yB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACjE,CAAC7yB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBACpE,CAAC7yB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMgB,gBAClE,CAAC7yB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMtG,OAC3D,CAACvrB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMc,SACzD,CAAC3yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMtG,OAE1D,CAACvrB,KAAM,YAAaqjB,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMqb,cACjD,CAACltC,KAAM,YAAaqjB,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMqb,cAC1D,CAACltC,KAAM,YAAaqjB,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cACxD,CAACltC,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cACvD,CAACltC,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAC/D,CAACltC,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAC/D,CAACltC,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAClE,CAACltC,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAChE,CAACltC,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMqb,cAGzD,CAACltC,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMsb,kBAEzD,CAACntC,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACtE,CAACntC,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACpE,CAACntC,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBAC7D,CAACntC,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMc,SAElE,CAAC3yB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMqb,aAAc3pB,GAAIsO,EAAMQ,KACtD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMgB,eAAgBtP,GAAIsO,EAAMQ,KACxD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMQ,KACjD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMQ,KAC/C,CAACryB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAC9C,CAACryB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAChD,CAACryB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACrD,CAACryB,KAAMkf,EAAA5V,MAAMmpB,cAAepP,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACvD,CAACryB,KAAMkf,EAAA5V,MAAMgiB,gBAAiBjI,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KACzD,CAACryB,KAAMkf,EAAA5V,MAAM+oB,IAAKhP,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMQ,KAG7C,CAACryB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMc,SAEpD,CAAC3yB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAMQ,IAAK9O,GAAIsO,EAAMc,SAE9C,CAAC3yB,KAAMkf,EAAA5V,MAAMod,MAAOrD,KAAM1hB,KAAKuwB,gBAAgBL,EAAMU,SAAUhP,GAAIsO,EAAMnL,OACzE,CAAC1mB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMnL,MAAOnD,GAAIsO,EAAMnL,OAEjD,CAAC1mB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMqb,cAC3D,CAACltC,KAAM,sBAAuBqjB,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMc,SAEtE,CAAC3yB,KAAMkf,EAAA5V,MAAM0d,OAAQ3D,KAAM1hB,KAAKuwB,gBAAgBL,EAAMU,SAAUhP,GAAIsO,EAAMQ,KAE1E,CAACryB,KAAMkf,EAAA5V,MAAM8pB,SAAU/P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMwB,IACtD,CAACrzB,KAAMkf,EAAA5V,MAAMgqB,OAAQjQ,KAAMwO,EAAMwB,GAAI9P,GAAIsO,EAAMc,SAE/C,CAAC3yB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM0B,cAChD,CAACvzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM0B,cACnD,CAACvzB,KAAM,gBAAiBqjB,KAAMwO,EAAM0B,aAAchQ,GAAIsO,EAAM3H,OAE5D,CAAClqB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAM2B,aAClD,CAACxzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAM2B,aACrD,CAACxzB,KAAM,gBAAiBqjB,KAAMwO,EAAM2B,YAAajQ,GAAIsO,EAAMc,SAE3D,CAAC3yB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAM4B,cAChD,CAACzzB,KAAMkf,EAAA5V,MAAMohB,QAASrH,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAM4B,cACnD,CAACzzB,KAAM,gBAAiBqjB,KAAMwO,EAAM4B,aAAclQ,GAAIsO,EAAMtG,OAE5D,CAACvrB,KAAMkf,EAAA5V,MAAMoqB,WAAYrQ,KAAM,CAACwO,EAAM3H,MAAO2H,EAAMtG,OAAQhI,GAAIsO,EAAM8B,SACrE,CAAC3zB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACnD,CAAC3zB,KAAMkf,EAAA5V,MAAMghB,KAAMjH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACzD,CAAC3zB,KAAMkf,EAAA5V,MAAMmhB,KAAMpH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SAClD,CAAC3zB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM8B,SACpD,CAAC3zB,KAAMkf,EAAA5V,MAAMsqB,SAAUvQ,KAAMwO,EAAM8B,QAASpQ,GAAIsO,EAAM3H,OAEtD,CAAClqB,KAAMkf,EAAA5V,MAAMqhB,KAAMtH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAChD,CAAClqB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAClD,CAAClqB,KAAMkf,EAAA5V,MAAMshB,OAAQvH,KAAMwO,EAAMU,QAAShP,GAAIsO,EAAMU,SAEpD,CAACvyB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMuuB,4BAChE,CAACpgD,KAAM,6BAA8BqjB,KAAMwO,EAAMuuB,2BAA4B78B,GAAIsO,EAAMc,SAEvF,CAAC3yB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAC9D,CAACvrB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAC9D,CAAClqB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aACpE,CAAC5yB,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACzE,CAACntC,KAAMkf,EAAA5V,MAAM4pB,mBAAoB7P,KAAMwO,EAAMsB,oBAAqB5P,GAAIsO,EAAMsB,qBAE5E,CAACnzB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMc,QAASpP,GAAIsO,EAAMwuB,0BAC7D,CAACrgD,KAAM,2BAA4BqjB,KAAMwO,EAAMwuB,yBAA0B98B,GAAIsO,EAAMc,SAEnF,CAAC3yB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMtG,MAAOhI,GAAIsO,EAAMtG,OAC3D,CAACvrB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAM3H,MAAO3G,GAAIsO,EAAM3H,OAC3D,CAAClqB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMe,aACjE,CAAC5yB,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMsb,iBAAkB5pB,GAAIsO,EAAMsb,kBACtE,CAACntC,KAAMkf,EAAA5V,MAAM0pB,gBAAiB3P,KAAMwO,EAAMoB,kBAAmB1P,GAAIsO,EAAMoB,mBAEvE,CACEjzB,KAAMkf,EAAA5V,MAAMyoB,qBACZ1O,KAAM1hB,KAAKuwB,gBAAgBL,EAAMvF,OACjC/I,GAAIsO,EAAMS,iBAEZ,CAACtyB,KAAMkf,EAAA5V,MAAMyoB,qBAAsB1O,KAAMwO,EAAMvF,MAAO/I,GAAIsO,EAAMvF,OAChE,CAACtsB,KAAMkf,EAAA5V,MAAMuhB,YAAaxH,KAAMwO,EAAMS,gBAAiB/O,GAAIsO,EAAMS,iBAEjE,CAACtyB,KAAMkf,EAAA5V,MAAMyiB,aAAc1I,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMiC,2BAC9D,CAAC9zB,KAAMkf,EAAA5V,MAAMopB,aAAcrP,KAAMwO,EAAMe,YAAarP,GAAIsO,EAAMiC,2BAC9D,CACE9zB,KAAMkf,EAAA5V,MAAMyiB,aACZ1I,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMiC,2BAEZ,CACE9zB,KAAMkf,EAAA5V,MAAMopB,aACZrP,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMiC,2BAEZ,CACE9zB,KAAM,mCACNqjB,KAAMwO,EAAMiC,0BACZvQ,GAAIsO,EAAMe,aAGZ,CAAC5yB,KAAMkf,EAAA5V,MAAM4X,mBAAoBmC,KAAM,CAACwO,EAAMc,QAASd,EAAMtG,OAAQhI,GAAIsO,EAAMkC,kBAC/E,CAAC/zB,KAAMkf,EAAA5V,MAAMqpB,QAAStP,KAAMwO,EAAMkC,iBAAkBxQ,GAAIsO,EAAMc,SAC9D,CAAC3yB,KAAMkf,EAAA5V,MAAMiiB,MAAOlI,KAAMwO,EAAMkC,iBAAkBxQ,GAAIsO,EAAMtG,QAE9DtI,UAAW,CACTkR,aAAc,SAAChhB,EAAOkQ,EAAME,EAAI1e,GAC1B0e,IAAOsO,EAAMiB,eACfpoB,EAAKyV,aAAakU,qBAAqBxvB,GAErC0e,IAAOsO,EAAM0B,cAAgBhQ,IAAOsO,EAAM2B,aAAejQ,IAAOsO,EAAM4B,cACxE/oB,EAAKyV,aAAaoU,cAAc1vB,GAE9B0e,IAAOsO,EAAMuuB,4BACf11C,EAAKyV,aAAamgC,2BAA2Bz7C,GAE3C0e,IAAOsO,EAAMwuB,0BACf31C,EAAKyV,aAAaogC,yBAAyB17C,IAG/CovB,aAAc,SAAC9gB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC5B,SAATmD,GAAmB/D,EAAKe,UAC1B3V,EAAK+a,sBAAwBnG,EAAKe,UAElC3V,EAAK+a,sBAAwB5gB,IAAa,IAAIH,MAAO2hB,UAGvDxc,EAAAvG,OAAOvB,IAAI,WAAa8H,EAAA5G,SAASsgB,EAAI,IAAM,UAAY1Z,EAAA5G,SAASkQ,EAAO,IAAM,SAAWtJ,EAAA5G,SAASogB,EAAM,KAGrGnD,GACAqD,IAAOsO,EAAMgB,gBACbtP,IAAOsO,EAAMqb,cACb3pB,IAAOsO,EAAMsb,kBAEbziC,EAAKoG,sBAAsBuC,2BAA2B6M,GAGpD/M,IAAU+L,EAAA5V,MAAMqhB,MAClBjgB,EAAKoG,sBAAsBuC,2BAA2B6M,GAGpD/M,IAAU+L,EAAA5V,MAAMshB,QAClBlgB,EAAKoG,sBAAsBsC,yBAAyB8M,GAI1C,cAAV/M,GACAoQ,IAAOsO,EAAMqb,cACb3pB,IAAOsO,EAAMqb,cACb3pB,IAAOsO,EAAMsb,mBAEbziC,EAAKmiC,cAAgBniC,EAAK+a,uBAGxBtS,IAAU+L,EAAA5V,MAAMoqB,YAAcnQ,IAAOsO,EAAM8B,SAC7CjpB,EAAKoG,sBAAsBojB,aAAarvB,EAAWqb,GAGjDqD,IAAOsO,EAAMe,aACfloB,EAAKub,qCAGTuO,aAAc,SAACrhB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAKzC,GAJImD,IAASwO,EAAMe,aACjBloB,EAAKwb,0BAGFrhB,EAAL,CAGAgF,EAAAvG,OAAOvB,IAAI,WAAW8H,EAAA5G,SAASogB,EAAM,IAAG,WAAWxZ,EAAA5G,SAASkQ,EAAO,IAAG,OAAOtJ,EAAA5G,SAASsgB,EAAI,KAE1F,IAAM+C,EAAgBzhB,EAAY6F,EAAK+a,sBAMvC,GAJIvF,GAAeqD,IAAOsO,EAAMgB,gBAAkBtP,IAAOsO,EAAMsb,kBAC7DziC,EAAKoG,sBAAsBsC,yBAAyB8M,GAGxC,cAAV/M,GAAyBkQ,IAASwO,EAAMtG,MAC1C,OAAO,EAGLlI,IAASwO,EAAM3H,OAAS3G,IAAOsO,EAAMU,QACvC7nB,EAAK2c,uBACIhE,IAASwO,EAAMU,SAAYhP,IAAOsO,EAAMc,SAAWpP,IAAOsO,EAAMW,wBACzE9nB,EAAKob,yBAGP,IAAM2O,EAAS1uB,OAAOsd,GAAMpE,cAC5B,GAAIsE,IAAOsO,EAAMW,uBAAwB,CACvC9nB,EAAKob,yBACL,IAAMgG,EAAYphB,EAAKkc,+BAA+B/hB,EAAWsO,EAAO+M,GAClEwU,EAAmBvhB,IAAU+L,EAAA5V,MAAMod,MACzChc,EAAKoG,sBAAsBmD,iBAAiB6X,EAAW4I,QAClD,GAAIrR,IAASwO,EAAMgB,eAAgB,CACxC,IAAM8B,EAAe9vB,EAAY6F,EAAKmiC,cACtCniC,EAAKoG,sBAAsB8C,eAAe+gB,EAAcF,QACnD,GAAIpR,IAASwO,EAAMsb,iBAAkB,CACpCxY,EAAejqB,EAAKoiC,gBAAkBpiC,EAAKmiC,cACjDniC,EAAKoG,sBAAsBgD,iBAAiB6gB,EAAcF,QACrD,GAAIthB,IAAU+L,EAAA5V,MAAM0d,OACzBtc,EAAKoG,sBAAsBsB,OAAOkU,EAAemO,QAC5C,GAAIpR,IAASwO,EAAMtG,OAAShI,IAAOsO,EAAMgB,eAC9CnoB,EAAKoG,sBAAsBuC,2BAA2BF,GACtDzI,EAAKoG,sBAAsB4C,MAAM4S,EAAemO,OAC3C,CACL,IAAMG,EAAmBlqB,EAAKoG,sBAAsB2jB,GACpD,GAAgC,mBAArBG,EACTA,EAAiBtO,EAAemO,EAAQvU,QAQM,MANvB,CACrB2R,EAAM4B,aACN5B,EAAM2B,YACN3B,EAAMuuB,2BACNvuB,EAAMwuB,0BAEW5iB,KAAK,SAACra,GAAM,OAAAC,IAASD,KACtCvZ,EAAAvG,OAAOV,MAAM,wCAA0C6xB,GAM3DvU,GACAqD,IAAOsO,EAAMgB,gBACbtP,IAAOsO,EAAMqb,cACb3pB,IAAOsO,EAAMsb,kBAEbziC,EAAKoG,sBAAsBuC,2BAA2B6M,GAGpD/M,IAAU+L,EAAA5V,MAAMyiB,aAClBrhB,EAAKoG,sBAAsBoC,YAAYgN,GAC9B/M,IAAU+L,EAAA5V,MAAMopB,aACzBhoB,EAAKoG,sBAAsByC,YAAY2M,GAC9B/M,IAAU+L,EAAA5V,MAAMmhB,KACzB/f,EAAKoG,sBAAsBqE,OAClBhC,IAAU+L,EAAA5V,MAAMohB,QACzBhgB,EAAKoG,sBAAsBuE,SAClBlC,IAAU+L,EAAA5V,MAAMyoB,sBACzBrnB,EAAKoG,sBAAsB0E,mBAAmB0K,KAGlD2U,OAAQ,SAAC1hB,EAAOkQ,EAAME,EAAI1e,GACxB6F,EAAKmiC,cAAgBhoC,GAEvB8oC,SAAU,SAACx6B,EAAOkQ,EAAME,EAAI1e,GAC1B6F,EAAKoiC,gBAAkBjoC,GAEzBiwB,cAAe,SAAC3hB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1C,IAAMoG,EAAgBzhB,EAAY6F,EAAK+a,sBAEnCa,EAAgB,QAClB5b,EAAKoG,sBAAsBsC,yBAAyB8M,GAEpDxV,EAAKoG,sBAAsB8B,UAAU0T,EAAevgB,OAAOsd,GAAMpE,cAAe,CAAC/M,OAAQoU,IACzF5b,EAAK+a,sBAAwB5gB,EAE7B6F,EAAKoG,sBAAsBuC,2BAA2B6M,KAG1D6U,cAAe,SAAC5hB,EAAOkQ,EAAME,EAAI1e,EAAWqb,GAC1CxV,EAAKoG,sBAAsBlO,MAAMsd,QAMlCs+B,EAAAn9C,UAAA+e,UAAP,SACEH,EACAC,EACArb,GAEA,IAAM0D,EAAO5G,KAAKwe,aAAaF,GAE3B1X,EACFA,EAAK3I,KAAK+B,KAAKwe,aAActb,EAAWqb,GAExCrW,EAAAvG,OAAOvB,IAAI,kBAAoBke,IAOrCu+B,EA7YA,CAAkD1sB,EAAAtM,uBAArCvmB,EAAAu/C,mJCrCb,IAAMgC,EAAc,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,OAAQ,OAE9DC,EAAc,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,aAErDxhD,EAAAihD,aAAA,SAA6B9pC,GAC3B,QAAKA,IAIa,IADJoqC,EAAYtjC,UAAU,SAAC7G,GAAe,OAAAD,EAAMhN,WAAWiN,MAIvEpX,EAAAkhD,aAAA,SAA6B/pC,GAC3B,QAAKA,IAIa,IADJqqC,EAAYvjC,UAAU,SAAC7G,GAAe,OAAAD,EAAMhN,WAAWiN,sHCL1DpX,EAAAmgD,wBAA0B,SAACsB,EAAsBC,GAC5D,OAAa,MAATD,GAA0B,MAATC,MAGH,MAATD,GAA0B,MAATC,GAAiBD,EAAM7nC,UAAY8nC,EAAM9nC,SAAW6nC,EAAMlxC,WAAamxC,EAAMnxC,+GCfzG,SAAY2mB,GACVA,EAAA,wBACAA,EAAA,gBACAA,EAAA,gBACAA,EAAA,gBACAA,EAAA,wBACAA,EAAA,wBACAA,EAAA,wBAPF,CAAYl3B,EAAAk3B,cAAAl3B,EAAAk3B,YAAW","file":"bitmovinanalytics.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"analytics\"] = factory();\n\telse\n\t\troot[\"bitmovin\"] = root[\"bitmovin\"] || {}, root[\"bitmovin\"][\"analytics\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/Users/ineskulenovic/Desktop/Bitmovin/bitmovin-analytics-collector/build/release\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 28);\n","/* tslint:disable:no-console */\nclass Logger {\n constructor(showLogs: boolean = false) {\n (this as any).showLogs = showLogs;\n }\n\n public setLogging(logging: boolean) {\n (this as any).showLogs = logging;\n }\n\n public isLogging() {\n return (this as any).showLogs;\n }\n\n public log(msg: string, ...optionalParamters: any[]) {\n if (!(this as any).showLogs) {\n return;\n }\n\n console.log(msg, ...optionalParamters);\n }\n\n public logTable(fields: any[]) {\n console.table(fields);\n }\n\n public errorMessageToUser(msg: string, ...optionalParamters: any[]) {\n console.error(msg, ...optionalParamters);\n }\n\n public error(msg: string | undefined, ...optionalParamters: any[]) {\n if (!(this as any).showLogs) {\n return;\n }\n\n console.error(msg, ...optionalParamters);\n }\n\n public warning(msg: string) {\n if (!(this as any).showLogs) {\n return;\n }\n\n console.warn(msg);\n }\n\n public warningMessageToUser(msg: string, ...optionalParameters: any[]) {\n console.warn(msg, ...optionalParameters);\n }\n}\n\nexport const padRight = (str: string | undefined, length: number) => {\n const padStr = new Array(length).join(' ');\n return (str + padStr).slice(0, length);\n};\n\nexport const logger = new Logger();\n","import {PAGE_LOAD_TYPE} from '../enums/PageLoadType';\nimport * as CustomDataUtils from '../types/CustomDataValues';\nimport {CustomDataValues} from '../types/CustomDataValues';\n\n/* tslint:disable */\nexport const validString = (text: any): boolean => {\n return text != null && typeof text === 'string';\n};\n\nexport const isNullOrEmptyString = (text: any): boolean => {\n return text == null || typeof text != 'string' || text.length === 0;\n};\n\nexport const validBoolean = (bool: any): boolean => {\n return bool != null && typeof bool === 'boolean';\n};\n\nexport const validNumber = (num: any): boolean => {\n return num != null && typeof num === 'number';\n};\n\nexport const sanitizePath = (path: string): string => {\n return path.replace(/\\/$/g, '');\n};\n/* tslint:enable */\n\nexport const calculateTimeWithUndefined = (time?: number): number | undefined => {\n if (time === undefined) {\n return time;\n }\n time = time * 1000;\n return Math.round(time);\n};\n\nexport const calculateTime = (time: number): number => {\n time = time * 1000;\n return Math.round(time);\n};\n\n/**\n * Return the current time in milliseconds.\n */\nexport const getCurrentTimestamp = (): number => {\n return Date.now();\n};\n\nexport const getDurationFromTimestampToNow = (timestamp: number): number => {\n return getCurrentTimestamp() - timestamp;\n};\n\nexport const generateUUID = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n // tslint:disable-next-line\n const r = (Math.random() * 16) | 0;\n // tslint:disable-next-line\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\nexport const getCookie = (cname: string): string => {\n const name = cname + '=';\n const ca = document.cookie.split(';');\n for (let c of ca) {\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n return c.substring(name.length, c.length);\n }\n }\n return '';\n};\n\nexport const noOp = () => {};\n\nexport const getCustomDataString = (customData: any): string | undefined => {\n if (typeof customData === 'object') {\n return JSON.stringify(customData);\n } else if (typeof customData === 'function') {\n return getCustomDataString(customData());\n } else if (typeof customData === 'undefined') {\n return customData;\n } else if (typeof customData !== 'string') {\n return String(customData);\n }\n\n return customData;\n};\n\nexport const transferCustomDataFields = (fromConfig: CustomDataValues, toConfig: CustomDataValues) => {\n for (let i = 1; i <= CustomDataUtils.customDataFieldCount; i++) {\n const customDataField = `customData${i}`;\n toConfig[customDataField] = getCustomDataString(fromConfig[customDataField]);\n }\n};\n\nexport const getDocumentPropWithPrefix = (prop: string): string | undefined => {\n const prefixes = ['webkit', 'moz', 'ms', 'o'];\n if (prop in document) {\n return prop;\n }\n\n const pascalCase = prop.charAt(0).toUpperCase() + prop.slice(1);\n for (const prefix of prefixes) {\n if (prefix + pascalCase in document) {\n return prefix + pascalCase;\n }\n }\n return undefined;\n};\n\nexport const isVideoInFullscreen = () => {\n const fullscreenProp = getDocumentPropWithPrefix('fullscreenElement');\n return fullscreenProp !== undefined && document[fullscreenProp] && document[fullscreenProp].nodeName === 'VIDEO';\n};\n\nexport const getHiddenProp = (): string | undefined => {\n return getDocumentPropWithPrefix('hidden');\n};\n\nexport function getPageLoadType(): PAGE_LOAD_TYPE {\n const hiddenProp = getHiddenProp();\n if (hiddenProp != null && document[hiddenProp] === true) {\n return PAGE_LOAD_TYPE.BACKGROUND;\n }\n return PAGE_LOAD_TYPE.FOREGROUND;\n}\n\nexport const getHostnameAndPathFromUrl = (url: string) => {\n const domElement = document.createElement('a');\n domElement.href = url;\n\n return {hostname: domElement.hostname, path: domElement.pathname};\n};\n\nexport const calculatePercentage = (numerator?: number, denominator?: number): number | undefined => {\n if (denominator === undefined || denominator === 0) {\n return undefined;\n }\n return Math.round(((numerator || 0) / denominator) * 100);\n};\n\n/* tslint:disable */\nexport const getBrowserInfo = () => {\n var ua = navigator.userAgent,\n tem,\n M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n return {name: 'IE', version: tem[1] || ''};\n }\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) return {name: tem[1].replace('OPR', 'Opera'), version: tem[2]};\n }\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) M.splice(1, 1, tem[1]);\n return {name: M[0], version: M[1]};\n};\n/* tslint:enable */\n\nexport const getURLResourceName = (url: string): string => {\n if (url.length === 0) {\n return '';\n }\n return url.split('/').pop() || '';\n};\n\nexport const joinUrls = (...args: string[]): string => {\n return args.reduce((prev, current) => {\n const prevUrlValue = endsWith(prev, '/') && current !== undefined ? prev.substr(0, prev.length - 1) : prev;\n const nextUrlValue = startsWith(current, '/') ? current.substr(1) : current;\n return prevUrlValue + '/' + nextUrlValue;\n });\n};\n\nexport const endsWith = (str: string, suffix: string): boolean => {\n if (String.prototype.endsWith != null) {\n return str.endsWith(suffix);\n }\n\n return str.substring(str.length - suffix.length) === suffix;\n};\n\nexport const startsWith = (str: string, prefix: string): boolean => {\n if (String.prototype.startsWith != null) {\n return str.startsWith(prefix);\n }\n return str.substring(0, prefix.length) === prefix;\n};\n","import {\n AnalyticsEventBase,\n AudioChangeEvent,\n ErrorEvent,\n SourceChangeEvent,\n VideoChangeEvent,\n} from '../types/EventData';\n\nexport enum Event {\n SETUP = 'setup',\n READY = 'ready',\n SOURCE_LOADED = 'sourceLoaded',\n PLAY = 'play',\n PLAYING = 'playing',\n PAUSE = 'pause',\n TIMECHANGED = 'timechanged',\n SEEK = 'seek',\n SEEKED = 'seeked',\n START_CAST = 'startCasting',\n END_CAST = 'endCasting',\n START_BUFFERING = 'startBuffering',\n END_BUFFERING = 'endBuffering',\n AUDIOTRACK_CHANGED = 'audioTrackChanged',\n AUDIO_CHANGE = 'audioChange',\n VIDEO_CHANGE = 'videoChange',\n START_FULLSCREEN = 'startFullscreen',\n END_FULLSCREEN = 'endFullscreen',\n START_AD = 'adStart',\n SUBTITLE_CHANGE = 'subtitleChange',\n END_AD = 'adEnd',\n MUTE = 'mute',\n UN_MUTE = 'unMute',\n ERROR = 'playerError',\n PLAYBACK_FINISHED = 'end',\n SCREEN_RESIZE = 'resize',\n UNLOAD = 'unload',\n END = 'end',\n SOURCE_UNLOADED = 'sourceUnloaded',\n MANUAL_SOURCE_CHANGE = 'manualSourceChangeInitiated',\n VIDEOSTART_TIMEOUT = 'VIDEOSTART_TIMEOUT',\n CUSTOM_DATA_CHANGE = 'customDataChange',\n PLAYLIST_TRANSITION = 'playlistTransition',\n}\n\nexport interface EventMap {\n [Event.SETUP]: AnalyticsEventBase;\n [Event.READY]: AnalyticsEventBase;\n [Event.SOURCE_LOADED]: AnalyticsEventBase;\n [Event.PLAY]: AnalyticsEventBase;\n [Event.PLAYING]: AnalyticsEventBase;\n [Event.PAUSE]: AnalyticsEventBase;\n [Event.TIMECHANGED]: AnalyticsEventBase;\n [Event.SEEK]: AnalyticsEventBase;\n [Event.SEEKED]: AnalyticsEventBase;\n [Event.START_CAST]: AnalyticsEventBase;\n [Event.END_CAST]: AnalyticsEventBase;\n [Event.START_BUFFERING]: AnalyticsEventBase;\n [Event.END_BUFFERING]: AnalyticsEventBase;\n [Event.AUDIOTRACK_CHANGED]: AnalyticsEventBase;\n [Event.AUDIO_CHANGE]: AudioChangeEvent;\n [Event.VIDEO_CHANGE]: VideoChangeEvent;\n [Event.START_FULLSCREEN]: AnalyticsEventBase;\n [Event.END_FULLSCREEN]: AnalyticsEventBase;\n [Event.START_AD]: AnalyticsEventBase;\n [Event.SUBTITLE_CHANGE]: AnalyticsEventBase;\n [Event.END_AD]: AnalyticsEventBase;\n [Event.MUTE]: AnalyticsEventBase;\n [Event.UN_MUTE]: AnalyticsEventBase;\n [Event.ERROR]: ErrorEvent;\n [Event.PLAYBACK_FINISHED]: AnalyticsEventBase;\n [Event.SCREEN_RESIZE]: AnalyticsEventBase;\n [Event.UNLOAD]: AnalyticsEventBase;\n [Event.END]: AnalyticsEventBase;\n [Event.SOURCE_UNLOADED]: AnalyticsEventBase;\n [Event.MANUAL_SOURCE_CHANGE]: SourceChangeEvent;\n [Event.VIDEOSTART_TIMEOUT]: AnalyticsEventBase;\n [Event.CUSTOM_DATA_CHANGE]: AnalyticsEventBase;\n [Event.PLAYLIST_TRANSITION]: AnalyticsEventBase;\n}\n","export enum Player {\n BITMOVIN = 'bitmovin',\n JW = 'jw',\n RADIANT = 'radiant',\n VIDEOJS = 'videojs',\n HLSJS = 'hlsjs',\n SHAKA = 'shaka',\n DASHJS = 'dashjs',\n HTML5 = 'html5',\n CHROMECAST_SHAKA = 'chromecast-shaka',\n}\n","import {InternalAdapterAPI} from '../adapters/internal/InternalAdapterAPI';\nimport {ErrorCode} from '../enums/ErrorCode';\nimport {PlayerSize} from '../enums/PlayerSize';\nimport {ErrorDetailTrackingSettingsProvider} from '../features/errordetails/ErrorDetailTracking';\nimport {OnErrorDetailEventObject} from '../features/errordetails/OnErrorDetailEventObject';\nimport {FeatureManager} from '../features/FeatureManager';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {CastClientConfig} from '../types/CastClientConfig';\nimport {CustomDataValues, customDataValuesKeys} from '../types/CustomDataValues';\nimport * as EventData from '../types/EventData';\nimport {FeatureConfigContainer} from '../types/FeatureConfigContainer';\nimport {Sample} from '../types/Sample';\nimport Timespan from '../types/Timespan';\nimport {CodecHelper} from '../utils/CodecHelper';\nimport {logger} from '../utils/Logger';\nimport * as Settings from '../utils/Settings';\nimport * as Utils from '../utils/Utils';\nimport {VERSION} from '../Version';\nimport {AdAnalytics} from './AdAnalytics';\nimport {Backend} from './Backend';\nimport {BackendFactory} from './BackendFactory';\nimport {EventDispatcher, Subscribable} from './EventDispatcher';\nimport {NoOpBackend} from './NoOpBackend';\nimport {SessionPersistenceHandler} from './SessionPersistenceHandler';\n\nexport class Analytics {\n public get version(): string {\n return VERSION;\n }\n public static version: string = VERSION;\n public static LICENSE_CALL_PENDING_TIMEOUT = 200;\n public static PAGE_LOAD_TYPE_TIMEOUT = 200;\n public static CAST_RECEIVER_CONFIG_MESSAGE = 'CAST_RECEIVER_CONFIG_MESSAGE';\n\n public pageLoadTime: number = 0;\n public playerStartupTime: number = 0;\n public videoStartupTime: number = 0;\n public autoplay: boolean | undefined = undefined;\n public sample: Sample;\n public backend!: Backend;\n public errorDetailTrackingSettingsProvider: ErrorDetailTrackingSettingsProvider;\n public get errorDetailSubscribable(): Subscribable<OnErrorDetailEventObject> {\n return this.onErrorDetailEventDispatcher;\n }\n\n private config: AnalyticsConfig;\n private sessionHandler: SessionPersistenceHandler;\n private droppedSampleFrames: number = 0;\n private startupTime: number = 0;\n private adapter!: InternalAdapterAPI;\n private backendFactory: BackendFactory;\n private resetQualityChangeCountIntervalId?: number;\n private featureManager = new FeatureManager<FeatureConfigContainer>();\n private onErrorDetailEventDispatcher = new EventDispatcher<OnErrorDetailEventObject>();\n private adAnalytics: AdAnalytics | undefined;\n\n private authenticationCallback: AuthenticationCallback = {\n authenticationCompleted: (success: boolean, featureConfigs?: FeatureConfigContainer) => {\n this.featureManager.configureFeatures(success, featureConfigs);\n },\n };\n\n constructor(\n config: AnalyticsConfig,\n adapter: InternalAdapterAPI,\n backendFactory: BackendFactory = new BackendFactory()\n ) {\n const that = this;\n this.config = this.buildDefaultAnalyticsConfigValues(config);\n this.errorDetailTrackingSettingsProvider = {\n get domain() {\n return that.getDomain(that.config);\n },\n get licenseKey() {\n return that.config.key ?? '';\n },\n get impressionId() {\n return that.getCurrentImpressionId() ?? '';\n },\n get collectorConfig() {\n return that.config.config;\n },\n };\n\n this.adapter = adapter;\n this.backendFactory = backendFactory;\n this.sessionHandler = new SessionPersistenceHandler(config);\n\n const licenseKeyReceivedUnsubscriber = this.adapter.onLicenseKeyReceived.subscribe(\n (eventArgs: {licenseKey: string}) => {\n if (!this.config.key) {\n this.config.key = eventArgs.licenseKey;\n }\n licenseKeyReceivedUnsubscriber();\n }\n );\n\n this.sample = this.setupSample();\n this.init();\n this.setupStateMachineCallbacks();\n const features = this.adapter.initialize(this);\n this.featureManager.registerFeatures(features);\n\n if (this.adapter.adModule) {\n this.adAnalytics = new AdAnalytics(this, this.adapter.adModule);\n }\n\n this.checkForErrorsInConfig(config);\n }\n\n public getPlayerInformationFromAdapter() {\n const player = this.config.player || this.adapter.getPlayerName();\n return {\n player,\n version: player + '-' + this.adapter.getPlayerVersion(),\n playerTech: this.adapter.getPlayerTech(),\n };\n }\n\n public updateSamplesToCastClientConfig(samples: Sample[], castClientConfig: CastClientConfig) {\n for (const sample of samples) {\n this.updateSampleToCastClientConfig(sample, castClientConfig);\n }\n }\n\n public updateSampleToCastClientConfig(sample: Sample, castClientConfig: CastClientConfig) {\n const {config, userId, impressionId, domain, path, language, userAgent} = castClientConfig;\n sample.impressionId = impressionId;\n sample.userId = userId;\n sample.userAgent = userAgent;\n sample.domain = domain;\n sample.path = path;\n sample.language = language;\n\n this.setConfigParameters(sample, config);\n }\n\n public init() {\n if (\n this.adapter.supportsDeferredLicenseLoading !== true &&\n (this.config.key === '' || !Utils.validString(this.config.key))\n ) {\n logger.error('Invalid analytics license key provided');\n return;\n }\n\n logger.setLogging((this.config.debug as boolean) || false);\n\n this.featureManager.resetFeatures();\n this.backend = this.createBackend(this.config);\n this.videoStartupTime = 0;\n\n this.setConfigParameters();\n\n this.generateNewImpressionId();\n this.setUserId();\n\n if (this.adapter.videoCompletionTracker) {\n this.adapter.videoCompletionTracker.reset();\n }\n this.clearResetQualityChangeInterval();\n this.adapter.resetQualityChangeCount();\n }\n\n public release() {\n this.backend = new NoOpBackend();\n this.adAnalytics?.release();\n this.clearResetQualityChangeInterval();\n }\n\n public setConfigParameters(sample = this.sample, config = this.config) {\n sample.key = config.key;\n sample.playerKey = config.playerKey;\n if (config.player) {\n sample.player = config.player;\n }\n sample.domain = this.getDomainFromConfig(config) || Utils.sanitizePath(window.location.hostname);\n sample.cdnProvider = config.cdnProvider;\n sample.videoId = config.videoId;\n sample.videoTitle = config.title;\n sample.customUserId = config.userId != null ? config.userId : config.customUserId;\n\n Utils.transferCustomDataFields(config, sample);\n\n sample.experimentName = config.experimentName;\n }\n\n public generateNewImpressionId() {\n this.sample.impressionId = Utils.generateUUID();\n }\n\n public setUserId() {\n this.sample.userId = this.sessionHandler.userId;\n }\n\n public setupStateMachineCallbacks() {\n // All of these are called in the onLeaveState Method.\n // So it's the last sample\n this.adapter.stateMachineCallbacks.setup = (duration: number, state: string) => {\n logger.log(\n 'Setup bitmovin analytics ' + this.sample.analyticsVersion + ' with impressionId: ' + this.sample.impressionId\n );\n\n this.setDuration(duration);\n this.setState(state);\n this.playerStartupTime = this.sample.playerStartupTime = duration;\n\n if (window.performance && window.performance.timing) {\n const loadTime = Utils.getCurrentTimestamp() - window.performance.timing.navigationStart;\n this.pageLoadTime = this.sample.pageLoadTime = loadTime;\n }\n\n this.startupTime = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n\n this.sample.pageLoadTime = 0;\n };\n\n this.adapter.stateMachineCallbacks.startup = (duration: number, state: string) => {\n this.setDuration(duration);\n this.videoStartupTime = this.sample.videoStartupTime = duration;\n this.sample.supportedVideoCodecs = CodecHelper.supportedVideoFormats;\n this.setState(state);\n\n if (this.startupTime > 0) {\n this.startupTime += duration;\n }\n this.sample.startupTime = this.startupTime;\n this.autoplay = this.sample.autoplay = this.adapter.getAutoPlay();\n\n const drmPerformance = this.adapter.getDrmPerformanceInfo();\n if (drmPerformance != null) {\n this.sample.drmType = drmPerformance.drmType;\n this.sample.drmLoadTime = drmPerformance.drmLoadTime;\n }\n\n this.sendAnalyticsRequestAndClearValues();\n this.sample.autoplay = undefined;\n };\n\n this.adapter.stateMachineCallbacks.playing = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n this.sample.played = duration;\n this.setCompletionValues();\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.unload = (duration: number, state: string) => {\n let videoStartForClosedState = this.sample.videoTimeStart;\n if (state === 'playing') {\n this.setDuration(duration);\n this.setState(state);\n this.sample.played = duration;\n this.setCompletionValues();\n this.sendUnloadRequest();\n if (Utils.validNumber(this.sample.videoTimeEnd)) {\n videoStartForClosedState = this.sample.videoTimeEnd;\n }\n }\n\n if (this.videoStartupTime > 0) {\n this.setVideoTimeStart(videoStartForClosedState);\n this.setVideoTimeEnd(videoStartForClosedState);\n this.clearValues();\n this.setState('closed');\n this.sendUnloadRequest();\n }\n };\n\n this.adapter.stateMachineCallbacks.heartbeat = (\n duration: number,\n state: string,\n sampleData: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>\n ) => {\n this.setState(state);\n this.setDuration(duration);\n\n this.sample = {\n ...this.sample,\n ...sampleData,\n };\n\n if (state === 'playing') {\n this.setCompletionValues();\n }\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.qualitychange = (duration: number, state: string) => {\n this.sendQualityChange(state, duration);\n };\n\n this.adapter.stateMachineCallbacks.qualitychange_pause = (duration: number, state: string) => {\n this.sendQualityChange(state, duration);\n };\n\n this.adapter.stateMachineCallbacks.qualitychange_rebuffering = (duration: number, state: string) => {\n this.sendQualityChange(state, duration);\n };\n\n this.adapter.stateMachineCallbacks.videoChange = (event: any) => {\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent(event);\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.setPlaybackVideoPropertiesFromEvent(event);\n };\n\n this.adapter.stateMachineCallbacks.audioChange = (event: any) => {\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent(event);\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.setPlaybackAudioPropertiesFromEvent(event);\n };\n\n this.adapter.stateMachineCallbacks.audiotrack_changing = () => {\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.pause = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n\n this.sample.paused = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.paused_seeking = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n\n this.sample.seeked = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.end_play_seeking = (duration: number, state: string) => {\n this.setState(state);\n this.setDuration(duration);\n\n this.sample.seeked = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.rebuffering = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n\n this.sample.buffered = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.videoStartFailed = (\n event: Readonly<EventData.VideoStartFailedEvent>,\n sendRequest = true\n ) => {\n this.sample.videoStartFailed = true;\n this.sample.videoStartFailedReason = event.reason.reason;\n if (event.reason.errorCode != null) {\n this.sample.errorCode = event.reason.errorCode.code;\n this.sample.errorMessage = event.reason.errorCode.message;\n if (sendRequest) {\n this.onErrorDetailEventDispatcher.dispatch({\n ...event.reason.errorCode,\n });\n }\n }\n if (sendRequest) {\n this.sendAnalyticsRequestAndClearValues();\n }\n };\n\n this.adapter.stateMachineCallbacks.error = (event: Readonly<EventData.ErrorEvent>) => {\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent(event);\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n\n this.setState('error');\n this.sample.errorCode = event.code;\n this.sample.errorMessage = event.message;\n this.sample.errorData = JSON.stringify(event.legacyData);\n\n const segmentNames = this.adapter.segments.map((s) => s.name);\n this.sample.errorSegments = segmentNames;\n\n if (this.adapter.onError) {\n this.adapter.onError();\n }\n\n this.onErrorDetailEventDispatcher.dispatch({\n code: event.code,\n message: event.message,\n errorData: event.data,\n });\n this.sendAnalyticsRequestAndClearValues();\n\n delete this.sample.errorCode;\n delete this.sample.errorMessage;\n delete this.sample.errorData;\n };\n\n this.adapter.stateMachineCallbacks.ad = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n this.sample.ad = duration;\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.mute = () => {\n this.sample.isMuted = true;\n };\n\n this.adapter.stateMachineCallbacks.unMute = () => {\n this.sample.isMuted = false;\n };\n\n this.adapter.stateMachineCallbacks.subtitle_changing = () => {\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent = (event: any) => {\n if (Utils.validNumber(event.currentTime)) {\n this.setVideoTimeEnd(Utils.calculateTime(event.currentTime));\n }\n };\n\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent = (event: any) => {\n if (Utils.validNumber(event.currentTime)) {\n this.setVideoTimeStart(Utils.calculateTime(event.currentTime));\n }\n };\n\n this.adapter.stateMachineCallbacks.manualSourceChange = (event: {config: AnalyticsConfig}) => {\n this.adapter.resetSourceRelatedState();\n this.sample = this.setupSample();\n this.startupTime = 0;\n this.config = event.config ? event.config : this.config;\n this.init();\n };\n\n this.adapter.stateMachineCallbacks.playlistTransition = (event: EventData.AnalyticsEventBase) => {\n this.sample = this.setupSample();\n this.startupTime = 0;\n // init is needed because of resetting sequence number which\n // is done inside SequenceNumberBackend\n this.init();\n };\n\n this.adapter.stateMachineCallbacks.initialSourceChange = (event: {config: AnalyticsConfig}) => {\n this.config = event.config;\n this.setConfigParameters();\n };\n\n // The video has ended and we set up for a new impression\n this.adapter.stateMachineCallbacks.end = () => {\n this.sample = this.setupSample();\n this.startupTime = 0;\n this.init();\n };\n\n this.adapter.stateMachineCallbacks.release = () => {\n this.release();\n };\n\n this.adapter.stateMachineCallbacks.customdatachange = (\n duration?: number,\n state?: string,\n event?: {values: CustomDataValues}\n ) => {\n if (event && event.values) {\n this.changeCustomData(event.values);\n }\n };\n }\n\n public guardAgainstMissingVideoTitle = (oldConfig: AnalyticsConfig, newConfig: AnalyticsConfig) => {\n if (oldConfig && newConfig && oldConfig.title && !newConfig.title) {\n // TODO: Better description\n logger.error('The new analytics configuration does not contain the field title');\n }\n };\n\n public guardAgainstMissingIsLive = (oldConfig: AnalyticsConfig, newConfig: AnalyticsConfig) => {\n if (oldConfig != null && newConfig != null && oldConfig.isLive && newConfig.isLive == null) {\n logger.error(\n 'The new analytics configuration does not contain the field `isLive`. It will default to `false` which might be unintended? Once stream playback information is available the type will be populated.'\n );\n }\n };\n\n public sourceChange = (config: AnalyticsConfig) => {\n logger.log('Processing Source Change for Analytics', config);\n\n this.guardAgainstMissingVideoTitle(this.config, config);\n this.guardAgainstMissingIsLive(this.config, config);\n\n const newConfig = this.getMergedAnalyticsConfig(config);\n\n this.adapter.sourceChange(newConfig, Utils.getCurrentTimestamp());\n };\n\n public setCustomDataOnce = (values: CustomDataValues) => {\n const oldConfig = {...this.config};\n this.setState('customdatachange');\n this.changeCustomData(values);\n this.sendAnalyticsRequestAndClearValues();\n // this method doesn't call changeCustomData() second time because in that method we have check for null values\n // to prevent overriding existing customData values with null if some field in object doesn't have value\n // because of that if some customData field had previous value null and it got changed to something else\n // it will not be possible to return it back to null using that method\n this.config = {...oldConfig};\n this.setConfigParameters();\n };\n\n public setCustomData = (values: CustomDataValues) => {\n this.adapter.setCustomData(values);\n };\n\n public getCurrentImpressionId = (): string | undefined => {\n return this.sample.impressionId;\n };\n\n public getUserId = (): string => {\n return this.sessionHandler.userId;\n };\n\n public setDuration(duration: number) {\n this.sample.duration = duration;\n }\n\n public setState(state: string) {\n this.sample.state = state;\n }\n\n public setPlaybackVideoPropertiesFromEvent(event: any) {\n if (Utils.validNumber(event.width)) {\n this.sample.videoPlaybackWidth = event.width;\n }\n if (Utils.validNumber(event.height)) {\n this.sample.videoPlaybackHeight = event.height;\n }\n if (Utils.validNumber(event.bitrate)) {\n this.sample.videoBitrate = event.bitrate;\n }\n if (Utils.validString(event.codec)) {\n this.sample.videoCodec = event.codec;\n }\n }\n\n public setPlaybackAudioPropertiesFromEvent(event: any) {\n if (Utils.validNumber(event.bitrate)) {\n this.sample.audioBitrate = event.bitrate;\n }\n if (Utils.validString(event.codec)) {\n this.sample.audioCodec = event.codec;\n }\n }\n\n public setPlaybackInfoFromAdapter() {\n const info = this.adapter.getCurrentPlaybackInfo();\n if (!info) {\n return;\n }\n\n this.sample.isLive = this.getIsLiveFromConfigOrPlaybackInfo(this.config, info.isLive);\n\n if (Utils.validString(info.size)) {\n this.sample.size = info.size;\n }\n if (Utils.validString(info.playerTech)) {\n this.sample.playerTech = info.playerTech;\n }\n if (Utils.validNumber(info.videoDuration)) {\n this.sample.videoDuration = Utils.calculateTime(info.videoDuration || 0);\n }\n if (Utils.validString(info.streamFormat)) {\n this.sample.streamFormat = info.streamFormat;\n }\n if (Utils.validString(info.mpdUrl)) {\n this.sample.mpdUrl = info.mpdUrl;\n }\n if (Utils.validString(info.m3u8Url)) {\n this.sample.m3u8Url = info.m3u8Url;\n }\n if (Utils.validString(info.progUrl)) {\n this.sample.progUrl = info.progUrl;\n }\n if (Utils.validNumber(info.videoWindowWidth)) {\n this.sample.videoWindowWidth = info.videoWindowWidth;\n }\n if (Utils.validNumber(info.videoWindowHeight)) {\n this.sample.videoWindowHeight = info.videoWindowHeight;\n }\n if (Utils.validNumber(info.screenHeight)) {\n this.sample.screenHeight = info.screenHeight;\n }\n if (Utils.validNumber(info.screenWidth)) {\n this.sample.screenWidth = info.screenWidth;\n }\n if (Utils.validNumber(info.videoPlaybackHeight)) {\n this.sample.videoPlaybackHeight = info.videoPlaybackHeight;\n }\n if (Utils.validNumber(info.videoPlaybackWidth)) {\n this.sample.videoPlaybackWidth = info.videoPlaybackWidth;\n }\n if (Utils.validNumber(info.videoBitrate)) {\n this.sample.videoBitrate = info.videoBitrate;\n }\n if (Utils.validNumber(info.audioBitrate)) {\n this.sample.audioBitrate = info.audioBitrate;\n }\n if (Utils.validBoolean(info.isMuted)) {\n this.sample.isMuted = info.isMuted;\n }\n if (Utils.validBoolean(info.isCasting)) {\n this.sample.isCasting = info.isCasting;\n }\n if (Utils.validString(info.castTech)) {\n this.sample.castTech = info.castTech;\n }\n if (Utils.validString(info.videoTitle) && !this.config.title) {\n this.sample.videoTitle = info.videoTitle;\n }\n if (Utils.validString(info.audioCodec)) {\n this.sample.audioCodec = info.audioCodec;\n }\n if (Utils.validString(info.videoCodec)) {\n this.sample.videoCodec = info.videoCodec;\n }\n if (Utils.validString(info.audioLanguage)) {\n this.sample.audioLanguage = info.audioLanguage;\n }\n if (Utils.validBoolean(info.subtitleEnabled)) {\n this.sample.subtitleEnabled = info.subtitleEnabled;\n }\n if (Utils.validString(info.subtitleLanguage)) {\n this.sample.subtitleLanguage = info.subtitleLanguage;\n } else {\n this.sample.subtitleLanguage = undefined;\n }\n if (Utils.validNumber(info.droppedFrames)) {\n this.sample.droppedFrames = Math.max(info.droppedFrames - this.droppedSampleFrames, 0);\n this.droppedSampleFrames = info.droppedFrames;\n }\n }\n\n public setupSample(): Sample {\n this.droppedSampleFrames = 0;\n\n return {\n platform: 'web',\n playerStartupTime: 0,\n pageLoadType: Utils.getPageLoadType(),\n path: Utils.sanitizePath(window.location.pathname),\n language: navigator.language || (navigator as any).userLanguage,\n userAgent: navigator.userAgent,\n screenWidth: screen.width,\n screenHeight: screen.height,\n isLive: false,\n videoDuration: 0,\n size: PlayerSize.Window,\n time: 0,\n videoWindowWidth: 0,\n videoWindowHeight: 0,\n droppedFrames: 0,\n played: 0,\n buffered: 0,\n paused: 0,\n ad: 0,\n seeked: 0,\n videoPlaybackWidth: 0,\n videoPlaybackHeight: 0,\n videoBitrate: 0,\n audioBitrate: 0,\n videoTimeStart: 0,\n videoTimeEnd: 0,\n videoStartupTime: 0,\n duration: 0,\n startupTime: 0,\n analyticsVersion: VERSION,\n pageLoadTime: 0,\n completedTotal: 0,\n ...this.getPlayerInformationFromAdapter(),\n };\n }\n\n public sendAnalyticsRequest() {\n this.setPlaybackInfoFromAdapter();\n this.sample.time = Utils.getCurrentTimestamp();\n this.sample.downloadSpeedInfo = this.adapter.downloadSpeedInfo;\n\n const copySample = {...this.sample};\n this.backend.sendRequest(copySample);\n }\n\n public sendAnalyticsRequestAndClearValues() {\n this.sendAnalyticsRequest();\n this.clearValues();\n }\n\n public sendUnloadRequest() {\n this.backend.sendUnloadRequest(this.sample);\n }\n\n public sendAnalyticsRequestSynchronous() {\n this.backend.sendRequestSynchronous(this.sample);\n }\n\n public clearValues() {\n this.sample.ad = 0;\n this.sample.paused = 0;\n this.sample.played = 0;\n this.sample.seeked = 0;\n this.sample.buffered = 0;\n\n this.sample.playerStartupTime = 0;\n this.sample.videoStartupTime = 0;\n this.sample.startupTime = 0;\n this.sample.castTech = undefined;\n\n this.sample.duration = 0;\n this.sample.droppedFrames = 0;\n\n this.sample.drmLoadTime = undefined;\n\n this.sample.videoStartFailed = undefined;\n this.sample.videoStartFailedReason = undefined;\n\n this.sample.completed = undefined;\n this.adapter.clearValues();\n }\n\n public getIsLiveFromConfigOrPlaybackInfo(config: AnalyticsConfig, isLiveFromPlayback?: boolean): boolean {\n if (isLiveFromPlayback == null) {\n return config.isLive || false;\n }\n return Utils.validBoolean(isLiveFromPlayback) ? isLiveFromPlayback : false;\n }\n\n public getMergedCollectorConfig(newConfig: AnalyticsConfig, oldConfig = this.config) {\n let mergedCollectorConfig = (oldConfig || {}).config;\n if (newConfig != null) {\n mergedCollectorConfig = {...mergedCollectorConfig, enabled: true, ...newConfig.config};\n }\n return mergedCollectorConfig;\n }\n\n public getMergedAnalyticsConfig(newConfig: AnalyticsConfig, oldConfig = this.config): AnalyticsConfig {\n const mergedCollectorConfig = this.getMergedCollectorConfig(newConfig, oldConfig);\n const mergedConfig = {\n ...oldConfig,\n ...newConfig,\n ...{config: mergedCollectorConfig},\n };\n return mergedConfig;\n }\n\n /**\n * This method sanitizes the input and updates the analytics config.\n * @param values Object containing the customData and other fields\n */\n private changeCustomData = (values: CustomDataValues) => {\n const filterValuesFromHash = (input: CustomDataValues) => {\n const retVal: CustomDataValues = {};\n customDataValuesKeys.forEach((key) => {\n if (input[key]) {\n retVal[key] = input[key];\n }\n });\n return retVal;\n };\n\n this.config = {\n ...this.config,\n ...filterValuesFromHash(values),\n };\n this.setConfigParameters();\n };\n\n private buildDefaultAnalyticsConfigValues(config: AnalyticsConfig): AnalyticsConfig {\n if (!Utils.validBoolean(config.isLive)) {\n config.isLive = false;\n }\n return config;\n }\n\n private checkForErrorsInConfig(config: AnalyticsConfig) {\n if (config.customUserId != null && config.userId != null) {\n logger.warning(\n 'Configuration Warning: \\nCustomUserId and UserId are set in the config \\nValue of UserId will be used in sample \\nPlease only use one configuartion field to set your userId'\n );\n }\n }\n\n private getDomainFromConfig(config: AnalyticsConfig) {\n const collectorConfig = config.config;\n return collectorConfig != null && collectorConfig.origin != null ? collectorConfig.origin : undefined;\n }\n\n private createBackend(config: AnalyticsConfig): Backend {\n const domain = this.getDomain(config);\n return this.backendFactory.createBackend(\n config,\n {key: config.key, domain, version: VERSION},\n this.adapter,\n this.authenticationCallback\n );\n }\n\n private getDomain(config: AnalyticsConfig) {\n const domainFromConfig = this.getDomainFromConfig(config);\n return domainFromConfig || Utils.sanitizePath(window.location.hostname);\n }\n\n private setCompletionValues() {\n if (this.adapter.videoCompletionTracker) {\n const completed = this.adapter.videoCompletionTracker.addWatched({\n start: this.sample.videoTimeStart,\n end: this.sample.videoTimeEnd,\n } as Timespan);\n const completedTotal = this.adapter.videoCompletionTracker.getCompletionPercentage();\n\n if (!Number.isNaN(completed) && !Number.isNaN(completedTotal)) {\n this.sample.completed = completed;\n this.sample.completedTotal = completedTotal;\n }\n }\n }\n\n private setVideoTimeStart(value: number | undefined) {\n this.sample.videoTimeStart = value;\n }\n\n private setVideoTimeEnd(value: number | undefined) {\n this.sample.videoTimeEnd = value;\n }\n\n private sendQualityChange(state: string, duration: number): void {\n if (this.resetQualityChangeCountIntervalId == null) {\n this.resetQualityChangeCountIntervalId = window.setInterval(() => {\n this.adapter.resetQualityChangeCount();\n }, Settings.ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL);\n }\n\n this.adapter.increaseQualityChangeCount();\n if (!this.adapter.isQualityChangeEventEnabled()) {\n this.setDuration(duration);\n this.adapter.stateMachineCallbacks.error({\n ...ErrorCode.QUALITY_CHANGE_THRESHOLD_EXCEEDED,\n legacyData: undefined,\n currentTime: undefined,\n data: {\n /*TODO additionalData: 'Add description for this error'*/\n },\n });\n } else {\n this.setDuration(duration);\n this.setState(state);\n this.sendAnalyticsRequestAndClearValues();\n }\n }\n\n private clearResetQualityChangeInterval() {\n if (this.resetQualityChangeCountIntervalId != null) {\n window.clearInterval(this.resetQualityChangeCountIntervalId);\n delete this.resetQualityChangeCountIntervalId;\n }\n }\n}\n","import {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {CustomDataValues} from '../types/CustomDataValues';\nimport {logger} from '../utils/Logger';\nimport {InternalAdapterAPI} from './internal/InternalAdapterAPI';\n\nexport abstract class Adapter {\n protected analytics!: Analytics;\n protected internalAdapter!: InternalAdapterAPI;\n\n public getCurrentImpressionId(): string | undefined {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n return this.analytics.getCurrentImpressionId();\n }\n\n public getUserId(): string | undefined {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return undefined;\n }\n return this.analytics.getUserId();\n }\n\n public setCustomData(values: CustomDataValues) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.internalAdapter.setCustomData(values);\n }\n\n public setCustomDataOnce(values: CustomDataValues) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.analytics.setCustomDataOnce(values);\n }\n\n public sourceChange(config: AnalyticsConfig) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.analytics.sourceChange(config);\n }\n\n // Checks if analytics is already initialized on this player instance\n protected hasPlayerAlreadyBeenAugmented(player): boolean {\n return (player as any).__bitmovinAnalyticsHasBeenSetup;\n }\n // Marks the player instance as already instrumented by analytics\n protected markPlayerInstanceAsAugmented(player) {\n (player as any).__bitmovinAnalyticsHasBeenSetup = true;\n }\n\n private guardAgainstNotInitializedAnalytics(): boolean {\n if (!this.analytics) {\n logger.log(\"Bitmovin Analytics: Adapter hasn't been initialized yet\");\n return false;\n }\n return true;\n }\n}\n","export const MESSAGE_NAMESPACE = 'urn:x-cast:com.bitmovin.analytics.cast';\nexport const ANALYTICS_BACKEND_BASE_URL = 'https://analytics-ingress-global.bitmovin.com';\n\nexport const ANALYTICS_LICENSECALL_TIMEOUT = 1000 * 60;\nexport const ANALYTICS_VIDEOSTART_TIMEOUT = 1000 * 60; // in milliseconds\n\nexport const ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD = 50;\nexport const ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL = 60 * 60 * 1000;\n\n/**\n * Time (in milliseconds) of consecutive buffering until a REBUFFER_TIMEOUT_ERROR is raised.\n */\nexport const ANALYTICS_REBUFFER_TIMEOUT = 1000 * 60 * 2;\n\n/**\n * minimal time (in seconds) a seek event should have in order to be recogniced as seek\n */\nexport const ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD = 3;\n","import {CollectorConfig} from '../../types/AnalyticsConfig';\nimport {post} from '../../utils/Http';\nimport {ANALYTICS_BACKEND_BASE_URL} from '../../utils/Settings';\nimport {joinUrls} from '../../utils/Utils';\nimport {HttpRequest} from '../httprequesttracking/HttpRequest';\nimport {ErrorData} from './ErrorData';\nimport {ErrorDetail} from './ErrorDetail';\n\nexport class ErrorDetailBackend {\n public get queue(): ReadonlyArray<ErrorDetail> {\n return this._queue;\n }\n\n public get enabled(): boolean {\n return this._enabled;\n }\n\n public set enabled(value: boolean) {\n this._enabled = value;\n }\n\n public static copyErrorDetailTruncateStringsAndUrls(\n errorDetail: ErrorDetail,\n maxStringLength: number,\n maxUrlLength: number\n ): ErrorDetail {\n return {\n ...errorDetail,\n message: errorDetail.message?.substr(0, maxStringLength),\n data: this.copyErrorDataTruncateStrings(errorDetail.data, maxStringLength),\n httpRequests: errorDetail.httpRequests?.map((request) => this.copyHttpRequestTruncateUrls(request, maxUrlLength)),\n };\n }\n\n public static copyHttpRequestTruncateUrls(httpRequest: HttpRequest, maxLength: number): HttpRequest {\n return {\n ...httpRequest,\n url: httpRequest.url?.substr(0, maxLength),\n lastRedirectLocation: httpRequest.lastRedirectLocation?.substr(0, maxLength),\n };\n }\n\n public static copyErrorDataTruncateStrings(errorData: ErrorData, maxStringLength: number): ErrorData {\n return {\n ...errorData,\n exceptionMessage: errorData.exceptionMessage?.substr(0, maxStringLength),\n additionalData: errorData.additionalData?.substr(0, maxStringLength),\n };\n }\n\n public static copyErrorDetailTruncateHttpRequests(errorDetail: ErrorDetail, maxRequests: number): ErrorDetail {\n return {\n ...errorDetail,\n httpRequests: errorDetail.httpRequests?.slice(-maxRequests),\n };\n }\n\n private static MAX_URL_LENGTH = 200;\n private static MAX_STRING_LENGTH = 400;\n\n private readonly backendUrl: string;\n private readonly _queue: ErrorDetail[] = [];\n private _enabled: boolean = false;\n\n constructor(collectorConfig: CollectorConfig | undefined) {\n this.backendUrl = joinUrls(collectorConfig?.backendUrl ?? ANALYTICS_BACKEND_BASE_URL, '/analytics/error');\n }\n\n public limitHttpRequestsOfQueuedErrorDetails(max: number) {\n this._queue.forEach((value, index) => {\n this._queue[index] = ErrorDetailBackend.copyErrorDetailTruncateHttpRequests(value, max);\n });\n }\n\n public send(errorDetail: ErrorDetail) {\n const errorDetailCopy = ErrorDetailBackend.copyErrorDetailTruncateStringsAndUrls(\n errorDetail,\n ErrorDetailBackend.MAX_STRING_LENGTH,\n ErrorDetailBackend.MAX_URL_LENGTH\n );\n if (this.enabled) {\n post(this.backendUrl, errorDetailCopy, () => {});\n } else {\n this._queue.push(errorDetailCopy);\n }\n }\n\n public flush() {\n const copy = [...this._queue];\n let element = copy.shift();\n while (element != null) {\n this.removeFromQueue(element);\n this.send(element);\n element = copy.shift();\n }\n }\n\n public clear() {\n this._queue.splice(0, this._queue.length);\n }\n\n private removeFromQueue(element: ErrorDetail) {\n const index = this._queue.findIndex((value) => value === element);\n if (index >= 0) {\n this._queue.splice(index, 1);\n }\n }\n}\n","import {Subscribable} from '../../core/EventDispatcher';\nimport {CollectorConfig} from '../../types/AnalyticsConfig';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {logger} from '../../utils/Logger';\nimport {getCurrentTimestamp} from '../../utils/Utils';\nimport {VERSION} from '../../Version';\nimport {Feature} from '../Feature';\nimport {HttpRequestTracking} from '../httprequesttracking/HttpRequestTracking';\nimport {ErrorDetail} from './ErrorDetail';\nimport {ErrorDetailBackend} from './ErrorDetailBackend';\nimport {ErrorDetailTrackingConfig} from './ErrorDetailTrackingConfig';\nimport {OnErrorDetailEventObject} from './OnErrorDetailEventObject';\n\nexport interface ErrorDetailTrackingSettingsProvider {\n readonly licenseKey: string;\n readonly domain: string;\n readonly impressionId: string;\n readonly collectorConfig?: CollectorConfig;\n}\n\nexport class ErrorDetailTracking extends Feature<FeatureConfigContainer, ErrorDetailTrackingConfig> {\n private errorIndex = 0;\n\n constructor(\n private settingsProvider: ErrorDetailTrackingSettingsProvider,\n private backend: ErrorDetailBackend,\n private subscribables: Array<Subscribable<OnErrorDetailEventObject>>,\n private httpRequestTracking: HttpRequestTracking | undefined\n ) {\n super();\n subscribables.forEach((subscribable) => subscribable.subscribe(this.onErrorHandler));\n }\n\n public reset(): void {\n this.httpRequestTracking?.reset();\n this.errorIndex = 0;\n }\n\n public enabled(): void {\n this.backend.enabled = true;\n this.backend.flush();\n }\n\n public disabled(): void {\n this.errorIndex = 0;\n this.httpRequestTracking?.disable();\n this.backend.clear();\n this.subscribables.forEach((subscribable) => subscribable.unsubscribe(this.onErrorHandler));\n }\n\n public configured(authenticated: boolean, config?: ErrorDetailTrackingConfig): void {\n const maxRequests = Math.max(config?.numberOfHttpRequests ?? 0, 0);\n this.httpRequestTracking?.configure(maxRequests);\n this.backend.limitHttpRequestsOfQueuedErrorDetails(maxRequests);\n }\n\n public extractConfig(configContainer: FeatureConfigContainer): ErrorDetailTrackingConfig | undefined {\n return configContainer.errorDetails;\n }\n\n private onErrorHandler = (event: OnErrorDetailEventObject) => {\n try {\n if (!this.isEnabled) {\n return;\n }\n\n const httpRequests = this.httpRequestTracking?.httpRequests;\n const httpRequestsCopy = httpRequests == null ? undefined : [...httpRequests];\n const errorIndex = this.errorIndex;\n this.errorIndex++;\n\n const errorDetail: ErrorDetail = {\n platform: 'web',\n licenseKey: this.settingsProvider.licenseKey,\n domain: this.settingsProvider.domain,\n impressionId: this.settingsProvider.impressionId,\n analyticsVersion: VERSION,\n errorId: errorIndex,\n timestamp: getCurrentTimestamp(),\n code: event.code,\n message: event.message,\n data: event.errorData ?? {\n additionalData: undefined,\n exceptionMessage: undefined,\n exceptionStacktrace: undefined,\n },\n httpRequests: httpRequestsCopy,\n };\n\n logger.log(`ErrorDetailTracking.onError: ${JSON.stringify(errorDetail)}`);\n this.backend.send(errorDetail);\n } catch (error) {\n logger.error(`ErrorDetailTracking.onError: Error in handler`, error);\n }\n };\n}\n","import {endsWith} from '../utils/Utils';\n\nconst MP4 = 'video/mp4';\nconst WEBM = 'video/webm';\nconst HLS = 'application/x-mpegURL';\nconst DASH = 'application/dash+xml';\n\n// tslint:disable-next-line:variable-name\nexport const MIMETypes = {\n MP4,\n WEBM,\n HLS,\n DASH,\n};\n\nexport function getMIMETypeFromFileExtension(path: string): string | undefined {\n path = path.split(/[?#]/)[0].toLowerCase();\n\n if (endsWith(path, '.m3u8')) {\n return HLS;\n }\n if (endsWith(path, '.mp4') || endsWith(path, '.m4v') || endsWith(path, '.m4a')) {\n return MP4;\n }\n if (endsWith(path, '.webm')) {\n return WEBM;\n }\n if (endsWith(path, '.mpd')) {\n return DASH;\n }\n}\n","export enum PlayerSize {\n Window = 'WINDOW',\n Fullscreen = 'FULLSCREEN',\n}\n","import {AnalyticsStateMachine} from '../../analyticsStateMachines/AnalyticsStateMachine';\nimport {EventDispatcher} from '../../core/EventDispatcher';\nimport {Event, EventMap} from '../../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {CustomDataValues} from '../../types/CustomDataValues';\nimport {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {NoExtraProperties} from '../../types/NoExtraProperties';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport {defaultStateMachineCallbacks, StateMachineCallbacks} from '../../types/StateMachineCallbacks';\nimport {logger} from '../../utils/Logger';\nimport {ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD} from '../../utils/Settings';\nimport {getCurrentTimestamp} from '../../utils/Utils';\nimport {WindowEventTracker} from '../../utils/WindowEventTracker';\n\n/**\n * Audio volume below this delta is considered zero.\n */\nconst volumeDelta = 0.01;\n\nexport abstract class InternalAdapter {\n public stateMachineCallbacks: StateMachineCallbacks = {...defaultStateMachineCallbacks};\n // tslint:enable:no-unused-expression\n protected stateMachine!: AnalyticsStateMachine;\n\n protected opts: AnalyticsStateMachineOptions;\n protected _onLicenseKeyReceived: EventDispatcher<{licenseKey: string}> = new EventDispatcher();\n protected _onLicenseCallFailed: EventDispatcher<{}> = new EventDispatcher();\n\n protected drmPerformanceInfo: DrmPerformanceInfo | undefined = undefined;\n protected previousVideoBitrate: number = 0;\n protected previousAudioBitrate: number = 0;\n protected qualityChangeCount: number = 0;\n protected abstract get currentTime(): number;\n\n private _windowEventTracker: WindowEventTracker = new WindowEventTracker();\n\n get windowEventTracker(): WindowEventTracker {\n return this._windowEventTracker;\n }\n\n get onLicenseKeyReceived() {\n return this._onLicenseKeyReceived;\n }\n\n get onLicenseCallFailed() {\n return this._onLicenseCallFailed;\n }\n\n get downloadSpeedInfo(): DownloadSpeedInfo {\n return {\n segmentsDownloadCount: 0,\n segmentsDownloadSize: 0,\n segmentsDownloadTime: 0,\n avgDownloadSpeed: 0,\n minDownloadSpeed: 0,\n maxDownloadSpeed: 0,\n avgTimeToFirstByte: 0,\n };\n }\n\n get segments(): SegmentInfo[] {\n return [];\n }\n\n constructor(opts?: AnalyticsStateMachineOptions) {\n if (!opts) {\n opts = {\n starttime: undefined,\n };\n }\n if (!opts.starttime) {\n opts.starttime = getCurrentTimestamp();\n }\n\n this.opts = opts;\n }\n\n public release() {\n this.stateMachine.resetIntervals();\n this.stateMachineCallbacks.release();\n this.resetSourceRelatedState();\n this._windowEventTracker.release();\n }\n\n public eventCallback = <StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>\n ) => {\n eventObject = eventObject || {};\n if (!this.stateMachine) {\n logger.log(\"Bitmovin Analytics: StateMachine isn't ready yet\");\n } else {\n this.stateMachine.callEvent(eventType, eventObject, getCurrentTimestamp());\n }\n };\n\n public getCommonPlaybackInfo() {\n return {\n screenHeight: screen.height,\n screenWidth: screen.width,\n };\n }\n\n public clearValues(): void {\n // noop by default\n }\n\n public clearSegments(): void {\n // noop by default\n }\n\n public increaseQualityChangeCount(): void {\n this.qualityChangeCount++;\n }\n\n public resetQualityChangeCount(): void {\n this.qualityChangeCount = 0;\n }\n\n public resetSourceRelatedState(): void {\n this.drmPerformanceInfo = undefined;\n }\n\n public isQualityChangeEventEnabled(): boolean {\n return this.qualityChangeCount <= ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD;\n }\n\n public setCustomData(values: CustomDataValues): void {\n const previousState = this.stateMachine.currentState;\n\n if (\n this.stateMachine.currentState &&\n (this.stateMachine.currentState === 'PAUSE' || this.stateMachine.currentState === 'PLAYING')\n ) {\n this.eventCallback(Event.CUSTOM_DATA_CHANGE, {\n currentTime: this.currentTime,\n });\n this.eventCallback(Event[previousState], {\n values,\n currentTime: this.currentTime,\n });\n } else {\n this.stateMachineCallbacks.customdatachange(undefined, undefined, {values});\n }\n }\n\n protected shouldAllowVideoQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousVideoBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n protected setPreviousVideoBitrate(newBitrate: number): void {\n this.previousVideoBitrate = newBitrate;\n }\n\n protected shouldAllowAudioQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousAudioBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n protected setPreviousAudioBitrate(newBitrate: number): void {\n this.previousAudioBitrate = newBitrate;\n }\n\n protected isAudioMuted(playerIsMuted: boolean, currentVolume: number): boolean {\n return playerIsMuted || currentVolume < volumeDelta;\n }\n}\n","export class ErrorCode {\n public static BITMOVIN_PLAYER_LICENSING_ERROR = new ErrorCode(1103, '');\n public static SETUP_MISSING_LICENSE_WHITELIST = new ErrorCode(1105, '');\n public static QUALITY_CHANGE_THRESHOLD_EXCEEDED = new ErrorCode(10000, 'ANALYTICS_QUALITY_CHANGE_THRESHOLD_EXCEEDED');\n public static BUFFERING_TIMEOUT_REACHED = new ErrorCode(10001, 'ANALYTICS_BUFFERING_TIMEOUT_REACHED');\n public static VIDEO_STARTUP_TIMEOUT_REACHED = new ErrorCode(10002, 'ANALYTICS_VIDEOSTART_TIMEOUT_REACHED');\n\n private constructor(public readonly code: number, public readonly message: string) {}\n}\n","/*\n\n Javascript State Machine Library - https://github.com/jakesgordon/javascript-state-machine\n\n Copyright (c) 2012, 2013, 2014, 2015, Jake Gordon and contributors\n Released under the MIT license - https://github.com/jakesgordon/javascript-state-machine/blob/master/LICENSE\n\n*/\n\n(function () {\n\n var StateMachine = {\n\n //---------------------------------------------------------------------------\n\n VERSION: \"2.4.0\",\n\n //---------------------------------------------------------------------------\n\n Result: {\n SUCCEEDED: 1, // the event transitioned successfully from one state to another\n NOTRANSITION: 2, // the event was successfull but no state transition was necessary\n CANCELLED: 3, // the event was cancelled by the caller in a beforeEvent callback\n PENDING: 4 // the event is asynchronous and the caller is in control of when the transition occurs\n },\n\n Error: {\n INVALID_TRANSITION: 100, // caller tried to fire an event that was innapropriate in the current state\n PENDING_TRANSITION: 200, // caller tried to fire an event while an async transition was still pending\n INVALID_CALLBACK: 300 // caller provided callback function threw an exception\n },\n\n WILDCARD: '*',\n ASYNC: 'async',\n\n //---------------------------------------------------------------------------\n\n create: function(cfg, target) {\n\n var initial = (typeof cfg.initial == 'string') ? { state: cfg.initial } : cfg.initial; // allow for a simple string, or an object with { state: 'foo', event: 'setup', defer: true|false }\n var terminal = cfg.terminal || cfg['final'];\n var fsm = target || cfg.target || {};\n var events = cfg.events || [];\n var callbacks = cfg.callbacks || {};\n var map = {}; // track state transitions allowed for an event { event: { from: [ to ] } }\n var transitions = {}; // track events allowed from a state { state: [ event ] }\n\n var add = function(e) {\n var from = Array.isArray(e.from) ? e.from : (e.from ? [e.from] : [StateMachine.WILDCARD]); // allow 'wildcard' transition if 'from' is not specified\n map[e.name] = map[e.name] || {};\n for (var n = 0 ; n < from.length ; n++) {\n transitions[from[n]] = transitions[from[n]] || [];\n transitions[from[n]].push(e.name);\n\n map[e.name][from[n]] = e.to || from[n]; // allow no-op transition if 'to' is not specified\n }\n if (e.to)\n transitions[e.to] = transitions[e.to] || [];\n };\n\n if (initial) {\n initial.event = initial.event || 'startup';\n add({ name: initial.event, from: 'none', to: initial.state });\n }\n\n for(var n = 0 ; n < events.length ; n++)\n add(events[n]);\n\n for(var name in map) {\n if (map.hasOwnProperty(name))\n fsm[name] = StateMachine.buildEvent(name, map[name]);\n }\n\n for(var name in callbacks) {\n if (callbacks.hasOwnProperty(name))\n fsm[name] = callbacks[name]\n }\n\n fsm.current = 'none';\n fsm.is = function(state) { return Array.isArray(state) ? (state.indexOf(this.current) >= 0) : (this.current === state); };\n fsm.can = function(event) { return !this.transition && (map[event] !== undefined) && (map[event].hasOwnProperty(this.current) || map[event].hasOwnProperty(StateMachine.WILDCARD)); }\n fsm.cannot = function(event) { return !this.can(event); };\n fsm.transitions = function() { return (transitions[this.current] || []).concat(transitions[StateMachine.WILDCARD] || []); };\n fsm.isFinished = function() { return this.is(terminal); };\n fsm.error = cfg.error || function(name, from, to, args, error, msg, e) { throw e || msg; }; // default behavior when something unexpected happens is to throw an exception, but caller can override this behavior if desired (see github issue #3 and #17)\n fsm.states = function() { return Object.keys(transitions).sort() };\n\n if (initial && !initial.defer)\n fsm[initial.event]();\n\n return fsm;\n\n },\n\n //===========================================================================\n\n doCallback: function(fsm, func, name, from, to, args) {\n if (func) {\n try {\n return func.apply(fsm, [name, from, to].concat(args));\n }\n catch(e) {\n return fsm.error(name, from, to, args, StateMachine.Error.INVALID_CALLBACK, \"an exception occurred in a caller-provided callback function\", e);\n }\n }\n },\n\n beforeAnyEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onbeforeevent'], name, from, to, args); },\n afterAnyEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onafterevent'] || fsm['onevent'], name, from, to, args); },\n leaveAnyState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onleavestate'], name, from, to, args); },\n enterAnyState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onenterstate'] || fsm['onstate'], name, from, to, args); },\n changeState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onchangestate'], name, from, to, args); },\n\n beforeThisEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onbefore' + name], name, from, to, args); },\n afterThisEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onafter' + name] || fsm['on' + name], name, from, to, args); },\n leaveThisState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onleave' + from], name, from, to, args); },\n enterThisState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onenter' + to] || fsm['on' + to], name, from, to, args); },\n\n beforeEvent: function(fsm, name, from, to, args) {\n if ((false === StateMachine.beforeThisEvent(fsm, name, from, to, args)) ||\n (false === StateMachine.beforeAnyEvent( fsm, name, from, to, args)))\n return false;\n },\n\n afterEvent: function(fsm, name, from, to, args) {\n StateMachine.afterThisEvent(fsm, name, from, to, args);\n StateMachine.afterAnyEvent( fsm, name, from, to, args);\n },\n\n leaveState: function(fsm, name, from, to, args) {\n var specific = StateMachine.leaveThisState(fsm, name, from, to, args),\n general = StateMachine.leaveAnyState( fsm, name, from, to, args);\n if ((false === specific) || (false === general))\n return false;\n else if ((StateMachine.ASYNC === specific) || (StateMachine.ASYNC === general))\n return StateMachine.ASYNC;\n },\n\n enterState: function(fsm, name, from, to, args) {\n StateMachine.enterThisState(fsm, name, from, to, args);\n StateMachine.enterAnyState( fsm, name, from, to, args);\n },\n\n //===========================================================================\n\n buildEvent: function(name, map) {\n return function() {\n\n var from = this.current;\n var to = map[from] || (map[StateMachine.WILDCARD] != StateMachine.WILDCARD ? map[StateMachine.WILDCARD] : from) || from;\n var args = Array.prototype.slice.call(arguments); // turn arguments into pure array\n\n if (this.transition)\n return this.error(name, from, to, args, StateMachine.Error.PENDING_TRANSITION, \"event \" + name + \" inappropriate because previous transition did not complete\");\n\n if (this.cannot(name))\n return this.error(name, from, to, args, StateMachine.Error.INVALID_TRANSITION, \"event \" + name + \" inappropriate in current state \" + this.current);\n\n if (false === StateMachine.beforeEvent(this, name, from, to, args))\n return StateMachine.Result.CANCELLED;\n\n if (from === to) {\n StateMachine.afterEvent(this, name, from, to, args);\n return StateMachine.Result.NOTRANSITION;\n }\n\n // prepare a transition method for use EITHER lower down, or by caller if they want an async transition (indicated by an ASYNC return value from leaveState)\n var fsm = this;\n this.transition = function() {\n fsm.transition = null; // this method should only ever be called once\n fsm.current = to;\n StateMachine.enterState( fsm, name, from, to, args);\n StateMachine.changeState(fsm, name, from, to, args);\n StateMachine.afterEvent( fsm, name, from, to, args);\n return StateMachine.Result.SUCCEEDED;\n };\n this.transition.cancel = function() { // provide a way for caller to cancel async transition if desired (issue #22)\n fsm.transition = null;\n StateMachine.afterEvent(fsm, name, from, to, args);\n }\n\n var leave = StateMachine.leaveState(this, name, from, to, args);\n if (false === leave) {\n this.transition = null;\n return StateMachine.Result.CANCELLED;\n }\n else if (StateMachine.ASYNC === leave) {\n return StateMachine.Result.PENDING;\n }\n else {\n if (this.transition) // need to check in case user manually called transition() but forgot to return StateMachine.ASYNC\n return this.transition();\n }\n\n };\n }\n\n }; // StateMachine\n\n //===========================================================================\n\n //======\n // NODE\n //======\n if (typeof exports !== 'undefined') {\n if (typeof module !== 'undefined' && module.exports) {\n exports = module.exports = StateMachine;\n }\n exports.StateMachine = StateMachine;\n }\n //============\n // AMD/REQUIRE\n //============\n else if (typeof define === 'function' && define.amd) {\n define(function(require) { return StateMachine; });\n }\n //========\n // BROWSER\n //========\n else if (typeof window !== 'undefined') {\n window.StateMachine = StateMachine;\n }\n //===========\n // WEB WORKER\n //===========\n else if (typeof self !== 'undefined') {\n self.StateMachine = StateMachine;\n }\n\n}());\n","import {ErrorCode} from '../enums/ErrorCode';\nimport {Event, EventMap} from '../enums/Event';\nimport {VideoStartFailedReason} from '../enums/VideoStartFailedReason';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport * as ErrorData from '../types/EventData';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport * as Settings from '../utils/Settings';\nimport * as Utils from '../utils/Utils';\n\nconst REBUFFERING_HEARTBEAT_INTERVALS = [3000, 5000, 10000, 30000, 59700];\n\nexport abstract class AnalyticsStateMachine {\n protected stateMachine: StateMachine.StateMachine & {[key: string]: any};\n protected onEnterStateTimestamp: number = 0;\n\n protected readonly videoStartupTimeoutMs: number = Settings.ANALYTICS_VIDEOSTART_TIMEOUT;\n protected readonly rebufferTimeoutMs: number = Settings.ANALYTICS_REBUFFER_TIMEOUT;\n\n private rebufferingHeartbeatIntervalHandle?: number;\n private currentRebufferingIntervalIndex: number = 0;\n private rebufferingTimeoutHandle?: number;\n private videoStartTimeout?: number;\n\n constructor(protected stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n this.stateMachine = this.createStateMachine(opts);\n }\n\n public abstract createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine.StateMachine;\n public abstract callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void;\n public abstract sourceChange(config: any, timestamp: number, currentTime?: number): void;\n\n public get currentState(): string {\n return this.stateMachine.current;\n }\n\n public resetIntervals() {\n this.clearVideoStartTimeout();\n this.clearRebufferingTimeoutHandle(true);\n this.clearRebufferingHeartbeatHandle();\n }\n\n //#region rebuffer timeout\n\n protected startRebufferingHeartbeatInterval(reset: boolean = true) {\n this.resetRebufferingHelpers(reset);\n\n this.startRebufferingTimeoutHandle();\n\n this.rebufferingHeartbeatIntervalHandle = window.setInterval(() => {\n if (this.stateMachine.current.toLowerCase() !== 'rebuffering') {\n this.resetRebufferingHelpers();\n return;\n }\n const timestamp = new Date().getTime();\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n this.stateMachineCallbacks.heartbeat(stateDuration, this.stateMachine.current.toLowerCase(), {\n buffered: stateDuration,\n });\n this.onEnterStateTimestamp = timestamp;\n this.currentRebufferingIntervalIndex = Math.min(\n this.currentRebufferingIntervalIndex + 1,\n REBUFFERING_HEARTBEAT_INTERVALS.length - 1\n );\n this.startRebufferingHeartbeatInterval(false);\n }, REBUFFERING_HEARTBEAT_INTERVALS[this.currentRebufferingIntervalIndex]);\n }\n\n protected resetRebufferingHelpers(reset: boolean = true) {\n if (reset) {\n this.currentRebufferingIntervalIndex = 0;\n }\n this.clearRebufferingHeartbeatHandle();\n this.clearRebufferingTimeoutHandle(reset);\n }\n\n protected clearRebufferingHeartbeatHandle() {\n if (this.rebufferingHeartbeatIntervalHandle != null) {\n window.clearInterval(this.rebufferingHeartbeatIntervalHandle);\n this.rebufferingHeartbeatIntervalHandle = undefined;\n }\n }\n\n protected startRebufferingTimeoutHandle() {\n if (this.currentRebufferingIntervalIndex > 0) {\n return;\n }\n this.rebufferingTimeoutHandle = window.setTimeout(() => {\n this.callEvent(\n Event.ERROR,\n {\n ...ErrorCode.BUFFERING_TIMEOUT_REACHED,\n data: {\n additionalData: `StateMachine timed out after ${this.rebufferTimeoutMs} ms of consecutive buffering.`,\n },\n },\n Utils.getCurrentTimestamp()\n );\n this.stateMachineCallbacks.release();\n }, this.rebufferTimeoutMs);\n }\n\n protected clearRebufferingTimeoutHandle(reset: boolean) {\n if (reset && this.rebufferingTimeoutHandle != null) {\n window.clearTimeout(this.rebufferingTimeoutHandle);\n this.rebufferingTimeoutHandle = undefined;\n }\n }\n //#endregion\n\n //#region videoStartupFailed\n\n protected getVideoStartupFailedEventData(currentTime: number, event?: string, eventObject?: any) {\n const reason = this.getReasonForVideoStartFailure(event);\n const eventData: ErrorData.VideoStartFailedEvent = {currentTime, reason};\n return eventData;\n }\n\n protected getReasonForVideoStartFailure(event?: string) {\n switch (event) {\n case Event.ERROR:\n return VideoStartFailedReason.PLAYER_ERROR;\n case Event.UNLOAD:\n return VideoStartFailedReason.PAGE_CLOSED;\n case Event.VIDEOSTART_TIMEOUT:\n return VideoStartFailedReason.TIMEOUT;\n default:\n return VideoStartFailedReason.UNKNOWN;\n }\n }\n\n protected setVideoStartTimeout() {\n if (this.videoStartTimeout != null) {\n this.clearVideoStartTimeout();\n }\n this.videoStartTimeout = window.setTimeout(() => {\n this.callEvent(Event.VIDEOSTART_TIMEOUT, {}, Utils.getCurrentTimestamp());\n this.stateMachineCallbacks.release();\n }, this.videoStartupTimeoutMs);\n }\n\n protected clearVideoStartTimeout() {\n window.clearTimeout(this.videoStartTimeout);\n this.videoStartTimeout = undefined;\n }\n //#endregion\n}\n","import {HTML5AnalyticsStateMachine} from '../../analyticsStateMachines/HTML5AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport {Event} from '../../enums/Event';\nimport {getMIMETypeFromFileExtension} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {getStreamTypeFromMIMEType} from '../../enums/StreamTypes';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport {StreamSources} from '../../types/StreamSources';\nimport {SubtitleInfo} from '../../types/SubtitleInfo';\nimport * as Utils from '../../utils/Utils';\nimport {isVideoInFullscreen} from '../../utils/Utils';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport abstract class HTML5InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n get segments(): SegmentInfo[] {\n return [];\n }\n\n private static BUFFERING_TIMECHANGED_TIMEOUT = 1000;\n public mediaElEventHandlers: Array<{event: string; handler: any}>;\n public abstract getPlayerVersion: () => string;\n public readonly videoCompletionTracker: VideoCompletionTracker;\n protected needsFirstPlayIntent: boolean;\n private onBeforeUnLoadEvent: boolean = false;\n\n private bufferingTimeout?: number;\n private isBuffering: boolean;\n private lastIsLiveStatus: boolean;\n private isPaused: boolean;\n private isSeeking: boolean;\n private previousMediaTime: number;\n private previousClientTime: number;\n private needsReadyEvent: boolean;\n private mediaElementSet: boolean;\n private previousMutedValue: boolean = false;\n\n constructor(protected mediaElement: HTMLVideoElement | null, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.initializeStateMachine();\n this.mediaElEventHandlers = [];\n this.bufferingTimeout = undefined;\n this.isBuffering = false;\n this.lastIsLiveStatus = false;\n this.isPaused = false;\n this.isSeeking = false;\n this.previousMediaTime = 0;\n this.previousClientTime = 0;\n this.needsReadyEvent = true;\n this.needsFirstPlayIntent = true;\n this.mediaElementSet = false;\n this.videoCompletionTracker = new VideoCompletionTracker();\n }\n public getPlayerName = () => Player.HTML5;\n public getPlayerTech = () => 'html5';\n public getAutoPlay = () => (this.mediaElement ? this.mediaElement.autoplay : false);\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n if (this.mediaElement) {\n this.setMediaElement();\n }\n this.registerWindowEvents();\n return [];\n }\n\n public isLive = () => (this.mediaElement ? this.mediaElement.duration === Infinity : false);\n\n // this seems very generic. one could put it in a helper\n // and use it in many adapter implementations.\n public getStreamSources(url: string | undefined): StreamSources {\n if (!url) {\n return {};\n }\n const streamType = this.getStreamType();\n switch (streamType) {\n case 'hls':\n return {m3u8Url: url};\n case 'dash':\n return {mpdUrl: url};\n default:\n return {progUrl: url};\n }\n }\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n let info: PlaybackInfo = {\n ...this.getCommonPlaybackInfo(),\n ...this.getStreamSources(this.getStreamURL()),\n streamFormat: this.getStreamType(),\n isLive: this.isLive(),\n size: isVideoInFullscreen() ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n droppedFrames: 0, // TODO: Implement `droppedFrames`\n // TODO: Implement `audioBitrate`\n // TODO: Implement `isCasting`\n // TODO: Implement getting `videoTitle` from player (currently only from the analytics config)\n };\n\n if (this.mediaElement) {\n info = {\n ...info,\n videoDuration: this.mediaElement.duration,\n isMuted: this.mediaElement.muted,\n videoWindowHeight: this.mediaElement.height,\n videoWindowWidth: this.mediaElement.width,\n };\n }\n\n const qualityInfo = this.getCurrentQualityLevelInfo();\n if (qualityInfo) {\n info = {\n ...info,\n videoPlaybackHeight: qualityInfo.height,\n videoPlaybackWidth: qualityInfo.width,\n videoBitrate: qualityInfo.bitrate,\n };\n }\n\n return info;\n }\n\n protected get currentTime(): number {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n return this.mediaElement.currentTime;\n }\n\n /**\n * Used to setup against the media element.\n * We need this method to desynchronize construction of this class\n * and the actual initialization against the media element.\n * That is because at construction some media engine\n * may not already have the media element attached, for example\n * when passing in the DOM element is happening at once with passing the source URL\n * and can not be decoupled.\n * We are then awaiting an event from the engine and calling this with the media element\n * as argument from our sub-class.\n *\n * This method can also be called without arguments and then it will perform\n * initialization against the existing media element (should only be called once, will throw an error otherwise)\n *\n * It can also be used to replace the element.\n *\n *\n */\n public setMediaElement(mediaElement: HTMLVideoElement | null = null) {\n // replace previously existing, if calld with args\n if (mediaElement && this.mediaElement) {\n this.unregisterMediaElement();\n this.mediaElementSet = false;\n }\n\n // if called without args we assume it's already there\n // we can also be called with args but without any being there before\n if (mediaElement) {\n this.mediaElement = mediaElement;\n }\n\n if (!this.mediaElement) {\n throw new Error('No media element owned');\n }\n\n if (this.mediaElementSet) {\n throw new Error('Media element already set (only call this once)');\n }\n this.mediaElementSet = true;\n\n this.registerMediaElement();\n this.onMaybeReady();\n }\n public abstract getCurrentQualityLevelInfo(): QualityLevelInfo | null;\n\n /**\n * Can be overriden by sub-classes\n * @returns {string}\n *\n */\n public getMIMEType(): string | undefined {\n const streamUrl = this.getStreamURL();\n if (!streamUrl || streamUrl === undefined) {\n return;\n }\n return getMIMETypeFromFileExtension(streamUrl);\n }\n\n /**\n * Can be overriden by sub-classes\n * @returns {string}\n */\n public getStreamType(): string | undefined {\n const mimetype = this.getMIMEType();\n if (mimetype) {\n return getStreamTypeFromMIMEType(mimetype);\n }\n }\n\n /**\n * Can be overriden by subclasses.\n * @returns {string}\n */\n public getStreamURL(): string | undefined {\n const mediaElement = this.mediaElement;\n if (!mediaElement) {\n return;\n }\n\n return mediaElement.src;\n }\n\n public resetMedia() {\n this.mediaElement = null;\n this.mediaElEventHandlers = [];\n window.clearTimeout(this.bufferingTimeout);\n }\n\n public registerMediaElement() {\n const mediaElement = this.mediaElement;\n if (!mediaElement) {\n return;\n }\n\n this.listenToMediaElementEvent('loadstart', () => {\n this.eventCallback(Event.READY, {});\n });\n\n this.listenToMediaElementEvent('loadedmetadata', () => {\n // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState\n // HAVE_NOTHING 0 No information is available about the media resource.\n // HAVE_METADATA 1 Enough of the media resource has been retrieved that\n // the metadata attributes are initialized. Seeking will no longer raise an exception.\n // HAVE_CURRENT_DATA 2 Data is available for the current playback position,\n // but not enough to actually play more than one frame.\n // HAVE_FUTURE_DATA 3 Data for the current playback position as well as for\n // at least a little bit of time into the future is available\n // (in other words, at least two frames of video, for example).\n // HAVE_ENOUGH_DATA 4 Enough data is available—and the download rate is high\n // enough—that the media can be played through to the end without interruption.\n if (mediaElement.readyState !== 1) {\n // we can't really gather any more information at this point\n return;\n }\n\n // silent\n this.checkQualityLevelAttributes(true);\n\n // const {duration, autoplay, width, height, videoWidth, videoHeight, muted} = mediaElement;\n\n // // This is redundant with what we give to updateMetadata method.\n // // Not sure if there are good reasons to keep that so or if we should better centralize.\n // const info = {\n // type: 'html5',\n // isLive: this.isLive(),\n // version: this.getPlayerVersion(),\n // streamType: this.getStreamType(),\n // streamUrl: this.getStreamURL(),\n // duration,\n // autoplay,\n // // HTMLVideoElement.width and HTMLVideoElement.height\n // // is a DOMString that reflects the height HTML attribute,\n // // which specifies the height of the display area, in CSS pixels.\n // // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement\n // width: width,\n // height: height,\n // // Returns an unsigned long containing the intrinsic\n // // height of the resource in CSS pixels,\n // // taking into account the dimensions, aspect ratio,\n // // clean aperture, resolution, and so forth,\n // // as defined for the format used by the resource.\n // // If the element's ready state is HAVE_NOTHING, the value is 0.\n // // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement\n // videoWindowWidth: videoWidth,\n // videoWindowHeight: videoHeight,\n // muted,\n // };\n\n // silence events if we have not yet intended play\n // if (this.needsFirstPlayIntent_) {\n // return;\n // }\n if (this.mediaElement != null) {\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.mediaElement.duration);\n this.previousMutedValue = this.mediaElement.muted;\n }\n });\n\n // We need the PLAY event to indicate the intent to play\n // NOTE: use TIMECHANGED event on 'playing' and trigger PLAY as intended in states.dot graph\n\n this.listenToMediaElementEvent('play', () => {\n const {currentTime} = mediaElement;\n\n this.needsFirstPlayIntent = false;\n\n this.eventCallback(Event.PLAY, {\n currentTime,\n });\n });\n\n this.listenToMediaElementEvent('pause', () => {\n this.onPaused();\n });\n\n this.listenToMediaElementEvent('playing', () => {\n clearTimeout(this.bufferingTimeout);\n this.isPaused = false;\n });\n\n this.listenToMediaElementEvent('error', () => {\n const {currentTime, error} = mediaElement;\n\n this.eventCallback(Event.ERROR, {\n currentTime,\n // See https://developer.mozilla.org/en-US/docs/Web/API/MediaError\n code: error?.code ?? undefined,\n message: error?.message ?? undefined,\n data: {},\n });\n });\n\n this.listenToMediaElementEvent('volumechange', () => {\n const {muted, currentTime, volume} = mediaElement;\n const isMuted = this.isAudioMuted(muted, volume);\n\n if (this.previousMutedValue !== isMuted) {\n if (isMuted) {\n this.eventCallback(Event.MUTE, {\n currentTime,\n });\n } else {\n this.eventCallback(Event.UN_MUTE, {\n currentTime,\n });\n }\n this.previousMutedValue = isMuted;\n }\n });\n\n this.listenToMediaElementEvent('seeking', () => {\n const {currentTime} = mediaElement;\n\n this.eventCallback(Event.SEEK, {\n currentTime,\n });\n });\n\n this.listenToMediaElementEvent('seeked', () => {\n const {currentTime} = mediaElement;\n\n clearTimeout(this.bufferingTimeout);\n\n this.eventCallback(Event.SEEKED, {\n currentTime,\n });\n });\n\n this.listenToMediaElementEvent('timeupdate', () => {\n const {currentTime} = mediaElement;\n\n this.isBuffering = false;\n this.isSeeking = false;\n\n // silence events if we have not yet intended play\n if (this.needsFirstPlayIntent) {\n return;\n }\n\n if (!this.isPaused) {\n this.eventCallback(Event.TIMECHANGED, {\n currentTime,\n });\n }\n\n this.checkQualityLevelAttributes();\n\n this.checkSeeking();\n\n // We are doing this in case we can not rely\n // on the \"stalled\" or \"waiting\" events in a specific browser\n // and to detect intrinsinc paused states (when we do not get a paused event)\n // but the player is paused already before attach or is paused from initialization on.\n this.checkPlayheadProgress();\n\n this.previousMediaTime = currentTime;\n });\n\n // The stalled event is fired when the user agent is trying to fetch media data,\n // but data is unexpectedly not forthcoming.\n // https://developer.mozilla.org/en-US/docs/Web/Events/stalled\n this.listenToMediaElementEvent('stalled', () => {\n // this event doesn't indicate buffering by definition (interupted playback),\n // only that data throughput to playout buffers is not as high as expected\n // It happens on Chrome every once in a while as SourceBuffer's are not fed\n // as fast as the underlying native player may prefer (but it does not lead to\n // interuption).\n });\n\n // The waiting event is fired when playback has stopped because of a temporary lack of data.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/waiting\n this.listenToMediaElementEvent('waiting', () => {\n // we check here for seeking because a programmatically seek where just\n // the currentTime has been changed does not trigger a proper seek event\n this.checkSeeking();\n this.onBuffering();\n });\n }\n\n /**\n * Should only be calld when a mediaElement is attached\n */\n public listenToMediaElementEvent(event: any, handler: any) {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const boundHandler = handler.bind(this);\n\n this.mediaElEventHandlers.push({event, handler: boundHandler});\n this.mediaElement.addEventListener(event, boundHandler, false);\n }\n\n public onMaybeReady() {\n if (!this.needsReadyEvent || !this.mediaElement) {\n return;\n }\n\n this.needsReadyEvent = false;\n\n const info = this.getCurrentPlaybackInfo();\n\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.mediaElement.duration);\n this.eventCallback(Event.READY, {currentTime: this.currentTime});\n }\n\n /**\n * Should only be calld when a mediaElement is attached\n */\n public unregisterMediaElement() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const mediaElement = this.mediaElement;\n\n this.mediaElEventHandlers.forEach((item: {event: string; handler: any}) => {\n mediaElement.removeEventListener(item.event, item.handler);\n });\n\n this.resetMedia();\n }\n\n public onBuffering() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const {currentTime} = this.mediaElement;\n\n // this handler may be called multiple times\n // for one actual buffering-event occuring so lets guard from\n // triggering this event redundantly.\n if (this.isBuffering || (this.isPaused && !this.isSeeking)) {\n return;\n }\n\n if (this.isSeeking) {\n this.eventCallback(Event.SEEK, {\n currentTime,\n });\n } else {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime,\n });\n }\n this.isBuffering = true;\n }\n\n public onPaused(currentTime?: number) {\n if (this.isPaused) {\n return;\n }\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n if (!currentTime) {\n currentTime = this.mediaElement.currentTime;\n }\n\n this.eventCallback(Event.PAUSE, {\n currentTime,\n });\n\n this.isPaused = true;\n }\n\n public registerWindowEvents() {\n this.windowEventTracker.addEventListener('beforeunload', this.onPageClose.bind(this));\n this.windowEventTracker.addEventListener('unload', this.onPageClose.bind(this));\n }\n\n public onPageClose() {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n const mediaElement = this.mediaElement;\n let currentTime: number | undefined;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n this.eventCallback(Event.UNLOAD, {\n currentTime,\n });\n }\n this.release();\n }\n\n public checkPlayheadProgress() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const mediaElement = this.mediaElement;\n if (mediaElement.paused) {\n this.onPaused();\n }\n\n clearTimeout(this.bufferingTimeout);\n\n this.bufferingTimeout = window.setTimeout(() => {\n if (mediaElement.paused || (mediaElement.ended && !this.isBuffering)) {\n return;\n }\n\n const timeDelta = mediaElement.currentTime - this.previousMediaTime;\n\n if (timeDelta < HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT) {\n this.onBuffering();\n }\n }, HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT);\n }\n\n public checkQualityLevelAttributes(silent: boolean = false) {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const mediaElement = this.mediaElement;\n\n const qualityLevelInfo = this.getCurrentQualityLevelInfo();\n if (!qualityLevelInfo) {\n return;\n }\n\n const {bitrate, width, height} = qualityLevelInfo;\n\n const isLive = this.isLive();\n\n // Detect a change of the isLive status and update the medaData of the SM\n if (isLive !== this.lastIsLiveStatus) {\n this.lastIsLiveStatus = isLive;\n\n // TODO: Call event for ISLIVE_CHANGE (similar to VIDEO_CHANGE)\n // The updateMetadata is obsolete, as we introduced the getCurrentPlaybackInfo\n // (we don't notify the statemachine about state changes, instead we poll the adapter for the information)\n // if (!silent) {\n // this.stateMachine.updateMetadata();\n // }\n }\n\n if (bitrate != null && this.shouldAllowVideoQualityChange(bitrate)) {\n this.setPreviousVideoBitrate(bitrate);\n const eventData = {\n width,\n height,\n bitrate,\n currentTime: mediaElement.currentTime,\n };\n\n if (!silent) {\n this.eventCallback(Event.VIDEO_CHANGE, eventData);\n }\n }\n }\n\n public sourceChange(config: any, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, this.mediaElement ? this.mediaElement.currentTime : undefined);\n }\n\n public getSelectedSubtitleFromMediaElement(mediaElement: any): SubtitleInfo | undefined {\n if (mediaElement.textTracks == null) {\n return undefined;\n }\n const textTrackList = mediaElement.textTracks;\n for (const attr of textTrackList) {\n if (attr.mode != null && attr.mode === 'showing') {\n const isSubtitleDisplayed = attr.language != null && attr.language.length > 0;\n return {\n enabled: isSubtitleDisplayed,\n language: isSubtitleDisplayed ? attr.language : undefined,\n };\n }\n }\n return {\n enabled: false,\n };\n }\n\n protected initializeStateMachine(): void {\n this.stateMachine = new HTML5AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.stateMachine.callEvent(Event.SETUP, {}, 0);\n }\n\n private checkSeeking() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const currentVideoTime = this.mediaElement.currentTime;\n\n const mediaTimeDif = Math.abs(currentVideoTime - this.previousMediaTime);\n const currentClientTime = Utils.getCurrentTimestamp();\n\n /** Difference between current client time and the previously known client time in seconds. */\n const clientTimeDif = (currentClientTime - this.previousClientTime) / 1000;\n\n /**\n * If the media time difference between the previous one and the current one is much higher than\n * the difference of the previous and current client time than there is a seek happening\n */\n // TODO: check if we need to increase the threshold for detecting a seek. The seek can be triggered when clicking `play` at an unfavorable point in time:\n // Set autoplay to false and click on play right after the player/video loaded.\n if (mediaTimeDif > clientTimeDif * 2) {\n this.isSeeking = true;\n this.onPaused(this.previousMediaTime + clientTimeDif);\n }\n\n this.previousClientTime = Utils.getCurrentTimestamp();\n }\n}\n","// @ts-ignore\nexport const VERSION: string = __VERSION__;\n","import {logger} from './Logger';\n\n// tslint:disable-next-line\nexport function post(url: string, body: any, callback: Function, async: boolean = true): void {\n let xhttp: any;\n let legacyMode = false;\n\n if ((window as any).XDomainRequest) {\n legacyMode = true;\n }\n\n if (legacyMode) {\n xhttp = new (window as any).XDomainRequest();\n } else {\n xhttp = new XMLHttpRequest();\n }\n\n const responseCallback = () => {\n // tslint:disable-next-line\n if (xhttp.readyState == XMLHttpRequest.DONE) {\n if (xhttp.responseText <= 0) {\n return;\n }\n\n const sampleResponse = JSON.parse(xhttp.responseText);\n\n callback(sampleResponse);\n }\n };\n\n if (legacyMode) {\n xhttp.onload = responseCallback;\n } else {\n xhttp.onreadystatechange = responseCallback;\n }\n\n try {\n xhttp.open('POST', url, async);\n if (!legacyMode) {\n xhttp.setRequestHeader('Content-Type', 'text/plain');\n }\n xhttp.send(JSON.stringify(body));\n } catch (e) {\n logger.error('Failed to send POST request.', e);\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {Backend} from './Backend';\n\nexport class NoOpBackend implements Backend {\n public sendRequest(sample: Sample) {}\n public sendUnloadRequest(sample: Sample) {}\n public sendRequestSynchronous(sample: Sample) {}\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {}\n}\n","export interface Subscribable<TArgs> {\n subscribe(callback: EventHandler<TArgs>): () => void;\n unsubscribe(callback: EventHandler<TArgs>);\n}\n\ntype EventHandler<TArgs> = (args: TArgs) => void;\n\nexport class EventDispatcher<TArgs> implements Subscribable<TArgs> {\n private callbacks: Array<EventHandler<TArgs>> = [];\n\n public subscribe(callback: EventHandler<TArgs>): () => void {\n this.callbacks.push(callback);\n\n return () => this.unsubscribe(callback);\n }\n\n public dispatch(args: TArgs) {\n const callbacks = this.callbacks.slice(0);\n callbacks.forEach((callback) => {\n callback(args);\n });\n }\n\n public unsubscribe(callback: EventHandler<TArgs>) {\n const index = this.callbacks.indexOf(callback);\n if (index > -1) {\n this.callbacks.splice(index, 1);\n }\n }\n\n public get subscriberCount() {\n return this.callbacks.length;\n }\n}\n","import Timespan from '../types/Timespan';\n\nenum TimespanOverlappingType {\n None,\n Overlapping,\n FirstContainedInSecond,\n SecondContainedInFirst,\n}\n\nexport default class VideoCompletionTracker {\n private watched: Timespan[] = [];\n private videoDuration: number | null = null;\n\n public reset(): void {\n this.watched = [];\n }\n\n /**\n * sets video Duration\n * @param videoDuration in sec\n */\n public setVideoDuration(videoDuration: number): void {\n this.videoDuration = videoDuration * 1000;\n }\n\n /**\n * Adds the watched timespan to the tracker\n * @param watched watched timespan you want to add to the tracker\n * @returns how much time(video parts which have not been seen yet) was added to the tracker\n */\n public addWatched(watched: Timespan): number {\n if (this.videoDuration == null) {\n throw new Error('no video duration set for completion tracker');\n }\n\n this.watched.push(watched);\n const overlappingTimespan = this.mergeWatched(this.watched);\n return (this.getDuration(watched) - overlappingTimespan) / this.videoDuration;\n }\n\n /**\n * returns the relative value of how much the user watch the content of the video\n */\n public getCompletionPercentage(): number {\n if (this.videoDuration == null) {\n throw new Error('no video duration set for completion tracker');\n }\n\n let watched = 0;\n for (const w of this.watched) {\n watched += this.getDuration(w);\n }\n return watched / this.videoDuration;\n }\n\n /**\n * Recursive Method to merge All Watched Blocks\n * @param watched\n *\n * @returns how much timespan was overlapping while merging the watchBlocks\n */\n private mergeWatched(watched: Timespan[]): number {\n for (let i = 0; i < watched.length; i++) {\n const time1 = watched[i];\n for (let k = i + 1; k < watched.length; k++) {\n const time2 = watched[k];\n let overlappingTimespan = 0;\n const overlapType = this.getOverlappingType(time1, time2);\n\n if (overlapType === TimespanOverlappingType.Overlapping) {\n this.mergeAndReplace(time1, i, time2, k);\n overlappingTimespan = this.getOverlappingTimespan(time1, time2);\n } else if (overlapType === TimespanOverlappingType.FirstContainedInSecond) {\n this.watched.splice(i, 1);\n overlappingTimespan = this.getDuration(time1);\n } else if (overlapType === TimespanOverlappingType.SecondContainedInFirst) {\n this.watched.splice(k, 1);\n overlappingTimespan = this.getDuration(time2);\n }\n if (overlapType !== TimespanOverlappingType.None) {\n return overlappingTimespan + this.mergeWatched(this.watched);\n }\n }\n }\n return 0;\n }\n\n private getOverlappingType(first: Timespan, second: Timespan): TimespanOverlappingType {\n if (\n (this.isMomentInTimespan(first.end, second) && first.start < second.start) ||\n (this.isMomentInTimespan(first.start, second) && first.end > second.end)\n ) {\n return TimespanOverlappingType.Overlapping;\n } else if (this.isMomentInTimespan(first.start, second) && this.isMomentInTimespan(first.end, second)) {\n return TimespanOverlappingType.FirstContainedInSecond;\n } else if (this.isMomentInTimespan(second.start, first) && this.isMomentInTimespan(second.end, first)) {\n return TimespanOverlappingType.SecondContainedInFirst;\n }\n return TimespanOverlappingType.None;\n }\n\n private isMomentInTimespan(moment: number, timespan: Timespan): boolean {\n return moment >= timespan.start && moment < timespan.end;\n }\n\n private mergeAndReplace(first: Timespan, firstIndex: number, second: Timespan, secondIndex: number): void {\n const end = first.end > second.end ? first.end : second.end;\n const start = first.start < second.start ? first.start : second.start;\n const newWatchedTimespan: Timespan = {start, end};\n this.watched.splice(firstIndex, 1, newWatchedTimespan);\n this.watched.splice(secondIndex, 1);\n }\n\n private getOverlappingTimespan(first: Timespan, second: Timespan): number {\n const end = first.end < second.end ? first.end : second.end;\n const start = first.start >= second.start ? first.start : second.start;\n return end - start;\n }\n\n private getDuration(watched: Timespan): number {\n return Math.abs(watched.end - watched.start);\n }\n}\n","export interface CustomDataValues {\n customData1?: string;\n customData2?: string;\n customData3?: string;\n customData4?: string;\n customData5?: string;\n customData6?: string;\n customData7?: string;\n customData8?: string;\n customData9?: string;\n customData10?: string;\n customData11?: string;\n customData12?: string;\n customData13?: string;\n customData14?: string;\n customData15?: string;\n customData16?: string;\n customData17?: string;\n customData18?: string;\n customData19?: string;\n customData20?: string;\n customData21?: string;\n customData22?: string;\n customData23?: string;\n customData24?: string;\n customData25?: string;\n customData26?: string;\n customData27?: string;\n customData28?: string;\n customData29?: string;\n customData30?: string;\n experimentName?: string;\n}\n\n/**\n * Lists all keys of the {@see CustomDataValues} interface.\n */\nexport const customDataValuesKeys: Array<keyof CustomDataValues> = [\n 'customData1',\n 'customData2',\n 'customData3',\n 'customData4',\n 'customData5',\n 'customData6',\n 'customData7',\n 'customData8',\n 'customData9',\n 'customData10',\n 'customData11',\n 'customData12',\n 'customData13',\n 'customData14',\n 'customData15',\n 'customData16',\n 'customData17',\n 'customData18',\n 'customData19',\n 'customData20',\n 'customData21',\n 'customData22',\n 'customData23',\n 'customData24',\n 'customData25',\n 'customData26',\n 'customData27',\n 'customData28',\n 'customData29',\n 'customData30',\n 'experimentName',\n];\n\n/**\n * The number of CustomDataXX fields in {@see CustomDataValues}.\n */\nexport const customDataFieldCount = customDataValuesKeys.filter((i) => i.match('customData\\\\d+')).length;\n","export class EventDebugging {\n public event: string | undefined;\n public from: string | undefined;\n public to: string | undefined;\n public timestamp: number;\n public eventObject: any;\n\n constructor(\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) {\n this.event = event;\n this.from = from;\n this.to = to;\n this.timestamp = timestamp;\n this.eventObject = eventObject;\n }\n}\n","export enum CastTech {\n AirPlay = 'AirPlay',\n WebSocket = 'WebSocket',\n GoogleCast = 'GoogleCast',\n}\n","import {ProgressiveSourceConfig} from '../types/ProgressiveSourceConfig';\nimport {ProgressiveSourceInfo} from '../types/SourceInfo';\n\nexport const getSourceInfoFromBitmovinSourceConfig = (\n progressive: ProgressiveSourceConfig,\n player: any\n): ProgressiveSourceInfo => {\n if (!progressive) {\n return {\n progBitrate: undefined,\n progUrl: undefined,\n };\n }\n\n if (typeof progressive === 'string') {\n return {\n progBitrate: 0,\n progUrl: progressive,\n };\n }\n\n if (Array.isArray(progressive) && progressive.length > 0) {\n const playbackVideoData = player.getPlaybackVideoData();\n let progressiveArrayIndex = 0;\n\n if (playbackVideoData !== null && playbackVideoData !== undefined && !isNaN(+playbackVideoData.id)) {\n progressiveArrayIndex = +playbackVideoData.id;\n }\n\n return {\n progBitrate: progressive[progressiveArrayIndex].bitrate || 0,\n progUrl: progressive[progressiveArrayIndex].url,\n };\n }\n\n if (typeof progressive === 'object' && !Array.isArray(progressive)) {\n return {\n progBitrate: progressive.bitrate || 0,\n progUrl: progressive.url,\n };\n }\n\n return {\n progBitrate: undefined,\n progUrl: undefined,\n };\n};\n","import {DownloadSpeedInfo} from '../types/DownloadSpeedInfo';\nimport {SpeedMeasurement} from '../types/SpeedMeasurement';\nimport {Converter} from '../utils/Converter';\nimport {Measure} from './Measure';\n\nexport class DownloadSpeedMeter {\n protected measures: Measure[];\n\n constructor() {\n this.measures = [];\n }\n\n public reset(): void {\n this.measures = [];\n }\n\n public addMeasurement(measurement: SpeedMeasurement): void {\n if (measurement.httpStatus >= 400) {\n return;\n }\n const measure = new Measure(measurement);\n\n const threshhold = Converter.bitsToBytes(300 * 1000 * 1000); // 300 Megabit per second in bytes\n if (measure.speed >= threshhold) {\n return;\n }\n\n this.measures.push(measure);\n }\n\n public getInfo(): DownloadSpeedInfo {\n return {\n segmentsDownloadCount: this.measures.length,\n segmentsDownloadSize: this.measures.map((m) => m.size).reduce(this.add, 0),\n segmentsDownloadTime: Math.ceil(this.totalTime() * 1000),\n avgDownloadSpeed: this.avgSpeed(),\n minDownloadSpeed: this.minSpeed(),\n maxDownloadSpeed: this.maxSpeed(),\n avgTimeToFirstByte: this.avgTimeToFirstByte(),\n };\n }\n\n private add(a: number, b: number): number {\n return a + b;\n }\n\n private avgSpeed(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n const totalSpeed = this.speeds().reduce((a, b) => {\n return a + b;\n }, 0);\n const numMeasurements = this.measures.length;\n return this.bytePerSecondToBitPerSecond(totalSpeed / numMeasurements);\n }\n\n private bytePerSecondToBitPerSecond(bps: number): number {\n return Converter.bytesToBits(bps);\n }\n\n private minSpeed(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n return this.bytePerSecondToBitPerSecond(Math.min(...this.speeds()));\n }\n\n private speeds(): number[] {\n return this.measures.map((m) => {\n return m.speed;\n });\n }\n\n private maxSpeed(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n return this.bytePerSecondToBitPerSecond(Math.max(...this.speeds()));\n }\n\n private totalTime(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n return this.measures.reduce((a, b) => {\n return a + b.duration;\n }, 0);\n }\n\n private avgTimeToFirstByte(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n const avg =\n this.measures.reduce((a, b) => {\n return a + b.timeToFirstByte * 1000;\n }, 0) / this.measures.length;\n\n return Math.ceil(avg);\n }\n}\n","import * as StateMachine from 'javascript-state-machine';\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {logger, padRight} from '../utils/Logger';\nimport * as Utils from '../utils/Utils';\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\n\nenum State {\n INITIALIZED = 'INITIALIZED',\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n AD = 'AD',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class HTML5AnalyticsStateMachine extends AnalyticsStateMachine {\n private seekStartedAt: any;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.seekStartedAt = null;\n\n this.createStateMachine(opts);\n }\n\n public getAllStates() {\n return [\n ...Object.keys(State).map((key) => State[key]),\n 'FINISH_QUALITYCHANGE_PAUSE',\n 'FINISH_QUALITYCHANGE',\n 'FINISH_QUALITYCHANGE_REBUFFERING',\n ];\n }\n\n public getAllStatesBut(states: string[]) {\n return this.getAllStates().filter((i) => states.indexOf(i) < 0);\n }\n\n public createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.INITIALIZED,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.SETUP, from: State.INITIALIZED, to: State.SETUP},\n {name: Event.SETUP, from: State.SETUP, to: State.SETUP},\n {name: Event.TIMECHANGED, from: State.SETUP, to: State.SETUP},\n {name: Event.READY, from: [State.SETUP, State.ERROR, State.END, State.SOURCE_CHANGING], to: State.READY},\n {name: Event.READY, from: State.READY, to: State.READY},\n {name: Event.READY, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.TIMECHANGED, from: State.READY, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.TIMECHANGED, from: State.PAUSE, to: State.PAUSE},\n\n {name: Event.SEEKED, from: State.PAUSE, to: State.PAUSE},\n\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.START_BUFFERING, from: State.REBUFFERING, to: State.REBUFFERING},\n\n {name: Event.PLAY, from: State.REBUFFERING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.PLAYING},\n\n // Ignoring since it's pushed in a live stream\n {name: Event.SEEK, from: State.STARTUP, to: State.STARTUP},\n {name: Event.PLAY, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSED_SEEKING},\n {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.SEEKED, from: State.PAUSED_SEEKING, to: State.PAUSE},\n {name: Event.TIMECHANGED, from: State.PAUSED_SEEKING, to: State.PLAYING},\n {name: Event.PAUSE, from: State.PAUSED_SEEKING, to: State.PAUSE},\n\n {name: Event.END, from: State.PAUSED_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n {name: Event.PAUSE, from: State.END, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAYING},\n\n {name: Event.PLAY, from: State.END, to: State.PLAYING},\n\n {name: Event.ERROR, from: this.getAllStatesBut([State.STARTUP]), to: State.ERROR},\n {name: Event.PAUSE, from: State.ERROR, to: State.ERROR},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut([State.STARTUP]), to: State.END},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGING},\n {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.READY, to: State.READY},\n {name: Event.SUBTITLE_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n {name: Event.TIMECHANGED, from: State.SUBTITLE_CHANGING, to: State.PLAYING},\n\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.READY, to: State.READY},\n {name: Event.AUDIOTRACK_CHANGED, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.TIMECHANGED, from: State.AUDIOTRACK_CHANGING, to: State.PLAYING},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD},\n {name: Event.END_AD, from: State.AD, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE], to: State.CASTING},\n {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.SOURCE_LOADED, from: this.getAllStates(), to: State.SETUP},\n {name: Event.MANUAL_SOURCE_CHANGE, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n {name: Event.TIMECHANGED, from: State.SOURCE_CHANGING, to: State.SOURCE_CHANGING},\n {name: Event.PAUSE, from: State.SOURCE_CHANGING, to: State.SOURCE_CHANGING},\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n\n {name: Event.PLAYLIST_TRANSITION, from: this.getAllStates(), to: State.READY},\n ],\n callbacks: {\n onenterstate: (event, from, to, timestamp, eventObject) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || Utils.getCurrentTimestamp();\n }\n\n logger.log(\n `[ENTER ${timestamp}] ${padRight(to, 20)} EVENT: ${padRight(event, 20)} from: ${padRight(from, 14)}`\n );\n\n if (eventObject && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onafterevent: (event, from, to, timestamp, eventObject) => {\n if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n if (event === Event.PLAYLIST_TRANSITION) {\n this.stateMachineCallbacks.playlistTransition(eventObject);\n }\n if (to === State.QUALITYCHANGE_PAUSE) {\n this.stateMachine.FINISH_QUALITYCHANGE_PAUSE(timestamp);\n }\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.QUALITYCHANGE_REBUFFERING) {\n this.stateMachine.FINISH_QUALITYCHANGE_REBUFFERING(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n\n logger.log(\n `[LEAVE ${timestamp}] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to: ${padRight(to, 20)}`\n );\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (eventObject && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (from === State.READY && to === State.STARTUP) {\n this.setVideoStartTimeout();\n } else if (from === State.STARTUP && to === State.PLAYING) {\n this.clearVideoStartTimeout();\n }\n\n const fnName = String(from).toLowerCase();\n if (to === State.EXIT_BEFORE_VIDEOSTART) {\n this.clearVideoStartTimeout();\n const eventData = this.getVideoStartupFailedEventData(timestamp, event, eventObject);\n const shouldSendSample = event !== Event.ERROR;\n this.stateMachineCallbacks.videoStartFailed(eventData, shouldSendSample);\n } else if (from === State.PAUSED_SEEKING) {\n const seekDuration = timestamp - this.seekStartedAt;\n this.seekStartedAt = null;\n this.stateMachineCallbacks[fnName](seekDuration, fnName, eventObject);\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (from === State.PAUSE && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.stateMachineCallbacks.pause(stateDuration, fnName);\n } else {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n callbackFunction(stateDuration, fnName, eventObject);\n } else {\n logger.error('Could not find callback function for ' + fnName);\n }\n }\n\n if (eventObject && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n }\n },\n onseek: (event, from, to, timestamp) => {\n this.seekStartedAt = this.seekStartedAt || timestamp;\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n this.stateMachineCallbacks.heartbeat(stateDuration, String(from).toLowerCase(), {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n public callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n exec.call(this.stateMachine, timestamp, eventObject);\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n public sourceChange = (config: any, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n}\n","import {MIMETypes} from './MIMETypes';\n\nconst {MP4, WEBM, HLS, DASH} = MIMETypes;\n\nconst mapping = {\n [MP4]: 'progressive',\n [WEBM]: 'progressive',\n [HLS]: 'hls',\n [DASH]: 'dash',\n};\n\nexport function getStreamTypeFromMIMEType(mimeType: string) {\n return mapping[mimeType];\n}\n","import {Bitmovin7Adapter} from '../adapters/Bitmovin7Adapter';\nimport {Bitmovin8Adapter} from '../adapters/Bitmovin8Adapter';\nimport {CAFv3Adapter} from '../adapters/CAFv3Adapter';\nimport {DashjsAdapter} from '../adapters/DashjsAdapter';\nimport {HlsAdapter} from '../adapters/HlsAdapter';\nimport {HTMLVideoElementAdapter} from '../adapters/HTMLVideoElementAdapter';\nimport {ShakaAdapter} from '../adapters/ShakaAdapter';\nimport {VideojsAdapter} from '../adapters/VideoJsAdapter';\nimport {CdnProvider} from '../enums/CDNProvider';\nimport {Player} from '../enums/Player';\nimport {VERSION} from '../Version';\n\n// tslint:disable-next-line:variable-name\nconst AnalyticsModule = {\n name: 'analytics',\n module: {\n Analytics: Bitmovin8Adapter,\n },\n hooks: {\n setup: (module: any, player: any) => {\n const config = player.getConfig();\n if (!config || config.analytics === false) {\n return Promise.resolve();\n }\n const analyticsModule = module.Analytics;\n const analyticsModuleInstance = new analyticsModule(player);\n return Promise.resolve(analyticsModuleInstance);\n },\n },\n};\n\nexport {Player as Players};\nexport {CdnProvider as CdnProviders};\nexport {AnalyticsModule as PlayerModule};\nexport {VERSION as version};\nexport {HlsAdapter};\nexport {Bitmovin8Adapter};\nexport {Bitmovin7Adapter};\nexport {VideojsAdapter};\nexport {CAFv3Adapter};\nexport {ShakaAdapter};\nexport {DashjsAdapter};\nexport {HTMLVideoElementAdapter};\nexport {adapters};\n\nconst adapters = {\n HlsAdapter,\n Bitmovin8Adapter,\n Bitmovin7Adapter,\n VideojsAdapter,\n ShakaAdapter,\n DashjsAdapter,\n CAFv3Adapter,\n HTMLVideoElementAdapter,\n};\n\nexport default {\n PlayerModule: AnalyticsModule,\n};\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {Bitmovin7InternalAdapter} from './internal/Bitmovin7InternalAdapter';\n\nexport class Bitmovin7Adapter extends Adapter implements AdapterAPI {\n constructor(player, opts?: AnalyticsStateMachineOptions) {\n super();\n this.augment(player, opts);\n }\n\n private augment(player, opts?: AnalyticsStateMachineOptions) {\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n\n const that = this;\n // decorate player to intercept setup\n const originalSetup = player.setup;\n\n // tslint:disable-next-line\n player.setup = function () {\n const playerSetupPromise = originalSetup.apply(player, arguments);\n\n if (arguments.length === 0) {\n return playerSetupPromise;\n }\n const config = arguments[0];\n const analyticsConfig = config.analytics;\n if (!analyticsConfig) {\n logger.error('Bitmovin Analytics: No analytics config provided!');\n return playerSetupPromise;\n }\n\n that.internalAdapter = new Bitmovin7InternalAdapter(player, opts);\n that.analytics = new Analytics(analyticsConfig, that.internalAdapter);\n (player as any).analytics = that.analytics;\n that.wrapPlayerLoad(player, that.analytics);\n\n return playerSetupPromise;\n };\n }\n\n private wrapPlayerLoad(player, analytics: Analytics) {\n const originalLoad = player.load;\n // tslint:disable-next-line\n player.load = function () {\n if (arguments.length > 0) {\n const analyticsConfig = arguments[0].analytics;\n // we reset the analytics and reload with a new config\n analytics.sourceChange(analyticsConfig);\n }\n\n return originalLoad.apply(player, arguments);\n };\n }\n}\n","import {logger} from '../utils/Logger';\nimport {Feature} from './Feature';\nimport {FeatureConfig} from './FeatureConfig';\n\nexport class FeatureManager<TConfigContainer> {\n private features: Array<Feature<TConfigContainer, FeatureConfig>> = [];\n\n public registerFeatures(features: Array<Feature<TConfigContainer, FeatureConfig>>) {\n this.features = features;\n }\n\n public unregisterFeatures() {\n this.features.forEach((feature) => feature.disable());\n this.features = [];\n }\n\n public resetFeatures() {\n this.features.forEach((feature) => feature.reset());\n }\n\n public configureFeatures(authenticated: boolean, featureConfigs?: TConfigContainer) {\n this.features = this.features.filter((feature) => {\n const config = feature.configure(authenticated, featureConfigs);\n if (!authenticated || config?.enabled !== true) {\n logger.log(`Disabling feature ${feature.constructor.name} as it isn't enabled according to license callback.`);\n feature.disable();\n return false;\n }\n return true;\n });\n this.features.forEach((feature) => feature.enabled());\n }\n}\n","const videoFormatCodecMap: {[format: string]: string[]} = {\n avc: ['video/mp4; codecs=\"avc1.42000a\"'],\n vp9: ['video/mp4; codecs=\"vp09.00.50.08\"'],\n av1: ['video/mp4; codecs=\"av01.0.08M.08\"'],\n hevc: ['video/mp4; codecs=\"hev1.1.6.L93.B0\"'],\n};\n\nexport class CodecHelper {\n public static get supportedVideoFormats(): string[] | undefined {\n if (!('MediaSource' in window)) {\n return undefined;\n }\n const codecs = Object.getOwnPropertyNames(videoFormatCodecMap).filter((format) =>\n videoFormatCodecMap[format].some((codec) => this.isCodecSupported(codec))\n );\n return codecs;\n }\n\n public static isCodecSupported(codec: string): boolean {\n if (!('MediaSource' in window)) {\n return false;\n }\n\n return MediaSource.isTypeSupported(codec);\n }\n}\n","export enum PAGE_LOAD_TYPE {\n FOREGROUND = 1,\n BACKGROUND = 2,\n}\n","import {\n Ad,\n AdBreak,\n AdBreakEvent,\n AdClickedEvent,\n AdEvent,\n AdLinearityChangedEvent,\n AdManifestLoadedEvent,\n AdQuartileEvent,\n AdTagConfig,\n ErrorEvent,\n} from 'bitmovin-player';\nimport {AdModuleAPI} from '../adapters/internal/ads/AdModuleAPI';\nimport {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport * as Utils from '../utils/Utils';\nimport {ViewportTracker} from '../utils/ViewportTracker';\nimport {Analytics} from './Analytics';\n\nenum AdQuartile {\n FIRST_QUARTILE = 'firstQuartile',\n MIDPOINT = 'midpoint',\n THIRD_QUARTILE = 'thirdQuartile',\n}\n\ndeclare var __VERSION__: any;\n\nexport class AdAnalytics {\n public static readonly MODULE_NAME = 'ads';\n private static readonly TIMEOUT_CURRENT_TIME_INTERVAL = 100;\n\n private onBeforeUnLoadEvent: boolean = false;\n private analytics: Analytics;\n private adapter: AdModuleAPI;\n private viewportTracker: ViewportTracker;\n\n private activeAdBreakSample?: AdBreakSample;\n private activeAdSample?: AdSample;\n\n private adManifestLoadedEvents: AdManifestLoadedEvent[] = [];\n private adStartupTimestamp?: number;\n private beginPlayingTimestamp?: number;\n private enterViewportTimestamp?: number;\n private isPlaying: boolean = false;\n private currentTime?: number;\n private currentTimeInterval?: number;\n private adPodPosition: number = 0;\n\n constructor(analytics: Analytics, adapter: AdModuleAPI) {\n this.analytics = analytics;\n this.adapter = adapter;\n\n this.adapter.adCallbacks.onAdStarted = (event) => this.onAdStarted(event);\n this.adapter.adCallbacks.onAdFinished = (event) => this.onAdFinished(event);\n this.adapter.adCallbacks.onAdBreakStarted = (event) => this.onAdBreakStarted(event);\n this.adapter.adCallbacks.onAdBreakFinished = (event) => this.onAdBreakFinished(event);\n this.adapter.adCallbacks.onAdClicked = (event) => this.onAdClicked(event);\n this.adapter.adCallbacks.onAdError = (event) => this.onAdError(event);\n this.adapter.adCallbacks.onAdManifestLoaded = (event) => this.onAdManifestLoaded(event);\n this.adapter.adCallbacks.onPlay = () => this.onPlay();\n this.adapter.adCallbacks.onPause = () => this.onPause();\n this.adapter.adCallbacks.onBeforeUnload = () => this.onBeforeUnload();\n this.adapter.adCallbacks.onAdSkipped = (event) => this.onAdSkipped(event);\n this.adapter.adCallbacks.onAdQuartile = (event) => this.onAdQuartile(event);\n\n this.viewportTracker = new ViewportTracker(this.adapter.getContainer(), () => this.onIntersectionChanged(), 0.5);\n }\n\n public release() {\n this.clearCurrentTimeInterval();\n this.viewportTracker.dispose();\n }\n\n public onIntersectionChanged() {\n if (!this.activeAdSample) {\n return;\n }\n if (this.isContainerInViewport()) {\n this.enterViewportTimestamp = Utils.getCurrentTimestamp();\n } else {\n if (this.enterViewportTimestamp) {\n this.activeAdSample.timeInViewport =\n (this.activeAdSample.timeInViewport || 0) + Utils.getCurrentTimestamp() - this.enterViewportTimestamp;\n }\n }\n }\n\n public isContainerInViewport(): boolean {\n return this.viewportTracker ? this.viewportTracker.isInViewport() : true;\n }\n\n public onPlay() {\n if (this.adapter && this.adapter.isLinearAdActive() && this.activeAdSample) {\n const timestamp = Utils.getCurrentTimestamp();\n this.beginPlayingTimestamp = timestamp;\n this.enterViewportTimestamp = timestamp;\n this.isPlaying = true;\n }\n }\n\n public onPause() {\n if (this.adapter && this.adapter.isLinearAdActive() && this.activeAdSample) {\n this.updatePlayingTime(this.activeAdSample);\n this.isPlaying = false;\n }\n }\n\n public onAdManifestLoaded(event: AdManifestLoadedEvent) {\n const adTagConfig = event.adConfig as AdTagConfig;\n if (adTagConfig && adTagConfig.tag && adTagConfig.tag.type === 'vmap') {\n this.sendAnalyticsRequest(new AdBreakSample(event.adConfig, event));\n } else if (event.adBreak) {\n this.adManifestLoadedEvents.push(event);\n }\n }\n\n public onAdBreakStarted(event: AdBreakEvent) {\n this.adPodPosition = 0;\n this.activeAdBreakSample = new AdBreakSample(event.adBreak, this.getAdManifestLoadedEvent(event.adBreak));\n this.adStartupTimestamp = Utils.getCurrentTimestamp();\n }\n\n public onAdBreakFinished(event: AdBreakEvent) {\n this.resetActiveAd();\n this.activeAdBreakSample = undefined;\n }\n\n public onAdStarted(event: AdEvent) {\n if (!event.ad.isLinear) {\n return;\n }\n\n this.resetActiveAd();\n this.activeAdSample = new AdSample(event.ad);\n this.currentTime = undefined;\n this.activeAdSample.adStartupTime = this.adStartupTimestamp\n ? Utils.getCurrentTimestamp() - this.adStartupTimestamp\n : undefined;\n\n this.startAd(this.activeAdSample);\n }\n\n public onAdFinished(event: AdEvent) {\n if (!this.activeAdBreakSample || !this.activeAdSample) {\n return;\n }\n\n const adSample = {...this.activeAdSample};\n adSample.completed = 1;\n this.resetActiveAd();\n this.completeAd(this.activeAdBreakSample, adSample, adSample.adDuration);\n }\n\n public onAdSkipped(event: AdEvent) {\n if (!this.activeAdBreakSample || !this.activeAdSample) {\n return;\n }\n\n const adSample = {...this.activeAdSample};\n adSample.skipped = 1;\n adSample.skipPosition = this.currentTime;\n adSample.skipPercentage = Utils.calculatePercentage(\n this.activeAdSample.skipPosition,\n this.activeAdSample.adDuration\n );\n this.resetActiveAd();\n this.completeAd(this.activeAdBreakSample, adSample, adSample.skipPosition);\n }\n\n public onAdError(event: ErrorEvent) {\n const {adConfig, adBreak, code, message} = event.data || {\n adBreak: undefined,\n adConfig: undefined,\n code: undefined,\n message: undefined,\n };\n\n const adBreakSample = new AdBreakSample(\n adBreak || adConfig,\n adBreak ? this.getAdManifestLoadedEvent(adBreak) : undefined\n );\n\n adBreakSample.errorCode = code || event.code;\n adBreakSample.errorData = JSON.stringify(event.data);\n adBreakSample.errorMessage = message || event.name;\n\n let adSample;\n let errorPosition;\n if (\n this.activeAdSample &&\n adBreak &&\n adBreak.ads &&\n (adBreak.ads as any[]).includes((ad: Ad) => ad.id === (this.activeAdSample as AdSample).adId)\n ) {\n adSample = this.activeAdSample;\n errorPosition = adSample.errorPosition = this.currentTime;\n adSample.errorPercentage = Utils.calculatePercentage(adSample.errorPosition, adSample.adDuration);\n }\n this.completeAd(adBreakSample, adSample, errorPosition);\n }\n\n public onAdLinearityChanged(event: AdLinearityChangedEvent) {}\n\n public onAdClicked(event: AdClickedEvent) {\n if (!this.activeAdSample) {\n return;\n }\n this.activeAdSample.adClickthroughUrl = event.clickThroughUrl;\n this.activeAdSample.clicked = 1;\n this.activeAdSample.clickPosition = this.currentTime;\n this.activeAdSample.clickPercentage = Utils.calculatePercentage(\n this.activeAdSample.clickPosition,\n this.activeAdSample.adDuration\n );\n }\n\n public onAdQuartile(event: AdQuartileEvent) {\n if (!this.activeAdSample) {\n return;\n }\n if (event.quartile === AdQuartile.FIRST_QUARTILE) {\n this.activeAdSample.quartile1 = 1;\n } else if (event.quartile === AdQuartile.MIDPOINT) {\n this.activeAdSample.midpoint = 1;\n } else if (event.quartile === AdQuartile.THIRD_QUARTILE) {\n this.activeAdSample.quartile3 = 1;\n }\n }\n\n public onBeforeUnload() {\n if (this.onBeforeUnLoadEvent) {\n return;\n }\n this.onBeforeUnLoadEvent = true;\n if (!this.activeAdSample || !this.activeAdBreakSample) {\n return;\n }\n\n const adSample = {...this.activeAdSample};\n adSample.closed = 1;\n adSample.closePosition = this.currentTime;\n adSample.closePercentage = Utils.calculatePercentage(adSample.closePosition, adSample.adDuration);\n this.resetActiveAd();\n this.completeAd(this.activeAdBreakSample, adSample, adSample.closePosition);\n }\n\n public createNewAdAnalyticsSample(analyticsSample: Sample): AdAnalyticsSample {\n const moduleInfo = this.adapter.getAdModuleInfo();\n return {\n ...new AdAnalyticsSample(analyticsSample),\n analyticsVersion: __VERSION__,\n adModule: moduleInfo.name,\n adModuleVersion: moduleInfo.version,\n playerStartupTime: this.analytics.playerStartupTime,\n pageLoadTime: this.analytics.pageLoadTime,\n autoplay: this.analytics.autoplay,\n pageLoadType: Utils.getPageLoadType(),\n };\n }\n\n private getAdManifestLoadedEvent(adBreak: AdBreak) {\n if (!adBreak) {\n return undefined;\n }\n return this.adManifestLoadedEvents.find((i) => i.adBreak && i.adBreak.id === adBreak.id);\n }\n\n private sendAnalyticsRequest(adBreakSample: AdBreakSample, adSample?: AdSample) {\n const sample = {\n ...this.createNewAdAnalyticsSample(this.analytics.sample),\n ...adBreakSample,\n ...(adSample || new AdSample()),\n };\n sample.time = Utils.getCurrentTimestamp();\n sample.adImpressionId = Utils.generateUUID();\n sample.percentageInViewport = Utils.calculatePercentage(sample.timeInViewport, sample.timePlayed);\n this.analytics.backend.sendAdRequest(sample);\n }\n\n private updatePlayingTime(adSample: AdSample) {\n const timestamp = Utils.getCurrentTimestamp();\n if (this.beginPlayingTimestamp && this.isPlaying) {\n if (adSample.timePlayed !== undefined) {\n adSample.timePlayed += timestamp - this.beginPlayingTimestamp;\n }\n if (this.isContainerInViewport() && this.enterViewportTimestamp && adSample.timeInViewport !== undefined) {\n adSample.timeInViewport += timestamp - this.enterViewportTimestamp;\n }\n }\n }\n\n private startAd(adSample: AdSample) {\n adSample.started = 1;\n adSample.timePlayed = 0;\n adSample.timeInViewport = 0;\n adSample.adPodPosition = this.adPodPosition;\n const timestamp = Utils.getCurrentTimestamp();\n this.beginPlayingTimestamp = timestamp;\n this.enterViewportTimestamp = this.isContainerInViewport() ? timestamp : undefined;\n this.isPlaying = true;\n this.currentTime = 0;\n this.adPodPosition++;\n this.currentTimeInterval = window.setInterval(() => {\n try {\n if (\n adSample &&\n adSample.adDuration !== undefined &&\n adSample.adDuration > 0 &&\n this.adapter.isLinearAdActive()\n ) {\n this.currentTime = Utils.calculateTime(Math.max(this.adapter.currentTime(), 0));\n }\n } catch (e) {\n logger.log('AdStarted monitoring interval failed and got cleared', e);\n this.resetActiveAd();\n }\n }, AdAnalytics.TIMEOUT_CURRENT_TIME_INTERVAL);\n }\n\n private completeAd(adBreakSample: AdBreakSample, adSample: AdSample = new AdSample(), exitPosition?: number) {\n adSample.exitPosition = exitPosition;\n adSample.playPercentage = Utils.calculatePercentage(adSample.exitPosition, adSample.adDuration);\n\n // reset startupTimestamp for the next ad, in case there are multiple ads in one ad break\n this.adStartupTimestamp = Utils.getCurrentTimestamp();\n this.updatePlayingTime(adSample);\n this.isPlaying = false;\n this.sendAnalyticsRequest(adBreakSample, adSample);\n }\n\n private resetActiveAd() {\n this.clearCurrentTimeInterval();\n this.activeAdSample = undefined;\n }\n\n private clearCurrentTimeInterval() {\n window.clearInterval(this.currentTimeInterval);\n delete this.currentTime;\n }\n}\n","import * as Utils from '../utils/Utils';\nimport {CustomDataValues} from './CustomDataValues';\nimport {Sample} from './Sample';\n\nexport class AdAnalyticsSample implements CustomDataValues {\n public adModule?: string;\n public adModuleVersion?: string;\n public videoImpressionId?: string;\n public userAgent?: string;\n public language?: string;\n public cdnProvider?: string;\n public customData1?: string;\n public customData2?: string;\n public customData3?: string;\n public customData4?: string;\n public customData5?: string;\n public customData6?: string;\n public customData7?: string;\n public customData8?: string;\n public customData9?: string;\n public customData10?: string;\n public customData11?: string;\n public customData12?: string;\n public customData13?: string;\n public customData14?: string;\n public customData15?: string;\n public customData16?: string;\n public customData17?: string;\n public customData18?: string;\n public customData19?: string;\n public customData20?: string;\n public customData21?: string;\n public customData22?: string;\n public customData23?: string;\n public customData24?: string;\n public customData25?: string;\n public customUserId?: string;\n public experimentName?: string;\n public domain?: string;\n public key?: string;\n public path?: string;\n public player?: string;\n public playerKey?: string;\n public playerTech?: string;\n public screenHeight?: number;\n public screenWidth?: number;\n public version?: string;\n public size?: string;\n public userId?: string;\n public videoId?: string;\n public videoTitle?: string;\n public videoWindowHeight?: number;\n public videoWindowWidth?: number;\n public playerStartupTime?: number;\n public analyticsVersion?: string;\n public pageLoadTime?: number;\n public pageLoadType?: number;\n public autoplay?: boolean;\n public platform: string = 'web';\n public audioCodec?: string;\n public videoCodec?: string;\n\n constructor(sample?: Sample) {\n if (!sample) {\n return;\n }\n this.videoImpressionId = sample.impressionId;\n this.userAgent = sample.userAgent;\n this.language = sample.language;\n this.cdnProvider = sample.cdnProvider;\n\n Utils.transferCustomDataFields(sample, this);\n\n this.customUserId = sample.customUserId;\n this.domain = sample.domain;\n this.experimentName = sample.experimentName;\n this.key = sample.key;\n this.path = sample.path;\n this.player = sample.player;\n this.playerKey = sample.playerKey;\n this.playerTech = sample.playerTech;\n this.screenHeight = sample.screenHeight;\n this.screenWidth = sample.screenWidth;\n this.version = sample.version;\n this.size = sample.size;\n this.userId = sample.userId;\n this.videoId = sample.videoId;\n this.videoTitle = sample.videoTitle;\n this.videoWindowHeight = sample.videoWindowHeight;\n this.videoWindowWidth = sample.videoWindowWidth;\n this.audioCodec = sample.audioCodec;\n this.videoCodec = sample.videoCodec;\n }\n}\n","import {AdBreak, AdBreakConfig, AdConfig, AdManifestLoadedEvent, AdTagConfig} from 'bitmovin-player';\nimport * as Utils from '../utils/Utils';\n\nexport class AdBreakSample {\n public adPosition?: string;\n public adOffset?: string;\n public adScheduleTime?: number;\n public adReplaceContentDuration?: number;\n public adPreloadOffset?: number;\n public adTagPath?: string;\n public adTagServer?: string;\n public adTagType?: string;\n public adTagUrl?: string;\n public adIsPersistent?: boolean;\n public adIdPlayer?: string;\n public manifestDownloadTime?: number;\n public errorCode?: number;\n public errorData?: string;\n public errorMessage?: string;\n public adFallbackIndex: number = 0;\n\n constructor(adConfig?: AdConfig, adManifestLoadedEvent?: AdManifestLoadedEvent) {\n if (adManifestLoadedEvent) {\n this.manifestDownloadTime = Utils.calculateTime(adManifestLoadedEvent.downloadTiming.downloadTime);\n }\n\n if (adConfig) {\n this.adReplaceContentDuration = Utils.calculateTimeWithUndefined(adConfig.replaceContentDuration);\n this.adFallbackIndex = ((adConfig as any).currentFallbackIndex || -1) + 1;\n }\n\n const adBreakConfig = adConfig as AdBreakConfig;\n if (adBreakConfig) {\n if (adBreakConfig.position === 'pre' || adBreakConfig.position === 'post') {\n this.adPosition = adBreakConfig.position;\n } else {\n this.adPosition = 'mid';\n this.adOffset = adBreakConfig.position;\n }\n\n this.adPreloadOffset = Utils.calculateTimeWithUndefined(adBreakConfig.preloadOffset);\n }\n\n const adTagConfig = adConfig as AdTagConfig;\n if (adTagConfig) {\n this.adIsPersistent = adTagConfig.persistent;\n let tag = adTagConfig.tag;\n if (\n this.adFallbackIndex > 0 &&\n adTagConfig.fallbackTags &&\n adTagConfig.fallbackTags.length >= this.adFallbackIndex\n ) {\n tag = adTagConfig.fallbackTags[this.adFallbackIndex - 1];\n }\n if (tag) {\n this.adTagType = tag.type;\n this.adTagUrl = tag.url;\n }\n if (this.adTagUrl) {\n const adTagDetails = Utils.getHostnameAndPathFromUrl(this.adTagUrl);\n this.adTagServer = adTagDetails.hostname;\n this.adTagPath = adTagDetails.path;\n }\n }\n\n const adBreak = adConfig as AdBreak;\n if (adBreak) {\n this.adScheduleTime = Utils.calculateTimeWithUndefined(adBreak.scheduleTime);\n this.adIdPlayer = adBreak.id;\n }\n }\n}\n","import {Ad, LinearAd, VastAdData} from 'bitmovin-player';\nimport * as Utils from '../utils/Utils';\n\nexport class AdSample {\n private static parseSkipAfter(skipAfter?: number) {\n if (skipAfter === undefined) {\n return undefined;\n }\n if (skipAfter === -1) {\n return skipAfter;\n }\n return Utils.calculateTime(skipAfter);\n }\n\n public wrapperAdsCount?: number;\n public adSkippable?: boolean;\n public adSkippableAfter?: number;\n public adClickthroughUrl?: string;\n public adDescription?: string;\n public adDuration?: number;\n public adId?: string;\n public adImpressionId?: string;\n public adPlaybackHeight?: number;\n public adPlaybackWidth?: number;\n public adStartupTime?: number;\n public adSystem?: string;\n public adTitle?: string;\n public advertiserName?: string;\n public apiFramework?: string;\n public audioBitrate?: number;\n public clicked: number = 0;\n public clickPosition?: number;\n public closed: number = 0;\n public closePosition?: number;\n public completed: number = 0;\n public creativeAdId?: string;\n public creativeId?: string;\n public dealId?: string;\n public isLinear?: boolean;\n public mediaPath?: string;\n public mediaServer?: string;\n public mediaUrl?: string;\n public midpoint: number = 0;\n public minSuggestedDuration?: number;\n public percentageInViewport?: number;\n public quartile1: number = 0;\n public quartile3: number = 0;\n public skipped: number = 0;\n public skipPosition?: number;\n public started: number = 0;\n public streamFormat?: string;\n public surveyUrl?: string;\n public time?: number;\n public timeHovered?: number;\n public timeInViewport?: number;\n public timePlayed?: number;\n public timeUntilHover?: number;\n public universalAdIdRegistry?: string;\n public universalAdIdValue?: string;\n public videoBitrate?: number;\n public adPodPosition?: number;\n public exitPosition?: number;\n public playPercentage?: number;\n public skipPercentage?: number;\n public clickPercentage?: number;\n public closePercentage?: number;\n public errorPosition?: number;\n public errorPercentage?: number;\n public timeToContent?: number;\n public timeFromContent?: number;\n\n constructor(ad?: Ad) {\n if (ad) {\n this.adClickthroughUrl = ad.clickThroughUrl;\n this.adId = ad.id;\n this.mediaUrl = ad.mediaFileUrl;\n const mediaUrlDetails = Utils.getHostnameAndPathFromUrl(this.mediaUrl || '');\n this.mediaPath = mediaUrlDetails.path;\n this.mediaServer = mediaUrlDetails.hostname;\n this.isLinear = ad.isLinear;\n this.adPlaybackHeight = ad.height;\n this.adPlaybackWidth = ad.width;\n\n if (ad.data) {\n this.videoBitrate = ad.data.bitrate === undefined ? undefined : ad.data.bitrate * 1000;\n this.streamFormat = ad.data.mimeType;\n // data.minBitrate\n // data.maxBitrate\n }\n\n const data = ad.data as VastAdData;\n if (data) {\n if (data.adSystem) {\n this.adSystem = data.adSystem.name;\n // this.adSystemVersion = data.adSystem.version;\n }\n if (data.advertiser) {\n this.advertiserName = data.advertiser.name;\n // this.advertiserId = data.advertiser.id;\n }\n // data.codec\n // data.delivery\n // data.pricing\n this.apiFramework = data.apiFramework;\n\n if (data.creative) {\n this.creativeAdId = data.creative.adId;\n this.creativeId = data.creative.id;\n\n if (data.creative.universalAdId) {\n this.universalAdIdRegistry = data.creative.universalAdId.idRegistry;\n this.universalAdIdValue = data.creative.universalAdId.value;\n }\n }\n this.adDescription = data.adDescription;\n this.minSuggestedDuration = Utils.calculateTimeWithUndefined(data.minSuggestedDuration);\n if (data.survey) {\n this.surveyUrl = data.survey.uri;\n // data.survey.type;\n }\n this.adTitle = data.adTitle;\n this.wrapperAdsCount = data.wrapperAdIds ? data.wrapperAdIds.length : 0;\n }\n }\n const linearAd = ad as LinearAd;\n if (linearAd) {\n this.adSkippableAfter = AdSample.parseSkipAfter(linearAd.skippableAfter);\n this.adSkippable =\n linearAd.skippable || (this.adSkippableAfter === undefined ? undefined : this.adSkippableAfter >= 0);\n this.adDuration = Utils.calculateTime(linearAd.duration);\n }\n }\n}\n","import {logger} from './Logger';\nimport * as Utils from './Utils';\n\nexport class ViewportTracker {\n private onIntersectionChanged: () => void;\n private observer?: IntersectionObserver;\n private element: HTMLElement;\n private inViewport?: boolean = undefined;\n private threshold: number;\n private hidden: string | undefined;\n private visibilityChange?: string;\n\n constructor(element: HTMLElement, onIntersectionChanged: () => void, threshold: number = 1.0) {\n this.threshold = threshold;\n this.onIntersectionChanged = onIntersectionChanged;\n this.element = element;\n\n try {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: '0px',\n threshold,\n };\n this.observer = new IntersectionObserver((entries, observer) => this.handleIntersect(entries, observer), options);\n this.observer.observe(element);\n } catch (error) {\n logger.log(\"Couldn't create instance of IntersectionObserver. timeInViewport will always be reported as 100%.\");\n }\n\n this.hidden = Utils.getHiddenProp();\n if (this.hidden) {\n this.visibilityChange = this.hidden.replace('hidden', '') + 'visibilitychange';\n document.addEventListener(\n this.visibilityChange,\n (this.handleVisibilityChange = this.handleVisibilityChange.bind(this)),\n false\n );\n }\n }\n\n public isHidden() {\n return this.hidden && document[this.hidden];\n }\n\n public isInViewport(): boolean {\n return !this.isHidden() && (this.inViewport == null ? true : this.inViewport);\n }\n\n public dispose() {\n if (this.observer) {\n this.observer.unobserve(this.element);\n this.observer.disconnect();\n }\n if (this.visibilityChange) {\n document.removeEventListener(this.visibilityChange, this.handleVisibilityChange, false);\n }\n }\n\n private handleVisibilityChange() {\n this.onIntersectionChanged();\n }\n\n private handleIntersect(entries: IntersectionObserverEntry[], observer: IntersectionObserver) {\n entries.forEach((i) => {\n if (i.target === this.element) {\n this.inViewport = !(i.intersectionRatio < this.threshold);\n }\n });\n this.onIntersectionChanged();\n }\n}\n","import {DeferredLicenseLoadingAdapterAPI} from '../adapters/internal/DeferredLicenseLoadingAdapterAPI';\nimport {AnalyticsConfig, CollectorConfig} from '../types/AnalyticsConfig';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {LicensingRequest} from '../types/LicensingRequest';\nimport {LicenseCall} from '../utils/LicenseCall';\nimport {ANALYTICS_BACKEND_BASE_URL} from '../utils/Settings';\nimport {Backend} from './Backend';\nimport {DebuggingBackend} from './DebuggingBackend';\nimport {LicenseCheckingBackend} from './LicenseCheckingBackend';\nimport {LongPlaytimeFilteringBackend} from './LongPlaytimeFilteringBackend';\nimport {NoOpBackend} from './NoOpBackend';\nimport {SequenceNumberBackend} from './SequenceNumberBackend';\n\ninterface InternalCollectorConfig extends CollectorConfig {\n wrapBackend: (innerBackend: Backend) => Backend;\n}\n\nexport class BackendFactory {\n public createBackend(\n analyticsConfig: AnalyticsConfig,\n licensingRequest: LicensingRequest,\n adapter: DeferredLicenseLoadingAdapterAPI,\n authenticationCallback: AuthenticationCallback\n ): Backend {\n if (!this.isEnabled(analyticsConfig)) {\n return new NoOpBackend();\n }\n const inner = this.createInnerBackend(analyticsConfig, licensingRequest, adapter, authenticationCallback);\n return this.decorateWithDebuggingBackend(analyticsConfig, inner);\n }\n\n private decorateWithDebuggingBackend(config: AnalyticsConfig, backend: Backend): Backend {\n if (config.debug) {\n return new DebuggingBackend(config, backend);\n }\n return backend;\n }\n\n private decorateWithBackendFromConfigIfAvailable(analyticsConfig: AnalyticsConfig, innerBackend: Backend): Backend {\n if (\n analyticsConfig !== undefined &&\n analyticsConfig.config !== undefined &&\n (analyticsConfig.config as InternalCollectorConfig).wrapBackend !== undefined\n ) {\n return (analyticsConfig.config as InternalCollectorConfig).wrapBackend(innerBackend);\n }\n\n return innerBackend;\n }\n\n private isEnabled(analyticsConfig: AnalyticsConfig): boolean {\n return analyticsConfig.config === undefined || analyticsConfig.config.enabled !== false;\n }\n\n private createInnerBackend(\n analyticsConfig: AnalyticsConfig,\n licensingRequest: LicensingRequest,\n adapter: DeferredLicenseLoadingAdapterAPI,\n authenticationCallback: AuthenticationCallback\n ): Backend {\n const backendUrl = (analyticsConfig.config && analyticsConfig.config.backendUrl) || ANALYTICS_BACKEND_BASE_URL;\n let innerBackend: Backend = new LicenseCheckingBackend(\n licensingRequest,\n LicenseCall,\n backendUrl,\n adapter,\n authenticationCallback\n );\n innerBackend = this.decorateWithBackendFromConfigIfAvailable(analyticsConfig, innerBackend);\n\n const sequenceNumberAssigningBackend = new SequenceNumberBackend(innerBackend);\n return new LongPlaytimeFilteringBackend(sequenceNumberAssigningBackend);\n }\n}\n","import {LicensingResponse} from '../types/LicensingRequest';\nimport {post} from './Http';\nimport {joinUrls} from './Utils';\n\nexport function LicenseCall(key: string, domain: string, version: string, baseUrl: string): Promise<LicensingResponse> {\n const licenseServerUrl = joinUrls(baseUrl, '/licensing');\n const licensingRequest = {\n analyticsVersion: version,\n domain,\n key,\n };\n\n return new Promise<LicensingResponse>((resolve) => {\n post(licenseServerUrl, licensingRequest, (response) => {\n resolve(response);\n });\n });\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsDebugConfig} from '../types/AnalyticsDebugConfig';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport {Backend} from './Backend';\n\nexport class DebuggingBackend implements Backend {\n private underlying: Backend;\n private debugFields?: string[];\n\n constructor(config: AnalyticsConfig, underlying: Backend) {\n this.underlying = underlying;\n if (config.debug && (config.debug as AnalyticsDebugConfig).fields) {\n this.debugFields = (config.debug as AnalyticsDebugConfig).fields;\n }\n }\n\n public sendRequest(sample: Sample) {\n this.printFields(sample);\n this.underlying.sendRequest(sample);\n }\n\n public sendUnloadRequest(sample: Sample) {\n this.printFields(sample);\n this.underlying.sendUnloadRequest(sample);\n }\n\n public sendRequestSynchronous(sample: Sample) {\n this.printFields(sample);\n this.underlying.sendRequestSynchronous(sample);\n }\n\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.underlying.sendAdRequest(sample);\n }\n\n private printFields(sample: Sample) {\n if (this.debugFields && this.debugFields.length) {\n const fields = {};\n this.debugFields.forEach((f) => (fields[f] = sample[f]));\n logger.logTable([fields]);\n }\n }\n}\n","import {DeferredLicenseLoadingAdapterAPI} from '../adapters/internal/DeferredLicenseLoadingAdapterAPI';\nimport {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {LicenseCallFunc, LicensingRequest, LicensingResponse, LicensingResult} from '../types/LicensingRequest';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport {ANALYTICS_LICENSECALL_TIMEOUT} from '../utils/Settings';\nimport {Backend} from './Backend';\nimport {NoOpBackend} from './NoOpBackend';\nimport {QueueBackend} from './QueueBackend';\nimport {RemoteBackend} from './RemoteBackend';\n\nexport class LicenseCheckingBackend implements Backend {\n public promise?: Promise<LicensingResponse>;\n private licenseLazyLoadingTimeoutHandle?: number;\n private backend: Backend;\n private info: LicensingRequest;\n\n constructor(\n info: LicensingRequest,\n private licenseCall: LicenseCallFunc,\n private backendBaseUrl: string,\n private adapter: DeferredLicenseLoadingAdapterAPI,\n private authenticationCallback: AuthenticationCallback\n ) {\n this.info = {...info};\n this.backend = new QueueBackend();\n this.licenseCall = licenseCall;\n\n if (info.key !== undefined && info.key !== '') {\n this.promise = this.wrapLicenseCheckPromiseWithCallback(this.performLicenseCheck(), this.authenticationCallback);\n } else if (adapter.supportsDeferredLicenseLoading === true) {\n adapter.onLicenseKeyReceived.subscribe(this.licenseKeyReceived);\n adapter.onLicenseCallFailed.subscribe(this.licenseCallFailed);\n this.licenseLazyLoadingTimeoutHandle = window.setTimeout(\n this.licenseLazyLoadingTimeout,\n ANALYTICS_LICENSECALL_TIMEOUT\n );\n } else {\n authenticationCallback.authenticationCompleted(false, undefined);\n this.backend = new NoOpBackend();\n }\n }\n\n public performLicenseCheck(): Promise<LicensingResponse> {\n const {key, domain, version} = this.info;\n if (!key || key === '') {\n const error: LicensingResponse = {\n status: LicensingResult.Denied,\n message: 'No license key provided',\n };\n this.backend = new NoOpBackend();\n return Promise.resolve(error);\n }\n\n return this.licenseCall(key, domain, version, this.backendBaseUrl)\n .then((result) => {\n if (result.status === LicensingResult.Granted) {\n const remoteBackend = new RemoteBackend(true, this.backendBaseUrl, key);\n (this.backend as QueueBackend).flushTo(remoteBackend);\n this.backend = remoteBackend;\n } else {\n throw new Error(result.message);\n }\n return result;\n })\n .catch((err: Error) => {\n if (err.message === 'Ignoring Impression due to DNT Header being set') {\n logger.error('License Check for Bitmovin Analytics failed because of', err);\n } else {\n logger.errorMessageToUser('License Check for Bitmovin Analytics failed because of', err);\n }\n this.backend = new NoOpBackend();\n return {\n status: LicensingResult.Denied,\n message: err.message,\n };\n });\n }\n\n public sendRequest(sample: Sample) {\n this.backend.sendRequest(sample);\n }\n public sendUnloadRequest(sample: Sample) {\n this.backend.sendUnloadRequest(sample);\n }\n public sendRequestSynchronous(sample: Sample) {\n this.backend.sendRequestSynchronous(sample);\n }\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.backend.sendAdRequest(sample);\n }\n\n private licenseKeyReceived = (eventArgs: {licenseKey: string}) => {\n clearTimeout(this.licenseLazyLoadingTimeoutHandle);\n this.unsubscribeFromAdapter();\n this.info.key = eventArgs.licenseKey;\n this.promise = this.wrapLicenseCheckPromiseWithCallback(this.performLicenseCheck(), this.authenticationCallback);\n };\n\n private licenseCallFailed = () => {\n clearTimeout(this.licenseLazyLoadingTimeoutHandle);\n this.unsubscribeFromAdapter();\n this.backend = new NoOpBackend();\n this.authenticationCallback.authenticationCompleted(false, undefined);\n };\n\n private licenseLazyLoadingTimeout = () => {\n this.unsubscribeFromAdapter();\n this.backend = new NoOpBackend();\n this.authenticationCallback.authenticationCompleted(false, undefined);\n };\n\n private unsubscribeFromAdapter() {\n this.adapter.onLicenseKeyReceived.unsubscribe(this.licenseKeyReceived);\n this.adapter.onLicenseCallFailed.unsubscribe(this.licenseCallFailed);\n }\n\n private wrapLicenseCheckPromiseWithCallback(\n promise: Promise<LicensingResponse>,\n authenticationCallback: AuthenticationCallback\n ): Promise<LicensingResponse> {\n return promise.then((response) => {\n authenticationCallback.authenticationCompleted(response.status === LicensingResult.Granted, response.features);\n return response;\n });\n }\n}\n","import {FeatureConfigContainer} from './FeatureConfigContainer';\n\nexport interface LicensingRequest {\n key?: string;\n domain: string;\n version: string;\n}\n\nexport enum LicensingResult {\n Granted = 'granted',\n Denied = 'denied',\n Skip = 'skip',\n}\n\nexport interface LicensingResponse {\n status: LicensingResult;\n message: string;\n features?: FeatureConfigContainer;\n}\n\nexport type LicenseCallFunc = (\n key: string,\n domain: string,\n version: string,\n baseUrl: string\n) => Promise<LicensingResponse>;\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {Backend} from './Backend';\n\nexport class QueueBackend implements Backend {\n public queue: Sample[] = [];\n public unloadQueue: Sample[] = [];\n public syncQueue: Sample[] = [];\n public adQueue: Array<AdSample & AdBreakSample & AdAnalyticsSample> = [];\n\n public sendRequest(sample: Sample) {\n this.queue.push(sample);\n }\n public sendUnloadRequest(sample: Sample) {\n this.unloadQueue.push(sample);\n }\n public sendRequestSynchronous(sample: Sample) {\n this.syncQueue.push(sample);\n }\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.adQueue.push(sample);\n }\n\n public flushTo(backend: Backend) {\n this.queue.forEach((e) => {\n backend.sendRequest(e);\n });\n this.unloadQueue.forEach((e) => {\n backend.sendUnloadRequest(e);\n });\n this.syncQueue.forEach((e) => {\n backend.sendRequestSynchronous(e);\n });\n this.adQueue.forEach((e) => {\n backend.sendAdRequest(e);\n });\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {AnalyticsCall} from '../utils/AnalyticsCall';\nimport {noOp} from '../utils/Utils';\nimport {Backend} from './Backend';\n\nexport class RemoteBackend implements Backend {\n public analyticsCall: AnalyticsCall;\n public hasAdModule: boolean;\n\n constructor(hasAdModule: boolean, backendBaseUrl: string, private licenseKey: string) {\n this.hasAdModule = hasAdModule;\n this.analyticsCall = new AnalyticsCall(backendBaseUrl);\n }\n\n public sendRequest(sample: Sample) {\n sample.key = this.licenseKey;\n this.analyticsCall.sendRequest(sample, noOp);\n }\n\n public sendUnloadRequest(sample: Sample) {\n sample.key = this.licenseKey;\n this.analyticsCall.sendUnloadRequest(sample);\n }\n\n public sendRequestSynchronous(sample: Sample) {\n sample.key = this.licenseKey;\n this.analyticsCall.sendRequestSynchronous(sample, noOp);\n }\n\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n sample.key = this.licenseKey;\n if (!this.hasAdModule) {\n return;\n }\n this.analyticsCall.sendAdRequest(sample);\n }\n}\n","import {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {noOp} from '../utils/Utils';\nimport {post} from './Http';\nimport {joinUrls} from './Utils';\n\nexport class AnalyticsCall {\n private analyticsServerUrl: string;\n private adAnalyticsServerUrl: string;\n\n constructor(baseUrl: string) {\n this.analyticsServerUrl = joinUrls(baseUrl, 'analytics');\n this.adAnalyticsServerUrl = joinUrls(baseUrl, 'analytics/a');\n }\n\n public sendRequest(sample: Sample, callback: () => void) {\n post(this.analyticsServerUrl, sample, callback);\n }\n\n public sendUnloadRequest(sample: Sample) {\n this.trySendBeacon((data: Sample) => this.sendRequestSynchronous(data, noOp), this.getAnalyticsServerUrl(), sample);\n }\n\n public trySendBeacon(fallbackFunction: (data: any) => void, url: string, data: any) {\n if (typeof navigator.sendBeacon === 'undefined') {\n fallbackFunction(data);\n } else {\n const success = navigator.sendBeacon(url, JSON.stringify(data));\n if (!success) {\n fallbackFunction(data);\n }\n }\n }\n\n public sendRequestSynchronous(sample: Sample, callback: () => void) {\n post(this.analyticsServerUrl, sample, callback, false);\n }\n\n public sendAdRequest(sample: AdSample) {\n this.trySendBeacon(\n (data: AdSample) => post(this.getAdAnalyticsServerUrl(), data, noOp),\n this.getAdAnalyticsServerUrl(),\n sample\n );\n }\n\n public getAnalyticsServerUrl() {\n return this.analyticsServerUrl;\n }\n\n public getAdAnalyticsServerUrl() {\n return this.adAnalyticsServerUrl;\n }\n}\n","import {Sample} from '../types/Sample';\nimport {Backend} from './Backend';\n\nexport class LongPlaytimeFilteringBackend implements Backend {\n private backend: Backend;\n\n constructor(next: Backend) {\n this.backend = next;\n }\n\n public sendRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendRequest(sample);\n }\n\n public sendUnloadRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendUnloadRequest(sample);\n }\n\n public sendRequestSynchronous(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendRequestSynchronous(sample);\n }\n\n public sendAdRequest(sample: any) {\n this.backend.sendAdRequest(sample);\n }\n\n private isPlayedAboveThreshold(sample: Sample): boolean {\n return (sample.played == null ? 0 : sample.played) >= 90000;\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {Backend} from './Backend';\n\nexport class SequenceNumberBackend implements Backend {\n private underlying: Backend;\n private sequenceNumber: number = 0;\n\n constructor(underlying: Backend) {\n this.underlying = underlying;\n }\n\n public sendRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendRequest(sample);\n }\n\n public sendUnloadRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendUnloadRequest(sample);\n }\n\n public sendRequestSynchronous(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendRequestSynchronous(sample);\n }\n\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.underlying.sendAdRequest(sample);\n }\n\n private updateSampleBeforeSending(sample: Sample) {\n sample.sequenceNumber = this.sequenceNumber++;\n }\n}\n","import {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport * as Utils from '../utils/Utils';\n\nexport const BITMOVIN_ANALYTICS_UUID_COOKIE_NAME = 'bitmovin_analytics_uuid';\n\nexport class SessionPersistenceHandler {\n public readonly userId: string;\n\n private readonly cookiesEnabled: boolean;\n private readonly cookiesDomain: string | null;\n\n constructor(config: AnalyticsConfig) {\n const collectorConfig = config.config;\n this.cookiesEnabled = collectorConfig == null || collectorConfig.cookiesEnabled !== false;\n if (collectorConfig != null && collectorConfig.cookiesDomain != null) {\n this.cookiesDomain = collectorConfig.cookiesDomain;\n } else {\n this.cookiesDomain = null;\n }\n\n if (!this.cookiesEnabled) {\n this.ensureNoCookiePresent();\n }\n\n this.userId = this.setupUserId();\n }\n\n private setupUserId() {\n let userId = Utils.getCookie(BITMOVIN_ANALYTICS_UUID_COOKIE_NAME);\n if (Utils.isNullOrEmptyString(userId)) {\n userId = this.createAndSetNewUserId();\n }\n return userId;\n }\n\n private createAndSetNewUserId() {\n const generatedId = Utils.generateUUID();\n this.writeCookie(generatedId);\n return generatedId;\n }\n\n private ensureNoCookiePresent() {\n const userId = Utils.getCookie(BITMOVIN_ANALYTICS_UUID_COOKIE_NAME);\n if (Utils.isNullOrEmptyString(userId)) {\n return;\n }\n const cookie = `${BITMOVIN_ANALYTICS_UUID_COOKIE_NAME}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n document.cookie = cookie;\n }\n\n private writeCookie(userId: string) {\n if (!this.cookiesEnabled) {\n return;\n }\n let cookie = `${BITMOVIN_ANALYTICS_UUID_COOKIE_NAME}=${userId}; path=/; expires=\"Mon, 31 Dec 2029 23:00:00 GMT\"; max-age=315400000`;\n\n if (this.cookiesDomain != null) {\n cookie += `; domain=${this.cookiesDomain}`;\n }\n\n document.cookie = cookie;\n }\n}\n","import {Bitmovin7AnalyticsStateMachine} from '../../analyticsStateMachines/Bitmovin7AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {CastTech} from '../../enums/CastTech';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {getSourceInfoFromBitmovinSourceConfig} from '../../utils/BitmovinProgressiveSourceHelper';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class Bitmovin7InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n private onBeforeUnLoadEvent: boolean = false;\n\n constructor(private player: any, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new Bitmovin7AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.register();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public getPlayerVersion = () => this.player.version;\n public getPlayerName = () => Player.BITMOVIN;\n public getPlayerTech = () => this.player.getPlayerType();\n public getAutoPlay(): boolean {\n if (this.player.getConfig().playback) {\n return this.player.getConfig().playback.autoplay || false;\n }\n return false;\n }\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n const info: PlaybackInfo = {\n ...super.getCommonPlaybackInfo(),\n size: this.player.isFullscreen() ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n isLive: this.player.isLive(),\n videoDuration: this.player.getDuration(),\n streamFormat: this.player.getStreamType(),\n videoWindowWidth: this.player.getFigure().offsetWidth,\n videoWindowHeight: this.player.getFigure().offsetHeight,\n isMuted: this.player.isMuted(),\n isCasting: this.player.isCasting(),\n audioLanguage: this.player.getAudio() != null ? this.player.getAudio().lang : null,\n subtitleEnabled: false,\n droppedFrames: this.player.isReady() ? this.player.getDroppedFrames() : 0,\n };\n\n this.applySubtitleProperties(info);\n this.applyPlaybackQualityProperties(info);\n this.applySourceProperties(info);\n this.applyCastingProperties(info);\n\n return info;\n }\n\n public register() {\n this.player.addEventHandler(this.player.EVENT.ON_SOURCE_UNLOADED, (event: any) => {\n this.eventCallback(Event.SOURCE_UNLOADED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_SOURCE_LOADED, (event: any) => {\n this.resetSourceRelatedState();\n this.eventCallback(Event.SOURCE_LOADED, {});\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_READY, () => {\n this.eventCallback(Event.READY, {});\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_CAST_STARTED, (event: any) => {\n this.eventCallback(Event.START_CAST, event);\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_CAST_STOPPED, () => {\n this.eventCallback(Event.END_CAST, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_PLAY, () => {\n this.eventCallback(Event.PLAY, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_PAUSED, () => {\n this.eventCallback(Event.PAUSE, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_TIME_CHANGED, () => {\n this.eventCallback(Event.TIMECHANGED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_SEEK, () => {\n this.eventCallback(Event.SEEK, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_SEEKED, () => {\n this.eventCallback(Event.SEEKED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_STALL_STARTED, () => {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_STALL_ENDED, () => {\n this.eventCallback(Event.END_BUFFERING, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_AUDIO_PLAYBACK_QUALITY_CHANGED, () => {\n const quality = this.player.getPlaybackAudioData();\n\n if (this.shouldAllowAudioQualityChange(quality.bitrate)) {\n this.setPreviousAudioBitrate(quality.bitrate);\n this.eventCallback(Event.AUDIO_CHANGE, {\n bitrate: quality.bitrate,\n currentTime: this.player.getCurrentTime(),\n });\n }\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_VIDEO_PLAYBACK_QUALITY_CHANGED, () => {\n const quality = this.player.getPlaybackVideoData();\n if (this.shouldAllowVideoQualityChange(quality.bitrate)) {\n this.setPreviousVideoBitrate(quality.bitrate);\n this.eventCallback(Event.VIDEO_CHANGE, {\n width: quality.width,\n height: quality.height,\n bitrate: quality.bitrate,\n currentTime: this.player.getCurrentTime(),\n });\n }\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_FULLSCREEN_ENTER, () => {\n this.eventCallback(Event.START_FULLSCREEN, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_FULLSCREEN_EXIT, () => {\n this.eventCallback(Event.END_FULLSCREEN, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_AD_STARTED, () => {\n this.eventCallback(Event.START_AD, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_AD_FINISHED, () => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_MUTED, () => {\n this.eventCallback(Event.MUTE, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_UNMUTED, () => {\n this.eventCallback(Event.UN_MUTE, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_ERROR, (event: any) => {\n this.eventCallback(Event.ERROR, {\n code: event.code,\n message: event.message,\n currentTime: this.player.getCurrentTime(),\n data: {},\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_PLAYBACK_FINISHED, () => {\n this.eventCallback(Event.PLAYBACK_FINISHED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_DOWNLOAD_FINISHED, (event: any) => {\n if (event.downloadType.indexOf('drm/license/') === 0) {\n this.drmPerformanceInfo = {\n drmType: event.downloadType.replace('drm/license/', ''),\n drmLoadTime: event.downloadTime * 1000,\n };\n }\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_AUDIO_CHANGED, (event: any) => {\n this.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_SUBTITLE_CHANGED, (event: any) => {\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n let handlePageClose = () => {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n let currentTime: number | undefined;\n if (this.player != null) {\n currentTime = this.player.getCurrentTime();\n }\n this.eventCallback(Event.UNLOAD, {\n currentTime,\n });\n }\n this.release();\n };\n handlePageClose = handlePageClose.bind(true);\n\n this.player.on(this.player.EVENT.ON_DESTROY, handlePageClose);\n this.windowEventTracker.addEventListener('beforeunload', handlePageClose);\n this.windowEventTracker.addEventListener('unload', handlePageClose);\n }\n\n public sourceChange(config: any, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, this.player.getCurrentTime());\n }\n protected get currentTime(): number {\n return this.player.getCurrentTime();\n }\n\n private applySourceProperties(info: PlaybackInfo) {\n const source = this.player.getConfig().source;\n if (source == null) {\n return;\n }\n info.videoTitle = source.title;\n info.mpdUrl = source.dash;\n info.m3u8Url = source.hls;\n\n const progSourceInfo = getSourceInfoFromBitmovinSourceConfig(source.progressive, this.player);\n info.progUrl = progSourceInfo.progUrl;\n if (this.player.getStreamType() === 'progressive') {\n info.videoBitrate = progSourceInfo.progBitrate;\n }\n }\n\n private applySubtitleProperties(info: PlaybackInfo) {\n const subtitle = this.player.getSubtitle() || {};\n\n info.subtitleEnabled = subtitle.id != null;\n info.subtitleLanguage = subtitle.lang;\n }\n\n private applyPlaybackQualityProperties(info: PlaybackInfo) {\n const videoQuality = this.player.getPlaybackVideoData();\n if (videoQuality !== null) {\n info.videoBitrate = videoQuality.bitrate;\n info.videoPlaybackHeight = videoQuality.height;\n info.videoPlaybackWidth = videoQuality.width;\n }\n\n const audioQuality = this.player.getPlaybackAudioData();\n if (audioQuality !== null) {\n info.audioBitrate = audioQuality.bitrate;\n }\n }\n\n private applyCastingProperties(info: PlaybackInfo) {\n const isCasting = this.player.isCasting() || this.player.isAirplayActive() || false;\n info.isCasting = isCasting;\n if (!isCasting) {\n return;\n }\n\n // AirPlay\n if (this.player.isAirplayActive()) {\n info.castTech = CastTech.AirPlay;\n return;\n }\n\n // Casting Tech from RemoteControlConfig\n const remoteControlConfig = this.player.getConfig().remotecontrol;\n if (remoteControlConfig === null || remoteControlConfig === undefined) {\n return;\n }\n\n switch (remoteControlConfig.type) {\n case 'googlecast':\n info.castTech = CastTech.GoogleCast;\n break;\n case 'websocket':\n info.castTech = CastTech.WebSocket;\n break;\n }\n }\n}\n","import * as StateMachine from 'javascript-state-machine';\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {EventDebugging} from '../utils/EventDebugging';\nimport {logger, padRight} from '../utils/Logger';\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\n\nenum State {\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n AD = 'AD',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class Bitmovin7AnalyticsStateMachine extends AnalyticsStateMachine {\n public static PAUSE_SEEK_DELAY = 200;\n public static SEEKED_PAUSE_DELAY = 300;\n\n private debuggingStates: EventDebugging[] = [];\n private enabledDebugging = false;\n\n private pausedTimestamp: any;\n private seekTimestamp: number;\n private seekedTimestamp: number;\n private seekedTimeout: number;\n\n private seekStarted: boolean;\n private seekEnded: boolean;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.pausedTimestamp = null;\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n this.seekedTimeout = 0;\n this.seekStarted = false;\n this.seekEnded = false;\n }\n\n public getAllStates() {\n return [\n ...Object.keys(State).map((key) => State[key]),\n 'FINISH_PLAY_SEEKING',\n 'PLAY_SEEK',\n 'FINISH_QUALITYCHANGE_PAUSE',\n 'FINISH_QUALITYCHANGE',\n 'FINISH_QUALITYCHANGE_REBUFFERING',\n ];\n }\n\n public sourceChange = (config: any, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n\n public createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.SETUP,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.READY, from: [State.SETUP, State.ERROR], to: State.READY},\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.END_BUFFERING, from: State.REBUFFERING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSED_SEEKING},\n {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.SEEKED, from: State.PAUSED_SEEKING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSED_SEEKING, to: State.PLAYING},\n {name: Event.PAUSE, from: State.PAUSED_SEEKING, to: State.PAUSE},\n\n {name: 'PLAY_SEEK', from: State.PAUSE, to: State.PLAY_SEEKING},\n {name: 'PLAY_SEEK', from: State.PAUSED_SEEKING, to: State.PLAY_SEEKING},\n {name: 'PLAY_SEEK', from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n\n // We are ending the seek\n {name: Event.PLAY, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n\n {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.END, from: State.PLAY_SEEKING, to: State.END},\n {name: Event.END, from: State.PAUSED_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n {name: Event.PLAY, from: State.END, to: State.STARTUP},\n\n {name: Event.ERROR, from: this.getAllStates(), to: State.ERROR},\n\n {name: Event.SEEK, from: State.END_PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: 'FINISH_PLAY_SEEKING', from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.UNLOAD, from: this.getAllStates(), to: State.END},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD},\n {name: Event.END_AD, from: State.AD, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE, State.PLAYING], to: State.CASTING},\n {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAYING, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.UN_MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.MANUAL_SOURCE_CHANGE, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n {name: Event.SOURCE_UNLOADED, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n\n {name: Event.READY, from: State.SOURCE_CHANGING, to: State.READY},\n\n // {name: Events.SOURCE_LOADED, from: State.SETUP, to: State.SETUP},\n // {name: Events.SOURCE_LOADED, from: State.READY, to: State.READY},\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.TIMECHANGED, from: State.AUDIOTRACK_CHANGING, to: State.PLAYING},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGING},\n {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n {name: Event.TIMECHANGED, from: State.SUBTITLE_CHANGING, to: State.PLAYING},\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n ],\n callbacks: {\n onpause: (event, from, to, timestamp) => {\n if (from === State.PLAYING) {\n this.pausedTimestamp = timestamp;\n }\n },\n onbeforeevent: (event, from, to, timestamp, eventObject) => {\n if (event === Event.SEEK && from === State.PAUSE) {\n if (!this.seekStarted) {\n this.seekTimestamp = timestamp;\n this.seekStarted = true;\n }\n const elapsedTime = timestamp - this.pausedTimestamp;\n if (elapsedTime < Bitmovin7AnalyticsStateMachine.PAUSE_SEEK_DELAY && elapsedTime > 0) {\n this.stateMachine.PLAY_SEEK(timestamp);\n return false;\n }\n }\n\n if (event === Event.SEEK) {\n window.clearTimeout(this.seekedTimeout);\n }\n\n if (event === Event.SEEKED && from === State.PAUSED_SEEKING) {\n this.seekedTimestamp = timestamp;\n this.seekEnded = true;\n this.seekedTimeout = window.setTimeout(() => {\n this.stateMachine.pause(timestamp, eventObject);\n }, Bitmovin7AnalyticsStateMachine.SEEKED_PAUSE_DELAY);\n return false;\n }\n\n if (from === State.REBUFFERING && to === State.QUALITYCHANGE_REBUFFERING) {\n return false;\n }\n },\n onafterevent: (event, from, to, timestamp) => {\n if (to === State.QUALITYCHANGE_PAUSE) {\n this.stateMachine.FINISH_QUALITYCHANGE_PAUSE(timestamp);\n }\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.QUALITYCHANGE_REBUFFERING) {\n this.stateMachine.FINISH_QUALITYCHANGE_REBUFFERING(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n },\n onenterstate: (\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || new Date().getTime();\n }\n\n logger.log('[ENTER] ' + padRight(to, 20) + 'EVENT: ' + padRight(event, 20) + ' from ' + padRight(from, 14));\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n this.addStatesToLog(event, from, to, timestamp, eventObject);\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (event === 'PLAY_SEEK' && from === State.PAUSE) {\n return true;\n }\n\n const fnName = String(from).toLowerCase();\n if (from === State.END_PLAY_SEEKING || from === State.PAUSED_SEEKING) {\n const seekDuration = this.seekedTimestamp - this.seekTimestamp;\n if (this.seekStarted && this.seekEnded && to !== State.PLAY_SEEKING) {\n this.seekEnded = this.seekStarted = false;\n this.stateMachineCallbacks[fnName](seekDuration, fnName, eventObject);\n }\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (from === State.PAUSE && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.stateMachineCallbacks.pause(stateDuration, fnName);\n } else {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n callbackFunction(stateDuration, fnName, eventObject);\n } else {\n logger.error('Could not find callback function for ' + fnName);\n }\n }\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n } else if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n },\n onseek: (event, from, to, timestamp) => {\n if (!this.seekStarted) {\n this.seekTimestamp = timestamp;\n this.seekStarted = true;\n }\n },\n onseeked: (event, from, to, timestamp) => {\n this.seekedTimestamp = timestamp;\n this.seekEnded = true;\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n this.stateMachineCallbacks.heartbeat(stateDuration, String(from).toLowerCase(), {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n public callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n try {\n exec.call(this.stateMachine, timestamp, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + eventType, exec, eventObject, e);\n }\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n public addStatesToLog(\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) {\n if (this.enabledDebugging) {\n this.debuggingStates.push(new EventDebugging(event, from, to, timestamp, eventObject));\n }\n }\n\n public getStates() {\n return this.debuggingStates;\n }\n\n public setEnabledDebugging(enabled: boolean) {\n this.enabledDebugging = enabled;\n }\n}\n","import {ErrorCode} from './ErrorCode';\n\nexport class VideoStartFailedReason {\n public static PAGE_CLOSED = new VideoStartFailedReason('PAGE_CLOSED', null);\n public static PLAYER_ERROR = new VideoStartFailedReason('PLAYER_ERROR', null);\n public static TIMEOUT = new VideoStartFailedReason('TIMEOUT', ErrorCode.VIDEO_STARTUP_TIMEOUT_REACHED);\n public static UNKNOWN = new VideoStartFailedReason('UNKNOWN', null);\n\n private constructor(public readonly reason: string, public readonly errorCode: ErrorCode | null) {}\n}\n","import {FeatureConfig} from './FeatureConfig';\n\nexport abstract class Feature<TConfigContainer, TConfig extends FeatureConfig> {\n private _config?: TConfig = undefined;\n private _isEnabled: boolean = true;\n\n public get config(): TConfig | undefined {\n return this._config;\n }\n\n public get isEnabled(): boolean {\n return this._isEnabled;\n }\n\n public abstract reset(): void;\n public abstract enabled(): void;\n public abstract disabled(): void;\n public abstract configured(authenticated: boolean, config?: TConfig): void;\n\n public disable() {\n this._isEnabled = false;\n this.disabled();\n }\n\n public configure(authenticated: boolean, configContainer?: TConfigContainer): TConfig | undefined {\n if (configContainer != null) {\n this._config = this.extractConfig(configContainer);\n }\n this.configured(authenticated, this._config);\n return this._config;\n }\n\n public abstract extractConfig(configContainer: TConfigContainer): TConfig | undefined;\n}\n","import {AnalyticsConfig} from './AnalyticsConfig';\nimport {CustomDataValues} from './CustomDataValues';\nimport * as EventData from './EventData';\nimport {Sample} from './Sample';\n\nexport interface StateMachineCallbacks {\n setup: (duration: number, state: string) => void;\n startup: (duration: number, state: string) => void;\n playing: (duration: number, state: string) => void;\n heartbeat: (duration: number, state: string, payload: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>) => void;\n qualitychange: (duration: number, state: string) => void;\n qualitychange_pause: (duration: number, state: string) => void;\n qualitychange_rebuffering: (duration: number, state: string) => void;\n videoChange: (event: any) => void;\n audioChange: (event: any) => void;\n audiotrack_changing: () => void;\n pause: (duration: number, state: string) => void;\n paused_seeking: (duration: number, state: string) => void;\n end_play_seeking: (duration: number, state: string) => void;\n rebuffering: (duration: number, state: string) => void;\n error: (event: Readonly<EventData.ErrorEvent>) => void;\n end: (duration: number, state: string) => void;\n unload: (duration: number, state: string) => void;\n ad: (duration: number, state: string) => void;\n mute: () => void;\n unMute: () => void;\n subtitle_changing: () => void;\n setVideoTimeEndFromEvent: (event: any) => void;\n setVideoTimeStartFromEvent: (event: any) => void;\n videoStartFailed: (event: Readonly<EventData.VideoStartFailedEvent>, sendRequest: boolean) => void;\n source_changing: (duration: number, state: string, event: any) => void;\n ready: (duration: number, state: string, event: any) => void;\n startCasting: (duration: number, event: any) => void;\n casting: (duration: number, event: any) => void;\n manualSourceChange: (event: {config: AnalyticsConfig}) => void;\n initialSourceChange: (event: {config: AnalyticsConfig}) => void;\n muting_ready: (duration: number, state: string, event: any) => void;\n customdatachange: (duration?: number, state?: string, event?: {values: CustomDataValues}) => void;\n\n // shuts down the collection and removes/clears all timeouts, intervals, eventlisteners\n release: () => void;\n playlistTransition: (event: Readonly<EventData.AnalyticsEventBase>) => void;\n}\n\n// tslint:disable:no-unused-expression\nexport const defaultStateMachineCallbacks: StateMachineCallbacks = {\n setup: (time: number, state: string) => void {},\n startup: (time: number, state: string) => void {},\n playing: (time: number, state: string) => void {},\n heartbeat: (time: number, state: string, payload: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>) => void {},\n qualitychange: (time: number, state: string) => void {},\n qualitychange_pause: (time: number, state: string) => void {},\n qualitychange_rebuffering: (time: number, state: string) => void {},\n videoChange: (event: any) => void {},\n audioChange: (event: any) => void {},\n audiotrack_changing: () => void {},\n pause: (time: number, state: string) => void {},\n paused_seeking: (time: number, state: string) => void {},\n end_play_seeking: (time: number, state: string) => void {},\n rebuffering: (time: number, state: string) => void {},\n error: (event: Readonly<EventData.ErrorEvent>) => void {},\n end: (time: number, state: string) => void {},\n unload: (time: number, state: string) => void {},\n ad: (time: number, state: string) => void {},\n mute: () => void {},\n unMute: () => void {},\n subtitle_changing: () => void {},\n setVideoTimeEndFromEvent: (event: any) => void {},\n setVideoTimeStartFromEvent: (event: any) => void {},\n videoStartFailed: (event: Readonly<EventData.VideoStartFailedEvent>, sendRequest: boolean) => void {},\n source_changing: (time: number, state: string, event: any) => void {},\n ready: (time: number, state: string, event: any) => void {},\n startCasting: (time: number, event: any) => void {},\n casting: (duration: number, event: any) => void {},\n manualSourceChange: (event: {config: AnalyticsConfig}) => void {},\n initialSourceChange: (event: {config: AnalyticsConfig}) => void {},\n muting_ready: (time: number, state: string, event: any) => void {},\n customdatachange: (time?: number, state?: string, event?: {values: CustomDataValues}) => void {},\n release: () => void {},\n playlistTransition: (event: Readonly<EventData.AnalyticsEventBase>) => void {},\n};\n","interface EventListener {\n eventName: string;\n func: EventListenerOrEventListenerObject;\n}\n\nexport class WindowEventTracker {\n private trackedObjects: EventListener[] = [];\n\n public addEventListener(eventName: string, func: EventListenerOrEventListenerObject) {\n this.trackedObjects.push({eventName, func});\n window.addEventListener(eventName, func);\n }\n\n public release() {\n while (this.trackedObjects.length !== 0) {\n const obj = this.trackedObjects.pop();\n if (obj === undefined) {\n continue;\n }\n\n window.removeEventListener(obj.eventName, obj.func);\n }\n }\n}\n","import {PlayerAPI, PlayerConfig} from 'bitmovin-player';\nimport {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {Bitmovin8InternalAdapter} from './internal/Bitmovin8InternalAdapter';\n\nexport class Bitmovin8Adapter extends Adapter implements AdapterAPI {\n constructor(player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n\n const playerConfig: PlayerConfig = (player as PlayerAPI).getConfig();\n let analyticsConfig: AnalyticsConfig = (playerConfig as any).analytics;\n if (analyticsConfig === undefined) {\n analyticsConfig = {};\n }\n\n analyticsConfig.playerKey = analyticsConfig.playerKey || playerConfig.key;\n\n this.internalAdapter = new Bitmovin8InternalAdapter(player, opts);\n this.analytics = new Analytics(analyticsConfig, this.internalAdapter);\n (player as any).analytics = this.analytics;\n this.wrapPlayerLoad(player, this.analytics);\n }\n\n private wrapPlayerLoad(player: PlayerAPI, analytics: Analytics) {\n const originalLoad = player.load;\n player.load = (...args: Parameters<typeof player.load>): Promise<void> => {\n if (args.length > 0) {\n const analyticsConfig = (args[0] as any).analytics;\n // we reset the analytics and reload with a new config\n analytics.sourceChange(analyticsConfig);\n }\n\n return originalLoad.apply(player, args);\n };\n }\n}\n","import {PlayerAPI, PlayerEventBase, SeekEvent, UserInteractionEvent} from 'bitmovin-player';\nimport {Bitmovin8AnalyticsStateMachine} from '../../analyticsStateMachines/Bitmovin8AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\nimport {SegmentTracker} from '../../core/SegmentTracker';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport {CastTech} from '../../enums/CastTech';\nimport {ErrorCode} from '../../enums/ErrorCode';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {HttpRequestTracking} from '../../features/httprequesttracking/HttpRequestTracking';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport {getSourceInfoFromBitmovinSourceConfig} from '../../utils/BitmovinProgressiveSourceHelper';\nimport {logger} from '../../utils/Logger';\nimport * as AnalyticsSettings from '../../utils/Settings';\nimport {AdModuleAPI} from './ads/AdModuleAPI';\nimport {Bitmovin8AdModule} from './ads/Bitmovin8AdModule';\nimport {Bitmovin8HttpRequestTrackingAdapter} from './Bitmovin8HttpRequestTrackingAdapter';\nimport {Bitmovin8SegmentTrackerAdapter} from './Bitmovin8SegmentTrackerAdapter';\nimport {Bitmovin8SpeedMeterAdapter} from './Bitmovin8SpeedMeterAdapter';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nenum ViewMode {\n Inline = 'inline',\n Fullscreen = 'fullscreen',\n PictureInPicture = 'pictureinpicture',\n}\n\nexport class Bitmovin8InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n get downloadSpeedInfo(): DownloadSpeedInfo {\n return this.speedMeter.getInfo();\n }\n\n get segments(): SegmentInfo[] {\n return this.segmentTracker.getSegments();\n }\n\n get adModule(): AdModuleAPI | undefined {\n return this._adModule;\n }\n\n get supportsDeferredLicenseLoading(): boolean {\n return true;\n }\n public readonly videoCompletionTracker: VideoCompletionTracker;\n\n private onBeforeUnLoadEvent: boolean = false;\n private speedMeter: DownloadSpeedMeter;\n private segmentTracker: SegmentTracker;\n private _adModule?: AdModuleAPI;\n private lastTrackedCurrentTime: number | undefined;\n private videoDuration: number | undefined;\n private httpRequestTrackingAdapter: Bitmovin8HttpRequestTrackingAdapter;\n\n constructor(private player: PlayerAPI, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new Bitmovin8AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.speedMeter = new Bitmovin8SpeedMeterAdapter(player, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n this.segmentTracker = new Bitmovin8SegmentTrackerAdapter(player, new SegmentTracker()).getSegmentTracker();\n this.httpRequestTrackingAdapter = new Bitmovin8HttpRequestTrackingAdapter(player);\n this.videoCompletionTracker = new VideoCompletionTracker();\n }\n protected get currentTime(): number {\n try {\n // during ad this.player.getCurrentTime() returns time of ad and not video\n // this then messes with videotime_start and videotime_end measurements of video\n // we don't track videotimes for ads\n if (this.player !== null && this.player.getCurrentTime !== null && !this.isAdPlaying) {\n return this.player.getCurrentTime();\n }\n } catch {\n logger.warning('Analytics Collector attempted to access player, but player is not available anymore');\n }\n return this.lastTrackedCurrentTime ? this.lastTrackedCurrentTime : 0;\n }\n\n protected get isAdPlaying(): boolean {\n const currentAd = this.player.ads && this.player.ads.getActiveAd();\n return currentAd !== null && currentAd !== undefined;\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.registerPlayerEventListeners();\n this.registerUnloadEventListeners();\n\n this._adModule = new Bitmovin8AdModule(this.player, this.windowEventTracker);\n const requestTracking = new HttpRequestTracking([this.httpRequestTrackingAdapter]);\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n requestTracking\n );\n return [errorDetailTracking];\n }\n\n public clearValues(): void {\n this.speedMeter.reset();\n }\n\n public clearSegments(): void {\n this.segmentTracker.reset();\n }\n\n public getPlayerVersion = () => this.player.version;\n public getPlayerName = () => Player.BITMOVIN;\n public getPlayerTech = () => this.player.getPlayerType();\n public getAutoPlay(): boolean {\n if (this.player.getConfig().playback) {\n return (this.player.getConfig() as any).playback.autoplay || false;\n }\n return false;\n }\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n const info: PlaybackInfo = {\n ...super.getCommonPlaybackInfo(),\n size: this.player.getViewMode() === ViewMode.Fullscreen ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n isLive: this.player.isLive(),\n videoDuration: this.videoDuration ? this.videoDuration : 0,\n streamFormat: this.player.getStreamType(),\n videoWindowWidth: this.player.getContainer().offsetWidth,\n videoWindowHeight: this.player.getContainer().offsetHeight,\n isMuted: this.player.isMuted(),\n isCasting: this.player.isCasting(),\n audioLanguage: this.player.getAudio() != null ? this.player.getAudio().lang : undefined,\n subtitleEnabled: false,\n droppedFrames: this.player.getSource() != null ? this.player.getDroppedVideoFrames() : 0,\n };\n\n this.applySubtitleProperties(info);\n this.applyPlaybackQualityProperties(info);\n this.applyCastingProperties(info);\n this.applySourceProperties(info);\n\n return info;\n }\n\n public sourceChange(config, timestamp) {\n this.stateMachine.sourceChange(config, timestamp, this.currentTime);\n }\n\n public onError(): void {\n this.clearSegments();\n }\n\n private registerPlayerEventListeners() {\n this.player.on(this.player.exports.PlayerEvent.SourceUnloaded, (event: any) => {\n this.segmentTracker.reset();\n this.eventCallback(Event.SOURCE_UNLOADED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.SourceLoaded, (event: any) => {\n this.videoCompletionTracker.reset();\n this.resetSourceRelatedState();\n this.videoDuration = this.player.getDuration();\n this.videoCompletionTracker.setVideoDuration(this.player.getDuration());\n this.eventCallback(Event.SOURCE_LOADED, {});\n });\n\n this.player.on(this.player.exports.PlayerEvent.CastStarted, (event: any) => {\n this.eventCallback(Event.START_CAST, event);\n });\n\n this.player.on(this.player.exports.PlayerEvent.CastStopped, () => {\n this.eventCallback(Event.END_CAST, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Play, (e: UserInteractionEvent) => {\n if (e.issuer !== 'ui-seek') {\n this.eventCallback(Event.PLAY, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.Playing, (e: UserInteractionEvent) => {\n if (e.issuer !== 'advertising-api') {\n this.eventCallback(Event.PLAYING, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.Paused, (e: UserInteractionEvent) => {\n if (e.issuer !== 'ui-seek') {\n this.eventCallback(Event.PAUSE, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.TimeChanged, (e: PlayerEventBase) => {\n if (!this.isAdPlaying) {\n this.lastTrackedCurrentTime = this.player.getCurrentTime();\n }\n this.eventCallback(Event.TIMECHANGED, {\n currentTime: this.lastTrackedCurrentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Seek, (e: UserInteractionEvent) => {\n if (this.allowSeeking(e)) {\n this.eventCallback(Event.SEEK, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.Seeked, () => {\n this.eventCallback(Event.SEEKED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.StallStarted, () => {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.StallEnded, () => {\n this.eventCallback(Event.END_BUFFERING, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AudioPlaybackQualityChanged, () => {\n const quality = this.player.getPlaybackAudioData();\n\n if (this.shouldAllowAudioQualityChange(quality.bitrate)) {\n this.setPreviousAudioBitrate(quality.bitrate);\n this.eventCallback(Event.AUDIO_CHANGE, {\n bitrate: quality.bitrate,\n currentTime: this.currentTime,\n codec: (quality as any).codec,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.VideoPlaybackQualityChanged, () => {\n const quality = this.player.getPlaybackVideoData();\n\n if (this.shouldAllowVideoQualityChange(quality.bitrate)) {\n this.setPreviousVideoBitrate(quality.bitrate);\n this.eventCallback(Event.VIDEO_CHANGE, {\n width: quality.width,\n height: quality.height,\n bitrate: quality.bitrate,\n currentTime: this.currentTime,\n codec: (quality as any).codec,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.ViewModeChanged, (e: any) => {\n if (e.to === 'fullscreen') {\n this.eventCallback(Event.START_FULLSCREEN, {\n currentTime: this.currentTime,\n });\n } else if (e.from === 'fullscreen') {\n this.eventCallback(Event.END_FULLSCREEN, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdStarted, (event: any) => {\n this.eventCallback(Event.START_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdFinished, (event: any) => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdSkipped, (event: any) => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdError, (event: any) => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Muted, () => {\n this.eventCallback(Event.MUTE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Unmuted, () => {\n this.eventCallback(Event.UN_MUTE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Error, (event: any) => {\n this.eventCallback(Event.ERROR, {\n code: event.code,\n message: event.name,\n legacyData: event.data,\n currentTime: this.currentTime,\n data: {\n additionalData: JSON.stringify(event.data),\n },\n });\n if (\n event.code === ErrorCode.BITMOVIN_PLAYER_LICENSING_ERROR.code ||\n event.code === ErrorCode.SETUP_MISSING_LICENSE_WHITELIST.code\n ) {\n this._onLicenseCallFailed.dispatch({});\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.PlaybackFinished, () => {\n this.eventCallback(Event.PLAYBACK_FINISHED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.DownloadFinished, (event: any) => {\n if (event.downloadType.indexOf('drm/license/') === 0) {\n this.drmPerformanceInfo = {\n drmType: event.downloadType.replace('drm/license/', ''),\n drmLoadTime: event.downloadTime * 1000,\n };\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.AudioChanged, (event: any) => {\n this.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.SubtitleEnabled, (event: any) => {\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.SubtitleDisabled, (event: any) => {\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.currentTime,\n });\n });\n\n // @ts-ignore\n this.player.on(this.player.exports.PlayerEvent.LicenseValidated, (event: any) => {\n if (event.data.analytics && event.data.analytics.key !== undefined) {\n this._onLicenseKeyReceived.dispatch({licenseKey: event.data.analytics.key});\n } else {\n this._onLicenseCallFailed.dispatch({});\n }\n });\n }\n\n private registerUnloadEventListeners() {\n let handleCollectorUnload = () => {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n // we use here the last tracked video time as we cannot be sure if the player is still working at this place\n const currentTime = this.lastTrackedCurrentTime;\n this.eventCallback(Event.UNLOAD, {currentTime});\n }\n this.release();\n };\n handleCollectorUnload = handleCollectorUnload.bind(true);\n\n this.player.on(this.player.exports.PlayerEvent.Destroy, handleCollectorUnload);\n this.windowEventTracker.addEventListener('beforeunload', handleCollectorUnload);\n this.windowEventTracker.addEventListener('unload', handleCollectorUnload);\n }\n\n private applySourceProperties(info: PlaybackInfo) {\n const source = this.player.getSource();\n if (source == null) {\n return;\n }\n\n info.videoTitle = source.title;\n info.mpdUrl = source.dash;\n info.m3u8Url = source.hls;\n\n const progSourceInfo = getSourceInfoFromBitmovinSourceConfig(source.progressive, this.player);\n info.progUrl = progSourceInfo.progUrl;\n if (this.player.getStreamType() === 'progressive') {\n info.videoBitrate = progSourceInfo.progBitrate;\n }\n }\n\n private applySubtitleProperties(info: PlaybackInfo) {\n let enabledSubtitle;\n if (this.player.subtitles) {\n enabledSubtitle = this.player.subtitles.list().find((s) => s.enabled === true);\n }\n\n info.subtitleEnabled = enabledSubtitle != null;\n info.subtitleLanguage = enabledSubtitle != null ? enabledSubtitle.lang : null;\n }\n\n private applyPlaybackQualityProperties(info: PlaybackInfo) {\n const videoQuality = this.player.getPlaybackVideoData();\n if (videoQuality !== null) {\n info.videoBitrate = videoQuality.bitrate;\n info.videoPlaybackHeight = videoQuality.height;\n info.videoPlaybackWidth = videoQuality.width;\n info.videoCodec = (videoQuality as any).codec;\n }\n\n const audioQuality = this.player.getPlaybackAudioData();\n if (audioQuality !== null) {\n info.audioBitrate = audioQuality.bitrate;\n info.audioCodec = (audioQuality as any).codec;\n }\n }\n\n private applyCastingProperties(info: PlaybackInfo) {\n const isCasting = this.player.isCasting() || this.player.isAirplayActive() || false;\n info.isCasting = isCasting;\n if (!isCasting) {\n return;\n }\n\n // AirPlay\n if (this.player.isAirplayActive()) {\n info.castTech = CastTech.AirPlay;\n return;\n }\n\n // Casting Tech from RemoteControlConfig\n const remoteControlConfig = this.player.getConfig().remotecontrol;\n if (remoteControlConfig === null || remoteControlConfig === undefined) {\n return;\n }\n\n switch (remoteControlConfig.type) {\n case 'googlecast':\n info.castTech = CastTech.GoogleCast;\n break;\n case 'websocket':\n info.castTech = CastTech.WebSocket;\n break;\n }\n }\n\n // with this check we ignore seek events which are smaller than the Threshold\n // mainly to ignore keyboard triggered seeks\n private allowSeeking(e: UserInteractionEvent): boolean {\n const seekEvent = e as SeekEvent;\n const seekDifference = Math.abs(seekEvent.position - seekEvent.seekTarget);\n return seekDifference > AnalyticsSettings.ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD;\n }\n}\n","import * as StateMachine from 'javascript-state-machine';\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {EventDebugging} from '../utils/EventDebugging';\nimport {logger, padRight} from '../utils/Logger';\nimport {noOp} from '../utils/Utils';\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\n\nenum State {\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n /** This event is called when an ad is played directly after the player startup phase */\n AD_STARTUP = 'AD_STARTUP',\n AD_READY = 'AD_READY',\n AD_PAUSE = 'AD_PAUSE',\n AD_PLAYING = 'AD_PLAYING',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n INITIAL_SOURCE_CHANGE = 'INITIAL_SOURCE_CHANGE',\n SOURCE_LOADED = 'SOURCE_LOADED',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class Bitmovin8AnalyticsStateMachine extends AnalyticsStateMachine {\n private debuggingStates: EventDebugging[] = [];\n private enabledDebugging = false;\n\n private seekTimestamp: number;\n private seekedTimestamp: number;\n private seekStarted: boolean;\n private seekEnded: boolean;\n // used for ads, because when AdFinished event is fired and call to state machine is made\n // data form player indicate that video is playing from beginning even if ad is in middle of video\n private lastTrackedVideoEndObject: any;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n this.seekStarted = false;\n this.seekEnded = false;\n }\n\n public getAllStatesBut(states: string[]) {\n return this.getAllStates().filter((i) => states.indexOf(i) < 0);\n }\n\n public getAllStates() {\n return Object.keys(State).map((key) => State[key]);\n }\n\n public sourceChange = (config: any, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n\n public createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine.StateMachine {\n return StateMachine.create({\n initial: State.SETUP,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n // {name: Event.SOURCE_LOADED, from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING], to: State.READY},\n {\n name: Event.SOURCE_LOADED,\n from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING, State.INITIAL_SOURCE_CHANGE],\n to: State.READY,\n },\n\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n {name: Event.PLAYING, from: State.READY, to: State.PLAYING},\n {name: Event.READY, from: State.READY, to: State.READY},\n {name: Event.VIDEO_CHANGE, from: State.READY, to: State.READY},\n {name: Event.AUDIO_CHANGE, from: State.READY, to: State.READY},\n\n {name: Event.ERROR, from: [State.STARTUP, State.AD_STARTUP], to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: [State.STARTUP, State.AD_STARTUP], to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n {name: Event.PLAY, from: State.STARTUP, to: State.STARTUP},\n {name: Event.PLAYING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.READY, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.PLAYING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.END_BUFFERING, from: State.REBUFFERING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n //#region Seeking\n\n // start seeking\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAY_SEEKING},\n\n // mark the seeked as finished\n {name: Event.PLAY, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.PLAYING, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n\n // seek while previous seek not completed\n {name: Event.SEEK, from: State.END_PLAY_SEEKING, to: State.PLAY_SEEKING},\n\n // seek completely finished and cont playing\n {name: Event.PLAYING, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n //#region disable transitions\n // disable tranitions in PLAY_SEEKING\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n // disable transitions in END_PLAY_SEEKING\n {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.PLAY, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n // disable Seek events during PAUSE\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SEEKED, from: State.PAUSE, to: State.PAUSE},\n\n // ignore seeked during Playing because of not allowed keyboard seeking\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n\n //#endregion\n //#endregion\n\n {name: Event.END, from: State.PLAY_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n {name: Event.PLAY, from: State.END, to: State.STARTUP},\n\n {name: Event.ERROR, from: this.getAllStatesBut([State.STARTUP]), to: State.ERROR},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut([State.STARTUP, State.AD_STARTUP]), to: State.END},\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGING},\n {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n {name: Event.TIMECHANGED, from: State.SUBTITLE_CHANGING, to: State.PLAYING},\n\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.TIMECHANGED, from: State.AUDIOTRACK_CHANGING, to: State.PLAYING},\n\n // #region Ads\n {name: Event.START_AD, from: State.STARTUP, to: State.AD_STARTUP},\n {name: Event.END_AD, from: State.AD_STARTUP, to: State.STARTUP},\n {name: Event.PLAY, from: State.AD_STARTUP, to: State.AD_STARTUP},\n {name: Event.PAUSE, from: State.AD_STARTUP, to: State.AD_STARTUP},\n\n {name: Event.START_AD, from: State.READY, to: State.AD_READY},\n /** After the pre-rolls, the main content will always start playing, no matter if autoplay: true/false */\n {name: Event.END_AD, from: State.AD_READY, to: State.STARTUP},\n {name: Event.PLAY, from: State.AD_READY, to: State.AD_READY},\n {name: Event.PAUSE, from: State.AD_READY, to: State.AD_READY},\n\n {name: Event.START_AD, from: State.PAUSE, to: State.AD_PAUSE},\n {name: Event.END_AD, from: State.AD_PAUSE, to: State.PAUSE},\n {name: Event.PLAY, from: State.AD_PAUSE, to: State.AD_PAUSE},\n {name: Event.PAUSE, from: State.AD_PAUSE, to: State.AD_PAUSE},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD_PLAYING},\n {name: Event.END_AD, from: State.AD_PLAYING, to: State.PLAYING},\n {name: Event.PLAY, from: State.AD_PLAYING, to: State.AD_PLAYING},\n {name: Event.PAUSE, from: State.AD_PLAYING, to: State.AD_PLAYING},\n {name: Event.END, from: State.AD_PLAYING, to: State.END},\n\n // Ignore timechanged events during ads\n {name: Event.TIMECHANGED, from: State.AD_STARTUP, to: State.AD_STARTUP},\n {name: Event.TIMECHANGED, from: State.AD_READY, to: State.AD_READY},\n {name: Event.TIMECHANGED, from: State.AD_PAUSE, to: State.AD_PAUSE},\n {name: Event.TIMECHANGED, from: State.AD_PLAYING, to: State.AD_PLAYING},\n\n // Ignore End Ad events when no ad has started\n {name: Event.END_AD, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_AD, from: State.PAUSE, to: State.PAUSE},\n {name: Event.END_AD, from: State.READY, to: State.READY},\n {name: Event.END_AD, from: State.STARTUP, to: State.STARTUP},\n // #endregion\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE, State.PLAYING], to: State.CASTING},\n {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAYING, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.UN_MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: this.getAllStatesBut([State.SETUP]),\n to: State.SOURCE_CHANGING,\n },\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: State.SETUP,\n to: State.INITIAL_SOURCE_CHANGE,\n },\n {name: Event.SOURCE_UNLOADED, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n\n // {name: Event.READY, from: State.SOURCE_CHANGING, to: State.READY},\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n ],\n callbacks: {\n onbeforeevent: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING && to === State.QUALITYCHANGE_REBUFFERING) {\n return false;\n }\n },\n onafterevent: (event, from, to, timestamp, eventObject) => {\n if (event === Event.MANUAL_SOURCE_CHANGE && from === State.SETUP) {\n this.stateMachineCallbacks.initialSourceChange(eventObject);\n } else if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n\n if (to === State.QUALITYCHANGE_PAUSE) {\n this.stateMachine.FINISH_QUALITYCHANGE_PAUSE(timestamp);\n }\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.QUALITYCHANGE_REBUFFERING) {\n this.stateMachine.FINISH_QUALITYCHANGE_REBUFFERING(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n },\n onenterstate: (\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || new Date().getTime();\n }\n\n logger.log(\n `[ENTER ${timestamp}] ${padRight(to, 20)} EVENT: ${padRight(event, 20)} from: ${padRight(from, 14)}`\n );\n\n if (\n eventObject &&\n to !== State.END_PLAY_SEEKING &&\n from !== State.PLAY_SEEKING &&\n from !== State.AD_STARTUP &&\n from !== State.AD_READY &&\n from !== State.AD_PLAYING &&\n from !== State.AD_PAUSE &&\n !(event === Event.SEEK && from === State.END_PLAY_SEEKING)\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n\n logger.log(\n `[LEAVE ${timestamp}] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to: ${padRight(to, 20)}`\n );\n\n this.addStatesToLog(event, from, to, timestamp, eventObject);\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (eventObject && to !== State.END_PLAY_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (eventObject && event !== Event.END_AD) {\n this.lastTrackedVideoEndObject = eventObject;\n }\n\n if ((from === State.READY || from === State.AD_STARTUP) && to === State.STARTUP) {\n this.setVideoStartTimeout();\n } else if (from === State.STARTUP && (to === State.PLAYING || to === State.AD_STARTUP)) {\n this.clearVideoStartTimeout();\n }\n\n const fnName = String(from).toLowerCase();\n if (to === State.EXIT_BEFORE_VIDEOSTART) {\n this.clearVideoStartTimeout();\n const eventData = this.getVideoStartupFailedEventData(timestamp, event, eventObject);\n const shouldSendSample = event !== Event.ERROR;\n this.stateMachineCallbacks.videoStartFailed(eventData, shouldSendSample);\n } else if (from === State.END_PLAY_SEEKING) {\n const seekDuration = this.seekedTimestamp - this.seekTimestamp;\n\n // do not enter here if\n // 1. no seek has started because of SEEK\n // 2. no seek has ended because of SEEKED event\n // 3. leave of END_PLAY_SEEKING was triggered by another SEEK event (continuous seeking)\n if (this.seekStarted && this.seekEnded && event !== Event.SEEK) {\n this.seekStarted = this.seekEnded = false;\n this.stateMachineCallbacks.end_play_seeking(seekDuration, fnName);\n }\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (\n from === State.AD_PAUSE ||\n from === State.AD_READY ||\n from === State.AD_PLAYING ||\n from === State.AD_STARTUP\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(this.lastTrackedVideoEndObject);\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(this.lastTrackedVideoEndObject);\n this.stateMachineCallbacks.ad(stateDuration, 'ad');\n } else if (event === Event.START_AD && from === State.STARTUP) {\n noOp();\n } else if (event === Event.SOURCE_LOADED && from === State.INITIAL_SOURCE_CHANGE) {\n noOp();\n } else if (from !== State.ERROR) {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n try {\n callbackFunction(stateDuration, fnName, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + fnName, eventObject, e);\n }\n } else {\n logger.error('Could not find callback function for ' + fnName);\n }\n }\n\n if (\n eventObject &&\n to !== State.END_PLAY_SEEKING &&\n from !== State.PLAY_SEEKING &&\n to !== State.PLAY_SEEKING &&\n from !== State.AD_STARTUP &&\n from !== State.AD_READY &&\n from !== State.AD_PLAYING &&\n from !== State.AD_PAUSE\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n }\n },\n onseek: (event, from, to, timestamp) => {\n if (!this.seekStarted) {\n this.seekTimestamp = timestamp;\n this.seekStarted = true;\n }\n },\n onseeked: (event, from, to, timestamp) => {\n this.seekedTimestamp = timestamp;\n this.seekEnded = true;\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n if (this.stateMachine.current !== 'PLAYING') {\n return;\n }\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n this.stateMachineCallbacks.heartbeat(stateDuration, String(from).toLowerCase(), {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n public callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n try {\n exec.call(this.stateMachine, timestamp, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + eventType, exec, eventObject, e);\n }\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n public addStatesToLog(\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) {\n if (this.enabledDebugging) {\n this.debuggingStates.push(new EventDebugging(event, from, to, timestamp, eventObject));\n }\n }\n\n public getStates() {\n return this.debuggingStates;\n }\n\n public setEnabledDebugging(enabled: boolean) {\n this.enabledDebugging = enabled;\n }\n}\n","import * as Utils from './Utils';\n\nexport class Converter {\n public static bytesToBits(bytes: number): number {\n return bytes * 8;\n }\n public static bitsToBytes(bits: number): number {\n return Math.round(bits / 8);\n }\n public static bytesToKiloBytes(bytes: number): number {\n return Utils.calculateTime(bytes * 1000);\n }\n public static kiloBytesToMegaBytes(kiloByte: number): number {\n return kiloByte * 1000;\n }\n}\n","import {SpeedMeasurement} from '../types/SpeedMeasurement';\n\nexport class Measure implements SpeedMeasurement {\n private download: SpeedMeasurement;\n\n get speed(): number {\n return this.download.size / this.download.duration;\n }\n get duration(): number {\n return this.download.duration;\n }\n get size(): number {\n return this.download.size;\n }\n get timeToFirstByte(): number {\n return this.download.timeToFirstByte;\n }\n get timestamp(): Date {\n return this.download.timestamp;\n }\n\n get httpStatus(): number {\n return this.download.httpStatus;\n }\n\n constructor(download: SpeedMeasurement) {\n this.download = download;\n }\n}\n","import {SegmentInfo} from '../types/SegmentInfo';\n\nexport class SegmentTracker {\n protected segments: SegmentInfo[];\n\n constructor() {\n this.segments = [];\n }\n\n public reset(): void {\n this.segments = [];\n }\n\n public addSegment(segment: SegmentInfo): void {\n this.segments.push(segment);\n }\n\n public removeSegment(url: string): void {\n this.segments = this.segments.filter((s) => s.url !== url);\n }\n\n public getSegments(): SegmentInfo[] {\n return this.segments;\n }\n}\n","import {Subscribable} from '../../core/EventDispatcher';\nimport {logger} from '../../utils/Logger';\nimport {Queue} from '../../utils/Queue';\nimport {HttpRequest} from './HttpRequest';\nimport {OnDownloadFinishedEventObject} from './OnDownloadFinishedEventObject';\n\nexport class HttpRequestTracking {\n private static DEFAULT_MAX_REQUESTS = 10;\n private _maxRequests: number = HttpRequestTracking.DEFAULT_MAX_REQUESTS;\n private _httpRequestQueue = new Queue<HttpRequest>();\n\n public get maxRequests(): number {\n return this._maxRequests;\n }\n\n public get httpRequests(): ReadonlyArray<HttpRequest> {\n return this._httpRequestQueue.items;\n }\n\n constructor(private subscribables: Array<Subscribable<OnDownloadFinishedEventObject>>) {\n subscribables.forEach((subscribable) => subscribable.subscribe(this.onDownloadFinishedHandler));\n }\n\n public configure(maxRequests: number) {\n this._maxRequests = maxRequests;\n this._httpRequestQueue.limit(maxRequests);\n }\n\n public disable() {\n this.subscribables.forEach((subscribable) => subscribable.unsubscribe(this.onDownloadFinishedHandler));\n this._httpRequestQueue.clear();\n }\n\n public reset() {\n this._httpRequestQueue.clear();\n }\n\n private onDownloadFinishedHandler = (event: OnDownloadFinishedEventObject) => {\n try {\n logger.log(`HttpRequestTracking.onDownloadFinished: ${JSON.stringify(event.httpRequest)}`);\n this.addRequest(event.httpRequest);\n } catch (error) {\n logger.error(`HttpRequestTracking.onDownloadFinished: Error in handler`, error);\n }\n };\n\n private addRequest(httpRequest: HttpRequest) {\n this._httpRequestQueue.offer(httpRequest);\n this._httpRequestQueue.limit(this._maxRequests);\n }\n}\n","export class Queue<T> {\n private readonly _items: T[] = [];\n\n public get items(): ReadonlyArray<T> {\n return this._items;\n }\n\n public get length() {\n return this._items.length;\n }\n\n public offer(item: T) {\n this._items.push(item);\n }\n\n public poll(): T | undefined {\n return this._items.shift();\n }\n\n public clear() {\n this._items.splice(0);\n }\n\n public limit(maxElements: number) {\n while (this._items.length > maxElements) {\n this.poll();\n }\n }\n}\n","import {PlayerAPI, UserInteractionEvent} from 'bitmovin-player';\nimport {WindowEventTracker} from '../../../utils/WindowEventTracker';\nimport {AdCallbacks, AdModuleAPI} from './AdModuleAPI';\n\nexport class Bitmovin8AdModule implements AdModuleAPI {\n public adCallbacks = new AdCallbacks();\n\n constructor(private player: PlayerAPI, private windowEventTracker: WindowEventTracker) {\n this.register();\n }\n\n public isLinearAdActive = () => {\n if (this.player.ads) {\n return (this.player.ads as any).isLinearAdActive() || false;\n }\n return false;\n };\n public getContainer = () => this.player.getContainer();\n public getAdModuleInfo = () => {\n if (this.player.ads) {\n return (this.player.ads as any).getModuleInfo();\n }\n return {name: undefined, version: undefined};\n };\n public currentTime = () => this.player.getCurrentTime();\n\n private register() {\n this.player.on(this.player.exports.PlayerEvent.Play, (e: UserInteractionEvent) => {\n if (e.issuer === 'advertising-api') {\n this.adCallbacks.onPlay(e.issuer);\n }\n });\n this.player.on(this.player.exports.PlayerEvent.Paused, (e: UserInteractionEvent) => {\n if (e.issuer === 'advertising-api') {\n this.adCallbacks.onPause(e.issuer);\n }\n });\n this.player.on(this.player.exports.PlayerEvent.AdStarted, (event: any) => {\n this.adCallbacks.onAdStarted(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdFinished, (event: any) => {\n this.adCallbacks.onAdFinished(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdBreakStarted, (event: any) => {\n this.adCallbacks.onAdBreakStarted(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdBreakFinished, (event: any) => {\n this.adCallbacks.onAdBreakFinished(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdClicked, (event: any) => {\n this.adCallbacks.onAdClicked(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdQuartile, (event: any) => {\n this.adCallbacks.onAdQuartile(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdSkipped, (event: any) => {\n this.adCallbacks.onAdSkipped(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdError, (event: any) => {\n this.adCallbacks.onAdError(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdManifestLoaded, (event: any) => {\n this.adCallbacks.onAdManifestLoaded(event);\n });\n const handlePageClose = () => {\n this.adCallbacks.onBeforeUnload();\n };\n this.windowEventTracker.addEventListener('beforeunload', handlePageClose);\n this.windowEventTracker.addEventListener('unload', handlePageClose);\n }\n}\n","export class AdCallbacks {\n public onAdStarted = (event: any) => {};\n public onAdFinished = (event: any) => {};\n public onAdBreakStarted = (event: any) => {};\n public onAdBreakFinished = (event: any) => {};\n public onAdClicked = (event: any) => {};\n public onAdError = (event: any) => {};\n public onAdManifestLoaded = (event: any) => {};\n public onAdQuartile = (event: any) => {};\n public onAdSkipped = (event: any) => {};\n public onPlay = (issuer?: string) => {};\n public onPause = (issuer?: string) => {};\n public onBeforeUnload = () => {};\n}\n\nexport interface AdModuleAPI {\n readonly adCallbacks: AdCallbacks;\n isLinearAdActive: () => boolean;\n getContainer: () => HTMLElement;\n getAdModuleInfo: () => {name?: string; version?: string};\n currentTime: () => number;\n}\n","import {DownloadFinishedEvent, PlayerAPI, PlayerExports} from 'bitmovin-player';\nimport {EventDispatcher, Subscribable} from '../../core/EventDispatcher';\nimport {HttpRequestType} from '../../features/httprequesttracking/HttpRequestType';\nimport {OnDownloadFinishedEventObject} from '../../features/httprequesttracking/OnDownloadFinishedEventObject';\nimport {calculateTimeWithUndefined, getCurrentTimestamp} from '../../utils/Utils';\n\nexport class Bitmovin8HttpRequestTrackingAdapter implements Subscribable<OnDownloadFinishedEventObject> {\n private eventDispatcher = new EventDispatcher<OnDownloadFinishedEventObject>();\n private playerExports: PlayerExports;\n\n constructor(player: PlayerAPI) {\n this.playerExports = player.exports;\n player.on(this.playerExports.PlayerEvent.DownloadFinished, (event) =>\n this.onDownloadFinished(event as DownloadFinishedEvent)\n );\n }\n\n public subscribe(callback: (args: OnDownloadFinishedEventObject) => void): () => void {\n return this.eventDispatcher.subscribe(callback);\n }\n\n public unsubscribe(callback: (args: OnDownloadFinishedEventObject) => void) {\n this.eventDispatcher.unsubscribe(callback);\n }\n\n private onDownloadFinished(event?: DownloadFinishedEvent) {\n this.eventDispatcher.dispatch({\n httpRequest: {\n downloadTime: calculateTimeWithUndefined(event?.downloadTime) ?? 0,\n httpStatus: event?.httpStatus ?? 0,\n success: event?.success ?? false,\n timestamp: getCurrentTimestamp(),\n url: event?.url,\n size: event?.size,\n timeToFirstByte: calculateTimeWithUndefined(event?.timeToFirstByte),\n type: this.mapHttpRequestType(event?.downloadType),\n },\n });\n }\n\n private mapHttpRequestType(downloadType?: string): HttpRequestType {\n switch (downloadType) {\n case this.playerExports.HttpRequestType.MANIFEST_DASH:\n return HttpRequestType.MANIFEST_DASH;\n case this.playerExports.HttpRequestType.MANIFEST_HLS_MASTER:\n return HttpRequestType.MANIFEST_HLS_MASTER;\n case this.playerExports.HttpRequestType.MANIFEST_HLS_VARIANT:\n return HttpRequestType.MANIFEST_HLS_VARIANT;\n case this.playerExports.HttpRequestType.MANIFEST_SMOOTH:\n return HttpRequestType.MANIFEST_SMOOTH;\n case this.playerExports.HttpRequestType.MANIFEST_ADS:\n return HttpRequestType.MANIFEST_ADS;\n case this.playerExports.HttpRequestType.MEDIA_AUDIO:\n return HttpRequestType.MEDIA_AUDIO;\n case this.playerExports.HttpRequestType.MEDIA_VIDEO:\n return HttpRequestType.MEDIA_VIDEO;\n case this.playerExports.HttpRequestType.MEDIA_SUBTITLES:\n return HttpRequestType.MEDIA_SUBTITLES;\n case this.playerExports.HttpRequestType.MEDIA_THUMBNAILS:\n return HttpRequestType.MEDIA_THUMBNAILS;\n case this.playerExports.HttpRequestType.DRM_LICENSE_WIDEVINE:\n return HttpRequestType.DRM_LICENSE_WIDEVINE;\n case this.playerExports.HttpRequestType.DRM_LICENSE_PLAYREADY:\n return HttpRequestType.DRM_LICENSE_PLAYREADY;\n case this.playerExports.HttpRequestType.DRM_LICENSE_FAIRPLAY:\n return HttpRequestType.DRM_LICENSE_FAIRPLAY;\n case this.playerExports.HttpRequestType.DRM_LICENSE_PRIMETIME:\n return HttpRequestType.DRM_LICENSE_PRIMETIME;\n case this.playerExports.HttpRequestType.DRM_LICENSE_CLEARKEY:\n return HttpRequestType.DRM_LICENSE_CLEARKEY;\n case this.playerExports.HttpRequestType.DRM_CERTIFICATE_FAIRPLAY:\n return HttpRequestType.DRM_CERTIFICATE_FAIRPLAY;\n case this.playerExports.HttpRequestType.KEY_HLS_AES:\n return HttpRequestType.KEY_HLS_AES;\n case this.playerExports.HttpRequestType.TIME_SYNC:\n return HttpRequestType.TIME_SYNC;\n default:\n return HttpRequestType.UNKNOWN;\n }\n }\n}\n","export enum HttpRequestType {\n DRM_LICENSE_WIDEVINE = 'DRM_LICENSE_WIDEVINE',\n DRM_OTHER = 'DRM_OTHER',\n MEDIA_THUMBNAILS = 'MEDIA_THUMBNAILS',\n MEDIA_VIDEO = 'MEDIA_VIDEO',\n MEDIA_AUDIO = 'MEDIA_AUDIO',\n MEDIA_PROGRESSIVE = 'MEDIA_PROGRESSIVE',\n MEDIA_SUBTITLES = 'MEDIA_SUBTITLES',\n MANIFEST_DASH = 'MANIFEST_DASH',\n MANIFEST_HLS = 'MANIFEST_HLS',\n MANIFEST_HLS_MASTER = 'MANIFEST_HLS_MASTER',\n MANIFEST_HLS_VARIANT = 'DRM_LICENSMANIFEST_HLS_VARIANTE_WIDEVINE',\n MANIFEST_SMOOTH = 'MANIFEST_SMOOTH',\n MANIFEST = 'MANIFEST',\n KEY_HLS_AES = 'KEY_HLS_AES',\n UNKNOWN = 'UNKNOWN',\n TIME_SYNC = 'TIME_SYNC',\n DRM_CERTIFICATE_FAIRPLAY = 'DRM_CERTIFICATE_FAIRPLAY',\n DRM_LICENSE_CLEARKEY = 'DRM_LICENSE_CLEARKEY',\n DRM_LICENSE_PRIMETIME = 'DRM_LICENSE_PRIMETIME',\n DRM_LICENSE_FAIRPLAY = 'DRM_LICENSE_FAIRPLAY',\n DRM_LICENSE_PLAYREADY = 'DRM_LICENSE_PLAYREADY',\n MANIFEST_ADS = 'MANIFEST_ADS',\n}\n","import {PlayerAPI} from 'bitmovin-player';\nimport {SegmentTracker} from '../../core/SegmentTracker';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport * as Utils from '../../utils/Utils';\n\ninterface DownloadFinishedEvent {\n attempt?: number;\n downloadType?: string;\n httpStatus: number;\n mimeType?: string;\n success: boolean;\n timestamp: number;\n type: string;\n url: string;\n}\n\ninterface SegmentPlaybackEvent {\n duration?: number;\n mediaInfo?: any;\n mimeType?: string;\n playbackTime?: number;\n representationId?: string;\n timestamp?: number;\n type?: string;\n uid?: string;\n url?: string;\n}\n\nexport class Bitmovin8SegmentTrackerAdapter {\n private segmentTracker: SegmentTracker;\n\n constructor(player: PlayerAPI, segmentTracker: SegmentTracker) {\n this.segmentTracker = segmentTracker;\n\n player.on(player.exports.PlayerEvent.DownloadFinished, (event) => this.handleOnDownloadFinishEvent(event));\n player.on(player.exports.PlayerEvent.SegmentPlayback, (event) => this.handleSegmentPlaybackEvent(event));\n }\n\n public getSegmentTracker(): SegmentTracker {\n return this.segmentTracker;\n }\n\n public handleOnDownloadFinishEvent(event: DownloadFinishedEvent & any) {\n if (event.downloadType.indexOf('media/video') === 0) {\n const url = event.url;\n const segment: SegmentInfo = {\n name: Utils.getURLResourceName(url),\n url,\n timestamp: event.timestamp,\n };\n this.segmentTracker.addSegment(segment);\n }\n }\n\n public handleSegmentPlaybackEvent = (event: SegmentPlaybackEvent & any) => {\n this.segmentTracker.removeSegment(event.url);\n };\n}\n","import {PlayerAPI} from 'bitmovin-player';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\n\nexport class Bitmovin8SpeedMeterAdapter {\n private meter: DownloadSpeedMeter;\n\n constructor(player: PlayerAPI, meter: DownloadSpeedMeter) {\n this.meter = meter;\n player.on(player.exports.PlayerEvent.DownloadFinished, (event) => this.handleOnDownloadFinishEvent(event));\n }\n\n public getDownloadSpeedMeter(): DownloadSpeedMeter {\n return this.meter;\n }\n\n public handleOnDownloadFinishEvent(event: any) {\n if (!event.success) {\n return;\n }\n if (event.downloadType.indexOf('media/video') === 0) {\n this.meter.addMeasurement({\n duration: event.downloadTime,\n size: event.size,\n timeToFirstByte: event.timeToFirstByte,\n timestamp: new Date(),\n httpStatus: event.httpStatus,\n });\n }\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {CAFv3InternalAdapter} from './internal/CAFv3InternalAdapter';\n\nexport class CAFv3Adapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new CAFv3InternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {HTML5AnalyticsStateMachine} from '../../analyticsStateMachines/HTML5AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class CAFv3InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n private playerManager;\n private mediaInformation;\n private activeAudioTrack;\n private activeTextTracks;\n private currentItem;\n private isSeeking: boolean;\n\n constructor(protected context: any, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new HTML5AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.playerManager = context.getPlayerManager();\n this.isSeeking = false;\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.register();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public getPlayerVersion(): string {\n return (window as any).cast && (window as any).cast.framework ? (window as any).cast.framework.VERSION : 'unknown';\n }\n\n public getPlayerName = () => Player.CHROMECAST_SHAKA;\n public getPlayerTech = () => 'html5';\n public getAutoPlay = () => (this.currentItem && this.currentItem.autoplay ? this.currentItem.autoplay : false);\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public sourceChange(config: any, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, this.playerManager.getCurrentTimeSec());\n }\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n const stats = (this.playerManager as any).getStats();\n\n const info: PlaybackInfo = {\n isLive: this.mediaInformation ? this.mediaInformation.streamType === 'LIVE' : undefined,\n playerTech: this.getPlayerTech(),\n videoDuration: this.mediaInformation ? this.mediaInformation.duration : undefined,\n videoPlaybackHeight: stats.height,\n videoPlaybackWidth: stats.width,\n audioCodec: this.activeAudioTrack ? this.activeAudioTrack.trackContentType : undefined,\n audioLanguage: this.activeAudioTrack ? this.activeAudioTrack.language : undefined,\n subtitleLanguage: this.activeTextTracks ? this.activeTextTracks.map((t) => t.language).join(',') : undefined,\n droppedFrames: 0, // TODO\n };\n\n return info;\n }\n\n public register() {\n this.playerManager.addEventListener('PLAYER_LOADING', (event) => {\n this.eventCallback(Event.SETUP, {});\n });\n\n this.playerManager.addEventListener('PLAYER_LOAD_COMPLETE', (event) => {\n const audioTracksManager = this.playerManager.getAudioTracksManager();\n this.activeAudioTrack = audioTracksManager.getActiveTrack();\n\n // captions\n const textTracksManager = this.playerManager.getTextTracksManager();\n this.activeTextTracks = textTracksManager.getActiveTracks();\n\n const queueManager = this.playerManager.getQueueManager();\n this.currentItem = queueManager.getCurrentItem();\n\n this.mediaInformation = event.media;\n\n this.eventCallback(Event.READY, {});\n });\n\n this.playerManager.addEventListener('PLAY', (event) => {\n this.eventCallback(Event.PLAY, {\n currentTime: event.currentMediaTime,\n });\n });\n\n this.playerManager.addEventListener('PAUSE', (event) => {\n this.onPaused(this.playerManager.getCurrentTimeSec());\n });\n\n this.playerManager.addEventListener('ERROR', (event) => {\n const errorData = event.error != null ? event.error : undefined;\n this.eventCallback(Event.ERROR, {\n currentTime: this.playerManager.getCurrentTimeSec(),\n code: event.detailedErrorCode,\n message: event.reason,\n legacyData: errorData,\n data: {additionalData: JSON.stringify(errorData)},\n });\n });\n\n this.playerManager.addEventListener('SEEKING', (event) => {\n this.isSeeking = true;\n this.onPaused(event.currentMediaTime);\n this.eventCallback(Event.SEEK, {\n currentTime: event.currentMediaTime,\n });\n });\n\n this.playerManager.addEventListener('SEEKED', (event) => {\n this.isSeeking = false;\n this.eventCallback(Event.SEEKED, {\n currentTime: event.currentMediaTime,\n });\n });\n\n // Fired when the browser is trying to fetch media data,\n // but did not receive a response. The cast.framework.events.EventType.BUFFERING\n // event is implemented consistently across stream types, and should be used instead\n // of 'stalled' when trying to check if the player is buffering.\n this.playerManager.addEventListener('STALLED', (event) => {});\n\n this.playerManager.addEventListener('BUFFERING', (event) => {\n if (!this.isSeeking && event.isBuffering) {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.playerManager.addEventListener('TIME_UPDATE', (event) => {\n if (!this.isSeeking) {\n this.eventCallback(Event.TIMECHANGED, {\n currentTime: event.currentMediaTime,\n });\n }\n });\n\n this.playerManager.addEventListener('REQUEST_LOAD', (event) => {\n // this event is triggered whenever new content is to be played\n // it's not necessary to do license call and reset all data if this is the first item being played\n if (this.currentItem) {\n this.eventCallback(Event.PLAYLIST_TRANSITION, {\n currentTime: this.playerManager.getCurrentTimeSec(),\n });\n }\n });\n }\n\n public onPaused(currentTime?: number) {\n this.eventCallback(Event.PAUSE, {\n currentTime,\n });\n }\n\n protected get currentTime(): number {\n return this.playerManager.getCurrentTimeSec();\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {DashjsInternalAdapter} from './internal/DashjsInternalAdapter';\n\nexport class DashjsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new DashjsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class DashjsInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(private mediaPlayer: any, opts?: AnalyticsStateMachineOptions) {\n super(null, opts);\n }\n\n /**\n * @override\n */\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n super.initialize(analytics);\n let videoEl: HTMLVideoElement | null = null;\n let canPlay = false;\n try {\n videoEl = this.mediaPlayer.getVideoElement();\n } catch (e) {} // tslint:disable-line:no-empty\n\n if (!videoEl) {\n this.mediaPlayer.on(\n 'canPlay',\n () => {\n if (canPlay) {\n return;\n }\n videoEl = this.mediaPlayer.getVideoElement();\n canPlay = true;\n this.setMediaElement(videoEl);\n this.registerMediaElementEventsForDashJS();\n },\n this\n );\n } else {\n this.setMediaElement(videoEl);\n this.registerMediaElementEventsForDashJS();\n }\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public registerMediaElementEventsForDashJS() {\n const mediaElement = this.mediaElement;\n\n if (!mediaElement) {\n return;\n }\n\n this.listenToMediaElementEvent('playing', () => {\n const {currentTime} = mediaElement;\n this.needsFirstPlayIntent = false;\n this.eventCallback(Event.TIMECHANGED, {\n currentTime,\n });\n });\n }\n\n public getPlayerName = () => Player.DASHJS;\n public getPlayerVersion = () => this.mediaPlayer.getVersion();\n\n /**\n * @override\n */\n public getMIMEType() {\n return MIMETypes.DASH;\n }\n /**\n * @override\n */\n public getStreamURL(): string | undefined {\n if (!this.mediaPlayer) {\n return;\n }\n\n const source = this.mediaPlayer.getSource();\n if (source) {\n return source.toString();\n }\n }\n /**\n * Implemented by sub-class to deliver current quality-level info\n * specific to media-engine.\n * @override\n * @returns {QualityLevelInfo}\n */\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n if (!this.mediaPlayer) {\n return null;\n }\n\n const videoBitrateInfoList = this.mediaPlayer.getBitrateInfoListFor('video');\n const currentVideoQualityIndex = this.mediaPlayer.getQualityFor('video');\n const currentVideoQuality = videoBitrateInfoList[currentVideoQualityIndex];\n\n if (currentVideoQuality == null) {\n return null;\n }\n\n const {width, height, bitrate} = currentVideoQuality;\n return {\n width,\n height,\n bitrate,\n };\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {HlsInternalAdapter} from './internal/HlsInternalAdapter';\n\nexport class HlsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new HlsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {Analytics} from '../../core/Analytics';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {SubtitleInfo} from '../../types/SubtitleInfo';\nimport {HlsSpeedMeterAdapter} from './HlsSpeedMeterAdapter';\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class HlsInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n get downloadSpeedInfo(): DownloadSpeedInfo {\n return this.speedMeter.getInfo();\n }\n\n private speedMeter: DownloadSpeedMeter;\n\n constructor(private hls: Hls, opts?: AnalyticsStateMachineOptions) {\n super(null, opts);\n this.resetMedia();\n this.speedMeter = new HlsSpeedMeterAdapter(hls, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n super.initialize(analytics);\n this.registerHlsEvents();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public clearValues(): void {\n this.speedMeter.reset();\n }\n\n public getPlayerName = () => Player.HLSJS;\n public getPlayerVersion = () => (this.hls as any).constructor.version;\n\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n if (!this.hls.levels) {\n return null;\n }\n const currentLevelObj = this.hls.levels[this.hls.currentLevel];\n if (!currentLevelObj) {\n return null;\n }\n\n const bitrate = currentLevelObj.bitrate;\n const width = currentLevelObj.width;\n const height = currentLevelObj.height;\n\n return {\n bitrate,\n width,\n height,\n };\n }\n\n /**\n * @override\n */\n public isLive = () => {\n const hls = this.hls;\n if (!hls.levels || !hls.currentLevel) {\n return false;\n }\n if (hls.currentLevel < 0) {\n return false;\n }\n const currentLevelObj = hls.levels[hls.currentLevel];\n if (!currentLevelObj) {\n return false;\n }\n return currentLevelObj.details.live;\n };\n\n /**\n * @override\n */\n public getMIMEType() {\n return MIMETypes.HLS;\n }\n\n /**\n * @override\n */\n public getStreamURL() {\n return (this.hls as any).url;\n }\n\n public registerHlsEvents() {\n const hls = this.hls as any;\n\n hls.on(hls.constructor.Events.MEDIA_ATTACHING, this.onMediaAttaching.bind(this));\n hls.on(hls.constructor.Events.MEDIA_DETACHING, this.onMediaDetaching.bind(this));\n hls.on(hls.constructor.Events.MANIFEST_LOADING, this.onManifestLoading.bind(this));\n hls.on(hls.constructor.Events.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched.bind(this));\n hls.on(hls.constructor.Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleLanguageSwitched.bind(this));\n hls.on(hls.constructor.Events.DESTROYING, this.release.bind(this));\n hls.on(hls.constructor.Events.ERROR, this.onHlsError.bind(this));\n\n // media is already attached, event has been triggered before\n // or we are in the event handler of this event itself.\n // we can not know how the stacktrace to this constructor will look like.\n // therefore we will guard from this case in\n // the onMediaAttaching method (avoid running it twice)\n if (hls.media) {\n this.onMediaAttaching();\n this.onManifestLoading();\n }\n }\n\n public onMediaAttaching() {\n // in case we are called again (when we are triggering this ourselves\n // but from the event handler of MEDIA_ATTACHING) we should not run again.\n if (this.mediaElement) {\n return;\n }\n\n this.mediaElement = this.hls.media;\n\n this.registerMediaElement();\n this.onMaybeReady();\n }\n\n public onMediaDetaching() {\n this.unregisterMediaElement();\n }\n\n public onManifestLoading() {\n this.onMaybeReady();\n }\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n const selectedSubtitle = this.getSelectedSubtitleLanguage();\n\n const info: PlaybackInfo = {\n ...super.getCurrentPlaybackInfo(),\n audioLanguage: this.getSelectedAudioLanguage(),\n subtitleEnabled: selectedSubtitle != null ? selectedSubtitle.enabled : undefined,\n subtitleLanguage: selectedSubtitle != null ? selectedSubtitle.language : undefined,\n };\n\n return info;\n }\n\n /**\n * errorData: { type : error type, details : error details, fatal : if true, hls.js cannot/will not try to recover, if false, hls.js will try to recover,other error specific data }\n * https://hls-js.netlify.com/api-docs/file/src/events.js.html#lineNumber98\n */\n public onHlsError(errorName, errorData) {\n const isFatal = errorData ? errorData.fatal : true;\n if (isFatal) {\n const mediaElement = this.mediaElement;\n let currentTime;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n\n const errorMessage = errorData != null ? `${errorData.type}: ${errorData.details}` : undefined;\n this.eventCallback(Event.ERROR, {\n currentTime,\n code: this.getErrorCodeFromHlsErrorType(errorData.type),\n message: errorMessage,\n data: {},\n });\n }\n }\n\n public onAudioTrackSwitched(event: string, data: {id: string}) {\n const mediaElement = this.mediaElement;\n let currentTime;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n\n this.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime,\n });\n }\n\n public onSubtitleLanguageSwitched(event: string, data: {id: string}) {\n const mediaElement = this.mediaElement;\n let currentTime;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime,\n });\n }\n\n /**\n * returns mapped error code for Hlsjs ErrorTypes\n * @param type one of the ErrorTypes according to https://github.com/video-dev/hls.js/blob/master/src/errors.ts\n */\n private getErrorCodeFromHlsErrorType(type: string): number {\n switch (type) {\n case 'networkError':\n return 2;\n case 'mediaError':\n return 3;\n case 'keySystemError':\n return 4;\n case 'muxError':\n return 5;\n // default equals `otherError`\n default:\n return 1;\n }\n }\n\n private getSelectedAudioLanguage(): string | undefined {\n if (this.hls.audioTrack == null || this.hls.audioTrack < 0) {\n return undefined;\n }\n return (this.hls.audioTracks[this.hls.audioTrack] as any).lang;\n }\n\n private getSelectedSubtitleLanguage(): SubtitleInfo | undefined {\n // Check if function is supported (in latest hls version), otherwise use fallback option\n if (this.hls.subtitleDisplay != null) {\n const isSubtitleDisplayed = this.hls.subtitleTrack >= 0 && this.hls.subtitleDisplay === true;\n return {\n enabled: isSubtitleDisplayed,\n language: isSubtitleDisplayed ? this.hls.subtitleTracks[this.hls.subtitleTrack].lang : undefined,\n };\n } else {\n const {subtitleTrackController} = this.hls as any;\n if (subtitleTrackController != null && subtitleTrackController.media != null) {\n return this.getSelectedSubtitleFromMediaElement(subtitleTrackController.media);\n }\n }\n return undefined;\n }\n}\n","import {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\n\nexport class HlsSpeedMeterAdapter {\n private meter: DownloadSpeedMeter;\n\n constructor(hls: any, meter: DownloadSpeedMeter) {\n this.meter = meter;\n hls.on(hls.constructor.Events.FRAG_LOADED, (eventName, data) => this.handleFragmentLoadedEvent(data));\n }\n\n public getDownloadSpeedMeter(): DownloadSpeedMeter {\n return this.meter;\n }\n\n public handleFragmentLoadedEvent(data: {frag: any; stats: any; networkDetails: any}) {\n if (data.frag.type !== 'main') {\n return;\n }\n // See hls documentation https://github.com/video-dev/hls.js/blob/master/src/types/loader.ts#L35\n this.meter.addMeasurement({\n duration: (data.stats.tload - data.stats.trequest) / 1000,\n size: data.stats.total,\n timeToFirstByte: (data.stats.tfirst - data.stats.trequest) / 1000,\n timestamp: new Date(),\n httpStatus: data.networkDetails.status,\n });\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {HTMLVideoElementInternalAdapter} from './internal/HTMLVideoElementInternalAdapter';\n\nexport class HTMLVideoElementAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: HTMLVideoElement, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new HTMLVideoElementInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {Player} from '../../enums/Player';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {getBrowserInfo} from '../../utils/Utils';\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class HTMLVideoElementInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(mediaElement: HTMLVideoElement, opts?: AnalyticsStateMachineOptions) {\n super(mediaElement, opts);\n }\n\n public getPlayerName = () => Player.HTML5;\n public getPlayerVersion = () => {\n const browserInfo = getBrowserInfo();\n return `${browserInfo.name} ${browserInfo.version}`;\n };\n /**\n * @override\n */\n public getStreamURL() {\n return this.mediaElement ? this.mediaElement.currentSrc : undefined;\n }\n\n /**\n * Implemented by sub-class to deliver current quality-level info\n * specific to media-engine.\n * @override\n * @returns {QualityLevelInfo}\n */\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n return {\n bitrate: undefined,\n width: this.mediaElement ? this.mediaElement.videoWidth : undefined,\n height: this.mediaElement ? this.mediaElement.videoHeight : undefined,\n };\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {Event} from '../enums/Event';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {ShakaInternalAdapter} from './internal/ShakaInternalAdapter';\n\nexport class ShakaAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new ShakaInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n this.wrapPlayerLoad(player);\n }\n\n // The Shaka player's `load()` method does not trigger error events for exceptions thrown while loading the manifest.\n // Therefore we wrap this method and catch exceptions and forward them to analytics.\n // This behaviour has another caveat where we need to delay the player's `unload` event (see ShakaInternalAdapter).\n // See the implementation of the `load()` method: https://shaka-player-demo.appspot.com/docs/api/lib_player.js.html#line1117.\n private wrapPlayerLoad(player: any) {\n const originalLoad = player.load;\n\n player.load = (...args: Parameters<typeof player.load>): Promise<void> => {\n return new Promise(async (resolve, reject) => {\n try {\n await originalLoad.apply(player, args);\n } catch (error) {\n (this.internalAdapter as ShakaInternalAdapter).eventCallback(Event.ERROR, {\n currentTime: 0,\n // See https://developer.mozilla.org/en-US/docs/Web/API/MediaError\n code: error?.code ?? undefined,\n message: JSON.stringify({category: error?.category, severity: error?.severity}),\n data: {additionalData: JSON.stringify(error?.data)},\n });\n\n reject(error);\n }\n resolve();\n });\n };\n }\n}\n","import {Analytics} from '../../core/Analytics';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class ShakaInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(private player: any, opts?: AnalyticsStateMachineOptions) {\n super(player.getMediaElement(), opts);\n }\n\n /**\n * @override\n */\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n super.initialize(analytics);\n let videoElement: HTMLVideoElement | undefined;\n try {\n videoElement = this.player.getMediaElement();\n } catch (e) {} // tslint:disable-line:no-empty\n\n if (videoElement == null) {\n const onStateChangeEventListener = (state) => {\n if (state.state === 'media-source') {\n this.player.removeEventListener('onstatechange', onStateChangeEventListener);\n videoElement = this.player.getMediaElement();\n this.setMediaElement(videoElement);\n }\n };\n this.player.addEventListener('onstatechange', onStateChangeEventListener);\n this.player.addEventListener('unloading', this.onUnloading);\n } else {\n this.setMediaElement(videoElement);\n }\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public onUnloading = () => {\n /**\n * Why do we need to delay the `release()` call?\n * Shaka calls the `unloading` event when the player unloads or fails to load.\n * In the latter case, when loading fails, it immediately calls the unloading event which in turn detaches the analytics.\n * Now, the Shaka player has the problem that it's not triggering the `error` event when loading fails -- no error sample is sent out.\n * So we wrapped the `load()` in the method and catch any error that happens while loading and forward it to the collector.\n * The single problem we have now: The `unload` event happens before we catch the error.\n * To fix this, we delay the call to `release()` for a couple of milliseconds to give the potential error event a chance to be sent out.\n * In case that the `unload` event was called for simple unloading, then we just delay the `release()` and don't miss out on any important changes.\n */\n window.setTimeout(() => {\n this.release();\n }, 10);\n };\n\n public getPlayerName = () => Player.SHAKA;\n\n public getPlayerVersion = () => this.player.constructor.version;\n\n public isLive = () => {\n return this.player ? this.player.isLive() : false;\n };\n\n /**\n * @override\n */\n public getMIMEType() {\n // FIXME: Could be HLS too, Shaka probably has a method to find out\n return MIMETypes.DASH;\n }\n\n /**\n * @override\n */\n public getStreamURL() {\n return this.player ? this.player.getAssetUri() : null;\n }\n\n /**\n * Implemented by sub-class to deliver current quality-level info\n * specific to media-engine.\n * @override\n * @returns {QualityLevelInfo}\n */\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n const variantTracks = this.player.getVariantTracks();\n\n const activeVideoTrack = variantTracks\n .filter((track: any) => track.active)\n .filter((track: any) => track.videoCodec || track.videoId !== undefined)[0];\n\n if (!activeVideoTrack) {\n // can only happen for audio-only streams\n return null;\n }\n\n const bitrate = activeVideoTrack.videoBandwidth || activeVideoTrack.bandwidth;\n const width = activeVideoTrack.width;\n const height = activeVideoTrack.height;\n\n return {\n bitrate,\n width,\n height,\n };\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {VideojsInternalAdapter} from './internal/VideojsInternalAdapter';\n\nexport class VideojsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new VideojsInternalAdapter(player as videojs.default.Player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","// tslint:disable:no-shadowed-variable\nimport {VideojsAnalyticsStateMachine} from '../../analyticsStateMachines/VideoJsAnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport * as CodecHelper from '../../enums/Codecs';\nimport {Event} from '../../enums/Event';\nimport {getMIMETypeFromFileExtension} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {getStreamTypeFromMIMEType} from '../../enums/StreamTypes';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {VideoChangeEvent} from '../../types/EventData';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {StreamSources} from '../../types/StreamSources';\nimport {isDifferentSubtitleInfo, SubtitleInfo} from '../../types/SubtitleInfo';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class VideojsInternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n public readonly videoCompletionTracker: VideoCompletionTracker;\n private _subtitleInfo: SubtitleInfo = {enabled: false};\n private selectedAudioLanguage?: string;\n private onBeforeUnLoadEvent: boolean = false;\n private previousTime: number = 0;\n private previousMutedValue: boolean;\n\n constructor(private player: videojs.default.Player, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new VideojsAnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.videoCompletionTracker = new VideoCompletionTracker();\n this.previousMutedValue = this.player.muted();\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.register();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public getPlayerVersion = () => ((window as any).videojs ? (window as any).videojs.VERSION : 'unknown');\n public getPlayerName = () => Player.VIDEOJS;\n public getPlayerTech = () => 'html5';\n public getAutoPlay = () => this.player.autoplay() === true;\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public getStreamType(url: string) {\n let mimeType = getMIMETypeFromFileExtension(url);\n if (mimeType) {\n return getStreamTypeFromMIMEType(mimeType);\n }\n mimeType = this.player.currentType?.();\n if (mimeType) {\n return getStreamTypeFromMIMEType(mimeType);\n }\n }\n\n // this seems very generic. one could put it in a helper\n // and use it in many adapter implementations.\n public getStreamSources(url: string): StreamSources {\n const streamType = this.getStreamType(url);\n switch (streamType) {\n case 'hls':\n return {m3u8Url: url};\n case 'dash':\n return {mpdUrl: url};\n default:\n return {progUrl: url};\n }\n }\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n this.selectedAudioLanguage = this.getSelectedAudioTrackLanguage(this.player);\n const codecInfo = this.getCodecInfo(this.player.tech({IWillNotUseThisInPlugins: true}));\n\n const info: PlaybackInfo = {\n ...this.getCommonPlaybackInfo(),\n ...this.getStreamSources(this.player.currentSrc()),\n streamFormat: this.getStreamType(this.player.currentSrc()),\n isLive: this.player.duration() === Infinity,\n size: this.player.isFullscreen() ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n isMuted: this.player.muted(),\n videoDuration: this.player.duration(),\n videoWindowHeight: this.player.height(),\n videoWindowWidth: this.player.width(),\n videoPlaybackHeight: this.player.videoHeight(),\n videoPlaybackWidth: this.player.videoWidth(),\n audioLanguage: this.selectedAudioLanguage,\n subtitleEnabled: this._subtitleInfo.enabled,\n subtitleLanguage: this._subtitleInfo.language,\n videoCodec: codecInfo?.videoCodec,\n audioCodec: codecInfo?.audioCodec,\n droppedFrames: 0, // TODO\n // TODO audioBitrate:\n // TODO isCasting:\n // TODO videoTitle: (currently only from the analytics config)\n };\n\n const qualityInfo = this.getCurrentQualityLevelInfo();\n if (qualityInfo) {\n info.videoPlaybackWidth = qualityInfo.width || info.videoPlaybackWidth;\n info.videoPlaybackWidth = qualityInfo.height || info.videoPlaybackHeight;\n info.videoBitrate = qualityInfo.bitrate;\n }\n\n return info;\n }\n\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n // TODO: Needs to be implemented\n return null;\n }\n\n public register() {\n const that = this;\n this.player.on('loadedmetadata', function (this: any) {\n that.videoCompletionTracker.reset();\n that.videoCompletionTracker.setVideoDuration(this.duration());\n that.previousTime = 0;\n that.eventCallback(Event.SOURCE_LOADED, {});\n });\n this.player.ready(function (this: any) {\n that._subtitleInfo = that.getSubtitleInfo(this);\n that.eventCallback(Event.READY, {});\n });\n this.player.on('play', function (this: any) {\n that.eventCallback(Event.PLAY, {\n currentTime: this.currentTime(),\n });\n });\n this.player.on('pause', function (this: any) {\n if (!this.seeking()) {\n that.eventCallback(Event.PAUSE, {\n currentTime: this.currentTime(),\n });\n }\n });\n this.player.on('error', function (this: any) {\n const error: MediaError = this.error();\n that.eventCallback(Event.ERROR, {\n currentTime: this.currentTime(),\n code: error.code,\n message: error.message,\n data: {},\n });\n });\n this.player.on('volumechange', function (this: any) {\n const muted = this.muted();\n const volume = this.volume();\n const isMuted = that.isAudioMuted(muted, volume);\n\n if (this.previousMutedValue !== isMuted) {\n if (isMuted) {\n that.eventCallback(Event.MUTE, {\n currentTime: this.currentTime(),\n });\n } else {\n that.eventCallback(Event.UN_MUTE, {\n currentTime: this.currentTime(),\n });\n }\n this.previousMutedValue = isMuted;\n }\n });\n this.player.on('seeking', function (this: any) {\n that.eventCallback(Event.SEEK, {\n currentTime: that.previousTime != null ? that.previousTime : this.currentTime(),\n });\n });\n this.player.on('seeked', function (this: any) {\n that.eventCallback(Event.SEEKED, {\n currentTime: this.currentTime(),\n });\n });\n\n this.player.on('texttrackchange', function (this: any) {\n const newSubtitleInfo = that.getSubtitleInfo(this);\n const hasInfoChanged =\n that._subtitleInfo == null ? true : isDifferentSubtitleInfo(that._subtitleInfo, newSubtitleInfo);\n that._subtitleInfo = newSubtitleInfo;\n\n if (hasInfoChanged) {\n that.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.currentTime(),\n });\n }\n });\n\n const audioTracks = this.player.audioTracks();\n audioTracks.on('change', () => {\n const newSelectedAudioLanguage = that.getSelectedAudioTrackLanguage(that.player);\n if (newSelectedAudioLanguage != null && newSelectedAudioLanguage !== that.selectedAudioLanguage) {\n that.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime: that.player.currentTime(),\n });\n }\n });\n\n this.player.on('stalled', function (this: any) {\n that.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime(),\n });\n });\n this.player.on('waiting', function (this: any) {\n that.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime(),\n });\n });\n this.player.on('timeupdate', function (this: any) {\n if (!this.seeking()) {\n that.previousTime = this.currentTime();\n }\n that.eventCallback(Event.TIMECHANGED, {\n currentTime: this.currentTime(),\n });\n\n // Check for HLS source-handler (http-streaming)\n // When we just use Videojs without any specific source-handler (not using MSE API based engine)\n // but just native technology (HTML5/Flash) to do for example \"progressive download\" with plain Webm/Mp4\n // or use native HLS on Safari this may not not be present. In that case Videojs is just\n // a wrapper around the respective playback tech (HTML or Flash).\n const tech = this.tech({IWillNotUseThisInPlugins: true});\n\n // older videojs versions don't have vhs property\n if (tech.vhs || tech.hls) {\n const mediaAttributes = that.getMediaAttributes(tech);\n\n if (!mediaAttributes || !mediaAttributes.bitrate) {\n return;\n }\n\n // update actual bitrate\n if (that.shouldAllowVideoQualityChange(mediaAttributes.bitrate)) {\n const eventObject: VideoChangeEvent = {\n width: mediaAttributes.width,\n height: mediaAttributes.height,\n bitrate: mediaAttributes.bitrate,\n currentTime: this.currentTime(),\n };\n\n that.eventCallback(Event.VIDEO_CHANGE, eventObject);\n that.setPreviousVideoBitrate(mediaAttributes.bitrate);\n }\n }\n });\n\n let handlePageClose = () => {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n let currentTime: number | undefined;\n if (this.player != null) {\n currentTime = this.player.currentTime();\n }\n this.eventCallback(Event.UNLOAD, {\n currentTime,\n });\n }\n this.release();\n };\n\n handlePageClose = handlePageClose.bind(this);\n\n this.player.on('dispose', handlePageClose);\n this.windowEventTracker.addEventListener('beforeunload', handlePageClose);\n this.windowEventTracker.addEventListener('unload', handlePageClose);\n }\n\n public sourceChange(config: any, timestamp: number) {\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.player.duration());\n this.previousTime = 0;\n this.stateMachine.sourceChange(config, timestamp, this.player.currentTime());\n }\n protected get currentTime(): number {\n return this.player.currentTime();\n }\n\n private getSelectedAudioTrackLanguage(player: any): string | undefined {\n for (const track of player.audioTracks()) {\n if (track.enabled) {\n return track.language;\n }\n }\n return undefined;\n }\n\n private getSubtitleInfo(player: any): SubtitleInfo {\n const textTracks = player.textTracks() || [];\n let enabled = false;\n let language;\n for (const track of textTracks) {\n if (track.mode === 'showing') {\n enabled = true;\n language = track.language;\n break;\n }\n }\n return {\n enabled,\n language,\n };\n }\n\n // more detailed info from segment can be obtained using\n // https://github.com/videojs/http-streaming#segment-metadata\n // but some properties are not available in older videojs versions\n private getMediaAttributes(playerTech: any): MediaAttributes | undefined {\n if (!playerTech) {\n return;\n }\n\n // From here we are going onto Videojs-HLS source-handler specific API\n let sourceHandler;\n if (playerTech.vhs) {\n sourceHandler = playerTech.vhs;\n } else if (playerTech.hls) {\n // older videojs versions don't have vhs property\n sourceHandler = playerTech.hls;\n }\n\n // Maybe we have the HLS source-handler initialized, but it is\n // not actually activated and used (just wrapping HTML5 built-in HLS playback like in Safari)\n if (!sourceHandler || !sourceHandler.playlists || typeof sourceHandler.playlists.media !== 'function') {\n return;\n }\n\n // Check for current media playlist\n const selectedPlaylist = sourceHandler.playlists.media();\n\n if (!selectedPlaylist) {\n return;\n }\n\n const {attributes} = selectedPlaylist;\n\n if (!attributes || Object.keys(attributes).length === 0) {\n return;\n }\n\n return {\n bitrate: attributes.BANDWIDTH,\n width: (attributes.RESOLUTION || {}).width,\n height: (attributes.RESOLUTION || {}).height,\n codecs: attributes.CODECS,\n };\n }\n\n private getCodecInfo(playerTech: any): CodecInfo | undefined {\n const mediaAttributes = this.getMediaAttributes(playerTech);\n\n if (!mediaAttributes || !mediaAttributes.codecs) {\n return;\n }\n\n const codecs = mediaAttributes.codecs.split(',');\n\n if (!codecs) {\n return;\n }\n\n return {\n videoCodec: codecs.find((codec: string) => CodecHelper.isVideoCodec(codec)),\n audioCodec: codecs.find((codec: string) => CodecHelper.isAudioCodec(codec)),\n };\n }\n}\n\nexport interface CodecInfo {\n audioCodec: string | undefined;\n videoCodec: string | undefined;\n}\n\nexport interface MediaAttributes {\n codecs: string | undefined;\n bitrate: number | undefined;\n width: number | undefined;\n height: number | undefined;\n}\n","import * as StateMachine from 'javascript-state-machine';\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {logger, padRight} from '../utils/Logger';\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\n\nenum State {\n AD = 'AD',\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n END = 'END',\n ERROR = 'ERROR',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n AUDIOTRACK_CHANGED_PLAYING = 'AUDIOTRACK_CHANGED_PLAYING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n SUBTITLE_CHANGED_PLAYING = 'SUBTITLE_CHANGED_PLAYING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class VideojsAnalyticsStateMachine extends AnalyticsStateMachine {\n private seekTimestamp: number;\n private seekedTimestamp: number;\n private seekedTimeout: number;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n this.seekedTimeout = 0;\n }\n\n public getAllStates() {\n return [\n ...Object.keys(State).map((key) => State[key]),\n 'FINISH_PLAY_SEEKING',\n 'PLAY_SEEK',\n 'FINISH_QUALITYCHANGE_PAUSE',\n 'FINISH_QUALITYCHANGE',\n 'FINISH_QUALITYCHANGE_REBUFFERING',\n ];\n }\n\n public getAllStatesBut(state: string) {\n return this.getAllStates().filter((i) => i !== state);\n }\n\n public createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.SETUP,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.SOURCE_LOADED, from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING], to: State.READY},\n {name: Event.TIMECHANGED, from: State.SETUP, to: State.SETUP},\n {name: Event.SOURCE_LOADED, from: State.READY, to: State.READY},\n {name: Event.READY, from: [State.SETUP, State.ERROR], to: State.READY},\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.START_BUFFERING, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.PLAYING},\n\n // Ignoring since it's pushed in a live stream\n {name: Event.SEEK, from: State.STARTUP, to: State.STARTUP},\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n {name: Event.TIMECHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSED_SEEKING},\n {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.SEEKED, from: State.PAUSED_SEEKING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSED_SEEKING, to: State.PLAYING},\n {name: Event.PAUSE, from: State.PAUSED_SEEKING, to: State.PAUSE},\n\n {name: 'PLAY_SEEK', from: State.PAUSE, to: State.PLAY_SEEKING},\n {name: 'PLAY_SEEK', from: State.PAUSED_SEEKING, to: State.PLAY_SEEKING},\n {name: 'PLAY_SEEK', from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n\n // We are ending the seek\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n\n {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.END, from: State.PLAY_SEEKING, to: State.END},\n {name: Event.END, from: State.PAUSED_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n\n {name: Event.PLAY, from: State.END, to: State.PLAYING},\n\n {name: Event.ERROR, from: this.getAllStatesBut(State.STARTUP), to: State.ERROR},\n {name: Event.PAUSE, from: State.ERROR, to: State.ERROR},\n\n {name: Event.SEEK, from: State.END_PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: 'FINISH_PLAY_SEEKING', from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut(State.STARTUP), to: State.END},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD},\n {name: Event.END_AD, from: State.AD, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE], to: State.CASTING},\n {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGED_PLAYING},\n {name: 'FINISH_AUDIOTRACK_CHANGING', from: State.AUDIOTRACK_CHANGED_PLAYING, to: State.PLAYING},\n // States which should ignore audioTrack changes\n {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.READY, to: State.READY},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: State.AUDIOTRACK_CHANGING},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGED_PLAYING},\n {name: 'FINISH_SUBTITLE_CHANGING', from: State.SUBTITLE_CHANGED_PLAYING, to: State.PLAYING},\n // States which should ignore subtitle changes\n {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.READY, to: State.READY},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: this.getAllStatesBut(State.SETUP),\n to: State.SOURCE_CHANGING,\n },\n {name: Event.MANUAL_SOURCE_CHANGE, from: State.SETUP, to: State.SETUP},\n {name: Event.TIMECHANGED, from: State.SOURCE_CHANGING, to: State.SOURCE_CHANGING},\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n ],\n callbacks: {\n onafterevent: (event, from, to, timestamp) => {\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n if (to === State.AUDIOTRACK_CHANGED_PLAYING) {\n this.stateMachine.FINISH_AUDIOTRACK_CHANGING(timestamp);\n }\n if (to === State.SUBTITLE_CHANGED_PLAYING) {\n this.stateMachine.FINISH_SUBTITLE_CHANGING(timestamp);\n }\n },\n onenterstate: (event, from, to, timestamp, eventObject) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || new Date().getTime();\n }\n\n logger.log('[ENTER] ' + padRight(to, 20) + 'EVENT: ' + padRight(event, 20) + ' from ' + padRight(from, 14));\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.SEEK) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.SEEKED) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (\n event === 'PLAY_SEEK' &&\n to === State.PLAY_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.seekTimestamp = this.onEnterStateTimestamp;\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n logger.log(`[LEAVE] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to ${padRight(to, 20)}`);\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (eventObject && to !== State.PAUSED_SEEKING && to !== State.END_PLAY_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (event === 'PLAY_SEEK' && from === State.PAUSE) {\n return true;\n }\n\n if (from === State.READY && to === State.STARTUP) {\n this.setVideoStartTimeout();\n } else if (from === State.STARTUP && (to === State.PLAYING || to === State.EXIT_BEFORE_VIDEOSTART)) {\n this.clearVideoStartTimeout();\n }\n\n const fnName = String(from).toLowerCase();\n if (to === State.EXIT_BEFORE_VIDEOSTART) {\n this.clearVideoStartTimeout();\n const eventData = this.getVideoStartupFailedEventData(timestamp, event, eventObject);\n const shouldSendSample = event !== Event.ERROR;\n this.stateMachineCallbacks.videoStartFailed(eventData, shouldSendSample);\n } else if (from === State.PAUSED_SEEKING) {\n const seekDuration = timestamp - this.seekTimestamp;\n this.stateMachineCallbacks.paused_seeking(seekDuration, fnName);\n } else if (from === State.END_PLAY_SEEKING) {\n const seekDuration = this.seekedTimestamp - this.seekTimestamp;\n this.stateMachineCallbacks.end_play_seeking(seekDuration, fnName);\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (from === State.PAUSE && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.stateMachineCallbacks.pause(stateDuration, fnName);\n } else {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n callbackFunction(stateDuration, fnName, eventObject);\n } else {\n const excludedStates = [\n State.MUTING_PAUSE,\n State.MUTING_PLAY,\n State.AUDIOTRACK_CHANGED_PLAYING,\n State.SUBTITLE_CHANGED_PLAYING,\n ];\n if (excludedStates.find((e) => from === e) == null) {\n logger.error('Could not find callback function for ' + fnName);\n }\n }\n }\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n } else if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n },\n onseek: (event, from, to, timestamp) => {\n this.seekTimestamp = timestamp;\n },\n onseeked: (event, from, to, timestamp) => {\n this.seekedTimestamp = timestamp;\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n this.stateMachineCallbacks.heartbeat(stateDuration, String(from).toLowerCase(), {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n public callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n exec.call(this.stateMachine, timestamp, eventObject);\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n public sourceChange = (config: any, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n}\n","const videoCodecs = ['avc1', 'avc3', 'hvc1', 'av01', 'av1', 'hev1', 'vp9'];\n\nconst audioCodecs = ['mp4a', 'ec-3', 'ac-3', 'opus', 'audio/mp4'];\n\nexport function isVideoCodec(codec: string): boolean {\n if (!codec) {\n return false;\n }\n const index = videoCodecs.findIndex((videoCodec) => codec.startsWith(videoCodec));\n return index !== -1;\n}\n\nexport function isAudioCodec(codec: string): boolean {\n if (!codec) {\n return false;\n }\n const index = audioCodecs.findIndex((videoCodec) => codec.startsWith(videoCodec));\n return index !== -1;\n}\n","export interface SubtitleInfo {\n /**\n * Indicates if subtitles are displayed.\n */\n enabled: boolean;\n /**\n * The selected subtitle/captions language.\n */\n language?: string;\n}\n\nexport const isDifferentSubtitleInfo = (info1?: SubtitleInfo, info2?: SubtitleInfo): boolean => {\n if (info1 == null && info2 == null) {\n return false;\n }\n return !(info1 != null && info2 != null && info1.enabled === info2.enabled && info1.language === info2.language);\n};\n","export enum CdnProvider {\n CLOUDFLARE = 'cloudflare',\n AKAMAI = 'akamai',\n FASTLY = 'fastly',\n MAXCDN = 'maxcdn',\n CLOUDFRONT = 'cloudfront',\n CHINACACHE = 'chinacache',\n BITGRAVITY = 'bitgravity',\n}\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["webpack://bitmovin.analytics/webpack/universalModuleDefinition","webpack://bitmovin.analytics/webpack/bootstrap","webpack://bitmovin.analytics/./js/utils/Logger.ts","webpack://bitmovin.analytics/./js/utils/Utils.ts","webpack://bitmovin.analytics/./js/enums/Event.ts","webpack://bitmovin.analytics/./js/enums/Player.ts","webpack://bitmovin.analytics/./js/core/Analytics.ts","webpack://bitmovin.analytics/./js/adapters/Adapter.ts","webpack://bitmovin.analytics/./js/utils/Settings.ts","webpack://bitmovin.analytics/./js/features/errordetails/ErrorDetailBackend.ts","webpack://bitmovin.analytics/./js/features/errordetails/ErrorDetailTracking.ts","webpack://bitmovin.analytics/./js/enums/MIMETypes.ts","webpack://bitmovin.analytics/./js/enums/PlayerSize.ts","webpack://bitmovin.analytics/./js/adapters/internal/InternalAdapter.ts","webpack://bitmovin.analytics/./js/enums/ErrorCode.ts","webpack://bitmovin.analytics/./node_modules/javascript-state-machine/state-machine.js","webpack://bitmovin.analytics/./js/analyticsStateMachines/AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/adapters/internal/HTML5InternalAdapter.ts","webpack://bitmovin.analytics/./js/Version.ts","webpack://bitmovin.analytics/./js/utils/Http.ts","webpack://bitmovin.analytics/./js/core/NoOpBackend.ts","webpack://bitmovin.analytics/./js/core/EventDispatcher.ts","webpack://bitmovin.analytics/./js/core/VideoCompletionTracker.ts","webpack://bitmovin.analytics/./js/types/CustomDataValues.ts","webpack://bitmovin.analytics/./js/utils/EventDebugging.ts","webpack://bitmovin.analytics/./js/enums/CastTech.ts","webpack://bitmovin.analytics/./js/utils/BitmovinProgressiveSourceHelper.ts","webpack://bitmovin.analytics/./js/core/DownloadSpeedMeter.ts","webpack://bitmovin.analytics/./js/analyticsStateMachines/HTML5AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/enums/StreamTypes.ts","webpack://bitmovin.analytics/./js/core/BitmovinAnalyticsExport.ts","webpack://bitmovin.analytics/./js/adapters/Bitmovin7Adapter.ts","webpack://bitmovin.analytics/./js/features/FeatureManager.ts","webpack://bitmovin.analytics/./js/utils/CodecHelper.ts","webpack://bitmovin.analytics/./js/enums/PageLoadType.ts","webpack://bitmovin.analytics/./js/core/AdAnalytics.ts","webpack://bitmovin.analytics/./js/types/AdAnalyticsSample.ts","webpack://bitmovin.analytics/./js/types/AdBreakSample.ts","webpack://bitmovin.analytics/./js/types/AdSample.ts","webpack://bitmovin.analytics/./js/utils/ViewportTracker.ts","webpack://bitmovin.analytics/./js/core/BackendFactory.ts","webpack://bitmovin.analytics/./js/utils/LicenseCall.ts","webpack://bitmovin.analytics/./js/core/DebuggingBackend.ts","webpack://bitmovin.analytics/./js/core/LicenseCheckingBackend.ts","webpack://bitmovin.analytics/./js/types/LicensingRequest.ts","webpack://bitmovin.analytics/./js/core/QueueBackend.ts","webpack://bitmovin.analytics/./js/core/RemoteBackend.ts","webpack://bitmovin.analytics/./js/utils/AnalyticsCall.ts","webpack://bitmovin.analytics/./js/core/LongPlaytimeFilteringBackend.ts","webpack://bitmovin.analytics/./js/core/SequenceNumberBackend.ts","webpack://bitmovin.analytics/./js/core/SessionPersistenceHandler.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin7InternalAdapter.ts","webpack://bitmovin.analytics/./js/analyticsStateMachines/Bitmovin7AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/enums/VideoStartFailedReason.ts","webpack://bitmovin.analytics/./js/features/Feature.ts","webpack://bitmovin.analytics/./js/types/StateMachineCallbacks.ts","webpack://bitmovin.analytics/./js/utils/WindowEventTracker.ts","webpack://bitmovin.analytics/./js/adapters/Bitmovin8Adapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin8InternalAdapter.ts","webpack://bitmovin.analytics/./js/analyticsStateMachines/Bitmovin8AnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/utils/Converter.ts","webpack://bitmovin.analytics/./js/core/Measure.ts","webpack://bitmovin.analytics/./js/core/SegmentTracker.ts","webpack://bitmovin.analytics/./js/features/httprequesttracking/HttpRequestTracking.ts","webpack://bitmovin.analytics/./js/utils/Queue.ts","webpack://bitmovin.analytics/./js/adapters/internal/ads/Bitmovin8AdModule.ts","webpack://bitmovin.analytics/./js/adapters/internal/ads/AdModuleAPI.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin8HttpRequestTrackingAdapter.ts","webpack://bitmovin.analytics/./js/features/httprequesttracking/HttpRequestType.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin8SegmentTrackerAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/Bitmovin8SpeedMeterAdapter.ts","webpack://bitmovin.analytics/./js/adapters/CAFv3Adapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/CAFv3InternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/DashjsAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/DashjsInternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/HlsAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/HlsInternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/HlsSpeedMeterAdapter.ts","webpack://bitmovin.analytics/./js/adapters/HTMLVideoElementAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/HTMLVideoElementInternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/ShakaAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/ShakaInternalAdapter.ts","webpack://bitmovin.analytics/./js/adapters/VideoJsAdapter.ts","webpack://bitmovin.analytics/./js/adapters/internal/VideojsInternalAdapter.ts","webpack://bitmovin.analytics/./js/analyticsStateMachines/VideoJsAnalyticsStateMachine.ts","webpack://bitmovin.analytics/./js/enums/Codecs.ts","webpack://bitmovin.analytics/./js/types/SubtitleInfo.ts","webpack://bitmovin.analytics/./js/enums/CDNProvider.ts"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Logger","showLogs","this","setLogging","logging","isLogging","log","msg","optionalParamters","_i","arguments","length","console","apply","__spreadArrays","logTable","fields","table","errorMessageToUser","error","warning","warn","warningMessageToUser","optionalParameters","padRight","str","Array","join","slice","logger","PageLoadType_1","CustomDataUtils","validString","text","isNullOrEmptyString","validBoolean","bool","validNumber","num","sanitizePath","path","replace","calculateTimeWithUndefined","time","undefined","Math","round","calculateTime","getCurrentTimestamp","Date","now","getDurationFromTimestampToNow","timestamp","generateUUID","random","toString","getCookie","cname","ca_1","document","cookie","split","charAt","substring","indexOf","noOp","getCustomDataString","customData","JSON","stringify","String","transferCustomDataFields","fromConfig","toConfig","customDataFieldCount","customDataField","getDocumentPropWithPrefix","prop","pascalCase","toUpperCase","prefixes_1","prefix","isVideoInFullscreen","fullscreenProp","nodeName","getHiddenProp","getPageLoadType","hiddenProp","PAGE_LOAD_TYPE","BACKGROUND","FOREGROUND","getHostnameAndPathFromUrl","url","domElement","createElement","href","hostname","pathname","calculatePercentage","numerator","denominator","getBrowserInfo","tem","ua","navigator","userAgent","M","match","test","version","exec","appName","appVersion","splice","getURLResourceName","pop","joinUrls","args","reduce","prev","current","endsWith","substr","startsWith","suffix","Event","Player","ErrorCode_1","PlayerSize_1","FeatureManager_1","CustomDataValues_1","CodecHelper_1","Logger_1","Settings","Utils","Version_1","AdAnalytics_1","BackendFactory_1","EventDispatcher_1","NoOpBackend_1","SessionPersistenceHandler_1","Analytics","config","adapter","backendFactory","_this","BackendFactory","pageLoadTime","playerStartupTime","videoStartupTime","autoplay","droppedSampleFrames","startupTime","featureManager","FeatureManager","onErrorDetailEventDispatcher","EventDispatcher","authenticationCallback","authenticationCompleted","success","featureConfigs","configureFeatures","guardAgainstMissingVideoTitle","oldConfig","newConfig","title","guardAgainstMissingIsLive","isLive","sourceChange","getMergedAnalyticsConfig","setCustomDataOnce","values","__assign","setState","changeCustomData","sendAnalyticsRequestAndClearValues","setConfigParameters","setCustomData","getCurrentImpressionId","sample","impressionId","getUserId","sessionHandler","userId","input","retVal","customDataValuesKeys","forEach","that","buildDefaultAnalyticsConfigValues","errorDetailTrackingSettingsProvider","domain","getDomain","licenseKey","_a","collectorConfig","SessionPersistenceHandler","licenseKeyReceivedUnsubscriber","onLicenseKeyReceived","subscribe","eventArgs","setupSample","init","setupStateMachineCallbacks","features","initialize","registerFeatures","adModule","adAnalytics","AdAnalytics","checkForErrorsInConfig","VERSION","getPlayerInformationFromAdapter","player","getPlayerName","getPlayerVersion","playerTech","getPlayerTech","updateSamplesToCastClientConfig","samples","castClientConfig","samples_1","updateSampleToCastClientConfig","language","supportsDeferredLicenseLoading","debug","resetFeatures","backend","createBackend","generateNewImpressionId","setUserId","videoCompletionTracker","reset","clearResetQualityChangeInterval","resetQualityChangeCount","release","NoOpBackend","playerKey","getDomainFromConfig","location","cdnProvider","videoId","videoTitle","customUserId","experimentName","stateMachineCallbacks","setup","duration","state","analyticsVersion","setDuration","performance","timing","loadTime","navigationStart","startup","supportedVideoCodecs","CodecHelper","supportedVideoFormats","getAutoPlay","drmPerformance","getDrmPerformanceInfo","drmType","drmLoadTime","playing","played","setCompletionValues","unload","videoStartForClosedState","videoTimeStart","sendUnloadRequest","videoTimeEnd","setVideoTimeStart","setVideoTimeEnd","clearValues","heartbeat","sampleData","qualitychange","sendQualityChange","qualitychange_pause","qualitychange_rebuffering","videoChange","event","setVideoTimeEndFromEvent","setVideoTimeStartFromEvent","setPlaybackVideoPropertiesFromEvent","audioChange","setPlaybackAudioPropertiesFromEvent","audiotrack_changing","pause","paused","paused_seeking","seeked","end_play_seeking","rebuffering","buffered","videoStartFailed","sendRequest","videoStartFailedReason","reason","errorCode","code","errorMessage","message","dispatch","errorData","legacyData","segmentNames","segments","map","errorSegments","onError","data","ad","mute","isMuted","unMute","subtitle_changing","currentTime","manualSourceChange","resetSourceRelatedState","keys","playlistTransition","initialSourceChange","end","customdatachange","width","videoPlaybackWidth","height","videoPlaybackHeight","bitrate","videoBitrate","codec","videoCodec","audioBitrate","audioCodec","setPlaybackInfoFromAdapter","info","getCurrentPlaybackInfo","getIsLiveFromConfigOrPlaybackInfo","size","videoDuration","streamFormat","mpdUrl","m3u8Url","progUrl","videoWindowWidth","videoWindowHeight","screenHeight","screenWidth","isCasting","castTech","audioLanguage","subtitleEnabled","subtitleLanguage","droppedFrames","max","platform","pageLoadType","userLanguage","screen","PlayerSize","Window","completedTotal","sendAnalyticsRequest","downloadSpeedInfo","copySample","sendAnalyticsRequestSynchronous","sendRequestSynchronous","completed","isLiveFromPlayback","getMergedCollectorConfig","mergedCollectorConfig","enabled","origin","addWatched","start","getCompletionPercentage","Number","isNaN","resetQualityChangeCountIntervalId","setInterval","ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL","increaseQualityChangeCount","isQualityChangeEventEnabled","ErrorCode","QUALITY_CHANGE_THRESHOLD_EXCEEDED","clearInterval","LICENSE_CALL_PENDING_TIMEOUT","PAGE_LOAD_TYPE_TIMEOUT","CAST_RECEIVER_CONFIG_MESSAGE","Adapter","guardAgainstNotInitializedAnalytics","analytics","internalAdapter","hasPlayerAlreadyBeenAugmented","__bitmovinAnalyticsHasBeenSetup","markPlayerInstanceAsAugmented","MESSAGE_NAMESPACE","ANALYTICS_BACKEND_BASE_URL","ANALYTICS_LICENSECALL_TIMEOUT","ANALYTICS_VIDEOSTART_TIMEOUT","ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD","ANALYTICS_REBUFFER_TIMEOUT","ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD","Http_1","Settings_1","Utils_1","ErrorDetailBackend","_queue","_enabled","backendUrl","copyErrorDetailTruncateStringsAndUrls","errorDetail","maxStringLength","maxUrlLength","copyErrorDataTruncateStrings","httpRequests","_b","request","copyHttpRequestTruncateUrls","httpRequest","maxLength","lastRedirectLocation","exceptionMessage","additionalData","copyErrorDetailTruncateHttpRequests","maxRequests","limitHttpRequestsOfQueuedErrorDetails","index","send","errorDetailCopy","MAX_STRING_LENGTH","MAX_URL_LENGTH","post","push","flush","copy","element","shift","removeFromQueue","clear","findIndex","ErrorDetailTracking","_super","settingsProvider","subscribables","httpRequestTracking","errorIndex","onErrorHandler","isEnabled","httpRequestsCopy","errorId","exceptionStacktrace","subscribable","__extends","disabled","disable","unsubscribe","configured","authenticated","numberOfHttpRequests","configure","extractConfig","configContainer","errorDetails","Feature","MP4","WEBM","HLS","DASH","MIMETypes","getMIMETypeFromFileExtension","toLowerCase","Event_1","StateMachineCallbacks_1","WindowEventTracker_1","InternalAdapter","opts","defaultStateMachineCallbacks","_onLicenseKeyReceived","_onLicenseCallFailed","drmPerformanceInfo","previousVideoBitrate","previousAudioBitrate","qualityChangeCount","_windowEventTracker","WindowEventTracker","eventCallback","eventType","eventObject","stateMachine","callEvent","starttime","segmentsDownloadCount","segmentsDownloadSize","segmentsDownloadTime","avgDownloadSpeed","minDownloadSpeed","maxDownloadSpeed","avgTimeToFirstByte","resetIntervals","getCommonPlaybackInfo","clearSegments","previousState","currentState","CUSTOM_DATA_CHANGE","shouldAllowVideoQualityChange","newBitrate","setPreviousVideoBitrate","shouldAllowAudioQualityChange","setPreviousAudioBitrate","isAudioMuted","playerIsMuted","currentVolume","BITMOVIN_PLAYER_LICENSING_ERROR","SETUP_MISSING_LICENSE_WHITELIST","BUFFERING_TIMEOUT_REACHED","VIDEO_STARTUP_TIMEOUT_REACHED","StateMachine","Result","SUCCEEDED","NOTRANSITION","CANCELLED","PENDING","Error","INVALID_TRANSITION","PENDING_TRANSITION","INVALID_CALLBACK","WILDCARD","ASYNC","cfg","target","initial","terminal","fsm","events","callbacks","transitions","add","e","from","isArray","to","buildEvent","is","can","transition","cannot","concat","isFinished","states","sort","defer","doCallback","func","beforeAnyEvent","afterAnyEvent","leaveAnyState","enterAnyState","changeState","beforeThisEvent","afterThisEvent","leaveThisState","enterThisState","beforeEvent","afterEvent","leaveState","specific","general","enterState","cancel","leave","VideoStartFailedReason_1","REBUFFERING_HEARTBEAT_INTERVALS","AnalyticsStateMachine","onEnterStateTimestamp","videoStartupTimeoutMs","rebufferTimeoutMs","currentRebufferingIntervalIndex","createStateMachine","clearVideoStartTimeout","clearRebufferingTimeoutHandle","clearRebufferingHeartbeatHandle","startRebufferingHeartbeatInterval","resetRebufferingHelpers","startRebufferingTimeoutHandle","rebufferingHeartbeatIntervalHandle","getTime","stateDuration","min","rebufferingTimeoutHandle","setTimeout","ERROR","clearTimeout","getVideoStartupFailedEventData","getReasonForVideoStartFailure","VideoStartFailedReason","PLAYER_ERROR","UNLOAD","PAGE_CLOSED","VIDEOSTART_TIMEOUT","TIMEOUT","UNKNOWN","setVideoStartTimeout","videoStartTimeout","HTML5AnalyticsStateMachine_1","VideoCompletionTracker_1","MIMETypes_1","Player_1","StreamTypes_1","HTML5InternalAdapter","mediaElement","onBeforeUnLoadEvent","previousMutedValue","HTML5","Infinity","initializeStateMachine","mediaElEventHandlers","bufferingTimeout","isBuffering","lastIsLiveStatus","isPaused","isSeeking","previousMediaTime","previousClientTime","needsReadyEvent","needsFirstPlayIntent","mediaElementSet","default","setMediaElement","registerWindowEvents","getStreamSources","getStreamType","getStreamURL","Fullscreen","muted","qualityInfo","getCurrentQualityLevelInfo","unregisterMediaElement","registerMediaElement","onMaybeReady","getMIMEType","streamUrl","mimetype","getStreamTypeFromMIMEType","src","resetMedia","wrapMediaElementLoad","listenToMediaElementEvent","READY","readyState","checkQualityLevelAttributes","setVideoDuration","PLAY","onPaused","volume","MUTE","UN_MUTE","SEEK","SEEKED","TIMECHANGED","checkSeeking","checkPlayheadProgress","onBuffering","handler","boundHandler","addEventListener","item","removeEventListener","START_BUFFERING","PAUSE","windowEventTracker","onPageClose","ended","BUFFERING_TIMECHANGED_TIMEOUT","silent","qualityLevelInfo","eventData","VIDEO_CHANGE","getSelectedSubtitleFromMediaElement","textTracks","textTrackList_1","attr","isSubtitleDisplayed","HTML5AnalyticsStateMachine","SETUP","originalLoad","load","currentVideoTime","mediaTimeDif","abs","clientTimeDif","body","callback","async","xhttp","legacyMode","XDomainRequest","XMLHttpRequest","responseCallback","DONE","responseText","sampleResponse","parse","onload","onreadystatechange","open","setRequestHeader","sendAdRequest","TimespanOverlappingType","VideoCompletionTracker","watched","overlappingTimespan","mergeWatched","getDuration","w","time1","k","time2","overlapType","getOverlappingType","Overlapping","mergeAndReplace","getOverlappingTimespan","FirstContainedInSecond","SecondContainedInFirst","None","first","second","isMomentInTimespan","moment","timespan","firstIndex","secondIndex","newWatchedTimespan","filter","EventDebugging","CastTech","getSourceInfoFromBitmovinSourceConfig","progressive","progBitrate","playbackVideoData","getPlaybackVideoData","progressiveArrayIndex","id","Converter_1","Measure_1","DownloadSpeedMeter","measures","addMeasurement","measurement","httpStatus","measure","Measure","threshhold","Converter","bitsToBytes","speed","getInfo","ceil","totalTime","avgSpeed","minSpeed","maxSpeed","a","b","totalSpeed","speeds","numMeasurements","bytePerSecondToBitPerSecond","bps","bytesToBits","avg","timeToFirstByte","State","AnalyticsStateMachine_1","MANUAL_SOURCE_CHANGE","seekStartedAt","getAllStates","getAllStatesBut","INITIALIZED","eventName","END","SOURCE_CHANGING","STARTUP","EXIT_BEFORE_VIDEOSTART","END_BUFFERING","AUDIO_CHANGE","PLAYING","REBUFFERING","PAUSED_SEEKING","QUALITYCHANGE","QUALITYCHANGE_PAUSE","SUBTITLE_CHANGE","SUBTITLE_CHANGING","AUDIOTRACK_CHANGED","AUDIOTRACK_CHANGING","START_AD","AD","END_AD","MUTING_READY","MUTING_PLAY","MUTING_PAUSE","START_CAST","CASTING","END_CAST","SOURCE_LOADED","SOURCE_UNLOADED","QUALITYCHANGE_REBUFFERING","CUSTOMDATACHANGE","PLAYLIST_TRANSITION","onenterstate","startCasting","onafterevent","FINISH_QUALITYCHANGE_PAUSE","FINISH_QUALITYCHANGE","FINISH_QUALITYCHANGE_REBUFFERING","FINISH_MUTING","onleavestate","fnName","shouldSendSample","seekDuration","callbackFunction","onseek","ontimechanged","onplayerError","mapping","mimeType","Bitmovin7Adapter_1","Bitmovin7Adapter","Bitmovin8Adapter_1","Bitmovin8Adapter","CAFv3Adapter_1","CAFv3Adapter","DashjsAdapter_1","DashjsAdapter","HlsAdapter_1","HlsAdapter","HTMLVideoElementAdapter_1","HTMLVideoElementAdapter","ShakaAdapter_1","ShakaAdapter","VideoJsAdapter_1","VideojsAdapter","CDNProvider_1","CdnProvider","AnalyticsModule","hooks","getConfig","Promise","resolve","analyticsModuleInstance","analyticsModule","PlayerModule","adapters","Analytics_1","Adapter_1","Bitmovin7InternalAdapter_1","augment","originalSetup","playerSetupPromise","analyticsConfig","Bitmovin7InternalAdapter","wrapPlayerLoad","unregisterFeatures","feature","constructor","videoFormatCodecMap","avc","vp9","av1","hevc","getOwnPropertyNames","format","some","isCodecSupported","MediaSource","isTypeSupported","AdQuartile","AdAnalyticsSample_1","AdBreakSample_1","AdSample_1","ViewportTracker_1","adManifestLoadedEvents","isPlaying","adPodPosition","adCallbacks","onAdStarted","onAdFinished","onAdBreakStarted","onAdBreakFinished","onAdClicked","onAdError","onAdManifestLoaded","onPlay","onPause","onBeforeUnload","onAdSkipped","onAdQuartile","viewportTracker","ViewportTracker","getContainer","onIntersectionChanged","clearCurrentTimeInterval","dispose","activeAdSample","isContainerInViewport","enterViewportTimestamp","timeInViewport","isInViewport","isLinearAdActive","beginPlayingTimestamp","updatePlayingTime","adTagConfig","adConfig","tag","type","AdBreakSample","adBreak","activeAdBreakSample","getAdManifestLoadedEvent","adStartupTimestamp","resetActiveAd","isLinear","AdSample","adStartupTime","startAd","adSample","completeAd","adDuration","skipped","skipPosition","skipPercentage","errorPosition","adBreakSample","ads","includes","adId","errorPercentage","onAdLinearityChanged","adClickthroughUrl","clickThroughUrl","clicked","clickPosition","clickPercentage","quartile","FIRST_QUARTILE","quartile1","MIDPOINT","midpoint","THIRD_QUARTILE","quartile3","closed","closePosition","closePercentage","createNewAdAnalyticsSample","analyticsSample","moduleInfo","getAdModuleInfo","AdAnalyticsSample","adModuleVersion","find","adImpressionId","percentageInViewport","timePlayed","started","currentTimeInterval","TIMEOUT_CURRENT_TIME_INTERVAL","exitPosition","playPercentage","MODULE_NAME","videoImpressionId","adManifestLoadedEvent","adFallbackIndex","manifestDownloadTime","downloadTiming","downloadTime","adReplaceContentDuration","replaceContentDuration","currentFallbackIndex","adBreakConfig","position","adPosition","adOffset","adPreloadOffset","preloadOffset","adIsPersistent","persistent","fallbackTags","adTagType","adTagUrl","adTagDetails","adTagServer","adTagPath","adScheduleTime","scheduleTime","adIdPlayer","mediaUrl","mediaFileUrl","mediaUrlDetails","mediaPath","mediaServer","adPlaybackHeight","adPlaybackWidth","adSystem","advertiser","advertiserName","apiFramework","creative","creativeAdId","creativeId","universalAdId","universalAdIdRegistry","idRegistry","universalAdIdValue","adDescription","minSuggestedDuration","survey","surveyUrl","uri","adTitle","wrapperAdsCount","wrapperAdIds","linearAd","adSkippableAfter","parseSkipAfter","skippableAfter","adSkippable","skippable","skipAfter","threshold","inViewport","options","rootMargin","observer","IntersectionObserver","entries","handleIntersect","observe","hidden","visibilityChange","handleVisibilityChange","isHidden","unobserve","disconnect","intersectionRatio","LicenseCall_1","DebuggingBackend_1","LicenseCheckingBackend_1","LongPlaytimeFilteringBackend_1","SequenceNumberBackend_1","licensingRequest","inner","createInnerBackend","decorateWithDebuggingBackend","DebuggingBackend","decorateWithBackendFromConfigIfAvailable","innerBackend","wrapBackend","LicenseCheckingBackend","LicenseCall","sequenceNumberAssigningBackend","SequenceNumberBackend","LongPlaytimeFilteringBackend","baseUrl","licenseServerUrl","response","underlying","debugFields","printFields","fields_1","f","LicensingRequest_1","QueueBackend_1","RemoteBackend_1","licenseCall","backendBaseUrl","licenseKeyReceived","licenseLazyLoadingTimeoutHandle","unsubscribeFromAdapter","promise","wrapLicenseCheckPromiseWithCallback","performLicenseCheck","licenseCallFailed","licenseLazyLoadingTimeout","QueueBackend","onLicenseCallFailed","status","LicensingResult","Denied","then","result","Granted","remoteBackend","RemoteBackend","flushTo","catch","err","queue","unloadQueue","syncQueue","adQueue","AnalyticsCall_1","hasAdModule","analyticsCall","AnalyticsCall","Utils_2","analyticsServerUrl","adAnalyticsServerUrl","trySendBeacon","getAnalyticsServerUrl","fallbackFunction","sendBeacon","getAdAnalyticsServerUrl","next","isPlayedAboveThreshold","sequenceNumber","updateSampleBeforeSending","BITMOVIN_ANALYTICS_UUID_COOKIE_NAME","cookiesEnabled","cookiesDomain","ensureNoCookiePresent","setupUserId","createAndSetNewUserId","generatedId","writeCookie","Bitmovin7AnalyticsStateMachine_1","CastTech_1","ErrorDetailBackend_1","ErrorDetailTracking_1","BitmovinProgressiveSourceHelper_1","BITMOVIN","getPlayerType","Bitmovin7AnalyticsStateMachine","register","errorDetailSubscribable","playback","isFullscreen","getFigure","offsetWidth","offsetHeight","getAudio","lang","isReady","getDroppedFrames","applySubtitleProperties","applyPlaybackQualityProperties","applySourceProperties","applyCastingProperties","addEventHandler","EVENT","ON_SOURCE_UNLOADED","getCurrentTime","ON_SOURCE_LOADED","ON_READY","ON_CAST_STARTED","ON_CAST_STOPPED","ON_PLAY","ON_PAUSED","ON_TIME_CHANGED","ON_SEEK","ON_SEEKED","ON_STALL_STARTED","ON_STALL_ENDED","ON_AUDIO_PLAYBACK_QUALITY_CHANGED","quality","getPlaybackAudioData","ON_VIDEO_PLAYBACK_QUALITY_CHANGED","ON_FULLSCREEN_ENTER","START_FULLSCREEN","ON_FULLSCREEN_EXIT","END_FULLSCREEN","ON_AD_STARTED","ON_AD_FINISHED","ON_MUTED","ON_UNMUTED","ON_ERROR","ON_PLAYBACK_FINISHED","PLAYBACK_FINISHED","ON_DOWNLOAD_FINISHED","downloadType","ON_AUDIO_CHANGED","ON_SUBTITLE_CHANGED","handlePageClose","on","ON_DESTROY","source","dash","hls","progSourceInfo","subtitle","getSubtitle","videoQuality","audioQuality","isAirplayActive","AirPlay","remoteControlConfig","remotecontrol","GoogleCast","WebSocket","EventDebugging_1","debuggingStates","enabledDebugging","pausedTimestamp","seekTimestamp","seekedTimestamp","seekedTimeout","seekStarted","seekEnded","PLAY_SEEKING","END_PLAY_SEEKING","onpause","onbeforeevent","elapsedTime","PAUSE_SEEK_DELAY","PLAY_SEEK","SEEKED_PAUSE_DELAY","addStatesToLog","onseeked","getStates","setEnabledDebugging","_config","_isEnabled","payload","source_changing","ready","casting","muting_ready","trackedObjects","obj","Bitmovin8InternalAdapter_1","playerConfig","Bitmovin8InternalAdapter","ViewMode","Bitmovin8AnalyticsStateMachine_1","DownloadSpeedMeter_1","SegmentTracker_1","HttpRequestTracking_1","AnalyticsSettings","Bitmovin8AdModule_1","Bitmovin8HttpRequestTrackingAdapter_1","Bitmovin8SegmentTrackerAdapter_1","Bitmovin8SpeedMeterAdapter_1","InternalAdapter_1","Bitmovin8AnalyticsStateMachine","speedMeter","Bitmovin8SpeedMeterAdapter","getDownloadSpeedMeter","segmentTracker","Bitmovin8SegmentTrackerAdapter","SegmentTracker","getSegmentTracker","httpRequestTrackingAdapter","Bitmovin8HttpRequestTrackingAdapter","getSegments","_adModule","isAdPlaying","lastTrackedCurrentTime","currentAd","getActiveAd","registerPlayerEventListeners","registerUnloadEventListeners","Bitmovin8AdModule","requestTracking","HttpRequestTracking","getViewMode","getSource","getDroppedVideoFrames","PlayerEvent","SourceUnloaded","SourceLoaded","CastStarted","CastStopped","Play","issuer","Playing","Paused","TimeChanged","Seek","allowSeeking","Seeked","StallStarted","StallEnded","AudioPlaybackQualityChanged","VideoPlaybackQualityChanged","ViewModeChanged","AdStarted","AdFinished","AdSkipped","AdError","Muted","Unmuted","PlaybackFinished","DownloadFinished","AudioChanged","SubtitleEnabled","SubtitleDisabled","LicenseValidated","handleCollectorUnload","Destroy","enabledSubtitle","subtitles","list","seekEvent","seekTarget","INITIAL_SOURCE_CHANGE","AD_STARTUP","AD_READY","AD_PAUSE","AD_PLAYING","lastTrackedVideoEndObject","bytes","bits","bytesToKiloBytes","kiloBytesToMegaBytes","kiloByte","download","addSegment","segment","removeSegment","Queue_1","_maxRequests","DEFAULT_MAX_REQUESTS","_httpRequestQueue","Queue","onDownloadFinishedHandler","addRequest","items","limit","offer","_items","poll","maxElements","AdModuleAPI_1","AdCallbacks","getModuleInfo","AdBreakStarted","AdBreakFinished","AdClicked","AdManifestLoaded","HttpRequestType_1","eventDispatcher","playerExports","onDownloadFinished","_c","mapHttpRequestType","HttpRequestType","MANIFEST_DASH","MANIFEST_HLS_MASTER","MANIFEST_HLS_VARIANT","MANIFEST_SMOOTH","MANIFEST_ADS","MEDIA_AUDIO","MEDIA_VIDEO","MEDIA_SUBTITLES","MEDIA_THUMBNAILS","DRM_LICENSE_WIDEVINE","DRM_LICENSE_PLAYREADY","DRM_LICENSE_FAIRPLAY","DRM_LICENSE_PRIMETIME","DRM_LICENSE_CLEARKEY","DRM_CERTIFICATE_FAIRPLAY","KEY_HLS_AES","TIME_SYNC","handleSegmentPlaybackEvent","handleOnDownloadFinishEvent","SegmentPlayback","meter","CAFv3InternalAdapter_1","CAFv3InternalAdapter","context","CHROMECAST_SHAKA","currentItem","playerManager","getPlayerManager","cast","framework","getCurrentTimeSec","stats","getStats","getIsLive","mediaInformation","activeAudioTrack","trackContentType","activeTextTracks","audioTracksManager","getAudioTracksManager","getActiveTrack","textTracksManager","getTextTracksManager","getActiveTracks","queueManager","getQueueManager","getCurrentItem","media","currentMediaTime","detailedErrorCode","streamType","getLiveSeekableRange","DashjsInternalAdapter_1","DashjsInternalAdapter","mediaPlayer","DASHJS","getVersion","videoEl","getVideoElement","registerMediaElementEventsForDashJS","currentVideoQuality","getBitrateInfoListFor","getQualityFor","HlsInternalAdapter_1","HlsInternalAdapter","HlsSpeedMeterAdapter_1","HLSJS","levels","currentLevel","currentLevelObj","details","live","onDestroying","HlsSpeedMeterAdapter","registerHlsEvents","Events","MEDIA_ATTACHING","onMediaAttaching","MEDIA_DETACHING","onMediaDetaching","MANIFEST_LOADING","onManifestLoading","AUDIO_TRACK_SWITCHED","onAudioTrackSwitched","SUBTITLE_TRACK_SWITCH","onSubtitleLanguageSwitched","DESTROYING","onHlsError","selectedSubtitle","getSelectedSubtitleLanguage","getSelectedAudioLanguage","errorName","fatal","getErrorCodeFromHlsErrorType","audioTrack","audioTracks","subtitleDisplay","subtitleTrack","subtitleTracks","subtitleTrackController","FRAG_LOADED","handleFragmentLoadedEvent","frag","tload","trequest","total","tfirst","networkDetails","HTMLVideoElementInternalAdapter_1","HTMLVideoElementInternalAdapter","browserInfo","currentSrc","videoWidth","videoHeight","ShakaInternalAdapter_1","ShakaInternalAdapter","reject","__awaiter","sent","sendError","error_1","category","severity","getMediaElement","SHAKA","onUnloading","videoElement","onStateChangeEventListener_1","getAssetUri","activeVideoTrack","getVariantTracks","track","active","videoBandwidth","bandwidth","VideojsInternalAdapter_1","VideojsInternalAdapter","VideoJsAnalyticsStateMachine_1","SubtitleInfo_1","_subtitleInfo","previousTime","videojs","VIDEOJS","VideojsAnalyticsStateMachine","currentType","selectedAudioLanguage","getSelectedAudioTrackLanguage","codecInfo","getCodecInfo","tech","IWillNotUseThisInPlugins","getSubtitleInfo","seeking","newSubtitleInfo","hasInfoChanged","isDifferentSubtitleInfo","newSelectedAudioLanguage","vhs","mediaAttributes","getMediaAttributes","textTracks_1","sourceHandler","playlists","selectedPlaylist","attributes","BANDWIDTH","RESOLUTION","codecs","CODECS","isVideoCodec","isAudioCodec","AUDIOTRACK_CHANGED_PLAYING","SUBTITLE_CHANGED_PLAYING","FINISH_AUDIOTRACK_CHANGING","FINISH_SUBTITLE_CHANGING","videoCodecs","audioCodecs","info1","info2"],"mappings":"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","file":"bitmovinanalytics.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"analytics\"] = factory();\n\telse\n\t\troot[\"bitmovin\"] = root[\"bitmovin\"] || {}, root[\"bitmovin\"][\"analytics\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/Users/ineskulenovic/Desktop/Bitmovin/bitmovin-analytics-collector/build/release\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 28);\n","/* tslint:disable:no-console */\nclass Logger {\n constructor(showLogs: boolean = false) {\n (this as any).showLogs = showLogs;\n }\n\n public setLogging(logging: boolean) {\n (this as any).showLogs = logging;\n }\n\n public isLogging() {\n return (this as any).showLogs;\n }\n\n public log(msg: string, ...optionalParamters: any[]) {\n if (!(this as any).showLogs) {\n return;\n }\n\n console.log(msg, ...optionalParamters);\n }\n\n public logTable(fields: any[]) {\n console.table(fields);\n }\n\n public errorMessageToUser(msg: string, ...optionalParamters: any[]) {\n console.error(msg, ...optionalParamters);\n }\n\n public error(msg: string | undefined, ...optionalParamters: any[]) {\n if (!(this as any).showLogs) {\n return;\n }\n\n console.error(msg, ...optionalParamters);\n }\n\n public warning(msg: string) {\n if (!(this as any).showLogs) {\n return;\n }\n\n console.warn(msg);\n }\n\n public warningMessageToUser(msg: string, ...optionalParameters: any[]) {\n console.warn(msg, ...optionalParameters);\n }\n}\n\nexport const padRight = (str: string | undefined, length: number) => {\n const padStr = new Array(length).join(' ');\n return (str + padStr).slice(0, length);\n};\n\nexport const logger = new Logger();\n","import {PAGE_LOAD_TYPE} from '../enums/PageLoadType';\nimport * as CustomDataUtils from '../types/CustomDataValues';\nimport {CustomDataValues} from '../types/CustomDataValues';\n\n/* tslint:disable */\nexport const validString = (text: any): boolean => {\n return text != null && typeof text === 'string';\n};\n\nexport const isNullOrEmptyString = (text: any): boolean => {\n return text == null || typeof text != 'string' || text.length === 0;\n};\n\nexport const validBoolean = (bool: any): boolean => {\n return bool != null && typeof bool === 'boolean';\n};\n\nexport const validNumber = (num: any): boolean => {\n return num != null && typeof num === 'number';\n};\n\nexport const sanitizePath = (path: string): string => {\n return path.replace(/\\/$/g, '');\n};\n/* tslint:enable */\n\nexport const calculateTimeWithUndefined = (time?: number): number | undefined => {\n if (time === undefined) {\n return time;\n }\n time = time * 1000;\n return Math.round(time);\n};\n\nexport const calculateTime = (time: number): number => {\n time = time * 1000;\n return Math.round(time);\n};\n\n/**\n * Return the current time in milliseconds.\n */\nexport const getCurrentTimestamp = (): number => {\n return Date.now();\n};\n\nexport const getDurationFromTimestampToNow = (timestamp: number): number => {\n return getCurrentTimestamp() - timestamp;\n};\n\nexport const generateUUID = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n // tslint:disable-next-line\n const r = (Math.random() * 16) | 0;\n // tslint:disable-next-line\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\nexport const getCookie = (cname: string): string => {\n const name = cname + '=';\n const ca = document.cookie.split(';');\n for (let c of ca) {\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n return c.substring(name.length, c.length);\n }\n }\n return '';\n};\n\nexport const noOp = () => {};\n\nexport const getCustomDataString = (customData: any): string | undefined => {\n if (typeof customData === 'object') {\n return JSON.stringify(customData);\n } else if (typeof customData === 'function') {\n return getCustomDataString(customData());\n } else if (typeof customData === 'undefined') {\n return customData;\n } else if (typeof customData !== 'string') {\n return String(customData);\n }\n\n return customData;\n};\n\nexport const transferCustomDataFields = (fromConfig: CustomDataValues, toConfig: CustomDataValues) => {\n for (let i = 1; i <= CustomDataUtils.customDataFieldCount; i++) {\n const customDataField = `customData${i}`;\n toConfig[customDataField] = getCustomDataString(fromConfig[customDataField]);\n }\n};\n\nexport const getDocumentPropWithPrefix = (prop: string): string | undefined => {\n const prefixes = ['webkit', 'moz', 'ms', 'o'];\n if (prop in document) {\n return prop;\n }\n\n const pascalCase = prop.charAt(0).toUpperCase() + prop.slice(1);\n for (const prefix of prefixes) {\n if (prefix + pascalCase in document) {\n return prefix + pascalCase;\n }\n }\n return undefined;\n};\n\nexport const isVideoInFullscreen = () => {\n const fullscreenProp = getDocumentPropWithPrefix('fullscreenElement');\n return fullscreenProp !== undefined && document[fullscreenProp] && document[fullscreenProp].nodeName === 'VIDEO';\n};\n\nexport const getHiddenProp = (): string | undefined => {\n return getDocumentPropWithPrefix('hidden');\n};\n\nexport function getPageLoadType(): PAGE_LOAD_TYPE {\n const hiddenProp = getHiddenProp();\n if (hiddenProp != null && document[hiddenProp] === true) {\n return PAGE_LOAD_TYPE.BACKGROUND;\n }\n return PAGE_LOAD_TYPE.FOREGROUND;\n}\n\nexport const getHostnameAndPathFromUrl = (url: string) => {\n const domElement = document.createElement('a');\n domElement.href = url;\n\n return {hostname: domElement.hostname, path: domElement.pathname};\n};\n\nexport const calculatePercentage = (numerator?: number, denominator?: number): number | undefined => {\n if (denominator === undefined || denominator === 0) {\n return undefined;\n }\n return Math.round(((numerator || 0) / denominator) * 100);\n};\n\n/* tslint:disable */\nexport const getBrowserInfo = () => {\n var ua = navigator.userAgent,\n tem,\n M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n return {name: 'IE', version: tem[1] || ''};\n }\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem != null) return {name: tem[1].replace('OPR', 'Opera'), version: tem[2]};\n }\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) M.splice(1, 1, tem[1]);\n return {name: M[0], version: M[1]};\n};\n/* tslint:enable */\n\nexport const getURLResourceName = (url: string): string => {\n if (url.length === 0) {\n return '';\n }\n return url.split('/').pop() || '';\n};\n\nexport const joinUrls = (...args: string[]): string => {\n return args.reduce((prev, current) => {\n const prevUrlValue = endsWith(prev, '/') && current !== undefined ? prev.substr(0, prev.length - 1) : prev;\n const nextUrlValue = startsWith(current, '/') ? current.substr(1) : current;\n return prevUrlValue + '/' + nextUrlValue;\n });\n};\n\nexport const endsWith = (str: string, suffix: string): boolean => {\n if (String.prototype.endsWith != null) {\n return str.endsWith(suffix);\n }\n\n return str.substring(str.length - suffix.length) === suffix;\n};\n\nexport const startsWith = (str: string, prefix: string): boolean => {\n if (String.prototype.startsWith != null) {\n return str.startsWith(prefix);\n }\n return str.substring(0, prefix.length) === prefix;\n};\n","import {\n AnalyticsEventBase,\n AudioChangeEvent,\n ErrorEvent,\n SourceChangeEvent,\n VideoChangeEvent,\n} from '../types/EventData';\n\nexport enum Event {\n SETUP = 'setup',\n READY = 'ready',\n SOURCE_LOADED = 'sourceLoaded',\n PLAY = 'play',\n PLAYING = 'playing',\n PAUSE = 'pause',\n TIMECHANGED = 'timechanged',\n SEEK = 'seek',\n SEEKED = 'seeked',\n START_CAST = 'startCasting',\n END_CAST = 'endCasting',\n START_BUFFERING = 'startBuffering',\n END_BUFFERING = 'endBuffering',\n AUDIOTRACK_CHANGED = 'audioTrackChanged',\n AUDIO_CHANGE = 'audioChange',\n VIDEO_CHANGE = 'videoChange',\n START_FULLSCREEN = 'startFullscreen',\n END_FULLSCREEN = 'endFullscreen',\n START_AD = 'adStart',\n SUBTITLE_CHANGE = 'subtitleChange',\n END_AD = 'adEnd',\n MUTE = 'mute',\n UN_MUTE = 'unMute',\n ERROR = 'playerError',\n PLAYBACK_FINISHED = 'end',\n SCREEN_RESIZE = 'resize',\n UNLOAD = 'unload',\n END = 'end',\n SOURCE_UNLOADED = 'sourceUnloaded',\n MANUAL_SOURCE_CHANGE = 'manualSourceChangeInitiated',\n VIDEOSTART_TIMEOUT = 'VIDEOSTART_TIMEOUT',\n CUSTOM_DATA_CHANGE = 'customDataChange',\n PLAYLIST_TRANSITION = 'playlistTransition',\n}\n\nexport interface EventMap {\n [Event.SETUP]: AnalyticsEventBase;\n [Event.READY]: AnalyticsEventBase;\n [Event.SOURCE_LOADED]: AnalyticsEventBase;\n [Event.PLAY]: AnalyticsEventBase;\n [Event.PLAYING]: AnalyticsEventBase;\n [Event.PAUSE]: AnalyticsEventBase;\n [Event.TIMECHANGED]: AnalyticsEventBase;\n [Event.SEEK]: AnalyticsEventBase;\n [Event.SEEKED]: AnalyticsEventBase;\n [Event.START_CAST]: AnalyticsEventBase;\n [Event.END_CAST]: AnalyticsEventBase;\n [Event.START_BUFFERING]: AnalyticsEventBase;\n [Event.END_BUFFERING]: AnalyticsEventBase;\n [Event.AUDIOTRACK_CHANGED]: AnalyticsEventBase;\n [Event.AUDIO_CHANGE]: AudioChangeEvent;\n [Event.VIDEO_CHANGE]: VideoChangeEvent;\n [Event.START_FULLSCREEN]: AnalyticsEventBase;\n [Event.END_FULLSCREEN]: AnalyticsEventBase;\n [Event.START_AD]: AnalyticsEventBase;\n [Event.SUBTITLE_CHANGE]: AnalyticsEventBase;\n [Event.END_AD]: AnalyticsEventBase;\n [Event.MUTE]: AnalyticsEventBase;\n [Event.UN_MUTE]: AnalyticsEventBase;\n [Event.ERROR]: ErrorEvent;\n [Event.PLAYBACK_FINISHED]: AnalyticsEventBase;\n [Event.SCREEN_RESIZE]: AnalyticsEventBase;\n [Event.UNLOAD]: AnalyticsEventBase;\n [Event.END]: AnalyticsEventBase;\n [Event.SOURCE_UNLOADED]: AnalyticsEventBase;\n [Event.MANUAL_SOURCE_CHANGE]: SourceChangeEvent;\n [Event.VIDEOSTART_TIMEOUT]: AnalyticsEventBase;\n [Event.CUSTOM_DATA_CHANGE]: AnalyticsEventBase;\n [Event.PLAYLIST_TRANSITION]: AnalyticsEventBase;\n}\n","export enum Player {\n BITMOVIN = 'bitmovin',\n JW = 'jw',\n RADIANT = 'radiant',\n VIDEOJS = 'videojs',\n HLSJS = 'hlsjs',\n SHAKA = 'shaka',\n DASHJS = 'dashjs',\n HTML5 = 'html5',\n CHROMECAST_SHAKA = 'chromecast-shaka',\n}\n","import {InternalAdapterAPI} from '../adapters/internal/InternalAdapterAPI';\nimport {ErrorCode} from '../enums/ErrorCode';\nimport {PlayerSize} from '../enums/PlayerSize';\nimport {ErrorDetailTrackingSettingsProvider} from '../features/errordetails/ErrorDetailTracking';\nimport {OnErrorDetailEventObject} from '../features/errordetails/OnErrorDetailEventObject';\nimport {FeatureManager} from '../features/FeatureManager';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {CastClientConfig} from '../types/CastClientConfig';\nimport {CustomDataValues, customDataValuesKeys} from '../types/CustomDataValues';\nimport * as EventData from '../types/EventData';\nimport {FeatureConfigContainer} from '../types/FeatureConfigContainer';\nimport {Sample} from '../types/Sample';\nimport Timespan from '../types/Timespan';\nimport {CodecHelper} from '../utils/CodecHelper';\nimport {logger} from '../utils/Logger';\nimport * as Settings from '../utils/Settings';\nimport * as Utils from '../utils/Utils';\nimport {VERSION} from '../Version';\nimport {AdAnalytics} from './AdAnalytics';\nimport {Backend} from './Backend';\nimport {BackendFactory} from './BackendFactory';\nimport {EventDispatcher, Subscribable} from './EventDispatcher';\nimport {NoOpBackend} from './NoOpBackend';\nimport {SessionPersistenceHandler} from './SessionPersistenceHandler';\n\nexport class Analytics {\n public get version(): string {\n return VERSION;\n }\n public static version: string = VERSION;\n public static LICENSE_CALL_PENDING_TIMEOUT = 200;\n public static PAGE_LOAD_TYPE_TIMEOUT = 200;\n public static CAST_RECEIVER_CONFIG_MESSAGE = 'CAST_RECEIVER_CONFIG_MESSAGE';\n\n public pageLoadTime: number = 0;\n public playerStartupTime: number = 0;\n public videoStartupTime: number = 0;\n public autoplay: boolean | undefined = undefined;\n public sample: Sample;\n public backend!: Backend;\n public errorDetailTrackingSettingsProvider: ErrorDetailTrackingSettingsProvider;\n public get errorDetailSubscribable(): Subscribable<OnErrorDetailEventObject> {\n return this.onErrorDetailEventDispatcher;\n }\n\n private config: AnalyticsConfig;\n private sessionHandler: SessionPersistenceHandler;\n private droppedSampleFrames: number = 0;\n private startupTime: number = 0;\n private adapter!: InternalAdapterAPI;\n private backendFactory: BackendFactory;\n private resetQualityChangeCountIntervalId?: number;\n private featureManager = new FeatureManager<FeatureConfigContainer>();\n private onErrorDetailEventDispatcher = new EventDispatcher<OnErrorDetailEventObject>();\n private adAnalytics: AdAnalytics | undefined;\n\n private authenticationCallback: AuthenticationCallback = {\n authenticationCompleted: (success: boolean, featureConfigs?: FeatureConfigContainer) => {\n this.featureManager.configureFeatures(success, featureConfigs);\n },\n };\n\n constructor(\n config: AnalyticsConfig,\n adapter: InternalAdapterAPI,\n backendFactory: BackendFactory = new BackendFactory()\n ) {\n const that = this;\n this.config = this.buildDefaultAnalyticsConfigValues(config);\n this.errorDetailTrackingSettingsProvider = {\n get domain() {\n return that.getDomain(that.config);\n },\n get licenseKey() {\n return that.config.key ?? '';\n },\n get impressionId() {\n return that.getCurrentImpressionId() ?? '';\n },\n get collectorConfig() {\n return that.config.config;\n },\n };\n\n this.adapter = adapter;\n this.backendFactory = backendFactory;\n this.sessionHandler = new SessionPersistenceHandler(config);\n\n const licenseKeyReceivedUnsubscriber = this.adapter.onLicenseKeyReceived.subscribe(\n (eventArgs: {licenseKey: string}) => {\n if (!this.config.key) {\n this.config.key = eventArgs.licenseKey;\n }\n licenseKeyReceivedUnsubscriber();\n }\n );\n\n this.sample = this.setupSample();\n this.init();\n this.setupStateMachineCallbacks();\n const features = this.adapter.initialize(this);\n this.featureManager.registerFeatures(features);\n\n if (this.adapter.adModule) {\n this.adAnalytics = new AdAnalytics(this, this.adapter.adModule);\n }\n\n this.checkForErrorsInConfig(config);\n }\n\n public getPlayerInformationFromAdapter() {\n const player = this.config.player || this.adapter.getPlayerName();\n return {\n player,\n version: player + '-' + this.adapter.getPlayerVersion(),\n playerTech: this.adapter.getPlayerTech(),\n };\n }\n\n public updateSamplesToCastClientConfig(samples: Sample[], castClientConfig: CastClientConfig) {\n for (const sample of samples) {\n this.updateSampleToCastClientConfig(sample, castClientConfig);\n }\n }\n\n public updateSampleToCastClientConfig(sample: Sample, castClientConfig: CastClientConfig) {\n const {config, userId, impressionId, domain, path, language, userAgent} = castClientConfig;\n sample.impressionId = impressionId;\n sample.userId = userId;\n sample.userAgent = userAgent;\n sample.domain = domain;\n sample.path = path;\n sample.language = language;\n\n this.setConfigParameters(sample, config);\n }\n\n public init() {\n if (\n this.adapter.supportsDeferredLicenseLoading !== true &&\n (this.config.key === '' || !Utils.validString(this.config.key))\n ) {\n logger.error('Invalid analytics license key provided');\n return;\n }\n\n logger.setLogging((this.config.debug as boolean) || false);\n\n this.featureManager.resetFeatures();\n this.backend = this.createBackend(this.config);\n this.videoStartupTime = 0;\n\n this.setConfigParameters();\n\n this.generateNewImpressionId();\n this.setUserId();\n\n if (this.adapter.videoCompletionTracker) {\n this.adapter.videoCompletionTracker.reset();\n }\n this.clearResetQualityChangeInterval();\n this.adapter.resetQualityChangeCount();\n }\n\n public release() {\n this.backend = new NoOpBackend();\n this.adAnalytics?.release();\n this.clearResetQualityChangeInterval();\n }\n\n public setConfigParameters(sample = this.sample, config = this.config) {\n sample.key = config.key;\n sample.playerKey = config.playerKey;\n if (config.player) {\n sample.player = config.player;\n }\n sample.domain = this.getDomainFromConfig(config) || Utils.sanitizePath(window.location.hostname);\n sample.cdnProvider = config.cdnProvider;\n sample.videoId = config.videoId;\n sample.videoTitle = config.title;\n sample.customUserId = config.userId != null ? config.userId : config.customUserId;\n\n Utils.transferCustomDataFields(config, sample);\n\n sample.experimentName = config.experimentName;\n }\n\n public generateNewImpressionId() {\n this.sample.impressionId = Utils.generateUUID();\n }\n\n public setUserId() {\n this.sample.userId = this.sessionHandler.userId;\n }\n\n public setupStateMachineCallbacks() {\n // All of these are called in the onLeaveState Method.\n // So it's the last sample\n this.adapter.stateMachineCallbacks.setup = (duration: number, state: string) => {\n logger.log(\n 'Setup bitmovin analytics ' + this.sample.analyticsVersion + ' with impressionId: ' + this.sample.impressionId\n );\n\n this.setDuration(duration);\n this.setState(state);\n this.playerStartupTime = this.sample.playerStartupTime = duration;\n\n if (window.performance && window.performance.timing) {\n const loadTime = Utils.getCurrentTimestamp() - window.performance.timing.navigationStart;\n this.pageLoadTime = this.sample.pageLoadTime = loadTime;\n }\n\n this.startupTime = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n\n this.sample.pageLoadTime = 0;\n };\n\n this.adapter.stateMachineCallbacks.startup = (duration: number, state: string) => {\n this.setDuration(duration);\n this.videoStartupTime = this.sample.videoStartupTime = duration;\n this.sample.supportedVideoCodecs = CodecHelper.supportedVideoFormats;\n this.setState(state);\n\n if (this.startupTime > 0) {\n this.startupTime += duration;\n }\n this.sample.startupTime = this.startupTime;\n this.autoplay = this.sample.autoplay = this.adapter.getAutoPlay();\n\n const drmPerformance = this.adapter.getDrmPerformanceInfo();\n if (drmPerformance != null) {\n this.sample.drmType = drmPerformance.drmType;\n this.sample.drmLoadTime = drmPerformance.drmLoadTime;\n }\n\n this.sendAnalyticsRequestAndClearValues();\n this.sample.autoplay = undefined;\n };\n\n this.adapter.stateMachineCallbacks.playing = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n this.sample.played = duration;\n this.setCompletionValues();\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.unload = (duration: number, state: string) => {\n let videoStartForClosedState = this.sample.videoTimeStart;\n if (state === 'playing') {\n this.setDuration(duration);\n this.setState(state);\n this.sample.played = duration;\n this.setCompletionValues();\n this.sendUnloadRequest();\n if (Utils.validNumber(this.sample.videoTimeEnd)) {\n videoStartForClosedState = this.sample.videoTimeEnd;\n }\n }\n\n if (this.videoStartupTime > 0) {\n this.setVideoTimeStart(videoStartForClosedState);\n this.setVideoTimeEnd(videoStartForClosedState);\n this.clearValues();\n this.setState('closed');\n this.sendUnloadRequest();\n }\n };\n\n this.adapter.stateMachineCallbacks.heartbeat = (\n duration: number,\n state: string,\n sampleData: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>\n ) => {\n this.setState(state);\n this.setDuration(duration);\n\n this.sample = {\n ...this.sample,\n ...sampleData,\n };\n\n if (state === 'playing') {\n this.setCompletionValues();\n }\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.qualitychange = (duration: number, state: string) => {\n this.sendQualityChange(state, duration);\n };\n\n this.adapter.stateMachineCallbacks.qualitychange_pause = (duration: number, state: string) => {\n this.sendQualityChange(state, duration);\n };\n\n this.adapter.stateMachineCallbacks.qualitychange_rebuffering = (duration: number, state: string) => {\n this.sendQualityChange(state, duration);\n };\n\n this.adapter.stateMachineCallbacks.videoChange = (event: any) => {\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent(event);\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.setPlaybackVideoPropertiesFromEvent(event);\n };\n\n this.adapter.stateMachineCallbacks.audioChange = (event: any) => {\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent(event);\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.setPlaybackAudioPropertiesFromEvent(event);\n };\n\n this.adapter.stateMachineCallbacks.audiotrack_changing = () => {\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.pause = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n\n this.sample.paused = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.paused_seeking = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n\n this.sample.seeked = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.end_play_seeking = (duration: number, state: string) => {\n this.setState(state);\n this.setDuration(duration);\n\n this.sample.seeked = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.rebuffering = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n\n this.sample.buffered = duration;\n\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.videoStartFailed = (\n event: Readonly<EventData.VideoStartFailedEvent>,\n sendRequest = true\n ) => {\n this.sample.videoStartFailed = true;\n this.sample.videoStartFailedReason = event.reason.reason;\n if (event.reason.errorCode != null) {\n this.sample.errorCode = event.reason.errorCode.code;\n this.sample.errorMessage = event.reason.errorCode.message;\n if (sendRequest) {\n this.onErrorDetailEventDispatcher.dispatch({\n ...event.reason.errorCode,\n });\n }\n }\n if (sendRequest) {\n this.sendAnalyticsRequestAndClearValues();\n }\n };\n\n this.adapter.stateMachineCallbacks.error = (event: Readonly<EventData.ErrorEvent>) => {\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent(event);\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n\n this.setState('error');\n this.sample.errorCode = event.code;\n this.sample.errorMessage = event.message;\n this.sample.errorData = JSON.stringify(event.legacyData);\n\n const segmentNames = this.adapter.segments.map((s) => s.name);\n this.sample.errorSegments = segmentNames;\n\n if (this.adapter.onError) {\n this.adapter.onError();\n }\n\n this.onErrorDetailEventDispatcher.dispatch({\n code: event.code,\n message: event.message,\n errorData: event.data,\n });\n this.sendAnalyticsRequestAndClearValues();\n\n delete this.sample.errorCode;\n delete this.sample.errorMessage;\n delete this.sample.errorData;\n };\n\n this.adapter.stateMachineCallbacks.ad = (duration: number, state: string) => {\n this.setDuration(duration);\n this.setState(state);\n this.sample.ad = duration;\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.mute = () => {\n this.sample.isMuted = true;\n };\n\n this.adapter.stateMachineCallbacks.unMute = () => {\n this.sample.isMuted = false;\n };\n\n this.adapter.stateMachineCallbacks.subtitle_changing = () => {\n this.sendAnalyticsRequestAndClearValues();\n };\n\n this.adapter.stateMachineCallbacks.setVideoTimeEndFromEvent = (event: any) => {\n if (Utils.validNumber(event.currentTime)) {\n this.setVideoTimeEnd(Utils.calculateTime(event.currentTime));\n }\n };\n\n this.adapter.stateMachineCallbacks.setVideoTimeStartFromEvent = (event: any) => {\n if (Utils.validNumber(event.currentTime)) {\n this.setVideoTimeStart(Utils.calculateTime(event.currentTime));\n }\n };\n\n this.adapter.stateMachineCallbacks.manualSourceChange = (event: {config: AnalyticsConfig}) => {\n this.adapter.resetSourceRelatedState();\n this.sample = this.setupSample();\n this.startupTime = 0;\n this.config = Object.keys(event.config).length > 0 ? event.config : this.config;\n this.init();\n };\n\n this.adapter.stateMachineCallbacks.playlistTransition = (event: EventData.AnalyticsEventBase) => {\n this.sample = this.setupSample();\n this.startupTime = 0;\n // init is needed because of resetting sequence number which\n // is done inside SequenceNumberBackend\n this.init();\n };\n\n this.adapter.stateMachineCallbacks.initialSourceChange = (event: {config: AnalyticsConfig}) => {\n this.config = event.config;\n this.setConfigParameters();\n };\n\n // The video has ended and we set up for a new impression\n this.adapter.stateMachineCallbacks.end = () => {\n this.sample = this.setupSample();\n this.startupTime = 0;\n this.init();\n };\n\n this.adapter.stateMachineCallbacks.release = () => {\n this.release();\n };\n\n this.adapter.stateMachineCallbacks.customdatachange = (\n duration?: number,\n state?: string,\n event?: {values: CustomDataValues}\n ) => {\n if (event && event.values) {\n this.changeCustomData(event.values);\n }\n };\n }\n\n public guardAgainstMissingVideoTitle = (oldConfig: AnalyticsConfig, newConfig: AnalyticsConfig) => {\n if (oldConfig && newConfig && oldConfig.title && !newConfig.title) {\n // TODO: Better description\n logger.error('The new analytics configuration does not contain the field title');\n }\n };\n\n public guardAgainstMissingIsLive = (oldConfig: AnalyticsConfig, newConfig: AnalyticsConfig) => {\n if (oldConfig != null && newConfig != null && oldConfig.isLive && newConfig.isLive == null) {\n logger.error(\n 'The new analytics configuration does not contain the field `isLive`. It will default to `false` which might be unintended? Once stream playback information is available the type will be populated.'\n );\n }\n };\n\n public sourceChange = (config: AnalyticsConfig) => {\n logger.log('Processing Source Change for Analytics', config);\n\n this.guardAgainstMissingVideoTitle(this.config, config);\n this.guardAgainstMissingIsLive(this.config, config);\n\n const newConfig = this.getMergedAnalyticsConfig(config);\n\n this.adapter.sourceChange(newConfig, Utils.getCurrentTimestamp());\n };\n\n public setCustomDataOnce = (values: CustomDataValues) => {\n const oldConfig = {...this.config};\n this.setState('customdatachange');\n this.changeCustomData(values);\n this.sendAnalyticsRequestAndClearValues();\n // this method doesn't call changeCustomData() second time because in that method we have check for null values\n // to prevent overriding existing customData values with null if some field in object doesn't have value\n // because of that if some customData field had previous value null and it got changed to something else\n // it will not be possible to return it back to null using that method\n this.config = {...oldConfig};\n this.setConfigParameters();\n };\n\n public setCustomData = (values: CustomDataValues) => {\n this.adapter.setCustomData(values);\n };\n\n public getCurrentImpressionId = (): string | undefined => {\n return this.sample.impressionId;\n };\n\n public getUserId = (): string => {\n return this.sessionHandler.userId;\n };\n\n public setDuration(duration: number) {\n this.sample.duration = duration;\n }\n\n public setState(state: string) {\n this.sample.state = state;\n }\n\n public setPlaybackVideoPropertiesFromEvent(event: any) {\n if (Utils.validNumber(event.width)) {\n this.sample.videoPlaybackWidth = event.width;\n }\n if (Utils.validNumber(event.height)) {\n this.sample.videoPlaybackHeight = event.height;\n }\n if (Utils.validNumber(event.bitrate)) {\n this.sample.videoBitrate = event.bitrate;\n }\n if (Utils.validString(event.codec)) {\n this.sample.videoCodec = event.codec;\n }\n }\n\n public setPlaybackAudioPropertiesFromEvent(event: any) {\n if (Utils.validNumber(event.bitrate)) {\n this.sample.audioBitrate = event.bitrate;\n }\n if (Utils.validString(event.codec)) {\n this.sample.audioCodec = event.codec;\n }\n }\n\n public setPlaybackInfoFromAdapter() {\n const info = this.adapter.getCurrentPlaybackInfo();\n if (!info) {\n return;\n }\n\n this.sample.isLive = this.getIsLiveFromConfigOrPlaybackInfo(this.config, info.isLive);\n\n if (Utils.validString(info.size)) {\n this.sample.size = info.size;\n }\n if (Utils.validString(info.playerTech)) {\n this.sample.playerTech = info.playerTech;\n }\n if (Utils.validNumber(info.videoDuration)) {\n this.sample.videoDuration = Utils.calculateTime(info.videoDuration || 0);\n }\n if (Utils.validString(info.streamFormat)) {\n this.sample.streamFormat = info.streamFormat;\n }\n if (Utils.validString(info.mpdUrl)) {\n this.sample.mpdUrl = info.mpdUrl;\n }\n if (Utils.validString(info.m3u8Url)) {\n this.sample.m3u8Url = info.m3u8Url;\n }\n if (Utils.validString(info.progUrl)) {\n this.sample.progUrl = info.progUrl;\n }\n if (Utils.validNumber(info.videoWindowWidth)) {\n this.sample.videoWindowWidth = info.videoWindowWidth;\n }\n if (Utils.validNumber(info.videoWindowHeight)) {\n this.sample.videoWindowHeight = info.videoWindowHeight;\n }\n if (Utils.validNumber(info.screenHeight)) {\n this.sample.screenHeight = info.screenHeight;\n }\n if (Utils.validNumber(info.screenWidth)) {\n this.sample.screenWidth = info.screenWidth;\n }\n if (Utils.validNumber(info.videoPlaybackHeight)) {\n this.sample.videoPlaybackHeight = info.videoPlaybackHeight;\n }\n if (Utils.validNumber(info.videoPlaybackWidth)) {\n this.sample.videoPlaybackWidth = info.videoPlaybackWidth;\n }\n if (Utils.validNumber(info.videoBitrate)) {\n this.sample.videoBitrate = info.videoBitrate;\n }\n if (Utils.validNumber(info.audioBitrate)) {\n this.sample.audioBitrate = info.audioBitrate;\n }\n if (Utils.validBoolean(info.isMuted)) {\n this.sample.isMuted = info.isMuted;\n }\n if (Utils.validBoolean(info.isCasting)) {\n this.sample.isCasting = info.isCasting;\n }\n if (Utils.validString(info.castTech)) {\n this.sample.castTech = info.castTech;\n }\n if (Utils.validString(info.videoTitle) && !this.config.title) {\n this.sample.videoTitle = info.videoTitle;\n }\n if (Utils.validString(info.audioCodec)) {\n this.sample.audioCodec = info.audioCodec;\n }\n if (Utils.validString(info.videoCodec)) {\n this.sample.videoCodec = info.videoCodec;\n }\n if (Utils.validString(info.audioLanguage)) {\n this.sample.audioLanguage = info.audioLanguage;\n }\n if (Utils.validBoolean(info.subtitleEnabled)) {\n this.sample.subtitleEnabled = info.subtitleEnabled;\n }\n if (Utils.validString(info.subtitleLanguage)) {\n this.sample.subtitleLanguage = info.subtitleLanguage;\n } else {\n this.sample.subtitleLanguage = undefined;\n }\n if (Utils.validNumber(info.droppedFrames)) {\n this.sample.droppedFrames = Math.max(info.droppedFrames - this.droppedSampleFrames, 0);\n this.droppedSampleFrames = info.droppedFrames;\n }\n }\n\n public setupSample(): Sample {\n this.droppedSampleFrames = 0;\n\n return {\n platform: 'web',\n playerStartupTime: 0,\n pageLoadType: Utils.getPageLoadType(),\n path: Utils.sanitizePath(window.location.pathname),\n language: navigator.language || (navigator as any).userLanguage,\n userAgent: navigator.userAgent,\n screenWidth: screen.width,\n screenHeight: screen.height,\n isLive: false,\n videoDuration: 0,\n size: PlayerSize.Window,\n time: 0,\n videoWindowWidth: 0,\n videoWindowHeight: 0,\n droppedFrames: 0,\n played: 0,\n buffered: 0,\n paused: 0,\n ad: 0,\n seeked: 0,\n videoPlaybackWidth: 0,\n videoPlaybackHeight: 0,\n videoBitrate: 0,\n audioBitrate: 0,\n videoTimeStart: 0,\n videoTimeEnd: 0,\n videoStartupTime: 0,\n duration: 0,\n startupTime: 0,\n analyticsVersion: VERSION,\n pageLoadTime: 0,\n completedTotal: 0,\n ...this.getPlayerInformationFromAdapter(),\n };\n }\n\n public sendAnalyticsRequest() {\n this.setPlaybackInfoFromAdapter();\n this.sample.time = Utils.getCurrentTimestamp();\n this.sample.downloadSpeedInfo = this.adapter.downloadSpeedInfo;\n\n const copySample = {...this.sample};\n this.backend.sendRequest(copySample);\n }\n\n public sendAnalyticsRequestAndClearValues() {\n this.sendAnalyticsRequest();\n this.clearValues();\n }\n\n public sendUnloadRequest() {\n this.backend.sendUnloadRequest(this.sample);\n }\n\n public sendAnalyticsRequestSynchronous() {\n this.backend.sendRequestSynchronous(this.sample);\n }\n\n public clearValues() {\n this.sample.ad = 0;\n this.sample.paused = 0;\n this.sample.played = 0;\n this.sample.seeked = 0;\n this.sample.buffered = 0;\n\n this.sample.playerStartupTime = 0;\n this.sample.videoStartupTime = 0;\n this.sample.startupTime = 0;\n this.sample.castTech = undefined;\n\n this.sample.duration = 0;\n this.sample.droppedFrames = 0;\n\n this.sample.drmLoadTime = undefined;\n\n this.sample.videoStartFailed = undefined;\n this.sample.videoStartFailedReason = undefined;\n\n this.sample.completed = undefined;\n this.adapter.clearValues();\n }\n\n public getIsLiveFromConfigOrPlaybackInfo(config: AnalyticsConfig, isLiveFromPlayback?: boolean): boolean {\n if (isLiveFromPlayback == null) {\n return config.isLive || false;\n }\n return Utils.validBoolean(isLiveFromPlayback) ? isLiveFromPlayback : false;\n }\n\n public getMergedCollectorConfig(newConfig: AnalyticsConfig, oldConfig = this.config) {\n let mergedCollectorConfig = (oldConfig || {}).config;\n if (newConfig != null) {\n mergedCollectorConfig = {...mergedCollectorConfig, enabled: true, ...newConfig.config};\n }\n return mergedCollectorConfig;\n }\n\n public getMergedAnalyticsConfig(newConfig: AnalyticsConfig, oldConfig = this.config): AnalyticsConfig {\n const mergedCollectorConfig = this.getMergedCollectorConfig(newConfig, oldConfig);\n const mergedConfig = {\n ...oldConfig,\n ...newConfig,\n ...{config: mergedCollectorConfig},\n };\n return mergedConfig;\n }\n\n /**\n * This method sanitizes the input and updates the analytics config.\n * @param values Object containing the customData and other fields\n */\n private changeCustomData = (values: CustomDataValues) => {\n const filterValuesFromHash = (input: CustomDataValues) => {\n const retVal: CustomDataValues = {};\n customDataValuesKeys.forEach((key) => {\n if (input[key]) {\n retVal[key] = input[key];\n }\n });\n return retVal;\n };\n\n this.config = {\n ...this.config,\n ...filterValuesFromHash(values),\n };\n this.setConfigParameters();\n };\n\n private buildDefaultAnalyticsConfigValues(config: AnalyticsConfig): AnalyticsConfig {\n if (!Utils.validBoolean(config.isLive)) {\n config.isLive = false;\n }\n return config;\n }\n\n private checkForErrorsInConfig(config: AnalyticsConfig) {\n if (config.customUserId != null && config.userId != null) {\n logger.warning(\n 'Configuration Warning: \\nCustomUserId and UserId are set in the config \\nValue of UserId will be used in sample \\nPlease only use one configuartion field to set your userId'\n );\n }\n }\n\n private getDomainFromConfig(config: AnalyticsConfig) {\n const collectorConfig = config.config;\n return collectorConfig != null && collectorConfig.origin != null ? collectorConfig.origin : undefined;\n }\n\n private createBackend(config: AnalyticsConfig): Backend {\n const domain = this.getDomain(config);\n return this.backendFactory.createBackend(\n config,\n {key: config.key, domain, version: VERSION},\n this.adapter,\n this.authenticationCallback\n );\n }\n\n private getDomain(config: AnalyticsConfig) {\n const domainFromConfig = this.getDomainFromConfig(config);\n return domainFromConfig || Utils.sanitizePath(window.location.hostname);\n }\n\n private setCompletionValues() {\n if (this.adapter.videoCompletionTracker) {\n const completed = this.adapter.videoCompletionTracker.addWatched({\n start: this.sample.videoTimeStart,\n end: this.sample.videoTimeEnd,\n } as Timespan);\n const completedTotal = this.adapter.videoCompletionTracker.getCompletionPercentage();\n\n if (!Number.isNaN(completed) && !Number.isNaN(completedTotal)) {\n this.sample.completed = completed;\n this.sample.completedTotal = completedTotal;\n }\n }\n }\n\n private setVideoTimeStart(value: number | undefined) {\n this.sample.videoTimeStart = value;\n }\n\n private setVideoTimeEnd(value: number | undefined) {\n this.sample.videoTimeEnd = value;\n }\n\n private sendQualityChange(state: string, duration: number): void {\n if (this.resetQualityChangeCountIntervalId == null) {\n this.resetQualityChangeCountIntervalId = window.setInterval(() => {\n this.adapter.resetQualityChangeCount();\n }, Settings.ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL);\n }\n\n this.adapter.increaseQualityChangeCount();\n if (!this.adapter.isQualityChangeEventEnabled()) {\n this.setDuration(duration);\n this.adapter.stateMachineCallbacks.error({\n ...ErrorCode.QUALITY_CHANGE_THRESHOLD_EXCEEDED,\n legacyData: undefined,\n currentTime: undefined,\n data: {\n /*TODO additionalData: 'Add description for this error'*/\n },\n });\n } else {\n this.setDuration(duration);\n this.setState(state);\n this.sendAnalyticsRequestAndClearValues();\n }\n }\n\n private clearResetQualityChangeInterval() {\n if (this.resetQualityChangeCountIntervalId != null) {\n window.clearInterval(this.resetQualityChangeCountIntervalId);\n delete this.resetQualityChangeCountIntervalId;\n }\n }\n}\n","import {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {CustomDataValues} from '../types/CustomDataValues';\nimport {logger} from '../utils/Logger';\nimport {InternalAdapterAPI} from './internal/InternalAdapterAPI';\n\nexport abstract class Adapter {\n protected analytics!: Analytics;\n protected internalAdapter!: InternalAdapterAPI;\n\n public getCurrentImpressionId(): string | undefined {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n return this.analytics.getCurrentImpressionId();\n }\n\n public getUserId(): string | undefined {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return undefined;\n }\n return this.analytics.getUserId();\n }\n\n public setCustomData(values: CustomDataValues) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.internalAdapter.setCustomData(values);\n }\n\n public setCustomDataOnce(values: CustomDataValues) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.analytics.setCustomDataOnce(values);\n }\n\n public sourceChange(config: AnalyticsConfig) {\n if (!this.guardAgainstNotInitializedAnalytics()) {\n return;\n }\n this.analytics.sourceChange(config);\n }\n\n // Checks if analytics is already initialized on this player instance\n protected hasPlayerAlreadyBeenAugmented(player): boolean {\n return (player as any).__bitmovinAnalyticsHasBeenSetup;\n }\n // Marks the player instance as already instrumented by analytics\n protected markPlayerInstanceAsAugmented(player) {\n (player as any).__bitmovinAnalyticsHasBeenSetup = true;\n }\n\n private guardAgainstNotInitializedAnalytics(): boolean {\n if (!this.analytics) {\n logger.log(\"Bitmovin Analytics: Adapter hasn't been initialized yet\");\n return false;\n }\n return true;\n }\n}\n","export const MESSAGE_NAMESPACE = 'urn:x-cast:com.bitmovin.analytics.cast';\nexport const ANALYTICS_BACKEND_BASE_URL = 'https://analytics-ingress-global.bitmovin.com';\n\nexport const ANALYTICS_LICENSECALL_TIMEOUT = 1000 * 60;\nexport const ANALYTICS_VIDEOSTART_TIMEOUT = 1000 * 60; // in milliseconds\n\nexport const ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD = 50;\nexport const ANALYTICS_QUALITY_CHANGE_COUNT_RESET_INTERVAL = 60 * 60 * 1000;\n\n/**\n * Time (in milliseconds) of consecutive buffering until a REBUFFER_TIMEOUT_ERROR is raised.\n */\nexport const ANALYTICS_REBUFFER_TIMEOUT = 1000 * 60 * 2;\n\n/**\n * minimal time (in seconds) a seek event should have in order to be recogniced as seek\n */\nexport const ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD = 3;\n","import {CollectorConfig} from '../../types/AnalyticsConfig';\nimport {post} from '../../utils/Http';\nimport {ANALYTICS_BACKEND_BASE_URL} from '../../utils/Settings';\nimport {joinUrls} from '../../utils/Utils';\nimport {HttpRequest} from '../httprequesttracking/HttpRequest';\nimport {ErrorData} from './ErrorData';\nimport {ErrorDetail} from './ErrorDetail';\n\nexport class ErrorDetailBackend {\n public get queue(): ReadonlyArray<ErrorDetail> {\n return this._queue;\n }\n\n public get enabled(): boolean {\n return this._enabled;\n }\n\n public set enabled(value: boolean) {\n this._enabled = value;\n }\n\n public static copyErrorDetailTruncateStringsAndUrls(\n errorDetail: ErrorDetail,\n maxStringLength: number,\n maxUrlLength: number\n ): ErrorDetail {\n return {\n ...errorDetail,\n message: errorDetail.message?.substr(0, maxStringLength),\n data: this.copyErrorDataTruncateStrings(errorDetail.data, maxStringLength),\n httpRequests: errorDetail.httpRequests?.map((request) => this.copyHttpRequestTruncateUrls(request, maxUrlLength)),\n };\n }\n\n public static copyHttpRequestTruncateUrls(httpRequest: HttpRequest, maxLength: number): HttpRequest {\n return {\n ...httpRequest,\n url: httpRequest.url?.substr(0, maxLength),\n lastRedirectLocation: httpRequest.lastRedirectLocation?.substr(0, maxLength),\n };\n }\n\n public static copyErrorDataTruncateStrings(errorData: ErrorData, maxStringLength: number): ErrorData {\n return {\n ...errorData,\n exceptionMessage: errorData.exceptionMessage?.substr(0, maxStringLength),\n additionalData: errorData.additionalData?.substr(0, maxStringLength),\n };\n }\n\n public static copyErrorDetailTruncateHttpRequests(errorDetail: ErrorDetail, maxRequests: number): ErrorDetail {\n return {\n ...errorDetail,\n httpRequests: errorDetail.httpRequests?.slice(-maxRequests),\n };\n }\n\n private static MAX_URL_LENGTH = 200;\n private static MAX_STRING_LENGTH = 400;\n\n private readonly backendUrl: string;\n private readonly _queue: ErrorDetail[] = [];\n private _enabled: boolean = false;\n\n constructor(collectorConfig: CollectorConfig | undefined) {\n this.backendUrl = joinUrls(collectorConfig?.backendUrl ?? ANALYTICS_BACKEND_BASE_URL, '/analytics/error');\n }\n\n public limitHttpRequestsOfQueuedErrorDetails(max: number) {\n this._queue.forEach((value, index) => {\n this._queue[index] = ErrorDetailBackend.copyErrorDetailTruncateHttpRequests(value, max);\n });\n }\n\n public send(errorDetail: ErrorDetail) {\n const errorDetailCopy = ErrorDetailBackend.copyErrorDetailTruncateStringsAndUrls(\n errorDetail,\n ErrorDetailBackend.MAX_STRING_LENGTH,\n ErrorDetailBackend.MAX_URL_LENGTH\n );\n if (this.enabled) {\n post(this.backendUrl, errorDetailCopy, () => {});\n } else {\n this._queue.push(errorDetailCopy);\n }\n }\n\n public flush() {\n const copy = [...this._queue];\n let element = copy.shift();\n while (element != null) {\n this.removeFromQueue(element);\n this.send(element);\n element = copy.shift();\n }\n }\n\n public clear() {\n this._queue.splice(0, this._queue.length);\n }\n\n private removeFromQueue(element: ErrorDetail) {\n const index = this._queue.findIndex((value) => value === element);\n if (index >= 0) {\n this._queue.splice(index, 1);\n }\n }\n}\n","import {Subscribable} from '../../core/EventDispatcher';\nimport {CollectorConfig} from '../../types/AnalyticsConfig';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {logger} from '../../utils/Logger';\nimport {getCurrentTimestamp} from '../../utils/Utils';\nimport {VERSION} from '../../Version';\nimport {Feature} from '../Feature';\nimport {HttpRequestTracking} from '../httprequesttracking/HttpRequestTracking';\nimport {ErrorDetail} from './ErrorDetail';\nimport {ErrorDetailBackend} from './ErrorDetailBackend';\nimport {ErrorDetailTrackingConfig} from './ErrorDetailTrackingConfig';\nimport {OnErrorDetailEventObject} from './OnErrorDetailEventObject';\n\nexport interface ErrorDetailTrackingSettingsProvider {\n readonly licenseKey: string;\n readonly domain: string;\n readonly impressionId: string;\n readonly collectorConfig?: CollectorConfig;\n}\n\nexport class ErrorDetailTracking extends Feature<FeatureConfigContainer, ErrorDetailTrackingConfig> {\n private errorIndex = 0;\n\n constructor(\n private settingsProvider: ErrorDetailTrackingSettingsProvider,\n private backend: ErrorDetailBackend,\n private subscribables: Array<Subscribable<OnErrorDetailEventObject>>,\n private httpRequestTracking: HttpRequestTracking | undefined\n ) {\n super();\n subscribables.forEach((subscribable) => subscribable.subscribe(this.onErrorHandler));\n }\n\n public reset(): void {\n this.httpRequestTracking?.reset();\n this.errorIndex = 0;\n }\n\n public enabled(): void {\n this.backend.enabled = true;\n this.backend.flush();\n }\n\n public disabled(): void {\n this.errorIndex = 0;\n this.httpRequestTracking?.disable();\n this.backend.clear();\n this.subscribables.forEach((subscribable) => subscribable.unsubscribe(this.onErrorHandler));\n }\n\n public configured(authenticated: boolean, config?: ErrorDetailTrackingConfig): void {\n const maxRequests = Math.max(config?.numberOfHttpRequests ?? 0, 0);\n this.httpRequestTracking?.configure(maxRequests);\n this.backend.limitHttpRequestsOfQueuedErrorDetails(maxRequests);\n }\n\n public extractConfig(configContainer: FeatureConfigContainer): ErrorDetailTrackingConfig | undefined {\n return configContainer.errorDetails;\n }\n\n private onErrorHandler = (event: OnErrorDetailEventObject) => {\n try {\n if (!this.isEnabled) {\n return;\n }\n\n const httpRequests = this.httpRequestTracking?.httpRequests;\n const httpRequestsCopy = httpRequests == null ? undefined : [...httpRequests];\n const errorIndex = this.errorIndex;\n this.errorIndex++;\n\n const errorDetail: ErrorDetail = {\n platform: 'web',\n licenseKey: this.settingsProvider.licenseKey,\n domain: this.settingsProvider.domain,\n impressionId: this.settingsProvider.impressionId,\n analyticsVersion: VERSION,\n errorId: errorIndex,\n timestamp: getCurrentTimestamp(),\n code: event.code,\n message: event.message,\n data: event.errorData ?? {\n additionalData: undefined,\n exceptionMessage: undefined,\n exceptionStacktrace: undefined,\n },\n httpRequests: httpRequestsCopy,\n };\n\n logger.log(`ErrorDetailTracking.onError: ${JSON.stringify(errorDetail)}`);\n this.backend.send(errorDetail);\n } catch (error) {\n logger.error(`ErrorDetailTracking.onError: Error in handler`, error);\n }\n };\n}\n","import {endsWith} from '../utils/Utils';\n\nconst MP4 = 'video/mp4';\nconst WEBM = 'video/webm';\nconst HLS = 'application/x-mpegURL';\nconst DASH = 'application/dash+xml';\n\n// tslint:disable-next-line:variable-name\nexport const MIMETypes = {\n MP4,\n WEBM,\n HLS,\n DASH,\n};\n\nexport function getMIMETypeFromFileExtension(path: string): string | undefined {\n path = path.split(/[?#]/)[0].toLowerCase();\n\n if (endsWith(path, '.m3u8')) {\n return HLS;\n }\n if (endsWith(path, '.mp4') || endsWith(path, '.m4v') || endsWith(path, '.m4a')) {\n return MP4;\n }\n if (endsWith(path, '.webm')) {\n return WEBM;\n }\n if (endsWith(path, '.mpd')) {\n return DASH;\n }\n}\n","export enum PlayerSize {\n Window = 'WINDOW',\n Fullscreen = 'FULLSCREEN',\n}\n","import {AnalyticsStateMachine} from '../../analyticsStateMachines/AnalyticsStateMachine';\nimport {EventDispatcher} from '../../core/EventDispatcher';\nimport {Event, EventMap} from '../../enums/Event';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {CustomDataValues} from '../../types/CustomDataValues';\nimport {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {NoExtraProperties} from '../../types/NoExtraProperties';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport {defaultStateMachineCallbacks, StateMachineCallbacks} from '../../types/StateMachineCallbacks';\nimport {logger} from '../../utils/Logger';\nimport {ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD} from '../../utils/Settings';\nimport {getCurrentTimestamp} from '../../utils/Utils';\nimport {WindowEventTracker} from '../../utils/WindowEventTracker';\n\n/**\n * Audio volume below this delta is considered zero.\n */\nconst volumeDelta = 0.01;\n\nexport abstract class InternalAdapter {\n public stateMachineCallbacks: StateMachineCallbacks = {...defaultStateMachineCallbacks};\n // tslint:enable:no-unused-expression\n protected stateMachine!: AnalyticsStateMachine;\n\n protected opts: AnalyticsStateMachineOptions;\n protected _onLicenseKeyReceived: EventDispatcher<{licenseKey: string}> = new EventDispatcher();\n protected _onLicenseCallFailed: EventDispatcher<{}> = new EventDispatcher();\n\n protected drmPerformanceInfo: DrmPerformanceInfo | undefined = undefined;\n protected previousVideoBitrate: number = 0;\n protected previousAudioBitrate: number = 0;\n protected qualityChangeCount: number = 0;\n protected abstract get currentTime(): number;\n\n private _windowEventTracker: WindowEventTracker = new WindowEventTracker();\n\n get windowEventTracker(): WindowEventTracker {\n return this._windowEventTracker;\n }\n\n get onLicenseKeyReceived() {\n return this._onLicenseKeyReceived;\n }\n\n get onLicenseCallFailed() {\n return this._onLicenseCallFailed;\n }\n\n get downloadSpeedInfo(): DownloadSpeedInfo {\n return {\n segmentsDownloadCount: 0,\n segmentsDownloadSize: 0,\n segmentsDownloadTime: 0,\n avgDownloadSpeed: 0,\n minDownloadSpeed: 0,\n maxDownloadSpeed: 0,\n avgTimeToFirstByte: 0,\n };\n }\n\n get segments(): SegmentInfo[] {\n return [];\n }\n\n constructor(opts?: AnalyticsStateMachineOptions) {\n if (!opts) {\n opts = {\n starttime: undefined,\n };\n }\n if (!opts.starttime) {\n opts.starttime = getCurrentTimestamp();\n }\n\n this.opts = opts;\n }\n\n public release() {\n this.stateMachine.resetIntervals();\n this.stateMachineCallbacks.release();\n this.resetSourceRelatedState();\n this._windowEventTracker.release();\n }\n\n public eventCallback = <StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>\n ) => {\n eventObject = eventObject || {};\n if (!this.stateMachine) {\n logger.log(\"Bitmovin Analytics: StateMachine isn't ready yet\");\n } else {\n this.stateMachine.callEvent(eventType, eventObject, getCurrentTimestamp());\n }\n };\n\n public getCommonPlaybackInfo() {\n return {\n screenHeight: screen.height,\n screenWidth: screen.width,\n };\n }\n\n public clearValues(): void {\n // noop by default\n }\n\n public clearSegments(): void {\n // noop by default\n }\n\n public increaseQualityChangeCount(): void {\n this.qualityChangeCount++;\n }\n\n public resetQualityChangeCount(): void {\n this.qualityChangeCount = 0;\n }\n\n public resetSourceRelatedState(): void {\n this.drmPerformanceInfo = undefined;\n }\n\n public isQualityChangeEventEnabled(): boolean {\n return this.qualityChangeCount <= ANALYTICS_QUALITY_CHANGE_COUNT_THRESHOLD;\n }\n\n public setCustomData(values: CustomDataValues): void {\n const previousState = this.stateMachine.currentState;\n\n if (\n this.stateMachine.currentState &&\n (this.stateMachine.currentState === 'PAUSE' || this.stateMachine.currentState === 'PLAYING')\n ) {\n this.eventCallback(Event.CUSTOM_DATA_CHANGE, {\n currentTime: this.currentTime,\n });\n this.eventCallback(Event[previousState], {\n values,\n currentTime: this.currentTime,\n });\n } else {\n this.stateMachineCallbacks.customdatachange(undefined, undefined, {values});\n }\n }\n\n protected shouldAllowVideoQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousVideoBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n protected setPreviousVideoBitrate(newBitrate: number): void {\n this.previousVideoBitrate = newBitrate;\n }\n\n protected shouldAllowAudioQualityChange(newBitrate: number | undefined): boolean {\n return (\n newBitrate != null &&\n !isNaN(newBitrate) &&\n this.previousAudioBitrate !== newBitrate &&\n this.isQualityChangeEventEnabled()\n );\n }\n\n protected setPreviousAudioBitrate(newBitrate: number): void {\n this.previousAudioBitrate = newBitrate;\n }\n\n protected isAudioMuted(playerIsMuted: boolean, currentVolume: number): boolean {\n return playerIsMuted || currentVolume < volumeDelta;\n }\n}\n","export class ErrorCode {\n public static BITMOVIN_PLAYER_LICENSING_ERROR = new ErrorCode(1103, '');\n public static SETUP_MISSING_LICENSE_WHITELIST = new ErrorCode(1105, '');\n public static QUALITY_CHANGE_THRESHOLD_EXCEEDED = new ErrorCode(10000, 'ANALYTICS_QUALITY_CHANGE_THRESHOLD_EXCEEDED');\n public static BUFFERING_TIMEOUT_REACHED = new ErrorCode(10001, 'ANALYTICS_BUFFERING_TIMEOUT_REACHED');\n public static VIDEO_STARTUP_TIMEOUT_REACHED = new ErrorCode(10002, 'ANALYTICS_VIDEOSTART_TIMEOUT_REACHED');\n\n private constructor(public readonly code: number, public readonly message: string) {}\n}\n","/*\n\n Javascript State Machine Library - https://github.com/jakesgordon/javascript-state-machine\n\n Copyright (c) 2012, 2013, 2014, 2015, Jake Gordon and contributors\n Released under the MIT license - https://github.com/jakesgordon/javascript-state-machine/blob/master/LICENSE\n\n*/\n\n(function () {\n\n var StateMachine = {\n\n //---------------------------------------------------------------------------\n\n VERSION: \"2.4.0\",\n\n //---------------------------------------------------------------------------\n\n Result: {\n SUCCEEDED: 1, // the event transitioned successfully from one state to another\n NOTRANSITION: 2, // the event was successfull but no state transition was necessary\n CANCELLED: 3, // the event was cancelled by the caller in a beforeEvent callback\n PENDING: 4 // the event is asynchronous and the caller is in control of when the transition occurs\n },\n\n Error: {\n INVALID_TRANSITION: 100, // caller tried to fire an event that was innapropriate in the current state\n PENDING_TRANSITION: 200, // caller tried to fire an event while an async transition was still pending\n INVALID_CALLBACK: 300 // caller provided callback function threw an exception\n },\n\n WILDCARD: '*',\n ASYNC: 'async',\n\n //---------------------------------------------------------------------------\n\n create: function(cfg, target) {\n\n var initial = (typeof cfg.initial == 'string') ? { state: cfg.initial } : cfg.initial; // allow for a simple string, or an object with { state: 'foo', event: 'setup', defer: true|false }\n var terminal = cfg.terminal || cfg['final'];\n var fsm = target || cfg.target || {};\n var events = cfg.events || [];\n var callbacks = cfg.callbacks || {};\n var map = {}; // track state transitions allowed for an event { event: { from: [ to ] } }\n var transitions = {}; // track events allowed from a state { state: [ event ] }\n\n var add = function(e) {\n var from = Array.isArray(e.from) ? e.from : (e.from ? [e.from] : [StateMachine.WILDCARD]); // allow 'wildcard' transition if 'from' is not specified\n map[e.name] = map[e.name] || {};\n for (var n = 0 ; n < from.length ; n++) {\n transitions[from[n]] = transitions[from[n]] || [];\n transitions[from[n]].push(e.name);\n\n map[e.name][from[n]] = e.to || from[n]; // allow no-op transition if 'to' is not specified\n }\n if (e.to)\n transitions[e.to] = transitions[e.to] || [];\n };\n\n if (initial) {\n initial.event = initial.event || 'startup';\n add({ name: initial.event, from: 'none', to: initial.state });\n }\n\n for(var n = 0 ; n < events.length ; n++)\n add(events[n]);\n\n for(var name in map) {\n if (map.hasOwnProperty(name))\n fsm[name] = StateMachine.buildEvent(name, map[name]);\n }\n\n for(var name in callbacks) {\n if (callbacks.hasOwnProperty(name))\n fsm[name] = callbacks[name]\n }\n\n fsm.current = 'none';\n fsm.is = function(state) { return Array.isArray(state) ? (state.indexOf(this.current) >= 0) : (this.current === state); };\n fsm.can = function(event) { return !this.transition && (map[event] !== undefined) && (map[event].hasOwnProperty(this.current) || map[event].hasOwnProperty(StateMachine.WILDCARD)); }\n fsm.cannot = function(event) { return !this.can(event); };\n fsm.transitions = function() { return (transitions[this.current] || []).concat(transitions[StateMachine.WILDCARD] || []); };\n fsm.isFinished = function() { return this.is(terminal); };\n fsm.error = cfg.error || function(name, from, to, args, error, msg, e) { throw e || msg; }; // default behavior when something unexpected happens is to throw an exception, but caller can override this behavior if desired (see github issue #3 and #17)\n fsm.states = function() { return Object.keys(transitions).sort() };\n\n if (initial && !initial.defer)\n fsm[initial.event]();\n\n return fsm;\n\n },\n\n //===========================================================================\n\n doCallback: function(fsm, func, name, from, to, args) {\n if (func) {\n try {\n return func.apply(fsm, [name, from, to].concat(args));\n }\n catch(e) {\n return fsm.error(name, from, to, args, StateMachine.Error.INVALID_CALLBACK, \"an exception occurred in a caller-provided callback function\", e);\n }\n }\n },\n\n beforeAnyEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onbeforeevent'], name, from, to, args); },\n afterAnyEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onafterevent'] || fsm['onevent'], name, from, to, args); },\n leaveAnyState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onleavestate'], name, from, to, args); },\n enterAnyState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onenterstate'] || fsm['onstate'], name, from, to, args); },\n changeState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onchangestate'], name, from, to, args); },\n\n beforeThisEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onbefore' + name], name, from, to, args); },\n afterThisEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onafter' + name] || fsm['on' + name], name, from, to, args); },\n leaveThisState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onleave' + from], name, from, to, args); },\n enterThisState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onenter' + to] || fsm['on' + to], name, from, to, args); },\n\n beforeEvent: function(fsm, name, from, to, args) {\n if ((false === StateMachine.beforeThisEvent(fsm, name, from, to, args)) ||\n (false === StateMachine.beforeAnyEvent( fsm, name, from, to, args)))\n return false;\n },\n\n afterEvent: function(fsm, name, from, to, args) {\n StateMachine.afterThisEvent(fsm, name, from, to, args);\n StateMachine.afterAnyEvent( fsm, name, from, to, args);\n },\n\n leaveState: function(fsm, name, from, to, args) {\n var specific = StateMachine.leaveThisState(fsm, name, from, to, args),\n general = StateMachine.leaveAnyState( fsm, name, from, to, args);\n if ((false === specific) || (false === general))\n return false;\n else if ((StateMachine.ASYNC === specific) || (StateMachine.ASYNC === general))\n return StateMachine.ASYNC;\n },\n\n enterState: function(fsm, name, from, to, args) {\n StateMachine.enterThisState(fsm, name, from, to, args);\n StateMachine.enterAnyState( fsm, name, from, to, args);\n },\n\n //===========================================================================\n\n buildEvent: function(name, map) {\n return function() {\n\n var from = this.current;\n var to = map[from] || (map[StateMachine.WILDCARD] != StateMachine.WILDCARD ? map[StateMachine.WILDCARD] : from) || from;\n var args = Array.prototype.slice.call(arguments); // turn arguments into pure array\n\n if (this.transition)\n return this.error(name, from, to, args, StateMachine.Error.PENDING_TRANSITION, \"event \" + name + \" inappropriate because previous transition did not complete\");\n\n if (this.cannot(name))\n return this.error(name, from, to, args, StateMachine.Error.INVALID_TRANSITION, \"event \" + name + \" inappropriate in current state \" + this.current);\n\n if (false === StateMachine.beforeEvent(this, name, from, to, args))\n return StateMachine.Result.CANCELLED;\n\n if (from === to) {\n StateMachine.afterEvent(this, name, from, to, args);\n return StateMachine.Result.NOTRANSITION;\n }\n\n // prepare a transition method for use EITHER lower down, or by caller if they want an async transition (indicated by an ASYNC return value from leaveState)\n var fsm = this;\n this.transition = function() {\n fsm.transition = null; // this method should only ever be called once\n fsm.current = to;\n StateMachine.enterState( fsm, name, from, to, args);\n StateMachine.changeState(fsm, name, from, to, args);\n StateMachine.afterEvent( fsm, name, from, to, args);\n return StateMachine.Result.SUCCEEDED;\n };\n this.transition.cancel = function() { // provide a way for caller to cancel async transition if desired (issue #22)\n fsm.transition = null;\n StateMachine.afterEvent(fsm, name, from, to, args);\n }\n\n var leave = StateMachine.leaveState(this, name, from, to, args);\n if (false === leave) {\n this.transition = null;\n return StateMachine.Result.CANCELLED;\n }\n else if (StateMachine.ASYNC === leave) {\n return StateMachine.Result.PENDING;\n }\n else {\n if (this.transition) // need to check in case user manually called transition() but forgot to return StateMachine.ASYNC\n return this.transition();\n }\n\n };\n }\n\n }; // StateMachine\n\n //===========================================================================\n\n //======\n // NODE\n //======\n if (typeof exports !== 'undefined') {\n if (typeof module !== 'undefined' && module.exports) {\n exports = module.exports = StateMachine;\n }\n exports.StateMachine = StateMachine;\n }\n //============\n // AMD/REQUIRE\n //============\n else if (typeof define === 'function' && define.amd) {\n define(function(require) { return StateMachine; });\n }\n //========\n // BROWSER\n //========\n else if (typeof window !== 'undefined') {\n window.StateMachine = StateMachine;\n }\n //===========\n // WEB WORKER\n //===========\n else if (typeof self !== 'undefined') {\n self.StateMachine = StateMachine;\n }\n\n}());\n","import {ErrorCode} from '../enums/ErrorCode';\nimport {Event, EventMap} from '../enums/Event';\nimport {VideoStartFailedReason} from '../enums/VideoStartFailedReason';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport * as ErrorData from '../types/EventData';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport * as Settings from '../utils/Settings';\nimport * as Utils from '../utils/Utils';\n\nconst REBUFFERING_HEARTBEAT_INTERVALS = [3000, 5000, 10000, 30000, 59700];\n\nexport abstract class AnalyticsStateMachine {\n protected stateMachine: StateMachine.StateMachine & {[key: string]: any};\n protected onEnterStateTimestamp: number = 0;\n\n protected readonly videoStartupTimeoutMs: number = Settings.ANALYTICS_VIDEOSTART_TIMEOUT;\n protected readonly rebufferTimeoutMs: number = Settings.ANALYTICS_REBUFFER_TIMEOUT;\n\n private rebufferingHeartbeatIntervalHandle?: number;\n private currentRebufferingIntervalIndex: number = 0;\n private rebufferingTimeoutHandle?: number;\n private videoStartTimeout?: number;\n\n constructor(protected stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n this.stateMachine = this.createStateMachine(opts);\n }\n\n public abstract createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine.StateMachine;\n public abstract callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void;\n public abstract sourceChange(config: AnalyticsConfig, timestamp: number, currentTime?: number): void;\n\n public get currentState(): string {\n return this.stateMachine.current;\n }\n\n public resetIntervals() {\n this.clearVideoStartTimeout();\n this.clearRebufferingTimeoutHandle(true);\n this.clearRebufferingHeartbeatHandle();\n }\n\n //#region rebuffer timeout\n\n protected startRebufferingHeartbeatInterval(reset: boolean = true) {\n this.resetRebufferingHelpers(reset);\n\n this.startRebufferingTimeoutHandle();\n\n this.rebufferingHeartbeatIntervalHandle = window.setInterval(() => {\n if (this.stateMachine.current.toLowerCase() !== 'rebuffering') {\n this.resetRebufferingHelpers();\n return;\n }\n const timestamp = new Date().getTime();\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n this.stateMachineCallbacks.heartbeat(stateDuration, this.stateMachine.current.toLowerCase(), {\n buffered: stateDuration,\n });\n this.onEnterStateTimestamp = timestamp;\n this.currentRebufferingIntervalIndex = Math.min(\n this.currentRebufferingIntervalIndex + 1,\n REBUFFERING_HEARTBEAT_INTERVALS.length - 1\n );\n this.startRebufferingHeartbeatInterval(false);\n }, REBUFFERING_HEARTBEAT_INTERVALS[this.currentRebufferingIntervalIndex]);\n }\n\n protected resetRebufferingHelpers(reset: boolean = true) {\n if (reset) {\n this.currentRebufferingIntervalIndex = 0;\n }\n this.clearRebufferingHeartbeatHandle();\n this.clearRebufferingTimeoutHandle(reset);\n }\n\n protected clearRebufferingHeartbeatHandle() {\n if (this.rebufferingHeartbeatIntervalHandle != null) {\n window.clearInterval(this.rebufferingHeartbeatIntervalHandle);\n this.rebufferingHeartbeatIntervalHandle = undefined;\n }\n }\n\n protected startRebufferingTimeoutHandle() {\n if (this.currentRebufferingIntervalIndex > 0) {\n return;\n }\n this.rebufferingTimeoutHandle = window.setTimeout(() => {\n this.callEvent(\n Event.ERROR,\n {\n ...ErrorCode.BUFFERING_TIMEOUT_REACHED,\n data: {\n additionalData: `StateMachine timed out after ${this.rebufferTimeoutMs} ms of consecutive buffering.`,\n },\n },\n Utils.getCurrentTimestamp()\n );\n this.stateMachineCallbacks.release();\n }, this.rebufferTimeoutMs);\n }\n\n protected clearRebufferingTimeoutHandle(reset: boolean) {\n if (reset && this.rebufferingTimeoutHandle != null) {\n window.clearTimeout(this.rebufferingTimeoutHandle);\n this.rebufferingTimeoutHandle = undefined;\n }\n }\n //#endregion\n\n //#region videoStartupFailed\n\n protected getVideoStartupFailedEventData(currentTime: number, event?: string, eventObject?: any) {\n const reason = this.getReasonForVideoStartFailure(event);\n const eventData: ErrorData.VideoStartFailedEvent = {currentTime, reason};\n return eventData;\n }\n\n protected getReasonForVideoStartFailure(event?: string) {\n switch (event) {\n case Event.ERROR:\n return VideoStartFailedReason.PLAYER_ERROR;\n case Event.UNLOAD:\n return VideoStartFailedReason.PAGE_CLOSED;\n case Event.VIDEOSTART_TIMEOUT:\n return VideoStartFailedReason.TIMEOUT;\n default:\n return VideoStartFailedReason.UNKNOWN;\n }\n }\n\n protected setVideoStartTimeout() {\n if (this.videoStartTimeout != null) {\n this.clearVideoStartTimeout();\n }\n this.videoStartTimeout = window.setTimeout(() => {\n this.callEvent(Event.VIDEOSTART_TIMEOUT, {}, Utils.getCurrentTimestamp());\n this.stateMachineCallbacks.release();\n }, this.videoStartupTimeoutMs);\n }\n\n protected clearVideoStartTimeout() {\n window.clearTimeout(this.videoStartTimeout);\n this.videoStartTimeout = undefined;\n }\n //#endregion\n}\n","import {HTML5AnalyticsStateMachine} from '../../analyticsStateMachines/HTML5AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport {Event} from '../../enums/Event';\nimport {getMIMETypeFromFileExtension} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {getStreamTypeFromMIMEType} from '../../enums/StreamTypes';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport {StreamSources} from '../../types/StreamSources';\nimport {SubtitleInfo} from '../../types/SubtitleInfo';\nimport * as Utils from '../../utils/Utils';\nimport {isVideoInFullscreen} from '../../utils/Utils';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport abstract class HTML5InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n get segments(): SegmentInfo[] {\n return [];\n }\n\n private static BUFFERING_TIMECHANGED_TIMEOUT = 1000;\n public mediaElEventHandlers: Array<{event: string; handler: any}>;\n public abstract getPlayerVersion: () => string;\n public readonly videoCompletionTracker: VideoCompletionTracker;\n protected needsFirstPlayIntent: boolean;\n private onBeforeUnLoadEvent: boolean = false;\n\n private bufferingTimeout?: number;\n private isBuffering: boolean;\n private lastIsLiveStatus: boolean;\n private isPaused: boolean;\n private isSeeking: boolean;\n private previousMediaTime: number;\n private previousClientTime: number;\n private needsReadyEvent: boolean;\n private mediaElementSet: boolean;\n private previousMutedValue: boolean = false;\n\n constructor(protected mediaElement: HTMLVideoElement | null, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.initializeStateMachine();\n this.mediaElEventHandlers = [];\n this.bufferingTimeout = undefined;\n this.isBuffering = false;\n this.lastIsLiveStatus = false;\n this.isPaused = false;\n this.isSeeking = false;\n this.previousMediaTime = 0;\n this.previousClientTime = 0;\n this.needsReadyEvent = true;\n this.needsFirstPlayIntent = true;\n this.mediaElementSet = false;\n this.videoCompletionTracker = new VideoCompletionTracker();\n }\n public getPlayerName = () => Player.HTML5;\n public getPlayerTech = () => 'html5';\n public getAutoPlay = () => (this.mediaElement ? this.mediaElement.autoplay : false);\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n if (this.mediaElement) {\n this.setMediaElement();\n }\n this.registerWindowEvents();\n return [];\n }\n\n public isLive = () => (this.mediaElement ? this.mediaElement.duration === Infinity : false);\n\n // this seems very generic. one could put it in a helper\n // and use it in many adapter implementations.\n public getStreamSources(url: string | undefined): StreamSources {\n if (!url) {\n return {};\n }\n const streamType = this.getStreamType();\n switch (streamType) {\n case 'hls':\n return {m3u8Url: url};\n case 'dash':\n return {mpdUrl: url};\n default:\n return {progUrl: url};\n }\n }\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n let info: PlaybackInfo = {\n ...this.getCommonPlaybackInfo(),\n ...this.getStreamSources(this.getStreamURL()),\n streamFormat: this.getStreamType(),\n isLive: this.isLive(),\n size: isVideoInFullscreen() ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n droppedFrames: 0, // TODO: Implement `droppedFrames`\n // TODO: Implement `audioBitrate`\n // TODO: Implement `isCasting`\n // TODO: Implement getting `videoTitle` from player (currently only from the analytics config)\n };\n\n if (this.mediaElement) {\n info = {\n ...info,\n videoDuration: this.mediaElement.duration,\n isMuted: this.mediaElement.muted,\n videoWindowHeight: this.mediaElement.height,\n videoWindowWidth: this.mediaElement.width,\n };\n }\n\n const qualityInfo = this.getCurrentQualityLevelInfo();\n if (qualityInfo) {\n info = {\n ...info,\n videoPlaybackHeight: qualityInfo.height,\n videoPlaybackWidth: qualityInfo.width,\n videoBitrate: qualityInfo.bitrate,\n };\n }\n\n return info;\n }\n\n protected get currentTime(): number {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n return this.mediaElement.currentTime;\n }\n\n /**\n * Used to setup against the media element.\n * We need this method to desynchronize construction of this class\n * and the actual initialization against the media element.\n * That is because at construction some media engine\n * may not already have the media element attached, for example\n * when passing in the DOM element is happening at once with passing the source URL\n * and can not be decoupled.\n * We are then awaiting an event from the engine and calling this with the media element\n * as argument from our sub-class.\n *\n * This method can also be called without arguments and then it will perform\n * initialization against the existing media element (should only be called once, will throw an error otherwise)\n *\n * It can also be used to replace the element.\n *\n *\n */\n public setMediaElement(mediaElement: HTMLVideoElement | null = null) {\n // replace previously existing, if calld with args\n if (mediaElement && this.mediaElement) {\n this.unregisterMediaElement();\n this.mediaElementSet = false;\n }\n\n // if called without args we assume it's already there\n // we can also be called with args but without any being there before\n if (mediaElement) {\n this.mediaElement = mediaElement;\n }\n\n if (!this.mediaElement) {\n throw new Error('No media element owned');\n }\n\n if (this.mediaElementSet) {\n throw new Error('Media element already set (only call this once)');\n }\n this.mediaElementSet = true;\n\n this.registerMediaElement();\n this.onMaybeReady();\n }\n public abstract getCurrentQualityLevelInfo(): QualityLevelInfo | null;\n\n /**\n * Can be overriden by sub-classes\n * @returns {string}\n *\n */\n public getMIMEType(): string | undefined {\n const streamUrl = this.getStreamURL();\n if (!streamUrl || streamUrl === undefined) {\n return;\n }\n return getMIMETypeFromFileExtension(streamUrl);\n }\n\n /**\n * Can be overriden by sub-classes\n * @returns {string}\n */\n public getStreamType(): string | undefined {\n const mimetype = this.getMIMEType();\n if (mimetype) {\n return getStreamTypeFromMIMEType(mimetype);\n }\n }\n\n /**\n * Can be overriden by subclasses.\n * @returns {string}\n */\n public getStreamURL(): string | undefined {\n const mediaElement = this.mediaElement;\n if (!mediaElement) {\n return;\n }\n\n return mediaElement.src;\n }\n\n public resetMedia() {\n this.mediaElement = null;\n this.mediaElEventHandlers = [];\n window.clearTimeout(this.bufferingTimeout);\n }\n\n public registerMediaElement() {\n const mediaElement = this.mediaElement;\n if (!mediaElement) {\n return;\n }\n\n this.wrapMediaElementLoad(mediaElement);\n this.listenToMediaElementEvent('loadstart', () => {\n this.eventCallback(Event.READY, {});\n });\n\n this.listenToMediaElementEvent('loadedmetadata', () => {\n // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState\n // HAVE_NOTHING 0 No information is available about the media resource.\n // HAVE_METADATA 1 Enough of the media resource has been retrieved that\n // the metadata attributes are initialized. Seeking will no longer raise an exception.\n // HAVE_CURRENT_DATA 2 Data is available for the current playback position,\n // but not enough to actually play more than one frame.\n // HAVE_FUTURE_DATA 3 Data for the current playback position as well as for\n // at least a little bit of time into the future is available\n // (in other words, at least two frames of video, for example).\n // HAVE_ENOUGH_DATA 4 Enough data is available—and the download rate is high\n // enough—that the media can be played through to the end without interruption.\n if (mediaElement.readyState !== 1) {\n // we can't really gather any more information at this point\n return;\n }\n\n // silent\n this.checkQualityLevelAttributes(true);\n\n // const {duration, autoplay, width, height, videoWidth, videoHeight, muted} = mediaElement;\n\n // // This is redundant with what we give to updateMetadata method.\n // // Not sure if there are good reasons to keep that so or if we should better centralize.\n // const info = {\n // type: 'html5',\n // isLive: this.isLive(),\n // version: this.getPlayerVersion(),\n // streamType: this.getStreamType(),\n // streamUrl: this.getStreamURL(),\n // duration,\n // autoplay,\n // // HTMLVideoElement.width and HTMLVideoElement.height\n // // is a DOMString that reflects the height HTML attribute,\n // // which specifies the height of the display area, in CSS pixels.\n // // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement\n // width: width,\n // height: height,\n // // Returns an unsigned long containing the intrinsic\n // // height of the resource in CSS pixels,\n // // taking into account the dimensions, aspect ratio,\n // // clean aperture, resolution, and so forth,\n // // as defined for the format used by the resource.\n // // If the element's ready state is HAVE_NOTHING, the value is 0.\n // // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement\n // videoWindowWidth: videoWidth,\n // videoWindowHeight: videoHeight,\n // muted,\n // };\n\n // silence events if we have not yet intended play\n // if (this.needsFirstPlayIntent_) {\n // return;\n // }\n if (this.mediaElement != null) {\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.mediaElement.duration);\n this.previousMutedValue = this.mediaElement.muted;\n }\n });\n\n // We need the PLAY event to indicate the intent to play\n // NOTE: use TIMECHANGED event on 'playing' and trigger PLAY as intended in states.dot graph\n\n this.listenToMediaElementEvent('play', () => {\n const {currentTime} = mediaElement;\n\n this.needsFirstPlayIntent = false;\n\n this.eventCallback(Event.PLAY, {\n currentTime,\n });\n });\n\n this.listenToMediaElementEvent('pause', () => {\n this.onPaused();\n });\n\n this.listenToMediaElementEvent('playing', () => {\n clearTimeout(this.bufferingTimeout);\n this.isPaused = false;\n });\n\n this.listenToMediaElementEvent('error', () => {\n const {currentTime, error} = mediaElement;\n\n this.eventCallback(Event.ERROR, {\n currentTime,\n // See https://developer.mozilla.org/en-US/docs/Web/API/MediaError\n code: error?.code ?? undefined,\n message: error?.message ?? undefined,\n data: {},\n });\n });\n\n this.listenToMediaElementEvent('volumechange', () => {\n const {muted, currentTime, volume} = mediaElement;\n const isMuted = this.isAudioMuted(muted, volume);\n\n if (this.previousMutedValue !== isMuted) {\n if (isMuted) {\n this.eventCallback(Event.MUTE, {\n currentTime,\n });\n } else {\n this.eventCallback(Event.UN_MUTE, {\n currentTime,\n });\n }\n this.previousMutedValue = isMuted;\n }\n });\n\n this.listenToMediaElementEvent('seeking', () => {\n const {currentTime} = mediaElement;\n\n this.eventCallback(Event.SEEK, {\n currentTime,\n });\n });\n\n this.listenToMediaElementEvent('seeked', () => {\n const {currentTime} = mediaElement;\n\n clearTimeout(this.bufferingTimeout);\n\n this.eventCallback(Event.SEEKED, {\n currentTime,\n });\n });\n\n this.listenToMediaElementEvent('timeupdate', () => {\n const {currentTime} = mediaElement;\n\n this.isBuffering = false;\n this.isSeeking = false;\n\n // silence events if we have not yet intended play\n if (this.needsFirstPlayIntent) {\n return;\n }\n\n if (!this.isPaused) {\n this.eventCallback(Event.TIMECHANGED, {\n currentTime,\n });\n }\n\n this.checkQualityLevelAttributes();\n\n this.checkSeeking();\n\n // We are doing this in case we can not rely\n // on the \"stalled\" or \"waiting\" events in a specific browser\n // and to detect intrinsinc paused states (when we do not get a paused event)\n // but the player is paused already before attach or is paused from initialization on.\n this.checkPlayheadProgress();\n\n this.previousMediaTime = currentTime;\n });\n\n // The stalled event is fired when the user agent is trying to fetch media data,\n // but data is unexpectedly not forthcoming.\n // https://developer.mozilla.org/en-US/docs/Web/Events/stalled\n this.listenToMediaElementEvent('stalled', () => {\n // this event doesn't indicate buffering by definition (interupted playback),\n // only that data throughput to playout buffers is not as high as expected\n // It happens on Chrome every once in a while as SourceBuffer's are not fed\n // as fast as the underlying native player may prefer (but it does not lead to\n // interuption).\n });\n\n // The waiting event is fired when playback has stopped because of a temporary lack of data.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/waiting\n this.listenToMediaElementEvent('waiting', () => {\n // we check here for seeking because a programmatically seek where just\n // the currentTime has been changed does not trigger a proper seek event\n this.checkSeeking();\n this.onBuffering();\n });\n }\n\n /**\n * Should only be calld when a mediaElement is attached\n */\n public listenToMediaElementEvent(event: any, handler: any) {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const boundHandler = handler.bind(this);\n\n this.mediaElEventHandlers.push({event, handler: boundHandler});\n this.mediaElement.addEventListener(event, boundHandler, false);\n }\n\n public onMaybeReady() {\n if (!this.needsReadyEvent || !this.mediaElement) {\n return;\n }\n\n this.needsReadyEvent = false;\n\n const info = this.getCurrentPlaybackInfo();\n\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.mediaElement.duration);\n this.eventCallback(Event.READY, {currentTime: this.currentTime});\n }\n\n /**\n * Should only be calld when a mediaElement is attached\n */\n public unregisterMediaElement() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const mediaElement = this.mediaElement;\n\n this.mediaElEventHandlers.forEach((item: {event: string; handler: any}) => {\n mediaElement.removeEventListener(item.event, item.handler);\n });\n\n this.resetMedia();\n }\n\n public onBuffering() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const {currentTime} = this.mediaElement;\n\n // this handler may be called multiple times\n // for one actual buffering-event occuring so lets guard from\n // triggering this event redundantly.\n if (this.isBuffering || (this.isPaused && !this.isSeeking)) {\n return;\n }\n\n if (this.isSeeking) {\n this.eventCallback(Event.SEEK, {\n currentTime,\n });\n } else {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime,\n });\n }\n this.isBuffering = true;\n }\n\n public onPaused(currentTime?: number) {\n if (this.isPaused) {\n return;\n }\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n if (!currentTime) {\n currentTime = this.mediaElement.currentTime;\n }\n\n this.eventCallback(Event.PAUSE, {\n currentTime,\n });\n\n this.isPaused = true;\n }\n\n public registerWindowEvents() {\n this.windowEventTracker.addEventListener('beforeunload', this.onPageClose.bind(this));\n this.windowEventTracker.addEventListener('unload', this.onPageClose.bind(this));\n }\n\n public onPageClose() {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n const mediaElement = this.mediaElement;\n let currentTime: number | undefined;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n this.eventCallback(Event.UNLOAD, {\n currentTime,\n });\n }\n this.release();\n }\n\n public checkPlayheadProgress() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const mediaElement = this.mediaElement;\n if (mediaElement.paused) {\n this.onPaused();\n }\n\n clearTimeout(this.bufferingTimeout);\n\n this.bufferingTimeout = window.setTimeout(() => {\n if (mediaElement.paused || (mediaElement.ended && !this.isBuffering)) {\n return;\n }\n\n const timeDelta = mediaElement.currentTime - this.previousMediaTime;\n\n if (timeDelta < HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT) {\n this.onBuffering();\n }\n }, HTML5InternalAdapter.BUFFERING_TIMECHANGED_TIMEOUT);\n }\n\n public checkQualityLevelAttributes(silent: boolean = false) {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n\n const mediaElement = this.mediaElement;\n\n const qualityLevelInfo = this.getCurrentQualityLevelInfo();\n if (!qualityLevelInfo) {\n return;\n }\n\n const {bitrate, width, height} = qualityLevelInfo;\n\n const isLive = this.isLive();\n\n // Detect a change of the isLive status and update the medaData of the SM\n if (isLive !== this.lastIsLiveStatus) {\n this.lastIsLiveStatus = isLive;\n\n // TODO: Call event for ISLIVE_CHANGE (similar to VIDEO_CHANGE)\n // The updateMetadata is obsolete, as we introduced the getCurrentPlaybackInfo\n // (we don't notify the statemachine about state changes, instead we poll the adapter for the information)\n // if (!silent) {\n // this.stateMachine.updateMetadata();\n // }\n }\n\n if (bitrate != null && this.shouldAllowVideoQualityChange(bitrate)) {\n this.setPreviousVideoBitrate(bitrate);\n const eventData = {\n width,\n height,\n bitrate,\n currentTime: mediaElement.currentTime,\n };\n\n if (!silent) {\n this.eventCallback(Event.VIDEO_CHANGE, eventData);\n }\n }\n }\n\n public sourceChange(config: AnalyticsConfig, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, this.mediaElement ? this.mediaElement.currentTime : undefined);\n }\n\n public getSelectedSubtitleFromMediaElement(mediaElement: any): SubtitleInfo | undefined {\n if (mediaElement.textTracks == null) {\n return undefined;\n }\n const textTrackList = mediaElement.textTracks;\n for (const attr of textTrackList) {\n if (attr.mode != null && attr.mode === 'showing') {\n const isSubtitleDisplayed = attr.language != null && attr.language.length > 0;\n return {\n enabled: isSubtitleDisplayed,\n language: isSubtitleDisplayed ? attr.language : undefined,\n };\n }\n }\n return {\n enabled: false,\n };\n }\n\n protected initializeStateMachine(): void {\n this.stateMachine = new HTML5AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.stateMachine.callEvent(Event.SETUP, {}, 0);\n }\n\n private wrapMediaElementLoad(mediaElement: HTMLVideoElement) {\n const originalLoad = mediaElement.load;\n mediaElement.load = (...args: Parameters<typeof mediaElement.load>): void => {\n this.sourceChange({}, Utils.getCurrentTimestamp());\n originalLoad.apply(mediaElement, args);\n };\n }\n\n private checkSeeking() {\n if (!this.mediaElement) {\n throw new Error('No media attached');\n }\n const currentVideoTime = this.mediaElement.currentTime;\n\n const mediaTimeDif = Math.abs(currentVideoTime - this.previousMediaTime);\n const currentClientTime = Utils.getCurrentTimestamp();\n\n /** Difference between current client time and the previously known client time in seconds. */\n const clientTimeDif = (currentClientTime - this.previousClientTime) / 1000;\n\n /**\n * If the media time difference between the previous one and the current one is much higher than\n * the difference of the previous and current client time than there is a seek happening\n */\n // TODO: check if we need to increase the threshold for detecting a seek. The seek can be triggered when clicking `play` at an unfavorable point in time:\n // Set autoplay to false and click on play right after the player/video loaded.\n if (mediaTimeDif > clientTimeDif * 2) {\n this.isSeeking = true;\n this.onPaused(this.previousMediaTime + clientTimeDif);\n }\n\n this.previousClientTime = Utils.getCurrentTimestamp();\n }\n}\n","// @ts-ignore\nexport const VERSION: string = __VERSION__;\n","import {logger} from './Logger';\n\n// tslint:disable-next-line\nexport function post(url: string, body: any, callback: Function, async: boolean = true): void {\n let xhttp: any;\n let legacyMode = false;\n\n if ((window as any).XDomainRequest) {\n legacyMode = true;\n }\n\n if (legacyMode) {\n xhttp = new (window as any).XDomainRequest();\n } else {\n xhttp = new XMLHttpRequest();\n }\n\n const responseCallback = () => {\n // tslint:disable-next-line\n if (xhttp.readyState == XMLHttpRequest.DONE) {\n if (xhttp.responseText <= 0) {\n return;\n }\n\n const sampleResponse = JSON.parse(xhttp.responseText);\n\n callback(sampleResponse);\n }\n };\n\n if (legacyMode) {\n xhttp.onload = responseCallback;\n } else {\n xhttp.onreadystatechange = responseCallback;\n }\n\n try {\n xhttp.open('POST', url, async);\n if (!legacyMode) {\n xhttp.setRequestHeader('Content-Type', 'text/plain');\n }\n xhttp.send(JSON.stringify(body));\n } catch (e) {\n logger.error('Failed to send POST request.', e);\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {Backend} from './Backend';\n\nexport class NoOpBackend implements Backend {\n public sendRequest(sample: Sample) {}\n public sendUnloadRequest(sample: Sample) {}\n public sendRequestSynchronous(sample: Sample) {}\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {}\n}\n","export interface Subscribable<TArgs> {\n subscribe(callback: EventHandler<TArgs>): () => void;\n unsubscribe(callback: EventHandler<TArgs>);\n}\n\ntype EventHandler<TArgs> = (args: TArgs) => void;\n\nexport class EventDispatcher<TArgs> implements Subscribable<TArgs> {\n private callbacks: Array<EventHandler<TArgs>> = [];\n\n public subscribe(callback: EventHandler<TArgs>): () => void {\n this.callbacks.push(callback);\n\n return () => this.unsubscribe(callback);\n }\n\n public dispatch(args: TArgs) {\n const callbacks = this.callbacks.slice(0);\n callbacks.forEach((callback) => {\n callback(args);\n });\n }\n\n public unsubscribe(callback: EventHandler<TArgs>) {\n const index = this.callbacks.indexOf(callback);\n if (index > -1) {\n this.callbacks.splice(index, 1);\n }\n }\n\n public get subscriberCount() {\n return this.callbacks.length;\n }\n}\n","import Timespan from '../types/Timespan';\n\nenum TimespanOverlappingType {\n None,\n Overlapping,\n FirstContainedInSecond,\n SecondContainedInFirst,\n}\n\nexport default class VideoCompletionTracker {\n private watched: Timespan[] = [];\n private videoDuration: number | null = null;\n\n public reset(): void {\n this.watched = [];\n }\n\n /**\n * sets video Duration\n * @param videoDuration in sec\n */\n public setVideoDuration(videoDuration: number): void {\n this.videoDuration = videoDuration * 1000;\n }\n\n /**\n * Adds the watched timespan to the tracker\n * @param watched watched timespan you want to add to the tracker\n * @returns how much time(video parts which have not been seen yet) was added to the tracker\n */\n public addWatched(watched: Timespan): number {\n if (this.videoDuration == null) {\n throw new Error('no video duration set for completion tracker');\n }\n\n this.watched.push(watched);\n const overlappingTimespan = this.mergeWatched(this.watched);\n return (this.getDuration(watched) - overlappingTimespan) / this.videoDuration;\n }\n\n /**\n * returns the relative value of how much the user watch the content of the video\n */\n public getCompletionPercentage(): number {\n if (this.videoDuration == null) {\n throw new Error('no video duration set for completion tracker');\n }\n\n let watched = 0;\n for (const w of this.watched) {\n watched += this.getDuration(w);\n }\n return watched / this.videoDuration;\n }\n\n /**\n * Recursive Method to merge All Watched Blocks\n * @param watched\n *\n * @returns how much timespan was overlapping while merging the watchBlocks\n */\n private mergeWatched(watched: Timespan[]): number {\n for (let i = 0; i < watched.length; i++) {\n const time1 = watched[i];\n for (let k = i + 1; k < watched.length; k++) {\n const time2 = watched[k];\n let overlappingTimespan = 0;\n const overlapType = this.getOverlappingType(time1, time2);\n\n if (overlapType === TimespanOverlappingType.Overlapping) {\n this.mergeAndReplace(time1, i, time2, k);\n overlappingTimespan = this.getOverlappingTimespan(time1, time2);\n } else if (overlapType === TimespanOverlappingType.FirstContainedInSecond) {\n this.watched.splice(i, 1);\n overlappingTimespan = this.getDuration(time1);\n } else if (overlapType === TimespanOverlappingType.SecondContainedInFirst) {\n this.watched.splice(k, 1);\n overlappingTimespan = this.getDuration(time2);\n }\n if (overlapType !== TimespanOverlappingType.None) {\n return overlappingTimespan + this.mergeWatched(this.watched);\n }\n }\n }\n return 0;\n }\n\n private getOverlappingType(first: Timespan, second: Timespan): TimespanOverlappingType {\n if (\n (this.isMomentInTimespan(first.end, second) && first.start < second.start) ||\n (this.isMomentInTimespan(first.start, second) && first.end > second.end)\n ) {\n return TimespanOverlappingType.Overlapping;\n } else if (this.isMomentInTimespan(first.start, second) && this.isMomentInTimespan(first.end, second)) {\n return TimespanOverlappingType.FirstContainedInSecond;\n } else if (this.isMomentInTimespan(second.start, first) && this.isMomentInTimespan(second.end, first)) {\n return TimespanOverlappingType.SecondContainedInFirst;\n }\n return TimespanOverlappingType.None;\n }\n\n private isMomentInTimespan(moment: number, timespan: Timespan): boolean {\n return moment >= timespan.start && moment < timespan.end;\n }\n\n private mergeAndReplace(first: Timespan, firstIndex: number, second: Timespan, secondIndex: number): void {\n const end = first.end > second.end ? first.end : second.end;\n const start = first.start < second.start ? first.start : second.start;\n const newWatchedTimespan: Timespan = {start, end};\n this.watched.splice(firstIndex, 1, newWatchedTimespan);\n this.watched.splice(secondIndex, 1);\n }\n\n private getOverlappingTimespan(first: Timespan, second: Timespan): number {\n const end = first.end < second.end ? first.end : second.end;\n const start = first.start >= second.start ? first.start : second.start;\n return end - start;\n }\n\n private getDuration(watched: Timespan): number {\n return Math.abs(watched.end - watched.start);\n }\n}\n","export interface CustomDataValues {\n customData1?: string;\n customData2?: string;\n customData3?: string;\n customData4?: string;\n customData5?: string;\n customData6?: string;\n customData7?: string;\n customData8?: string;\n customData9?: string;\n customData10?: string;\n customData11?: string;\n customData12?: string;\n customData13?: string;\n customData14?: string;\n customData15?: string;\n customData16?: string;\n customData17?: string;\n customData18?: string;\n customData19?: string;\n customData20?: string;\n customData21?: string;\n customData22?: string;\n customData23?: string;\n customData24?: string;\n customData25?: string;\n customData26?: string;\n customData27?: string;\n customData28?: string;\n customData29?: string;\n customData30?: string;\n experimentName?: string;\n}\n\n/**\n * Lists all keys of the {@see CustomDataValues} interface.\n */\nexport const customDataValuesKeys: Array<keyof CustomDataValues> = [\n 'customData1',\n 'customData2',\n 'customData3',\n 'customData4',\n 'customData5',\n 'customData6',\n 'customData7',\n 'customData8',\n 'customData9',\n 'customData10',\n 'customData11',\n 'customData12',\n 'customData13',\n 'customData14',\n 'customData15',\n 'customData16',\n 'customData17',\n 'customData18',\n 'customData19',\n 'customData20',\n 'customData21',\n 'customData22',\n 'customData23',\n 'customData24',\n 'customData25',\n 'customData26',\n 'customData27',\n 'customData28',\n 'customData29',\n 'customData30',\n 'experimentName',\n];\n\n/**\n * The number of CustomDataXX fields in {@see CustomDataValues}.\n */\nexport const customDataFieldCount = customDataValuesKeys.filter((i) => i.match('customData\\\\d+')).length;\n","export class EventDebugging {\n public event: string | undefined;\n public from: string | undefined;\n public to: string | undefined;\n public timestamp: number;\n public eventObject: any;\n\n constructor(\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) {\n this.event = event;\n this.from = from;\n this.to = to;\n this.timestamp = timestamp;\n this.eventObject = eventObject;\n }\n}\n","export enum CastTech {\n AirPlay = 'AirPlay',\n WebSocket = 'WebSocket',\n GoogleCast = 'GoogleCast',\n}\n","import {ProgressiveSourceConfig} from '../types/ProgressiveSourceConfig';\nimport {ProgressiveSourceInfo} from '../types/SourceInfo';\n\nexport const getSourceInfoFromBitmovinSourceConfig = (\n progressive: ProgressiveSourceConfig,\n player: any\n): ProgressiveSourceInfo => {\n if (!progressive) {\n return {\n progBitrate: undefined,\n progUrl: undefined,\n };\n }\n\n if (typeof progressive === 'string') {\n return {\n progBitrate: 0,\n progUrl: progressive,\n };\n }\n\n if (Array.isArray(progressive) && progressive.length > 0) {\n const playbackVideoData = player.getPlaybackVideoData();\n let progressiveArrayIndex = 0;\n\n if (playbackVideoData !== null && playbackVideoData !== undefined && !isNaN(+playbackVideoData.id)) {\n progressiveArrayIndex = +playbackVideoData.id;\n }\n\n return {\n progBitrate: progressive[progressiveArrayIndex].bitrate || 0,\n progUrl: progressive[progressiveArrayIndex].url,\n };\n }\n\n if (typeof progressive === 'object' && !Array.isArray(progressive)) {\n return {\n progBitrate: progressive.bitrate || 0,\n progUrl: progressive.url,\n };\n }\n\n return {\n progBitrate: undefined,\n progUrl: undefined,\n };\n};\n","import {DownloadSpeedInfo} from '../types/DownloadSpeedInfo';\nimport {SpeedMeasurement} from '../types/SpeedMeasurement';\nimport {Converter} from '../utils/Converter';\nimport {Measure} from './Measure';\n\nexport class DownloadSpeedMeter {\n protected measures: Measure[];\n\n constructor() {\n this.measures = [];\n }\n\n public reset(): void {\n this.measures = [];\n }\n\n public addMeasurement(measurement: SpeedMeasurement): void {\n if (measurement.httpStatus >= 400) {\n return;\n }\n const measure = new Measure(measurement);\n\n const threshhold = Converter.bitsToBytes(300 * 1000 * 1000); // 300 Megabit per second in bytes\n if (measure.speed >= threshhold) {\n return;\n }\n\n this.measures.push(measure);\n }\n\n public getInfo(): DownloadSpeedInfo {\n return {\n segmentsDownloadCount: this.measures.length,\n segmentsDownloadSize: this.measures.map((m) => m.size).reduce(this.add, 0),\n segmentsDownloadTime: Math.ceil(this.totalTime() * 1000),\n avgDownloadSpeed: this.avgSpeed(),\n minDownloadSpeed: this.minSpeed(),\n maxDownloadSpeed: this.maxSpeed(),\n avgTimeToFirstByte: this.avgTimeToFirstByte(),\n };\n }\n\n private add(a: number, b: number): number {\n return a + b;\n }\n\n private avgSpeed(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n const totalSpeed = this.speeds().reduce((a, b) => {\n return a + b;\n }, 0);\n const numMeasurements = this.measures.length;\n return this.bytePerSecondToBitPerSecond(totalSpeed / numMeasurements);\n }\n\n private bytePerSecondToBitPerSecond(bps: number): number {\n return Converter.bytesToBits(bps);\n }\n\n private minSpeed(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n return this.bytePerSecondToBitPerSecond(Math.min(...this.speeds()));\n }\n\n private speeds(): number[] {\n return this.measures.map((m) => {\n return m.speed;\n });\n }\n\n private maxSpeed(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n return this.bytePerSecondToBitPerSecond(Math.max(...this.speeds()));\n }\n\n private totalTime(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n return this.measures.reduce((a, b) => {\n return a + b.duration;\n }, 0);\n }\n\n private avgTimeToFirstByte(): number {\n if (this.measures.length === 0) {\n return 0;\n }\n const avg =\n this.measures.reduce((a, b) => {\n return a + b.timeToFirstByte * 1000;\n }, 0) / this.measures.length;\n\n return Math.ceil(avg);\n }\n}\n","import * as StateMachine from 'javascript-state-machine';\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {logger, padRight} from '../utils/Logger';\nimport * as Utils from '../utils/Utils';\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\n\nenum State {\n INITIALIZED = 'INITIALIZED',\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n AD = 'AD',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class HTML5AnalyticsStateMachine extends AnalyticsStateMachine {\n private seekStartedAt: any;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.seekStartedAt = null;\n\n this.createStateMachine(opts);\n }\n\n public getAllStates() {\n return [\n ...Object.keys(State).map((key) => State[key]),\n 'FINISH_QUALITYCHANGE_PAUSE',\n 'FINISH_QUALITYCHANGE',\n 'FINISH_QUALITYCHANGE_REBUFFERING',\n ];\n }\n\n public getAllStatesBut(states: string[]) {\n return this.getAllStates().filter((i) => states.indexOf(i) < 0);\n }\n\n public createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.INITIALIZED,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.SETUP, from: State.INITIALIZED, to: State.SETUP},\n {name: Event.SETUP, from: State.SETUP, to: State.SETUP},\n {name: Event.TIMECHANGED, from: State.SETUP, to: State.SETUP},\n {name: Event.READY, from: [State.SETUP, State.ERROR, State.END, State.SOURCE_CHANGING], to: State.READY},\n {name: Event.READY, from: State.READY, to: State.READY},\n {name: Event.READY, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.TIMECHANGED, from: State.READY, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n\n {name: Event.SEEKED, from: State.PAUSE, to: State.PAUSE},\n\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.START_BUFFERING, from: State.REBUFFERING, to: State.REBUFFERING},\n\n {name: Event.PLAY, from: State.REBUFFERING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.PLAYING},\n\n // Ignoring since it's pushed in a live stream\n {name: Event.SEEK, from: State.STARTUP, to: State.STARTUP},\n {name: Event.PLAY, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSED_SEEKING},\n {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.SEEKED, from: State.PAUSED_SEEKING, to: State.PAUSE},\n {name: Event.TIMECHANGED, from: State.PAUSED_SEEKING, to: State.PLAYING},\n {name: Event.PAUSE, from: State.PAUSED_SEEKING, to: State.PAUSE},\n\n {name: Event.END, from: State.PAUSED_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n {name: Event.PAUSE, from: State.END, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAYING},\n\n {name: Event.PLAY, from: State.END, to: State.PLAYING},\n\n {name: Event.ERROR, from: this.getAllStatesBut([State.STARTUP]), to: State.ERROR},\n {name: Event.PAUSE, from: State.ERROR, to: State.ERROR},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut([State.STARTUP]), to: State.END},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGING},\n {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.READY, to: State.READY},\n {name: Event.SUBTITLE_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n {name: Event.TIMECHANGED, from: State.SUBTITLE_CHANGING, to: State.PLAYING},\n\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.READY, to: State.READY},\n {name: Event.AUDIOTRACK_CHANGED, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.TIMECHANGED, from: State.AUDIOTRACK_CHANGING, to: State.PLAYING},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD},\n {name: Event.END_AD, from: State.AD, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE], to: State.CASTING},\n {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.SOURCE_LOADED, from: this.getAllStates(), to: State.SETUP},\n {name: Event.SOURCE_UNLOADED, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n {name: Event.MANUAL_SOURCE_CHANGE, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n {name: Event.TIMECHANGED, from: State.SOURCE_CHANGING, to: State.SOURCE_CHANGING},\n {name: Event.PAUSE, from: State.SOURCE_CHANGING, to: State.SOURCE_CHANGING},\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n\n {name: Event.PLAYLIST_TRANSITION, from: this.getAllStates(), to: State.READY},\n ],\n callbacks: {\n onenterstate: (event, from, to, timestamp, eventObject) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || Utils.getCurrentTimestamp();\n }\n\n logger.log(\n `[ENTER ${timestamp}] ${padRight(to, 20)} EVENT: ${padRight(event, 20)} from: ${padRight(from, 14)}`\n );\n\n if (eventObject && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onafterevent: (event, from, to, timestamp, eventObject) => {\n if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n if (event === Event.PLAYLIST_TRANSITION) {\n this.stateMachineCallbacks.playlistTransition(eventObject);\n }\n if (to === State.QUALITYCHANGE_PAUSE) {\n this.stateMachine.FINISH_QUALITYCHANGE_PAUSE(timestamp);\n }\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.QUALITYCHANGE_REBUFFERING) {\n this.stateMachine.FINISH_QUALITYCHANGE_REBUFFERING(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n\n // player errors will be sent via eventCallback() -> callEvent() -> onPlayerError() function chain\n // if then sourceChange is called same error will be sent second time\n if (from === State.ERROR && (event === Event.MANUAL_SOURCE_CHANGE || event === Event.SOURCE_UNLOADED)) {\n return;\n }\n\n logger.log(\n `[LEAVE ${timestamp}] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to: ${padRight(to, 20)}`\n );\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (eventObject && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (from === State.READY && to === State.STARTUP) {\n this.setVideoStartTimeout();\n } else if (from === State.STARTUP && to === State.PLAYING) {\n this.clearVideoStartTimeout();\n }\n\n const fnName = String(from).toLowerCase();\n if (to === State.EXIT_BEFORE_VIDEOSTART) {\n this.clearVideoStartTimeout();\n const eventData = this.getVideoStartupFailedEventData(timestamp, event, eventObject);\n const shouldSendSample = event !== Event.ERROR;\n this.stateMachineCallbacks.videoStartFailed(eventData, shouldSendSample);\n } else if (from === State.PAUSED_SEEKING) {\n const seekDuration = timestamp - this.seekStartedAt;\n this.seekStartedAt = null;\n this.stateMachineCallbacks[fnName](seekDuration, fnName, eventObject);\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (from === State.PAUSE && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.stateMachineCallbacks.pause(stateDuration, fnName);\n } else {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n callbackFunction(stateDuration, fnName, eventObject);\n } else {\n logger.error('Could not find callback function for ' + fnName);\n }\n }\n\n if (eventObject && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n }\n },\n onseek: (event, from, to, timestamp) => {\n this.seekStartedAt = this.seekStartedAt || timestamp;\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n this.stateMachineCallbacks.heartbeat(stateDuration, String(from).toLowerCase(), {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n public callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n exec.call(this.stateMachine, timestamp, eventObject);\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n public sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n}\n","import {MIMETypes} from './MIMETypes';\n\nconst {MP4, WEBM, HLS, DASH} = MIMETypes;\n\nconst mapping = {\n [MP4]: 'progressive',\n [WEBM]: 'progressive',\n [HLS]: 'hls',\n [DASH]: 'dash',\n};\n\nexport function getStreamTypeFromMIMEType(mimeType: string) {\n return mapping[mimeType];\n}\n","import {Bitmovin7Adapter} from '../adapters/Bitmovin7Adapter';\nimport {Bitmovin8Adapter} from '../adapters/Bitmovin8Adapter';\nimport {CAFv3Adapter} from '../adapters/CAFv3Adapter';\nimport {DashjsAdapter} from '../adapters/DashjsAdapter';\nimport {HlsAdapter} from '../adapters/HlsAdapter';\nimport {HTMLVideoElementAdapter} from '../adapters/HTMLVideoElementAdapter';\nimport {ShakaAdapter} from '../adapters/ShakaAdapter';\nimport {VideojsAdapter} from '../adapters/VideoJsAdapter';\nimport {CdnProvider} from '../enums/CDNProvider';\nimport {Player} from '../enums/Player';\nimport {VERSION} from '../Version';\n\n// tslint:disable-next-line:variable-name\nconst AnalyticsModule = {\n name: 'analytics',\n module: {\n Analytics: Bitmovin8Adapter,\n },\n hooks: {\n setup: (module: any, player: any) => {\n const config = player.getConfig();\n if (!config || config.analytics === false) {\n return Promise.resolve();\n }\n const analyticsModule = module.Analytics;\n const analyticsModuleInstance = new analyticsModule(player);\n return Promise.resolve(analyticsModuleInstance);\n },\n },\n};\n\nexport {Player as Players};\nexport {CdnProvider as CdnProviders};\nexport {AnalyticsModule as PlayerModule};\nexport {VERSION as version};\nexport {HlsAdapter};\nexport {Bitmovin8Adapter};\nexport {Bitmovin7Adapter};\nexport {VideojsAdapter};\nexport {CAFv3Adapter};\nexport {ShakaAdapter};\nexport {DashjsAdapter};\nexport {HTMLVideoElementAdapter};\nexport {adapters};\n\nconst adapters = {\n HlsAdapter,\n Bitmovin8Adapter,\n Bitmovin7Adapter,\n VideojsAdapter,\n ShakaAdapter,\n DashjsAdapter,\n CAFv3Adapter,\n HTMLVideoElementAdapter,\n};\n\nexport default {\n PlayerModule: AnalyticsModule,\n};\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {Bitmovin7InternalAdapter} from './internal/Bitmovin7InternalAdapter';\n\nexport class Bitmovin7Adapter extends Adapter implements AdapterAPI {\n constructor(player, opts?: AnalyticsStateMachineOptions) {\n super();\n this.augment(player, opts);\n }\n\n private augment(player, opts?: AnalyticsStateMachineOptions) {\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n\n const that = this;\n // decorate player to intercept setup\n const originalSetup = player.setup;\n\n // tslint:disable-next-line\n player.setup = function () {\n const playerSetupPromise = originalSetup.apply(player, arguments);\n\n if (arguments.length === 0) {\n return playerSetupPromise;\n }\n const config = arguments[0];\n const analyticsConfig = config.analytics;\n if (!analyticsConfig) {\n logger.error('Bitmovin Analytics: No analytics config provided!');\n return playerSetupPromise;\n }\n\n that.internalAdapter = new Bitmovin7InternalAdapter(player, opts);\n that.analytics = new Analytics(analyticsConfig, that.internalAdapter);\n (player as any).analytics = that.analytics;\n that.wrapPlayerLoad(player, that.analytics);\n\n return playerSetupPromise;\n };\n }\n\n private wrapPlayerLoad(player, analytics: Analytics) {\n const originalLoad = player.load;\n // tslint:disable-next-line\n player.load = function () {\n if (arguments.length > 0) {\n const analyticsConfig = arguments[0].analytics;\n // we reset the analytics and reload with a new config\n analytics.sourceChange(analyticsConfig);\n }\n\n return originalLoad.apply(player, arguments);\n };\n }\n}\n","import {logger} from '../utils/Logger';\nimport {Feature} from './Feature';\nimport {FeatureConfig} from './FeatureConfig';\n\nexport class FeatureManager<TConfigContainer> {\n private features: Array<Feature<TConfigContainer, FeatureConfig>> = [];\n\n public registerFeatures(features: Array<Feature<TConfigContainer, FeatureConfig>>) {\n this.features = features;\n }\n\n public unregisterFeatures() {\n this.features.forEach((feature) => feature.disable());\n this.features = [];\n }\n\n public resetFeatures() {\n this.features.forEach((feature) => feature.reset());\n }\n\n public configureFeatures(authenticated: boolean, featureConfigs?: TConfigContainer) {\n this.features = this.features.filter((feature) => {\n const config = feature.configure(authenticated, featureConfigs);\n if (!authenticated || config?.enabled !== true) {\n logger.log(`Disabling feature ${feature.constructor.name} as it isn't enabled according to license callback.`);\n feature.disable();\n return false;\n }\n return true;\n });\n this.features.forEach((feature) => feature.enabled());\n }\n}\n","const videoFormatCodecMap: {[format: string]: string[]} = {\n avc: ['video/mp4; codecs=\"avc1.42000a\"'],\n vp9: ['video/mp4; codecs=\"vp09.00.50.08\"'],\n av1: ['video/mp4; codecs=\"av01.0.08M.08\"'],\n hevc: ['video/mp4; codecs=\"hev1.1.6.L93.B0\"'],\n};\n\nexport class CodecHelper {\n public static get supportedVideoFormats(): string[] | undefined {\n if (!('MediaSource' in window)) {\n return undefined;\n }\n const codecs = Object.getOwnPropertyNames(videoFormatCodecMap).filter((format) =>\n videoFormatCodecMap[format].some((codec) => this.isCodecSupported(codec))\n );\n return codecs;\n }\n\n public static isCodecSupported(codec: string): boolean {\n if (!('MediaSource' in window)) {\n return false;\n }\n\n return MediaSource.isTypeSupported(codec);\n }\n}\n","export enum PAGE_LOAD_TYPE {\n FOREGROUND = 1,\n BACKGROUND = 2,\n}\n","import {\n Ad,\n AdBreak,\n AdBreakEvent,\n AdClickedEvent,\n AdEvent,\n AdLinearityChangedEvent,\n AdManifestLoadedEvent,\n AdQuartileEvent,\n AdTagConfig,\n ErrorEvent,\n} from 'bitmovin-player';\nimport {AdModuleAPI} from '../adapters/internal/ads/AdModuleAPI';\nimport {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport * as Utils from '../utils/Utils';\nimport {ViewportTracker} from '../utils/ViewportTracker';\nimport {Analytics} from './Analytics';\n\nenum AdQuartile {\n FIRST_QUARTILE = 'firstQuartile',\n MIDPOINT = 'midpoint',\n THIRD_QUARTILE = 'thirdQuartile',\n}\n\ndeclare var __VERSION__: any;\n\nexport class AdAnalytics {\n public static readonly MODULE_NAME = 'ads';\n private static readonly TIMEOUT_CURRENT_TIME_INTERVAL = 100;\n\n private onBeforeUnLoadEvent: boolean = false;\n private analytics: Analytics;\n private adapter: AdModuleAPI;\n private viewportTracker: ViewportTracker;\n\n private activeAdBreakSample?: AdBreakSample;\n private activeAdSample?: AdSample;\n\n private adManifestLoadedEvents: AdManifestLoadedEvent[] = [];\n private adStartupTimestamp?: number;\n private beginPlayingTimestamp?: number;\n private enterViewportTimestamp?: number;\n private isPlaying: boolean = false;\n private currentTime?: number;\n private currentTimeInterval?: number;\n private adPodPosition: number = 0;\n\n constructor(analytics: Analytics, adapter: AdModuleAPI) {\n this.analytics = analytics;\n this.adapter = adapter;\n\n this.adapter.adCallbacks.onAdStarted = (event) => this.onAdStarted(event);\n this.adapter.adCallbacks.onAdFinished = (event) => this.onAdFinished(event);\n this.adapter.adCallbacks.onAdBreakStarted = (event) => this.onAdBreakStarted(event);\n this.adapter.adCallbacks.onAdBreakFinished = (event) => this.onAdBreakFinished(event);\n this.adapter.adCallbacks.onAdClicked = (event) => this.onAdClicked(event);\n this.adapter.adCallbacks.onAdError = (event) => this.onAdError(event);\n this.adapter.adCallbacks.onAdManifestLoaded = (event) => this.onAdManifestLoaded(event);\n this.adapter.adCallbacks.onPlay = () => this.onPlay();\n this.adapter.adCallbacks.onPause = () => this.onPause();\n this.adapter.adCallbacks.onBeforeUnload = () => this.onBeforeUnload();\n this.adapter.adCallbacks.onAdSkipped = (event) => this.onAdSkipped(event);\n this.adapter.adCallbacks.onAdQuartile = (event) => this.onAdQuartile(event);\n\n this.viewportTracker = new ViewportTracker(this.adapter.getContainer(), () => this.onIntersectionChanged(), 0.5);\n }\n\n public release() {\n this.clearCurrentTimeInterval();\n this.viewportTracker.dispose();\n }\n\n public onIntersectionChanged() {\n if (!this.activeAdSample) {\n return;\n }\n if (this.isContainerInViewport()) {\n this.enterViewportTimestamp = Utils.getCurrentTimestamp();\n } else {\n if (this.enterViewportTimestamp) {\n this.activeAdSample.timeInViewport =\n (this.activeAdSample.timeInViewport || 0) + Utils.getCurrentTimestamp() - this.enterViewportTimestamp;\n }\n }\n }\n\n public isContainerInViewport(): boolean {\n return this.viewportTracker ? this.viewportTracker.isInViewport() : true;\n }\n\n public onPlay() {\n if (this.adapter && this.adapter.isLinearAdActive() && this.activeAdSample) {\n const timestamp = Utils.getCurrentTimestamp();\n this.beginPlayingTimestamp = timestamp;\n this.enterViewportTimestamp = timestamp;\n this.isPlaying = true;\n }\n }\n\n public onPause() {\n if (this.adapter && this.adapter.isLinearAdActive() && this.activeAdSample) {\n this.updatePlayingTime(this.activeAdSample);\n this.isPlaying = false;\n }\n }\n\n public onAdManifestLoaded(event: AdManifestLoadedEvent) {\n const adTagConfig = event.adConfig as AdTagConfig;\n if (adTagConfig && adTagConfig.tag && adTagConfig.tag.type === 'vmap') {\n this.sendAnalyticsRequest(new AdBreakSample(event.adConfig, event));\n } else if (event.adBreak) {\n this.adManifestLoadedEvents.push(event);\n }\n }\n\n public onAdBreakStarted(event: AdBreakEvent) {\n this.adPodPosition = 0;\n this.activeAdBreakSample = new AdBreakSample(event.adBreak, this.getAdManifestLoadedEvent(event.adBreak));\n this.adStartupTimestamp = Utils.getCurrentTimestamp();\n }\n\n public onAdBreakFinished(event: AdBreakEvent) {\n this.resetActiveAd();\n this.activeAdBreakSample = undefined;\n }\n\n public onAdStarted(event: AdEvent) {\n if (!event.ad.isLinear) {\n return;\n }\n\n this.resetActiveAd();\n this.activeAdSample = new AdSample(event.ad);\n this.currentTime = undefined;\n this.activeAdSample.adStartupTime = this.adStartupTimestamp\n ? Utils.getCurrentTimestamp() - this.adStartupTimestamp\n : undefined;\n\n this.startAd(this.activeAdSample);\n }\n\n public onAdFinished(event: AdEvent) {\n if (!this.activeAdBreakSample || !this.activeAdSample) {\n return;\n }\n\n const adSample = {...this.activeAdSample};\n adSample.completed = 1;\n this.resetActiveAd();\n this.completeAd(this.activeAdBreakSample, adSample, adSample.adDuration);\n }\n\n public onAdSkipped(event: AdEvent) {\n if (!this.activeAdBreakSample || !this.activeAdSample) {\n return;\n }\n\n const adSample = {...this.activeAdSample};\n adSample.skipped = 1;\n adSample.skipPosition = this.currentTime;\n adSample.skipPercentage = Utils.calculatePercentage(\n this.activeAdSample.skipPosition,\n this.activeAdSample.adDuration\n );\n this.resetActiveAd();\n this.completeAd(this.activeAdBreakSample, adSample, adSample.skipPosition);\n }\n\n public onAdError(event: ErrorEvent) {\n const {adConfig, adBreak, code, message} = event.data || {\n adBreak: undefined,\n adConfig: undefined,\n code: undefined,\n message: undefined,\n };\n\n const adBreakSample = new AdBreakSample(\n adBreak || adConfig,\n adBreak ? this.getAdManifestLoadedEvent(adBreak) : undefined\n );\n\n adBreakSample.errorCode = code || event.code;\n adBreakSample.errorData = JSON.stringify(event.data);\n adBreakSample.errorMessage = message || event.name;\n\n let adSample;\n let errorPosition;\n if (\n this.activeAdSample &&\n adBreak &&\n adBreak.ads &&\n (adBreak.ads as any[]).includes((ad: Ad) => ad.id === (this.activeAdSample as AdSample).adId)\n ) {\n adSample = this.activeAdSample;\n errorPosition = adSample.errorPosition = this.currentTime;\n adSample.errorPercentage = Utils.calculatePercentage(adSample.errorPosition, adSample.adDuration);\n }\n this.completeAd(adBreakSample, adSample, errorPosition);\n }\n\n public onAdLinearityChanged(event: AdLinearityChangedEvent) {}\n\n public onAdClicked(event: AdClickedEvent) {\n if (!this.activeAdSample) {\n return;\n }\n this.activeAdSample.adClickthroughUrl = event.clickThroughUrl;\n this.activeAdSample.clicked = 1;\n this.activeAdSample.clickPosition = this.currentTime;\n this.activeAdSample.clickPercentage = Utils.calculatePercentage(\n this.activeAdSample.clickPosition,\n this.activeAdSample.adDuration\n );\n }\n\n public onAdQuartile(event: AdQuartileEvent) {\n if (!this.activeAdSample) {\n return;\n }\n if (event.quartile === AdQuartile.FIRST_QUARTILE) {\n this.activeAdSample.quartile1 = 1;\n } else if (event.quartile === AdQuartile.MIDPOINT) {\n this.activeAdSample.midpoint = 1;\n } else if (event.quartile === AdQuartile.THIRD_QUARTILE) {\n this.activeAdSample.quartile3 = 1;\n }\n }\n\n public onBeforeUnload() {\n if (this.onBeforeUnLoadEvent) {\n return;\n }\n this.onBeforeUnLoadEvent = true;\n if (!this.activeAdSample || !this.activeAdBreakSample) {\n return;\n }\n\n const adSample = {...this.activeAdSample};\n adSample.closed = 1;\n adSample.closePosition = this.currentTime;\n adSample.closePercentage = Utils.calculatePercentage(adSample.closePosition, adSample.adDuration);\n this.resetActiveAd();\n this.completeAd(this.activeAdBreakSample, adSample, adSample.closePosition);\n }\n\n public createNewAdAnalyticsSample(analyticsSample: Sample): AdAnalyticsSample {\n const moduleInfo = this.adapter.getAdModuleInfo();\n return {\n ...new AdAnalyticsSample(analyticsSample),\n analyticsVersion: __VERSION__,\n adModule: moduleInfo.name,\n adModuleVersion: moduleInfo.version,\n playerStartupTime: this.analytics.playerStartupTime,\n pageLoadTime: this.analytics.pageLoadTime,\n autoplay: this.analytics.autoplay,\n pageLoadType: Utils.getPageLoadType(),\n };\n }\n\n private getAdManifestLoadedEvent(adBreak: AdBreak) {\n if (!adBreak) {\n return undefined;\n }\n return this.adManifestLoadedEvents.find((i) => i.adBreak && i.adBreak.id === adBreak.id);\n }\n\n private sendAnalyticsRequest(adBreakSample: AdBreakSample, adSample?: AdSample) {\n const sample = {\n ...this.createNewAdAnalyticsSample(this.analytics.sample),\n ...adBreakSample,\n ...(adSample || new AdSample()),\n };\n sample.time = Utils.getCurrentTimestamp();\n sample.adImpressionId = Utils.generateUUID();\n sample.percentageInViewport = Utils.calculatePercentage(sample.timeInViewport, sample.timePlayed);\n this.analytics.backend.sendAdRequest(sample);\n }\n\n private updatePlayingTime(adSample: AdSample) {\n const timestamp = Utils.getCurrentTimestamp();\n if (this.beginPlayingTimestamp && this.isPlaying) {\n if (adSample.timePlayed !== undefined) {\n adSample.timePlayed += timestamp - this.beginPlayingTimestamp;\n }\n if (this.isContainerInViewport() && this.enterViewportTimestamp && adSample.timeInViewport !== undefined) {\n adSample.timeInViewport += timestamp - this.enterViewportTimestamp;\n }\n }\n }\n\n private startAd(adSample: AdSample) {\n adSample.started = 1;\n adSample.timePlayed = 0;\n adSample.timeInViewport = 0;\n adSample.adPodPosition = this.adPodPosition;\n const timestamp = Utils.getCurrentTimestamp();\n this.beginPlayingTimestamp = timestamp;\n this.enterViewportTimestamp = this.isContainerInViewport() ? timestamp : undefined;\n this.isPlaying = true;\n this.currentTime = 0;\n this.adPodPosition++;\n this.currentTimeInterval = window.setInterval(() => {\n try {\n if (\n adSample &&\n adSample.adDuration !== undefined &&\n adSample.adDuration > 0 &&\n this.adapter.isLinearAdActive()\n ) {\n this.currentTime = Utils.calculateTime(Math.max(this.adapter.currentTime(), 0));\n }\n } catch (e) {\n logger.log('AdStarted monitoring interval failed and got cleared', e);\n this.resetActiveAd();\n }\n }, AdAnalytics.TIMEOUT_CURRENT_TIME_INTERVAL);\n }\n\n private completeAd(adBreakSample: AdBreakSample, adSample: AdSample = new AdSample(), exitPosition?: number) {\n adSample.exitPosition = exitPosition;\n adSample.playPercentage = Utils.calculatePercentage(adSample.exitPosition, adSample.adDuration);\n\n // reset startupTimestamp for the next ad, in case there are multiple ads in one ad break\n this.adStartupTimestamp = Utils.getCurrentTimestamp();\n this.updatePlayingTime(adSample);\n this.isPlaying = false;\n this.sendAnalyticsRequest(adBreakSample, adSample);\n }\n\n private resetActiveAd() {\n this.clearCurrentTimeInterval();\n this.activeAdSample = undefined;\n }\n\n private clearCurrentTimeInterval() {\n window.clearInterval(this.currentTimeInterval);\n delete this.currentTime;\n }\n}\n","import * as Utils from '../utils/Utils';\nimport {CustomDataValues} from './CustomDataValues';\nimport {Sample} from './Sample';\n\nexport class AdAnalyticsSample implements CustomDataValues {\n public adModule?: string;\n public adModuleVersion?: string;\n public videoImpressionId?: string;\n public userAgent?: string;\n public language?: string;\n public cdnProvider?: string;\n public customData1?: string;\n public customData2?: string;\n public customData3?: string;\n public customData4?: string;\n public customData5?: string;\n public customData6?: string;\n public customData7?: string;\n public customData8?: string;\n public customData9?: string;\n public customData10?: string;\n public customData11?: string;\n public customData12?: string;\n public customData13?: string;\n public customData14?: string;\n public customData15?: string;\n public customData16?: string;\n public customData17?: string;\n public customData18?: string;\n public customData19?: string;\n public customData20?: string;\n public customData21?: string;\n public customData22?: string;\n public customData23?: string;\n public customData24?: string;\n public customData25?: string;\n public customUserId?: string;\n public experimentName?: string;\n public domain?: string;\n public key?: string;\n public path?: string;\n public player?: string;\n public playerKey?: string;\n public playerTech?: string;\n public screenHeight?: number;\n public screenWidth?: number;\n public version?: string;\n public size?: string;\n public userId?: string;\n public videoId?: string;\n public videoTitle?: string;\n public videoWindowHeight?: number;\n public videoWindowWidth?: number;\n public playerStartupTime?: number;\n public analyticsVersion?: string;\n public pageLoadTime?: number;\n public pageLoadType?: number;\n public autoplay?: boolean;\n public platform: string = 'web';\n public audioCodec?: string;\n public videoCodec?: string;\n\n constructor(sample?: Sample) {\n if (!sample) {\n return;\n }\n this.videoImpressionId = sample.impressionId;\n this.userAgent = sample.userAgent;\n this.language = sample.language;\n this.cdnProvider = sample.cdnProvider;\n\n Utils.transferCustomDataFields(sample, this);\n\n this.customUserId = sample.customUserId;\n this.domain = sample.domain;\n this.experimentName = sample.experimentName;\n this.key = sample.key;\n this.path = sample.path;\n this.player = sample.player;\n this.playerKey = sample.playerKey;\n this.playerTech = sample.playerTech;\n this.screenHeight = sample.screenHeight;\n this.screenWidth = sample.screenWidth;\n this.version = sample.version;\n this.size = sample.size;\n this.userId = sample.userId;\n this.videoId = sample.videoId;\n this.videoTitle = sample.videoTitle;\n this.videoWindowHeight = sample.videoWindowHeight;\n this.videoWindowWidth = sample.videoWindowWidth;\n this.audioCodec = sample.audioCodec;\n this.videoCodec = sample.videoCodec;\n }\n}\n","import {AdBreak, AdBreakConfig, AdConfig, AdManifestLoadedEvent, AdTagConfig} from 'bitmovin-player';\nimport * as Utils from '../utils/Utils';\n\nexport class AdBreakSample {\n public adPosition?: string;\n public adOffset?: string;\n public adScheduleTime?: number;\n public adReplaceContentDuration?: number;\n public adPreloadOffset?: number;\n public adTagPath?: string;\n public adTagServer?: string;\n public adTagType?: string;\n public adTagUrl?: string;\n public adIsPersistent?: boolean;\n public adIdPlayer?: string;\n public manifestDownloadTime?: number;\n public errorCode?: number;\n public errorData?: string;\n public errorMessage?: string;\n public adFallbackIndex: number = 0;\n\n constructor(adConfig?: AdConfig, adManifestLoadedEvent?: AdManifestLoadedEvent) {\n if (adManifestLoadedEvent) {\n this.manifestDownloadTime = Utils.calculateTime(adManifestLoadedEvent.downloadTiming.downloadTime);\n }\n\n if (adConfig) {\n this.adReplaceContentDuration = Utils.calculateTimeWithUndefined(adConfig.replaceContentDuration);\n this.adFallbackIndex = ((adConfig as any).currentFallbackIndex || -1) + 1;\n }\n\n const adBreakConfig = adConfig as AdBreakConfig;\n if (adBreakConfig) {\n if (adBreakConfig.position === 'pre' || adBreakConfig.position === 'post') {\n this.adPosition = adBreakConfig.position;\n } else {\n this.adPosition = 'mid';\n this.adOffset = adBreakConfig.position;\n }\n\n this.adPreloadOffset = Utils.calculateTimeWithUndefined(adBreakConfig.preloadOffset);\n }\n\n const adTagConfig = adConfig as AdTagConfig;\n if (adTagConfig) {\n this.adIsPersistent = adTagConfig.persistent;\n let tag = adTagConfig.tag;\n if (\n this.adFallbackIndex > 0 &&\n adTagConfig.fallbackTags &&\n adTagConfig.fallbackTags.length >= this.adFallbackIndex\n ) {\n tag = adTagConfig.fallbackTags[this.adFallbackIndex - 1];\n }\n if (tag) {\n this.adTagType = tag.type;\n this.adTagUrl = tag.url;\n }\n if (this.adTagUrl) {\n const adTagDetails = Utils.getHostnameAndPathFromUrl(this.adTagUrl);\n this.adTagServer = adTagDetails.hostname;\n this.adTagPath = adTagDetails.path;\n }\n }\n\n const adBreak = adConfig as AdBreak;\n if (adBreak) {\n this.adScheduleTime = Utils.calculateTimeWithUndefined(adBreak.scheduleTime);\n this.adIdPlayer = adBreak.id;\n }\n }\n}\n","import {Ad, LinearAd, VastAdData} from 'bitmovin-player';\nimport * as Utils from '../utils/Utils';\n\nexport class AdSample {\n private static parseSkipAfter(skipAfter?: number) {\n if (skipAfter === undefined) {\n return undefined;\n }\n if (skipAfter === -1) {\n return skipAfter;\n }\n return Utils.calculateTime(skipAfter);\n }\n\n public wrapperAdsCount?: number;\n public adSkippable?: boolean;\n public adSkippableAfter?: number;\n public adClickthroughUrl?: string;\n public adDescription?: string;\n public adDuration?: number;\n public adId?: string;\n public adImpressionId?: string;\n public adPlaybackHeight?: number;\n public adPlaybackWidth?: number;\n public adStartupTime?: number;\n public adSystem?: string;\n public adTitle?: string;\n public advertiserName?: string;\n public apiFramework?: string;\n public audioBitrate?: number;\n public clicked: number = 0;\n public clickPosition?: number;\n public closed: number = 0;\n public closePosition?: number;\n public completed: number = 0;\n public creativeAdId?: string;\n public creativeId?: string;\n public dealId?: string;\n public isLinear?: boolean;\n public mediaPath?: string;\n public mediaServer?: string;\n public mediaUrl?: string;\n public midpoint: number = 0;\n public minSuggestedDuration?: number;\n public percentageInViewport?: number;\n public quartile1: number = 0;\n public quartile3: number = 0;\n public skipped: number = 0;\n public skipPosition?: number;\n public started: number = 0;\n public streamFormat?: string;\n public surveyUrl?: string;\n public time?: number;\n public timeHovered?: number;\n public timeInViewport?: number;\n public timePlayed?: number;\n public timeUntilHover?: number;\n public universalAdIdRegistry?: string;\n public universalAdIdValue?: string;\n public videoBitrate?: number;\n public adPodPosition?: number;\n public exitPosition?: number;\n public playPercentage?: number;\n public skipPercentage?: number;\n public clickPercentage?: number;\n public closePercentage?: number;\n public errorPosition?: number;\n public errorPercentage?: number;\n public timeToContent?: number;\n public timeFromContent?: number;\n\n constructor(ad?: Ad) {\n if (ad) {\n this.adClickthroughUrl = ad.clickThroughUrl;\n this.adId = ad.id;\n this.mediaUrl = ad.mediaFileUrl;\n const mediaUrlDetails = Utils.getHostnameAndPathFromUrl(this.mediaUrl || '');\n this.mediaPath = mediaUrlDetails.path;\n this.mediaServer = mediaUrlDetails.hostname;\n this.isLinear = ad.isLinear;\n this.adPlaybackHeight = ad.height;\n this.adPlaybackWidth = ad.width;\n\n if (ad.data) {\n this.videoBitrate = ad.data.bitrate === undefined ? undefined : ad.data.bitrate * 1000;\n this.streamFormat = ad.data.mimeType;\n // data.minBitrate\n // data.maxBitrate\n }\n\n const data = ad.data as VastAdData;\n if (data) {\n if (data.adSystem) {\n this.adSystem = data.adSystem.name;\n // this.adSystemVersion = data.adSystem.version;\n }\n if (data.advertiser) {\n this.advertiserName = data.advertiser.name;\n // this.advertiserId = data.advertiser.id;\n }\n // data.codec\n // data.delivery\n // data.pricing\n this.apiFramework = data.apiFramework;\n\n if (data.creative) {\n this.creativeAdId = data.creative.adId;\n this.creativeId = data.creative.id;\n\n if (data.creative.universalAdId) {\n this.universalAdIdRegistry = data.creative.universalAdId.idRegistry;\n this.universalAdIdValue = data.creative.universalAdId.value;\n }\n }\n this.adDescription = data.adDescription;\n this.minSuggestedDuration = Utils.calculateTimeWithUndefined(data.minSuggestedDuration);\n if (data.survey) {\n this.surveyUrl = data.survey.uri;\n // data.survey.type;\n }\n this.adTitle = data.adTitle;\n this.wrapperAdsCount = data.wrapperAdIds ? data.wrapperAdIds.length : 0;\n }\n }\n const linearAd = ad as LinearAd;\n if (linearAd) {\n this.adSkippableAfter = AdSample.parseSkipAfter(linearAd.skippableAfter);\n this.adSkippable =\n linearAd.skippable || (this.adSkippableAfter === undefined ? undefined : this.adSkippableAfter >= 0);\n this.adDuration = Utils.calculateTime(linearAd.duration);\n }\n }\n}\n","import {logger} from './Logger';\nimport * as Utils from './Utils';\n\nexport class ViewportTracker {\n private onIntersectionChanged: () => void;\n private observer?: IntersectionObserver;\n private element: HTMLElement;\n private inViewport?: boolean = undefined;\n private threshold: number;\n private hidden: string | undefined;\n private visibilityChange?: string;\n\n constructor(element: HTMLElement, onIntersectionChanged: () => void, threshold: number = 1.0) {\n this.threshold = threshold;\n this.onIntersectionChanged = onIntersectionChanged;\n this.element = element;\n\n try {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: '0px',\n threshold,\n };\n this.observer = new IntersectionObserver((entries, observer) => this.handleIntersect(entries, observer), options);\n this.observer.observe(element);\n } catch (error) {\n logger.log(\"Couldn't create instance of IntersectionObserver. timeInViewport will always be reported as 100%.\");\n }\n\n this.hidden = Utils.getHiddenProp();\n if (this.hidden) {\n this.visibilityChange = this.hidden.replace('hidden', '') + 'visibilitychange';\n document.addEventListener(\n this.visibilityChange,\n (this.handleVisibilityChange = this.handleVisibilityChange.bind(this)),\n false\n );\n }\n }\n\n public isHidden() {\n return this.hidden && document[this.hidden];\n }\n\n public isInViewport(): boolean {\n return !this.isHidden() && (this.inViewport == null ? true : this.inViewport);\n }\n\n public dispose() {\n if (this.observer) {\n this.observer.unobserve(this.element);\n this.observer.disconnect();\n }\n if (this.visibilityChange) {\n document.removeEventListener(this.visibilityChange, this.handleVisibilityChange, false);\n }\n }\n\n private handleVisibilityChange() {\n this.onIntersectionChanged();\n }\n\n private handleIntersect(entries: IntersectionObserverEntry[], observer: IntersectionObserver) {\n entries.forEach((i) => {\n if (i.target === this.element) {\n this.inViewport = !(i.intersectionRatio < this.threshold);\n }\n });\n this.onIntersectionChanged();\n }\n}\n","import {DeferredLicenseLoadingAdapterAPI} from '../adapters/internal/DeferredLicenseLoadingAdapterAPI';\nimport {AnalyticsConfig, CollectorConfig} from '../types/AnalyticsConfig';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {LicensingRequest} from '../types/LicensingRequest';\nimport {LicenseCall} from '../utils/LicenseCall';\nimport {ANALYTICS_BACKEND_BASE_URL} from '../utils/Settings';\nimport {Backend} from './Backend';\nimport {DebuggingBackend} from './DebuggingBackend';\nimport {LicenseCheckingBackend} from './LicenseCheckingBackend';\nimport {LongPlaytimeFilteringBackend} from './LongPlaytimeFilteringBackend';\nimport {NoOpBackend} from './NoOpBackend';\nimport {SequenceNumberBackend} from './SequenceNumberBackend';\n\ninterface InternalCollectorConfig extends CollectorConfig {\n wrapBackend: (innerBackend: Backend) => Backend;\n}\n\nexport class BackendFactory {\n public createBackend(\n analyticsConfig: AnalyticsConfig,\n licensingRequest: LicensingRequest,\n adapter: DeferredLicenseLoadingAdapterAPI,\n authenticationCallback: AuthenticationCallback\n ): Backend {\n if (!this.isEnabled(analyticsConfig)) {\n return new NoOpBackend();\n }\n const inner = this.createInnerBackend(analyticsConfig, licensingRequest, adapter, authenticationCallback);\n return this.decorateWithDebuggingBackend(analyticsConfig, inner);\n }\n\n private decorateWithDebuggingBackend(config: AnalyticsConfig, backend: Backend): Backend {\n if (config.debug) {\n return new DebuggingBackend(config, backend);\n }\n return backend;\n }\n\n private decorateWithBackendFromConfigIfAvailable(analyticsConfig: AnalyticsConfig, innerBackend: Backend): Backend {\n if (\n analyticsConfig !== undefined &&\n analyticsConfig.config !== undefined &&\n (analyticsConfig.config as InternalCollectorConfig).wrapBackend !== undefined\n ) {\n return (analyticsConfig.config as InternalCollectorConfig).wrapBackend(innerBackend);\n }\n\n return innerBackend;\n }\n\n private isEnabled(analyticsConfig: AnalyticsConfig): boolean {\n return analyticsConfig.config === undefined || analyticsConfig.config.enabled !== false;\n }\n\n private createInnerBackend(\n analyticsConfig: AnalyticsConfig,\n licensingRequest: LicensingRequest,\n adapter: DeferredLicenseLoadingAdapterAPI,\n authenticationCallback: AuthenticationCallback\n ): Backend {\n const backendUrl = (analyticsConfig.config && analyticsConfig.config.backendUrl) || ANALYTICS_BACKEND_BASE_URL;\n let innerBackend: Backend = new LicenseCheckingBackend(\n licensingRequest,\n LicenseCall,\n backendUrl,\n adapter,\n authenticationCallback\n );\n innerBackend = this.decorateWithBackendFromConfigIfAvailable(analyticsConfig, innerBackend);\n\n const sequenceNumberAssigningBackend = new SequenceNumberBackend(innerBackend);\n return new LongPlaytimeFilteringBackend(sequenceNumberAssigningBackend);\n }\n}\n","import {LicensingResponse} from '../types/LicensingRequest';\nimport {post} from './Http';\nimport {joinUrls} from './Utils';\n\nexport function LicenseCall(key: string, domain: string, version: string, baseUrl: string): Promise<LicensingResponse> {\n const licenseServerUrl = joinUrls(baseUrl, '/licensing');\n const licensingRequest = {\n analyticsVersion: version,\n domain,\n key,\n };\n\n return new Promise<LicensingResponse>((resolve) => {\n post(licenseServerUrl, licensingRequest, (response) => {\n resolve(response);\n });\n });\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsDebugConfig} from '../types/AnalyticsDebugConfig';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport {Backend} from './Backend';\n\nexport class DebuggingBackend implements Backend {\n private underlying: Backend;\n private debugFields?: string[];\n\n constructor(config: AnalyticsConfig, underlying: Backend) {\n this.underlying = underlying;\n if (config.debug && (config.debug as AnalyticsDebugConfig).fields) {\n this.debugFields = (config.debug as AnalyticsDebugConfig).fields;\n }\n }\n\n public sendRequest(sample: Sample) {\n this.printFields(sample);\n this.underlying.sendRequest(sample);\n }\n\n public sendUnloadRequest(sample: Sample) {\n this.printFields(sample);\n this.underlying.sendUnloadRequest(sample);\n }\n\n public sendRequestSynchronous(sample: Sample) {\n this.printFields(sample);\n this.underlying.sendRequestSynchronous(sample);\n }\n\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.underlying.sendAdRequest(sample);\n }\n\n private printFields(sample: Sample) {\n if (this.debugFields && this.debugFields.length) {\n const fields = {};\n this.debugFields.forEach((f) => (fields[f] = sample[f]));\n logger.logTable([fields]);\n }\n }\n}\n","import {DeferredLicenseLoadingAdapterAPI} from '../adapters/internal/DeferredLicenseLoadingAdapterAPI';\nimport {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {AuthenticationCallback} from '../types/AuthenticationCallback';\nimport {LicenseCallFunc, LicensingRequest, LicensingResponse, LicensingResult} from '../types/LicensingRequest';\nimport {Sample} from '../types/Sample';\nimport {logger} from '../utils/Logger';\nimport {ANALYTICS_LICENSECALL_TIMEOUT} from '../utils/Settings';\nimport {Backend} from './Backend';\nimport {NoOpBackend} from './NoOpBackend';\nimport {QueueBackend} from './QueueBackend';\nimport {RemoteBackend} from './RemoteBackend';\n\nexport class LicenseCheckingBackend implements Backend {\n public promise?: Promise<LicensingResponse>;\n private licenseLazyLoadingTimeoutHandle?: number;\n private backend: Backend;\n private info: LicensingRequest;\n\n constructor(\n info: LicensingRequest,\n private licenseCall: LicenseCallFunc,\n private backendBaseUrl: string,\n private adapter: DeferredLicenseLoadingAdapterAPI,\n private authenticationCallback: AuthenticationCallback\n ) {\n this.info = {...info};\n this.backend = new QueueBackend();\n this.licenseCall = licenseCall;\n\n if (info.key !== undefined && info.key !== '') {\n this.promise = this.wrapLicenseCheckPromiseWithCallback(this.performLicenseCheck(), this.authenticationCallback);\n } else if (adapter.supportsDeferredLicenseLoading === true) {\n adapter.onLicenseKeyReceived.subscribe(this.licenseKeyReceived);\n adapter.onLicenseCallFailed.subscribe(this.licenseCallFailed);\n this.licenseLazyLoadingTimeoutHandle = window.setTimeout(\n this.licenseLazyLoadingTimeout,\n ANALYTICS_LICENSECALL_TIMEOUT\n );\n } else {\n authenticationCallback.authenticationCompleted(false, undefined);\n this.backend = new NoOpBackend();\n }\n }\n\n public performLicenseCheck(): Promise<LicensingResponse> {\n const {key, domain, version} = this.info;\n if (!key || key === '') {\n const error: LicensingResponse = {\n status: LicensingResult.Denied,\n message: 'No license key provided',\n };\n this.backend = new NoOpBackend();\n return Promise.resolve(error);\n }\n\n return this.licenseCall(key, domain, version, this.backendBaseUrl)\n .then((result) => {\n if (result.status === LicensingResult.Granted) {\n const remoteBackend = new RemoteBackend(true, this.backendBaseUrl, key);\n (this.backend as QueueBackend).flushTo(remoteBackend);\n this.backend = remoteBackend;\n } else {\n throw new Error(result.message);\n }\n return result;\n })\n .catch((err: Error) => {\n if (err.message === 'Ignoring Impression due to DNT Header being set') {\n logger.error('License Check for Bitmovin Analytics failed because of', err);\n } else {\n logger.errorMessageToUser('License Check for Bitmovin Analytics failed because of', err);\n }\n this.backend = new NoOpBackend();\n return {\n status: LicensingResult.Denied,\n message: err.message,\n };\n });\n }\n\n public sendRequest(sample: Sample) {\n this.backend.sendRequest(sample);\n }\n public sendUnloadRequest(sample: Sample) {\n this.backend.sendUnloadRequest(sample);\n }\n public sendRequestSynchronous(sample: Sample) {\n this.backend.sendRequestSynchronous(sample);\n }\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.backend.sendAdRequest(sample);\n }\n\n private licenseKeyReceived = (eventArgs: {licenseKey: string}) => {\n clearTimeout(this.licenseLazyLoadingTimeoutHandle);\n this.unsubscribeFromAdapter();\n this.info.key = eventArgs.licenseKey;\n this.promise = this.wrapLicenseCheckPromiseWithCallback(this.performLicenseCheck(), this.authenticationCallback);\n };\n\n private licenseCallFailed = () => {\n clearTimeout(this.licenseLazyLoadingTimeoutHandle);\n this.unsubscribeFromAdapter();\n this.backend = new NoOpBackend();\n this.authenticationCallback.authenticationCompleted(false, undefined);\n };\n\n private licenseLazyLoadingTimeout = () => {\n this.unsubscribeFromAdapter();\n this.backend = new NoOpBackend();\n this.authenticationCallback.authenticationCompleted(false, undefined);\n };\n\n private unsubscribeFromAdapter() {\n this.adapter.onLicenseKeyReceived.unsubscribe(this.licenseKeyReceived);\n this.adapter.onLicenseCallFailed.unsubscribe(this.licenseCallFailed);\n }\n\n private wrapLicenseCheckPromiseWithCallback(\n promise: Promise<LicensingResponse>,\n authenticationCallback: AuthenticationCallback\n ): Promise<LicensingResponse> {\n return promise.then((response) => {\n authenticationCallback.authenticationCompleted(response.status === LicensingResult.Granted, response.features);\n return response;\n });\n }\n}\n","import {FeatureConfigContainer} from './FeatureConfigContainer';\n\nexport interface LicensingRequest {\n key?: string;\n domain: string;\n version: string;\n}\n\nexport enum LicensingResult {\n Granted = 'granted',\n Denied = 'denied',\n Skip = 'skip',\n}\n\nexport interface LicensingResponse {\n status: LicensingResult;\n message: string;\n features?: FeatureConfigContainer;\n}\n\nexport type LicenseCallFunc = (\n key: string,\n domain: string,\n version: string,\n baseUrl: string\n) => Promise<LicensingResponse>;\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {Backend} from './Backend';\n\nexport class QueueBackend implements Backend {\n public queue: Sample[] = [];\n public unloadQueue: Sample[] = [];\n public syncQueue: Sample[] = [];\n public adQueue: Array<AdSample & AdBreakSample & AdAnalyticsSample> = [];\n\n public sendRequest(sample: Sample) {\n this.queue.push(sample);\n }\n public sendUnloadRequest(sample: Sample) {\n this.unloadQueue.push(sample);\n }\n public sendRequestSynchronous(sample: Sample) {\n this.syncQueue.push(sample);\n }\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.adQueue.push(sample);\n }\n\n public flushTo(backend: Backend) {\n this.queue.forEach((e) => {\n backend.sendRequest(e);\n });\n this.unloadQueue.forEach((e) => {\n backend.sendUnloadRequest(e);\n });\n this.syncQueue.forEach((e) => {\n backend.sendRequestSynchronous(e);\n });\n this.adQueue.forEach((e) => {\n backend.sendAdRequest(e);\n });\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {AnalyticsCall} from '../utils/AnalyticsCall';\nimport {noOp} from '../utils/Utils';\nimport {Backend} from './Backend';\n\nexport class RemoteBackend implements Backend {\n public analyticsCall: AnalyticsCall;\n public hasAdModule: boolean;\n\n constructor(hasAdModule: boolean, backendBaseUrl: string, private licenseKey: string) {\n this.hasAdModule = hasAdModule;\n this.analyticsCall = new AnalyticsCall(backendBaseUrl);\n }\n\n public sendRequest(sample: Sample) {\n sample.key = this.licenseKey;\n this.analyticsCall.sendRequest(sample, noOp);\n }\n\n public sendUnloadRequest(sample: Sample) {\n sample.key = this.licenseKey;\n this.analyticsCall.sendUnloadRequest(sample);\n }\n\n public sendRequestSynchronous(sample: Sample) {\n sample.key = this.licenseKey;\n this.analyticsCall.sendRequestSynchronous(sample, noOp);\n }\n\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n sample.key = this.licenseKey;\n if (!this.hasAdModule) {\n return;\n }\n this.analyticsCall.sendAdRequest(sample);\n }\n}\n","import {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {noOp} from '../utils/Utils';\nimport {post} from './Http';\nimport {joinUrls} from './Utils';\n\nexport class AnalyticsCall {\n private analyticsServerUrl: string;\n private adAnalyticsServerUrl: string;\n\n constructor(baseUrl: string) {\n this.analyticsServerUrl = joinUrls(baseUrl, 'analytics');\n this.adAnalyticsServerUrl = joinUrls(baseUrl, 'analytics/a');\n }\n\n public sendRequest(sample: Sample, callback: () => void) {\n post(this.analyticsServerUrl, sample, callback);\n }\n\n public sendUnloadRequest(sample: Sample) {\n this.trySendBeacon((data: Sample) => this.sendRequestSynchronous(data, noOp), this.getAnalyticsServerUrl(), sample);\n }\n\n public trySendBeacon(fallbackFunction: (data: any) => void, url: string, data: any) {\n if (typeof navigator.sendBeacon === 'undefined') {\n fallbackFunction(data);\n } else {\n const success = navigator.sendBeacon(url, JSON.stringify(data));\n if (!success) {\n fallbackFunction(data);\n }\n }\n }\n\n public sendRequestSynchronous(sample: Sample, callback: () => void) {\n post(this.analyticsServerUrl, sample, callback, false);\n }\n\n public sendAdRequest(sample: AdSample) {\n this.trySendBeacon(\n (data: AdSample) => post(this.getAdAnalyticsServerUrl(), data, noOp),\n this.getAdAnalyticsServerUrl(),\n sample\n );\n }\n\n public getAnalyticsServerUrl() {\n return this.analyticsServerUrl;\n }\n\n public getAdAnalyticsServerUrl() {\n return this.adAnalyticsServerUrl;\n }\n}\n","import {Sample} from '../types/Sample';\nimport {Backend} from './Backend';\n\nexport class LongPlaytimeFilteringBackend implements Backend {\n private backend: Backend;\n\n constructor(next: Backend) {\n this.backend = next;\n }\n\n public sendRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendRequest(sample);\n }\n\n public sendUnloadRequest(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendUnloadRequest(sample);\n }\n\n public sendRequestSynchronous(sample: Sample) {\n if (this.isPlayedAboveThreshold(sample)) {\n return;\n }\n this.backend.sendRequestSynchronous(sample);\n }\n\n public sendAdRequest(sample: any) {\n this.backend.sendAdRequest(sample);\n }\n\n private isPlayedAboveThreshold(sample: Sample): boolean {\n return (sample.played == null ? 0 : sample.played) >= 90000;\n }\n}\n","import {AdAnalyticsSample} from '../types/AdAnalyticsSample';\nimport {AdBreakSample} from '../types/AdBreakSample';\nimport {AdSample} from '../types/AdSample';\nimport {Sample} from '../types/Sample';\nimport {Backend} from './Backend';\n\nexport class SequenceNumberBackend implements Backend {\n private underlying: Backend;\n private sequenceNumber: number = 0;\n\n constructor(underlying: Backend) {\n this.underlying = underlying;\n }\n\n public sendRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendRequest(sample);\n }\n\n public sendUnloadRequest(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendUnloadRequest(sample);\n }\n\n public sendRequestSynchronous(sample: Sample) {\n this.updateSampleBeforeSending(sample);\n this.underlying.sendRequestSynchronous(sample);\n }\n\n public sendAdRequest(sample: AdSample & AdBreakSample & AdAnalyticsSample) {\n this.underlying.sendAdRequest(sample);\n }\n\n private updateSampleBeforeSending(sample: Sample) {\n sample.sequenceNumber = this.sequenceNumber++;\n }\n}\n","import {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport * as Utils from '../utils/Utils';\n\nexport const BITMOVIN_ANALYTICS_UUID_COOKIE_NAME = 'bitmovin_analytics_uuid';\n\nexport class SessionPersistenceHandler {\n public readonly userId: string;\n\n private readonly cookiesEnabled: boolean;\n private readonly cookiesDomain: string | null;\n\n constructor(config: AnalyticsConfig) {\n const collectorConfig = config.config;\n this.cookiesEnabled = collectorConfig == null || collectorConfig.cookiesEnabled !== false;\n if (collectorConfig != null && collectorConfig.cookiesDomain != null) {\n this.cookiesDomain = collectorConfig.cookiesDomain;\n } else {\n this.cookiesDomain = null;\n }\n\n if (!this.cookiesEnabled) {\n this.ensureNoCookiePresent();\n }\n\n this.userId = this.setupUserId();\n }\n\n private setupUserId() {\n let userId = Utils.getCookie(BITMOVIN_ANALYTICS_UUID_COOKIE_NAME);\n if (Utils.isNullOrEmptyString(userId)) {\n userId = this.createAndSetNewUserId();\n }\n return userId;\n }\n\n private createAndSetNewUserId() {\n const generatedId = Utils.generateUUID();\n this.writeCookie(generatedId);\n return generatedId;\n }\n\n private ensureNoCookiePresent() {\n const userId = Utils.getCookie(BITMOVIN_ANALYTICS_UUID_COOKIE_NAME);\n if (Utils.isNullOrEmptyString(userId)) {\n return;\n }\n const cookie = `${BITMOVIN_ANALYTICS_UUID_COOKIE_NAME}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n document.cookie = cookie;\n }\n\n private writeCookie(userId: string) {\n if (!this.cookiesEnabled) {\n return;\n }\n let cookie = `${BITMOVIN_ANALYTICS_UUID_COOKIE_NAME}=${userId}; path=/; expires=\"Mon, 31 Dec 2029 23:00:00 GMT\"; max-age=315400000`;\n\n if (this.cookiesDomain != null) {\n cookie += `; domain=${this.cookiesDomain}`;\n }\n\n document.cookie = cookie;\n }\n}\n","import {Bitmovin7AnalyticsStateMachine} from '../../analyticsStateMachines/Bitmovin7AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {CastTech} from '../../enums/CastTech';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {getSourceInfoFromBitmovinSourceConfig} from '../../utils/BitmovinProgressiveSourceHelper';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class Bitmovin7InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n private onBeforeUnLoadEvent: boolean = false;\n\n constructor(private player: any, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new Bitmovin7AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.register();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public getPlayerVersion = () => this.player.version;\n public getPlayerName = () => Player.BITMOVIN;\n public getPlayerTech = () => this.player.getPlayerType();\n public getAutoPlay(): boolean {\n if (this.player.getConfig().playback) {\n return this.player.getConfig().playback.autoplay || false;\n }\n return false;\n }\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n const info: PlaybackInfo = {\n ...super.getCommonPlaybackInfo(),\n size: this.player.isFullscreen() ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n isLive: this.player.isLive(),\n videoDuration: this.player.getDuration(),\n streamFormat: this.player.getStreamType(),\n videoWindowWidth: this.player.getFigure().offsetWidth,\n videoWindowHeight: this.player.getFigure().offsetHeight,\n isMuted: this.player.isMuted(),\n isCasting: this.player.isCasting(),\n audioLanguage: this.player.getAudio() != null ? this.player.getAudio().lang : null,\n subtitleEnabled: false,\n droppedFrames: this.player.isReady() ? this.player.getDroppedFrames() : 0,\n };\n\n this.applySubtitleProperties(info);\n this.applyPlaybackQualityProperties(info);\n this.applySourceProperties(info);\n this.applyCastingProperties(info);\n\n return info;\n }\n\n public register() {\n this.player.addEventHandler(this.player.EVENT.ON_SOURCE_UNLOADED, (event: any) => {\n this.eventCallback(Event.SOURCE_UNLOADED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_SOURCE_LOADED, (event: any) => {\n this.resetSourceRelatedState();\n this.eventCallback(Event.SOURCE_LOADED, {});\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_READY, () => {\n this.eventCallback(Event.READY, {});\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_CAST_STARTED, (event: any) => {\n this.eventCallback(Event.START_CAST, event);\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_CAST_STOPPED, () => {\n this.eventCallback(Event.END_CAST, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_PLAY, () => {\n this.eventCallback(Event.PLAY, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_PAUSED, () => {\n this.eventCallback(Event.PAUSE, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_TIME_CHANGED, () => {\n this.eventCallback(Event.TIMECHANGED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_SEEK, () => {\n this.eventCallback(Event.SEEK, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_SEEKED, () => {\n this.eventCallback(Event.SEEKED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_STALL_STARTED, () => {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_STALL_ENDED, () => {\n this.eventCallback(Event.END_BUFFERING, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_AUDIO_PLAYBACK_QUALITY_CHANGED, () => {\n const quality = this.player.getPlaybackAudioData();\n\n if (this.shouldAllowAudioQualityChange(quality.bitrate)) {\n this.setPreviousAudioBitrate(quality.bitrate);\n this.eventCallback(Event.AUDIO_CHANGE, {\n bitrate: quality.bitrate,\n currentTime: this.player.getCurrentTime(),\n });\n }\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_VIDEO_PLAYBACK_QUALITY_CHANGED, () => {\n const quality = this.player.getPlaybackVideoData();\n if (this.shouldAllowVideoQualityChange(quality.bitrate)) {\n this.setPreviousVideoBitrate(quality.bitrate);\n this.eventCallback(Event.VIDEO_CHANGE, {\n width: quality.width,\n height: quality.height,\n bitrate: quality.bitrate,\n currentTime: this.player.getCurrentTime(),\n });\n }\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_FULLSCREEN_ENTER, () => {\n this.eventCallback(Event.START_FULLSCREEN, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_FULLSCREEN_EXIT, () => {\n this.eventCallback(Event.END_FULLSCREEN, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_AD_STARTED, () => {\n this.eventCallback(Event.START_AD, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_AD_FINISHED, () => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_MUTED, () => {\n this.eventCallback(Event.MUTE, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_UNMUTED, () => {\n this.eventCallback(Event.UN_MUTE, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_ERROR, (event: any) => {\n this.eventCallback(Event.ERROR, {\n code: event.code,\n message: event.message,\n currentTime: this.player.getCurrentTime(),\n data: {},\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_PLAYBACK_FINISHED, () => {\n this.eventCallback(Event.PLAYBACK_FINISHED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_DOWNLOAD_FINISHED, (event: any) => {\n if (event.downloadType.indexOf('drm/license/') === 0) {\n this.drmPerformanceInfo = {\n drmType: event.downloadType.replace('drm/license/', ''),\n drmLoadTime: event.downloadTime * 1000,\n };\n }\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_AUDIO_CHANGED, (event: any) => {\n this.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n this.player.addEventHandler(this.player.EVENT.ON_SUBTITLE_CHANGED, (event: any) => {\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.player.getCurrentTime(),\n });\n });\n\n let handlePageClose = () => {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n let currentTime: number | undefined;\n if (this.player != null) {\n currentTime = this.player.getCurrentTime();\n }\n this.eventCallback(Event.UNLOAD, {\n currentTime,\n });\n }\n this.release();\n };\n handlePageClose = handlePageClose.bind(true);\n\n this.player.on(this.player.EVENT.ON_DESTROY, handlePageClose);\n this.windowEventTracker.addEventListener('beforeunload', handlePageClose);\n this.windowEventTracker.addEventListener('unload', handlePageClose);\n }\n\n public sourceChange(config: AnalyticsConfig, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, this.player.getCurrentTime());\n }\n protected get currentTime(): number {\n return this.player.getCurrentTime();\n }\n\n private applySourceProperties(info: PlaybackInfo) {\n const source = this.player.getConfig().source;\n if (source == null) {\n return;\n }\n info.videoTitle = source.title;\n info.mpdUrl = source.dash;\n info.m3u8Url = source.hls;\n\n const progSourceInfo = getSourceInfoFromBitmovinSourceConfig(source.progressive, this.player);\n info.progUrl = progSourceInfo.progUrl;\n if (this.player.getStreamType() === 'progressive') {\n info.videoBitrate = progSourceInfo.progBitrate;\n }\n }\n\n private applySubtitleProperties(info: PlaybackInfo) {\n const subtitle = this.player.getSubtitle() || {};\n\n info.subtitleEnabled = subtitle.id != null;\n info.subtitleLanguage = subtitle.lang;\n }\n\n private applyPlaybackQualityProperties(info: PlaybackInfo) {\n const videoQuality = this.player.getPlaybackVideoData();\n if (videoQuality !== null) {\n info.videoBitrate = videoQuality.bitrate;\n info.videoPlaybackHeight = videoQuality.height;\n info.videoPlaybackWidth = videoQuality.width;\n }\n\n const audioQuality = this.player.getPlaybackAudioData();\n if (audioQuality !== null) {\n info.audioBitrate = audioQuality.bitrate;\n }\n }\n\n private applyCastingProperties(info: PlaybackInfo) {\n const isCasting = this.player.isCasting() || this.player.isAirplayActive() || false;\n info.isCasting = isCasting;\n if (!isCasting) {\n return;\n }\n\n // AirPlay\n if (this.player.isAirplayActive()) {\n info.castTech = CastTech.AirPlay;\n return;\n }\n\n // Casting Tech from RemoteControlConfig\n const remoteControlConfig = this.player.getConfig().remotecontrol;\n if (remoteControlConfig === null || remoteControlConfig === undefined) {\n return;\n }\n\n switch (remoteControlConfig.type) {\n case 'googlecast':\n info.castTech = CastTech.GoogleCast;\n break;\n case 'websocket':\n info.castTech = CastTech.WebSocket;\n break;\n }\n }\n}\n","import * as StateMachine from 'javascript-state-machine';\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {EventDebugging} from '../utils/EventDebugging';\nimport {logger, padRight} from '../utils/Logger';\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\n\nenum State {\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n AD = 'AD',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class Bitmovin7AnalyticsStateMachine extends AnalyticsStateMachine {\n public static PAUSE_SEEK_DELAY = 200;\n public static SEEKED_PAUSE_DELAY = 300;\n\n private debuggingStates: EventDebugging[] = [];\n private enabledDebugging = false;\n\n private pausedTimestamp: any;\n private seekTimestamp: number;\n private seekedTimestamp: number;\n private seekedTimeout: number;\n\n private seekStarted: boolean;\n private seekEnded: boolean;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.pausedTimestamp = null;\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n this.seekedTimeout = 0;\n this.seekStarted = false;\n this.seekEnded = false;\n }\n\n public getAllStates() {\n return [\n ...Object.keys(State).map((key) => State[key]),\n 'FINISH_PLAY_SEEKING',\n 'PLAY_SEEK',\n 'FINISH_QUALITYCHANGE_PAUSE',\n 'FINISH_QUALITYCHANGE',\n 'FINISH_QUALITYCHANGE_REBUFFERING',\n ];\n }\n\n public sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n\n public createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.SETUP,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.READY, from: [State.SETUP, State.ERROR], to: State.READY},\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.END_BUFFERING, from: State.REBUFFERING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSED_SEEKING},\n {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.SEEKED, from: State.PAUSED_SEEKING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSED_SEEKING, to: State.PLAYING},\n {name: Event.PAUSE, from: State.PAUSED_SEEKING, to: State.PAUSE},\n\n {name: 'PLAY_SEEK', from: State.PAUSE, to: State.PLAY_SEEKING},\n {name: 'PLAY_SEEK', from: State.PAUSED_SEEKING, to: State.PLAY_SEEKING},\n {name: 'PLAY_SEEK', from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n\n // We are ending the seek\n {name: Event.PLAY, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n\n {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.END, from: State.PLAY_SEEKING, to: State.END},\n {name: Event.END, from: State.PAUSED_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n {name: Event.PLAY, from: State.END, to: State.STARTUP},\n\n {name: Event.ERROR, from: this.getAllStates(), to: State.ERROR},\n\n {name: Event.SEEK, from: State.END_PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: 'FINISH_PLAY_SEEKING', from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.UNLOAD, from: this.getAllStates(), to: State.END},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD},\n {name: Event.END_AD, from: State.AD, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE, State.PLAYING], to: State.CASTING},\n {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAYING, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.UN_MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.MANUAL_SOURCE_CHANGE, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n {name: Event.SOURCE_UNLOADED, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n\n {name: Event.READY, from: State.SOURCE_CHANGING, to: State.READY},\n\n // {name: Events.SOURCE_LOADED, from: State.SETUP, to: State.SETUP},\n // {name: Events.SOURCE_LOADED, from: State.READY, to: State.READY},\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.TIMECHANGED, from: State.AUDIOTRACK_CHANGING, to: State.PLAYING},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGING},\n {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n {name: Event.TIMECHANGED, from: State.SUBTITLE_CHANGING, to: State.PLAYING},\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n ],\n callbacks: {\n onpause: (event, from, to, timestamp) => {\n if (from === State.PLAYING) {\n this.pausedTimestamp = timestamp;\n }\n },\n onbeforeevent: (event, from, to, timestamp, eventObject) => {\n if (event === Event.SEEK && from === State.PAUSE) {\n if (!this.seekStarted) {\n this.seekTimestamp = timestamp;\n this.seekStarted = true;\n }\n const elapsedTime = timestamp - this.pausedTimestamp;\n if (elapsedTime < Bitmovin7AnalyticsStateMachine.PAUSE_SEEK_DELAY && elapsedTime > 0) {\n this.stateMachine.PLAY_SEEK(timestamp);\n return false;\n }\n }\n\n if (event === Event.SEEK) {\n window.clearTimeout(this.seekedTimeout);\n }\n\n if (event === Event.SEEKED && from === State.PAUSED_SEEKING) {\n this.seekedTimestamp = timestamp;\n this.seekEnded = true;\n this.seekedTimeout = window.setTimeout(() => {\n this.stateMachine.pause(timestamp, eventObject);\n }, Bitmovin7AnalyticsStateMachine.SEEKED_PAUSE_DELAY);\n return false;\n }\n\n if (from === State.REBUFFERING && to === State.QUALITYCHANGE_REBUFFERING) {\n return false;\n }\n },\n onafterevent: (event, from, to, timestamp) => {\n if (to === State.QUALITYCHANGE_PAUSE) {\n this.stateMachine.FINISH_QUALITYCHANGE_PAUSE(timestamp);\n }\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.QUALITYCHANGE_REBUFFERING) {\n this.stateMachine.FINISH_QUALITYCHANGE_REBUFFERING(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n },\n onenterstate: (\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || new Date().getTime();\n }\n\n logger.log('[ENTER] ' + padRight(to, 20) + 'EVENT: ' + padRight(event, 20) + ' from ' + padRight(from, 14));\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n this.addStatesToLog(event, from, to, timestamp, eventObject);\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (event === 'PLAY_SEEK' && from === State.PAUSE) {\n return true;\n }\n\n const fnName = String(from).toLowerCase();\n if (from === State.END_PLAY_SEEKING || from === State.PAUSED_SEEKING) {\n const seekDuration = this.seekedTimestamp - this.seekTimestamp;\n if (this.seekStarted && this.seekEnded && to !== State.PLAY_SEEKING) {\n this.seekEnded = this.seekStarted = false;\n this.stateMachineCallbacks[fnName](seekDuration, fnName, eventObject);\n }\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (from === State.PAUSE && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.stateMachineCallbacks.pause(stateDuration, fnName);\n } else {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n callbackFunction(stateDuration, fnName, eventObject);\n } else {\n logger.error('Could not find callback function for ' + fnName);\n }\n }\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n } else if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n },\n onseek: (event, from, to, timestamp) => {\n if (!this.seekStarted) {\n this.seekTimestamp = timestamp;\n this.seekStarted = true;\n }\n },\n onseeked: (event, from, to, timestamp) => {\n this.seekedTimestamp = timestamp;\n this.seekEnded = true;\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n this.stateMachineCallbacks.heartbeat(stateDuration, String(from).toLowerCase(), {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n public callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n try {\n exec.call(this.stateMachine, timestamp, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + eventType, exec, eventObject, e);\n }\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n public addStatesToLog(\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) {\n if (this.enabledDebugging) {\n this.debuggingStates.push(new EventDebugging(event, from, to, timestamp, eventObject));\n }\n }\n\n public getStates() {\n return this.debuggingStates;\n }\n\n public setEnabledDebugging(enabled: boolean) {\n this.enabledDebugging = enabled;\n }\n}\n","import {ErrorCode} from './ErrorCode';\n\nexport class VideoStartFailedReason {\n public static PAGE_CLOSED = new VideoStartFailedReason('PAGE_CLOSED', null);\n public static PLAYER_ERROR = new VideoStartFailedReason('PLAYER_ERROR', null);\n public static TIMEOUT = new VideoStartFailedReason('TIMEOUT', ErrorCode.VIDEO_STARTUP_TIMEOUT_REACHED);\n public static UNKNOWN = new VideoStartFailedReason('UNKNOWN', null);\n\n private constructor(public readonly reason: string, public readonly errorCode: ErrorCode | null) {}\n}\n","import {FeatureConfig} from './FeatureConfig';\n\nexport abstract class Feature<TConfigContainer, TConfig extends FeatureConfig> {\n private _config?: TConfig = undefined;\n private _isEnabled: boolean = true;\n\n public get config(): TConfig | undefined {\n return this._config;\n }\n\n public get isEnabled(): boolean {\n return this._isEnabled;\n }\n\n public abstract reset(): void;\n public abstract enabled(): void;\n public abstract disabled(): void;\n public abstract configured(authenticated: boolean, config?: TConfig): void;\n\n public disable() {\n this._isEnabled = false;\n this.disabled();\n }\n\n public configure(authenticated: boolean, configContainer?: TConfigContainer): TConfig | undefined {\n if (configContainer != null) {\n this._config = this.extractConfig(configContainer);\n }\n this.configured(authenticated, this._config);\n return this._config;\n }\n\n public abstract extractConfig(configContainer: TConfigContainer): TConfig | undefined;\n}\n","import {AnalyticsConfig} from './AnalyticsConfig';\nimport {CustomDataValues} from './CustomDataValues';\nimport * as EventData from './EventData';\nimport {Sample} from './Sample';\n\nexport interface StateMachineCallbacks {\n setup: (duration: number, state: string) => void;\n startup: (duration: number, state: string) => void;\n playing: (duration: number, state: string) => void;\n heartbeat: (duration: number, state: string, payload: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>) => void;\n qualitychange: (duration: number, state: string) => void;\n qualitychange_pause: (duration: number, state: string) => void;\n qualitychange_rebuffering: (duration: number, state: string) => void;\n videoChange: (event: any) => void;\n audioChange: (event: any) => void;\n audiotrack_changing: () => void;\n pause: (duration: number, state: string) => void;\n paused_seeking: (duration: number, state: string) => void;\n end_play_seeking: (duration: number, state: string) => void;\n rebuffering: (duration: number, state: string) => void;\n error: (event: Readonly<EventData.ErrorEvent>) => void;\n end: (duration: number, state: string) => void;\n unload: (duration: number, state: string) => void;\n ad: (duration: number, state: string) => void;\n mute: () => void;\n unMute: () => void;\n subtitle_changing: () => void;\n setVideoTimeEndFromEvent: (event: any) => void;\n setVideoTimeStartFromEvent: (event: any) => void;\n videoStartFailed: (event: Readonly<EventData.VideoStartFailedEvent>, sendRequest: boolean) => void;\n source_changing: (duration: number, state: string, event: any) => void;\n ready: (duration: number, state: string, event: any) => void;\n startCasting: (duration: number, event: any) => void;\n casting: (duration: number, event: any) => void;\n manualSourceChange: (event: {config: AnalyticsConfig}) => void;\n initialSourceChange: (event: {config: AnalyticsConfig}) => void;\n muting_ready: (duration: number, state: string, event: any) => void;\n customdatachange: (duration?: number, state?: string, event?: {values: CustomDataValues}) => void;\n\n // shuts down the collection and removes/clears all timeouts, intervals, eventlisteners\n release: () => void;\n playlistTransition: (event: Readonly<EventData.AnalyticsEventBase>) => void;\n}\n\n// tslint:disable:no-unused-expression\nexport const defaultStateMachineCallbacks: StateMachineCallbacks = {\n setup: (time: number, state: string) => void {},\n startup: (time: number, state: string) => void {},\n playing: (time: number, state: string) => void {},\n heartbeat: (time: number, state: string, payload: Pick<Sample, 'played'> | Pick<Sample, 'buffered'>) => void {},\n qualitychange: (time: number, state: string) => void {},\n qualitychange_pause: (time: number, state: string) => void {},\n qualitychange_rebuffering: (time: number, state: string) => void {},\n videoChange: (event: any) => void {},\n audioChange: (event: any) => void {},\n audiotrack_changing: () => void {},\n pause: (time: number, state: string) => void {},\n paused_seeking: (time: number, state: string) => void {},\n end_play_seeking: (time: number, state: string) => void {},\n rebuffering: (time: number, state: string) => void {},\n error: (event: Readonly<EventData.ErrorEvent>) => void {},\n end: (time: number, state: string) => void {},\n unload: (time: number, state: string) => void {},\n ad: (time: number, state: string) => void {},\n mute: () => void {},\n unMute: () => void {},\n subtitle_changing: () => void {},\n setVideoTimeEndFromEvent: (event: any) => void {},\n setVideoTimeStartFromEvent: (event: any) => void {},\n videoStartFailed: (event: Readonly<EventData.VideoStartFailedEvent>, sendRequest: boolean) => void {},\n source_changing: (time: number, state: string, event: any) => void {},\n ready: (time: number, state: string, event: any) => void {},\n startCasting: (time: number, event: any) => void {},\n casting: (duration: number, event: any) => void {},\n manualSourceChange: (event: {config: AnalyticsConfig}) => void {},\n initialSourceChange: (event: {config: AnalyticsConfig}) => void {},\n muting_ready: (time: number, state: string, event: any) => void {},\n customdatachange: (time?: number, state?: string, event?: {values: CustomDataValues}) => void {},\n release: () => void {},\n playlistTransition: (event: Readonly<EventData.AnalyticsEventBase>) => void {},\n};\n","interface EventListener {\n eventName: string;\n func: EventListenerOrEventListenerObject;\n}\n\nexport class WindowEventTracker {\n private trackedObjects: EventListener[] = [];\n\n public addEventListener(eventName: string, func: EventListenerOrEventListenerObject) {\n this.trackedObjects.push({eventName, func});\n window.addEventListener(eventName, func);\n }\n\n public release() {\n while (this.trackedObjects.length !== 0) {\n const obj = this.trackedObjects.pop();\n if (obj === undefined) {\n continue;\n }\n\n window.removeEventListener(obj.eventName, obj.func);\n }\n }\n}\n","import {PlayerAPI, PlayerConfig} from 'bitmovin-player';\nimport {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {Bitmovin8InternalAdapter} from './internal/Bitmovin8InternalAdapter';\n\nexport class Bitmovin8Adapter extends Adapter implements AdapterAPI {\n constructor(player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n\n const playerConfig: PlayerConfig = (player as PlayerAPI).getConfig();\n let analyticsConfig: AnalyticsConfig = (playerConfig as any).analytics;\n if (analyticsConfig === undefined) {\n analyticsConfig = {};\n }\n\n analyticsConfig.playerKey = analyticsConfig.playerKey || playerConfig.key;\n\n this.internalAdapter = new Bitmovin8InternalAdapter(player, opts);\n this.analytics = new Analytics(analyticsConfig, this.internalAdapter);\n (player as any).analytics = this.analytics;\n this.wrapPlayerLoad(player, this.analytics);\n }\n\n private wrapPlayerLoad(player: PlayerAPI, analytics: Analytics) {\n const originalLoad = player.load;\n player.load = (...args: Parameters<typeof player.load>): Promise<void> => {\n if (args.length > 0) {\n const analyticsConfig = (args[0] as any).analytics;\n // we reset the analytics and reload with a new config\n analytics.sourceChange(analyticsConfig);\n }\n\n return originalLoad.apply(player, args);\n };\n }\n}\n","import {PlayerAPI, PlayerEventBase, SeekEvent, UserInteractionEvent} from 'bitmovin-player';\nimport {Bitmovin8AnalyticsStateMachine} from '../../analyticsStateMachines/Bitmovin8AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\nimport {SegmentTracker} from '../../core/SegmentTracker';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport {CastTech} from '../../enums/CastTech';\nimport {ErrorCode} from '../../enums/ErrorCode';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {HttpRequestTracking} from '../../features/httprequesttracking/HttpRequestTracking';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport {getSourceInfoFromBitmovinSourceConfig} from '../../utils/BitmovinProgressiveSourceHelper';\nimport {logger} from '../../utils/Logger';\nimport * as AnalyticsSettings from '../../utils/Settings';\nimport {AdModuleAPI} from './ads/AdModuleAPI';\nimport {Bitmovin8AdModule} from './ads/Bitmovin8AdModule';\nimport {Bitmovin8HttpRequestTrackingAdapter} from './Bitmovin8HttpRequestTrackingAdapter';\nimport {Bitmovin8SegmentTrackerAdapter} from './Bitmovin8SegmentTrackerAdapter';\nimport {Bitmovin8SpeedMeterAdapter} from './Bitmovin8SpeedMeterAdapter';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nenum ViewMode {\n Inline = 'inline',\n Fullscreen = 'fullscreen',\n PictureInPicture = 'pictureinpicture',\n}\n\nexport class Bitmovin8InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n get downloadSpeedInfo(): DownloadSpeedInfo {\n return this.speedMeter.getInfo();\n }\n\n get segments(): SegmentInfo[] {\n return this.segmentTracker.getSegments();\n }\n\n get adModule(): AdModuleAPI | undefined {\n return this._adModule;\n }\n\n get supportsDeferredLicenseLoading(): boolean {\n return true;\n }\n public readonly videoCompletionTracker: VideoCompletionTracker;\n\n private onBeforeUnLoadEvent: boolean = false;\n private speedMeter: DownloadSpeedMeter;\n private segmentTracker: SegmentTracker;\n private _adModule?: AdModuleAPI;\n private lastTrackedCurrentTime: number | undefined;\n private videoDuration: number | undefined;\n private httpRequestTrackingAdapter: Bitmovin8HttpRequestTrackingAdapter;\n\n constructor(private player: PlayerAPI, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new Bitmovin8AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.speedMeter = new Bitmovin8SpeedMeterAdapter(player, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n this.segmentTracker = new Bitmovin8SegmentTrackerAdapter(player, new SegmentTracker()).getSegmentTracker();\n this.httpRequestTrackingAdapter = new Bitmovin8HttpRequestTrackingAdapter(player);\n this.videoCompletionTracker = new VideoCompletionTracker();\n }\n protected get currentTime(): number {\n try {\n // during ad this.player.getCurrentTime() returns time of ad and not video\n // this then messes with videotime_start and videotime_end measurements of video\n // we don't track videotimes for ads\n if (this.player !== null && this.player.getCurrentTime !== null && !this.isAdPlaying) {\n return this.player.getCurrentTime();\n }\n } catch {\n logger.warning('Analytics Collector attempted to access player, but player is not available anymore');\n }\n return this.lastTrackedCurrentTime ? this.lastTrackedCurrentTime : 0;\n }\n\n protected get isAdPlaying(): boolean {\n const currentAd = this.player.ads && this.player.ads.getActiveAd();\n return currentAd !== null && currentAd !== undefined;\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.registerPlayerEventListeners();\n this.registerUnloadEventListeners();\n\n this._adModule = new Bitmovin8AdModule(this.player, this.windowEventTracker);\n const requestTracking = new HttpRequestTracking([this.httpRequestTrackingAdapter]);\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n requestTracking\n );\n return [errorDetailTracking];\n }\n\n public clearValues(): void {\n this.speedMeter.reset();\n }\n\n public clearSegments(): void {\n this.segmentTracker.reset();\n }\n\n public getPlayerVersion = () => this.player.version;\n public getPlayerName = () => Player.BITMOVIN;\n public getPlayerTech = () => this.player.getPlayerType();\n public getAutoPlay(): boolean {\n if (this.player.getConfig().playback) {\n return (this.player.getConfig() as any).playback.autoplay || false;\n }\n return false;\n }\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n const info: PlaybackInfo = {\n ...super.getCommonPlaybackInfo(),\n size: this.player.getViewMode() === ViewMode.Fullscreen ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n isLive: this.player.isLive(),\n videoDuration: this.videoDuration ? this.videoDuration : 0,\n streamFormat: this.player.getStreamType(),\n videoWindowWidth: this.player.getContainer().offsetWidth,\n videoWindowHeight: this.player.getContainer().offsetHeight,\n isMuted: this.player.isMuted(),\n isCasting: this.player.isCasting(),\n audioLanguage: this.player.getAudio() != null ? this.player.getAudio().lang : undefined,\n subtitleEnabled: false,\n droppedFrames: this.player.getSource() != null ? this.player.getDroppedVideoFrames() : 0,\n };\n\n this.applySubtitleProperties(info);\n this.applyPlaybackQualityProperties(info);\n this.applyCastingProperties(info);\n this.applySourceProperties(info);\n\n return info;\n }\n\n public sourceChange(config: AnalyticsConfig, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, this.currentTime);\n }\n\n public onError(): void {\n this.clearSegments();\n }\n\n private registerPlayerEventListeners() {\n this.player.on(this.player.exports.PlayerEvent.SourceUnloaded, (event: any) => {\n this.segmentTracker.reset();\n this.eventCallback(Event.SOURCE_UNLOADED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.SourceLoaded, (event: any) => {\n this.videoCompletionTracker.reset();\n this.resetSourceRelatedState();\n this.videoDuration = this.player.getDuration();\n this.videoCompletionTracker.setVideoDuration(this.player.getDuration());\n this.eventCallback(Event.SOURCE_LOADED, {});\n });\n\n this.player.on(this.player.exports.PlayerEvent.CastStarted, (event: any) => {\n this.eventCallback(Event.START_CAST, event);\n });\n\n this.player.on(this.player.exports.PlayerEvent.CastStopped, () => {\n this.eventCallback(Event.END_CAST, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Play, (e: UserInteractionEvent) => {\n if (e.issuer !== 'ui-seek') {\n this.eventCallback(Event.PLAY, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.Playing, (e: UserInteractionEvent) => {\n if (e.issuer !== 'advertising-api') {\n this.eventCallback(Event.PLAYING, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.Paused, (e: UserInteractionEvent) => {\n if (e.issuer !== 'ui-seek') {\n this.eventCallback(Event.PAUSE, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.TimeChanged, (e: PlayerEventBase) => {\n if (!this.isAdPlaying) {\n this.lastTrackedCurrentTime = this.player.getCurrentTime();\n }\n this.eventCallback(Event.TIMECHANGED, {\n currentTime: this.lastTrackedCurrentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Seek, (e: UserInteractionEvent) => {\n if (this.allowSeeking(e)) {\n this.eventCallback(Event.SEEK, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.Seeked, () => {\n this.eventCallback(Event.SEEKED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.StallStarted, () => {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.StallEnded, () => {\n this.eventCallback(Event.END_BUFFERING, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AudioPlaybackQualityChanged, () => {\n const quality = this.player.getPlaybackAudioData();\n\n if (this.shouldAllowAudioQualityChange(quality.bitrate)) {\n this.setPreviousAudioBitrate(quality.bitrate);\n this.eventCallback(Event.AUDIO_CHANGE, {\n bitrate: quality.bitrate,\n currentTime: this.currentTime,\n codec: (quality as any).codec,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.VideoPlaybackQualityChanged, () => {\n const quality = this.player.getPlaybackVideoData();\n\n if (this.shouldAllowVideoQualityChange(quality.bitrate)) {\n this.setPreviousVideoBitrate(quality.bitrate);\n this.eventCallback(Event.VIDEO_CHANGE, {\n width: quality.width,\n height: quality.height,\n bitrate: quality.bitrate,\n currentTime: this.currentTime,\n codec: (quality as any).codec,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.ViewModeChanged, (e: any) => {\n if (e.to === 'fullscreen') {\n this.eventCallback(Event.START_FULLSCREEN, {\n currentTime: this.currentTime,\n });\n } else if (e.from === 'fullscreen') {\n this.eventCallback(Event.END_FULLSCREEN, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdStarted, (event: any) => {\n this.eventCallback(Event.START_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdFinished, (event: any) => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdSkipped, (event: any) => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.AdError, (event: any) => {\n this.eventCallback(Event.END_AD, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Muted, () => {\n this.eventCallback(Event.MUTE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Unmuted, () => {\n this.eventCallback(Event.UN_MUTE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.Error, (event: any) => {\n this.eventCallback(Event.ERROR, {\n code: event.code,\n message: event.name,\n legacyData: event.data,\n currentTime: this.currentTime,\n data: {\n additionalData: JSON.stringify(event.data),\n },\n });\n if (\n event.code === ErrorCode.BITMOVIN_PLAYER_LICENSING_ERROR.code ||\n event.code === ErrorCode.SETUP_MISSING_LICENSE_WHITELIST.code\n ) {\n this._onLicenseCallFailed.dispatch({});\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.PlaybackFinished, () => {\n this.eventCallback(Event.PLAYBACK_FINISHED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.DownloadFinished, (event: any) => {\n if (event.downloadType.indexOf('drm/license/') === 0) {\n this.drmPerformanceInfo = {\n drmType: event.downloadType.replace('drm/license/', ''),\n drmLoadTime: event.downloadTime * 1000,\n };\n }\n });\n\n this.player.on(this.player.exports.PlayerEvent.AudioChanged, (event: any) => {\n this.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.SubtitleEnabled, (event: any) => {\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.currentTime,\n });\n });\n\n this.player.on(this.player.exports.PlayerEvent.SubtitleDisabled, (event: any) => {\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.currentTime,\n });\n });\n\n // @ts-ignore\n this.player.on(this.player.exports.PlayerEvent.LicenseValidated, (event: any) => {\n if (event.data.analytics && event.data.analytics.key !== undefined) {\n this._onLicenseKeyReceived.dispatch({licenseKey: event.data.analytics.key});\n } else {\n this._onLicenseCallFailed.dispatch({});\n }\n });\n }\n\n private registerUnloadEventListeners() {\n let handleCollectorUnload = () => {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n // we use here the last tracked video time as we cannot be sure if the player is still working at this place\n const currentTime = this.lastTrackedCurrentTime;\n this.eventCallback(Event.UNLOAD, {currentTime});\n }\n this.release();\n };\n handleCollectorUnload = handleCollectorUnload.bind(true);\n\n this.player.on(this.player.exports.PlayerEvent.Destroy, handleCollectorUnload);\n this.windowEventTracker.addEventListener('beforeunload', handleCollectorUnload);\n this.windowEventTracker.addEventListener('unload', handleCollectorUnload);\n }\n\n private applySourceProperties(info: PlaybackInfo) {\n const source = this.player.getSource();\n if (source == null) {\n return;\n }\n\n info.videoTitle = source.title;\n info.mpdUrl = source.dash;\n info.m3u8Url = source.hls;\n\n const progSourceInfo = getSourceInfoFromBitmovinSourceConfig(source.progressive, this.player);\n info.progUrl = progSourceInfo.progUrl;\n if (this.player.getStreamType() === 'progressive') {\n info.videoBitrate = progSourceInfo.progBitrate;\n }\n }\n\n private applySubtitleProperties(info: PlaybackInfo) {\n let enabledSubtitle;\n if (this.player.subtitles) {\n enabledSubtitle = this.player.subtitles.list().find((s) => s.enabled === true);\n }\n\n info.subtitleEnabled = enabledSubtitle != null;\n info.subtitleLanguage = enabledSubtitle != null ? enabledSubtitle.lang : null;\n }\n\n private applyPlaybackQualityProperties(info: PlaybackInfo) {\n const videoQuality = this.player.getPlaybackVideoData();\n if (videoQuality !== null) {\n info.videoBitrate = videoQuality.bitrate;\n info.videoPlaybackHeight = videoQuality.height;\n info.videoPlaybackWidth = videoQuality.width;\n info.videoCodec = (videoQuality as any).codec;\n }\n\n const audioQuality = this.player.getPlaybackAudioData();\n if (audioQuality !== null) {\n info.audioBitrate = audioQuality.bitrate;\n info.audioCodec = (audioQuality as any).codec;\n }\n }\n\n private applyCastingProperties(info: PlaybackInfo) {\n const isCasting = this.player.isCasting() || this.player.isAirplayActive() || false;\n info.isCasting = isCasting;\n if (!isCasting) {\n return;\n }\n\n // AirPlay\n if (this.player.isAirplayActive()) {\n info.castTech = CastTech.AirPlay;\n return;\n }\n\n // Casting Tech from RemoteControlConfig\n const remoteControlConfig = this.player.getConfig().remotecontrol;\n if (remoteControlConfig === null || remoteControlConfig === undefined) {\n return;\n }\n\n switch (remoteControlConfig.type) {\n case 'googlecast':\n info.castTech = CastTech.GoogleCast;\n break;\n case 'websocket':\n info.castTech = CastTech.WebSocket;\n break;\n }\n }\n\n // with this check we ignore seek events which are smaller than the Threshold\n // mainly to ignore keyboard triggered seeks\n private allowSeeking(e: UserInteractionEvent): boolean {\n const seekEvent = e as SeekEvent;\n const seekDifference = Math.abs(seekEvent.position - seekEvent.seekTarget);\n return seekDifference > AnalyticsSettings.ANALYTICS_MIN_SEEK_DIFFERENCE_THRESHOLD;\n }\n}\n","import * as StateMachine from 'javascript-state-machine';\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {EventDebugging} from '../utils/EventDebugging';\nimport {logger, padRight} from '../utils/Logger';\nimport {noOp} from '../utils/Utils';\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\n\nenum State {\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n END = 'END',\n ERROR = 'ERROR',\n /** This event is called when an ad is played directly after the player startup phase */\n AD_STARTUP = 'AD_STARTUP',\n AD_READY = 'AD_READY',\n AD_PAUSE = 'AD_PAUSE',\n AD_PLAYING = 'AD_PLAYING',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n INITIAL_SOURCE_CHANGE = 'INITIAL_SOURCE_CHANGE',\n SOURCE_LOADED = 'SOURCE_LOADED',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class Bitmovin8AnalyticsStateMachine extends AnalyticsStateMachine {\n private debuggingStates: EventDebugging[] = [];\n private enabledDebugging = false;\n\n private seekTimestamp: number;\n private seekedTimestamp: number;\n private seekStarted: boolean;\n private seekEnded: boolean;\n // used for ads, because when AdFinished event is fired and call to state machine is made\n // data form player indicate that video is playing from beginning even if ad is in middle of video\n private lastTrackedVideoEndObject: any;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n this.seekStarted = false;\n this.seekEnded = false;\n }\n\n public getAllStatesBut(states: string[]) {\n return this.getAllStates().filter((i) => states.indexOf(i) < 0);\n }\n\n public getAllStates() {\n return Object.keys(State).map((key) => State[key]);\n }\n\n public sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n\n public createStateMachine(opts: AnalyticsStateMachineOptions): StateMachine.StateMachine {\n return StateMachine.create({\n initial: State.SETUP,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n // {name: Event.SOURCE_LOADED, from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING], to: State.READY},\n {\n name: Event.SOURCE_LOADED,\n from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING, State.INITIAL_SOURCE_CHANGE],\n to: State.READY,\n },\n\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n {name: Event.PLAYING, from: State.READY, to: State.PLAYING},\n {name: Event.READY, from: State.READY, to: State.READY},\n {name: Event.VIDEO_CHANGE, from: State.READY, to: State.READY},\n {name: Event.AUDIO_CHANGE, from: State.READY, to: State.READY},\n\n {name: Event.ERROR, from: [State.STARTUP, State.AD_STARTUP], to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: [State.STARTUP, State.AD_STARTUP], to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n {name: Event.PLAY, from: State.STARTUP, to: State.STARTUP},\n {name: Event.PLAYING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.READY, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.PLAYING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.END_BUFFERING, from: State.REBUFFERING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n //#region Seeking\n\n // start seeking\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAY_SEEKING},\n\n // mark the seeked as finished\n {name: Event.PLAY, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.PLAYING, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n\n // seek while previous seek not completed\n {name: Event.SEEK, from: State.END_PLAY_SEEKING, to: State.PLAY_SEEKING},\n\n // seek completely finished and cont playing\n {name: Event.PLAYING, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n {name: Event.TIMECHANGED, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n //#region disable transitions\n // disable tranitions in PLAY_SEEKING\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n // disable transitions in END_PLAY_SEEKING\n {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.PLAY, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n // disable Seek events during PAUSE\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SEEKED, from: State.PAUSE, to: State.PAUSE},\n\n // ignore seeked during Playing because of not allowed keyboard seeking\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n\n //#endregion\n //#endregion\n\n {name: Event.END, from: State.PLAY_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n {name: Event.PLAY, from: State.END, to: State.STARTUP},\n\n {name: Event.ERROR, from: this.getAllStatesBut([State.STARTUP]), to: State.ERROR},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut([State.STARTUP, State.AD_STARTUP]), to: State.END},\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGING},\n {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n {name: Event.TIMECHANGED, from: State.SUBTITLE_CHANGING, to: State.PLAYING},\n\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: State.AUDIOTRACK_CHANGING},\n {name: Event.TIMECHANGED, from: State.AUDIOTRACK_CHANGING, to: State.PLAYING},\n\n // #region Ads\n {name: Event.START_AD, from: State.STARTUP, to: State.AD_STARTUP},\n {name: Event.END_AD, from: State.AD_STARTUP, to: State.STARTUP},\n {name: Event.PLAY, from: State.AD_STARTUP, to: State.AD_STARTUP},\n {name: Event.PAUSE, from: State.AD_STARTUP, to: State.AD_STARTUP},\n\n {name: Event.START_AD, from: State.READY, to: State.AD_READY},\n /** After the pre-rolls, the main content will always start playing, no matter if autoplay: true/false */\n {name: Event.END_AD, from: State.AD_READY, to: State.STARTUP},\n {name: Event.PLAY, from: State.AD_READY, to: State.AD_READY},\n {name: Event.PAUSE, from: State.AD_READY, to: State.AD_READY},\n\n {name: Event.START_AD, from: State.PAUSE, to: State.AD_PAUSE},\n {name: Event.END_AD, from: State.AD_PAUSE, to: State.PAUSE},\n {name: Event.PLAY, from: State.AD_PAUSE, to: State.AD_PAUSE},\n {name: Event.PAUSE, from: State.AD_PAUSE, to: State.AD_PAUSE},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD_PLAYING},\n {name: Event.END_AD, from: State.AD_PLAYING, to: State.PLAYING},\n {name: Event.PLAY, from: State.AD_PLAYING, to: State.AD_PLAYING},\n {name: Event.PAUSE, from: State.AD_PLAYING, to: State.AD_PLAYING},\n {name: Event.END, from: State.AD_PLAYING, to: State.END},\n\n // Ignore timechanged events during ads\n {name: Event.TIMECHANGED, from: State.AD_STARTUP, to: State.AD_STARTUP},\n {name: Event.TIMECHANGED, from: State.AD_READY, to: State.AD_READY},\n {name: Event.TIMECHANGED, from: State.AD_PAUSE, to: State.AD_PAUSE},\n {name: Event.TIMECHANGED, from: State.AD_PLAYING, to: State.AD_PLAYING},\n\n // Ignore End Ad events when no ad has started\n {name: Event.END_AD, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_AD, from: State.PAUSE, to: State.PAUSE},\n {name: Event.END_AD, from: State.READY, to: State.READY},\n {name: Event.END_AD, from: State.STARTUP, to: State.STARTUP},\n // #endregion\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE, State.PLAYING], to: State.CASTING},\n {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAYING, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.UN_MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: this.getAllStatesBut([State.SETUP]),\n to: State.SOURCE_CHANGING,\n },\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: State.SETUP,\n to: State.INITIAL_SOURCE_CHANGE,\n },\n {name: Event.SOURCE_UNLOADED, from: this.getAllStates(), to: State.SOURCE_CHANGING},\n\n // {name: Event.READY, from: State.SOURCE_CHANGING, to: State.READY},\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n ],\n callbacks: {\n onbeforeevent: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING && to === State.QUALITYCHANGE_REBUFFERING) {\n return false;\n }\n },\n onafterevent: (event, from, to, timestamp, eventObject) => {\n if (event === Event.MANUAL_SOURCE_CHANGE && from === State.SETUP) {\n this.stateMachineCallbacks.initialSourceChange(eventObject);\n } else if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n\n if (to === State.QUALITYCHANGE_PAUSE) {\n this.stateMachine.FINISH_QUALITYCHANGE_PAUSE(timestamp);\n }\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.QUALITYCHANGE_REBUFFERING) {\n this.stateMachine.FINISH_QUALITYCHANGE_REBUFFERING(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n },\n onenterstate: (\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || new Date().getTime();\n }\n\n logger.log(\n `[ENTER ${timestamp}] ${padRight(to, 20)} EVENT: ${padRight(event, 20)} from: ${padRight(from, 14)}`\n );\n\n if (\n eventObject &&\n to !== State.END_PLAY_SEEKING &&\n from !== State.PLAY_SEEKING &&\n from !== State.AD_STARTUP &&\n from !== State.AD_READY &&\n from !== State.AD_PLAYING &&\n from !== State.AD_PAUSE &&\n !(event === Event.SEEK && from === State.END_PLAY_SEEKING)\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n\n logger.log(\n `[LEAVE ${timestamp}] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to: ${padRight(to, 20)}`\n );\n\n this.addStatesToLog(event, from, to, timestamp, eventObject);\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (eventObject && to !== State.END_PLAY_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (eventObject && event !== Event.END_AD) {\n this.lastTrackedVideoEndObject = eventObject;\n }\n\n if ((from === State.READY || from === State.AD_STARTUP) && to === State.STARTUP) {\n this.setVideoStartTimeout();\n } else if (from === State.STARTUP && (to === State.PLAYING || to === State.AD_STARTUP)) {\n this.clearVideoStartTimeout();\n }\n\n const fnName = String(from).toLowerCase();\n if (to === State.EXIT_BEFORE_VIDEOSTART) {\n this.clearVideoStartTimeout();\n const eventData = this.getVideoStartupFailedEventData(timestamp, event, eventObject);\n const shouldSendSample = event !== Event.ERROR;\n this.stateMachineCallbacks.videoStartFailed(eventData, shouldSendSample);\n } else if (from === State.END_PLAY_SEEKING) {\n const seekDuration = this.seekedTimestamp - this.seekTimestamp;\n\n // do not enter here if\n // 1. no seek has started because of SEEK\n // 2. no seek has ended because of SEEKED event\n // 3. leave of END_PLAY_SEEKING was triggered by another SEEK event (continuous seeking)\n if (this.seekStarted && this.seekEnded && event !== Event.SEEK) {\n this.seekStarted = this.seekEnded = false;\n this.stateMachineCallbacks.end_play_seeking(seekDuration, fnName);\n }\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (\n from === State.AD_PAUSE ||\n from === State.AD_READY ||\n from === State.AD_PLAYING ||\n from === State.AD_STARTUP\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(this.lastTrackedVideoEndObject);\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(this.lastTrackedVideoEndObject);\n this.stateMachineCallbacks.ad(stateDuration, 'ad');\n } else if (event === Event.START_AD && from === State.STARTUP) {\n noOp();\n } else if (event === Event.SOURCE_LOADED && from === State.INITIAL_SOURCE_CHANGE) {\n noOp();\n } else if (from !== State.ERROR) {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n try {\n callbackFunction(stateDuration, fnName, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + fnName, eventObject, e);\n }\n } else {\n logger.error('Could not find callback function for ' + fnName);\n }\n }\n\n if (\n eventObject &&\n to !== State.END_PLAY_SEEKING &&\n from !== State.PLAY_SEEKING &&\n to !== State.PLAY_SEEKING &&\n from !== State.AD_STARTUP &&\n from !== State.AD_READY &&\n from !== State.AD_PLAYING &&\n from !== State.AD_PAUSE\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n }\n },\n onseek: (event, from, to, timestamp) => {\n if (!this.seekStarted) {\n this.seekTimestamp = timestamp;\n this.seekStarted = true;\n }\n },\n onseeked: (event, from, to, timestamp) => {\n this.seekedTimestamp = timestamp;\n this.seekEnded = true;\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n if (this.stateMachine.current !== 'PLAYING') {\n return;\n }\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n this.stateMachineCallbacks.heartbeat(stateDuration, String(from).toLowerCase(), {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n public callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n try {\n exec.call(this.stateMachine, timestamp, eventObject);\n } catch (e) {\n logger.error('Exception occured in State Machine callback ' + eventType, exec, eventObject, e);\n }\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n public addStatesToLog(\n event: string | undefined,\n from: string | undefined,\n to: string | undefined,\n timestamp: number,\n eventObject: any\n ) {\n if (this.enabledDebugging) {\n this.debuggingStates.push(new EventDebugging(event, from, to, timestamp, eventObject));\n }\n }\n\n public getStates() {\n return this.debuggingStates;\n }\n\n public setEnabledDebugging(enabled: boolean) {\n this.enabledDebugging = enabled;\n }\n}\n","import * as Utils from './Utils';\n\nexport class Converter {\n public static bytesToBits(bytes: number): number {\n return bytes * 8;\n }\n public static bitsToBytes(bits: number): number {\n return Math.round(bits / 8);\n }\n public static bytesToKiloBytes(bytes: number): number {\n return Utils.calculateTime(bytes * 1000);\n }\n public static kiloBytesToMegaBytes(kiloByte: number): number {\n return kiloByte * 1000;\n }\n}\n","import {SpeedMeasurement} from '../types/SpeedMeasurement';\n\nexport class Measure implements SpeedMeasurement {\n private download: SpeedMeasurement;\n\n get speed(): number {\n return this.download.size / this.download.duration;\n }\n get duration(): number {\n return this.download.duration;\n }\n get size(): number {\n return this.download.size;\n }\n get timeToFirstByte(): number {\n return this.download.timeToFirstByte;\n }\n get timestamp(): Date {\n return this.download.timestamp;\n }\n\n get httpStatus(): number {\n return this.download.httpStatus;\n }\n\n constructor(download: SpeedMeasurement) {\n this.download = download;\n }\n}\n","import {SegmentInfo} from '../types/SegmentInfo';\n\nexport class SegmentTracker {\n protected segments: SegmentInfo[];\n\n constructor() {\n this.segments = [];\n }\n\n public reset(): void {\n this.segments = [];\n }\n\n public addSegment(segment: SegmentInfo): void {\n this.segments.push(segment);\n }\n\n public removeSegment(url: string): void {\n this.segments = this.segments.filter((s) => s.url !== url);\n }\n\n public getSegments(): SegmentInfo[] {\n return this.segments;\n }\n}\n","import {Subscribable} from '../../core/EventDispatcher';\nimport {logger} from '../../utils/Logger';\nimport {Queue} from '../../utils/Queue';\nimport {HttpRequest} from './HttpRequest';\nimport {OnDownloadFinishedEventObject} from './OnDownloadFinishedEventObject';\n\nexport class HttpRequestTracking {\n private static DEFAULT_MAX_REQUESTS = 10;\n private _maxRequests: number = HttpRequestTracking.DEFAULT_MAX_REQUESTS;\n private _httpRequestQueue = new Queue<HttpRequest>();\n\n public get maxRequests(): number {\n return this._maxRequests;\n }\n\n public get httpRequests(): ReadonlyArray<HttpRequest> {\n return this._httpRequestQueue.items;\n }\n\n constructor(private subscribables: Array<Subscribable<OnDownloadFinishedEventObject>>) {\n subscribables.forEach((subscribable) => subscribable.subscribe(this.onDownloadFinishedHandler));\n }\n\n public configure(maxRequests: number) {\n this._maxRequests = maxRequests;\n this._httpRequestQueue.limit(maxRequests);\n }\n\n public disable() {\n this.subscribables.forEach((subscribable) => subscribable.unsubscribe(this.onDownloadFinishedHandler));\n this._httpRequestQueue.clear();\n }\n\n public reset() {\n this._httpRequestQueue.clear();\n }\n\n private onDownloadFinishedHandler = (event: OnDownloadFinishedEventObject) => {\n try {\n this.addRequest(event.httpRequest);\n } catch (error) {\n logger.error(`HttpRequestTracking.onDownloadFinished: Error in handler`, error);\n }\n };\n\n private addRequest(httpRequest: HttpRequest) {\n this._httpRequestQueue.offer(httpRequest);\n this._httpRequestQueue.limit(this._maxRequests);\n }\n}\n","export class Queue<T> {\n private readonly _items: T[] = [];\n\n public get items(): ReadonlyArray<T> {\n return this._items;\n }\n\n public get length() {\n return this._items.length;\n }\n\n public offer(item: T) {\n this._items.push(item);\n }\n\n public poll(): T | undefined {\n return this._items.shift();\n }\n\n public clear() {\n this._items.splice(0);\n }\n\n public limit(maxElements: number) {\n while (this._items.length > maxElements) {\n this.poll();\n }\n }\n}\n","import {PlayerAPI, UserInteractionEvent} from 'bitmovin-player';\nimport {WindowEventTracker} from '../../../utils/WindowEventTracker';\nimport {AdCallbacks, AdModuleAPI} from './AdModuleAPI';\n\nexport class Bitmovin8AdModule implements AdModuleAPI {\n public adCallbacks = new AdCallbacks();\n\n constructor(private player: PlayerAPI, private windowEventTracker: WindowEventTracker) {\n this.register();\n }\n\n public isLinearAdActive = () => {\n if (this.player.ads) {\n return (this.player.ads as any).isLinearAdActive() || false;\n }\n return false;\n };\n public getContainer = () => this.player.getContainer();\n public getAdModuleInfo = () => {\n if (this.player.ads) {\n return (this.player.ads as any).getModuleInfo();\n }\n return {name: undefined, version: undefined};\n };\n public currentTime = () => this.player.getCurrentTime();\n\n private register() {\n this.player.on(this.player.exports.PlayerEvent.Play, (e: UserInteractionEvent) => {\n if (e.issuer === 'advertising-api') {\n this.adCallbacks.onPlay(e.issuer);\n }\n });\n this.player.on(this.player.exports.PlayerEvent.Paused, (e: UserInteractionEvent) => {\n if (e.issuer === 'advertising-api') {\n this.adCallbacks.onPause(e.issuer);\n }\n });\n this.player.on(this.player.exports.PlayerEvent.AdStarted, (event: any) => {\n this.adCallbacks.onAdStarted(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdFinished, (event: any) => {\n this.adCallbacks.onAdFinished(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdBreakStarted, (event: any) => {\n this.adCallbacks.onAdBreakStarted(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdBreakFinished, (event: any) => {\n this.adCallbacks.onAdBreakFinished(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdClicked, (event: any) => {\n this.adCallbacks.onAdClicked(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdQuartile, (event: any) => {\n this.adCallbacks.onAdQuartile(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdSkipped, (event: any) => {\n this.adCallbacks.onAdSkipped(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdError, (event: any) => {\n this.adCallbacks.onAdError(event);\n });\n this.player.on(this.player.exports.PlayerEvent.AdManifestLoaded, (event: any) => {\n this.adCallbacks.onAdManifestLoaded(event);\n });\n const handlePageClose = () => {\n this.adCallbacks.onBeforeUnload();\n };\n this.windowEventTracker.addEventListener('beforeunload', handlePageClose);\n this.windowEventTracker.addEventListener('unload', handlePageClose);\n }\n}\n","export class AdCallbacks {\n public onAdStarted = (event: any) => {};\n public onAdFinished = (event: any) => {};\n public onAdBreakStarted = (event: any) => {};\n public onAdBreakFinished = (event: any) => {};\n public onAdClicked = (event: any) => {};\n public onAdError = (event: any) => {};\n public onAdManifestLoaded = (event: any) => {};\n public onAdQuartile = (event: any) => {};\n public onAdSkipped = (event: any) => {};\n public onPlay = (issuer?: string) => {};\n public onPause = (issuer?: string) => {};\n public onBeforeUnload = () => {};\n}\n\nexport interface AdModuleAPI {\n readonly adCallbacks: AdCallbacks;\n isLinearAdActive: () => boolean;\n getContainer: () => HTMLElement;\n getAdModuleInfo: () => {name?: string; version?: string};\n currentTime: () => number;\n}\n","import {DownloadFinishedEvent, PlayerAPI, PlayerExports} from 'bitmovin-player';\nimport {EventDispatcher, Subscribable} from '../../core/EventDispatcher';\nimport {HttpRequestType} from '../../features/httprequesttracking/HttpRequestType';\nimport {OnDownloadFinishedEventObject} from '../../features/httprequesttracking/OnDownloadFinishedEventObject';\nimport {calculateTimeWithUndefined, getCurrentTimestamp} from '../../utils/Utils';\n\nexport class Bitmovin8HttpRequestTrackingAdapter implements Subscribable<OnDownloadFinishedEventObject> {\n private eventDispatcher = new EventDispatcher<OnDownloadFinishedEventObject>();\n private playerExports: PlayerExports;\n\n constructor(player: PlayerAPI) {\n this.playerExports = player.exports;\n player.on(this.playerExports.PlayerEvent.DownloadFinished, (event) =>\n this.onDownloadFinished(event as DownloadFinishedEvent)\n );\n }\n\n public subscribe(callback: (args: OnDownloadFinishedEventObject) => void): () => void {\n return this.eventDispatcher.subscribe(callback);\n }\n\n public unsubscribe(callback: (args: OnDownloadFinishedEventObject) => void) {\n this.eventDispatcher.unsubscribe(callback);\n }\n\n private onDownloadFinished(event?: DownloadFinishedEvent) {\n this.eventDispatcher.dispatch({\n httpRequest: {\n downloadTime: calculateTimeWithUndefined(event?.downloadTime) ?? 0,\n httpStatus: event?.httpStatus ?? 0,\n success: event?.success ?? false,\n timestamp: getCurrentTimestamp(),\n url: event?.url,\n size: event?.size,\n timeToFirstByte: calculateTimeWithUndefined(event?.timeToFirstByte),\n type: this.mapHttpRequestType(event?.downloadType),\n },\n });\n }\n\n private mapHttpRequestType(downloadType?: string): HttpRequestType {\n switch (downloadType) {\n case this.playerExports.HttpRequestType.MANIFEST_DASH:\n return HttpRequestType.MANIFEST_DASH;\n case this.playerExports.HttpRequestType.MANIFEST_HLS_MASTER:\n return HttpRequestType.MANIFEST_HLS_MASTER;\n case this.playerExports.HttpRequestType.MANIFEST_HLS_VARIANT:\n return HttpRequestType.MANIFEST_HLS_VARIANT;\n case this.playerExports.HttpRequestType.MANIFEST_SMOOTH:\n return HttpRequestType.MANIFEST_SMOOTH;\n case this.playerExports.HttpRequestType.MANIFEST_ADS:\n return HttpRequestType.MANIFEST_ADS;\n case this.playerExports.HttpRequestType.MEDIA_AUDIO:\n return HttpRequestType.MEDIA_AUDIO;\n case this.playerExports.HttpRequestType.MEDIA_VIDEO:\n return HttpRequestType.MEDIA_VIDEO;\n case this.playerExports.HttpRequestType.MEDIA_SUBTITLES:\n return HttpRequestType.MEDIA_SUBTITLES;\n case this.playerExports.HttpRequestType.MEDIA_THUMBNAILS:\n return HttpRequestType.MEDIA_THUMBNAILS;\n case this.playerExports.HttpRequestType.DRM_LICENSE_WIDEVINE:\n return HttpRequestType.DRM_LICENSE_WIDEVINE;\n case this.playerExports.HttpRequestType.DRM_LICENSE_PLAYREADY:\n return HttpRequestType.DRM_LICENSE_PLAYREADY;\n case this.playerExports.HttpRequestType.DRM_LICENSE_FAIRPLAY:\n return HttpRequestType.DRM_LICENSE_FAIRPLAY;\n case this.playerExports.HttpRequestType.DRM_LICENSE_PRIMETIME:\n return HttpRequestType.DRM_LICENSE_PRIMETIME;\n case this.playerExports.HttpRequestType.DRM_LICENSE_CLEARKEY:\n return HttpRequestType.DRM_LICENSE_CLEARKEY;\n case this.playerExports.HttpRequestType.DRM_CERTIFICATE_FAIRPLAY:\n return HttpRequestType.DRM_CERTIFICATE_FAIRPLAY;\n case this.playerExports.HttpRequestType.KEY_HLS_AES:\n return HttpRequestType.KEY_HLS_AES;\n case this.playerExports.HttpRequestType.TIME_SYNC:\n return HttpRequestType.TIME_SYNC;\n default:\n return HttpRequestType.UNKNOWN;\n }\n }\n}\n","export enum HttpRequestType {\n DRM_LICENSE_WIDEVINE = 'DRM_LICENSE_WIDEVINE',\n DRM_OTHER = 'DRM_OTHER',\n MEDIA_THUMBNAILS = 'MEDIA_THUMBNAILS',\n MEDIA_VIDEO = 'MEDIA_VIDEO',\n MEDIA_AUDIO = 'MEDIA_AUDIO',\n MEDIA_PROGRESSIVE = 'MEDIA_PROGRESSIVE',\n MEDIA_SUBTITLES = 'MEDIA_SUBTITLES',\n MANIFEST_DASH = 'MANIFEST_DASH',\n MANIFEST_HLS = 'MANIFEST_HLS',\n MANIFEST_HLS_MASTER = 'MANIFEST_HLS_MASTER',\n MANIFEST_HLS_VARIANT = 'DRM_LICENSMANIFEST_HLS_VARIANTE_WIDEVINE',\n MANIFEST_SMOOTH = 'MANIFEST_SMOOTH',\n MANIFEST = 'MANIFEST',\n KEY_HLS_AES = 'KEY_HLS_AES',\n UNKNOWN = 'UNKNOWN',\n TIME_SYNC = 'TIME_SYNC',\n DRM_CERTIFICATE_FAIRPLAY = 'DRM_CERTIFICATE_FAIRPLAY',\n DRM_LICENSE_CLEARKEY = 'DRM_LICENSE_CLEARKEY',\n DRM_LICENSE_PRIMETIME = 'DRM_LICENSE_PRIMETIME',\n DRM_LICENSE_FAIRPLAY = 'DRM_LICENSE_FAIRPLAY',\n DRM_LICENSE_PLAYREADY = 'DRM_LICENSE_PLAYREADY',\n MANIFEST_ADS = 'MANIFEST_ADS',\n}\n","import {PlayerAPI} from 'bitmovin-player';\nimport {SegmentTracker} from '../../core/SegmentTracker';\nimport {SegmentInfo} from '../../types/SegmentInfo';\nimport * as Utils from '../../utils/Utils';\n\ninterface DownloadFinishedEvent {\n attempt?: number;\n downloadType?: string;\n httpStatus: number;\n mimeType?: string;\n success: boolean;\n timestamp: number;\n type: string;\n url: string;\n}\n\ninterface SegmentPlaybackEvent {\n duration?: number;\n mediaInfo?: any;\n mimeType?: string;\n playbackTime?: number;\n representationId?: string;\n timestamp?: number;\n type?: string;\n uid?: string;\n url?: string;\n}\n\nexport class Bitmovin8SegmentTrackerAdapter {\n private segmentTracker: SegmentTracker;\n\n constructor(player: PlayerAPI, segmentTracker: SegmentTracker) {\n this.segmentTracker = segmentTracker;\n\n player.on(player.exports.PlayerEvent.DownloadFinished, (event) => this.handleOnDownloadFinishEvent(event));\n player.on(player.exports.PlayerEvent.SegmentPlayback, (event) => this.handleSegmentPlaybackEvent(event));\n }\n\n public getSegmentTracker(): SegmentTracker {\n return this.segmentTracker;\n }\n\n public handleOnDownloadFinishEvent(event: DownloadFinishedEvent & any) {\n if (event.downloadType.indexOf('media/video') === 0) {\n const url = event.url;\n const segment: SegmentInfo = {\n name: Utils.getURLResourceName(url),\n url,\n timestamp: event.timestamp,\n };\n this.segmentTracker.addSegment(segment);\n }\n }\n\n public handleSegmentPlaybackEvent = (event: SegmentPlaybackEvent & any) => {\n this.segmentTracker.removeSegment(event.url);\n };\n}\n","import {PlayerAPI} from 'bitmovin-player';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\n\nexport class Bitmovin8SpeedMeterAdapter {\n private meter: DownloadSpeedMeter;\n\n constructor(player: PlayerAPI, meter: DownloadSpeedMeter) {\n this.meter = meter;\n player.on(player.exports.PlayerEvent.DownloadFinished, (event) => this.handleOnDownloadFinishEvent(event));\n }\n\n public getDownloadSpeedMeter(): DownloadSpeedMeter {\n return this.meter;\n }\n\n public handleOnDownloadFinishEvent(event: any) {\n if (!event.success) {\n return;\n }\n if (event.downloadType.indexOf('media/video') === 0) {\n this.meter.addMeasurement({\n duration: event.downloadTime,\n size: event.size,\n timeToFirstByte: event.timeToFirstByte,\n timestamp: new Date(),\n httpStatus: event.httpStatus,\n });\n }\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {CAFv3InternalAdapter} from './internal/CAFv3InternalAdapter';\n\nexport class CAFv3Adapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new CAFv3InternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {HTML5AnalyticsStateMachine} from '../../analyticsStateMachines/HTML5AnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class CAFv3InternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n private playerManager;\n private mediaInformation;\n private activeAudioTrack;\n private activeTextTracks;\n private currentItem;\n private isSeeking: boolean;\n\n constructor(protected context: any, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new HTML5AnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.playerManager = context.getPlayerManager();\n this.isSeeking = false;\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.register();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public getPlayerVersion(): string {\n return (window as any).cast && (window as any).cast.framework ? (window as any).cast.framework.VERSION : 'unknown';\n }\n\n public getPlayerName = () => Player.CHROMECAST_SHAKA;\n public getPlayerTech = () => 'html5';\n public getAutoPlay = () => (this.currentItem && this.currentItem.autoplay ? this.currentItem.autoplay : false);\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public sourceChange(config: AnalyticsConfig, timestamp: number) {\n this.stateMachine.sourceChange(config, timestamp, this.playerManager.getCurrentTimeSec());\n }\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n const stats = (this.playerManager as any).getStats();\n\n const info: PlaybackInfo = {\n isLive: this.getIsLive(),\n playerTech: this.getPlayerTech(),\n videoDuration: this.mediaInformation ? this.mediaInformation.duration : undefined,\n videoPlaybackHeight: stats.height,\n videoPlaybackWidth: stats.width,\n audioCodec: this.activeAudioTrack ? this.activeAudioTrack.trackContentType : undefined,\n audioLanguage: this.activeAudioTrack ? this.activeAudioTrack.language : undefined,\n subtitleLanguage: this.activeTextTracks ? this.activeTextTracks.map((t) => t.language).join(',') : undefined,\n droppedFrames: 0, // TODO\n };\n\n return info;\n }\n\n public register() {\n this.playerManager.addEventListener('PLAYER_LOADING', (event) => {\n this.eventCallback(Event.SETUP, {});\n });\n\n this.playerManager.addEventListener('PLAYER_LOAD_COMPLETE', (event) => {\n const audioTracksManager = this.playerManager.getAudioTracksManager();\n this.activeAudioTrack = audioTracksManager.getActiveTrack();\n\n // captions\n const textTracksManager = this.playerManager.getTextTracksManager();\n this.activeTextTracks = textTracksManager.getActiveTracks();\n\n const queueManager = this.playerManager.getQueueManager();\n this.currentItem = queueManager.getCurrentItem();\n\n this.mediaInformation = event.media;\n\n this.eventCallback(Event.READY, {});\n });\n\n this.playerManager.addEventListener('PLAY', (event) => {\n this.eventCallback(Event.PLAY, {\n currentTime: event.currentMediaTime,\n });\n });\n\n this.playerManager.addEventListener('PAUSE', (event) => {\n this.onPaused(this.playerManager.getCurrentTimeSec());\n });\n\n this.playerManager.addEventListener('ERROR', (event) => {\n const errorData = event.error != null ? event.error : undefined;\n this.eventCallback(Event.ERROR, {\n currentTime: this.playerManager.getCurrentTimeSec(),\n code: event.detailedErrorCode,\n message: event.reason,\n legacyData: errorData,\n data: {additionalData: JSON.stringify(errorData)},\n });\n });\n\n this.playerManager.addEventListener('SEEKING', (event) => {\n this.isSeeking = true;\n this.onPaused(event.currentMediaTime);\n this.eventCallback(Event.SEEK, {\n currentTime: event.currentMediaTime,\n });\n });\n\n this.playerManager.addEventListener('SEEKED', (event) => {\n this.isSeeking = false;\n this.eventCallback(Event.SEEKED, {\n currentTime: event.currentMediaTime,\n });\n });\n\n // Fired when the browser is trying to fetch media data,\n // but did not receive a response. The cast.framework.events.EventType.BUFFERING\n // event is implemented consistently across stream types, and should be used instead\n // of 'stalled' when trying to check if the player is buffering.\n this.playerManager.addEventListener('STALLED', (event) => {});\n\n this.playerManager.addEventListener('BUFFERING', (event) => {\n if (!this.isSeeking && event.isBuffering) {\n this.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime,\n });\n }\n });\n\n this.playerManager.addEventListener('TIME_UPDATE', (event) => {\n if (!this.isSeeking) {\n this.eventCallback(Event.TIMECHANGED, {\n currentTime: event.currentMediaTime,\n });\n }\n });\n\n this.playerManager.addEventListener('REQUEST_LOAD', (event) => {\n // this event is triggered whenever new content is to be played\n // it's not necessary to do license call and reset all data if this is the first item being played\n if (this.currentItem) {\n this.eventCallback(Event.PLAYLIST_TRANSITION, {\n currentTime: this.playerManager.getCurrentTimeSec(),\n });\n }\n });\n }\n\n public onPaused(currentTime?: number) {\n this.eventCallback(Event.PAUSE, {\n currentTime,\n });\n }\n\n protected get currentTime(): number {\n return this.playerManager.getCurrentTimeSec();\n }\n\n private getIsLive(): boolean | undefined {\n // needs to be explicitly set to \"LIVE\" by customers in their receiver implementation\n if (this.mediaInformation && this.mediaInformation.streamType === 'LIVE') {\n return true;\n }\n\n // hack because object exists only for live streams\n const liveSeekableRange = this.playerManager.getLiveSeekableRange();\n\n if (liveSeekableRange) {\n return true;\n }\n\n return undefined;\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {DashjsInternalAdapter} from './internal/DashjsInternalAdapter';\n\nexport class DashjsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new DashjsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {logger} from '../../utils/Logger';\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class DashjsInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(private mediaPlayer: any, opts?: AnalyticsStateMachineOptions) {\n super(null, opts);\n }\n\n /**\n * @override\n */\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n super.initialize(analytics);\n let videoEl: HTMLVideoElement | null = null;\n try {\n videoEl = this.mediaPlayer.getVideoElement();\n } catch (e) {} // tslint:disable-line:no-empty\n\n if (!videoEl) {\n this.mediaPlayer.on(\n 'manifestLoaded',\n () => {\n videoEl = this.mediaPlayer.getVideoElement();\n this.setMediaElement(videoEl);\n this.registerMediaElementEventsForDashJS();\n },\n this\n );\n } else {\n this.setMediaElement(videoEl);\n this.registerMediaElementEventsForDashJS();\n }\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public registerMediaElementEventsForDashJS() {\n const mediaElement = this.mediaElement;\n\n if (!mediaElement) {\n return;\n }\n\n this.listenToMediaElementEvent('playing', () => {\n const {currentTime} = mediaElement;\n this.needsFirstPlayIntent = false;\n this.eventCallback(Event.TIMECHANGED, {\n currentTime,\n });\n });\n }\n\n public getPlayerName = () => Player.DASHJS;\n public getPlayerVersion = () => this.mediaPlayer.getVersion();\n\n /**\n * @override\n */\n public getMIMEType() {\n return MIMETypes.DASH;\n }\n /**\n * @override\n */\n public getStreamURL(): string | undefined {\n if (!this.mediaPlayer) {\n return;\n }\n\n const source = this.mediaPlayer.getSource();\n if (source) {\n return source.toString();\n }\n }\n /**\n * Implemented by sub-class to deliver current quality-level info\n * specific to media-engine.\n * @override\n * @returns {QualityLevelInfo}\n */\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n if (!this.mediaPlayer) {\n return null;\n }\n\n // info not available on source change, methods exist but throw exception\n try {\n const videoBitrateInfoList = this.mediaPlayer.getBitrateInfoListFor('video');\n const currentVideoQualityIndex = this.mediaPlayer.getQualityFor('video');\n const currentVideoQuality = videoBitrateInfoList[currentVideoQualityIndex];\n\n if (currentVideoQuality == null) {\n return null;\n }\n\n const {width, height, bitrate} = currentVideoQuality;\n return {\n width,\n height,\n bitrate,\n };\n } catch (error) {\n logger.warning('Quality information not available');\n }\n\n return null;\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {HlsInternalAdapter} from './internal/HlsInternalAdapter';\n\nexport class HlsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new HlsInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {Analytics} from '../../core/Analytics';\nimport {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DownloadSpeedInfo} from '../../types/DownloadSpeedInfo';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {SubtitleInfo} from '../../types/SubtitleInfo';\nimport {HlsSpeedMeterAdapter} from './HlsSpeedMeterAdapter';\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class HlsInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n get downloadSpeedInfo(): DownloadSpeedInfo {\n return this.speedMeter.getInfo();\n }\n\n private speedMeter: DownloadSpeedMeter;\n\n constructor(private hls: Hls, opts?: AnalyticsStateMachineOptions) {\n super(null, opts);\n this.resetMedia();\n this.speedMeter = new HlsSpeedMeterAdapter(hls, new DownloadSpeedMeter()).getDownloadSpeedMeter();\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n super.initialize(analytics);\n this.registerHlsEvents();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public clearValues(): void {\n this.speedMeter.reset();\n }\n\n public getPlayerName = () => Player.HLSJS;\n public getPlayerVersion = () => (this.hls as any).constructor.version;\n\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n if (!this.hls.levels) {\n return null;\n }\n const currentLevelObj = this.hls.levels[this.hls.currentLevel];\n if (!currentLevelObj) {\n return null;\n }\n\n const bitrate = currentLevelObj.bitrate;\n const width = currentLevelObj.width;\n const height = currentLevelObj.height;\n\n return {\n bitrate,\n width,\n height,\n };\n }\n\n /**\n * @override\n */\n public isLive = () => {\n const hls = this.hls;\n if (!hls.levels || !hls.currentLevel) {\n return false;\n }\n if (hls.currentLevel < 0) {\n return false;\n }\n const currentLevelObj = hls.levels[hls.currentLevel];\n if (!currentLevelObj) {\n return false;\n }\n return currentLevelObj.details.live;\n };\n\n /**\n * @override\n */\n public getMIMEType() {\n return MIMETypes.HLS;\n }\n\n /**\n * @override\n */\n public getStreamURL() {\n return (this.hls as any).url;\n }\n\n public registerHlsEvents() {\n const hls = this.hls as any;\n\n hls.on(hls.constructor.Events.MEDIA_ATTACHING, this.onMediaAttaching.bind(this));\n hls.on(hls.constructor.Events.MEDIA_DETACHING, this.onMediaDetaching.bind(this));\n hls.on(hls.constructor.Events.MANIFEST_LOADING, this.onManifestLoading.bind(this));\n hls.on(hls.constructor.Events.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched.bind(this));\n hls.on(hls.constructor.Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleLanguageSwitched.bind(this));\n hls.on(hls.constructor.Events.DESTROYING, this.onDestroying.bind(this));\n hls.on(hls.constructor.Events.ERROR, this.onHlsError.bind(this));\n\n // media is already attached, event has been triggered before\n // or we are in the event handler of this event itself.\n // we can not know how the stacktrace to this constructor will look like.\n // therefore we will guard from this case in\n // the onMediaAttaching method (avoid running it twice)\n if (hls.media) {\n this.onMediaAttaching();\n this.onManifestLoading();\n }\n }\n\n public onMediaAttaching() {\n // in case we are called again (when we are triggering this ourselves\n // but from the event handler of MEDIA_ATTACHING) we should not run again.\n if (this.mediaElement) {\n return;\n }\n\n this.mediaElement = this.hls.media;\n\n this.registerMediaElement();\n this.onMaybeReady();\n }\n\n public onMediaDetaching() {\n this.unregisterMediaElement();\n }\n\n public onManifestLoading() {\n this.onMaybeReady();\n }\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n const selectedSubtitle = this.getSelectedSubtitleLanguage();\n\n const info: PlaybackInfo = {\n ...super.getCurrentPlaybackInfo(),\n audioLanguage: this.getSelectedAudioLanguage(),\n subtitleEnabled: selectedSubtitle != null ? selectedSubtitle.enabled : undefined,\n subtitleLanguage: selectedSubtitle != null ? selectedSubtitle.language : undefined,\n };\n\n return info;\n }\n\n /**\n * errorData: { type : error type, details : error details, fatal : if true, hls.js cannot/will not try to recover, if false, hls.js will try to recover,other error specific data }\n * https://hls-js.netlify.com/api-docs/file/src/events.js.html#lineNumber98\n */\n public onHlsError(errorName, errorData) {\n const isFatal = errorData ? errorData.fatal : true;\n if (isFatal) {\n const mediaElement = this.mediaElement;\n let currentTime;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n\n const errorMessage = errorData != null ? `${errorData.type}: ${errorData.details}` : undefined;\n this.eventCallback(Event.ERROR, {\n currentTime,\n code: this.getErrorCodeFromHlsErrorType(errorData.type),\n message: errorMessage,\n data: {},\n });\n }\n }\n\n public onAudioTrackSwitched(event: string, data: {id: string}) {\n const mediaElement = this.mediaElement;\n let currentTime;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n\n this.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime,\n });\n }\n\n public onSubtitleLanguageSwitched(event: string, data: {id: string}) {\n const mediaElement = this.mediaElement;\n let currentTime;\n if (mediaElement != null) {\n currentTime = mediaElement.currentTime;\n }\n\n this.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime,\n });\n }\n\n private onDestroying = () => {\n this.eventCallback(Event.SOURCE_UNLOADED, {});\n this.release();\n };\n\n /**\n * returns mapped error code for Hlsjs ErrorTypes\n * @param type one of the ErrorTypes according to https://github.com/video-dev/hls.js/blob/master/src/errors.ts\n */\n private getErrorCodeFromHlsErrorType(type: string): number {\n switch (type) {\n case 'networkError':\n return 2;\n case 'mediaError':\n return 3;\n case 'keySystemError':\n return 4;\n case 'muxError':\n return 5;\n // default equals `otherError`\n default:\n return 1;\n }\n }\n\n private getSelectedAudioLanguage(): string | undefined {\n if (this.hls.audioTrack == null || this.hls.audioTrack < 0) {\n return undefined;\n }\n return (this.hls.audioTracks[this.hls.audioTrack] as any).lang;\n }\n\n private getSelectedSubtitleLanguage(): SubtitleInfo | undefined {\n // Check if function is supported (in latest hls version), otherwise use fallback option\n if (this.hls.subtitleDisplay != null) {\n const isSubtitleDisplayed = this.hls.subtitleTrack >= 0 && this.hls.subtitleDisplay === true;\n return {\n enabled: isSubtitleDisplayed,\n language: isSubtitleDisplayed ? this.hls.subtitleTracks[this.hls.subtitleTrack].lang : undefined,\n };\n } else {\n const {subtitleTrackController} = this.hls as any;\n if (subtitleTrackController != null && subtitleTrackController.media != null) {\n return this.getSelectedSubtitleFromMediaElement(subtitleTrackController.media);\n }\n }\n return undefined;\n }\n}\n","import {DownloadSpeedMeter} from '../../core/DownloadSpeedMeter';\n\nexport class HlsSpeedMeterAdapter {\n private meter: DownloadSpeedMeter;\n\n constructor(hls: any, meter: DownloadSpeedMeter) {\n this.meter = meter;\n hls.on(hls.constructor.Events.FRAG_LOADED, (eventName, data) => this.handleFragmentLoadedEvent(data));\n }\n\n public getDownloadSpeedMeter(): DownloadSpeedMeter {\n return this.meter;\n }\n\n public handleFragmentLoadedEvent(data: {frag: any; stats: any; networkDetails: any}) {\n if (data.frag.type !== 'main') {\n return;\n }\n // See hls documentation https://github.com/video-dev/hls.js/blob/master/src/types/loader.ts#L35\n this.meter.addMeasurement({\n duration: (data.stats.tload - data.stats.trequest) / 1000,\n size: data.stats.total,\n timeToFirstByte: (data.stats.tfirst - data.stats.trequest) / 1000,\n timestamp: new Date(),\n httpStatus: data.networkDetails.status,\n });\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {HTMLVideoElementInternalAdapter} from './internal/HTMLVideoElementInternalAdapter';\n\nexport class HTMLVideoElementAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: HTMLVideoElement, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new HTMLVideoElementInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","import {Player} from '../../enums/Player';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {getBrowserInfo} from '../../utils/Utils';\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class HTMLVideoElementInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(mediaElement: HTMLVideoElement, opts?: AnalyticsStateMachineOptions) {\n super(mediaElement, opts);\n }\n\n public getPlayerName = () => Player.HTML5;\n public getPlayerVersion = () => {\n const browserInfo = getBrowserInfo();\n return `${browserInfo.name} ${browserInfo.version}`;\n };\n /**\n * @override\n */\n public getStreamURL() {\n return this.mediaElement ? this.mediaElement.currentSrc : undefined;\n }\n\n /**\n * Implemented by sub-class to deliver current quality-level info\n * specific to media-engine.\n * @override\n * @returns {QualityLevelInfo}\n */\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n return {\n bitrate: undefined,\n width: this.mediaElement ? this.mediaElement.videoWidth : undefined,\n height: this.mediaElement ? this.mediaElement.videoHeight : undefined,\n };\n }\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {Event} from '../enums/Event';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {ShakaInternalAdapter} from './internal/ShakaInternalAdapter';\n\nexport class ShakaAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new ShakaInternalAdapter(player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n this.wrapPlayerLoad(player);\n }\n\n // The Shaka player's `load()` method does not trigger error events for exceptions thrown while loading the manifest.\n // Therefore we wrap this method and catch exceptions and forward them to analytics.\n private wrapPlayerLoad(player: any) {\n const originalLoad = player.load;\n\n player.load = (...args: Parameters<typeof player.load>): Promise<void> => {\n return new Promise(async (resolve, reject) => {\n try {\n await originalLoad.apply(player, args);\n } catch (error) {\n this.sendError(error);\n reject(error);\n }\n resolve();\n });\n };\n }\n\n private sendError(error): void {\n (this.internalAdapter as ShakaInternalAdapter).eventCallback(Event.ERROR, {\n currentTime: 0,\n // See https://github.com/shaka-project/shaka-player/blob/main/lib/util/error.js\n code: error?.code ?? undefined,\n message: JSON.stringify({category: error?.category, severity: error?.severity}),\n data: {additionalData: JSON.stringify(error?.data)},\n });\n }\n}\n","import {Analytics} from '../../core/Analytics';\nimport {Event} from '../../enums/Event';\nimport {MIMETypes} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {HTML5InternalAdapter} from './HTML5InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class ShakaInternalAdapter extends HTML5InternalAdapter implements InternalAdapterAPI {\n constructor(private player: any, opts?: AnalyticsStateMachineOptions) {\n super(player.getMediaElement(), opts);\n }\n\n /**\n * @override\n */\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n super.initialize(analytics);\n let videoElement: HTMLVideoElement | undefined;\n try {\n videoElement = this.player.getMediaElement();\n } catch (e) {} // tslint:disable-line:no-empty\n\n if (videoElement == null) {\n const onStateChangeEventListener = (state) => {\n if (state.state === 'media-source') {\n this.player.removeEventListener('onstatechange', onStateChangeEventListener);\n videoElement = this.player.getMediaElement();\n this.setMediaElement(videoElement);\n }\n };\n this.player.addEventListener('onstatechange', onStateChangeEventListener);\n this.player.addEventListener('unloading', this.onUnloading.bind(this));\n } else {\n this.setMediaElement(videoElement);\n }\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public getPlayerName = () => Player.SHAKA;\n\n public getPlayerVersion = () => this.player.constructor.version;\n\n public isLive = () => {\n return this.player ? this.player.isLive() : false;\n };\n\n /**\n * @override\n */\n public getMIMEType() {\n // FIXME: Could be HLS too, Shaka probably has a method to find out\n return MIMETypes.DASH;\n }\n\n /**\n * @override\n */\n public getStreamURL() {\n return this.player ? this.player.getAssetUri() : null;\n }\n\n /**\n * Implemented by sub-class to deliver current quality-level info\n * specific to media-engine.\n * @override\n * @returns {QualityLevelInfo}\n */\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n const variantTracks = this.player.getVariantTracks();\n\n const activeVideoTrack = variantTracks\n .filter((track: any) => track.active)\n .filter((track: any) => track.videoCodec || track.videoId !== undefined)[0];\n\n if (!activeVideoTrack) {\n // can only happen for audio-only streams\n return null;\n }\n\n const bitrate = activeVideoTrack.videoBandwidth || activeVideoTrack.bandwidth;\n const width = activeVideoTrack.width;\n const height = activeVideoTrack.height;\n\n return {\n bitrate,\n width,\n height,\n };\n }\n\n private onUnloading = () => {\n this.eventCallback(Event.SOURCE_UNLOADED, {});\n this.release();\n };\n}\n","import {AdapterAPI} from '../api/AdapterAPI';\nimport {Analytics} from '../core/Analytics';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {logger} from '../utils/Logger';\nimport {Adapter} from './Adapter';\nimport {VideojsInternalAdapter} from './internal/VideojsInternalAdapter';\n\nexport class VideojsAdapter extends Adapter implements AdapterAPI {\n constructor(config: AnalyticsConfig, player: any, opts?: AnalyticsStateMachineOptions) {\n super();\n if (this.hasPlayerAlreadyBeenAugmented(player)) {\n logger.errorMessageToUser('Bitmovin Analytics is already hooked up to this player instance');\n return;\n }\n this.markPlayerInstanceAsAugmented(player);\n this.internalAdapter = new VideojsInternalAdapter(player as videojs.default.Player, opts);\n this.analytics = new Analytics(config, this.internalAdapter);\n }\n}\n","// tslint:disable:no-shadowed-variable\nimport {VideojsAnalyticsStateMachine} from '../../analyticsStateMachines/VideoJsAnalyticsStateMachine';\nimport {Analytics} from '../../core/Analytics';\nimport VideoCompletionTracker from '../../core/VideoCompletionTracker';\nimport * as CodecHelper from '../../enums/Codecs';\nimport {Event} from '../../enums/Event';\nimport {getMIMETypeFromFileExtension} from '../../enums/MIMETypes';\nimport {Player} from '../../enums/Player';\nimport {PlayerSize} from '../../enums/PlayerSize';\nimport {getStreamTypeFromMIMEType} from '../../enums/StreamTypes';\nimport {ErrorDetailBackend} from '../../features/errordetails/ErrorDetailBackend';\nimport {ErrorDetailTracking} from '../../features/errordetails/ErrorDetailTracking';\nimport {Feature} from '../../features/Feature';\nimport {FeatureConfig} from '../../features/FeatureConfig';\nimport {AnalyticsConfig} from '../../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../../types/AnalyticsStateMachineOptions';\nimport {DrmPerformanceInfo} from '../../types/DrmPerformanceInfo';\nimport {VideoChangeEvent} from '../../types/EventData';\nimport {FeatureConfigContainer} from '../../types/FeatureConfigContainer';\nimport {PlaybackInfo} from '../../types/PlaybackInfo';\nimport {QualityLevelInfo} from '../../types/QualityLevelInfo';\nimport {StreamSources} from '../../types/StreamSources';\nimport {isDifferentSubtitleInfo, SubtitleInfo} from '../../types/SubtitleInfo';\nimport {InternalAdapter} from './InternalAdapter';\nimport {InternalAdapterAPI} from './InternalAdapterAPI';\n\nexport class VideojsInternalAdapter extends InternalAdapter implements InternalAdapterAPI {\n public readonly videoCompletionTracker: VideoCompletionTracker;\n private _subtitleInfo: SubtitleInfo = {enabled: false};\n private selectedAudioLanguage?: string;\n private onBeforeUnLoadEvent: boolean = false;\n private previousTime: number = 0;\n private previousMutedValue: boolean;\n\n constructor(private player: videojs.default.Player, opts?: AnalyticsStateMachineOptions) {\n super(opts);\n this.stateMachine = new VideojsAnalyticsStateMachine(this.stateMachineCallbacks, this.opts);\n this.videoCompletionTracker = new VideoCompletionTracker();\n this.previousMutedValue = this.player.muted();\n }\n\n public initialize(analytics: Analytics): Array<Feature<FeatureConfigContainer, FeatureConfig>> {\n this.register();\n const errorDetailTracking = new ErrorDetailTracking(\n analytics.errorDetailTrackingSettingsProvider,\n new ErrorDetailBackend(analytics.errorDetailTrackingSettingsProvider.collectorConfig),\n [analytics.errorDetailSubscribable],\n undefined\n );\n return [errorDetailTracking];\n }\n\n public getPlayerVersion = () => ((window as any).videojs ? (window as any).videojs.VERSION : 'unknown');\n public getPlayerName = () => Player.VIDEOJS;\n public getPlayerTech = () => 'html5';\n public getAutoPlay = () => this.player.autoplay() === true;\n public getDrmPerformanceInfo = (): DrmPerformanceInfo | undefined => this.drmPerformanceInfo;\n\n public getStreamType(url: string) {\n let mimeType = getMIMETypeFromFileExtension(url);\n if (mimeType) {\n return getStreamTypeFromMIMEType(mimeType);\n }\n mimeType = this.player.currentType?.();\n if (mimeType) {\n return getStreamTypeFromMIMEType(mimeType);\n }\n }\n\n // this seems very generic. one could put it in a helper\n // and use it in many adapter implementations.\n public getStreamSources(url: string): StreamSources {\n const streamType = this.getStreamType(url);\n switch (streamType) {\n case 'hls':\n return {m3u8Url: url};\n case 'dash':\n return {mpdUrl: url};\n default:\n return {progUrl: url};\n }\n }\n\n public getCurrentPlaybackInfo(): PlaybackInfo {\n this.selectedAudioLanguage = this.getSelectedAudioTrackLanguage(this.player);\n const codecInfo = this.getCodecInfo(this.player.tech({IWillNotUseThisInPlugins: true}));\n\n const info: PlaybackInfo = {\n ...this.getCommonPlaybackInfo(),\n ...this.getStreamSources(this.player.currentSrc()),\n streamFormat: this.getStreamType(this.player.currentSrc()),\n isLive: this.player.duration() === Infinity,\n size: this.player.isFullscreen() ? PlayerSize.Fullscreen : PlayerSize.Window,\n playerTech: this.getPlayerTech(),\n isMuted: this.player.muted(),\n videoDuration: this.player.duration(),\n videoWindowHeight: this.player.height(),\n videoWindowWidth: this.player.width(),\n videoPlaybackHeight: this.player.videoHeight(),\n videoPlaybackWidth: this.player.videoWidth(),\n audioLanguage: this.selectedAudioLanguage,\n subtitleEnabled: this._subtitleInfo.enabled,\n subtitleLanguage: this._subtitleInfo.language,\n videoCodec: codecInfo?.videoCodec,\n audioCodec: codecInfo?.audioCodec,\n droppedFrames: 0, // TODO\n // TODO audioBitrate:\n // TODO isCasting:\n // TODO videoTitle: (currently only from the analytics config)\n };\n\n const qualityInfo = this.getCurrentQualityLevelInfo();\n if (qualityInfo) {\n info.videoPlaybackWidth = qualityInfo.width || info.videoPlaybackWidth;\n info.videoPlaybackWidth = qualityInfo.height || info.videoPlaybackHeight;\n info.videoBitrate = qualityInfo.bitrate;\n }\n\n return info;\n }\n\n public getCurrentQualityLevelInfo(): QualityLevelInfo | null {\n // TODO: Needs to be implemented\n return null;\n }\n\n public register() {\n const that = this;\n // if one source is being played and we load new source and start playing it\n // we need to reset all session related data and initialize new session\n // videojs does not provide a way for figuring out when current source or player is unloaded\n // so we need to reset everything with \"manualSourceChange\" event every time new source is loaded\n this.player.on('loadstart', function (this: any) {\n that.eventCallback(Event.MANUAL_SOURCE_CHANGE, {config: {}});\n });\n this.player.on('loadedmetadata', function (this: any) {\n that.videoCompletionTracker.reset();\n that.videoCompletionTracker.setVideoDuration(this.duration());\n that.previousTime = 0;\n that.eventCallback(Event.SOURCE_LOADED, {});\n });\n this.player.ready(function (this: any) {\n that._subtitleInfo = that.getSubtitleInfo(this);\n that.eventCallback(Event.READY, {});\n });\n this.player.on('play', function (this: any) {\n that.eventCallback(Event.PLAY, {\n currentTime: this.currentTime(),\n });\n });\n this.player.on('pause', function (this: any) {\n if (!this.seeking()) {\n that.eventCallback(Event.PAUSE, {\n currentTime: this.currentTime(),\n });\n }\n });\n this.player.on('error', function (this: any) {\n const error: MediaError = this.error();\n that.eventCallback(Event.ERROR, {\n currentTime: this.currentTime(),\n code: error.code,\n message: error.message,\n data: {},\n });\n });\n this.player.on('volumechange', function (this: any) {\n const muted = this.muted();\n const volume = this.volume();\n const isMuted = that.isAudioMuted(muted, volume);\n\n if (this.previousMutedValue !== isMuted) {\n if (isMuted) {\n that.eventCallback(Event.MUTE, {\n currentTime: this.currentTime(),\n });\n } else {\n that.eventCallback(Event.UN_MUTE, {\n currentTime: this.currentTime(),\n });\n }\n this.previousMutedValue = isMuted;\n }\n });\n this.player.on('seeking', function (this: any) {\n that.eventCallback(Event.SEEK, {\n currentTime: that.previousTime != null ? that.previousTime : this.currentTime(),\n });\n });\n this.player.on('seeked', function (this: any) {\n that.eventCallback(Event.SEEKED, {\n currentTime: this.currentTime(),\n });\n });\n\n this.player.on('texttrackchange', function (this: any) {\n const newSubtitleInfo = that.getSubtitleInfo(this);\n const hasInfoChanged =\n that._subtitleInfo == null ? true : isDifferentSubtitleInfo(that._subtitleInfo, newSubtitleInfo);\n that._subtitleInfo = newSubtitleInfo;\n\n if (hasInfoChanged) {\n that.eventCallback(Event.SUBTITLE_CHANGE, {\n currentTime: this.currentTime(),\n });\n }\n });\n\n const audioTracks = this.player.audioTracks();\n audioTracks.on('change', () => {\n const newSelectedAudioLanguage = that.getSelectedAudioTrackLanguage(that.player);\n if (newSelectedAudioLanguage != null && newSelectedAudioLanguage !== that.selectedAudioLanguage) {\n that.eventCallback(Event.AUDIOTRACK_CHANGED, {\n currentTime: that.player.currentTime(),\n });\n }\n });\n\n this.player.on('stalled', function (this: any) {\n that.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime(),\n });\n });\n this.player.on('waiting', function (this: any) {\n that.eventCallback(Event.START_BUFFERING, {\n currentTime: this.currentTime(),\n });\n });\n this.player.on('timeupdate', function (this: any) {\n if (!this.seeking()) {\n that.previousTime = this.currentTime();\n }\n that.eventCallback(Event.TIMECHANGED, {\n currentTime: this.currentTime(),\n });\n\n // Check for HLS source-handler (http-streaming)\n // When we just use Videojs without any specific source-handler (not using MSE API based engine)\n // but just native technology (HTML5/Flash) to do for example \"progressive download\" with plain Webm/Mp4\n // or use native HLS on Safari this may not not be present. In that case Videojs is just\n // a wrapper around the respective playback tech (HTML or Flash).\n const tech = this.tech({IWillNotUseThisInPlugins: true});\n\n // older videojs versions don't have vhs property\n if (tech.vhs || tech.hls) {\n const mediaAttributes = that.getMediaAttributes(tech);\n\n if (!mediaAttributes || !mediaAttributes.bitrate) {\n return;\n }\n\n // update actual bitrate\n if (that.shouldAllowVideoQualityChange(mediaAttributes.bitrate)) {\n const eventObject: VideoChangeEvent = {\n width: mediaAttributes.width,\n height: mediaAttributes.height,\n bitrate: mediaAttributes.bitrate,\n currentTime: this.currentTime(),\n };\n\n that.eventCallback(Event.VIDEO_CHANGE, eventObject);\n that.setPreviousVideoBitrate(mediaAttributes.bitrate);\n }\n }\n });\n\n let handlePageClose = () => {\n if (!this.onBeforeUnLoadEvent) {\n this.onBeforeUnLoadEvent = true;\n let currentTime: number | undefined;\n if (this.player != null) {\n currentTime = this.player.currentTime();\n }\n this.eventCallback(Event.UNLOAD, {\n currentTime,\n });\n }\n this.release();\n };\n\n handlePageClose = handlePageClose.bind(this);\n\n this.player.on('dispose', handlePageClose);\n this.windowEventTracker.addEventListener('beforeunload', handlePageClose);\n this.windowEventTracker.addEventListener('unload', handlePageClose);\n }\n\n public sourceChange(config: AnalyticsConfig, timestamp: number) {\n this.videoCompletionTracker.reset();\n this.videoCompletionTracker.setVideoDuration(this.player.duration());\n this.previousTime = 0;\n this.stateMachine.sourceChange(config, timestamp, this.player.currentTime());\n }\n protected get currentTime(): number {\n return this.player.currentTime();\n }\n\n private getSelectedAudioTrackLanguage(player: any): string | undefined {\n for (const track of player.audioTracks()) {\n if (track.enabled) {\n return track.language;\n }\n }\n return undefined;\n }\n\n private getSubtitleInfo(player: any): SubtitleInfo {\n const textTracks = player.textTracks() || [];\n let enabled = false;\n let language;\n for (const track of textTracks) {\n if (track.mode === 'showing') {\n enabled = true;\n language = track.language;\n break;\n }\n }\n return {\n enabled,\n language,\n };\n }\n\n // more detailed info from segment can be obtained using\n // https://github.com/videojs/http-streaming#segment-metadata\n // but some properties are not available in older videojs versions\n private getMediaAttributes(playerTech: any): MediaAttributes | undefined {\n if (!playerTech) {\n return;\n }\n\n // From here we are going onto Videojs-HLS source-handler specific API\n let sourceHandler;\n if (playerTech.vhs) {\n sourceHandler = playerTech.vhs;\n } else if (playerTech.hls) {\n // older videojs versions don't have vhs property\n sourceHandler = playerTech.hls;\n }\n\n // Maybe we have the HLS source-handler initialized, but it is\n // not actually activated and used (just wrapping HTML5 built-in HLS playback like in Safari)\n if (!sourceHandler || !sourceHandler.playlists || typeof sourceHandler.playlists.media !== 'function') {\n return;\n }\n\n // Check for current media playlist\n const selectedPlaylist = sourceHandler.playlists.media();\n\n if (!selectedPlaylist) {\n return;\n }\n\n const {attributes} = selectedPlaylist;\n\n if (!attributes || Object.keys(attributes).length === 0) {\n return;\n }\n\n return {\n bitrate: attributes.BANDWIDTH,\n width: (attributes.RESOLUTION || {}).width,\n height: (attributes.RESOLUTION || {}).height,\n codecs: attributes.CODECS,\n };\n }\n\n private getCodecInfo(playerTech: any): CodecInfo | undefined {\n const mediaAttributes = this.getMediaAttributes(playerTech);\n\n if (!mediaAttributes || !mediaAttributes.codecs) {\n return;\n }\n\n const codecs = mediaAttributes.codecs.split(',');\n\n if (!codecs) {\n return;\n }\n\n return {\n videoCodec: codecs.find((codec: string) => CodecHelper.isVideoCodec(codec)),\n audioCodec: codecs.find((codec: string) => CodecHelper.isAudioCodec(codec)),\n };\n }\n}\n\nexport interface CodecInfo {\n audioCodec: string | undefined;\n videoCodec: string | undefined;\n}\n\nexport interface MediaAttributes {\n codecs: string | undefined;\n bitrate: number | undefined;\n width: number | undefined;\n height: number | undefined;\n}\n","import * as StateMachine from 'javascript-state-machine';\nimport {Event, EventMap} from '../enums/Event';\nimport {AnalyticsConfig} from '../types/AnalyticsConfig';\nimport {AnalyticsStateMachineOptions} from '../types/AnalyticsStateMachineOptions';\nimport {NoExtraProperties} from '../types/NoExtraProperties';\nimport {StateMachineCallbacks} from '../types/StateMachineCallbacks';\nimport {logger, padRight} from '../utils/Logger';\nimport {AnalyticsStateMachine} from './AnalyticsStateMachine';\n\nenum State {\n AD = 'AD',\n SETUP = 'SETUP',\n STARTUP = 'STARTUP',\n READY = 'READY',\n PLAYING = 'PLAYING',\n REBUFFERING = 'REBUFFERING',\n PAUSE = 'PAUSE',\n QUALITYCHANGE = 'QUALITYCHANGE',\n PAUSED_SEEKING = 'PAUSED_SEEKING',\n PLAY_SEEKING = 'PLAY_SEEKING',\n END_PLAY_SEEKING = 'END_PLAY_SEEKING',\n QUALITYCHANGE_PAUSE = 'QUALITYCHANGE_PAUSE',\n QUALITYCHANGE_REBUFFERING = 'QUALITYCHANGE_REBUFFERING',\n SOURCE_CHANGING = 'SOURCE_CHANGING',\n END = 'END',\n ERROR = 'ERROR',\n MUTING_READY = 'MUTING_READY',\n MUTING_PLAY = 'MUTING_PLAY',\n MUTING_PAUSE = 'MUTING_PAUSE',\n CASTING = 'CASTING',\n AUDIOTRACK_CHANGING = 'AUDIOTRACK_CHANGING',\n AUDIOTRACK_CHANGED_PLAYING = 'AUDIOTRACK_CHANGED_PLAYING',\n SUBTITLE_CHANGING = 'SUBTITLE_CHANGING',\n SUBTITLE_CHANGED_PLAYING = 'SUBTITLE_CHANGED_PLAYING',\n EXIT_BEFORE_VIDEOSTART = 'EXIT_BEFORE_VIDEOSTART',\n CUSTOMDATACHANGE = 'CUSTOMDATACHANGE',\n}\n\nexport class VideojsAnalyticsStateMachine extends AnalyticsStateMachine {\n private seekTimestamp: number;\n private seekedTimestamp: number;\n private seekedTimeout: number;\n\n constructor(stateMachineCallbacks: StateMachineCallbacks, opts: AnalyticsStateMachineOptions) {\n super(stateMachineCallbacks, opts);\n\n this.seekTimestamp = 0;\n this.seekedTimestamp = 0;\n this.seekedTimeout = 0;\n }\n\n public getAllStates() {\n return [\n ...Object.keys(State).map((key) => State[key]),\n 'FINISH_PLAY_SEEKING',\n 'PLAY_SEEK',\n 'FINISH_QUALITYCHANGE_PAUSE',\n 'FINISH_QUALITYCHANGE',\n 'FINISH_QUALITYCHANGE_REBUFFERING',\n ];\n }\n\n public getAllStatesBut(state: string) {\n return this.getAllStates().filter((i) => i !== state);\n }\n\n public createStateMachine(opts: AnalyticsStateMachineOptions) {\n return StateMachine.create({\n initial: State.SETUP,\n error: (eventName, from, to, args, errorCode, errorMessage) => {\n logger.error('Error in statemachine: ' + errorMessage);\n },\n events: [\n {name: Event.SOURCE_LOADED, from: [State.SETUP, State.ERROR, State.SOURCE_CHANGING], to: State.READY},\n {name: Event.TIMECHANGED, from: State.SETUP, to: State.SETUP},\n {name: Event.SOURCE_LOADED, from: State.READY, to: State.READY},\n {name: Event.READY, from: [State.SETUP, State.ERROR], to: State.READY},\n {name: Event.PLAY, from: State.READY, to: State.STARTUP},\n\n {name: Event.ERROR, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.UNLOAD, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n {name: Event.VIDEOSTART_TIMEOUT, from: State.STARTUP, to: State.EXIT_BEFORE_VIDEOSTART},\n\n {name: Event.START_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.END_BUFFERING, from: State.STARTUP, to: State.STARTUP},\n {name: Event.VIDEO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.AUDIO_CHANGE, from: State.STARTUP, to: State.STARTUP},\n {name: Event.TIMECHANGED, from: State.STARTUP, to: State.PLAYING},\n\n {name: Event.TIMECHANGED, from: State.PLAYING, to: State.PLAYING},\n {name: Event.END_BUFFERING, from: State.PLAYING, to: State.PLAYING},\n {name: Event.START_BUFFERING, from: State.PLAYING, to: State.REBUFFERING},\n {name: Event.START_BUFFERING, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.TIMECHANGED, from: State.REBUFFERING, to: State.PLAYING},\n\n // Ignoring since it's pushed in a live stream\n {name: Event.SEEK, from: State.STARTUP, to: State.STARTUP},\n {name: Event.SEEK, from: State.PLAYING, to: State.PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n\n {name: Event.PAUSE, from: State.PLAYING, to: State.PAUSE},\n {name: Event.PAUSE, from: State.REBUFFERING, to: State.PAUSE},\n {name: Event.TIMECHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.PLAYING, to: State.QUALITYCHANGE},\n {name: Event.VIDEO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: Event.AUDIO_CHANGE, from: State.QUALITYCHANGE, to: State.QUALITYCHANGE},\n {name: 'FINISH_QUALITYCHANGE', from: State.QUALITYCHANGE, to: State.PLAYING},\n\n {name: Event.VIDEO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {name: Event.AUDIO_CHANGE, from: State.PAUSE, to: State.QUALITYCHANGE_PAUSE},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_PAUSE,\n to: State.QUALITYCHANGE_PAUSE,\n },\n {name: 'FINISH_QUALITYCHANGE_PAUSE', from: State.QUALITYCHANGE_PAUSE, to: State.PAUSE},\n\n {name: Event.SEEK, from: State.PAUSE, to: State.PAUSED_SEEKING},\n {name: Event.SEEK, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.START_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.END_BUFFERING, from: State.PAUSED_SEEKING, to: State.PAUSED_SEEKING},\n {name: Event.SEEKED, from: State.PAUSED_SEEKING, to: State.PAUSE},\n {name: Event.PLAY, from: State.PAUSED_SEEKING, to: State.PLAYING},\n {name: Event.PAUSE, from: State.PAUSED_SEEKING, to: State.PAUSE},\n\n {name: 'PLAY_SEEK', from: State.PAUSE, to: State.PLAY_SEEKING},\n {name: 'PLAY_SEEK', from: State.PAUSED_SEEKING, to: State.PLAY_SEEKING},\n {name: 'PLAY_SEEK', from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEK, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.AUDIO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.VIDEO_CHANGE, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.START_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.PLAY_SEEKING},\n\n // We are ending the seek\n {name: Event.SEEKED, from: State.PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n\n {name: Event.START_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.END_BUFFERING, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SEEKED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.TIMECHANGED, from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.END, from: State.PLAY_SEEKING, to: State.END},\n {name: Event.END, from: State.PAUSED_SEEKING, to: State.END},\n {name: Event.END, from: State.PLAYING, to: State.END},\n {name: Event.END, from: State.PAUSE, to: State.END},\n {name: Event.SEEK, from: State.END, to: State.END},\n {name: Event.SEEKED, from: State.END, to: State.END},\n {name: Event.TIMECHANGED, from: State.END, to: State.END},\n {name: Event.END_BUFFERING, from: State.END, to: State.END},\n {name: Event.START_BUFFERING, from: State.END, to: State.END},\n {name: Event.END, from: State.END, to: State.END},\n\n // Ignored - Livestreams do a Seek during startup and SEEKED once playback started\n {name: Event.SEEKED, from: State.PLAYING, to: State.PLAYING},\n\n {name: Event.PLAY, from: State.END, to: State.PLAYING},\n\n {name: Event.ERROR, from: this.getAllStatesBut(State.STARTUP), to: State.ERROR},\n {name: Event.PAUSE, from: State.ERROR, to: State.ERROR},\n\n {name: Event.SEEK, from: State.END_PLAY_SEEKING, to: State.PLAY_SEEKING},\n {name: 'FINISH_PLAY_SEEKING', from: State.END_PLAY_SEEKING, to: State.PLAYING},\n\n {name: Event.UNLOAD, from: this.getAllStatesBut(State.STARTUP), to: State.END},\n\n {name: Event.START_AD, from: State.PLAYING, to: State.AD},\n {name: Event.END_AD, from: State.AD, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.READY, to: State.MUTING_READY},\n {name: Event.UN_MUTE, from: State.READY, to: State.MUTING_READY},\n {name: 'FINISH_MUTING', from: State.MUTING_READY, to: State.READY},\n\n {name: Event.MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: Event.UN_MUTE, from: State.PLAYING, to: State.MUTING_PLAY},\n {name: 'FINISH_MUTING', from: State.MUTING_PLAY, to: State.PLAYING},\n\n {name: Event.MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: Event.UN_MUTE, from: State.PAUSE, to: State.MUTING_PAUSE},\n {name: 'FINISH_MUTING', from: State.MUTING_PAUSE, to: State.PAUSE},\n\n {name: Event.START_CAST, from: [State.READY, State.PAUSE], to: State.CASTING},\n {name: Event.PAUSE, from: State.CASTING, to: State.CASTING},\n {name: Event.PLAY, from: State.CASTING, to: State.CASTING},\n {name: Event.TIMECHANGED, from: State.CASTING, to: State.CASTING},\n {name: Event.MUTE, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEK, from: State.CASTING, to: State.CASTING},\n {name: Event.SEEKED, from: State.CASTING, to: State.CASTING},\n {name: Event.END_CAST, from: State.CASTING, to: State.READY},\n\n {name: Event.SEEK, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.READY, to: State.READY},\n {name: Event.SEEKED, from: State.STARTUP, to: State.STARTUP},\n\n {name: Event.AUDIOTRACK_CHANGED, from: State.PLAYING, to: State.AUDIOTRACK_CHANGED_PLAYING},\n {name: 'FINISH_AUDIOTRACK_CHANGING', from: State.AUDIOTRACK_CHANGED_PLAYING, to: State.PLAYING},\n // States which should ignore audioTrack changes\n {name: Event.AUDIOTRACK_CHANGED, from: State.PAUSE, to: State.PAUSE},\n {name: Event.AUDIOTRACK_CHANGED, from: State.READY, to: State.READY},\n {name: Event.AUDIOTRACK_CHANGED, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.AUDIOTRACK_CHANGED, from: State.AUDIOTRACK_CHANGING, to: State.AUDIOTRACK_CHANGING},\n\n {name: Event.SUBTITLE_CHANGE, from: State.PLAYING, to: State.SUBTITLE_CHANGED_PLAYING},\n {name: 'FINISH_SUBTITLE_CHANGING', from: State.SUBTITLE_CHANGED_PLAYING, to: State.PLAYING},\n // States which should ignore subtitle changes\n {name: Event.SUBTITLE_CHANGE, from: State.PAUSE, to: State.PAUSE},\n {name: Event.SUBTITLE_CHANGE, from: State.READY, to: State.READY},\n {name: Event.SUBTITLE_CHANGE, from: State.REBUFFERING, to: State.REBUFFERING},\n {name: Event.SUBTITLE_CHANGE, from: State.END_PLAY_SEEKING, to: State.END_PLAY_SEEKING},\n {name: Event.SUBTITLE_CHANGE, from: State.SUBTITLE_CHANGING, to: State.SUBTITLE_CHANGING},\n\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: this.getAllStatesBut(State.READY),\n to: State.SOURCE_CHANGING,\n },\n {\n name: Event.MANUAL_SOURCE_CHANGE,\n from: State.READY,\n to: State.READY,\n },\n {name: Event.MANUAL_SOURCE_CHANGE, from: State.SETUP, to: State.SETUP},\n {name: Event.TIMECHANGED, from: State.SOURCE_CHANGING, to: State.SOURCE_CHANGING},\n\n {name: Event.VIDEO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {name: Event.AUDIO_CHANGE, from: State.REBUFFERING, to: State.QUALITYCHANGE_REBUFFERING},\n {\n name: Event.VIDEO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: Event.AUDIO_CHANGE,\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.QUALITYCHANGE_REBUFFERING,\n },\n {\n name: 'FINISH_QUALITYCHANGE_REBUFFERING',\n from: State.QUALITYCHANGE_REBUFFERING,\n to: State.REBUFFERING,\n },\n\n {name: Event.CUSTOM_DATA_CHANGE, from: [State.PLAYING, State.PAUSE], to: State.CUSTOMDATACHANGE},\n {name: Event.PLAYING, from: State.CUSTOMDATACHANGE, to: State.PLAYING},\n {name: Event.PAUSE, from: State.CUSTOMDATACHANGE, to: State.PAUSE},\n ],\n callbacks: {\n onafterevent: (event, from, to, timestamp) => {\n if (to === State.QUALITYCHANGE) {\n this.stateMachine.FINISH_QUALITYCHANGE(timestamp);\n }\n if (to === State.MUTING_READY || to === State.MUTING_PLAY || to === State.MUTING_PAUSE) {\n this.stateMachine.FINISH_MUTING(timestamp);\n }\n if (to === State.AUDIOTRACK_CHANGED_PLAYING) {\n this.stateMachine.FINISH_AUDIOTRACK_CHANGING(timestamp);\n }\n if (to === State.SUBTITLE_CHANGED_PLAYING) {\n this.stateMachine.FINISH_SUBTITLE_CHANGING(timestamp);\n }\n },\n onenterstate: (event, from, to, timestamp, eventObject) => {\n if (from === 'none' && opts.starttime) {\n this.onEnterStateTimestamp = opts.starttime;\n } else {\n this.onEnterStateTimestamp = timestamp || new Date().getTime();\n }\n\n logger.log('[ENTER] ' + padRight(to, 20) + 'EVENT: ' + padRight(event, 20) + ' from ' + padRight(from, 14));\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.SEEK) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.SEEKED) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (\n event === 'PLAY_SEEK' &&\n to === State.PLAY_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.seekTimestamp = this.onEnterStateTimestamp;\n }\n\n if (event === Event.START_CAST && to === State.CASTING) {\n this.stateMachineCallbacks.startCasting(timestamp, eventObject);\n }\n\n if (to === State.REBUFFERING) {\n this.startRebufferingHeartbeatInterval();\n }\n },\n onleavestate: (event, from, to, timestamp, eventObject) => {\n if (from === State.REBUFFERING) {\n this.resetRebufferingHelpers();\n }\n\n if (!timestamp) {\n return;\n }\n logger.log(`[LEAVE] ${padRight(from, 20)} EVENT: ${padRight(event, 20)} to ${padRight(to, 20)}`);\n\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (eventObject && to !== State.PAUSED_SEEKING && to !== State.END_PLAY_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n }\n\n if (event === 'PLAY_SEEK' && from === State.PAUSE) {\n return true;\n }\n\n if (from === State.READY && to === State.STARTUP) {\n this.setVideoStartTimeout();\n } else if (from === State.STARTUP && (to === State.PLAYING || to === State.EXIT_BEFORE_VIDEOSTART)) {\n this.clearVideoStartTimeout();\n }\n\n const fnName = String(from).toLowerCase();\n if (to === State.EXIT_BEFORE_VIDEOSTART) {\n this.clearVideoStartTimeout();\n const eventData = this.getVideoStartupFailedEventData(timestamp, event, eventObject);\n const shouldSendSample = event !== Event.ERROR;\n this.stateMachineCallbacks.videoStartFailed(eventData, shouldSendSample);\n } else if (from === State.PAUSED_SEEKING) {\n const seekDuration = timestamp - this.seekTimestamp;\n this.stateMachineCallbacks.paused_seeking(seekDuration, fnName);\n } else if (from === State.END_PLAY_SEEKING) {\n const seekDuration = this.seekedTimestamp - this.seekTimestamp;\n this.stateMachineCallbacks.end_play_seeking(seekDuration, fnName);\n } else if (event === Event.UNLOAD) {\n this.stateMachineCallbacks.unload(stateDuration, fnName);\n } else if (from === State.PAUSE && to !== State.PAUSED_SEEKING) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(event);\n this.stateMachineCallbacks.pause(stateDuration, fnName);\n } else {\n const callbackFunction = this.stateMachineCallbacks[fnName];\n if (typeof callbackFunction === 'function') {\n callbackFunction(stateDuration, fnName, eventObject);\n } else {\n const excludedStates = [\n State.MUTING_PAUSE,\n State.MUTING_PLAY,\n State.AUDIOTRACK_CHANGED_PLAYING,\n State.SUBTITLE_CHANGED_PLAYING,\n ];\n if (excludedStates.find((e) => from === e) == null) {\n logger.error('Could not find callback function for ' + fnName);\n }\n }\n }\n\n if (\n eventObject &&\n to !== State.PAUSED_SEEKING &&\n to !== State.PLAY_SEEKING &&\n to !== State.END_PLAY_SEEKING\n ) {\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n\n if (event === Event.VIDEO_CHANGE) {\n this.stateMachineCallbacks.videoChange(eventObject);\n } else if (event === Event.AUDIO_CHANGE) {\n this.stateMachineCallbacks.audioChange(eventObject);\n } else if (event === Event.MUTE) {\n this.stateMachineCallbacks.mute();\n } else if (event === Event.UN_MUTE) {\n this.stateMachineCallbacks.unMute();\n } else if (event === Event.MANUAL_SOURCE_CHANGE) {\n this.stateMachineCallbacks.manualSourceChange(eventObject);\n }\n },\n onseek: (event, from, to, timestamp) => {\n this.seekTimestamp = timestamp;\n },\n onseeked: (event, from, to, timestamp) => {\n this.seekedTimestamp = timestamp;\n },\n ontimechanged: (event, from, to, timestamp, eventObject) => {\n const stateDuration = timestamp - this.onEnterStateTimestamp;\n\n if (stateDuration > 59700) {\n this.stateMachineCallbacks.setVideoTimeEndFromEvent(eventObject);\n\n this.stateMachineCallbacks.heartbeat(stateDuration, String(from).toLowerCase(), {played: stateDuration});\n this.onEnterStateTimestamp = timestamp;\n\n this.stateMachineCallbacks.setVideoTimeStartFromEvent(eventObject);\n }\n },\n onplayerError: (event, from, to, timestamp, eventObject) => {\n this.stateMachineCallbacks.error(eventObject);\n },\n },\n });\n }\n\n public callEvent<StatemachineEvent extends keyof EventMap, EventData extends EventMap[StatemachineEvent]>(\n eventType: StatemachineEvent,\n eventObject: NoExtraProperties<EventMap[StatemachineEvent], EventData>,\n timestamp: number\n ): void {\n const exec = this.stateMachine[eventType];\n\n if (exec) {\n exec.call(this.stateMachine, timestamp, eventObject);\n } else {\n logger.log('Ignored Event: ' + eventType);\n }\n }\n\n public sourceChange = (config: AnalyticsConfig, timestamp: number, currentTime?: number) => {\n this.callEvent(Event.MANUAL_SOURCE_CHANGE, {config, currentTime}, timestamp);\n };\n}\n","const videoCodecs = ['avc1', 'avc3', 'hvc1', 'av01', 'av1', 'hev1', 'vp9'];\n\nconst audioCodecs = ['mp4a', 'ec-3', 'ac-3', 'opus', 'audio/mp4'];\n\nexport function isVideoCodec(codec: string): boolean {\n if (!codec) {\n return false;\n }\n const index = videoCodecs.findIndex((videoCodec) => codec.startsWith(videoCodec));\n return index !== -1;\n}\n\nexport function isAudioCodec(codec: string): boolean {\n if (!codec) {\n return false;\n }\n const index = audioCodecs.findIndex((videoCodec) => codec.startsWith(videoCodec));\n return index !== -1;\n}\n","export interface SubtitleInfo {\n /**\n * Indicates if subtitles are displayed.\n */\n enabled: boolean;\n /**\n * The selected subtitle/captions language.\n */\n language?: string;\n}\n\nexport const isDifferentSubtitleInfo = (info1?: SubtitleInfo, info2?: SubtitleInfo): boolean => {\n if (info1 == null && info2 == null) {\n return false;\n }\n return !(info1 != null && info2 != null && info1.enabled === info2.enabled && info1.language === info2.language);\n};\n","export enum CdnProvider {\n CLOUDFLARE = 'cloudflare',\n AKAMAI = 'akamai',\n FASTLY = 'fastly',\n MAXCDN = 'maxcdn',\n CLOUDFRONT = 'cloudfront',\n CHINACACHE = 'chinacache',\n BITGRAVITY = 'bitgravity',\n}\n"],"sourceRoot":""}
|