{"version":3,"sources":["webpack:///liftoff-58ea9097a7f92539efa7.js","webpack:///webpack/bootstrap 4c081c14b06df0b018c2","webpack:///./src/js/frontendlib/utils.js","webpack:///./src/js/frontendlib/dom_utils.js","webpack:///./src/js/constants.js","webpack:///./src/js/madlib/logger.js","webpack:///./src/js/madlib/autoclick/AutoclickBehaviorAbstract.js","webpack:///./src/js/error_handling.js","webpack:///./src/js/frontendlib/event_listener.js","webpack:///./src/js/madlib/liftoff_mraid.js","webpack:///./src/js/madlib/adexp.js","webpack:///./src/js/lib/monkey_patch.js","webpack:///./src/js/madlib/cta.js","webpack:///./src/js/madlib/csp-env/messages.js","webpack:///./src/js/lib/audio_toggle_icon.js","webpack:///./src/js/lib/global_audio_controller.js","webpack:///./src/js/creative_utils.js","webpack:///./src/js/madlib/autoclick/autoclick_utils.js","webpack:///./src/js/lib/click_interaction.js","webpack:///./src/js/madlib/addDeadzones.js","webpack:///./src/js/click_handling.js","webpack:///./src/js/interaction_monitor.js","webpack:///./src/js/madlib/autoclick/Autoclick.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorCompletedDelay.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorInteractionCount.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLastInteraction.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLastInteractionAndCount.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLoadDelay.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorViewableDelay.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorViewableDelayWithReset.js","webpack:///./src/js/madlib/madlib.js","webpack:///./src/js/container.js","webpack:///./src/js/lib/last_chance_endscreen/last_chance_endscreen.js","webpack:///./src/js/madlib/liftoff.js","webpack:///./src/js/madlib/component.js","webpack:///./src/js/madlib/letterbox_config.js","webpack:///./src/js/madlib/window_resize_logger.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","_toConsumableArray","arr","Array","isArray","arr2","length","from","makeJSONRequest","url","json","method","options","arguments","undefined","_options$rejectOnErro","rejectOnErrorResponse","fetchPromise","fetch","body","JSON","stringify","credentials","headers","Content-Type","wrapResponsePromise","value","appendParamObjectToURL","appendQueryStringToURL","assignWithDefaults","binaryFind","camelCase","capitalize","clamp","clone","compareNumbers","compareStrings","composeAsync","smartCompare","deepEqual","deepInclude","deepUnique","diffObjects","escapeRegExp","flatten","formatConjunction","formatFileSize","formatUSD","getLocale","numberToLocaleString","getIn","kebabCase","isPromise","isEmpty","loadImage","loadImages","mapByID","mapcat","mergePropertiesWithDefaults","objFromQueryString","objToQueryString","errorSensitiveFetch","postJSON","patchJSON","ping","poll","precisionRound","randomInt","range","request","runAsync","removeKeys","removeEmptyKeys","selectKeys","shuffle","stableSort","timeDifference","type","wait","timeout","unique","isFunction","_slicedToArray","sliceIterator","_arr","_n","_d","_e","_s","_i","Symbol","iterator","next","done","push","err","TypeError","params","queryString","includes","target","defaults","_len","sources","_key","keys","forEach","key","filter","source","fn","high","low","mid","str","_ref","_ref$isSuffix","isSuffix","split","map","part","toLowerCase","join","toUpperCase","slice","x","a","b","obj","parse","trim","localeCompare","_len2","funcs","_key2","arg","res","Promise","resolve","f","then","_ref2","_ref2$reverse","reverse","Error","compareType","_ref3","_ref4","valueA","valueB","_ref5","_ref5$toJSON","toJSON","compareA","compareB","tA","tB","size","bShallowCopy","Set","_iteratorNormalCompletion","_didIteratorError","_iteratorError","aLoop","_step","_iterator","aElement","has","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","bElement","delete","return","k","parent","child","some","values","index","item","concat","currItem","includeAKeys","result","replace","apply","words","conjunction","wc","thousands","Math","floor","round","pow","val","assign","style","currency","toLocaleString","_window","window","navigator","languages","language","locale","Number","e","ks","charAt","crossOrigin","reject","img","Image","addEventListener","src","complete","urls","all","reduce","id","_len3","args","_key3","location","search","acc","_part$split$map","decodeURIComponent","_part$split$map2","encodeURIComponent","responsePromise","response","Response","ok","catch","timeoutMS","timedOut","setTimeout","_ref6","state","number","precision","factor","random","start","stop","step","fill","_","req","XMLHttpRequest","onreadystatechange","readyState","status","bind","open","setRequestHeader","send","j","_ref7","sortFn","agg","set","Map","sort","elapsed","abs","units","msPerSecond","msPerMinute","msPerHour","msPerDay","msPerWeek","msPerMonth","toString","match","ms","el","indexOf","_objectWithoutProperties","_defineProperty","writable","addOneTimeListener","animationEndPromise","transitionEndPromise","runTransitionSequence","appendChildren","copyToClipboard","createElement","empty","fetchHTML","firstAncestor","fragmentFromString","forceReflow","generateSnippetMap","getCSSProperty","getElementsByClass","getRelativeBoundingClientRect","getAggregateBoundingClientRect","getFontSizeToFit","getFontSizeToFitLines","imageIsRendered","off","on","onAnimationsComplete","parseCSSLength","prependChild","replaceStyle","scrollIntoView","strToElement","strToStyle","writeToIframe","preparetagHTML","appendImpressionTags","__WEBPACK_IMPORTED_MODULE_0__utils__","eventName","ignoreBubbling","listener","event","removeEventListener","eventRacePromise","events","_ref$matchTarget","matchTarget","eventsString","callbackRun","callback","message","transitions","_ref2$timeoutMS","_ref2$continueFn","continueFn","prevTransitionEndPromise","thisTransition","finally","currentTransitionEndPromise","race","node","children","fragment","document","createDocumentFragment","appendChild","Node","text","multiline","elemType","select","execCommand","remove","elementConfig","createTextNode","_elementConfig$namesp","namespace","_elementConfig$tagNam","tagName","_elementConfig$classL","classList","_elementConfig$style","_elementConfig$attrib","attributes","_elementConfig$data","data","_elementConfig$childr","_elementConfig$eventH","eventHandlers","unintendedProps","unintendedKeys","element","createElementNS","filteredClassList","className","_element$classList","add","entries","setAttribute","dataset","firstChild","removeChild","selector","halt","matches","parentNode","strHTML","templateEl","innerHTML","content","offsetHeight","html","wrapper","snippets","querySelectorAll","coll","snippet","removeAttribute","cloneNode","getComputedStyle","getPropertyValue","classNames","elements","querySelector","reference","rect","getBoundingClientRect","refRect","top","bottom","left","right","width","height","nodes","min","max","Infinity","maxFontSizePx","startingFontSize","fontSize","startingOverflow","overflow","clientHeight","scrollHeight","clientWidth","scrollWidth","maxLines","parseFloat","prevFontSizeStyle","prevHeight","prevLineHeight","lineHeight","computedFontSize","paddingTop","paddingBottom","Date","now","checkRendered","requestAnimationFrame","names","els","animationsLeft","exec","_match","insertBefore","newStyles","pRect","topDiff","botDiff","scrollTop","div","iframeEl","contentHTML","contentWindow","write","close","tagHTML","wrapperEl","originalScriptTag","replacementScriptTag","nodeName","nodeValue","replaceChild","containerEl","impressionTags","append","PLATFORM_ANDROID","PLATFORM_IOS","AUDIO_POLICY_ALWAYS_MUTE","AUDIO_POLICY_ON_INTERACTION","AUDIO_POLICY_NO_RESTRICTIONS","EXCHANGE_DOUBLECLICK","EXCHANGE_INNERACTIVE","EXCHANGE_IRONSOURCE","EXCHANGE_MINTEGRAL","EXCHANGE_VUNGLE","ORIENTATION_PORTRAIT","ORIENTATION_LANDSCAPE","CLICK_AREA_TYPE_OTHER","CLICK_AREA_TYPE_CTA","CLICK_METRIC_TYPE_CLOSE","CLICK_METRIC_TYPE_CTA","CLICK_METRIC_TYPE_DEADZONE","CLICK_METRIC_TYPE_UNKNOWN","CLICK_REJECTION_REASON_NO_INTERACTIONS","CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT","CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT","TRACKING_METHOD_OPEN_METHOD","TRACKING_METHOD_IMAGE","TRACKING_METHOD_BEACON","AUTOCLICK_TYPE_LAST_INTERACTION","AUTOCLICK_TYPE_INTERACTION_COUNT","AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT","AUTOCLICK_TYPE_COMPLETED_DELAY","AUTOCLICK_TYPE_LOAD_DELAY","AUTOCLICK_TYPE_VIEWABLE_DELAY","AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET","CLICK_OPEN_METHOD_WINDOW_OPEN","CLICK_OPEN_METHOD_MRAID","CLICK_OPEN_METHOD_ANCHOR","CLICK_OPEN_METHOD_LOCATION","_classCallCheck","instance","Constructor","__WEBPACK_IMPORTED_MODULE_0__adexp__","__WEBPACK_IMPORTED_MODULE_1__error_handling__","__WEBPACK_IMPORTED_MODULE_2__frontendlib_utils__","_createClass","defineProperties","props","descriptor","protoProps","staticProps","console","error","payload","postMetricV2","adexpContextSnapshotFn","endpoint","eventTrackingParam","adexpContext","context","metric","Logger","this","enabled","loggedErrors","_this","errorEvent","normalizedError","recordError","recordLabeledError","tag","_processError","errorObj","normalizedErr","errorIdentifier","sourceURL","line","recordLog","log","isInteger","alwaysRecordMetricV2","debug","init","AutoclickBehaviorAbstract","autoclick","behavior","delayClickthroughHandler","_autoclick","_behavior","internalCount","count","delay","getCurrentCount","getBehaviorCount","getBehaviorDelay","isCountReached","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","Warning","normalizeError","normalizeErrorEvent","normalizePromiseRejectionEvent","shouldIgnoreError","__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__","_Error","getPrototypeOf","captureStackTrace","severity","tryConvertStringToNumber","parsed","parseInt","isNaN","tryParseStackInfo","stack","String","column","errorProps","getOwnPropertyNames","filename","lineno","colno","parsedInfo","reason","reasonIsError","reasonIsString","errorMessage","stackFilter","RegExp","regexFilters","messageFilter","errorStr","test","normalized","nKeys","onlyMessage","onlyMessageStack","noSourceURL","EventListener","methods","_this2","single","_this3","cb","onEvent","emitEvent","emit","__WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__","__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__","__WEBPACK_IMPORTED_MODULE_2__constants__","__WEBPACK_IMPORTED_MODULE_3__logger__","__WEBPACK_IMPORTED_MODULE_4__error_handling__","CLICK_OPEN_METHODS","WINDOW_OPEN","MRAID","ANCHOR","LOCATION","LiftoffMRAID","liftoffMraidInitTimestamp","pubsubify","once","_addMraidEventListener","viewableDurationMS","lastViewableTS","clickRetryTimeout","lastOpenedURL","isOrientationLocked","orientationToLock","viewable","isViewableByEvent","mraids","mraidIndex","supported","_setInitialState","_addEventListeners","document.hidden","hidden","document.visibilityState","visibilityState","LiftoffMRAID.viewable","MRAID_ENV","mraid","getMRAID","ready","_mraidTry","hasSupport","getState","fallback","isViewable","processViewableChange","isViewportShown","sinceInitMs","sinceInit","version","getMRAIDVersion","func","_ref$tag","_ref$fallback","_ref$logError","logError","errors","getVersion","ee","_appendEventLog","viewableChange","normalizedIsViewable","lockOrientation","clearTimeout","continuous","_this4","nowAndOnViewableChange","_this5","exchange","_ref2$isLiftoffURL","platform","abTests","isLiftoffURL","_ref2$isAutoclick","isAutoclick","mraidOpenIsSupported","requireMRAID","clickWaterfallDisabled","getFinalClickURL","openMethod","open_method","tracking_method","openMethods","href","click","isOpenSKProductView","appleStoreUrlPrefix","tryOpen","methodType","finalClickURL","clickOpenMethod","_this6","onReady","recordMetricV2","use","_this7","useCustomClose","orientation","setOrientationProperties","allowOrientationChange","forceOrientation","windowMraid","methodName","isSupported","support","prop","_ref4$log","logMethodSupport","_this8","_ref5$log","innerHeight","innerWidth","_LiftoffMRAID","AdexpMetricV2","AdexpJavaScriptError","AdexpLog","AdexpMessage","getAdexpContextSnapshotFn","_ref$severity","AdexpContext","viewportWidth","viewportHeight","adLanguage","ad_language","viewport_height","viewport_width","metrics_v2","viewportEl","hasMraidFn","patchedObjects","MonkeyPatch","propertyName","protoMap","dataKey","originalValue","getOwnPropertyDescriptor","_applyPatch","_patch","pointInCTA","clickAreaTypeFromEvent","isDeadzoneCoord","__WEBPACK_IMPORTED_MODULE_0__constants__","pointInEl","y","_el$getBoundingClient","elTop","elRight","elBottom","ctaEl","clientX","clientY","isFinite","warn","MESSAGE_CREATIVE_MADE_SOUND","MESSAGE_TOGGLE_MUTED","MESSAGE_INTERACTION_CHANGE","MESSAGE_CLICKTHROUGH","MESSAGE_MRAID_EVENT","MESSAGE_MRAID_CALL","MESSAGE_UPDATED_MRAID_PROPERTIES","MESSAGE_INNER_ENV_INIT_COMPLETE","MESSAGE_OUTER_ENV_INIT_COMPLETE","MESSAGE_REQUEST_DOM_SNAPSHOT","MESSAGE_DOM_SNAPSHOT","MESSAGE_INNER_ENV_ERROR","MESSAGE_RESIZE","MESSAGE_VUNGLE_CLICKTHROUGH","MESSAGE_TRESENSA_INTERACTION","__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__","AudioToggleIcon","setMuted","muted","display","__WEBPACK_IMPORTED_MODULE_0__monkey_patch__","isMediaElement","doesVideoHaveAudio","audioTracks","webkitAudioDecodedByteCount","GlobalWebAudioController","_firstSoundMade","_muted","_cb","_gainNodes","originalAudioContext","AudioContext","webkitAudioContext","audioCtx","gainNode","createGain","analyserNode","createAnalyser","fftSize","freqData","Uint8Array","frequencyBinCount","soundPollInterval","setInterval","getByteFrequencyData","clearInterval","_handleFirstSound","originalDestination","destination","connect","gain","shouldMute","MediaElementWatcher","_seenElements","WeakSet","originalCreateElement","Document","patchFunction","_handleNewElement","originalAudio","Audio","originalMethod","HTMLMediaElement","_len4","_key4","GlobalMediaElementAudioController","_globallyMuted","_elToSetState","WeakMap","_allMediaEls","_originalMutedSetter","originalMutedGetter","patchSetter","_canMakeSound","systemMutedState","patchGetter","recordedSetState","mute","_watchForSound","_toggleElementMuted","paused","_toggleMediaMuted","GlobalAudioController","_initialized","_onFirstSoundCallbacks","handleFirstSound","_init","applyLiftoffPolicy","postHTMLReturn","getDOMSnapshot","configureHTMLReturn","__WEBPACK_IMPORTED_MODULE_0__lib_audio_toggle_icon__","__WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__","__WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__","__WEBPACK_IMPORTED_MODULE_3__constants__","__WEBPACK_IMPORTED_MODULE_4__frontendlib_utils__","createCloseEl","closeEl","position","zIndex","buttonStyles","textAlign","border","borderRadius","boxSizing","pointerEvents","closeTargetEl","color","backgroundColor","stopPropagation","closeDelayEl","countdown","textContent","closeDelayInterval","onFirstInteraction","hasUserInteracted","handleFirstInteraction","createGlobalAudioToggle","opacity","icon","iconEl","getElement","isCurrentlyMuted","contains","runAfterFirstSound","globallyMuteAllAudio","snippetEl","addBorder","showAdChoices","russianAgeRating","showChineseWatermark","closeDelay","audioPolicy","creativeID","sourceAppName","sourceAppID","cdnURL","watermarksEl","queryParams","creative_id","source_app_name","source_app_id","optoutPageURL","preventDefault","backgroundImage","backgroundPosition","backgroundRepeat","backgroundSize","ageTag","fontWeight","background","padding","verticalAlign","globalAudioToggleEl","isUsingCustomClose","adexpEndpoint","documentElement","outerHTML","htmlReturnDelay","postHTML","info","intentionalInteractionCounterFn","__WEBPACK_IMPORTED_MODULE_0__cta__","throttle","ignore","minimumInteractions","intentionalInteractionsFromMonitor","intentionalInteractionCountFromThrottle","countIntentionalInteractionThrottle","countIntentionalInteractions","lastInteraction","startX","startY","cumulativeStats","interactionCount","hasBeenClicked","firstClickHandlers","sliders","setSlideDistance","sliderSize","setSlideRatio","getPointerEventX","changedTouches","touches","ClickInteraction","handleFirstClick","onCompleted","clickEl","onClickComplete","handler","slideStartPosition","mousedown touchstart","mousemove touchmove","mouseup mouseleave touchend","slideDistance","completedSliders","addDeadzoneStyles","head","addDeadzones","useExpandedZones","rootEl","getClickTrackingQueryParams","handleClick","__WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__","__WEBPACK_IMPORTED_MODULE_1__madlib_logger__","__WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__","getLiftoffContainerRect","getElementById","allInteractionData","containerRect","ct","aw","toFixed","ah","tv","getViewableDurationMS","cx","cy","durationMS","dur","it","isTrusted","frc","maxForce","ar","maxArea","distance","pt","pointerType","ic","tid","totalDistance","constructLiftoffClickURL","baseClickURL","pingTrackingURLWithImage","onload","onerror","pingTrackingURLWithBeacon","sendBeacon","clickthroughWithScriptTag","clickthroughURL","_ref2$abTests","_ref2$onlyMraid","onlyMraid","_loOpen","clickURL","script","return_js","isLiftoffClickTrackingURL","clickTrackingURL","pingClickTrackingURL","getClickTrackingURLString","trackingMethod","canUse","pingFn","prevPromiseFn","nextWaterfallOption","urlString","handleClickTracking","clickTrackingURLs","pingCompletePromises","isLiftoffClickthroughURL","handleClickthrough","isReengagement","_ref4$abTests","pv","urlStr","mac","dap","clickConfig","_ref5$abTests","exchangePingElem","clickthroughParams","promise","InteractionMonitor","_get","receiver","Function","desc","getPointerEventPointerType","pointerEvent","isButtonPressed","buttons","which","computeDistance","endX","endY","sqrt","isTouchInWindow","touch","maxTouchEventForce","touchForces","force","touchEventArea","sum","radiusX","radiusY","PI","Interaction","startEvent","_startEvent","_lastMoveEvent","_endEvent","_maxForce","_maxArea","area","_totalDistance","endEvent","_updateMetrics","moveEvent","metrics","isComplete","timestamp","newEvent","_lastMaxArea","lastEvent","InteractionEventMonitor","_interactionCount","_totalInteractionDistance","_lastInteraction","_interactionStartHandlers","_interactionEndHandlers","_attachedEventListeners","_attachEventListeners","listenerOptions","capture","handlerFn","isInteractionInProgress","normalizedEvent","_normalizeEvent","setEndEvent","_updateCumulativeInteractionStats","setLastMoveEvent","isInProgress","getMetrics","getLastInteractionData","getCumulativeInteractionStats","MouseEventMonitor","_InteractionEventMoni","pageX","pageY","timeStamp","webkitForce","_handleStartEvent","_handleEndEvent","_handleMoveEvent","PointerEventMonitor","_InteractionEventMoni2","pressure","TouchEventMonitor","_InteractionEventMoni3","isInWindow","isLastInteractionComplete","_monitors","monitor","onInteractionStart","_handleInteractionEvent","onInteractionEnd","_previousAllInteractionData","_interactionChangeHandlers","currentAllInteractionData","getAllInteractionData","find","eventMonitor","_chooseEventMonitorWithInProgressInteractions","_chooseEventMonitorWithCompletedInteractions","_chooseEventMonitor","_behaviorClasses","__WEBPACK_IMPORTED_MODULE_1__behaviors_AutoclickBehaviorCompletedDelay__","__WEBPACK_IMPORTED_MODULE_2__behaviors_AutoclickBehaviorInteractionCount__","__WEBPACK_IMPORTED_MODULE_3__behaviors_AutoclickBehaviorLastInteraction__","__WEBPACK_IMPORTED_MODULE_4__behaviors_AutoclickBehaviorLastInteractionAndCount__","__WEBPACK_IMPORTED_MODULE_5__behaviors_AutoclickBehaviorLoadDelay__","__WEBPACK_IMPORTED_MODULE_6__behaviors_AutoclickBehaviorViewableDelay__","__WEBPACK_IMPORTED_MODULE_7__behaviors_AutoclickBehaviorViewableDelayWithReset__","behaviorClasses","MONITORED_EVENTS","INTERACTION_EVENT","COMPLETED","ENGAGEMENT","HTML_LOADED","VIEWABLE","VIEWABLE_CHANGE","AUTOCLICK_EVENT_COUNT_CHANGE","Autoclick","_eventListeners","clickthroughHandler","disable","_clickthroughHandler","_lastCount","behaviorType","behaviorClass","_handleDelayClickthrough","eventListeners","onEngagement","onHtmlLoaded","onViewable","onViewableChange","_recordLastInteraction","onInteraction","autoclickDisabled","_len5","_key5","_delayTimer","_clickthrough","_len6","_key6","__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__","AutoclickBehaviorCompletedDelay","_AutoclickBehaviorAbs","delayClickthrough","__WEBPACK_IMPORTED_MODULE_1__autoclick_utils__","AutoclickBehaviorInteractionCount","_counter","triggered","setCurrentCount","AutoclickBehaviorLastInteraction","AutoclickBehaviorLastInteractionAndCount","AutoclickBehaviorLoadDelay","AutoclickBehaviorViewableDelay","__WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__","__WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__","__WEBPACK_IMPORTED_MODULE_4__container__","__WEBPACK_IMPORTED_MODULE_5__cta__","__WEBPACK_IMPORTED_MODULE_6__liftoff_mraid__","__WEBPACK_IMPORTED_MODULE_7__addDeadzones__","Madlib","config","loaded","containerByID","allContainers","rootContainer","didEverApplyLetterboxStyles","productIndex","clickAreaType","Liftoff","_Liftoff$env$products","env","products","handleMadlibError","applyExchangePolicies","loadDOM","addEventListeners","coordinate","layout","onLoadCompleted","animationDurationLimit","getAnimationDurationLimit","container","layoutEl","addListeners","handleNavigationClick","_Liftoff$bidContext","bidContext","is_interstitial","is_reengagement","isDeadzoneExperiment","hasTestGroup","timeMS","scenes","layoutContent","letterboxConfig","useDarkRootBackground","useLayoutBackground","toggle","getStyleForClickElement","invalidate","reset","getLetterboxConfig","rootElementConstraints","configureLetterbox","getLetterboxConstraintsForMadlibRootElement","parseCreativeConfig","getCreativeConfig","loadContent","invalidated","onMadlibLoaded","onFirstLayoutFinished","resetClickParams","componentParams","clickTargets","constraints","containers","coordination","css","rootConstraints","rootPostLayoutTransform","traverse","_componentParams$id","component","subcomponents","fixValues","_params$key","resolveAsset","componentName","Component","new","subcomponent","relay","postLayoutTransform","attachAnchors","configureCoordination","configureClickTargets","anchors","edge","anchor","actions","eventType","eventMacros","actors","action","actionName","actionType","actionMacros","actor","emitter","getMacroValues","eventPayload","macroValues","macro","expandMacros","actionPayload","expansion","r","sub","processEventPayload","dispatchActions","_ref8","is_tre","TreSensa","EDGE_TO_TYPE","EDGE_TO_DIMENSION","ctaContainerRegex","isCTAContainer","containerID","Container","_EventListener","fixedWidth","fixedHeight","layoutReady","contentReady","system","hide","visibility","show","promises","load","resetTransform","center","applyTransform","styles","transform","containerEdge","_constraints$containe","anchorEdge","containerEdgeType","anchorEdgeType","dimension","offset","_parseCSSLength","matchWidthToHeight","matchHeightToWidth","centerHorizontal","centerVertical","TEMPLATE","LastChanceEndscreen","appStoreData","parentEl","validateUserClick","ctaText","cta_text","autoEndCardCallCount","images","imagePaths","has_html_endscreen","closest","wasShown","prepareAutoEndcard","showAutoEndcard","initializeEvents","touchstart","useInteractionMonitor","screenY","__WEBPACK_IMPORTED_MODULE_0__component__","__WEBPACK_IMPORTED_MODULE_1__creative_utils__","__WEBPACK_IMPORTED_MODULE_2__click_handling__","__WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__","__WEBPACK_IMPORTED_MODULE_4__interaction_monitor__","__WEBPACK_IMPORTED_MODULE_5__letterbox_config__","__WEBPACK_IMPORTED_MODULE_6__logger__","__WEBPACK_IMPORTED_MODULE_7__window_resize_logger__","__WEBPACK_IMPORTED_MODULE_8__constants__","__WEBPACK_IMPORTED_MODULE_9__frontendlib_dom_utils__","__WEBPACK_IMPORTED_MODULE_10__frontendlib_utils__","__WEBPACK_IMPORTED_MODULE_11__cta__","__WEBPACK_IMPORTED_MODULE_12__adexp__","__WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__","__WEBPACK_IMPORTED_MODULE_14__madlib__","__WEBPACK_IMPORTED_MODULE_15__lib_last_chance_endscreen_last_chance_endscreen__","__WEBPACK_IMPORTED_MODULE_16__csp_env_messages__","logMraidSupport","getSupportedLog","onTreSensaInteraction","autoEndcard","lastChanceEndscreenAutoclick","lastChanceEndscreenInteractionAutoclick","vxInteractionListeners","initAutoEndcard","assets","trackingTags","trackingTagHolder","populateAppStoreData","bid_context","testGroups","ab_tests","group","lastClickMetric","interactionMonitor","onInteractionChange","_autoclickBus","ac","emitInteractionEvent","updateMRAID","loadLogger","initAutoclickBehaviors","applyPolicy","windowResizeLogger","enable_logging","madlibLoaded","useAutoendcardBehaviour","app_store_data","VungleHelper","tokens","APP_ICON","APP_NAME","description","APP_DESCRIPTION","rating","APP_STORE_RATING","LIFTOFF_START_TS","_viewclick","viewclick_behavior","ae","last_chance_endscreen_autoclick_behavior","_lastChanceEndscreenAutoclick","_lastChanceEndscreenInteractionAutoclick","last_chance_endscreen_interaction_autoclick_behavior","emitInteractionPromptReachedEvent","creative_policy","animation_duration_limit","_bidContext","_env","enableLogging","enableHtmlReturn","enable_html_return","logging_endpoint","trackingParam","event_tracking_param","html_return_delay","passContext","enable","addErrorListeners","_snippetEl$classList","treContainerEl","add_border","russian_age_rating","show_chinese_watermark","show_ad_choices","use_custom_close","close_delay","clickParams","clickTrackingParams","allQueryParams","cbl","getClickParams","ca","click_config","clickthrough_url","click_tracking_urls","path","composedPath","clickMetric","time_ms","someElements","pred","eventtarget","Element","emitViewableEvent","emitViewableChangeEvent","onClickCapture","logInitialDims","emitHtmlLoadedEvent","assetType","assetID","asset","image_versions","video_versions","DOMUtils","Utils","__WEBPACK_IMPORTED_MODULE_1__logger__","overrideMethods","resize","restart","registry","cls","assertSubclassed","setInteractionPromptReached","LetterboxConfig","dims","viewportSize","bidCreativeSize","viewportOrientation","orientationMismatch","getCreativePreferredOrientation","isRotated","useWhiteBars","contentSize","_config","scaleFactor","preserveAspectRatioScalingFactor","rootContainerSize","rootContainerOffset","rootContainerScaled","rootContainerTransformedArea","_getLetterboxLayoutIn","getLetterboxLayoutInfo","_getLetterboxLayoutIn2","__WEBPACK_IMPORTED_MODULE_0__logger__","initialScreenAngle","RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER","WindowResizeLogger","enableResizeLogging","resizeCount","resizeLog","logResizedDims","_snippetEl$getBoundin","sinceStartMS","screen.orientation.angle","supportsOrientationChange","supportsDeviceOrientation","window.innerWidth","window.innerHeight","documentElement.clientWidth","documentElement.clientHeight","_logDims"],"mappings":"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","file":"liftoff-58ea9097a7f92539efa7.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \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, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\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 = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 135);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"appendParamObjectToURL\", function() { return appendParamObjectToURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"appendQueryStringToURL\", function() { return appendQueryStringToURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"assignWithDefaults\", function() { return assignWithDefaults; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"binaryFind\", function() { return binaryFind; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"camelCase\", function() { return camelCase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"capitalize\", function() { return capitalize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clamp\", function() { return clamp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clone\", function() { return clone; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compareNumbers\", function() { return compareNumbers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compareStrings\", function() { return compareStrings; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"composeAsync\", function() { return composeAsync; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"smartCompare\", function() { return smartCompare; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deepEqual\", function() { return deepEqual; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deepInclude\", function() { return deepInclude; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deepUnique\", function() { return deepUnique; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"diffObjects\", function() { return diffObjects; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"escapeRegExp\", function() { return escapeRegExp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flatten\", function() { return flatten; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formatConjunction\", function() { return formatConjunction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formatFileSize\", function() { return formatFileSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formatUSD\", function() { return formatUSD; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getLocale\", function() { return getLocale; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"numberToLocaleString\", function() { return numberToLocaleString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getIn\", function() { return getIn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"kebabCase\", function() { return kebabCase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isPromise\", function() { return isPromise; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isEmpty\", function() { return isEmpty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadImage\", function() { return loadImage; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadImages\", function() { return loadImages; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapByID\", function() { return mapByID; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapcat\", function() { return mapcat; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mergePropertiesWithDefaults\", function() { return mergePropertiesWithDefaults; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"objFromQueryString\", function() { return objFromQueryString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"objToQueryString\", function() { return objToQueryString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"errorSensitiveFetch\", function() { return errorSensitiveFetch; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"postJSON\", function() { return postJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"patchJSON\", function() { return patchJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ping\", function() { return ping; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"poll\", function() { return poll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"precisionRound\", function() { return precisionRound; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"randomInt\", function() { return randomInt; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"range\", function() { return range; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"request\", function() { return request; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"runAsync\", function() { return runAsync; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeKeys\", function() { return removeKeys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeEmptyKeys\", function() { return removeEmptyKeys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selectKeys\", function() { return selectKeys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"shuffle\", function() { return shuffle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"stableSort\", function() { return stableSort; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"timeDifference\", function() { return timeDifference; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"type\", function() { return type; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"wait\", function() { return wait; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"timeout\", function() { return timeout; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unique\", function() { return unique; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFunction\", function() { return isFunction; });\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar appendParamObjectToURL = function appendParamObjectToURL(url, params) {\n  return appendQueryStringToURL(url, objToQueryString(params));\n};\n\nvar appendQueryStringToURL = function appendQueryStringToURL(url, queryString) {\n  if (queryString === \"\") return url;\n\n  var separator = url.includes(\"?\") ? \"&\" : \"?\";\n\n  return \"\" + url + separator + queryString;\n};\n\n// If any key in the `defaults` object doesn't exist in `target`, the key is\n// merged. Additional `sources` object arguments are merged into `target`, but\n// only the keys that exist in `defaults`.\nvar assignWithDefaults = function assignWithDefaults(target, defaults) {\n  for (var _len = arguments.length, sources = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n    sources[_key - 2] = arguments[_key];\n  }\n\n  Object.keys(defaults).forEach(function (key) {\n    if (!target.hasOwnProperty(key) || target[key] === undefined) {\n      target[key] = defaults[key];\n    }\n\n    sources.filter(function (source) {\n      return source != null && source.hasOwnProperty(key) && source[key] !== undefined;\n    }).forEach(function (source) {\n      return target[key] = source[key];\n    });\n  });\n\n  return target;\n};\n\n/**\n * Takes an ordered array and returns the first value where fn(value) returns true.\n */\nvar binaryFind = function binaryFind(arr, fn) {\n  var high = arr.length + 1;\n  var low = 0;\n  while (low + 1 < high) {\n    var mid = low + (high - low >> 1);\n    if (fn(arr[mid])) {\n      high = mid;\n    } else {\n      low = mid;\n    }\n  }\n\n  return arr[high];\n};\n\nvar camelCase = function camelCase(str) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$isSuffix = _ref.isSuffix,\n      isSuffix = _ref$isSuffix === undefined ? false : _ref$isSuffix;\n\n  return str.split(/[-_]/g).map(function (part, i) {\n    return i === 0 && !isSuffix ? part.toLowerCase() : capitalize(part.toLowerCase());\n  }).join(\"\");\n};\n\nvar capitalize = function capitalize(str) {\n  if (str === \"\") return str;\n\n  return \"\" + str[0].toUpperCase() + str.slice(1);\n};\n\nvar clamp = function clamp(x, a, b) {\n  if (a > b) {\n    return clamp(x, b, a);\n  }\n\n  if (x < a) {\n    return a;\n  }\n\n  if (x > b) {\n    return b;\n  }\n\n  return x;\n};\n\nvar clone = function clone(obj) {\n  if (obj === undefined) return undefined;\n\n  return JSON.parse(JSON.stringify(obj));\n};\n\nvar compareNumbers = function compareNumbers(a, b) {\n  if (a == null && b == null) return 0;else if (a == null) return -1;else if (b == null) return 1;\n\n  return a - b;\n};\n\nvar compareStrings = function compareStrings(a, b) {\n  return (a || \"\").trim().toLowerCase().localeCompare((b || \"\").trim().toLowerCase());\n};\n\n/**\n * Composes functions such that any returned Promise is resolved before the next invocation.\n * @param  {Function[]} funcs - A list of potentially async functions that each take a single param. Any null/\n * undefined values are ignored.\n */\nvar composeAsync = function composeAsync() {\n  for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    funcs[_key2] = arguments[_key2];\n  }\n\n  return function (arg) {\n    var res = Promise.resolve(arg);\n\n    var _loop = function _loop(i) {\n      var f = funcs[i];\n      if (f == null) {\n        return \"continue\";\n      }\n      res = res.then(function (arg) {\n        return f(arg);\n      });\n    };\n\n    for (var i = funcs.length - 1; i >= 0; i--) {\n      var _ret = _loop(i);\n\n      if (_ret === \"continue\") continue;\n    }\n    return res;\n  };\n};\n\nvar smartCompare = function smartCompare(a, b) {\n  var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n      _ref2$reverse = _ref2.reverse,\n      reverse = _ref2$reverse === undefined ? false : _ref2$reverse;\n\n  if (a === b) return 0;\n  if (type(a) !== type(b) && b != null && a != null) {\n    throw new Error(\"Don't know how to compare type \" + type(a) + \" with type \" + type(b) + \"!\");\n  }\n  var compareType = a != null ? type(a) : type(b);\n\n  var _ref3 = reverse ? [b, a] : [a, b],\n      _ref4 = _slicedToArray(_ref3, 2),\n      valueA = _ref4[0],\n      valueB = _ref4[1];\n\n  switch (compareType) {\n    case \"string\":\n      return compareStrings(valueA, valueB);\n    case \"number\":\n      return compareNumbers(valueA, valueB);\n    default:\n      // TODO(oscar): Add more types for comparison such as Dates.\n      throw new Error(\"Missing method for comparing type \" + compareType);\n  }\n};\n\n/**\n * Recursively compares 2 JS objects.\n * @param {any} a\n * @param {any} b\n * @param {Object} options\n * @param {boolean} options.toJSON - Uses clone() in order to compare objects as\n * their JSON representations.\n * Useful when comparing plain objects to class instances.\n */\nvar deepEqual = function deepEqual(a, b) {\n  var _ref5 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n      _ref5$toJSON = _ref5.toJSON,\n      toJSON = _ref5$toJSON === undefined ? false : _ref5$toJSON;\n\n  if (a === b) {\n    return true;\n  }\n\n  var compareA = toJSON ? clone(a) : a;\n  var compareB = toJSON ? clone(b) : b;\n  var tA = type(compareA);\n  var tB = type(compareB);\n\n  if (tA === \"array\" && tB === \"array\") {\n    if (compareA.length !== compareB.length) return false;\n\n    for (var i = 0; i < compareA.length; i++) {\n      if (!deepEqual(compareA[i], compareB[i])) return false;\n    }\n\n    return true;\n  }\n\n  if (tA === \"set\" && tB === \"set\") {\n    if (compareA.size !== compareB.size) return false;\n\n    var bShallowCopy = new Set(compareB);\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n\n    try {\n      aLoop: for (var _iterator = compareA[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n        var aElement = _step.value;\n\n        // First check if there's an equivalent reference in the two sets before checking for deep equality,\n        // since the latter is very inefficient.\n        if (bShallowCopy.has(aElement)) {\n          bShallowCopy.delete(aElement);\n          continue;\n        }\n\n        var _iteratorNormalCompletion2 = true;\n        var _didIteratorError2 = false;\n        var _iteratorError2 = undefined;\n\n        try {\n          for (var _iterator2 = bShallowCopy[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n            var bElement = _step2.value;\n\n            if (deepEqual(aElement, bElement)) {\n              bShallowCopy.delete(bElement);\n              continue aLoop;\n            }\n          }\n        } catch (err) {\n          _didIteratorError2 = true;\n          _iteratorError2 = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion2 && _iterator2.return) {\n              _iterator2.return();\n            }\n          } finally {\n            if (_didIteratorError2) {\n              throw _iteratorError2;\n            }\n          }\n        }\n\n        return false;\n      }\n    } catch (err) {\n      _didIteratorError = true;\n      _iteratorError = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion && _iterator.return) {\n          _iterator.return();\n        }\n      } finally {\n        if (_didIteratorError) {\n          throw _iteratorError;\n        }\n      }\n    }\n\n    return true;\n  }\n\n  if (tA === \"object\" && tB === \"object\") {\n    for (var k in compareA) {\n      if (!(k in compareB)) return false;\n    }\n\n    for (var _k in compareB) {\n      if (!(_k in compareA) || !deepEqual(compareA[_k], compareB[_k])) return false;\n    }\n\n    return true;\n  }\n\n  return compareA === compareB;\n};\n\nvar deepInclude = function deepInclude(parent, child) {\n  if (type(parent.some) === \"function\") {\n    return parent.some(function (obj) {\n      return deepEqual(obj, child);\n    });\n  } else if (type(parent) === \"object\") {\n    return Object.values(parent).some(function (obj) {\n      return deepEqual(obj, child);\n    });\n  }\n  return false;\n};\n\nvar deepUnique = function deepUnique(arr) {\n  var index = 0;\n\n  var _loop2 = function _loop2() {\n    var item = arr[index];\n    arr = arr.slice(0, index + 1).concat(arr.slice(index).filter(function (currItem) {\n      return !deepEqual(item, currItem);\n    }));\n    index += 1;\n  };\n\n  while (index < arr.length) {\n    _loop2();\n  }\n\n  return arr;\n};\n\n/**\n * @param {Object} a\n * @param {Object} b\n * @param {boolean} includeAKeys\n * @returns {Object} - An object containing keys in `b` if the values differ\n * from those in `a`. If `includeAKeys` is true, the keys in `a` that are NOT in\n * `b` are also included.\n */\nvar diffObjects = function diffObjects(a, b) {\n  var includeAKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var result = {};\n  for (var k in b) {\n    if (!deepEqual(a[k], b[k])) {\n      result[k] = b[k];\n    }\n  }\n  if (includeAKeys) {\n    for (var _k2 in a) {\n      if (!(_k2 in b)) {\n        result[_k2] = null;\n      }\n    }\n  }\n\n  return result;\n};\n\n// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\nvar escapeRegExp = function escapeRegExp(str) {\n  return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, \"\\\\$&\");\n};\n\nvar flatten = function flatten(arr) {\n  return [].concat.apply([], arr);\n};\n\n/**\n * Takes a list of words and joins them via coordinating conjunction grammar rules. Oxford comma is mandatory.\n * @param {String[]} words\n */\nvar formatConjunction = function formatConjunction(words) {\n  var conjunction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"and\";\n\n  var wc = words.length;\n  if (wc <= 2) {\n    return words.join(\" \" + conjunction + \" \");\n  } else {\n    return [].concat(_toConsumableArray(words.slice(0, wc - 1)), [conjunction + \" \" + words[wc - 1]]).join(\", \");\n  }\n};\n\nvar formatFileSize = function formatFileSize(size) {\n  // NOTE: Math.log10 is not available in every browser and Math.log / Math.LN10\n  // is unreliable.\n  var thousands = Math.floor(((\"\" + size).length - 1) / 3);\n  return \"\" + Math.round(size / Math.pow(10, 3 * thousands)) + \"BKMGTP\"[thousands];\n};\n\nvar formatUSD = function formatUSD(val) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  options = Object.assign({\n    style: \"currency\",\n    currency: \"USD\"\n  }, options);\n\n  return type(val) !== \"number\" ? null : val.toLocaleString(\"en\", options);\n};\n\nvar getLocale = function getLocale() {\n  var _window = window,\n      navigator = _window.navigator;\n\n  if (navigator == null) return null;\n  return navigator.languages && navigator.languages.length ? navigator.languages[0] : navigator.language;\n};\n\n/**\n * This function is a wrapper for Number.toLocalString() however it tries to use\n * the device's language. If all else fails, it uses \"en\".\n *\n * TODO(oscar): Fix the Intl polyfill we use, so there's no issue using\n * `undefined` as the locale.\n */\nvar numberToLocaleString = function numberToLocaleString(n, options, locale) {\n  var f = function f(locale) {\n    try {\n      return Number(n).toLocaleString(locale, options);\n    } catch (e) {}\n  };\n  return f(locale) || f() || f(getLocale()) || f(\"en\");\n};\n\nvar getIn = function getIn(m, ks, d) {\n  if (m == null) return d;\n  if (ks.length === 1) {\n    return m[ks[0]];\n  }\n\n  return getIn(m[ks[0]], ks.slice(1));\n};\n\nvar kebabCase = function kebabCase(str) {\n  // A \"-\" will be inserted before every capital letter, so make sure the first\n  // character isn't capitalized.\n  str = str.charAt(0).toLowerCase() + str.slice(1);\n  // Convert camel case to kebab case.\n  str = str.replace(/[A-Z]/g, \"-$&\").toLowerCase();\n  // Convert snake case to kebab case.\n  str = str.replace(/_/g, \"-\");\n\n  return str;\n};\n\nvar isPromise = function isPromise(obj) {\n  return Promise.resolve(obj) === obj;\n};\n\nvar isEmpty = function isEmpty(obj) {\n  return obj == null || Object.keys(obj).length === 0 &&\n  // Needed for iterables like `Set`.\n  Array.from(obj).length === 0 && (obj.size || 0) === 0;\n};\n\nvar loadImage = function loadImage(url) {\n  var crossOrigin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n  if (!url) return Promise.reject(new Error(\"No image URL provided\"));\n\n  return new Promise(function (resolve, reject) {\n    var img = new Image();\n    img.crossOrigin = crossOrigin;\n    img.addEventListener(\"load\", function () {\n      return resolve(img);\n    });\n    img.addEventListener(\"error\", reject);\n    img.src = url;\n    if (img.complete) {\n      resolve(img);\n    }\n  });\n};\n\nvar loadImages = function loadImages(urls) {\n  var crossOrigin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  return Promise.all(urls.filter(function (url) {\n    return url != null;\n  }).map(function (url) {\n    return loadImage(url, crossOrigin);\n  }));\n};\n\nvar mapByID = function mapByID(arr) {\n  var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n  return arr.reduce(function (map, item) {\n    map[item.id] = fn != null ? fn(item) : item;\n    return map;\n  }, {});\n};\n\nvar mapcat = function mapcat(arr, fn) {\n  return [].concat.apply([], arr.map(fn));\n};\n\n// Like `Object.assign`, merges subsequent object arguments into the first\n// object argument `defaults`, but only keys that exist in `defaults`.\n// Unlike `Object.assign`, does not modify the first argument, but returns a\n// shallow clone instead.\nvar mergePropertiesWithDefaults = function mergePropertiesWithDefaults(defaults) {\n  for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n    args[_key3 - 1] = arguments[_key3];\n  }\n\n  if (args.length === 0) return defaults;\n\n  var target = Object.assign(defaults);\n  var keys = Object.keys(target);\n\n  args.forEach(function (source) {\n    if (source == null) return;\n\n    keys.forEach(function (key) {\n      if (source.hasOwnProperty(key) && source[key] !== undefined) {\n        target[key] = source[key];\n      }\n    });\n  });\n\n  return target;\n};\n\nvar objFromQueryString = function objFromQueryString() {\n  var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : location.search.slice(1);\n\n  return str.split(\"&\").reduce(function (acc, part) {\n    var _part$split$map = part.split(\"=\", 2).map(decodeURIComponent),\n        _part$split$map2 = _slicedToArray(_part$split$map, 2),\n        key = _part$split$map2[0],\n        value = _part$split$map2[1];\n\n    if (key != null && value != null) {\n      acc[key] = value;\n    }\n\n    return acc;\n  }, {});\n};\n\nvar objToQueryString = function objToQueryString(obj) {\n  return Object.keys(obj).filter(function (key) {\n    return obj[key] != null;\n  }).map(function (key) {\n    return encodeURIComponent(key) + \"=\" + encodeURIComponent(obj[key]);\n  }).join(\"&\");\n};\n\n/**\n * Given a `Promise` that should resolve with a `Response` (e.g. a `Promise` returned by `fetch`), returns\n * a new Promise that will reject if 1) the original `Promise` rejects, 2) the original `Promise` resolves\n * with something that's not a `Response`, or 3) the original response had an error status.\n */\nvar wrapResponsePromise = function wrapResponsePromise(responsePromise) {\n  return new Promise(function (resolve, reject) {\n    return responsePromise.then(function (response) {\n      if (!(response instanceof Response && response.ok)) {\n        reject(response);\n        return;\n      }\n\n      resolve(response);\n    }).catch(reject);\n  });\n};\n\n/**\n * Like `fetch` but returns a `Promise` that rejects if `!response.ok`. This allows calling code to handle\n * non-ok responses (e.g. 404s and 500s) using `Promise.catch`.\n */\nvar errorSensitiveFetch = function errorSensitiveFetch() {\n  return wrapResponsePromise(fetch.apply(undefined, arguments));\n};\n\nvar postJSON = function postJSON(url, json, options) {\n  return makeJSONRequest(url, json, \"POST\", options);\n};\n\nvar patchJSON = function patchJSON(url, json, options) {\n  return makeJSONRequest(url, json, \"PATCH\", options);\n};\n\n/**\n * Sends a `fetch` request to `url` using the given `method` (e.g. \"GET\", \"POST\", \"PATCH\") and returns a\n * `Promise` that resolves with a `Response`. If `options.rejectOnErrorResponse === true`, the returned\n * `Promise` will reject if the sever returns an error response.\n */\nfunction makeJSONRequest(url, json, method) {\n  var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n  var _options$rejectOnErro = options.rejectOnErrorResponse,\n      rejectOnErrorResponse = _options$rejectOnErro === undefined ? false : _options$rejectOnErro;\n\n  var fetchPromise = fetch(url, {\n    body: JSON.stringify(json),\n    credentials: \"same-origin\",\n    headers: { \"Content-Type\": \"application/json; charset=utf-8\" },\n    method: method\n  });\n  if (!rejectOnErrorResponse) {\n    return fetchPromise;\n  }\n  return wrapResponsePromise(fetchPromise);\n}\n\nvar ping = function ping(url) {\n  var img = new Image();\n  img.src = url;\n};\n\n// Polls a `url` for up to `timeoutMS`. Assumes the response is a JSON object\n// with keys { state, value } where the values for `state` are one of\n// [\"success\", \"failed\", \"timeout\"].\nvar poll = function poll(url, timeoutMS) {\n  var timedOut = false;\n  setTimeout(function () {\n    return timedOut = true;\n  }, timeoutMS);\n\n  var request = function request() {\n    if (timedOut) {\n      return Promise.reject(new Error(\"poll exceeded timeout duration\"));\n    }\n\n    return fetch(url, { credentials: \"same-origin\" }).then(function (response) {\n      return response.json();\n    }).then(function (_ref6) {\n      var state = _ref6.state,\n          value = _ref6.value;\n\n      switch (state) {\n        case \"success\":\n          return value;\n        case \"failed\":\n          throw new Error(\"poll received failed response with value: \" + value);\n        case \"timeout\":\n          return request();\n        default:\n          throw new Error(\"poll received response with unknown state: \" + state);\n      }\n    });\n  };\n\n  return request();\n};\n\nvar precisionRound = function precisionRound(number, precision) {\n  var factor = Math.pow(10, precision);\n\n  return Math.round(number * factor) / factor;\n};\n\nvar randomInt = function randomInt(low, high) {\n  return low + Math.floor(Math.random() * (high - low));\n};\n\n// Returns an array of integers from [start, stop) (i.e. exclusive of stop).\n// Special case: if start === stop, return array with start as the only\n// element.\nvar range = function range(start, stop) {\n  var step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n  if (start === stop) return [start];\n\n  if (stop - start < 0 !== step < 0) {\n    throw new Error(\"Invalid call to range: range(\" + start + \", \" + stop + \", \" + step + \")\");\n  }\n\n  return Array((stop - start) / step | 0).fill(null).map(function (_, i) {\n    return start + i * step;\n  });\n};\n\nvar request = function request(method, url) {\n  var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var body = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n  return new Promise(function (resolve, reject) {\n    var req = new XMLHttpRequest();\n    req.onreadystatechange = function () {\n      if (req.readyState === 4 && req.status === 200) {\n        resolve(req);\n      }\n    };\n    req.addEventListener(\"load\", resolve.bind(null, req));\n    req.addEventListener(\"error\", reject.bind(null, req));\n    req.open(method.toUpperCase(), url);\n    Object.keys(headers).forEach(function (key) {\n      req.setRequestHeader(key, headers[key]);\n    });\n    req.send(body);\n  });\n};\n\nvar runAsync = function runAsync(fn) {\n  setTimeout(fn, 0);\n};\n\nvar removeKeys = function removeKeys(source, keys) {\n  if (source == null) return {};\n\n  return Object.keys(source).filter(function (key) {\n    return !keys.includes(key);\n  }).reduce(function (target, key) {\n    target[key] = source[key];\n\n    return target;\n  }, {});\n};\n\n/** Remove keys if their value is empty.  */\nvar removeEmptyKeys = function removeEmptyKeys(source) {\n  return selectKeys(source, function (_, val) {\n    return !isEmpty(val);\n  });\n};\n\nvar selectKeys = function selectKeys(source, keys) {\n  if (source == null) return {};\n\n  switch (type(keys)) {\n    case \"array\":\n      return keys.reduce(function (target, key) {\n        if (source.hasOwnProperty(key)) {\n          target[key] = source[key];\n        }\n\n        return target;\n      }, {});\n    case \"function\":\n      return Object.keys(source).reduce(function (target, key) {\n        if (keys(key, source[key])) {\n          target[key] = source[key];\n        }\n\n        return target;\n      }, {});\n  }\n};\n\n/**\n * Reorders items randomly into a new Array.\n * @param {Iterable} arr\n * @returns {Array}\n */\nvar shuffle = function shuffle(arr) {\n  var result = [].concat(_toConsumableArray(arr));\n  for (var i = result.length - 1; i > 0; i--) {\n    var j = Math.floor(Math.random() * (i + 1));\n    var _ref7 = [result[j], result[i]];\n    result[i] = _ref7[0];\n    result[j] = _ref7[1];\n  }\n  return result;\n};\n\n// Like `Array.sort()`, but maintains the relative order of array items with\n// equal sort values and does not mutate the original array.\nvar stableSort = function stableSort(arr, sortFn) {\n  var index = arr.reduce(function (agg, item, i) {\n    agg.set(item, i);\n\n    return agg;\n  }, new Map());\n\n  return arr.slice().sort(function (a, b) {\n    return sortFn(a, b) || index.get(a) - index.get(b);\n  });\n};\n\nvar timeDifference = function timeDifference(a, b) {\n  var msPerSecond = 1000,\n      msPerMinute = msPerSecond * 60,\n      msPerHour = msPerMinute * 60,\n      msPerDay = msPerHour * 24,\n      msPerWeek = msPerDay * 7,\n      msPerMonth = msPerWeek * 4,\n      msPerYear = msPerMonth * 13,\n      elapsed = Math.abs(a - b);\n  if (a <= b && elapsed < 1000 * 10) {\n    return \"just now\";\n  } else {\n    var val = void 0,\n        units = void 0;\n    if (elapsed < msPerMinute) {\n      val = Math.round(elapsed / msPerSecond);\n      units = \"second\";\n    } else if (elapsed < msPerHour) {\n      val = Math.round(elapsed / msPerMinute);\n      units = \"minute\";\n    } else if (elapsed < msPerDay) {\n      val = Math.round(elapsed / msPerHour);\n      units = \"hour\";\n    } else if (elapsed < msPerWeek) {\n      val = Math.round(elapsed / msPerDay);\n      units = \"day\";\n    } else if (elapsed < msPerMonth) {\n      val = Math.round(elapsed / msPerWeek);\n      units = \"week\";\n    } else if (elapsed < msPerYear) {\n      val = Math.round(elapsed / msPerMonth);\n      units = \"month\";\n    } else {\n      val = Math.round(elapsed / msPerYear);\n      units = \"year\";\n    }\n\n    return [val, \"\" + units + (val === 1 ? \"\" : \"s\"), a < b ? \"ago\" : \"from now\"].join(\" \");\n  }\n};\n\nvar type = function type(object) {\n  return {}.toString.call(object).match(/\\s([a-zA-Z]+)/)[1].toLowerCase();\n};\n\n/** Returns a Promise that resolves after `ms` ms. */\nvar wait = function wait(ms) {\n  return new Promise(function (resolve) {\n    setTimeout(resolve, ms);\n  });\n};\n\n/** Returns a Promise that rejects after `ms` ms. */\nvar timeout = function timeout(ms) {\n  return new Promise(function (_, reject) {\n    setTimeout(function () {\n      return reject(new Error(\"Promise timed out after \" + ms + \"ms\"));\n    }, ms);\n  });\n};\n\nvar unique = function unique(arr) {\n  return arr.filter(function (el, i) {\n    return arr.indexOf(el) === i;\n  });\n};\n\nvar isFunction = function isFunction(object) {\n  return type(object) === \"function\";\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addOneTimeListener\", function() { return addOneTimeListener; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"animationEndPromise\", function() { return animationEndPromise; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"transitionEndPromise\", function() { return transitionEndPromise; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"runTransitionSequence\", function() { return runTransitionSequence; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"appendChildren\", function() { return appendChildren; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"copyToClipboard\", function() { return copyToClipboard; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createElement\", function() { return createElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"empty\", function() { return empty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fetchHTML\", function() { return fetchHTML; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"firstAncestor\", function() { return firstAncestor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fragmentFromString\", function() { return fragmentFromString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"forceReflow\", function() { return forceReflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"generateSnippetMap\", function() { return generateSnippetMap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCSSProperty\", function() { return getCSSProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getElementsByClass\", function() { return getElementsByClass; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getRelativeBoundingClientRect\", function() { return getRelativeBoundingClientRect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getAggregateBoundingClientRect\", function() { return getAggregateBoundingClientRect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getFontSizeToFit\", function() { return getFontSizeToFit; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getFontSizeToFitLines\", function() { return getFontSizeToFitLines; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"indexOf\", function() { return indexOf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"imageIsRendered\", function() { return imageIsRendered; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"off\", function() { return off; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"on\", function() { return on; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"onAnimationsComplete\", function() { return onAnimationsComplete; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parseCSSLength\", function() { return parseCSSLength; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"prependChild\", function() { return prependChild; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceStyle\", function() { return replaceStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"scrollIntoView\", function() { return scrollIntoView; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"strToElement\", function() { return strToElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"strToStyle\", function() { return strToStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"writeToIframe\", function() { return writeToIframe; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"preparetagHTML\", function() { return preparetagHTML; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"appendImpressionTags\", function() { return appendImpressionTags; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils__ = __webpack_require__(0);\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nvar addOneTimeListener = function addOneTimeListener(el, eventName, fn) {\n  var ignoreBubbling = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n  var listener = function listener(event) {\n    if (ignoreBubbling && event.target !== el) return;\n\n    el.removeEventListener(eventName, listener);\n    fn(event);\n  };\n  el.addEventListener(eventName, listener);\n};\n\n/** Responds to the first event triggered. Useful for polyfilling webkit prefixed events. */\nvar eventRacePromise = function eventRacePromise(el, events) {\n  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n      timeout = _ref.timeout,\n      _ref$matchTarget = _ref.matchTarget,\n      matchTarget = _ref$matchTarget === undefined ? false : _ref$matchTarget;\n\n  var eventsString = [].concat(events).join(\" \");\n  return new Promise(function (resolve) {\n    var callbackRun = false;\n    var callback = function callback() {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      if (callbackRun || matchTarget && el !== args[0].target) return;\n      callbackRun = true;\n      resolve.apply(undefined, args);\n      off(el, _defineProperty({}, eventsString, callback));\n    };\n\n    on(el, _defineProperty({}, eventsString, callback));\n    if (timeout != null) {\n      setTimeout(function () {\n        return callback({ message: \"Promise timed out.\" });\n      }, timeout);\n    }\n  });\n};\n\nvar animationEndPromise = function animationEndPromise(el) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  return eventRacePromise(el, \"animationend webkitAnimationEnd\", options);\n};\n\nvar transitionEndPromise = function transitionEndPromise(el) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  return eventRacePromise(el, \"transitionend webkitTransitionEnd\", options);\n};\n\n/**\n * Given:\n *   - `el` - a DOM node\n *   - `transitions` - an array where each element is either 1) a function, or 2) an object of style property\n *     names to values\n * this sequentially 1) runs the function and waits for the Promise returned by the function to resolve (if\n * the function returns a Promise) before moving onto the next step, or 2) applies the styles to `el` and\n * waits for a `transitionend` event before moving onto the next step. Returns a Promise. `timeoutMS` is\n * an optional duration (in ms) after which the next transition should be run even if the previous transition\n * has not completed or if the previous function's returned promise has not resolved.\n */\nvar runTransitionSequence = function runTransitionSequence(el, transitions) {\n  var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n      _ref2$timeoutMS = _ref2.timeoutMS,\n      timeoutMS = _ref2$timeoutMS === undefined ? null : _ref2$timeoutMS,\n      _ref2$continueFn = _ref2.continueFn,\n      continueFn = _ref2$continueFn === undefined ? function () {\n    return true;\n  } : _ref2$continueFn;\n\n  return transitions.reduce(function (prevTransitionEndPromise, thisTransition) {\n    return prevTransitionEndPromise.finally(function () {\n      if (!continueFn()) {\n        return Promise.resolve();\n      }\n\n      var currentTransitionEndPromise = void 0;\n      if (Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"isFunction\"])(thisTransition)) {\n        currentTransitionEndPromise = thisTransition();\n      } else {\n        currentTransitionEndPromise = transitionEndPromise(el);\n        Object.assign(el.style, thisTransition);\n      }\n\n      if (timeoutMS == null) {\n        return currentTransitionEndPromise;\n      }\n\n      return Promise.race([Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"timeout\"])(timeoutMS), currentTransitionEndPromise]);\n    });\n  }, Promise.resolve());\n};\n\nvar appendChildren = function appendChildren(node, children) {\n  var fragment = document.createDocumentFragment();\n\n  children.forEach(function (child) {\n    if (!child) return;\n\n    fragment.appendChild(child instanceof Node ? child : createElement(child));\n  });\n\n  node.appendChild(fragment);\n};\n\nvar copyToClipboard = function copyToClipboard(text, multiline) {\n  var elemType = multiline ? \"textarea\" : \"input\";\n  var el = document.createElement(elemType);\n  document.body.appendChild(el);\n  el.value = text;\n  el.select();\n  document.execCommand(\"copy\");\n  el.remove();\n};\n\n/**\n * @param {Object} elementConfig A map of options specifying a new Element.\n * @param {String} [elementConfig.namespace = null] A namespace URI to associate with the new element.\n * See https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS for details.\n * @param {String} [elementConfig.tagName = \"div\"] The tag name determining the result\n * Element's type. Defaults to \"div\".\n * @param {String[]} [elementConfig.classList = []] A list of classes. Falsy values\n * are ignored. Defaults to [].\n * @param {{}} [elementConfig.style = {}] A map of style settings to merge into the result\n * Element's style. Defaults to {}.\n * @param {{}} [elementConfig.attributes = {}] A map of attributes to set on the result\n * Element. Defaults to {}.\n * @param {{}} [elementConfig.data = {}] A map of data to merge into the result Element's\n * dataset. Defaults to {}.\n * @param {({}|Element)[]} [elementConfig.children = []] An array of Elements or\n * elementConfigs to append as children. Falsy values are ignored. Defaults to [].\n * @param {{}} [elementConfig.eventHandlers = {}] A map from event names to handlers,\n * which will all be assigned to listen on the result Element. Defaults to {}.\n * @returns {HTMLElement} An Element object with properties corresponding to the parameters.\n */\nvar createElement = function createElement(elementConfig) {\n  if (Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"type\"])(elementConfig) === \"string\" || Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"type\"])(elementConfig) === \"number\") {\n    return document.createTextNode(elementConfig);\n  }\n\n  var _elementConfig$namesp = elementConfig.namespace,\n      namespace = _elementConfig$namesp === undefined ? null : _elementConfig$namesp,\n      _elementConfig$tagNam = elementConfig.tagName,\n      tagName = _elementConfig$tagNam === undefined ? \"div\" : _elementConfig$tagNam,\n      _elementConfig$classL = elementConfig.classList,\n      classList = _elementConfig$classL === undefined ? [] : _elementConfig$classL,\n      _elementConfig$style = elementConfig.style,\n      style = _elementConfig$style === undefined ? {} : _elementConfig$style,\n      _elementConfig$attrib = elementConfig.attributes,\n      attributes = _elementConfig$attrib === undefined ? {} : _elementConfig$attrib,\n      _elementConfig$data = elementConfig.data,\n      data = _elementConfig$data === undefined ? {} : _elementConfig$data,\n      _elementConfig$childr = elementConfig.children,\n      children = _elementConfig$childr === undefined ? [] : _elementConfig$childr,\n      _elementConfig$eventH = elementConfig.eventHandlers,\n      eventHandlers = _elementConfig$eventH === undefined ? {} : _elementConfig$eventH,\n      unintendedProps = _objectWithoutProperties(elementConfig, [\"namespace\", \"tagName\", \"classList\", \"style\", \"attributes\", \"data\", \"children\", \"eventHandlers\"]);\n\n  var unintendedKeys = Object.keys(unintendedProps);\n  if (unintendedKeys.length > 0) {\n    throw new Error(\"`createElement` must not receive unintended keys: \" + JSON.stringify(unintendedKeys));\n  }\n\n  var element = namespace == null ? document.createElement(tagName) : document.createElementNS(namespace, tagName);\n  var filteredClassList = (classList || []).filter(function (className) {\n    return className;\n  });\n  if (filteredClassList.length > 0) {\n    var _element$classList;\n\n    (_element$classList = element.classList).add.apply(_element$classList, _toConsumableArray(filteredClassList));\n  }\n  Object.assign(element.style, style);\n\n  Object.entries(attributes).forEach(function (_ref3) {\n    var _ref4 = _slicedToArray(_ref3, 2),\n        name = _ref4[0],\n        value = _ref4[1];\n\n    element.setAttribute(name, value);\n  });\n  Object.assign(element.dataset, data);\n\n  if (children.length > 0) {\n    appendChildren(element, children);\n  }\n\n  on(element, eventHandlers);\n\n  return element;\n};\n\n\nvar empty = function empty(node) {\n  while (node.firstChild) {\n    node.removeChild(node.firstChild);\n  }\n\n  return node;\n};\n\nvar fetchHTML = function fetchHTML(url) {\n  return fetch(url).then(function (response) {\n    return response.text();\n  }).then(strToElement);\n};\n\nvar firstAncestor = function firstAncestor(node, selector) {\n  var halt = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"body\";\n\n  while (node != null && !node.matches(selector)) {\n    if (node.matches(halt)) return null;\n\n    node = node.parentNode;\n  }\n\n  return node;\n};\n\n/**\n * Returns a DocumentFragment containing the given HTML string, or null if\n * the string is empty or falsey.\n */\nvar fragmentFromString = function fragmentFromString(strHTML) {\n  if (!strHTML) {\n    return null;\n  }\n\n  var templateEl = document.createElement(\"template\");\n  templateEl.innerHTML = strHTML;\n  return templateEl.content;\n};\n\n// Forces a reflow of the element so that cached styles are recomputed. This is\n// important for ensuring that animations are used when changing styles or CSS\n// classes via JS. See http://stackoverflow.com/q/11131875.\nvar forceReflow = function forceReflow(el) {\n  el.offsetHeight;\n};\n\nvar generateSnippetMap = function generateSnippetMap(html) {\n  var wrapper = document.createElement(\"div\");\n  wrapper.innerHTML = html;\n  var snippets = [].concat(_toConsumableArray(wrapper.querySelectorAll(\"[data-snippet]\"))).reduce(function (coll, node) {\n    var name = node.dataset.snippet;\n    coll[name] = node;\n    node.removeAttribute(\"data-snippet\");\n    node.remove();\n\n    return coll;\n  }, {});\n\n  return function (name) {\n    if (snippets[name] == null) return;\n\n    return snippets[name].cloneNode(true);\n  };\n};\n\nvar getCSSProperty = function getCSSProperty(node, property) {\n  return window.getComputedStyle(node).getPropertyValue(property);\n};\n\nvar getElementsByClass = function getElementsByClass(parent, classNames) {\n  return classNames.reduce(function (elements, name) {\n    elements[Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"camelCase\"])(name)] = parent.querySelector(\".\" + name);\n\n    return elements;\n  }, {});\n};\n\n// A version of `getBoundingClientRect` relative to a reference node instead\n// of the window.\nvar getRelativeBoundingClientRect = function getRelativeBoundingClientRect(node) {\n  var reference = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n  if (reference == null) {\n    reference = node.parentNode;\n  }\n\n  var rect = node.getBoundingClientRect();\n  var refRect = reference.getBoundingClientRect();\n  return {\n    top: rect.top - refRect.top,\n    bottom: rect.bottom - refRect.bottom,\n    left: rect.left - refRect.left,\n    right: rect.right - refRect.right,\n    width: rect.width,\n    height: rect.height\n  };\n};\n\n// Determines a bounding rectangle that encompasses all given nodes.\nvar getAggregateBoundingClientRect = function getAggregateBoundingClientRect(nodes) {\n  return [].concat(_toConsumableArray(nodes)).reduce(function (agg, node) {\n    var rect = node.getBoundingClientRect();\n    agg.top = Math.min(agg.top, rect.top);\n    agg.bottom = Math.max(agg.bottom, rect.bottom);\n    agg.left = Math.min(agg.left, rect.left);\n    agg.right = Math.max(agg.right, rect.right);\n    agg.width = Math.max(agg.width, rect.left - agg.left + rect.width);\n    agg.height = Math.max(agg.height, rect.top - agg.top + rect.height);\n    return agg;\n  }, {\n    top: Infinity,\n    bottom: 0,\n    left: Infinity,\n    right: 0,\n    width: 0,\n    height: 0\n  });\n};\n\n// Given an element, this will return an integer that is the maximum font size (in px) that allows all the\n// text to fit without overflow.\nvar getFontSizeToFit = function getFontSizeToFit(el) {\n  var maxFontSizePx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 24;\n\n  var startingFontSize = el.style.fontSize;\n  var startingOverflow = el.style.overflow;\n  el.style.overflow = \"hidden\";\n  var high = maxFontSizePx + 1;\n  var low = 0;\n  el.style.fontSize = high + \"px\";\n  while (low + 1 < high) {\n    var mid = low + (high - low >> 1);\n    el.style.fontSize = mid + \"px\";\n    if (el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth) {\n      high = mid;\n    } else {\n      low = mid;\n    }\n  }\n\n  el.style.fontSize = startingFontSize;\n  el.style.overflow = startingOverflow;\n  return low;\n};\n\n/**\n * Attempt to calculate the `font-size` needed to have the text of `el` fit within the given number of lines.\n *\n * This is far from a perfect solution as there are several factors that determine line count not to mention\n * occasional ambiguity of what constitutes a \"line\" when there's `innerHTML` to contend with.\n *\n * @param {HTMLElement} el - Element with text to fit `maxLines`.\n * @param {number} maxLines - Max line count to calculate for.\n * @param {number} [precision] - The amount in px to incrementally adjust `font-size` by to determine changes.\n * @return {number} - In px.\n */\nvar getFontSizeToFitLines = function getFontSizeToFitLines(el, maxLines) {\n  var precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.5;\n\n  /**\n   * NOTE(oscar): The computed style of certain \"older\" properties should always be in px regardless of\n   * applied style.\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle\n   */\n  var fontSize = parseFloat(getCSSProperty(el, \"font-size\"));\n\n  var prevFontSizeStyle = el.style.fontSize;\n  var prevHeight = el.style.height;\n  var prevLineHeight = el.style.lineHeight;\n  el.style.height = \"unset\";\n\n  // NOTE(oscar): Ensures line-height is sensitive to changes in font-size.\n  el.style.lineHeight = \"10em\";\n\n  var computedFontSize = Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"binaryFind\"])(Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"range\"])(precision, fontSize, precision), function (value) {\n    el.style.fontSize = value + precision + \"px\";\n    var lineHeight = parseFloat(getCSSProperty(el, \"line-height\"));\n    var paddingTop = parseFloat(getCSSProperty(el, \"padding-top\"));\n    var paddingBottom = parseFloat(getCSSProperty(el, \"padding-bottom\"));\n    var textHeight = el.getBoundingClientRect().height - paddingTop - paddingBottom;\n    return textHeight > lineHeight * maxLines;\n  }) || fontSize;\n\n  el.style.height = prevHeight;\n  el.style.fontSize = prevFontSizeStyle;\n  el.style.lineHeight = prevLineHeight;\n  return computedFontSize;\n};\n\nvar indexOf = function indexOf(node) {\n  return [].indexOf.call(node.parentNode.children, node);\n};\n\n// Returns a Promise that resolves when the passed Image is rendered (determined by polling for a non-zero\n// clientWidth and clientHeight).\nvar imageIsRendered = function imageIsRendered(img) {\n  var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10000;\n\n  var start = Date.now();\n  return new Promise(function (resolve, reject) {\n    var checkRendered = function checkRendered() {\n      if (Date.now() - start >= timeout) {\n        reject(new Error(\"Timeout loading image \\\"\" + img.src + \"\\\"\"));\n      } else if (img.clientWidth === 0 || img.clientHeight === 0) {\n        requestAnimationFrame(checkRendered);\n      } else {\n        resolve();\n      }\n    };\n\n    requestAnimationFrame(checkRendered);\n  });\n};\n\nvar off = function off(node, events) {\n  Object.keys(events).forEach(function (names) {\n    var listener = events[names];\n\n    names.trim().split(/\\s+/).forEach(function (name) {\n      node.removeEventListener(name, listener);\n    });\n  });\n};\n\nvar on = function on(node, events) {\n  Object.keys(events).forEach(function (names) {\n    var listener = events[names];\n\n    names.trim().split(/\\s+/).forEach(function (name) {\n      node.addEventListener(name, listener);\n    });\n  });\n};\n\nvar onAnimationsComplete = function onAnimationsComplete(els, callback) {\n  var animationsLeft = els.length;\n  els.forEach(function (el) {\n    addOneTimeListener(el, \"webkitAnimationEnd\", function () {\n      animationsLeft -= 1;\n      if (animationsLeft === 0) {\n        callback();\n      }\n    });\n  });\n};\n\n// Returns a map of { units, value } for a CSS length property.\n// The length must be a string with \"px\" or \"%\" units or a value of 0.\nvar parseCSSLength = function parseCSSLength(length) {\n  if (length === 0 || length === \"0\") return { value: 0, units: \"px\" };\n\n  var match = /(.+)(px|%)/.exec(length);\n  if (!match) return null;\n\n  var _match = _slicedToArray(match, 3),\n      _ = _match[0],\n      value = _match[1],\n      units = _match[2];\n\n  if (value == null || units == null) return null;\n\n  return { units: units, value: Number(value) };\n};\n\nvar prependChild = function prependChild(parentNode, node) {\n  parentNode.insertBefore(node, parentNode.children[0]);\n\n  return parentNode;\n};\n\nvar replaceStyle = function replaceStyle(element) {\n  for (var _len2 = arguments.length, newStyles = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n    newStyles[_key2 - 1] = arguments[_key2];\n  }\n\n  element.removeAttribute(\"style\");\n  Object.assign.apply(Object, [element.style].concat(newStyles));\n};\n\nvar scrollIntoView = function scrollIntoView(node) {\n  var rect = node.getBoundingClientRect();\n  var pRect = node.parentNode.getBoundingClientRect();\n  var topDiff = rect.top - pRect.top;\n  var botDiff = rect.bottom - pRect.bottom;\n\n  if (topDiff < 0 && botDiff > 0) {\n    node.parentNode.scrollTop += (topDiff + botDiff) / 2;\n  } else if (topDiff < 0) {\n    node.parentNode.scrollTop += topDiff;\n  } else if (botDiff > 0) {\n    node.parentNode.scrollTop += botDiff;\n  }\n};\n\nvar strToElement = function strToElement(str) {\n  var div = document.createElement(\"div\");\n  div.innerHTML = str.replace(/\\n\\s*/g, \"\");\n\n  return div.firstChild;\n};\n\nvar strToStyle = function strToStyle(str) {\n  var style = document.createElement(\"style\");\n  style.innerHTML = str;\n\n  return style;\n};\n\n/** Writes `contentHTML` into `iframeEl`. */\nvar writeToIframe = function writeToIframe(iframeEl, contentHTML) {\n  iframeEl.contentWindow.document.open();\n  iframeEl.contentWindow.document.write(contentHTML);\n  iframeEl.contentWindow.document.close();\n};\n\nvar preparetagHTML = function preparetagHTML(tagHTML) {\n  var wrapperEl = document.createElement(\"div\");\n  wrapperEl.innerHTML = tagHTML;\n\n  // Script tags must be reattached in order to run.\n  [].concat(_toConsumableArray(wrapperEl.querySelectorAll(\"script\"))).forEach(function (originalScriptTag) {\n    var replacementScriptTag = document.createElement(\"script\");\n    [].concat(_toConsumableArray(originalScriptTag.attributes)).forEach(function (_ref5) {\n      var name = _ref5.nodeName,\n          value = _ref5.nodeValue;\n\n      replacementScriptTag.setAttribute(name, value);\n    });\n    replacementScriptTag.innerHTML = originalScriptTag.innerHTML;\n    originalScriptTag.parentNode.replaceChild(replacementScriptTag, originalScriptTag);\n  });\n\n  return wrapperEl;\n};\n\nvar appendImpressionTags = function appendImpressionTags(containerEl, impressionTags) {\n  impressionTags.forEach(function (tagHTML) {\n    var wrapper = preparetagHTML(tagHTML);\n    containerEl.append(wrapper);\n  });\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"E\", function() { return PLATFORM_ANDROID; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"F\", function() { return PLATFORM_IOS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AUDIO_POLICY_ALWAYS_MUTE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return AUDIO_POLICY_ON_INTERACTION; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return AUDIO_POLICY_NO_RESTRICTIONS; });\n/* unused harmony export EXCHANGE_APPLOVIN */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"x\", function() { return EXCHANGE_DOUBLECLICK; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"y\", function() { return EXCHANGE_INNERACTIVE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"z\", function() { return EXCHANGE_IRONSOURCE; });\n/* unused harmony export EXCHANGE_MOPUB */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"A\", function() { return EXCHANGE_MINTEGRAL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"B\", function() { return EXCHANGE_VUNGLE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"D\", function() { return ORIENTATION_PORTRAIT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"C\", function() { return ORIENTATION_LANDSCAPE; });\n/* unused harmony export CONNECTION_TYPE_WIFI */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return CLICK_AREA_TYPE_OTHER; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return CLICK_AREA_TYPE_CTA; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return CLICK_METRIC_TYPE_CLOSE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return CLICK_METRIC_TYPE_CTA; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"p\", function() { return CLICK_METRIC_TYPE_DEADZONE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"q\", function() { return CLICK_METRIC_TYPE_UNKNOWN; });\n/* unused harmony export CLICK_REJECTION_REASON_UNKNOWN */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"v\", function() { return CLICK_REJECTION_REASON_NO_INTERACTIONS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT; });\n/* unused harmony export CLICKTHROUGH_URL_TYPE_APP_STORE */\n/* unused harmony export CLICK_TRACKING_URL_TYPE_UNKNOWN */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"w\", function() { return CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"I\", function() { return TRACKING_METHOD_OPEN_METHOD; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"H\", function() { return TRACKING_METHOD_IMAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"G\", function() { return TRACKING_METHOD_BEACON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return AUTOCLICK_TYPE_LAST_INTERACTION; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return AUTOCLICK_TYPE_INTERACTION_COUNT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return AUTOCLICK_TYPE_COMPLETED_DELAY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return AUTOCLICK_TYPE_LOAD_DELAY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return AUTOCLICK_TYPE_VIEWABLE_DELAY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"u\", function() { return CLICK_OPEN_METHOD_WINDOW_OPEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"t\", function() { return CLICK_OPEN_METHOD_MRAID; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"r\", function() { return CLICK_OPEN_METHOD_ANCHOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"s\", function() { return CLICK_OPEN_METHOD_LOCATION; });\nvar PLATFORM_ANDROID = \"android\";\nvar PLATFORM_IOS = \"ios\";\n\nvar AUDIO_POLICY_ALWAYS_MUTE = \"always-mute\";\nvar AUDIO_POLICY_ON_INTERACTION = \"on-interaction\";\nvar AUDIO_POLICY_NO_RESTRICTIONS = \"no-restrictions\";\n\n// TODO(Casey): Use constants instead of string literals for all exchanges\n// throughout.\nvar EXCHANGE_APPLOVIN = \"applovin\";\nvar EXCHANGE_DOUBLECLICK = \"doubleclick\";\nvar EXCHANGE_INNERACTIVE = \"inneractive-direct\";\nvar EXCHANGE_IRONSOURCE = \"ironsource\";\nvar EXCHANGE_MOPUB = \"mopub\";\nvar EXCHANGE_MINTEGRAL = \"mintegral\";\nvar EXCHANGE_VUNGLE = \"vungle\";\n\nvar ORIENTATION_PORTRAIT = \"portrait\";\nvar ORIENTATION_LANDSCAPE = \"landscape\";\n\n// These must correspond to the rtb.proto ConnectionType enum definition.\nvar CONNECTION_TYPE_WIFI = 2;\n\n// These must correspond to the rtb.proto ClickAreaType enum definition.\nvar CLICK_AREA_TYPE_OTHER = 1;\nvar CLICK_AREA_TYPE_CTA = 3;\n\nvar CLICK_METRIC_TYPE_CLOSE = \"CLOSE\";\nvar CLICK_METRIC_TYPE_CTA = \"CTA\";\nvar CLICK_METRIC_TYPE_DEADZONE = \"DEADZONE\";\nvar CLICK_METRIC_TYPE_UNKNOWN = \"UNKNOWN_CLICK_TYPE\";\n\n// This must correspond to the rtb.proto ClickRejectionReason enum definition.\nvar CLICK_REJECTION_REASON_UNKNOWN = 0;\nvar CLICK_REJECTION_REASON_NO_INTERACTIONS = 1;\n\n// This must correspond to the auction.proto ClickthroughURLType.\nvar CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT = 1;\nvar CLICKTHROUGH_URL_TYPE_APP_STORE = 2;\n\n// This must correspond to the auction.proto ClickTrackingURLType.\nvar CLICK_TRACKING_URL_TYPE_UNKNOWN = 0;\nvar CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT = 1;\n\n// This must correspond to the rtb.proto TrackingMethod enum definition.\nvar TRACKING_METHOD_OPEN_METHOD = 1;\nvar TRACKING_METHOD_IMAGE = 2;\nvar TRACKING_METHOD_BEACON = 3;\n\nvar AUTOCLICK_TYPE_LAST_INTERACTION = \"lastInteraction\";\nvar AUTOCLICK_TYPE_INTERACTION_COUNT = \"interactionCount\";\nvar AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT = \"lastInteractionAndInteractionCount\";\nvar AUTOCLICK_TYPE_COMPLETED_DELAY = \"completedDelay\";\nvar AUTOCLICK_TYPE_LOAD_DELAY = \"loadDelay\";\nvar AUTOCLICK_TYPE_VIEWABLE_DELAY = \"viewableDelay\";\nvar AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET = \"viewableDelayWithReset\";\n\nvar CLICK_OPEN_METHOD_WINDOW_OPEN = \"window_open\";\nvar CLICK_OPEN_METHOD_MRAID = \"mraid\";\nvar CLICK_OPEN_METHOD_ANCHOR = \"anchor\";\nvar CLICK_OPEN_METHOD_LOCATION = \"location\";\n\n/***/ }),\n/* 3 */,\n/* 4 */,\n/* 5 */,\n/* 6 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__adexp__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__error_handling__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__frontendlib_utils__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\n\n/**\n * Sends log to Adexp.\n */\nvar postJSON = function postJSON(url, data) {\n  /**\n   * TODO(oscar): Investigate if we could improve empty payloads.\n   * @see https://github.com/liftoffio/liftoff/pull/25293\n   */\n  if (data == null) {\n    console.error(\"No data to post for logging.\");\n    return Promise.resolve();\n  }\n  var payload = JSON.stringify(data);\n\n  if (payload.length < 2) {\n    console.error(\"Data could not be stringified for logging.\");\n    return Promise.resolve();\n  }\n\n  return Object(__WEBPACK_IMPORTED_MODULE_2__frontendlib_utils__[\"request\"])(\"POST\", url, {\n    // Don't set the content type to \"application/json\" because that requires\n    // a preflight OPTIONS request (because this is a cross-domain request).\n    \"Content-Type\": \"text/plain\"\n  }, payload).catch(function () {\n    console.error(\"Failed to post JSON for logging.\");\n  });\n};\n\nvar postMetricV2 = function postMetricV2(_ref, name, value) {\n  var adexpContextSnapshotFn = _ref.adexpContextSnapshotFn,\n      endpoint = _ref.endpoint,\n      eventTrackingParam = _ref.eventTrackingParam;\n\n  var adexpContext = adexpContextSnapshotFn();\n  var payload = new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"c\" /* AdexpMessage */]({\n    context: adexpContext,\n    metric: new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"d\" /* AdexpMetricV2 */](name, value)\n  });\n\n  return postJSON(endpoint + \"/adexp_metrics/\" + eventTrackingParam, payload);\n};\n\nvar Logger = function () {\n  function Logger() {\n    _classCallCheck(this, Logger);\n  }\n\n  _createClass(Logger, null, [{\n    key: \"init\",\n\n    // #if process.env.NODE_ENV === \"test\"\n    //   static resetForTests() {\n    //     delete this.enabled;\n    //     delete this.loggedErrors;\n    //     delete this.endpoint;\n    //     delete this.eventTrackingParam;\n    //     delete this.adexpContextSnapshotFn;\n    //   }\n    // #endif\n\n    value: function init() {\n      this.enabled = false;\n      this.loggedErrors = [];\n    }\n  }, {\n    key: \"enable\",\n    value: function enable() {\n      this.enabled = true;\n    }\n\n    /**\n     * Pass the logger required context\n     * @param {string} endpoint - The endpoint to which the creative will post\n     * AdExp logs or metrics.\n     * @param {string} eventTrackingParam - The tracking parameter string which\n     * includes encoded bid context information.\n     * @param {function} adexpContextSnapshotFn - A function to call that will\n     * take a snapshot of the current environment and return an `AdexpContext`\n     * object.\n     */\n\n  }, {\n    key: \"passContext\",\n    value: function passContext(endpoint, eventTrackingParam, adexpContextSnapshotFn) {\n      this.endpoint = endpoint;\n      this.eventTrackingParam = eventTrackingParam;\n      this.adexpContextSnapshotFn = adexpContextSnapshotFn;\n    }\n\n    /**\n     * Listens for errors that are caught by the window and reports them to adexp.\n     * Don't call this if you use your own custom error handlers.\n     */\n\n  }, {\n    key: \"addErrorListeners\",\n    value: function addErrorListeners() {\n      var _this = this;\n\n      window.addEventListener(\"error\", function (errorEvent) {\n        var normalizedError = Object(__WEBPACK_IMPORTED_MODULE_1__error_handling__[\"c\" /* normalizeErrorEvent */])(errorEvent);\n        _this.recordError(normalizedError);\n      });\n    }\n\n    /**\n     * recordError takes an object like:\n     * { message, line, column, sourceURL ... }\n     * and logs the error to adexp.\n     */\n\n  }, {\n    key: \"recordError\",\n    value: function recordError(e) {\n      this.recordLabeledError(\"error\", e);\n    }\n  }, {\n    key: \"recordLabeledError\",\n    value: function recordLabeledError(tag, e) {\n      // #if process.env.NODE_ENV !== \"test\"\n      console.error(e);\n      // #endif\n      this._processError(tag, e);\n    }\n  }, {\n    key: \"_processError\",\n    value: function _processError(tag, errorObj) {\n      if (Object(__WEBPACK_IMPORTED_MODULE_1__error_handling__[\"e\" /* shouldIgnoreError */])(errorObj)) {\n        return;\n      }\n\n      var normalizedErr = Object(__WEBPACK_IMPORTED_MODULE_1__error_handling__[\"b\" /* normalizeError */])(errorObj);\n\n      // Only log one error per (sourceURL, line #, message) combination. This\n      // prevents noise from certain errors that are logged many times\n      // from a single impression.\n      var errorIdentifier = [normalizedErr.sourceURL, normalizedErr.line, normalizedErr.message].join(\"-\");\n\n      if (this.loggedErrors.includes(errorIdentifier)) {\n        return;\n      }\n\n      this.loggedErrors.push(errorIdentifier);\n      this.recordLog(tag, normalizedErr.message, new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"a\" /* AdexpJavaScriptError */](normalizedErr));\n    }\n  }, {\n    key: \"recordLog\",\n    value: function recordLog(tag, message, data) {\n      if (!this.enabled) {\n        return;\n      }\n\n      var adexpContext = this.adexpContextSnapshotFn();\n      var payload = new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"c\" /* AdexpMessage */]({\n        context: adexpContext,\n        log: new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"b\" /* AdexpLog */](tag, message, data)\n      });\n\n      return postJSON(this.endpoint + \"/adexp_log/\" + this.eventTrackingParam, payload);\n    }\n  }, {\n    key: \"recordMetricV2\",\n    value: function recordMetricV2(name, value) {\n      if (!this.enabled) {\n        return Promise.resolve();\n      }\n      return postMetricV2({\n        endpoint: this.endpoint,\n        eventTrackingParam: this.eventTrackingParam,\n        adexpContextSnapshotFn: this.adexpContextSnapshotFn\n      }, name, value);\n    }\n  }, {\n    key: \"recordVXOnlyAdexpMetric\",\n    value: function recordVXOnlyAdexpMetric(name, value) {\n      if (!Number.isInteger(value)) {\n        console.debug(\"Expected an integer value for VXOnlyAdexpMetric: \" + name);\n        return;\n      }\n\n      return this.alwaysRecordMetricV2(\"custom_event\", {\n        name: name,\n        value: value\n      });\n    }\n  }, {\n    key: \"alwaysRecordMetricV2\",\n    value: function alwaysRecordMetricV2(name, value) {\n      return postMetricV2({\n        endpoint: this.endpoint,\n        eventTrackingParam: this.eventTrackingParam,\n        adexpContextSnapshotFn: this.adexpContextSnapshotFn\n      }, name, value);\n    }\n  }]);\n\n  return Logger;\n}();\n\n// TODO(oscar): Create a global Logger.\n\n\nLogger.init();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Logger);\n\n/***/ }),\n/* 7 */,\n/* 8 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar AutoclickBehaviorAbstract = function () {\n  function AutoclickBehaviorAbstract(_ref) {\n    var autoclick = _ref.autoclick,\n        behavior = _ref.behavior,\n        delayClickthroughHandler = _ref.delayClickthroughHandler;\n\n    _classCallCheck(this, AutoclickBehaviorAbstract);\n\n    this._autoclick = autoclick;\n    this._behavior = behavior;\n    this.internalCount = 0;\n    this.delayClickthroughHandler = delayClickthroughHandler;\n    this.init();\n  }\n\n  /** Runs when the class is instantiated. */\n\n\n  _createClass(AutoclickBehaviorAbstract, [{\n    key: \"init\",\n    value: function init() {}\n\n    /**\n     * Only relevant for types that count something like interactions.\n     * @returns {number} - Minimum amount until enabling delayed clickthrough.\n     */\n\n  }, {\n    key: \"getBehaviorCount\",\n    value: function getBehaviorCount() {\n      return this._behavior == null ? null : this._behavior.count;\n    }\n  }, {\n    key: \"getBehaviorType\",\n    value: function getBehaviorType() {\n      return this._behavior == null ? null : this._behavior.type;\n    }\n\n    /**\n     * How long to delay clickthrough by.\n     * @returns {number} - Delay value in milliseconds.\n     */\n\n  }, {\n    key: \"getBehaviorDelay\",\n    value: function getBehaviorDelay() {\n      return this._behavior == null ? null : this._behavior.delay;\n    }\n  }, {\n    key: \"isCountReached\",\n    value: function isCountReached() {\n      return this.getCurrentCount() >= this.getBehaviorCount();\n    }\n  }, {\n    key: \"getCurrentCount\",\n    value: function getCurrentCount() {\n      return this.internalCount;\n    }\n  }, {\n    key: \"setCurrentCount\",\n    value: function setCurrentCount(n) {\n      if (typeof n !== \"number\") {\n        throw new Error(\"n must be a number, got: \" + n);\n      }\n      this.internalCount = n;\n    }\n\n    /** Triggers a delayed clickthrough event. */\n\n  }, {\n    key: \"delayClickthrough\",\n    value: function delayClickthrough() {\n      var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getBehaviorDelay();\n\n      if (!this.isCountReached()) return;\n\n      this.delayClickthroughHandler(delay);\n    }\n\n    /**\n     * Triggered by the InteractionMonitor class.\n     */\n\n  }, {\n    key: \"onInteraction\",\n    value: function onInteraction(_) {}\n\n    /**\n     * Should trigger when the creative is \"finished\". Typically this is the moment\n     * an endscreen will appear.\n     */\n\n  }, {\n    key: \"onCompleted\",\n    value: function onCompleted() {}\n\n    /**\n     * Triggers when an \"engagement\" event occurs. Engagement must be fired by the\n     * creative or a subcomponent thereof.\n     */\n\n  }, {\n    key: \"onEngagement\",\n    value: function onEngagement() {}\n  }, {\n    key: \"onHtmlLoaded\",\n    value: function onHtmlLoaded() {}\n  }, {\n    key: \"onViewable\",\n    value: function onViewable() {}\n  }, {\n    key: \"onViewableChange\",\n    value: function onViewableChange(_) {}\n  }]);\n\n  return AutoclickBehaviorAbstract;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorAbstract);\n\n/***/ }),\n/* 9 */,\n/* 10 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export isTestError */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Warning; });\n/* unused harmony export tryParseStackInfo */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return normalizeError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return normalizeErrorEvent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return normalizePromiseRejectionEvent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return shouldIgnoreError; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__ = __webpack_require__(0);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n// if process.env.NODE_ENV === \"test\"\nvar isTestError = function isTestError(error) {\n  // NOTE(Austin): Annoyingly, assertion errors will loop back here in\n  // tests, so we have to ignore these.\n  return error != null && error.constructor.name === \"AssertionError\";\n};\n// #endif\n\nvar Warning = function (_Error) {\n  _inherits(Warning, _Error);\n\n  function Warning() {\n    var _ref;\n\n    _classCallCheck(this, Warning);\n\n    for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {\n      params[_key] = arguments[_key];\n    }\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    var _this = _possibleConstructorReturn(this, (_ref = Warning.__proto__ || Object.getPrototypeOf(Warning)).call.apply(_ref, [this].concat(params)));\n\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(_this, Warning);\n    }\n    _this.severity = \"warning\";\n    return _this;\n  }\n\n  return Warning;\n}(Error);\n\nvar tryConvertStringToNumber = function tryConvertStringToNumber(str) {\n  if (str == null) {\n    return 0;\n  }\n\n  var parsed = parseInt(str);\n  if (Number.isNaN(parsed)) {\n    return 0;\n  }\n\n  return parsed;\n};\n\nvar tryParseStackInfo = function tryParseStackInfo(stack) {\n  if (stack == null) {\n    return null;\n  }\n\n  var match = String(stack).match(\n  // NOTE(Austin): We include about:srcdoc for inner_env errors.\n  /(\\b(?:[^ ]*\\.js.*?)|(?:about:srcdoc)):(\\d+)?:?(\\d+)?/);\n\n  if (match == null) {\n    return null;\n  }\n\n  // Line and column need to be integers. We have them in our adexp\n  // protobuf this way, so if they aren't we'll get a malformed message.\n  return {\n    sourceURL: match[1],\n    line: tryConvertStringToNumber(match[2]),\n    column: tryConvertStringToNumber(match[3])\n  };\n};\n\n/**\n * Converts an Error or string into a map like\n * { message, stack, sourceURL, line, column }\n */\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Error\nvar normalizeError = function normalizeError(obj) {\n  if (obj == null) {\n    return null;\n  }\n\n  if (typeof obj === \"string\") {\n    return {\n      message: obj\n    };\n  }\n\n  var errorProps = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"selectKeys\"])(obj, Object.getOwnPropertyNames(obj));\n\n  return Object.assign({}, tryParseStackInfo(errorProps.stack), errorProps);\n};\n\n/**\n * Converts an ErrorEvent object to a map like:\n * { message, line, column, sourceURL }\n * plus any additional information the error object contains.\n */\nvar normalizeErrorEvent = function normalizeErrorEvent(_ref2) {\n  var message = _ref2.message,\n      filename = _ref2.filename,\n      lineno = _ref2.lineno,\n      colno = _ref2.colno,\n      error = _ref2.error;\n\n  try {\n    // Possible keys in an ErrorEvent:\n    // [stack, name, fileName, lineNumber, columnNumber]\n    var errorProps = error != null ? Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"selectKeys\"])(error, Object.getOwnPropertyNames(error)) : {};\n\n    var errorObj = Object.assign({\n      message: message,\n      severity: error && error.severity ? error.severity : \"error\",\n      line: lineno,\n      column: colno,\n      sourceURL: filename\n    }, errorProps);\n\n    if (error == null) {\n      return errorObj;\n    }\n\n    var parsedInfo = tryParseStackInfo(error.stack);\n    return Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"mergePropertiesWithDefaults\"])(errorObj, parsedInfo);\n  } catch (e) {\n    console.error(\"Error in normalizeErrorEvent: \" + e.stack);\n    return null;\n  }\n};\n\n/**\n * Converts an PromiseRejectionEvent object to a map like\n * { message, line, column, sourceURL }\n * plus any additional information the error object contains.\n */\nvar normalizePromiseRejectionEvent = function normalizePromiseRejectionEvent(_ref3) {\n  var reason = _ref3.reason;\n\n  try {\n    var reasonIsError = reason instanceof Error;\n    var reasonIsString = typeof reason === \"string\";\n\n    var errorMessage = reasonIsString ? reason : reason.message;\n\n    // Possible keys in object (* are non-standard):\n    // [message, stack*, name, fileName*, lineNumber*, columnNumber*]\n    var errorProps = reasonIsError ? Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"selectKeys\"])(reason, Object.getOwnPropertyNames(reason)) : {};\n\n    var errorObj = Object.assign({\n      message: errorMessage\n    }, errorProps);\n\n    return Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"mergePropertiesWithDefaults\"])(errorObj, tryParseStackInfo(reason.stack));\n  } catch (e) {\n    console.error(\"Error in normalizePromiseRejectionEvent: \" + e.stack);\n    return null;\n  }\n};\n\n/**\n * Normalizes the error and returns true if the error should be ingored;\n * otherwise, returns false.\n */\nvar shouldIgnoreError = function shouldIgnoreError(errorObj) {\n  // Report only errors with non-malformed sourceURL.\n  if (errorObj == null || errorObj.sourceURL === \"undefined\") {\n    return true;\n  }\n\n  // mraid.js from adverty.com is a buggy implemenation. SMAATO and PUBMATIC are\n  // the exchanges using such version and we see strange errors from the most.\n  // While we are working with them to get a good MRAID implementation we filter\n  // the noisy error messages by checking where the mraid.js is from.\n  var stackFilter = new RegExp(\"adverty\\\\.com/.*mraid\\\\.js\");\n\n  // We see these errors quite often, and they are not related to our code.\n  var regexFilters = [\"Cannot read properties of undefined \\\\(reading 'fireEvent'\\\\)\", \"Cannot read property 'fireEvent' of undefined\", \"showInterstitial\", \"al_onPoststitialDismiss\", \"AFMA_ReceiveMessage\", \"webviewDidAppear\", \"AFMA_updateActiveView is not a function\", \"al_onAdViewRendered\", \"mraidbridge\", \"MoatMAK\", \"$adgIOS\", \"googqscp\", \"inmobi\", \"Script error\", \"avidbridge\"];\n  var messageFilter = new RegExp(regexFilters.join(\"|\"));\n  var errorStr = errorObj.message || errorObj.toString();\n  if (messageFilter.test(errorStr) || stackFilter.test(errorObj.stack)) {\n    return true;\n  }\n\n  var normalized = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"selectKeys\"])(errorObj, [\"message\", \"line\", \"column\", \"stack\", \"sourceURL\"]);\n\n  var nKeys = Object.keys(normalized).length;\n  var onlyMessage = \"message\" in errorObj && nKeys === 1 && errorObj.message === \"undefined is not a function\";\n\n  var onlyMessageStack = \"stack\" in errorObj && \"message\" in errorObj && nKeys === 2 && errorObj.stack === \"\" && errorObj.message === \"undefined is not a function\";\n\n  var noSourceURL = errorObj.sourceURL == null && nKeys === 5;\n  return onlyMessage || onlyMessageStack || noSourceURL;\n};\n\n/***/ }),\n/* 11 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar EventListener = function () {\n  _createClass(EventListener, null, [{\n    key: \"pubsubify\",\n    value: function pubsubify(object) {\n      var methods = Object.getOwnPropertyNames(EventListener.prototype).filter(function (name) {\n        return name !== \"constructor\";\n      });\n      Object.assign(object, new EventListener());\n      Object.assign(object, Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"selectKeys\"])(EventListener.prototype, methods));\n    }\n  }]);\n\n  function EventListener() {\n    _classCallCheck(this, EventListener);\n\n    this.events = {};\n  }\n\n  _createClass(EventListener, [{\n    key: \"on\",\n    value: function on(map, callback) {\n      var _this = this;\n\n      if (Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"type\"])(map) !== \"object\") {\n        map = _defineProperty({}, map, callback);\n      }\n\n      Object.keys(map).forEach(function (name) {\n        if (_this.events[name] == null) {\n          _this.events[name] = [];\n        }\n\n        _this.events[name].push(map[name]);\n      });\n    }\n  }, {\n    key: \"once\",\n    value: function once(name, callback) {\n      var _this2 = this;\n\n      var single = function single() {\n        for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n          args[_key] = arguments[_key];\n        }\n\n        _this2.off(name, single);\n        callback.apply(null, args);\n      };\n\n      this.on(name, single);\n    }\n  }, {\n    key: \"off\",\n    value: function off(map, callback) {\n      var _this3 = this;\n\n      if (Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"type\"])(map) !== \"object\") {\n        map = _defineProperty({}, map, callback);\n      }\n\n      Object.keys(map).forEach(function (name) {\n        if (_this3.events[name] == null) return;\n\n        var callback = map[name];\n        if (callback == null) return delete _this3.events[name];\n\n        _this3.events[name] = _this3.events[name].filter(function (cb) {\n          return cb !== callback;\n        });\n        if (_this3.events[name].length === 0) {\n          delete _this3.events[name];\n        }\n      });\n    }\n  }, {\n    key: \"emit\",\n    value: function emit(name) {\n      for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n        args[_key2 - 1] = arguments[_key2];\n      }\n\n      if (this.events[name] == null) return;\n\n      return Promise.all(this.events[name].map(function (cb) {\n        return cb.apply(null, args);\n      }));\n    }\n  }, {\n    key: \"relay\",\n    value: function relay(listener, onEvent) {\n      var emitEvent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : onEvent;\n\n      this.on(onEvent, listener.emit.bind(listener, emitEvent));\n    }\n  }]);\n\n  return EventListener;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (EventListener);\n\n/***/ }),\n/* 12 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__ = __webpack_require__(11);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__logger__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__error_handling__ = __webpack_require__(10);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\n\n\n\n/**\n * This interval is the time between attempts to open a URL via different\n * methods (see `LiftoffMRAID.open`).\n */\nvar CLICK_RETRY_INTERVAL_MS = 1000;\n\nvar CLICK_OPEN_METHODS = {\n  WINDOW_OPEN: \"window_open\",\n  MRAID: \"mraid\",\n  ANCHOR: \"anchor\",\n  LOCATION: \"location\"\n};\n\n/**\n * This is a low-level wrapper around mraid that should be usable generally\n * (i.e. in any HTML ad environment). It's used by both madlib and third-party\n * creatives.\n */\n\nvar LiftoffMRAID = function () {\n  function LiftoffMRAID() {\n    _classCallCheck(this, LiftoffMRAID);\n  }\n\n  _createClass(LiftoffMRAID, null, [{\n    key: \"init\",\n\n    /**\n     * Among other things, this function attaches event listeners to the\n     * window.mraid object. It should be called as soon as possible after\n     * window.mraid is defined. Because of this side-effect, it should also only\n     * be called once.\n     */\n    value: function init() {\n      this.liftoffMraidInitTimestamp = Date.now();\n\n      __WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__[\"a\" /* default */].pubsubify(this);\n      this.on = this.on.bind(this);\n      this.once = this.once.bind(this);\n      this._addMraidEventListener = this._addMraidEventListener.bind(this);\n\n      this.viewableDurationMS = null;\n      this.lastViewableTS = null;\n      this.clickRetryTimeout = null;\n      this.lastOpenedURL = null;\n      this.isOrientationLocked = false;\n      this.orientationToLock = null;\n      this.viewable = null;\n      this.isViewableByEvent = null;\n\n      /** Keeps track of each version of window.mraid loaded. */\n      this.mraids = [];\n      /** This index of this.mraids that is currently loaded on window.mraid. */\n      this.mraidIndex = null;\n\n      /**\n       * This object keeps track of what the current mraid object supports at the\n       * moment support was checked.\n       */\n      this.supported = {\n        methods: {},\n        /**\n         * NOTE(oscar): Unlike MRAID methods, we log mraid events that we listen\n         * to as they occur.\n         */\n        events: {}\n      };\n\n      this._setInitialState();\n      this._addEventListeners();\n    }\n\n    /** Returns time since LiftoffMRAID has been initialized in milliseconds. */\n\n  }, {\n    key: \"sinceInit\",\n    value: function sinceInit() {\n      return Date.now() - this.liftoffMraidInitTimestamp;\n    }\n  }, {\n    key: \"getSupportedLog\",\n    value: function getSupportedLog() {\n      return Object.assign({\n        \"document.hidden\": document.hidden,\n        \"document.visibilityState\": document.visibilityState,\n        \"LiftoffMRAID.viewable\": LiftoffMRAID.viewable,\n        MRAID_ENV: window.MRAID_ENV\n      }, this.supported);\n    }\n  }, {\n    key: \"_setInitialState\",\n    value: function _setInitialState() {\n      var _this = this;\n\n      var mraid = this.getMRAID();\n      this.ready = this._mraidTry(function () {\n        return _this.hasSupport(\"getState\") && mraid.getState() === \"default\";\n      }, { tag: \"getState\", fallback: false });\n\n      this.isViewableByEvent = this.hasSupport(\"isViewable\") ? this._mraidTry(function () {\n        return mraid.isViewable();\n      }, {\n        tag: \"isViewable\",\n        // NOTE(oscar): If isViewable() still fails, we fall back to\n        // document.visibilityState.\n        fallback: document.visibilityState !== \"hidden\"\n      }) : document.visibilityState !== \"hidden\";\n      this.processViewableChange(this.isViewableByEvent && this.isViewportShown());\n      this.viewableDurationMS = 0;\n    }\n\n    /** TODO(oscar): Don't append to log if it won't be sent to Adexp. */\n\n  }, {\n    key: \"_appendEventLog\",\n    value: function _appendEventLog(eventName, mraidIndex, args) {\n      if (this.supported.events[eventName] == null) {\n        this.supported.events[eventName] = [];\n      }\n      this.supported.events[eventName].push({\n        sinceInitMs: this.sinceInit(),\n        args: args,\n        mraidIndex: mraidIndex,\n        version: this.getMRAIDVersion()\n      });\n    }\n\n    /**\n     * This function is used to wrap calls to mraid methods in a try/catch block.\n     * Any error gets logged in this.supported.errors.\n     *\n     * In general, this.hasSupport() is used to check for support. This function\n     * serves as a further safeguard against errors due to faulty mraid\n     * implementations.\n     */\n\n  }, {\n    key: \"_mraidTry\",\n    value: function _mraidTry(func, _ref) {\n      var _ref$tag = _ref.tag,\n          tag = _ref$tag === undefined ? \"other\" : _ref$tag,\n          _ref$fallback = _ref.fallback,\n          fallback = _ref$fallback === undefined ? undefined : _ref$fallback,\n          _ref$logError = _ref.logError,\n          logError = _ref$logError === undefined ? true : _ref$logError;\n\n      try {\n        return func();\n      } catch (e) {\n        if (logError) {\n          // Record the error.\n          this.supported.errors = this.supported.errors || [];\n          var version = void 0;\n          try {\n            version = this.getMRAID().getVersion();\n          } catch (ee) {\n            console.error(\"Failed to get MRAID version\", ee);\n          }\n          this.supported.errors.push({\n            tag: tag,\n            sinceInitMs: this.sinceInit(),\n            message: e != null ? e.message : null,\n            mraidIndex: this.mraidIndex,\n            version: version\n          });\n        }\n        return fallback;\n      }\n    }\n  }, {\n    key: \"_addMraidEventListener\",\n    value: function _addMraidEventListener(eventName, callback) {\n      var _this2 = this;\n\n      if (!this.hasSupport(\"addEventListener\")) return;\n\n      var mraid = this.getMRAID();\n      var mraidIndex = this.mraidIndex;\n\n      this._mraidTry(function () {\n        mraid.addEventListener(eventName, function () {\n          for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n            args[_key] = arguments[_key];\n          }\n\n          _this2._appendEventLog(eventName, mraidIndex, args);\n\n          callback.apply(undefined, args);\n        });\n      }, { tag: eventName });\n    }\n  }, {\n    key: \"_addEventListeners\",\n    value: function _addEventListeners() {\n      var _this3 = this;\n\n      // \"error\" events include 2 arguments: a message and an action. The action\n      // is the MRAID API call that caused the error.\n      this._addMraidEventListener(\"error\", function () {\n        for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n          args[_key2] = arguments[_key2];\n        }\n\n        var e = new Error(\"MRAID error: \" + args);\n        _this3.emit(\"error\", e);\n      });\n      this._addMraidEventListener(\"ready\", function () {\n        if (_this3.ready) return;\n        _this3.ready = true;\n        _this3.emit(\"ready\");\n      });\n      this._addMraidEventListener(\"viewableChange\", function (viewable) {\n        _this3.isViewableByEvent = viewable;\n        _this3.processViewableChange(_this3.isViewableByEvent && _this3.isViewportShown());\n      });\n\n      // NOTE(oscar): We're using _addMraidEventListener to log this event.\n      this._addMraidEventListener(\"exposureChange\", function () {});\n\n      /**\n       * The following is a fallback in case mraid's viewableChange is not\n       * supported.\n       */\n      document.addEventListener(\"visibilitychange\", function () {\n        for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n          args[_key3] = arguments[_key3];\n        }\n\n        _this3._appendEventLog(\"document.visibilitychange\", _this3.mraidIndex, args);\n\n        /**\n         * We delay the following by an event cycle to allow mraid's\n         * viewableChange event to occur first.\n         */\n        Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"runAsync\"])(function () {\n          if (_this3.supported.events.viewableChange == null) {\n            _this3.isViewableByEvent = document.visibilityState !== \"hidden\";\n            _this3.processViewableChange(_this3.isViewableByEvent && _this3.isViewportShown());\n          }\n        });\n      });\n    }\n  }, {\n    key: \"processViewableChange\",\n    value: function processViewableChange(isViewable) {\n      /**\n       * NOTE(oscar): On the off chance the mraid implementation gives us\n       * truthy/falsey values instead.\n       */\n      var normalizedIsViewable = !!isViewable;\n      if (normalizedIsViewable === this.viewable) return;\n      this.viewable = normalizedIsViewable;\n\n      if (this.viewable) {\n        this.lastViewableTS = Date.now();\n        if (!this.isOrientationLocked && this.orientationToLock != null) {\n          // NOTE(oscar): We won't lock the orientation until after the ad is\n          // viewable.\n          this.lockOrientation(this.orientationToLock);\n        }\n      } else {\n        this.viewableDurationMS += this.lastViewableTS == null ? 0 : Date.now() - this.lastViewableTS;\n        this.lastOpenedURL = null;\n        clearTimeout(this.clickRetryTimeout);\n      }\n\n      if (this.viewable) {\n        this.emit(\"viewable\");\n      }\n      this.emit(\"viewableChange\", this.viewable);\n    }\n  }, {\n    key: \"onReady\",\n    value: function onReady(fn) {\n      if (this.ready) {\n        Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"runAsync\"])(fn);\n        return;\n      }\n      this.once(\"ready\", fn);\n    }\n\n    /**\n     * Adds a listener to the \"viewable\" event. The \"viewable\" event fires\n     * whenever we believe the ad has become visible to the user. If the ad was\n     * already visible, then it fires the listener immediately.\n     * @param {Function} callback\n     * @param {boolean} continuous – Whether to listen to all viewable events.\n     * Defaults to false, meaning it will only trigger the callback once.\n     * @returns\n     */\n\n  }, {\n    key: \"onViewable\",\n    value: function onViewable(callback) {\n      var continuous = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (this.viewable) {\n        Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"runAsync\"])(callback);\n        if (!continuous) return;\n      }\n      var deferrer = continuous ? this.on : this.once;\n      deferrer(\"viewable\", callback);\n    }\n\n    /** Runs fn now with current viewable value and on \"viewableChange\" event. */\n\n  }, {\n    key: \"nowAndOnViewableChange\",\n    value: function nowAndOnViewableChange(fn) {\n      var _this4 = this;\n\n      Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"runAsync\"])(function () {\n        return fn(_this4.viewable);\n      });\n\n      this.on(\"viewableChange\", fn);\n    }\n\n    // TODO(oscar): Replace with nowAndOnViewableChange once v2 productionizes.\n\n  }, {\n    key: \"onViewableChange\",\n    value: function onViewableChange(fn) {\n      this.nowAndOnViewableChange(fn);\n    }\n\n    // IMPORTANT: This method MUST be called synchronously with a user action.\n\n  }, {\n    key: \"open\",\n    value: function open(url, _ref2) {\n      var _this5 = this;\n\n      var exchange = _ref2.exchange,\n          platform = _ref2.platform,\n          _ref2$abTests = _ref2.abTests,\n          abTests = _ref2$abTests === undefined ? [] : _ref2$abTests,\n          _ref2$isLiftoffURL = _ref2.isLiftoffURL,\n          isLiftoffURL = _ref2$isLiftoffURL === undefined ? false : _ref2$isLiftoffURL,\n          _ref2$isAutoclick = _ref2.isAutoclick,\n          isAutoclick = _ref2$isAutoclick === undefined ? false : _ref2$isAutoclick;\n\n      // To prevent the click waterfall from resetting if the user clicks twice in\n      // rapid succession, don't restart the waterfall unless the URL being opened\n      // is different.\n      if (this.lastOpenedURL === url) return;\n\n      this.lastOpenedURL = url;\n      clearTimeout(this.clickRetryTimeout);\n\n      var mraid = this.getMRAID();\n      // NOTE(oscar): Check to see if mraid.open is currently available.\n      var mraidOpenIsSupported = this.hasSupport(\"open\");\n      // NOTE(Casey): Ironsource requires us to only use mraid.open\n      // for opening clickthrough URLs.\n      var requireMRAID = mraidOpenIsSupported && (isAutoclick || exchange === __WEBPACK_IMPORTED_MODULE_2__constants__[\"z\" /* EXCHANGE_IRONSOURCE */]);\n\n      var clickWaterfallDisabled = exchange === __WEBPACK_IMPORTED_MODULE_2__constants__[\"A\" /* EXCHANGE_MINTEGRAL */] || exchange === __WEBPACK_IMPORTED_MODULE_2__constants__[\"B\" /* EXCHANGE_VUNGLE */] || exchange == __WEBPACK_IMPORTED_MODULE_2__constants__[\"y\" /* EXCHANGE_INNERACTIVE */];\n\n      var getFinalClickURL = function getFinalClickURL(openMethod) {\n        return isLiftoffURL ? Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"appendParamObjectToURL\"])(url, {\n          open_method: openMethod,\n          tracking_method: __WEBPACK_IMPORTED_MODULE_2__constants__[\"I\" /* TRACKING_METHOD_OPEN_METHOD */]\n        }) : url;\n      };\n\n      // To ensure that the user can click through, attempt multiple methods of\n      // navigating to the URL. In order, they are:\n      // 1. `mraid.open`, if mraid is available\n      // 2. A fake anchor element\n      // 3. `window.location`\n      var openMethods = [\n      // NOTE(vsingh): The window.open method is not used currently, but may be\n      // used in future tests that compare click methods.\n      {\n        type: __WEBPACK_IMPORTED_MODULE_2__constants__[\"u\" /* CLICK_OPEN_METHOD_WINDOW_OPEN */],\n        enabled: false,\n        fn: function fn(url) {\n          return window.open(url);\n        }\n      }, {\n        type: __WEBPACK_IMPORTED_MODULE_2__constants__[\"t\" /* CLICK_OPEN_METHOD_MRAID */],\n        enabled: mraidOpenIsSupported,\n        fn: function fn(url) {\n          if (!_this5.ready) {\n            _this5.emit(\"error\", new Error(\"Called mraid.open before mraid was ready\"));\n          }\n\n          mraid.open(url);\n        }\n      }, {\n        type: __WEBPACK_IMPORTED_MODULE_2__constants__[\"r\" /* CLICK_OPEN_METHOD_ANCHOR */],\n        enabled: !requireMRAID,\n        fn: function fn(url) {\n          var a = document.createElement(\"a\");\n          a.href = url;\n          a.target = \"_blank\";\n          a.click();\n        }\n      }, {\n        type: __WEBPACK_IMPORTED_MODULE_2__constants__[\"s\" /* CLICK_OPEN_METHOD_LOCATION */],\n        enabled: !requireMRAID,\n        fn: function fn(url) {\n          window.location = url;\n        }\n      }].filter(function (_ref3) {\n        var enabled = _ref3.enabled;\n        return enabled;\n      });\n\n      if (clickWaterfallDisabled) {\n        openMethods = openMethods.slice(0, 1);\n      }\n\n      /**\n       * Checks if we expect for the SKProductView will open. If so, then it's\n       * likely for no visibility event to occur.\n       * TODO(oscar/cwu): Replace url check with other `skproductview` indicating\n       * boolean that should be populated from h2go.\n       */\n      var isOpenSKProductView = function isOpenSKProductView(openMethod, url) {\n        var appleStoreUrlPrefix = new RegExp(\"^(https?://)?apps\\\\.apple\\\\.com\");\n        return openMethod.type === CLICK_OPEN_METHODS.MRAID && appleStoreUrlPrefix.test(url);\n      };\n\n      var tryOpen = function tryOpen() {\n        var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n        // We don't emit any error if we're in the waterfall experiment\n        // because this is guaranteed to happen if the user clicks more than\n        // once (whereas in the original this will only happen if it thinks a\n        // click failed).\n        if (index > 0) {\n          var methodType = openMethods[index - 1].type;\n          _this5.emit(\"error\", new __WEBPACK_IMPORTED_MODULE_4__error_handling__[\"a\" /* Warning */](\"Failed to open \" + url + \" using \" + methodType));\n        }\n        if (index === openMethods.length - 1) {\n          _this5.lastOpenedURL = null;\n        }\n        if (index >= openMethods.length && !(index === 1 && isOpenSKProductView(openMethods[0], url))) {\n          _this5.emit(\"error\", new Error(\"Failed to open \" + url + \" by any methods. Tried \" + openMethods.length + \" method(s)\"));\n          return;\n        }\n\n        var openMethod = openMethods[index];\n        var finalClickURL = getFinalClickURL(openMethod.type);\n        openMethod.fn(finalClickURL);\n        _this5.emit(\"clickMethodTried\", {\n          clickOpenMethod: openMethod.type,\n          isAutoclick: isAutoclick\n        });\n\n        _this5.clickRetryTimeout = setTimeout(tryOpen.bind(_this5, index + 1), CLICK_RETRY_INTERVAL_MS);\n      };\n\n      tryOpen();\n    }\n  }, {\n    key: \"close\",\n    value: function close() {\n      var _this6 = this;\n\n      this.onReady(function () {\n        __WEBPACK_IMPORTED_MODULE_3__logger__[\"a\" /* default */].recordMetricV2(\"close_count\", 1);\n\n        if (!_this6.hasSupport(\"close\")) {\n          _this6.emit(\"error\", new __WEBPACK_IMPORTED_MODULE_4__error_handling__[\"a\" /* Warning */](\"Attempted to call 'MRAID.close' when it is not supported.\"));\n          return;\n        }\n\n        _this6.getMRAID().close();\n      });\n    }\n\n    // NOTE(brian): The `useCustomClose` method is deprecated (read: ignored) in\n    // MRAID 3.0.\n    // NOTE(Casey): Unity's `useCustomClose` throws an error. Although we handle\n    // this case by not trying custom custom close on Unity, this implementation\n    // handles that scenario in case other exchanges are (unknowingly) similar.\n    /**\n     * Returns a `Promise` that resolves with `false` if custom close was not set\n     * or to `true` if custom close was set successfully. The `Promise` rejects\n     * if an error was thrown.\n     */\n\n  }, {\n    key: \"useCustomClose\",\n    value: function useCustomClose(use) {\n      var _this7 = this;\n\n      return new Promise(function (resolve, reject) {\n        try {\n          _this7.onReady(function () {\n            if (!(_this7.hasSupport(\"useCustomClose\") && _this7.hasSupport(\"close\") && use)) {\n              return resolve(false);\n            }\n            var mraid = _this7.getMRAID();\n            mraid.useCustomClose(use);\n            resolve(use);\n          });\n        } catch (e) {\n          reject(e);\n        }\n      });\n    }\n  }, {\n    key: \"getViewableDurationMS\",\n    value: function getViewableDurationMS() {\n      if (!this.viewable) return this.viewableDurationMS;\n      if (this.lastViewableTS == null) {\n        console.error(\"Internal LiftoffMRAID error: this.lastViewableTS should be set.\");\n        return this.viewableDurationMS;\n      }\n      return this.viewableDurationMS + (Date.now() - this.lastViewableTS);\n    }\n  }, {\n    key: \"lockOrientation\",\n    value: function lockOrientation(orientation) {\n      if (!this.ready || !this.viewable || !this.hasSupport(\"setOrientationProperties\")) {\n        return;\n      }\n\n      this.orientationToLock = orientation;\n      var mraid = this.getMRAID();\n      this._mraidTry(function () {\n        mraid.setOrientationProperties({\n          allowOrientationChange: false,\n          forceOrientation: orientation\n        });\n      }, { tag: \"setOrientationProperties\" });\n      this.isOrientationLocked = true;\n    }\n  }, {\n    key: \"getMRAID\",\n    value: function getMRAID() {\n      var windowMraid = window.mraid;\n      if (windowMraid != null) {\n        // NOTE(oscar): There are some sdks that will delete window.mraid after it\n        // was initialized. In some cases at least, this is done to replace the\n        // mraid object with a new one, but it's unclear why this is done in an\n        // asynchronous way. In order not to race with the SDK's implementation of\n        // MRAID, we will use the last mraid object loaded as a fallback.\n        // Related test: https://docs.google.com/document/d/1TWLnTFlTGFc6ZJB_UXfR8QvmEa8x_d3k532fmX-13Fs\n        // Related test 2: https://docs.google.com/document/d/1iChTG_zLZvQzI5Opw-6kpHqRCXRYklTPpbNB7TPBFdQ\n        this.mraidIndex = this.mraids.indexOf(windowMraid);\n        if (this.mraidIndex === -1) {\n          this.mraidIndex = this.mraids.length;\n          this.mraids.push(windowMraid);\n        }\n      }\n\n      return this.mraids[this.mraidIndex];\n    }\n  }, {\n    key: \"logMethodSupport\",\n    value: function logMethodSupport(methodName, isSupported) {\n      if (this.supported.methods[methodName] == null) {\n        this.supported.methods[methodName] = {};\n      }\n      if (this.supported.methods[methodName][this.mraidIndex] == null) {\n        this.supported.methods[methodName][this.mraidIndex] = [];\n      }\n      // NOTE(oscar): The MRAID spec allows for a method to go from no support to\n      // support when the mraid's \"ready\" event triggers.\n      this.supported.methods[methodName][this.mraidIndex].push({\n        sinceInitMs: this.sinceInit(),\n        ready: this.ready,\n        support: isSupported,\n        /** Logging is disabled here to prevent an infinite loop. */\n        version: this.getMRAIDVersion({ log: false })\n      });\n    }\n\n    /**\n     * Checks to see if the MRAID implementation supports the given method.\n     * More specifically, this checks to see if the method is a function on the\n     * window.mraid object. It does not actually call the method to see if it\n     * works and any caller should be prepared to handle errors.\n     *\n     * @param {string} prop - The name of the method to check.\n     * @param {Object} options\n     * @param {boolean} options.log - Whether to log the result of the check.\n     */\n\n  }, {\n    key: \"hasSupport\",\n    value: function hasSupport(prop) {\n      var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref4$log = _ref4.log,\n          log = _ref4$log === undefined ? true : _ref4$log;\n\n      var mraid = this.getMRAID();\n      if (mraid == null) {\n        return false;\n      }\n\n      if (prop === \"mraid\") {\n        return true;\n      }\n\n      var support = Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"type\"])(mraid[prop]) === \"function\";\n\n      if (log) {\n        this.logMethodSupport(prop, support);\n      }\n\n      return support;\n    }\n\n    /** Returns the currently loaded MRAID version. */\n\n  }, {\n    key: \"getMRAIDVersion\",\n    value: function getMRAIDVersion() {\n      var _this8 = this;\n\n      var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref5$log = _ref5.log,\n          log = _ref5$log === undefined ? true : _ref5$log;\n\n      return this._mraidTry(function () {\n        return _this8.hasSupport(\"getVersion\", { log: log }) ? _this8.getMRAID().getVersion() : null;\n      }, { tag: \"getVersion\", logError: log });\n    }\n  }, {\n    key: \"isViewportShown\",\n    value: function isViewportShown() {\n      return window.innerHeight > 0 && window.innerWidth > 0;\n    }\n  }]);\n\n  return LiftoffMRAID;\n}();\n\nif (window._LiftoffMRAID == null) {\n  LiftoffMRAID.init();\n  /**\n   * NOTE(oscar): Global state is needed in order to only call .init() once and\n   * to ensure that the same LiftoffMRAID is exported.\n   */\n  window._LiftoffMRAID = LiftoffMRAID;\n}\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (window._LiftoffMRAID);\n\n/***/ }),\n/* 13 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return AdexpMetricV2; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AdexpJavaScriptError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return AdexpLog; });\n/* unused harmony export AdexpContext */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return AdexpMessage; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return getAdexpContextSnapshotFn; });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Wrappers around adexp objects contained in adexpjson.go\n\nvar AdexpMetricV2 = function AdexpMetricV2(name, value) {\n  _classCallCheck(this, AdexpMetricV2);\n\n  this.name = name;\n  this.value = value;\n};\n\nvar AdexpJavaScriptError = function AdexpJavaScriptError() {\n  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      message = _ref.message,\n      _ref$severity = _ref.severity,\n      severity = _ref$severity === undefined ? \"error\" : _ref$severity,\n      sourceURL = _ref.sourceURL,\n      line = _ref.line,\n      column = _ref.column,\n      stack = _ref.stack;\n\n  _classCallCheck(this, AdexpJavaScriptError);\n\n  this.error = {\n    message: message,\n    severity: severity,\n    sourceURL: sourceURL,\n    line: line,\n    column: column,\n    stack: stack\n  };\n};\n\nvar AdexpLog = function AdexpLog(tag, message, data) {\n  _classCallCheck(this, AdexpLog);\n\n  this.tag = tag;\n  this.message = message;\n  Object.assign(this, data);\n};\n\nvar AdexpContext = function AdexpContext() {\n  var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      viewportWidth = _ref2.viewportWidth,\n      viewportHeight = _ref2.viewportHeight,\n      adLanguage = _ref2.adLanguage,\n      mraid = _ref2.mraid;\n\n  _classCallCheck(this, AdexpContext);\n\n  this.ad_language = adLanguage;\n  this.mraid = mraid;\n  this.viewport_height = viewportHeight;\n  this.viewport_width = viewportWidth;\n};\n\nvar AdexpMessage = function AdexpMessage() {\n  var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      context = _ref3.context,\n      metric = _ref3.metric,\n      log = _ref3.log;\n\n  _classCallCheck(this, AdexpMessage);\n\n  Object.assign(this, context);\n  // NOTE(Austin): metrics_v2 must be an array. For now\n  // we don't log more than one metric at a time though.\n  this.metrics_v2 = metric != null ? [metric] : undefined;\n  this.log = log;\n};\n\n// TODO(Austin): Consolidate ClickMetric here.\n\n/**\n * Returns a function that takes a snapshot of the current environment\n * and returns a `AdexpContext`.\n */\nvar getAdexpContextSnapshotFn = function getAdexpContextSnapshotFn(viewportEl, hasMraidFn) {\n  return function () {\n    var _ref4 = viewportEl != null ? viewportEl.getBoundingClientRect() : {},\n        width = _ref4.width,\n        height = _ref4.height;\n\n    return new AdexpContext({\n      viewportWidth: width != null ? Math.round(width) : undefined,\n      viewportHeight: height != null ? Math.round(height) : undefined,\n      adLanguage: navigator.language,\n      mraid: hasMraidFn()\n    });\n  };\n};\n\n/***/ }),\n/* 14 */,\n/* 15 */,\n/* 16 */,\n/* 17 */,\n/* 18 */,\n/* 19 */,\n/* 20 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar patchedObjects = [];\n\nvar MonkeyPatch = function () {\n  function MonkeyPatch() {\n    _classCallCheck(this, MonkeyPatch);\n  }\n\n  _createClass(MonkeyPatch, null, [{\n    key: \"_applyPatch\",\n\n    // #if process.env.NODE_ENV === \"test\"\n    //   static resetAll() {\n    //     patchedObjects.forEach(({ obj, propertyName, dataKey, value }) => {\n    //       MonkeyPatch._applyPatch(obj, propertyName, { [dataKey]: value });\n    //     });\n    // \n    //     // Clear the array.\n    //     patchedObjects.splice(0, patchedObjects.length);\n    //   }\n    // #endif\n\n    value: function _applyPatch(obj, propertyName, protoMap) {\n      if (obj.propertyName !== undefined) {\n        delete obj[propertyName];\n      }\n\n      try {\n        // See\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description\n        Object.defineProperty(obj, propertyName, protoMap);\n      } catch (e) {\n        // TODO(Austin): Delete added patchedObject entry?\n        throw new Error(\"Cannot monkey patch \" + obj.constructor.name + \"[\" + propertyName + \"], because: '\" + e + \"'.\");\n      }\n    }\n  }, {\n    key: \"_patch\",\n    value: function _patch(obj, propertyName, dataKey, value) {\n      var originalValue = Object.getOwnPropertyDescriptor(obj, propertyName)[dataKey];\n\n      patchedObjects.push({\n        obj: obj,\n        propertyName: propertyName,\n        dataKey: dataKey,\n        value: originalValue\n      });\n\n      MonkeyPatch._applyPatch(obj, propertyName, _defineProperty({}, dataKey, value));\n    }\n  }, {\n    key: \"patchFunction\",\n    value: function patchFunction(obj, propertyName, fn) {\n      // \"value\" is the property value. See doc in _applyPatch.\n      MonkeyPatch._patch(obj, propertyName, \"value\", fn);\n    }\n  }, {\n    key: \"patchSetter\",\n    value: function patchSetter(obj, propertyName, fn) {\n      // \"set\" is the property setter. See doc in _applyPatch.\n      MonkeyPatch._patch(obj, propertyName, \"set\", fn);\n    }\n  }, {\n    key: \"patchGetter\",\n    value: function patchGetter(obj, propertyName, fn) {\n      // \"get\" is the property getter. See doc in _applyPatch.\n      MonkeyPatch._patch(obj, propertyName, \"get\", fn);\n    }\n  }]);\n\n  return MonkeyPatch;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (MonkeyPatch);\n\n/***/ }),\n/* 21 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return pointInCTA; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return clickAreaTypeFromEvent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return isDeadzoneCoord; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__constants__ = __webpack_require__(2);\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * Contains logic to determine whether cta was clicked. This is not the optimal\n * way to do it - a better way would be to include CTA location as part of the\n * creative's concept rendering configuration and to set it explicitly.\n */\n\n\n\nvar pointInEl = function pointInEl(el, x, y) {\n  var _el$getBoundingClient = el.getBoundingClientRect(),\n      elTop = _el$getBoundingClient.top,\n      elRight = _el$getBoundingClient.right,\n      elBottom = _el$getBoundingClient.bottom,\n      elLeft = _el$getBoundingClient.left;\n\n  return x >= elLeft && x <= elRight && y >= elTop && y <= elBottom;\n};\n\n/**\n * Returns true iff (x, y) is within the bounds of a CTA. We\n * consider an element to be a \"CTA element\" if it's part of the generic-cta or\n * custom-cta components or is in a container that has 'cta' in the id. This can\n * give both false positives (e.g. if a non-CTA image is placed in a CTA\n * container) and false negatives (e.g. if a CTA is embedded in a larger image\n * in one of the \"fill\" templates), but it's probably close to the best we can\n * do without manual tagging. We include all descendants of cta\n * containers/components, because sometimes their children overflow.\n */\nvar pointInCTA = function pointInCTA(x, y) {\n  return [].concat(_toConsumableArray(document.querySelectorAll([\".generic-cta\", \".generic-cta *\", \".custom-cta\", \".custom-cta *\", \".cta-container\", \".cta-container *\", \".liftoff-cta\", \".liftoff-cta *\", \".product-view-cta .light\", \".last-chance-endscreen-container\"].join(\", \")))).some(function (ctaEl) {\n    return pointInEl(ctaEl, x, y);\n  });\n};\n\n/**\n * Returns true iff e is a MouseEvent that occurred over a CTA.\n */\nvar clickAreaTypeFromEvent = function clickAreaTypeFromEvent(e) {\n  return pointInCTA(e.clientX, e.clientY) ? __WEBPACK_IMPORTED_MODULE_0__constants__[\"l\" /* CLICK_AREA_TYPE_CTA */] : __WEBPACK_IMPORTED_MODULE_0__constants__[\"m\" /* CLICK_AREA_TYPE_OTHER */];\n};\n\nvar isDeadzoneCoord = function isDeadzoneCoord(_ref) {\n  var x = _ref.x,\n      y = _ref.y;\n\n  if (!Number.isFinite(x) || !Number.isFinite(y)) {\n    console.warn(\"Unexpected coords\", { x: x, y: y });\n    return;\n  }\n  return [].concat(_toConsumableArray(document.body.querySelectorAll(\".liftoff-deadzone\"))).some(function (el) {\n    return pointInEl(el, x, y);\n  });\n};\n\n/***/ }),\n/* 22 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return MESSAGE_CREATIVE_MADE_SOUND; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return MESSAGE_TOGGLE_MUTED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return MESSAGE_INTERACTION_CHANGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return MESSAGE_CLICKTHROUGH; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return MESSAGE_MRAID_EVENT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return MESSAGE_MRAID_CALL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return MESSAGE_UPDATED_MRAID_PROPERTIES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return MESSAGE_INNER_ENV_INIT_COMPLETE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return MESSAGE_OUTER_ENV_INIT_COMPLETE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return MESSAGE_REQUEST_DOM_SNAPSHOT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return MESSAGE_DOM_SNAPSHOT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return MESSAGE_INNER_ENV_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return MESSAGE_RESIZE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return MESSAGE_VUNGLE_CLICKTHROUGH; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return MESSAGE_TRESENSA_INTERACTION; });\nvar MESSAGE_CREATIVE_MADE_SOUND = \"CREATIVE_MADE_SOUND\";\nvar MESSAGE_TOGGLE_MUTED = \"TOGGLE_MUTED\";\nvar MESSAGE_INTERACTION_CHANGE = \"INTERACTION_CHANGE\";\nvar MESSAGE_CLICKTHROUGH = \"CLICKTHROUGH\";\nvar MESSAGE_MRAID_EVENT = \"MRAID_EVENT\";\nvar MESSAGE_MRAID_CALL = \"MRAID_CALL\";\nvar MESSAGE_UPDATED_MRAID_PROPERTIES = \"UPDATED_MRAID_PROPERTIES\";\nvar MESSAGE_INNER_ENV_INIT_COMPLETE = \"INNER_ENV_INIT_COMPLETE\";\nvar MESSAGE_OUTER_ENV_INIT_COMPLETE = \"OUTER_ENV_INIT_COMPLETE\";\nvar MESSAGE_REQUEST_DOM_SNAPSHOT = \"REQUEST_DOM_SNAPSHOT\";\nvar MESSAGE_DOM_SNAPSHOT = \"DOM_SNAPSHOT\";\nvar MESSAGE_INNER_ENV_ERROR = \"INNER_ENV_ERROR\";\nvar MESSAGE_RESIZE = \"RESIZE\";\n\n// External Messages from Vungle.\nvar MESSAGE_VUNGLE_CLICKTHROUGH = \"download\";\n\n// External Messages from Tresensa creatives.\nvar MESSAGE_TRESENSA_INTERACTION = \"tre_interaction\";\n\n/***/ }),\n/* 23 */,\n/* 24 */,\n/* 25 */,\n/* 26 */,\n/* 27 */,\n/* 28 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar AudioToggleIcon = function () {\n  function AudioToggleIcon() {\n    _classCallCheck(this, AudioToggleIcon);\n\n    this.el = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"])(\"\\n      <div class=\\\"audio-toggle-icon\\\"\\n          style=\\\"margin:10px;border-radius:25px;background-color:black;line-height:10px\\\">\\n        <svg fill=\\\"#FFFFFF\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\"\\n          width=\\\"30\\\" height=\\\"30\\\" viewBox=\\\"0 0 16 16\\\"\\n        >\\n          <g class=\\\"audio-toggle-unmute\\\" transform=\\\"translate(8 8) scale(0.69 0.69) translate(-8 -8)\\\">\\n            <polygon points=\\\"\\n              14.293,14.293 1.707,1.707 1,2.414 4.586,6 4,6 4,10 7,10 11,14 11,12.414 13.586,15\\n            \\\"></polygon>\\n            <polygon points=\\\"11,2 7.207,5.793 11,9.586\\\"></polygon>\\n          </g>\\n          <g class=\\\"audio-toggle-mute\\\" transform=\\\"translate(8 8) scale(0.69 0.69) translate(-8 -8)\\\">\\n            <polygon points=\\\"7,6 4,6 4,10 7,10 11,14 11,2\\\"></polygon>\\n          </g>\\n        </svg>\\n      </div>\\n    \");\n\n    this.setMuted(true);\n  }\n\n  _createClass(AudioToggleIcon, [{\n    key: \"getElement\",\n    value: function getElement() {\n      return this.el;\n    }\n  }, {\n    key: \"setMuted\",\n    value: function setMuted(muted) {\n      this.el.querySelector(\".audio-toggle-unmute\").style.display = muted ? \"\" : \"none\";\n      this.el.querySelector(\".audio-toggle-mute\").style.display = muted ? \"none\" : \"\";\n    }\n  }]);\n\n  return AudioToggleIcon;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AudioToggleIcon);\n\n/***/ }),\n/* 29 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__monkey_patch__ = __webpack_require__(20);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n/**\n * Returns true iff `el` is a media (audio or video) element;\n */\nvar isMediaElement = function isMediaElement(el) {\n  return el.tagName === \"VIDEO\" || el.tagName === \"AUDIO\";\n};\n\n/**\n * Assuming `el` is a playing video, returns `true` iff it has audio data.\n */\nvar doesVideoHaveAudio = function doesVideoHaveAudio(el) {\n  return el.audioTracks != null && el.audioTracks.length > 0 || el.webkitAudioDecodedByteCount != null && el.webkitAudioDecodedByteCount > 0;\n};\n\n// Minimum bin size of a web audio analyzer node frequency spectrum. See:\n// https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/fftSize#Value.\nvar MIN_FFT_SIZE = 32;\n\n/**\n * Global controller for web audio. This works by monkey-patching the\n * `AudioContext` constructor and redefining `AudioContext.destination`\n * (normally an `AudioDestinationNode` that routes sound to the speakers)\n * to a node that allows the global controller to intercept and control all\n * output. This is used by `GlobalAudioController`--it's not intended to be\n * used directly. `cb` is a function that will be called the first time any\n * `AudioContext` produces a sound.\n */\n\nvar GlobalWebAudioController = function () {\n  function GlobalWebAudioController() {\n    _classCallCheck(this, GlobalWebAudioController);\n  }\n\n  _createClass(GlobalWebAudioController, null, [{\n    key: \"reset\",\n\n    // if process.env.NODE_ENV === \"test\"\n    /**\n     * Resets all state back to it's uninitialized state.\n     * Used for testing purposes.\n     */\n    value: function reset() {\n      GlobalWebAudioController._firstSoundMade = false;\n      GlobalWebAudioController._muted = null;\n    }\n    // #endif\n\n  }, {\n    key: \"init\",\n    value: function init(cb) {\n      GlobalWebAudioController._muted = null;\n      GlobalWebAudioController._cb = cb;\n      GlobalWebAudioController._firstSoundMade = false;\n      GlobalWebAudioController._gainNodes = [];\n\n      try {\n        var originalAudioContext = window.AudioContext || window.webkitAudioContext;\n\n        /**\n         * An alternative to monkey-patching the `AudioContext` constructor would\n         * be to monkey-patch the `AudioContext.prototype.destination` getter,\n         * but this doesn't work on old (pre-getter) browsers.\n         */\n        window.AudioContext = window.webkitAudioContext = function AudioContext() {\n          for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n            args[_key] = arguments[_key];\n          }\n\n          var audioCtx = new (Function.prototype.bind.apply(originalAudioContext, [null].concat(args)))();\n          var gainNode = audioCtx.createGain();\n          var analyserNode = audioCtx.createAnalyser();\n          // We just want to know if the `AudioContext` is producing _any_ sound\n          // and don't care about the frequency spectrum per se. We therefore used\n          // the smallest allowed FFT size.\n          analyserNode.fftSize = MIN_FFT_SIZE;\n          var freqData = new Uint8Array(analyserNode.frequencyBinCount);\n          var soundPollInterval = setInterval(function () {\n            analyserNode.getByteFrequencyData(freqData);\n            var i = 0;\n            for (; i < freqData.length; i++) {\n              if (freqData[i] !== 0) break;\n            }\n            if (i === freqData.length) return;\n            clearInterval(soundPollInterval);\n            GlobalWebAudioController._handleFirstSound();\n          }, 10);\n          /**\n           * The resulting node structure is:\n           *   input -> analyser -> gain -> destination\n           * We use the analyser node to detect when the AudioContext is producing\n           * sound and the gain node to globally control output.\n           */\n          var originalDestination = audioCtx.destination;\n          analyserNode.connect(gainNode);\n          gainNode.connect(originalDestination);\n          gainNode.gain.value = GlobalWebAudioController._muted ? 0 : 1;\n          GlobalWebAudioController._gainNodes.push(gainNode);\n\n          Object.defineProperty(audioCtx, \"destination\", {\n            value: analyserNode,\n            // Ensure that our destination node is the only destination node.\n            writable: false,\n            configurable: false\n          });\n\n          return audioCtx;\n        };\n      } catch (_) {\n        console.error(\"Unable to monkey-patch AudioContext\");\n      }\n    }\n  }, {\n    key: \"_handleFirstSound\",\n    value: function _handleFirstSound() {\n      if (GlobalWebAudioController._firstSoundMade) return;\n      GlobalWebAudioController._cb();\n      GlobalWebAudioController._firstSoundMade = true;\n    }\n\n    /**\n     * Mutes all `AudioContext`s when `shouldMute === true` and restores all\n     * `AudioContext`s to the state set by the user when `shouldMute === false`.\n     */\n\n  }, {\n    key: \"setMuted\",\n    value: function setMuted(shouldMute) {\n      if (GlobalWebAudioController._muted === shouldMute) {\n        return;\n      }\n      GlobalWebAudioController._muted = shouldMute;\n      GlobalWebAudioController._gainNodes.forEach(function (gainNode) {\n        gainNode.gain.value = shouldMute ? 0 : 1;\n      });\n    }\n  }]);\n\n  return GlobalWebAudioController;\n}();\n\n/**\n * Utility for tracking media elements. Media elements can come into existence\n * in several different ways, which requies multiple different tricks for\n * becoming aware of their existence:\n *   1) They may exist in the DOM on page load (i.e. be embedded directly in\n *      the HTML document) - these can be detected by querying the dom for video\n *      and audio elements\n *   2) They can be produced from an HTML string (e.g. `someEl.innerHTML =\n *      \"<audio ... />\"`) and appended to the DOM. They must fire a \"loadstart\"\n *      event after being appended to the DOM, or the `load` or `play` methods\n *      may be called directly on the element. These can be detected by\n *      listening for \"loadstart\" events and by monkey-patching the `load` and\n *      `play` methods. This is true regardless of whether or not autoplay is\n *      true.\n *   3) `document.createElement` - these are detected by monkey-patching\n *      `Document.prototype.createElement`. These won't be caught by the\n *      approaches in 2 if the \"autoplay\" attribute is set to `true` (since they\n *      can make sound without ever being explicitly loaded, played, or append\n *      to the DOM).\n *   4) The `Audio` constructor - these are detected by monkey-patching the\n *      `Audio` constructor.\n */\n\n\nvar MediaElementWatcher = function () {\n  function MediaElementWatcher() {\n    _classCallCheck(this, MediaElementWatcher);\n\n    throw new Error(\"Cannot construct instances of MediaElementWatcher.\");\n  }\n\n  /**\n   * Initializes the class, and immediately calls function `cb` once for each\n   * media element that already exists. Subsequently calls `cb` whenever a new\n   * media element is created. This should only be called once.\n   */\n\n\n  _createClass(MediaElementWatcher, null, [{\n    key: \"init\",\n    value: function init(cb) {\n      MediaElementWatcher._cb = cb;\n      MediaElementWatcher._seenElements = new WeakSet();\n\n      var originalCreateElement = Document.prototype.createElement;\n      __WEBPACK_IMPORTED_MODULE_0__monkey_patch__[\"a\" /* default */].patchFunction(Document.prototype, \"createElement\", function () {\n        for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n          args[_key2] = arguments[_key2];\n        }\n\n        var el = originalCreateElement.apply(this, args);\n        MediaElementWatcher._handleNewElement(el);\n        return el;\n      });\n\n      var originalAudio = window.Audio;\n      window.Audio = function Audio() {\n        for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n          args[_key3] = arguments[_key3];\n        }\n\n        var a = new (Function.prototype.bind.apply(originalAudio, [null].concat(args)))();\n        MediaElementWatcher._handleNewElement(a);\n        return a;\n      };\n      window.Audio.prototype = originalAudio.prototype;\n\n      [\"play\", \"load\"].forEach(function (methodName) {\n        var originalMethod = HTMLMediaElement.prototype[methodName];\n        __WEBPACK_IMPORTED_MODULE_0__monkey_patch__[\"a\" /* default */].patchFunction(HTMLMediaElement.prototype, methodName, function () {\n          MediaElementWatcher._handleNewElement(this);\n\n          for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n            args[_key4] = arguments[_key4];\n          }\n\n          return originalMethod.apply(this, args);\n        });\n      });\n\n      window.addEventListener(\"loadstart\", function (e) {\n        MediaElementWatcher._handleNewElement(e.target);\n      }, true);\n\n      document.querySelectorAll(\"video, audio\").forEach(function (el) {\n        MediaElementWatcher._cb(el);\n      });\n    }\n  }, {\n    key: \"_handleNewElement\",\n    value: function _handleNewElement(el) {\n      if (!isMediaElement(el) || MediaElementWatcher._seenElements.has(el)) {\n        return;\n      }\n      MediaElementWatcher._seenElements.add(el);\n      MediaElementWatcher._cb(el);\n    }\n  }]);\n\n  return MediaElementWatcher;\n}();\n\n/**\n * Global controller for media (audio and video) elements. Used by\n * `GlobalAudioController` and not intended to be used directly. `cb` is a\n * function that will be called the first time any media element can\n * produce a sound (were global control not applied).\n */\n\n\nvar GlobalMediaElementAudioController = function () {\n  // #if process.env.NODE_ENV === \"test\"\n  //   /**\n  //    * Resets all state back to it's uninitialized state.\n  //    * Used for testing purposes.\n  //    */\n  //   static reset() {\n  //     GlobalMediaElementAudioController._firstSoundMade = false;\n  //     GlobalMediaElementAudioController._globallyMuted = null;\n  //   }\n  // #endif\n\n  function GlobalMediaElementAudioController() {\n    _classCallCheck(this, GlobalMediaElementAudioController);\n\n    throw new Error(\"Cannot construct instances of GlobalMediaElementAudioController.\");\n  }\n\n  _createClass(GlobalMediaElementAudioController, null, [{\n    key: \"init\",\n    value: function init(cb) {\n      GlobalMediaElementAudioController._globallyMuted = null;\n      /**\n       * We keep track of the values for el.muted set by the user for each media\n       * el. When we globally unmute, we restore the set state (so calling\n       * `GlobalMediaElementAudioController.unmute()` does not unmute\n       * elements that the user has set to be muted).\n       */\n      GlobalMediaElementAudioController._elToSetState = new WeakMap();\n      GlobalMediaElementAudioController._allMediaEls = [];\n      GlobalMediaElementAudioController._firstSoundMade = false;\n      GlobalMediaElementAudioController._cb = cb;\n\n      try {\n        GlobalMediaElementAudioController._originalMutedSetter = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, \"muted\").set;\n        var originalMutedGetter = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, \"muted\").get;\n\n        __WEBPACK_IMPORTED_MODULE_0__monkey_patch__[\"a\" /* default */].patchSetter(HTMLMediaElement.prototype, \"muted\", function (val) {\n          GlobalMediaElementAudioController._elToSetState.set(this, val);\n          if (GlobalMediaElementAudioController._canMakeSound(this)) {\n            GlobalMediaElementAudioController._handleFirstSound();\n          }\n\n          var systemMutedState = originalMutedGetter.call(this);\n          if (GlobalMediaElementAudioController._globallyMuted && (systemMutedState || !val)) {\n            return;\n          }\n          GlobalMediaElementAudioController._originalMutedSetter.call(this, val);\n        });\n\n        // Patch the \"muted\" getter so that it returns the value set by the user,\n        // rather than the underlying \"system\" value.\n        __WEBPACK_IMPORTED_MODULE_0__monkey_patch__[\"a\" /* default */].patchGetter(HTMLMediaElement.prototype, \"muted\", function () {\n          var recordedSetState = GlobalMediaElementAudioController._elToSetState.get(this);\n          return recordedSetState == null ? originalMutedGetter.call(this) : recordedSetState;\n        });\n        // #if process.env.NODE_ENV === \"test\"\n        //       // Expose the underlying system muted setting to tests.\n        //       Object.defineProperty(HTMLMediaElement.prototype, \"systemMutedState\", {\n        //         get: originalMutedGetter,\n        //       });\n        // #endif\n      } catch (_) {\n        /**\n         * Monkey-patching will fail on old (pre-setter) browsers. In this case,\n         * we have no way of keeping track of the set state.\n         * (Listening for \"volumechange\" events doesn't work, because if we force\n         * the state to `true` due to globally muting, then the event will not\n         * fire if the user subsequently sets the `muted` to `true`.) In this\n         * case, we just keep the page globally muted.\n         */\n        GlobalMediaElementAudioController._originalMutedSetter = function (mute) {\n          this.muted = mute;\n        };\n        console.error(\"Unable to monkey-patch HTMLMediaElement.muted\");\n      }\n\n      MediaElementWatcher.init(function (el) {\n        if (!GlobalMediaElementAudioController._allMediaEls.includes(el)) {\n          GlobalMediaElementAudioController._allMediaEls.push(el);\n        }\n        GlobalMediaElementAudioController._watchForSound(el);\n        GlobalMediaElementAudioController._toggleElementMuted(el, GlobalMediaElementAudioController._globallyMuted);\n      });\n    }\n\n    /**\n     * Returns `true` iff `el` would be able to make a sound were it not being\n     * controlled by this global controller. We consider an element able to make\n     * a sound if it is either an audio element or is a video with audio tracks.\n     * Assumes that `el` is in the playing state (whether or not a video has\n     * audio cannot be determined for all browsers for media that are not\n     * playing).\n     */\n\n  }, {\n    key: \"_canMakeSound\",\n    value: function _canMakeSound(el) {\n      var isMuted = GlobalMediaElementAudioController._elToSetState.get(el);\n      return !isMuted && (el.tagName === \"AUDIO\" || doesVideoHaveAudio(el));\n    }\n  }, {\n    key: \"_watchForSound\",\n    value: function _watchForSound(el) {\n      if (!el.paused && GlobalMediaElementAudioController._canMakeSound(el)) {\n        GlobalMediaElementAudioController._handleFirstSound();\n        return;\n      }\n\n      el.addEventListener(\"playing\", function () {\n        if (!GlobalMediaElementAudioController._canMakeSound(el)) return;\n        GlobalMediaElementAudioController._handleFirstSound();\n      });\n    }\n\n    /**\n     * Forces `el.muted` to `muted` (a boolean). Assumes that if `muted === true`,\n     * the value of `el.muted` is the state set by the user.\n     * (i.e. This is not idempotent.)\n     */\n\n  }, {\n    key: \"_toggleElementMuted\",\n    value: function _toggleElementMuted(el, muted) {\n      if (muted) {\n        GlobalMediaElementAudioController._elToSetState.set(el, el.muted);\n        GlobalMediaElementAudioController._originalMutedSetter.call(el, true);\n        return;\n      }\n\n      GlobalMediaElementAudioController._originalMutedSetter.call(el, GlobalMediaElementAudioController._elToSetState.get(el));\n    }\n  }, {\n    key: \"_toggleMediaMuted\",\n    value: function _toggleMediaMuted(muted) {\n      GlobalMediaElementAudioController._allMediaEls.forEach(function (el) {\n        GlobalMediaElementAudioController._toggleElementMuted(el, muted);\n      });\n    }\n  }, {\n    key: \"_handleFirstSound\",\n    value: function _handleFirstSound() {\n      if (GlobalMediaElementAudioController._firstSoundMade) return;\n      GlobalMediaElementAudioController._cb();\n      GlobalMediaElementAudioController._firstSoundMade = true;\n    }\n\n    /**\n     * Mutes all HTML media elements when `shouldMute === true` and restores the\n     * set state of all HTML media elements when `shouldMute === false`.\n     */\n\n  }, {\n    key: \"setMuted\",\n    value: function setMuted(shouldMute) {\n      if (GlobalMediaElementAudioController._globallyMuted === shouldMute) {\n        return;\n      }\n      GlobalMediaElementAudioController._toggleMediaMuted(shouldMute);\n      GlobalMediaElementAudioController._globallyMuted = shouldMute;\n    }\n  }]);\n\n  return GlobalMediaElementAudioController;\n}();\n\n/**\n * Global controller for all possible sources of audio in a web page, except\n * for `iframe`s. The public interface consists of only two methods:\n *   - `GlobalAudioController.setMuted` - takes a boolean indicating whether\n *      audio from all sound sources (HTML media elements and web audio) should\n *      be muted (true) or not (false);\n *   - `GlobalAudioController.onFirstSound` - receives one argument, a function\n *      that will be called immediately if the page is already making sound or\n *      otherwise will be called once when the page first makes a sound\n *      (possibly never).\n */\n\n\nvar GlobalAudioController = function () {\n  // #if process.env.NODE_ENV === \"test\"\n  //   /**\n  //    * Just to facilitate testing of `onFirstSound` by allowing the registered\n  //    * callback to be run multiple times when new sources of sound are added to\n  //    * the testing environment page.\n  //    */\n  //   static reset() {\n  //     GlobalAudioController._firstSoundMade = false;\n  //     GlobalAudioController._onFirstSoundCallbacks = [];\n  // \n  //     GlobalMediaElementAudioController.reset();\n  //     GlobalWebAudioController.reset();\n  //   }\n  // #endif\n\n  function GlobalAudioController() {\n    _classCallCheck(this, GlobalAudioController);\n\n    throw new Error(\"Cannot construct instances of GlobalAudioController.\");\n  }\n\n  /**\n   * This class is invasive insofar as implements a series of monkey patches on\n   * browser API objects. We thus only initialize it when it's actually used.\n   */\n\n\n  _createClass(GlobalAudioController, null, [{\n    key: \"_init\",\n    value: function _init() {\n      if (GlobalAudioController._initialized) {\n        return;\n      }\n      GlobalAudioController._initialized = true;\n      GlobalAudioController._firstSoundMade = false;\n      GlobalAudioController._onFirstSoundCallbacks = [];\n\n      var handleFirstSound = function handleFirstSound() {\n        if (GlobalAudioController._firstSoundMade) {\n          return;\n        }\n        GlobalAudioController._firstSoundMade = true;\n        GlobalAudioController._onFirstSoundCallbacks.forEach(function (cb) {\n          return cb();\n        });\n      };\n      GlobalMediaElementAudioController.init(handleFirstSound);\n      GlobalWebAudioController.init(handleFirstSound);\n    }\n  }, {\n    key: \"setMuted\",\n    value: function setMuted(shouldMute) {\n      GlobalAudioController._init();\n      GlobalMediaElementAudioController.setMuted(shouldMute);\n      GlobalWebAudioController.setMuted(shouldMute);\n    }\n  }, {\n    key: \"runAfterFirstSound\",\n    value: function runAfterFirstSound(cb) {\n      GlobalAudioController._init();\n      if (GlobalAudioController._firstSoundMade) {\n        cb();\n        return;\n      }\n\n      GlobalAudioController._onFirstSoundCallbacks.push(cb);\n    }\n  }]);\n\n  return GlobalAudioController;\n}();\n\nGlobalAudioController._initialized = false;\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (GlobalAudioController);\n\n/***/ }),\n/* 30 */,\n/* 31 */,\n/* 32 */,\n/* 33 */,\n/* 34 */,\n/* 35 */,\n/* 36 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return applyLiftoffPolicy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return postHTMLReturn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return getDOMSnapshot; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return configureHTMLReturn; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_audio_toggle_icon__ = __webpack_require__(28);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__ = __webpack_require__(29);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__frontendlib_utils__ = __webpack_require__(0);\n\n\n\n\n\n\nvar CLOSE_Z = 99;\nvar WATERMARKS_Z = 98;\n\n/**\n * Returns a close element with a countdown timer that starts at `delay` seconds.\n */\nvar createCloseEl = function createCloseEl(delay) {\n  var closeEl = document.createElement(\"div\");\n  closeEl.id = \"liftoff-close\";\n  Object.assign(closeEl.style, {\n    display: \"block\",\n    position: \"absolute\",\n    top: \"10px\",\n    right: \"10px\",\n    width: \"32px\",\n    height: \"32px\",\n    zIndex: CLOSE_Z\n  });\n  var buttonStyles = {\n    width: \"100%\",\n    height: \"100%\",\n    display: \"block\",\n    position: \"absolute\",\n    top: \"0\",\n    left: \"0\",\n    fontSize: \"16px\",\n    lineHeight: \"28px\",\n    textAlign: \"center\",\n    border: \"2px solid #FFF\",\n    borderRadius: \"50%\",\n    boxSizing: \"border-box\",\n    pointerEvents: \"all\"\n  };\n  var closeTargetEl = document.createElement(\"div\");\n  closeTargetEl.classList.add(\"liftoff-close-target\");\n  Object.assign(closeTargetEl.style, buttonStyles, {\n    color: \"#EEE\",\n    backgroundColor: \"#000\"\n  });\n  // This is a nice close X.\n  closeTargetEl.innerHTML = \"&#10005\";\n  closeTargetEl.addEventListener(\"click\", function (e) {\n    __WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__[\"a\" /* default */].close();\n    e.stopPropagation();\n  });\n  closeEl.appendChild(closeTargetEl);\n  if (delay > 0) {\n    var closeDelayEl = document.createElement(\"div\");\n    closeDelayEl.classList.add(\"liftoff-close-delay\");\n    Object.assign(closeDelayEl.style, buttonStyles, {\n      color: \"#555\",\n      backgroundColor: \"#BBB\"\n    });\n    var countdown = delay;\n    closeDelayEl.textContent = countdown;\n    closeDelayEl.style.display = \"block\";\n    var closeDelayInterval = setInterval(function () {\n      countdown -= 1;\n      if (countdown > 0) {\n        closeDelayEl.textContent = countdown;\n        return;\n      }\n      closeDelayEl.style.display = \"none\";\n      clearInterval(closeDelayInterval);\n    }, 1000);\n    closeEl.appendChild(closeDelayEl);\n  }\n  return closeEl;\n};\n\n/**\n * Calls `callback` on the user's first interaction.\n */\nvar onFirstInteraction = function onFirstInteraction(callback) {\n  var hasUserInteracted = false;\n  var handleFirstInteraction = function handleFirstInteraction(e) {\n    window.removeEventListener(\"mousedown\", handleFirstInteraction, true);\n    window.removeEventListener(\"touchstart\", handleFirstInteraction, true);\n    if (hasUserInteracted) return;\n    hasUserInteracted = true;\n    callback(e);\n  };\n  window.addEventListener(\"mousedown\", handleFirstInteraction, true);\n  window.addEventListener(\"touchstart\", handleFirstInteraction, true);\n};\n\n/**\n * Creates an icon in the lower-right corner that allows the user to globally toggle the creative's audio on\n * and off. The toggle only appears on creatives that have autoplay audio (i.e. audio that plays prior to user\n * interaction). For creatives that have autoplay audio, the creative is globally muted by default but will\n * become globally unmuted when the user interacts with the creative.\n */\nvar createGlobalAudioToggle = function createGlobalAudioToggle() {\n  var el = document.createElement(\"div\");\n  el.classList.add(\"liftoff-global-audio-toggle\");\n  Object.assign(el.style, {\n    opacity: \"0.5\",\n    display: \"none\",\n    pointerEvents: \"all\",\n    right: \"0\",\n    bottom: \"0\",\n    position: \"absolute\"\n  });\n  var icon = new __WEBPACK_IMPORTED_MODULE_0__lib_audio_toggle_icon__[\"a\" /* default */]();\n  var iconEl = icon.getElement();\n  el.appendChild(iconEl);\n\n  var isCurrentlyMuted = false;\n  var setMuted = function setMuted(shouldMute) {\n    if (shouldMute === isCurrentlyMuted) return;\n    isCurrentlyMuted = shouldMute;\n    __WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__[\"a\" /* default */].setMuted(shouldMute);\n    icon.setMuted(shouldMute);\n  };\n\n  var hasUserInteracted = false;\n  onFirstInteraction(function (e) {\n    hasUserInteracted = true;\n    // Interactions with the global audio toggle icon are handled by the click listener below.\n    if (el.contains(e.target)) return;\n    setMuted(false);\n  });\n\n  iconEl.addEventListener(\"click\", function () {\n    setMuted(!isCurrentlyMuted);\n  });\n\n  __WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__[\"a\" /* default */].runAfterFirstSound(function () {\n    if (hasUserInteracted) return;\n    el.style.display = \"inline-block\";\n  });\n\n  setMuted(true);\n  return el;\n};\n\nvar globallyMuteAllAudio = function globallyMuteAllAudio() {\n  __WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__[\"a\" /* default */].setMuted(true);\n};\n\n/**\n * Performs various operations required to conform to exchange- and/or country-specific creative policies.\n * This is used by both madlib HTML and CSP (third-party) creatives.\n * Requires:\n *   - creativePolicy - An object with keys:\n *       addBorder (boolean)\n *       showAdChoices (boolean)\n *       showChineseWatermark (boolean)\n *       russianAgeRating (number)\n *   - bidContext - An object with keys: { creativeID, platform, exchange, sourceAppName, sourceAppID }\n */\nvar applyLiftoffPolicy = function applyLiftoffPolicy(snippetEl, _ref, _ref2) {\n  var addBorder = _ref.addBorder,\n      showAdChoices = _ref.showAdChoices,\n      russianAgeRating = _ref.russianAgeRating,\n      showChineseWatermark = _ref.showChineseWatermark,\n      useCustomClose = _ref.useCustomClose,\n      closeDelay = _ref.closeDelay,\n      audioPolicy = _ref.audioPolicy;\n  var creativeID = _ref2.creativeID,\n      platform = _ref2.platform,\n      exchange = _ref2.exchange,\n      sourceAppName = _ref2.sourceAppName,\n      sourceAppID = _ref2.sourceAppID,\n      cdnURL = _ref2.cdnURL;\n\n  var watermarksEl = document.createElement(\"div\");\n  watermarksEl.classList.add(\"liftoff-watermarks\");\n  Object.assign(watermarksEl.style, {\n    position: \"absolute\",\n    bottom: \"0\",\n    left: \"0\",\n    zIndex: \"\" + WATERMARKS_Z,\n    height: \"18px\",\n    pointerEvents: \"none\"\n  });\n\n  /**\n   * Creates an element to apply a border around the whole creative (required for banners on certain\n   * exchanges). We do this rather than adding a border directly to `#liftoff-snippet`, because the latter\n   * changes the size of the snippet content by 2 * border-width, resulting in slightly inconsistent\n   * rendering depending on whether the border is there or not.\n   */\n  if (addBorder) {\n    var el = document.createElement(\"div\");\n    el.id = \"liftoff-border\";\n    Object.assign(el.style, {\n      width: \"100%\",\n      height: \"100%\",\n      position: \"absolute\",\n      border: \"1px solid #AAA\",\n      boxSizing: \"border-box\",\n      zIndex: \"10\",\n      pointerEvents: \"none\"\n    });\n    document.body.appendChild(el);\n  }\n\n  if (showAdChoices) {\n    // NOTE(Austin): We append these parameters for Google Analytics and more\n    // granular cloudfront logs.\n    var queryParams = {\n      creative_id: creativeID,\n      platform: platform,\n      exchange: exchange,\n      source_app_name: sourceAppName,\n      source_app_id: sourceAppID\n    };\n\n    var a = document.createElement(\"a\");\n    a.classList.add(\"ad-choices-icon\");\n    var optoutPageURL = __WEBPACK_IMPORTED_MODULE_4__frontendlib_utils__[\"appendParamObjectToURL\"](cdnURL + \"/optout.html\", queryParams);\n\n    if (exchange === __WEBPACK_IMPORTED_MODULE_3__constants__[\"x\" /* EXCHANGE_DOUBLECLICK */]) {\n      // NOTE (Austin): Letting the click from the anchor tag intentionally take\n      // the user out of the ad provides a better experience, as the in-app\n      // browser is broken on some inventory (e.g., DoubleClick). Some\n      // exchanges, such as Unity, open the in-app browser regardless, leading to\n      // a poor user experience. Additionally, certain exchanges ignore our\n      // mraid.open or window.open parameters, opening the clickthrough URL in a\n      // new browser anyway.\n      // TODO(Austin): Test making this the default.\n      a.setAttribute(\"target\", \"_blank\");\n      a.setAttribute(\"href\", optoutPageURL);\n    } else {\n      // NOTE(oscar): Chartboost recommends we open the ad choices link using\n      // MRAID.\n      a.addEventListener(\"click\", function (e) {\n        e.preventDefault();\n        __WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__[\"a\" /* default */].open(optoutPageURL, { exchange: exchange, platform: platform });\n      });\n    }\n\n    Object.assign(a.style, {\n      width: \"20px\",\n      height: \"100%\",\n      display: \"inline-block\",\n      backgroundColor: \"rgba(204, 204, 204, 0.6)\",\n      backgroundImage: \"url(\" + cdnURL + \"/adchoices.png)\",\n      backgroundPosition: \"center\",\n      backgroundRepeat: \"no-repeat\",\n      backgroundSize: \"12px 12px\",\n      pointerEvents: \"all\"\n    });\n    watermarksEl.appendChild(a);\n  }\n\n  if (russianAgeRating != null) {\n    var ageTag = document.createElement(\"div\");\n    ageTag.textContent = russianAgeRating + \"+\";\n    ageTag.classList.add(\"age-rating\");\n    Object.assign(ageTag.style, {\n      color: \"blue\",\n      fontSize: \"10px\",\n      fontWeight: \"500\",\n      background: \"whitesmoke\",\n      borderRadius: \"0 5px 0 0\",\n      padding: \"0 3px\",\n      opacity: \"0.75\",\n      display: \"inline\",\n      verticalAlign: \"bottom\",\n      pointerEvents: \"none\",\n      lineHeight: \"20px\"\n    });\n    watermarksEl.appendChild(ageTag);\n  }\n\n  if (showChineseWatermark) {\n    var _el = document.createElement(\"div\");\n    _el.classList.add(\"chinese-watermark\");\n    Object.assign(_el.style, {\n      display: \"inline-block\",\n      height: \"100%\",\n      width: \"42px\",\n      pointerEvents: \"none\",\n      backgroundColor: \"rgba(204, 204, 204, 0.6)\",\n      backgroundImage: \"url(\" + cdnURL + \"/chinese_watermark.png)\",\n      backgroundPosition: \"center\",\n      backgroundRepeat: \"no-repeat\",\n      backgroundSize: \"contain\"\n    });\n    watermarksEl.appendChild(_el);\n  }\n\n  if (audioPolicy === __WEBPACK_IMPORTED_MODULE_3__constants__[\"a\" /* AUDIO_POLICY_ALWAYS_MUTE */]) {\n    globallyMuteAllAudio();\n  } else if (audioPolicy === __WEBPACK_IMPORTED_MODULE_3__constants__[\"c\" /* AUDIO_POLICY_ON_INTERACTION */]) {\n    var globalAudioToggleEl = createGlobalAudioToggle();\n    snippetEl.appendChild(globalAudioToggleEl);\n  }\n\n  __WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__[\"a\" /* default */].useCustomClose(useCustomClose).then(function (isUsingCustomClose) {\n    if (!isUsingCustomClose) return;\n    var closeEl = createCloseEl(closeDelay);\n    snippetEl.appendChild(closeEl);\n  });\n\n  snippetEl.appendChild(watermarksEl);\n  return snippetEl;\n};\n\nvar postHTMLReturn = function postHTMLReturn(adexpEndpoint, html) {\n  return __WEBPACK_IMPORTED_MODULE_4__frontendlib_utils__[\"request\"](\"POST\", adexpEndpoint + \"/html_return\", {\n    // Don't set the content type to \"application/json\" because that requires\n    // a preflight OPTIONS request (because this is a cross-domain request).\n    \"Content-Type\": \"text/plain\"\n  }, html);\n};\n\nvar getDOMSnapshot = function getDOMSnapshot() {\n  return document.documentElement.outerHTML;\n};\n\n/**\n * Given `adexpEndpoint` (the AdExp host as a `String`), this sends an HTML\n * return after `htmlReturnDelay` ms. Returns a `Promise` that resolves when\n * the HTML return HTTP request is complete.\n */\nvar configureHTMLReturn = function configureHTMLReturn(adexpEndpoint, htmlReturnDelay) {\n  var postHTML = function postHTML() {\n    console.info(\"Returning HTML\");\n    return postHTMLReturn(adexpEndpoint, getDOMSnapshot());\n  };\n\n  if (htmlReturnDelay == null || htmlReturnDelay === 0) {\n    // NOTE(oscar): A delay of 0 ideally should return the DOM before any JS\n    // manipulation, so we capture the state of the DOM immediately.\n    return postHTML();\n  }\n\n  return new Promise(function (resolve, reject) {\n    setTimeout(function () {\n      return postHTML().then(resolve, reject);\n    }, htmlReturnDelay);\n  });\n};\n\n/***/ }),\n/* 37 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export throttle */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return intentionalInteractionCounterFn; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cta__ = __webpack_require__(21);\n\n\nvar throttle = function throttle(f, ms) {\n  var ignore = false;\n\n  return function () {\n    if (ignore) return;\n    f.apply(undefined, arguments);\n    ignore = true;\n    setTimeout(function () {\n      ignore = false;\n    }, ms);\n  };\n};\n\nvar intentionalInteractionCounterFn = function intentionalInteractionCounterFn(minimumInteractions) {\n  /**\n   * InteractionMonitor has somewhat imperfect de-duplication logic for what\n   * counts as a full interaction. It also doesn't account for intentional\n   * interactions. Also note that onInteractionChange() triggers for every\n   * start, drag, and end event.\n   *\n   * For our purposes, we'll use both InteractionMonitor's count and a custom\n   * counter.\n   */\n  var intentionalInteractionsFromMonitor = new Set();\n  var intentionalInteractionCountFromThrottle = 0;\n\n  var countIntentionalInteractionThrottle = throttle(function () {\n    intentionalInteractionCountFromThrottle += 1;\n  },\n  /** Count interactions only once every 0.4 seconds. */\n  400);\n\n  var getCurrentCount = function getCurrentCount() {\n    return Math.min(intentionalInteractionCountFromThrottle, intentionalInteractionsFromMonitor.size);\n  };\n\n  var countIntentionalInteractions = function countIntentionalInteractions(e) {\n    if (Object(__WEBPACK_IMPORTED_MODULE_0__cta__[\"b\" /* isDeadzoneCoord */])({\n      x: e.lastInteraction.startX,\n      y: e.lastInteraction.startY\n    })) {\n      return;\n    }\n    /**\n     * NOTE(oscar): e.cumulativeStats.interactionCount is only incremented for\n     * full interactions (or at least in theory). It also counts deadzone\n     * interactions. Here we use interactionCount to identify which counts are\n     * intentional.\n     */\n    if (e.cumulativeStats.interactionCount > 0 && intentionalInteractionsFromMonitor.size <= minimumInteractions) {\n      intentionalInteractionsFromMonitor.add(e.cumulativeStats.interactionCount);\n    }\n    countIntentionalInteractionThrottle();\n  };\n  return function (e) {\n    countIntentionalInteractions(e);\n    return getCurrentCount();\n  };\n};\n\n/***/ }),\n/* 38 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n/*\n * ClickInteraction is used to connect elements that respond to clicks\n * with the elements that trigger click events. Primarily, this allows\n * dynamic CTAs to respond to click events on click overlays or any\n * other clickthrough element.\n */\n\n// Global state for two-click CTAs.\nvar hasBeenClicked = false;\nvar firstClickHandlers = [];\n\n// Global state for slider CTAs.\nvar SLIDER_COMPLETION_RATIO = 0.7;\nvar sliders = [];\n\nvar setSlideDistance = function setSlideDistance(value) {\n  sliders.forEach(function (_ref) {\n    var sliderSize = _ref.sliderSize,\n        setSlideRatio = _ref.setSlideRatio;\n    return setSlideRatio(value / sliderSize);\n  });\n};\n\nvar getPointerEventX = function getPointerEventX(e) {\n  return (e.changedTouches && e.changedTouches[0] || e.touches && e.touches[0] || e).clientX;\n};\n\nvar ClickInteraction = function () {\n  function ClickInteraction() {\n    _classCallCheck(this, ClickInteraction);\n  }\n\n  _createClass(ClickInteraction, null, [{\n    key: \"captureFirstClick\",\n    value: function captureFirstClick(handleFirstClick) {\n      firstClickHandlers.push(handleFirstClick);\n    }\n  }, {\n    key: \"captureSlideClick\",\n    value: function captureSlideClick(_ref2) {\n      var onCompleted = _ref2.onCompleted,\n          sliderSize = _ref2.sliderSize,\n          setSlideRatio = _ref2.setSlideRatio;\n\n      sliders.push({ onCompleted: onCompleted, sliderSize: sliderSize, setSlideRatio: setSlideRatio });\n    }\n  }, {\n    key: \"addListeners\",\n    value: function addListeners(clickEl, onClickComplete) {\n      clickEl.addEventListener(\"click\", function (e) {\n        if (sliders.length > 0) {\n          return;\n        }\n\n        if (!hasBeenClicked) {\n          hasBeenClicked = true;\n\n          if (firstClickHandlers.length > 0) {\n            firstClickHandlers.forEach(function (handler) {\n              return handler(e);\n            });\n\n            return;\n          }\n        }\n\n        onClickComplete(e);\n      }, true);\n\n      var slideStartPosition = null;\n      __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"on\"](clickEl, {\n        \"mousedown touchstart\": function mousedownTouchstart(e) {\n          slideStartPosition = getPointerEventX(e);\n        },\n        \"mousemove touchmove\": function mousemoveTouchmove(e) {\n          if (slideStartPosition == null) return;\n\n          setSlideDistance(getPointerEventX(e) - slideStartPosition);\n        },\n        \"mouseup mouseleave touchend\": function mouseupMouseleaveTouchend(e) {\n          if (slideStartPosition == null) return;\n\n          var slideDistance = getPointerEventX(e) - slideStartPosition;\n          var completedSliders = sliders.filter(function (_ref3) {\n            var sliderSize = _ref3.sliderSize;\n            return slideDistance > sliderSize * SLIDER_COMPLETION_RATIO;\n          });\n\n          if (completedSliders.length > 0) {\n            completedSliders.forEach(function (_ref4) {\n              var onCompleted = _ref4.onCompleted;\n              return onCompleted();\n            });\n            Promise.resolve(onClickComplete(e)).then(function () {\n              return new Promise(function (resolve) {\n                return setTimeout(resolve, 1000);\n              });\n            }).then(function () {\n              return setSlideDistance(0);\n            });\n          } else {\n            setSlideDistance(0);\n          }\n\n          slideStartPosition = null;\n        }\n      });\n    }\n  }]);\n\n  return ClickInteraction;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (ClickInteraction);\n\n/***/ }),\n/* 39 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addDeadzoneStyles; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\n\n\n/** TODO(oscar): This is a temporary solution to add deadzones to CSPs. */\nvar addDeadzoneStyles = function addDeadzoneStyles() {\n  var el = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"])(\"\\n  <style>\\n    .liftoff-deadzone.deadzone-experiment {\\n      position: absolute;\\n      width: max(50px, min(85px, 11vw));\\n      height: max(50px, min(85px, 11vw));\\n      z-index: 96;\\n    }\\n    .liftoff-deadzone.top-left {\\n      top: 0;\\n      left: 0;\\n    }\\n    .liftoff-deadzone.top-right {\\n      top: 0;\\n      right: 0;\\n    }\\n  </style>\\n  \");\n  document.head.appendChild(el);\n};\n\nvar addDeadzones = function addDeadzones(useExpandedZones) {\n  var rootEl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.body;\n\n  var deadzoneEls = [Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"])(\"<div class=\\\"liftoff-deadzone top-left\\\"></div>\"), Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"])(\"<div class=\\\"liftoff-deadzone top-right\\\"></div>\")];\n  deadzoneEls.forEach(function (el) {\n    if (useExpandedZones) {\n      el.classList.add(\"deadzone-experiment\");\n    }\n    rootEl.appendChild(el);\n  });\n};\n\n/* harmony default export */ __webpack_exports__[\"b\"] = (addDeadzones);\n\n/***/ }),\n/* 40 */,\n/* 41 */,\n/* 42 */,\n/* 43 */,\n/* 44 */,\n/* 45 */,\n/* 46 */,\n/* 47 */,\n/* 48 */,\n/* 49 */,\n/* 50 */,\n/* 51 */,\n/* 52 */,\n/* 53 */,\n/* 54 */,\n/* 55 */,\n/* 56 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getClickTrackingQueryParams; });\n/* unused harmony export constructLiftoffClickURL */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return handleClick; });\n/* unused harmony export _forUnitTestingOnly */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__madlib_logger__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__ = __webpack_require__(0);\n\n\n\n\n\nvar getLiftoffContainerRect = function getLiftoffContainerRect() {\n  // NOTE(Casey): 'liftoff-snippet' might not exist if the creative is not\n  // fully initialized.\n  var containerEl = document.getElementById(\"liftoff-snippet\") || document.body;\n  return containerEl.getBoundingClientRect();\n};\n\nvar getClickTrackingQueryParams = function getClickTrackingQueryParams(allInteractionData) {\n  var _ref = allInteractionData || {},\n      lastInteraction = _ref.lastInteraction,\n      cumulativeStats = _ref.cumulativeStats;\n\n  var containerRect = getLiftoffContainerRect();\n\n  var params = {\n    // Unix timestamp of when the click is sent.\n    ct: Date.now(),\n    // Width of #liftoff-snippet in px.\n    aw: containerRect.width.toFixed(),\n    // Height of #liftoff-snippet in px.\n    ah: containerRect.height.toFixed(),\n    // Whether or not MRAID is supported for this impression, determined\n    // empirically based on the presence/absence of the mraid object.\n    m: __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */].hasSupport(\"mraid\") ? 1 : 0,\n    // Total duration, in ms, that the creative was viewable prior to the\n    // click. This depends on the mraid \"viewableChange\" event, so its\n    // accuracy depends on the exchange's implementation.\n    tv: __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */].getViewableDurationMS()\n  };\n\n  if (lastInteraction == null) {\n    return params;\n  }\n\n  // NOTE(Casey): We see some rare events that do not have x/y coordinates.\n  if (lastInteraction.startX != null) {\n    // The horizontal position of the click in pixels, relative to the\n    // upper-left corner of #liftoff-snippet.\n    params.cx = (lastInteraction.startX - containerRect.left).toFixed();\n  }\n\n  if (lastInteraction.startY != null) {\n    // The vertical position of the click in pixels, relative to the\n    // upper-left corner of #liftoff-snippet.\n    params.cy = (lastInteraction.startY - containerRect.top).toFixed();\n  }\n\n  if (lastInteraction.durationMS != null) {\n    // Duration in milliseconds of the click, as measured by the difference\n    // between timestamps on the start and end events (e.g. touchstart and\n    // touchend).\n    params.dur = lastInteraction.durationMS.toFixed();\n  }\n\n  Object.assign(params, {\n    // The value of Event.isTrusted (see\n    // https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted).\n    it: lastInteraction.isTrusted ? 1 : 0,\n    // Maximum force of the interaction on a 0-100 scale. derived from\n    // Touch.force (for TouchEvents), MouseEvent.webkitForce, or\n    // PointerEvent.pressure.  This may be 0 or have some arbitrary value if\n    // the pointer device/surface doesn't support force/pressure measurement.\n    frc: Math.round(lastInteraction.maxForce * 100),\n    // Maximum area of the screen with which the user interacted in px^2  (e.g.\n    // the area of the screen covered by a finger during a click). May be 0 or\n    // have some arbitrary value if the pointer device/surface doesn't support\n    // area measurement.\n    ar: lastInteraction.maxArea.toFixed(),\n    // Path length traversed from the beginning to the end of the click, in px.\n    d: lastInteraction.distance.toFixed(),\n    // An enum describing the type of pointing device--Mouse, Touch, or other\n    // (e.g. pen/stylus). See the constants defined in `InteractionMonitor`\n    // and the corresponding definitions in rtb.proto.\n    pt: lastInteraction.pointerType,\n    // Total number of distinct interactions detected prior to and including the\n    // click. \"Distinct interactions\" are bounded by start/end events or by\n    // the pointing device leaving the creative.\n    ic: cumulativeStats.interactionCount,\n    // Total path length of all interactions.\n    tid: cumulativeStats.totalDistance.toFixed()\n  });\n\n  return params;\n};\n\n/**\n * Given a baseClickURL (a string), attaches the caller's query\n * parameters provided as an object, and returns a string.\n */\nvar constructLiftoffClickURL = function constructLiftoffClickURL(baseClickURL, queryParams) {\n  return __WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__[\"appendParamObjectToURL\"](baseClickURL, queryParams);\n};\n\n/**\n * Returns a Promise that resolves when the tracking pixel at url is loaded.\n */\nvar pingTrackingURLWithImage = function pingTrackingURLWithImage(url) {\n  return new Promise(function (resolve) {\n    // NOTE(Austin): Image is a the best method here as far as we know because\n    // it's a foolproof way to get a no-cors request and avoid any strange\n    // behavior with XMLHttpRequest. One downside is that Image only tells us\n    // when it's fully loaded, and technically we don't need to wait that long.\n    // We technically only need to wait for the request to send (we don't need\n    // to wait for the response).\n\n    // NOTE(Casey): In some cases (e.g. SKAdNetwork impressions on some\n    // exchanges), we \"force\" a direct clickthrough with a click-tracking URL\n    // that redirects to the MMP and app store. We still use an image tag to\n    // ping Usher and the MMP, but it will generate an error. We still want\n    // to click through in this case.\n\n    // TODO(Casey): Consider alternatives to this (e.g. using an iframe).\n\n    var img = new Image();\n    img.onload = function () {\n      return resolve(url);\n    };\n\n    // TODO(Austin): Investigate if there are errors here that should be\n    // rejected.\n    img.onerror = function () {\n      return resolve(url);\n    };\n    img.src = url;\n  }).catch(function (e) {\n    __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"clicktracking_img_error\", e || {});\n  });\n};\n\n/**\n * pingTrackingURLWithBeacon sends a ping using the beacon API,\n * which guarantees that the url will be reached before the page is disposed.\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API\n */\nvar pingTrackingURLWithBeacon = function pingTrackingURLWithBeacon(url) {\n  return new Promise(function (resolve, reject) {\n    if (navigator.sendBeacon(url)) {\n      resolve();\n    } else {\n      reject();\n    }\n  });\n};\n\n/**\n * NOTE(Casey): When the return_js=true query param is attached to an Usher URL,\n * Usher will return a JavaScript file containing\n * '_loOpen(\"{{HTTP_REDIRECT_URL}}\")'. For unknown reasons, this\n * method for fetching the redirect URL works better than fetching it via XHR,\n * possibly due to CORS restrictions. See\n * https://docs.google.com/document/d/1nzlGVs9HNSY_Wd29UzoZSx1luZIwufl6yiQ8AXol7cU/\n */\nvar clickthroughWithScriptTag = function clickthroughWithScriptTag(_ref2) {\n  var clickthroughURL = _ref2.clickthroughURL,\n      platform = _ref2.platform,\n      exchange = _ref2.exchange,\n      _ref2$abTests = _ref2.abTests,\n      abTests = _ref2$abTests === undefined ? [] : _ref2$abTests,\n      _ref2$onlyMraid = _ref2.onlyMraid,\n      onlyMraid = _ref2$onlyMraid === undefined ? false : _ref2$onlyMraid;\n\n  window._loOpen = function (clickURL) {\n    return (\n      // We assume the url returned is never a liftoff url.\n      __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */].open(clickURL, {\n        platform: platform,\n        exchange: exchange,\n        abTests: abTests,\n        isLiftoffURL: false,\n        onlyMraid: onlyMraid\n      })\n    );\n  };\n  return new Promise(function (resolve) {\n    var script = document.createElement(\"script\");\n    script.onload = resolve;\n    script.onerror = function (e) {\n      __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"click_script_error\", e || {});\n    };\n    script.src = __WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__[\"appendParamObjectToURL\"](clickthroughURL, {\n      return_js: true\n    });\n    document.body.appendChild(script);\n  }).catch(function (e) {\n    __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"clickthrough_error\", e || {});\n  });\n};\n\n/**\n * Returns true if clickTrackingURL (an object like { url, type }) is a Liftoff\n * click tracking URL.\n */\nvar isLiftoffClickTrackingURL = function isLiftoffClickTrackingURL(clickTrackingURL) {\n  return clickTrackingURL.type === __WEBPACK_IMPORTED_MODULE_2__constants__[\"w\" /* CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT */];\n};\n\n/**\n * Prepares and pings a clickTrackingURL (an object like { url, type }); common\n * Liftoff query parameters and the caller's queryParams are attached only to\n * Liftoff clickTrackingURLs.\n */\nvar pingClickTrackingURL = function pingClickTrackingURL(clickTrackingURL, queryParams) {\n  var abTests = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n  var getClickTrackingURLString = function getClickTrackingURLString(trackingMethod) {\n    // NOTE(Austin): Right now we should only have \"liftoff\" click tracking\n    // URLs (i.e. http://click.liftoff.io/v1/campaign_click/... ).\n    return isLiftoffClickTrackingURL(clickTrackingURL) ? constructLiftoffClickURL(clickTrackingURL.url, Object.assign({}, queryParams, {\n      tracking_method: trackingMethod\n    })) : clickTrackingURL.url;\n  };\n\n  // The waterfall of click tracking methods to try (in priority order).\n  // Each object in the array should contain a map with the following\n  // keys:\n  // - method: The tracking method integer, as described in rtb.proto\n  //           TrackingMethod.\n  // - canUse: Whether the method should be tried.\n  // - pingFn: The function to ping that takes a URL string and returns a\n  //           promise.\n  var clickTrackingWaterfall = [{\n    method: __WEBPACK_IMPORTED_MODULE_2__constants__[\"G\" /* TRACKING_METHOD_BEACON */],\n    canUse: abTests != null && abTests.includes(\"madlib-beacon-ping-experiment\") && isLiftoffClickTrackingURL(clickTrackingURL) && navigator.sendBeacon != null,\n    pingFn: pingTrackingURLWithBeacon\n  }, {\n    method: __WEBPACK_IMPORTED_MODULE_2__constants__[\"H\" /* TRACKING_METHOD_IMAGE */],\n    canUse: true,\n    pingFn: pingTrackingURLWithImage\n  }];\n\n  // Chain all promises to try each click tracking method. If the\n  // method at the previous index returns a rejected promise,\n  // we try the next; otherwise we return. If we reach the end without\n  // any methods succeeding, this method returns a rejected promise.\n  return clickTrackingWaterfall.filter(function (_ref3) {\n    var canUse = _ref3.canUse;\n    return canUse;\n  }).reduce(function (prevPromiseFn, nextWaterfallOption) {\n    return function () {\n      var method = nextWaterfallOption.method,\n          pingFn = nextWaterfallOption.pingFn;\n\n      var urlString = getClickTrackingURLString(method);\n      return prevPromiseFn().catch(function () {\n        return pingFn(urlString);\n      });\n    };\n  }, function () {\n    return Promise.reject();\n  })();\n};\n\nvar handleClickTracking = function handleClickTracking(clickTrackingURLs, queryParams) {\n  var abTests = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n  return new Promise(function (resolve) {\n    var pingCompletePromises = clickTrackingURLs.map(function (clickTrackingURL) {\n      return pingClickTrackingURL(clickTrackingURL, queryParams, abTests);\n    });\n\n    Promise.all(pingCompletePromises).then(resolve);\n  }).catch(function (e) {\n    __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"clicktracking_error\", e || {});\n  });\n};\n\nvar isLiftoffClickthroughURL = function isLiftoffClickthroughURL(clickthroughURL) {\n  return clickthroughURL.type === __WEBPACK_IMPORTED_MODULE_2__constants__[\"k\" /* CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT */];\n};\n\n/**\n * Opens a clickthrough URL (object like { url, type }) using the best method\n * for the given context (platform, isReengagement).\n */\nvar handleClickthrough = function handleClickthrough(_ref4) {\n  var clickthroughURL = _ref4.clickthroughURL,\n      queryParams = _ref4.queryParams,\n      exchange = _ref4.exchange,\n      platform = _ref4.platform,\n      isReengagement = _ref4.isReengagement,\n      _ref4$abTests = _ref4.abTests,\n      abTests = _ref4$abTests === undefined ? [] : _ref4$abTests;\n\n  /**\n   * NOTE(oscar): As of it 2022-10-31, we only want to use MRAID for iOS POD.\n   * The main reason for this is because we want to guarantee that:\n   *\n   * 1. SKStoreProductViewController (i.e. App Store overlay) is used. This\n   * assumes mraid is needed for this.\n   * 2. The click waterfall does not also open the App Store. This is an issue\n   * we've seen with AppLovin, but it may affect other exchanges.\n   */\n  var isAutoclick = !!queryParams.pv;\n\n  return new Promise(function (resolve) {\n    var isLiftoffURL = isLiftoffClickthroughURL(clickthroughURL);\n    var urlStr = isLiftoffURL ? constructLiftoffClickURL(clickthroughURL.url, queryParams) : clickthroughURL.url;\n\n    if (queryParams.mac || queryParams.dap) {\n      // The method name here is pingClickTrackingURL we do ping clickthrough\n      // URL here as this is a background click.\n      pingClickTrackingURL(clickthroughURL, queryParams, abTests);\n    } else {\n      /**\n       * NOTE(Casey): On Android, script tag clicks perform better than redirect\n       * clicks, while on iOS the opposite is true. However, for reengagement on\n       * iOS, trackers may use \"universal links\", which are special web pages that\n       * deeplink to an app or redirect to the app store. These links historically\n       * have not worked with redirects, so we fetch the link and send the user\n       * directly.\n       * NOTE(Polly): We append a suffix to certain fyber clickthrough urls when\n       * the native browser should be opened upon a click. We should not use the\n       * script tag when the \"FYBER_OPEN_BROWSER\" suffix is present in the url.\n       * TODO(Casey): Test if we can now redirect to universal links on iOS\n       * (we have been told that this may have been fixed).\n       */\n      if (isLiftoffURL && (platform === __WEBPACK_IMPORTED_MODULE_2__constants__[\"E\" /* PLATFORM_ANDROID */] || isReengagement) && !urlStr.includes(\"FYBER_OPEN_BROWSER\")) {\n        return clickthroughWithScriptTag({\n          clickthroughURL: urlStr,\n          platform: platform,\n          exchange: exchange,\n          abTests: abTests\n        });\n      }\n\n      __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */].open(urlStr, {\n        exchange: exchange,\n        platform: platform,\n        abTests: abTests,\n        isLiftoffURL: isLiftoffURL,\n        isAutoclick: isAutoclick\n      });\n    }\n\n    resolve();\n  }).catch(function (e) {\n    __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"clickthrough_error\", e || {});\n  });\n};\n\n/**\n * Given clickConfig, an object like:\n *\n *   {\n *     clickthroughURL: { url, type },\n *     clickTrackingURLs: [{ url, type }, { url, type }, ...],\n *   }\n *\n * prepares all URLs as appropriate based on type, pings tracking URLs, and\n * opens the click URL using the optimal method for a given context\n * (isReengagement, platform).\n */\nvar handleClick = function handleClick(_ref5) {\n  var clickConfig = _ref5.clickConfig,\n      queryParams = _ref5.queryParams,\n      isReengagement = _ref5.isReengagement,\n      platform = _ref5.platform,\n      exchange = _ref5.exchange,\n      _ref5$abTests = _ref5.abTests,\n      abTests = _ref5$abTests === undefined ? null : _ref5$abTests;\n\n  // NOTE(oscar): Some exchanges wrap our URLs in order to track their\n  // metrics. We perform an asynchronous ping to this link while redirecting\n  // users to our actual link to reduce latency.\n\n  // TODO(Casey): Determine if we can move the exchange ping URL into\n  // clickTrackingURLs and handle along with our own tracking URLs.\n  var exchangePingElem = document.getElementById(\"exchange-ping-url\");\n\n  if (exchangePingElem != null && exchangePingElem.href != null) {\n    __WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__[\"ping\"](exchangePingElem.href);\n  }\n\n  var clickthroughURL = clickConfig.clickthroughURL,\n      clickTrackingURLs = clickConfig.clickTrackingURLs;\n\n\n  var clickthroughParams = {\n    clickthroughURL: clickthroughURL,\n    queryParams: queryParams,\n    platform: platform,\n    isReengagement: isReengagement,\n    exchange: exchange,\n    abTests: abTests\n  };\n  /**\n   * Handles both clicktracking and clickthrough.\n   *\n   * NOTE(Austin): We are testing waiting for the exchange ping to see if there\n   * is some race condition.\n   *\n   * TODO(Austin): Consolidate rejected promises and log errors here.\n   */\n  var doFullClick = function doFullClick() {\n    /** Product View clicks are not tracked. */\n    var promise = Promise.resolve();\n    if (!queryParams.pv) {\n      promise = handleClickTracking(clickTrackingURLs, queryParams, abTests);\n    }\n\n    return promise.then(function () {\n      return handleClickthrough(clickthroughParams);\n    });\n  };\n\n  return doFullClick();\n};\n\nvar _forUnitTestingOnly = {\n  pingTrackingURLWithImage: pingTrackingURLWithImage,\n  isLiftoffClickTrackingURL: isLiftoffClickTrackingURL,\n  pingClickTrackingURL: pingClickTrackingURL,\n  handleClickTracking: handleClickTracking,\n  isLiftoffClickthroughURL: isLiftoffClickthroughURL,\n  clickthroughWithScriptTag: clickthroughWithScriptTag,\n  handleClickthrough: handleClickthrough,\n  // We re-export LiftoffMRAID for unit testing to ensure that tests and the\n  // functions in this file refer to the identical LiftoffMRAID object.\n  LiftoffMRAID: __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */]\n};\n\n/***/ }),\n/* 57 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return InteractionMonitor; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__ = __webpack_require__(0);\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * This includes classes for tracking interactions with creatives. The data\n * they collect are attached as query parameters to clicks (the last\n * interaction prior to a click is assumed to be the click itself).\n *\n * We listen for all three possible types of events (MouseEvents,\n * PointerEvents, and TouchEvents), because 1) device capabilities differ, so\n * different events may fire on different devices, and 2) some third-party\n * creatives block propagation of some events such that later events do not\n * fire (e.g. if they stop propagation of a PointerEvent, then the\n * corresponding TouchEvent will not fire). However, we collect data from\n * only one type of event in the following order of priority: 1) touch,\n * 2) pointer, 3) mouse (e.g. we only collect pointer data if we're not\n * receiving touch events).\n *\n * We somewhat arbitrarily define interactions as starting and ending at\n * the window's boundaries (i.e. if the user moves over a path that leaves\n * and then re-enters window, this would count as two interactions: one ends\n * when their finger leaves the window, and another one starts when it\n * re-enters the window).\n */\n\n\nvar POINTER_TYPE_TOUCH = 1;\nvar POINTER_TYPE_MOUSE = 2;\n// POINTER_TYPE_POINTER is a catch-all for anything other than touch or mouse.\nvar POINTER_TYPE_POINTER = 3;\n\n/**\n * Returns the pointer type of a PointerEvent.\n */\nvar getPointerEventPointerType = function getPointerEventPointerType(pointerEvent) {\n  switch (pointerEvent.pointerType) {\n    case \"mouse\":\n      return POINTER_TYPE_MOUSE;\n    case \"touch\":\n      return POINTER_TYPE_TOUCH;\n    default:\n      return POINTER_TYPE_POINTER;\n  }\n};\n\n/**\n * Given a MouseEvent or a PointerEvent, returns true iff a device button\n * is pressed (returns false if this cannot be determined from the event).\n */\nvar isButtonPressed = function isButtonPressed(e) {\n  // e.which is a non-standard fallback for old versions of Safari.\n  var buttons = e.buttons != null ? e.buttons : e.which;\n  return buttons != null && buttons !== 0;\n};\n\n/** Returns the linear distance between (startX, startY) and (endX, endY). */\nvar computeDistance = function computeDistance(startX, startY, endX, endY) {\n  return Math.sqrt(Math.pow(startX - endX, 2) + Math.pow(startY - endY, 2));\n};\n\n/**\n * Returns true iff the given TouchEvent has some touch-point within the bounds\n * of the window.\n */\nvar isTouchInWindow = function isTouchInWindow(e) {\n  return [].concat(_toConsumableArray(e.changedTouches)).some(function (touch) {\n    var clientX = touch.clientX,\n        clientY = touch.clientY;\n\n    return clientX >= 0 && clientX <= window.innerWidth && clientY >= 0 && clientY <= window.innerHeight;\n  });\n};\n\n/**\n * Returns the maximum force of all touches in a TouchEvent, or 0 if force\n * information is not available.\n */\nvar maxTouchEventForce = function maxTouchEventForce(e) {\n  var touchForces = [].concat(_toConsumableArray(e.changedTouches), _toConsumableArray(e.touches)).map(function (touch) {\n    return touch.force || 0;\n  });\n\n  return Math.max.apply(Math, [0].concat(_toConsumableArray(touchForces)));\n};\n\n/**\n * Returns the total touch area of a TouchEvent, or 0 if touch area is not\n * available.\n */\nvar touchEventArea = function touchEventArea(e) {\n  return [].concat(_toConsumableArray(e.touches)).reduce(function (sum, touch) {\n    var radiusX = touch.radiusX,\n        radiusY = touch.radiusY;\n\n    var area = radiusX == null || radiusY == null ? 0 : Math.PI * radiusX * radiusY;\n    return sum + area;\n  }, 0);\n};\n\nvar Interaction = function () {\n  function Interaction(startEvent) {\n    _classCallCheck(this, Interaction);\n\n    this._startEvent = startEvent;\n    this._lastMoveEvent = null;\n    this._endEvent = null;\n    this._maxForce = startEvent.force;\n    this._maxArea = startEvent.area;\n    this._totalDistance = 0;\n  }\n\n  _createClass(Interaction, [{\n    key: \"setEndEvent\",\n    value: function setEndEvent(endEvent) {\n      this._updateMetrics(endEvent);\n      this._endEvent = endEvent;\n    }\n  }, {\n    key: \"setLastMoveEvent\",\n    value: function setLastMoveEvent(moveEvent) {\n      this._updateMetrics(moveEvent);\n      this._lastMoveEvent = moveEvent;\n    }\n  }, {\n    key: \"isInProgress\",\n    value: function isInProgress() {\n      return this._startEvent != null && this._endEvent == null;\n    }\n  }, {\n    key: \"isComplete\",\n    value: function isComplete() {\n      return this._startEvent != null && this._endEvent != null;\n    }\n  }, {\n    key: \"getMetrics\",\n    value: function getMetrics() {\n      var metrics = {\n        startX: this._startEvent.x,\n        startY: this._startEvent.y,\n        isTrusted: this._startEvent.isTrusted,\n        maxForce: this._maxForce,\n        maxArea: this._maxArea,\n        distance: this._totalDistance,\n        pointerType: this._startEvent.pointerType\n        // Omit durationMS because a null duration is different\n        // than a duration of 0, it's important to distinguish the two.\n        // The nullable value is allowed by the rtb.proto.Click object.\n      };\n\n      if (this.isComplete()) {\n        // Add data that requires the interaction to be complete,\n        // (i.e. has a end event).\n        Object.assign(metrics, {\n          durationMS: this._endEvent.timestamp - this._startEvent.timestamp\n        });\n      }\n\n      return metrics;\n    }\n  }, {\n    key: \"_updateMetrics\",\n    value: function _updateMetrics(newEvent) {\n      this._maxForce = Math.max(this._maxForce, newEvent.force);\n      this._lastMaxArea = Math.max(this._maxArea, newEvent.area);\n\n      var lastEvent = this._lastMoveEvent || this._startEvent;\n      this._totalDistance += computeDistance(lastEvent.x, lastEvent.y, newEvent.x, newEvent.y);\n    }\n  }]);\n\n  return Interaction;\n}();\n\n/**\n * This is an abstract base class for monitoring interaction events. Concrete\n * subclasses must define two methods:\n *\n * 1) _attachEventListeners: this must attach the relevant listeners to the\n * window and call _handleStartEvent, _handleEndEvent, and _handleMoveEvent\n * with the proper raw event.\n * 2) _normalizeEvent: this must take a raw event of the relevant type and\n * return a \"normalized event\" (an object like { x, y, isTrusted, timestamp,\n * force, area, pointerType }.\n */\n\n\nvar InteractionEventMonitor = function () {\n  // #if process.env.NODE_ENV === \"test\"\n  //   destroy() {\n  //     this._attachedEventListeners.forEach(\n  //       ({ eventName, handler, listenerOptions }) => {\n  //         window.removeEventListener(eventName, handler, listenerOptions);\n  //       }\n  //     );\n  //     this._attachedEventListeners = [];\n  //   }\n  // #endif\n\n  function InteractionEventMonitor() {\n    _classCallCheck(this, InteractionEventMonitor);\n\n    this._interactionCount = 0;\n    this._totalInteractionDistance = 0;\n    this._lastInteraction = null;\n    this._interactionStartHandlers = [];\n    this._interactionEndHandlers = [];\n    this._attachedEventListeners = [];\n    this._attachEventListeners();\n  }\n\n  _createClass(InteractionEventMonitor, [{\n    key: \"listenFor\",\n    value: function listenFor(eventName, handler) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      var listenerOptions = Object.assign({\n        // NOTE(Austin): By default, it's absolutely critical we capture events\n        // as they bubble down so we have interaction data before developers\n        // presumably call our `Liftoff.open` method in an event listener handler.\n        capture: true\n      }, options);\n      this._attachedEventListeners.push({\n        eventName: eventName,\n        handler: handler,\n        listenerOptions: listenerOptions\n      });\n      window.addEventListener(eventName, handler, listenerOptions);\n    }\n  }, {\n    key: \"onInteractionStart\",\n    value: function onInteractionStart(handlerFn) {\n      if (this._interactionStartHandlers.includes(handlerFn)) {\n        return;\n      }\n\n      this._interactionStartHandlers.push(handlerFn);\n    }\n  }, {\n    key: \"_handleStartEvent\",\n    value: function _handleStartEvent(e) {\n      if (this.isInteractionInProgress()) {\n        // This could occur if another interaction starts before another one\n        // completes (e.g. in the case of multiple pointer devices) or if the\n        // device fires multiple 'start' events in some cases (e.g. firing\n        // \"pointerover\" and then \"pointerdown\" for touch events).\n        return;\n      }\n\n      var normalizedEvent = this._normalizeEvent(e);\n      this._lastInteraction = new Interaction(normalizedEvent);\n      this._interactionStartHandlers.forEach(function (handler) {\n        return handler();\n      });\n    }\n  }, {\n    key: \"onInteractionEnd\",\n    value: function onInteractionEnd(handlerFn) {\n      if (this._interactionEndHandlers.includes(handlerFn)) {\n        return;\n      }\n\n      this._interactionEndHandlers.push(handlerFn);\n    }\n  }, {\n    key: \"_handleEndEvent\",\n    value: function _handleEndEvent(e) {\n      if (!this.isInteractionInProgress()) {\n        return;\n      }\n      var normalizedEvent = this._normalizeEvent(e);\n      this._lastInteraction.setEndEvent(normalizedEvent);\n\n      this._updateCumulativeInteractionStats();\n      this._interactionEndHandlers.forEach(function (handler) {\n        return handler();\n      });\n    }\n  }, {\n    key: \"_handleMoveEvent\",\n    value: function _handleMoveEvent(e) {\n      if (!this.isInteractionInProgress()) {\n        return;\n      }\n\n      var normalizedEvent = this._normalizeEvent(e);\n      this._lastInteraction.setLastMoveEvent(normalizedEvent);\n    }\n  }, {\n    key: \"isInteractionInProgress\",\n    value: function isInteractionInProgress() {\n      return this._lastInteraction != null && this._lastInteraction.isInProgress();\n    }\n  }, {\n    key: \"isLastInteractionComplete\",\n    value: function isLastInteractionComplete() {\n      return this._lastInteraction != null && this._lastInteraction.isComplete();\n    }\n  }, {\n    key: \"getLastInteractionData\",\n    value: function getLastInteractionData() {\n      return this._lastInteraction && this._lastInteraction.getMetrics();\n    }\n  }, {\n    key: \"getAllInteractionData\",\n    value: function getAllInteractionData() {\n      return {\n        lastInteraction: this.getLastInteractionData(),\n        cumulativeStats: this.getCumulativeInteractionStats()\n      };\n    }\n  }, {\n    key: \"_updateCumulativeInteractionStats\",\n    value: function _updateCumulativeInteractionStats() {\n      this._interactionCount += 1;\n      this._totalInteractionDistance += this._lastInteraction.getMetrics().distance;\n    }\n  }, {\n    key: \"getCumulativeInteractionStats\",\n    value: function getCumulativeInteractionStats() {\n      return {\n        interactionCount: this._interactionCount,\n        totalDistance: this._totalInteractionDistance\n      };\n    }\n  }, {\n    key: \"_normalizeEvent\",\n    value: function _normalizeEvent(_) {\n      throw new Error(\"_normalizeEvent must be implemented by a concrete subclass\");\n    }\n  }, {\n    key: \"_attachEventListeners\",\n    value: function _attachEventListeners() {\n      throw new Error(\"_attachEventListeners must be implemented by a concrete subclass\");\n    }\n  }]);\n\n  return InteractionEventMonitor;\n}();\n\nvar MouseEventMonitor = function (_InteractionEventMoni) {\n  _inherits(MouseEventMonitor, _InteractionEventMoni);\n\n  function MouseEventMonitor() {\n    _classCallCheck(this, MouseEventMonitor);\n\n    return _possibleConstructorReturn(this, (MouseEventMonitor.__proto__ || Object.getPrototypeOf(MouseEventMonitor)).call(this));\n  }\n\n  _createClass(MouseEventMonitor, [{\n    key: \"_normalizeEvent\",\n    value: function _normalizeEvent(e) {\n      return {\n        x: e.pageX,\n        y: e.pageY,\n        isTrusted: e.isTrusted,\n        timestamp: e.timeStamp,\n        // NOTE(Casey): MouseEvent.webkitForce is non-standard, but we collect\n        // it if it's available anyway.\n        force: e.webkitForce || 0,\n        area: 0,\n        pointerType: POINTER_TYPE_MOUSE\n      };\n    }\n  }, {\n    key: \"_attachEventListeners\",\n    value: function _attachEventListeners() {\n      var _this2 = this;\n\n      _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mousedown\", function (e) {\n        return _this2._handleStartEvent(e);\n      });\n      _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mouseover\", function (e) {\n        if (!isButtonPressed(e)) return;\n        _this2._handleStartEvent(e);\n      });\n      _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mouseup\", function (e) {\n        return _this2._handleEndEvent(e);\n      });\n      _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mouseout\", function (e) {\n        if (!isButtonPressed(e)) return;\n        _this2._handleEndEvent(e);\n      });\n      _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mousemove\", function (e) {\n        if (!isButtonPressed(e)) return;\n        _this2._handleMoveEvent(e);\n      });\n    }\n  }]);\n\n  return MouseEventMonitor;\n}(InteractionEventMonitor);\n\nvar PointerEventMonitor = function (_InteractionEventMoni2) {\n  _inherits(PointerEventMonitor, _InteractionEventMoni2);\n\n  function PointerEventMonitor() {\n    _classCallCheck(this, PointerEventMonitor);\n\n    return _possibleConstructorReturn(this, (PointerEventMonitor.__proto__ || Object.getPrototypeOf(PointerEventMonitor)).call(this));\n  }\n\n  _createClass(PointerEventMonitor, [{\n    key: \"_normalizeEvent\",\n    value: function _normalizeEvent(e) {\n      return {\n        x: e.pageX,\n        y: e.pageY,\n        isTrusted: e.isTrusted,\n        timestamp: e.timeStamp,\n        force: e.pressure,\n        // NOTE(Casey): We consider pointer area as an ellipse for consistency\n        // with touch events.\n        area: Math.PI * e.width * e.height / 4,\n        pointerType: getPointerEventPointerType(e)\n      };\n    }\n  }, {\n    key: \"_attachEventListeners\",\n    value: function _attachEventListeners() {\n      var _this4 = this;\n\n      _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointerdown\", function (e) {\n        return _this4._handleStartEvent(e);\n      });\n      _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointerover\", function (e) {\n        if (!isButtonPressed(e)) return;\n        _this4._handleStartEvent(e);\n      });\n      _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointerup\", function (e) {\n        return _this4._handleEndEvent(e);\n      });\n      _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointercancel\", function (e) {\n        return _this4._handleEndEvent(e);\n      });\n      _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointerout\", function (e) {\n        if (!isButtonPressed(e)) return;\n        _this4._handleEndEvent(e);\n      });\n      _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointermove\", function (e) {\n        if (!isButtonPressed(e)) return;\n        _this4._handleMoveEvent(e);\n      });\n    }\n  }]);\n\n  return PointerEventMonitor;\n}(InteractionEventMonitor);\n\nvar TouchEventMonitor = function (_InteractionEventMoni3) {\n  _inherits(TouchEventMonitor, _InteractionEventMoni3);\n\n  function TouchEventMonitor() {\n    _classCallCheck(this, TouchEventMonitor);\n\n    return _possibleConstructorReturn(this, (TouchEventMonitor.__proto__ || Object.getPrototypeOf(TouchEventMonitor)).call(this));\n  }\n\n  _createClass(TouchEventMonitor, [{\n    key: \"_normalizeEvent\",\n    value: function _normalizeEvent(e) {\n      return {\n        // NOTE(Casey): We arbitrarily choose a changed touch to use for the\n        // interaction position, making distance measures inaccurate for multi-\n        // touch interactions.\n        x: e.changedTouches[0].pageX,\n        y: e.changedTouches[0].pageY,\n        isTrusted: e.isTrusted,\n        timestamp: e.timeStamp,\n        force: maxTouchEventForce(e),\n        area: touchEventArea(e),\n        pointerType: POINTER_TYPE_TOUCH\n      };\n    }\n  }, {\n    key: \"_attachEventListeners\",\n    value: function _attachEventListeners() {\n      var _this6 = this;\n\n      _get(TouchEventMonitor.prototype.__proto__ || Object.getPrototypeOf(TouchEventMonitor.prototype), \"listenFor\", this).call(this, \"touchstart\", function (e) {\n        return _this6._handleStartEvent(e);\n      });\n      _get(TouchEventMonitor.prototype.__proto__ || Object.getPrototypeOf(TouchEventMonitor.prototype), \"listenFor\", this).call(this, \"touchend\", function (e) {\n        if (e.touches.length !== 0) return;\n        _this6._handleEndEvent(e);\n      });\n      _get(TouchEventMonitor.prototype.__proto__ || Object.getPrototypeOf(TouchEventMonitor.prototype), \"listenFor\", this).call(this, \"touchcancel\", function (e) {\n        return _this6._handleEndEvent(e);\n      });\n      _get(TouchEventMonitor.prototype.__proto__ || Object.getPrototypeOf(TouchEventMonitor.prototype), \"listenFor\", this).call(this, \"touchmove\", function (e) {\n        // NOTE(Casey): There are no touch events analogous to\n        // mouseover/pointerover and mouseout/pointerout, so we check if the touch\n        // is within the window during move events instead.\n        var isInWindow = isTouchInWindow(e);\n        if (!isInWindow && _this6.isInteractionInProgress()) {\n          // The touch started inside the window and has now moved outside of it.\n          _this6._handleEndEvent(e);\n        } else if (isInWindow && _this6.isLastInteractionComplete()) {\n          // The touch started outside of the window and moved into the window,\n          // so we need to start tracking a new interaction.\n          _this6._handleStartEvent(e);\n        } else {\n          // This event is part of the interaction we're currently tracking.\n          _this6._handleMoveEvent(e);\n        }\n      });\n    }\n  }]);\n\n  return TouchEventMonitor;\n}(InteractionEventMonitor);\n\nvar InteractionMonitor = function () {\n  // #if process.env.NODE_ENV === \"test\"\n  //   destroy() {\n  //     this._monitors.forEach((monitor) => {\n  //       monitor.destroy();\n  //     });\n  //     this._monitors = [];\n  //   }\n  // #endif\n\n  function InteractionMonitor() {\n    var _this7 = this;\n\n    _classCallCheck(this, InteractionMonitor);\n\n    // These events are ordered by priority, from highest to lowest.\n    this._monitors = [new TouchEventMonitor(), new PointerEventMonitor(), new MouseEventMonitor()];\n\n    this._monitors.forEach(function (monitor) {\n      monitor.onInteractionStart(_this7._handleInteractionEvent.bind(_this7));\n    });\n    this._monitors.forEach(function (monitor) {\n      monitor.onInteractionEnd(_this7._handleInteractionEvent.bind(_this7));\n    });\n\n    this._previousAllInteractionData = null;\n    this._interactionChangeHandlers = [];\n  }\n\n  /**\n   * Given a function that will receive an object like that returned by\n   * getAllInteractionData, sets up listeners so that handlerFn will be called\n   * whenever any interaction data change.\n   */\n\n\n  _createClass(InteractionMonitor, [{\n    key: \"onInteractionChange\",\n    value: function onInteractionChange(handlerFn) {\n      if (this._interactionChangeHandlers.includes(handlerFn)) {\n        return;\n      }\n\n      this._interactionChangeHandlers.push(handlerFn);\n    }\n  }, {\n    key: \"_handleInteractionEvent\",\n    value: function _handleInteractionEvent() {\n      var currentAllInteractionData = this.getAllInteractionData();\n      if (Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"deepEqual\"])(this._previousAllInteractionData, currentAllInteractionData)) {\n        return;\n      }\n\n      this._previousAllInteractionData = currentAllInteractionData;\n      this._interactionChangeHandlers.forEach(function (handler) {\n        handler(currentAllInteractionData);\n      });\n    }\n  }, {\n    key: \"_chooseEventMonitorWithInProgressInteractions\",\n    value: function _chooseEventMonitorWithInProgressInteractions() {\n      return this._monitors.find(function (eventMonitor) {\n        return eventMonitor.isInteractionInProgress();\n      });\n    }\n  }, {\n    key: \"_chooseEventMonitorWithCompletedInteractions\",\n    value: function _chooseEventMonitorWithCompletedInteractions() {\n      return this._monitors.find(function (eventMonitor) {\n        return eventMonitor.isLastInteractionComplete();\n      });\n    }\n  }, {\n    key: \"_chooseEventMonitor\",\n    value: function _chooseEventMonitor() {\n      // Since this class is used by in-house and third-party creatives\n      // we prioritize partial interactions (i.e. clickthrough events\n      // that fire before the touchEnd/clickEnd/etc. fires).\n      return this._chooseEventMonitorWithInProgressInteractions() || this._chooseEventMonitorWithCompletedInteractions();\n    }\n\n    /**\n     * Returns a map containing the last interaction and the cumulative\n     * statistics. Prefer using this over calling `getLastInteractionData` and\n     * `getCumulativeInteractionStats` separately.\n     */\n\n  }, {\n    key: \"getAllInteractionData\",\n    value: function getAllInteractionData() {\n      var eventMonitor = this._chooseEventMonitor();\n      if (eventMonitor == null) {\n        return null;\n      }\n\n      return eventMonitor.getAllInteractionData();\n    }\n\n    /**\n     * Returns an object like { startX, startY, isTrusted, durationMS, maxForce\n     * maxArea, distance, pointerType } describing the last interaction.\n     */\n\n  }, {\n    key: \"getLastInteractionData\",\n    value: function getLastInteractionData() {\n      var eventMonitor = this._chooseEventMonitor();\n      if (eventMonitor == null) {\n        return null;\n      }\n\n      return eventMonitor.getLastInteractionData();\n    }\n\n    /** Returns an object like { interactionCount, totalDistance }. */\n\n  }, {\n    key: \"getCumulativeInteractionStats\",\n    value: function getCumulativeInteractionStats() {\n      var eventMonitor = this._chooseEventMonitor();\n      if (eventMonitor == null) {\n        return null;\n      }\n\n      return eventMonitor.getCumulativeInteractionStats();\n    }\n  }]);\n\n  return InteractionMonitor;\n}();\n\n\n\n/***/ }),\n/* 58 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__behaviors_AutoclickBehaviorCompletedDelay__ = __webpack_require__(59);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__behaviors_AutoclickBehaviorInteractionCount__ = __webpack_require__(60);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__behaviors_AutoclickBehaviorLastInteraction__ = __webpack_require__(61);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__behaviors_AutoclickBehaviorLastInteractionAndCount__ = __webpack_require__(62);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__behaviors_AutoclickBehaviorLoadDelay__ = __webpack_require__(63);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__behaviors_AutoclickBehaviorViewableDelay__ = __webpack_require__(64);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__behaviors_AutoclickBehaviorViewableDelayWithReset__ = __webpack_require__(65);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _behaviorClasses;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\nvar behaviorClasses = (_behaviorClasses = {}, _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"d\" /* AUTOCLICK_TYPE_COMPLETED_DELAY */], __WEBPACK_IMPORTED_MODULE_1__behaviors_AutoclickBehaviorCompletedDelay__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"e\" /* AUTOCLICK_TYPE_INTERACTION_COUNT */], __WEBPACK_IMPORTED_MODULE_2__behaviors_AutoclickBehaviorInteractionCount__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"f\" /* AUTOCLICK_TYPE_LAST_INTERACTION */], __WEBPACK_IMPORTED_MODULE_3__behaviors_AutoclickBehaviorLastInteraction__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"g\" /* AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT */], __WEBPACK_IMPORTED_MODULE_4__behaviors_AutoclickBehaviorLastInteractionAndCount__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"h\" /* AUTOCLICK_TYPE_LOAD_DELAY */], __WEBPACK_IMPORTED_MODULE_5__behaviors_AutoclickBehaviorLoadDelay__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"i\" /* AUTOCLICK_TYPE_VIEWABLE_DELAY */], __WEBPACK_IMPORTED_MODULE_6__behaviors_AutoclickBehaviorViewableDelay__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"j\" /* AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET */], __WEBPACK_IMPORTED_MODULE_7__behaviors_AutoclickBehaviorViewableDelayWithReset__[\"a\" /* default */]), _behaviorClasses);\n\nvar MONITORED_EVENTS = {\n  INTERACTION_EVENT: \"interactionEvent\",\n  COMPLETED: \"completed\",\n  ENGAGEMENT: \"engagement\",\n  HTML_LOADED: \"htmlLoaded\",\n  VIEWABLE: \"viewable\",\n  VIEWABLE_CHANGE: \"viewableChange\"\n};\n\nvar AUTOCLICK_EVENT_COUNT_CHANGE = \"countChanged\";\n\n/**\n * @callback ClickthroughHandler\n * @param  {object} lastEvent - The last Interaction event.\n */\n\n/**\n * @typedef AutoclickBehaviorConfig\n * @property {string} type - autoclick variant type.\n * @property {number} delay - In ms. Time to wait until opening App Store from\n * autoclick click.\n * @property {number} count - Max occurrences of events as determined by type.\n */\n\n/**\n * Controls App Store On Interaction, aka. autoclick, behavior.\n * @see https://docs.google.com/document/d/1QYHzXt1oxmGIx2F63XErz7dF4SD6pxSi-1mkxxnHsUU/edit#heading=h.bypyxke51ec\n */\n\nvar Autoclick = function () {\n  /**\n   *\n   * @param {AutoclickBehaviorConfig} behavior - Describes the autoclick behavior.\n   * @param {Object} ctx\n   * @param {ClickthroughHandler} ctx.clickthroughHandler\n   * @returns\n   */\n  function Autoclick(behavior, _ref) {\n    var _eventListeners;\n\n    var clickthroughHandler = _ref.clickthroughHandler;\n\n    _classCallCheck(this, Autoclick);\n\n    if (behavior == null) {\n      this.disable();\n      return;\n    }\n    this._clickthroughHandler = clickthroughHandler;\n    this._lastCount = 0;\n    this._lastInteraction = null;\n\n    this._behavior = behavior;\n    var behaviorType = behavior == null ? null : behavior.type;\n    if (behaviorClasses[behaviorType] == null) {\n      console.error(\"Behavior class not found: \" + behaviorType);\n      this.disable();\n      return;\n    }\n    /** @type {AutoclickBehaviorInteractionCount|AutoclickBehaviorCompletedDelay|AutoclickBehaviorLastInteraction|AutoclickBehaviorLastInteractionAndCount} */\n    this.behaviorClass = new behaviorClasses[behaviorType]({\n      autoclick: this,\n      behavior: behavior,\n      delayClickthroughHandler: this._handleDelayClickthrough.bind(this)\n    });\n\n    this._handleDelayClickthrough = this._handleDelayClickthrough.bind(this);\n\n    this.eventListeners = (_eventListeners = {}, _defineProperty(_eventListeners, MONITORED_EVENTS.ENGAGEMENT, [this.behaviorClass.onEngagement.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.HTML_LOADED, [this.behaviorClass.onHtmlLoaded.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.VIEWABLE, [this.behaviorClass.onViewable.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.VIEWABLE_CHANGE, [this.behaviorClass.onViewableChange.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.COMPLETED, [this.behaviorClass.onCompleted.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.INTERACTION_EVENT,\n    // Order matters.\n    [this._recordLastInteraction.bind(this), this.behaviorClass.onInteraction.bind(this.behaviorClass)]), _defineProperty(_eventListeners, AUTOCLICK_EVENT_COUNT_CHANGE, []), _eventListeners);\n  }\n\n  _createClass(Autoclick, [{\n    key: \"disable\",\n    value: function disable() {\n      this.autoclickDisabled = true;\n    }\n  }, {\n    key: \"emitInteractionEvent\",\n    value: function emitInteractionEvent() {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      this.emit.apply(this, [MONITORED_EVENTS.INTERACTION_EVENT].concat(args));\n    }\n  }, {\n    key: \"emitInteractionPromptReachedEvent\",\n    value: function emitInteractionPromptReachedEvent() {\n      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      this.emit.apply(this, [MONITORED_EVENTS.COMPLETED].concat(args));\n    }\n  }, {\n    key: \"emitHtmlLoadedEvent\",\n    value: function emitHtmlLoadedEvent() {\n      for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      this.emit.apply(this, [MONITORED_EVENTS.HTML_LOADED].concat(args));\n    }\n  }, {\n    key: \"emitViewableEvent\",\n    value: function emitViewableEvent() {\n      for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      this.emit.apply(this, [MONITORED_EVENTS.VIEWABLE].concat(args));\n    }\n  }, {\n    key: \"emitViewableChangeEvent\",\n    value: function emitViewableChangeEvent() {\n      for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        args[_key5] = arguments[_key5];\n      }\n\n      this.emit.apply(this, [MONITORED_EVENTS.VIEWABLE_CHANGE].concat(args));\n    }\n  }, {\n    key: \"_recordLastInteraction\",\n    value: function _recordLastInteraction(e) {\n      this._lastInteraction = e;\n    }\n  }, {\n    key: \"_handleDelayClickthrough\",\n    value: function _handleDelayClickthrough(delay) {\n      var _this = this;\n\n      clearTimeout(this._delayTimer);\n      if (this.autoclickDisabled) return;\n\n      this._delayTimer = setTimeout(function () {\n        _this._clickthrough();\n      }, delay || 0);\n    }\n  }, {\n    key: \"_clickthrough\",\n    value: function _clickthrough() {\n      if (this.autoclickDisabled) return;\n      this._clickthroughHandler(this._lastInteraction);\n      this.disable();\n    }\n  }, {\n    key: \"emit\",\n    value: function emit(eventName) {\n      for (var _len6 = arguments.length, args = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {\n        args[_key6 - 1] = arguments[_key6];\n      }\n\n      if (this.autoclickDisabled) return;\n      if (!(eventName in this.eventListeners)) {\n        throw new Error(\"Event \" + eventName + \" not found!\");\n      }\n      this.eventListeners[eventName].forEach(function (f) {\n        f.apply(undefined, args);\n      });\n    }\n  }]);\n\n  return Autoclick;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Autoclick);\n\n/***/ }),\n/* 59 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorCompletedDelay = function (_AutoclickBehaviorAbs) {\n  _inherits(AutoclickBehaviorCompletedDelay, _AutoclickBehaviorAbs);\n\n  function AutoclickBehaviorCompletedDelay() {\n    _classCallCheck(this, AutoclickBehaviorCompletedDelay);\n\n    return _possibleConstructorReturn(this, (AutoclickBehaviorCompletedDelay.__proto__ || Object.getPrototypeOf(AutoclickBehaviorCompletedDelay)).apply(this, arguments));\n  }\n\n  _createClass(AutoclickBehaviorCompletedDelay, [{\n    key: \"onCompleted\",\n    value: function onCompleted() {\n      this.delayClickthrough(this.getBehaviorDelay());\n    }\n  }]);\n\n  return AutoclickBehaviorCompletedDelay;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorCompletedDelay);\n\n/***/ }),\n/* 60 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__autoclick_utils__ = __webpack_require__(37);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nvar AutoclickBehaviorInteractionCount = function (_AutoclickBehaviorAbs) {\n  _inherits(AutoclickBehaviorInteractionCount, _AutoclickBehaviorAbs);\n\n  function AutoclickBehaviorInteractionCount() {\n    _classCallCheck(this, AutoclickBehaviorInteractionCount);\n\n    return _possibleConstructorReturn(this, (AutoclickBehaviorInteractionCount.__proto__ || Object.getPrototypeOf(AutoclickBehaviorInteractionCount)).apply(this, arguments));\n  }\n\n  _createClass(AutoclickBehaviorInteractionCount, [{\n    key: \"init\",\n    value: function init() {\n      this._counter = Object(__WEBPACK_IMPORTED_MODULE_1__autoclick_utils__[\"a\" /* intentionalInteractionCounterFn */])(this.getBehaviorCount());\n      this.triggered = false;\n    }\n  }, {\n    key: \"onInteraction\",\n    value: function onInteraction(e) {\n      this.setCurrentCount(this._counter(e));\n\n      if (!this.isCountReached() || this.triggered) return;\n      this.triggered = true;\n\n      this.delayClickthrough(this.getBehaviorDelay());\n    }\n  }]);\n\n  return AutoclickBehaviorInteractionCount;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorInteractionCount);\n\n/***/ }),\n/* 61 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorLastInteraction = function (_AutoclickBehaviorAbs) {\n  _inherits(AutoclickBehaviorLastInteraction, _AutoclickBehaviorAbs);\n\n  function AutoclickBehaviorLastInteraction() {\n    _classCallCheck(this, AutoclickBehaviorLastInteraction);\n\n    return _possibleConstructorReturn(this, (AutoclickBehaviorLastInteraction.__proto__ || Object.getPrototypeOf(AutoclickBehaviorLastInteraction)).apply(this, arguments));\n  }\n\n  _createClass(AutoclickBehaviorLastInteraction, [{\n    key: \"onInteraction\",\n    value: function onInteraction() {\n      this.delayClickthrough(this.getBehaviorDelay());\n    }\n  }]);\n\n  return AutoclickBehaviorLastInteraction;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorLastInteraction);\n\n/***/ }),\n/* 62 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__autoclick_utils__ = __webpack_require__(37);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nvar AutoclickBehaviorLastInteractionAndCount = function (_AutoclickBehaviorAbs) {\n  _inherits(AutoclickBehaviorLastInteractionAndCount, _AutoclickBehaviorAbs);\n\n  function AutoclickBehaviorLastInteractionAndCount() {\n    _classCallCheck(this, AutoclickBehaviorLastInteractionAndCount);\n\n    return _possibleConstructorReturn(this, (AutoclickBehaviorLastInteractionAndCount.__proto__ || Object.getPrototypeOf(AutoclickBehaviorLastInteractionAndCount)).apply(this, arguments));\n  }\n\n  _createClass(AutoclickBehaviorLastInteractionAndCount, [{\n    key: \"init\",\n    value: function init() {\n      this._counter = Object(__WEBPACK_IMPORTED_MODULE_1__autoclick_utils__[\"a\" /* intentionalInteractionCounterFn */])(this.getBehaviorCount());\n    }\n  }, {\n    key: \"onInteraction\",\n    value: function onInteraction(e) {\n      this.setCurrentCount(this._counter(e));\n\n      this.delayClickthrough(this.getBehaviorDelay());\n    }\n  }]);\n\n  return AutoclickBehaviorLastInteractionAndCount;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorLastInteractionAndCount);\n\n/***/ }),\n/* 63 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorLoadDelay = function (_AutoclickBehaviorAbs) {\n  _inherits(AutoclickBehaviorLoadDelay, _AutoclickBehaviorAbs);\n\n  function AutoclickBehaviorLoadDelay() {\n    _classCallCheck(this, AutoclickBehaviorLoadDelay);\n\n    return _possibleConstructorReturn(this, (AutoclickBehaviorLoadDelay.__proto__ || Object.getPrototypeOf(AutoclickBehaviorLoadDelay)).apply(this, arguments));\n  }\n\n  _createClass(AutoclickBehaviorLoadDelay, [{\n    key: \"onHtmlLoaded\",\n    value: function onHtmlLoaded() {\n      this.delayClickthrough(this.getBehaviorDelay());\n    }\n  }]);\n\n  return AutoclickBehaviorLoadDelay;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorLoadDelay);\n\n/***/ }),\n/* 64 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorViewableDelay = function (_AutoclickBehaviorAbs) {\n  _inherits(AutoclickBehaviorViewableDelay, _AutoclickBehaviorAbs);\n\n  function AutoclickBehaviorViewableDelay() {\n    _classCallCheck(this, AutoclickBehaviorViewableDelay);\n\n    return _possibleConstructorReturn(this, (AutoclickBehaviorViewableDelay.__proto__ || Object.getPrototypeOf(AutoclickBehaviorViewableDelay)).apply(this, arguments));\n  }\n\n  _createClass(AutoclickBehaviorViewableDelay, [{\n    key: \"onViewable\",\n    value: function onViewable() {\n      this.delayClickthrough(this.getBehaviorDelay());\n    }\n  }]);\n\n  return AutoclickBehaviorViewableDelay;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorViewableDelay);\n\n/***/ }),\n/* 65 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorViewableDelay = function (_AutoclickBehaviorAbs) {\n  _inherits(AutoclickBehaviorViewableDelay, _AutoclickBehaviorAbs);\n\n  function AutoclickBehaviorViewableDelay() {\n    _classCallCheck(this, AutoclickBehaviorViewableDelay);\n\n    return _possibleConstructorReturn(this, (AutoclickBehaviorViewableDelay.__proto__ || Object.getPrototypeOf(AutoclickBehaviorViewableDelay)).apply(this, arguments));\n  }\n\n  _createClass(AutoclickBehaviorViewableDelay, [{\n    key: \"onViewable\",\n    value: function onViewable() {\n      this.delayClickthrough(this.getBehaviorDelay());\n    }\n  }, {\n    key: \"onViewableChange\",\n    value: function onViewableChange(isViewable) {\n      if (!isViewable) {\n        clearTimeout(this._autoclick._delayTimer);\n      }\n    }\n  }]);\n\n  return AutoclickBehaviorViewableDelay;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorViewableDelay);\n\n/***/ }),\n/* 66 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__ = __webpack_require__(11);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__ = __webpack_require__(38);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__container__ = __webpack_require__(67);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__cta__ = __webpack_require__(21);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__liftoff_mraid__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__addDeadzones__ = __webpack_require__(39);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\n\n\n\n\n\n\n\n\nvar Madlib = function () {\n  function Madlib() {\n    _classCallCheck(this, Madlib);\n  }\n\n  _createClass(Madlib, null, [{\n    key: \"init\",\n    value: function init() {\n      __WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__[\"a\" /* default */].pubsubify(this);\n\n      this.rootEl = null;\n      this.config = null;\n\n      this.loaded = false;\n      this.containerByID = {};\n      this.allContainers = [];\n      this.rootContainer = null;\n\n      // TODO(vsingh): Remove hacky global once we are more clear on how Madlib resize events should\n      //   be handled.\n      this.didEverApplyLetterboxStyles = false;\n\n      this.productIndex = 0;\n\n      this.on(\"navigation-click\", function (queryParams, clickAreaType) {\n        Liftoff.handleClick(queryParams, clickAreaType);\n      });\n    }\n\n    /**\n     * Returns a product cycling indefinitely.\n     */\n\n  }, {\n    key: \"getNextProduct\",\n    value: function getNextProduct() {\n      var _Liftoff$env$products = Liftoff.env.products,\n          products = _Liftoff$env$products === undefined ? [] : _Liftoff$env$products;\n      var productIndex = this.productIndex;\n\n      this.productIndex += 1;\n\n      return products[productIndex % products.length];\n    }\n  }, {\n    key: \"error\",\n    value: function error() {\n      var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Error(\"Unspecified Madlib error.\");\n\n      Liftoff.handleMadlibError(e);\n    }\n  }, {\n    key: \"load\",\n    value: function load(rootEl, config) {\n      this.rootEl = rootEl;\n      this.config = config;\n      this.applyExchangePolicies();\n      this.loadDOM();\n      this.addEventListeners();\n      this.coordinate();\n      this.layout();\n\n      Liftoff.onLoadCompleted();\n    }\n  }, {\n    key: \"applyExchangePolicies\",\n    value: function applyExchangePolicies() {\n      var animationDurationLimit = Liftoff.getAnimationDurationLimit();\n      if (animationDurationLimit > 0) {\n        setTimeout(function () {\n          Madlib.allContainers.forEach(function (container) {\n            var content = container.content;\n\n            if (content == null) return;\n            container.layout().then(function () {\n              content.stop();\n            });\n          });\n        }, animationDurationLimit);\n      }\n    }\n  }, {\n    key: \"loadDOM\",\n    value: function loadDOM() {\n      var _this = this;\n\n      this.layoutEl = document.createElement(\"div\");\n      this.layoutEl.id = \"liftoff-layout\";\n      this.rootEl.appendChild(this.layoutEl);\n\n      this.clickEl = document.createElement(\"div\");\n      this.clickEl.id = \"liftoff-click\";\n      __WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__[\"a\" /* default */].addListeners(this.clickEl, function (e) {\n        _this.handleNavigationClick(e);\n      });\n      this.rootEl.appendChild(this.clickEl);\n\n      var _Liftoff$bidContext = Liftoff.bidContext,\n          is_interstitial = _Liftoff$bidContext.is_interstitial,\n          is_reengagement = _Liftoff$bidContext.is_reengagement;\n      // TODO(oscar): Cleanup test code once crserve-deadzone experiment is over.\n\n      var isDeadzoneExperiment = Liftoff.hasTestGroup(\"crserve-deadzone-v2-experiment\");\n      var useDeadzones = is_interstitial && (!is_reengagement || isDeadzoneExperiment);\n      if (useDeadzones) {\n        Object(__WEBPACK_IMPORTED_MODULE_7__addDeadzones__[\"b\" /* default */])(isDeadzoneExperiment, this.rootEl);\n      }\n    }\n  }, {\n    key: \"handleNavigationClick\",\n    value: function handleNavigationClick(e) {\n      var queryParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      this.emit(\"navigation-click\", queryParams, Object(__WEBPACK_IMPORTED_MODULE_5__cta__[\"a\" /* clickAreaTypeFromEvent */])(e));\n    }\n  }, {\n    key: \"addEventListeners\",\n    value: function addEventListeners() {\n      var _this2 = this;\n\n      window.addEventListener(\"resize\", function () {\n        _this2.layout();\n      });\n    }\n  }, {\n    key: \"coordinate\",\n    value: function coordinate() {\n      this.on(\"wait\", function (_ref) {\n        var timeMS = _ref.timeMS;\n\n        return new Promise(function (resolve) {\n          return setTimeout(resolve, Number(timeMS));\n        });\n      });\n    }\n  }, {\n    key: \"getEvents\",\n    value: function getEvents() {\n      return [{ name: \"beforeVisible\" }].map(function (e) {\n        e.type = \"madlib\";\n        return e;\n      });\n    }\n  }, {\n    key: \"getActions\",\n    value: function getActions() {\n      return [{\n        name: \"wait\",\n        data: [\"timeMS\"]\n      }].map(function (a) {\n        a.type = \"madlib\";\n        return a;\n      });\n    }\n  }, {\n    key: \"getCreativeConfig\",\n    value: function getCreativeConfig() {\n      // TODO(cory) Implement rendering for multiple scenes. For now, all configs have exactly one scene.\n      return this.config.scenes[0].layoutContent;\n    }\n  }, {\n    key: \"configureLetterbox\",\n    value: function configureLetterbox(letterboxConfig) {\n      var useDarkRootBackground = letterboxConfig.useDarkRootBackground();\n      var useLayoutBackground = letterboxConfig.useLayoutBackground();\n\n      this.rootEl.classList.toggle(\"letterbox-dark-background\", useDarkRootBackground);\n      this.layoutEl.classList.toggle(\"letterbox-layout-background\", useLayoutBackground);\n\n      this.didEverApplyLetterboxStyles = true;\n\n      Object.assign(this.clickEl.style, letterboxConfig.getStyleForClickElement());\n    }\n  }, {\n    key: \"layout\",\n    value: function layout() {\n      var _this3 = this;\n\n      if (this.rootContainer != null) {\n        this.rootContainer.invalidate();\n      }\n\n      this.reset();\n\n      var letterboxConfig = Liftoff.getLetterboxConfig();\n      var rootElementConstraints = null;\n\n      if (letterboxConfig.enabled()) {\n        this.configureLetterbox(letterboxConfig);\n        rootElementConstraints = letterboxConfig.getLetterboxConstraintsForMadlibRootElement();\n      }\n\n      this.parseCreativeConfig(this.layoutEl, this.getCreativeConfig(), rootElementConstraints);\n\n      var allContainers = this.allContainers,\n          rootContainer = this.rootContainer;\n\n\n      var loaded = rootContainer.loadContent().catch(function (e) {\n        return _this3.error(e);\n      });\n\n      var ready = rootContainer.layout().then(function () {\n        __WEBPACK_IMPORTED_MODULE_6__liftoff_mraid__[\"a\" /* default */].onViewable(function () {\n          if (rootContainer.invalidated) return;\n          allContainers.forEach(function (_ref2) {\n            var content = _ref2.content;\n\n            if (content) content.start();\n          });\n        });\n      }).catch(function (e) {\n        return _this3.error(e);\n      });\n\n      Promise.all([loaded, ready]).then(function () {\n        if (!_this3.loaded) {\n          _this3.loaded = true;\n          Liftoff.onMadlibLoaded();\n          _this3.emit(\"beforeVisible\");\n          Liftoff.onFirstLayoutFinished();\n        }\n      });\n    }\n  }, {\n    key: \"reset\",\n    value: function reset() {\n      this.productIndex = 0;\n      // TODO(brian): Teardown existing components here.\n      Liftoff.resetClickParams();\n      this.clickEl.classList.remove(\"active\");\n      Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"empty\"])(this.layoutEl);\n      if (this.didEverApplyLetterboxStyles) {\n        [this.layoutEl, this.clickEl].forEach(function (el) {\n          [\"left\", \"top\", \"width\", \"height\", \"right\", \"bottom\", \"transform\"].forEach(function (prop) {\n            el.style[prop] = \"\";\n          });\n        });\n      }\n    }\n  }, {\n    key: \"parseCreativeConfig\",\n    value: function parseCreativeConfig(rootEl, config, rootElementConstraints) {\n      var _this4 = this;\n\n      var componentParams = config.componentParams;\n\n      var clickTargets = config.clickTargets,\n          constraints = config.constraints,\n          containers = config.containers,\n          coordination = config.coordination,\n          css = config.css;\n\n      var _ref3 = rootElementConstraints || {},\n          rootConstraints = _ref3.rootConstraints,\n          rootPostLayoutTransform = _ref3.rootPostLayoutTransform;\n\n      var traverse = function traverse(parent, _ref4) {\n        var id = _ref4.id,\n            children = _ref4.children;\n\n        var container = new __WEBPACK_IMPORTED_MODULE_4__container__[\"a\" /* default */](document.createElement(\"div\"), id);\n        container.parent = parent;\n        container.children = (children || []).map(traverse.bind(null, container));\n        container.css = css[id];\n        container.constraints = constraints[id];\n        if (componentParams[id] != null) {\n          var _componentParams$id = componentParams[id],\n              component = _componentParams$id.component,\n              params = _componentParams$id.params;\n\n          var subcomponents = [];\n          var fixValues = function fixValues(params) {\n            Object.keys(params).forEach(function (key) {\n              var _params$key = params[key],\n                  type = _params$key.type,\n                  value = _params$key.value;\n\n              if (value != null) {\n                switch (type) {\n                  case \"array\":\n                    params[key].value = value.map(fixValues);\n                    break;\n                  case \"image_original\":\n                  case \"video_original\":\n                    params[key].value = Liftoff.resolveAsset(type, value);\n                    break;\n                  case \"component\":\n                    var componentName = value.component;\n                    var _componentParams = fixValues(Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"clone\"])(value.params));\n                    var _component = Liftoff.Component.new(componentName, _componentParams);\n                    params[key].value = _component;\n                    subcomponents.push(_component);\n                    break;\n                }\n              }\n\n              params[key] = params[key].value;\n            });\n            return params;\n          };\n\n          params = fixValues(Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"clone\"])(params));\n          container.content = Liftoff.Component.new(component, params);\n          container.content.on(\"error\", _this4.error.bind(_this4));\n          // Errors from all subcomponents, regardless of nesting depth, are\n          // relayed directly to the top-level component.\n          subcomponents.forEach(function (subcomponent) {\n            return subcomponent.relay(container.content, \"error\");\n          });\n        }\n\n        _this4.containerByID[id] = container;\n        _this4.allContainers.push(container);\n        return container;\n      };\n\n      this.containerByID = {};\n      this.allContainers = [];\n      this.rootContainer = new __WEBPACK_IMPORTED_MODULE_4__container__[\"a\" /* default */](rootEl);\n      this.rootContainer.parent = new __WEBPACK_IMPORTED_MODULE_4__container__[\"a\" /* default */](rootEl.parentNode);\n      this.rootContainer.children = containers.map(traverse.bind(null, this.rootContainer));\n      this.rootContainer.css = { overflow: \"hidden\" };\n      this.rootContainer.constraints = rootConstraints || {\n        width: \"100%\",\n        height: \"100%\"\n      };\n      this.rootContainer.postLayoutTransform = rootPostLayoutTransform;\n\n      this.attachAnchors();\n      this.configureCoordination(coordination);\n      this.configureClickTargets(clickTargets);\n\n      this.rootContainer.layout();\n    }\n  }, {\n    key: \"attachAnchors\",\n    value: function attachAnchors() {\n      var _this5 = this;\n\n      this.allContainers.forEach(function (container) {\n        if (container.constraints == null) return;\n        container.anchors = [\"top\", \"right\", \"bottom\", \"left\"].filter(function (edge) {\n          return Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"type\"])(container.constraints[edge]) === \"object\";\n        }).map(function (edge) {\n          return {\n            edge: edge,\n            anchor: _this5.containerByID[container.constraints[edge].anchor]\n          };\n        });\n      });\n    }\n\n    // Link events with actions.\n\n  }, {\n    key: \"configureCoordination\",\n    value: function configureCoordination(coordination) {\n      var _this6 = this;\n\n      coordination.filter(function (_ref5) {\n        var event = _ref5.event;\n        return event.name != null;\n      }).forEach(function (_ref6) {\n        var event = _ref6.event,\n            actions = _ref6.actions;\n        var eventName = event.name,\n            eventType = event.type,\n            source = event.source,\n            eventMacros = event.data;\n\n\n        var actors = actions.map(function (action) {\n          var actionName = action.name,\n              actionType = action.type,\n              target = action.target,\n              actionMacros = action.data;\n\n          var actor = void 0;\n          switch (actionType) {\n            case \"madlib\":\n              actor = _this6;\n              break;\n            case \"component\":\n              actor = _this6.containerByID[target].content;\n              break;\n            case \"container\":\n              actor = _this6.containerByID[target];\n              break;\n          }\n\n          return { actionName: actionName, actor: actor, actionMacros: actionMacros };\n        }).filter(function (_ref7) {\n          var actionName = _ref7.actionName;\n          return actionName != null;\n        });\n\n        var emitter = void 0;\n        switch (eventType) {\n          case \"madlib\":\n            emitter = _this6;\n            break;\n          case \"component\":\n            emitter = _this6.containerByID[source].content;\n            break;\n          case \"container\":\n            emitter = _this6.containerByID[source];\n            break;\n        }\n\n        var getMacroValues = function getMacroValues(eventPayload) {\n          var macroValues = {};\n          Object.keys(eventMacros).forEach(function (key) {\n            var macro = eventMacros[key];\n            macroValues[macro] = eventPayload[key];\n          });\n\n          return macroValues;\n        };\n\n        var expandMacros = function expandMacros(macroValues, actionMacros) {\n          var actionPayload = {};\n          Object.keys(actionMacros).forEach(function (key) {\n            var expansion = Object.keys(macroValues).reduce(function (s, macro) {\n              // TODO(oscar): Tokenize macro better.\n              s = s == null ? \"\" : s;\n              var r = Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"escapeRegExp\"])(macro);\n              var sub = macroValues[macro] == null ? \"\" : String(macroValues[macro]);\n              return s.replace(new RegExp(r, \"g\"), sub);\n            }, actionMacros[key]);\n\n            actionPayload[key] = expansion;\n          });\n\n          return actionPayload;\n        };\n\n        var processEventPayload = function processEventPayload(eventPayload, actionMacros) {\n          return expandMacros(getMacroValues(eventPayload), actionMacros);\n        };\n\n        var dispatchActions = function dispatchActions() {\n          var eventPayload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n          // \"Waterfall\" the `.emit` Promises to process them serially.\n          return actors.reduce(function (promise, _ref8) {\n            var actionName = _ref8.actionName,\n                actor = _ref8.actor,\n                actionMacros = _ref8.actionMacros;\n\n            var data = processEventPayload(eventPayload, actionMacros);\n            return promise.then(function () {\n              return actor.emit(actionName, data);\n            });\n          }, Promise.resolve()).catch(function (e) {\n            return _this6.error(e);\n          });\n        };\n\n        emitter.on(eventName, dispatchActions);\n      });\n    }\n\n    // Setup click listeners.\n\n  }, {\n    key: \"configureClickTargets\",\n    value: function configureClickTargets(clickTargets) {\n      var _this7 = this;\n\n      if (clickTargets.length > 0) {\n        clickTargets.forEach(function (id) {\n          __WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__[\"a\" /* default */].addListeners(_this7.containerByID[id].el, function (e) {\n            _this7.handleNavigationClick(e);\n          });\n        });\n      }\n      // tre HTML endcards have their own way of handling click events.\n      else if (!window.Liftoff.env.is_tre || !window.TreSensa) {\n          this.clickEl.classList.add(\"active\");\n        }\n    }\n  }]);\n\n  return Madlib;\n}();\n\nMadlib.init();\n\nMadlib.ClickInteraction = __WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__[\"a\" /* default */];\n\nwindow.Madlib = Madlib;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Madlib);\n\n/***/ }),\n/* 67 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__ = __webpack_require__(11);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar EDGE_TO_TYPE = {\n  left: \"leading\",\n  right: \"trailing\",\n  top: \"leading\",\n  bottom: \"trailing\"\n};\nvar EDGE_TO_DIMENSION = {\n  left: \"width\",\n  right: \"width\",\n  top: \"height\",\n  bottom: \"height\"\n};\n\n// We currently require CTA containers to be prefixed with \"CTA\", but we're\n// more liberal here to support some legacy templates.\nvar ctaContainerRegex = /\\bcta\\b/i;\nvar isCTAContainer = function isCTAContainer(containerID) {\n  return ctaContainerRegex.test(containerID);\n};\n\nvar Container = function (_EventListener) {\n  _inherits(Container, _EventListener);\n\n  _createClass(Container, null, [{\n    key: \"getEvents\",\n    value: function getEvents() {\n      return [{ name: \"beforeLayout\", system: true }, { name: \"onClick\" }].map(function (e) {\n        e.type = \"container\";\n        return e;\n      });\n    }\n  }, {\n    key: \"getActions\",\n    value: function getActions() {\n      return [{ name: \"show\" }, { name: \"hide\" }].map(function (a) {\n        a.type = \"container\";\n        return a;\n      });\n    }\n\n    /** @param {HTMLDivElement} el - The container element. */\n\n  }]);\n\n  function Container(el) {\n    var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n\n    _classCallCheck(this, Container);\n\n    var _this = _possibleConstructorReturn(this, (Container.__proto__ || Object.getPrototypeOf(Container)).call(this));\n\n    _this.el = el;\n    _this.el.classList.add(\"madlib-container\");\n    if (isCTAContainer(id)) {\n      // We tag CTA containers to help us detect when clicks occur on CTAs.\n      _this.el.classList.add(\"cta-container\");\n    }\n    // `parent` and `children` refer to other Containers.\n    _this.parent = null;\n    _this.children = [];\n\n    _this.fixedWidth = false;\n    _this.fixedHeight = false;\n\n    _this.css = null;\n    _this.constraints = null;\n    _this.anchors = [];\n    _this.content = null;\n\n    _this.layoutReady = null;\n    _this.contentReady = null;\n    _this.hidden = false;\n\n    _this.postLayoutTransform = null;\n\n    _this.addEventListeners();\n    _this.coordinate();\n    return _this;\n  }\n\n  _createClass(Container, [{\n    key: \"addEventListeners\",\n    value: function addEventListeners() {\n      var _this2 = this;\n\n      this.el.addEventListener(\"click\", function () {\n        return _this2.emit(\"onClick\");\n      });\n    }\n  }, {\n    key: \"coordinate\",\n    value: function coordinate() {\n      var _this3 = this;\n\n      this.on({\n        hide: function hide() {\n          Object.assign(_this3.el.style, {\n            pointerEvents: \"none\",\n            visibility: \"hidden\"\n          });\n        },\n        show: function show() {\n          Object.assign(_this3.el.style, {\n            pointerEvents: _this3.css && _this3.css[\"pointer-events\"] || \"auto\",\n            visibility: _this3.css && _this3.css.visibility || \"visible\"\n          });\n        }\n      });\n    }\n  }, {\n    key: \"loadContent\",\n    value: function loadContent() {\n      if (this.contentReady == null) {\n        var promises = this.children.map(function (child) {\n          return child.loadContent();\n        });\n        if (this.content != null) {\n          promises.push(this.content.load());\n        }\n\n        this.contentReady = Promise.all(promises);\n      }\n\n      return this.contentReady;\n    }\n  }, {\n    key: \"layout\",\n    value: function layout() {\n      var _this4 = this;\n\n      if (this.layoutReady == null) {\n        // NOTE(oscar): beforeLayout should probably only trigger at most once per\n        // container.\n        this.emit(\"beforeLayout\");\n      }\n      if (this.layoutReady == null) {\n        if (this.el.parentNode !== this.parent.el) {\n          this.parent.el.appendChild(this.el);\n        }\n\n        if (this.constraints != null) {\n          if (this.constraints.left != null && this.constraints.right != null || this.constraints.width != null) {\n            this.fixedWidth = true;\n          }\n\n          if (this.constraints.top != null && this.constraints.bottom != null || this.constraints.height != null) {\n            this.fixedHeight = true;\n          }\n        }\n\n        // The child components do not layout properly if a transform is active.\n        // So, let's reset the transform before we proceed, then apply it later.\n        this.resetTransform();\n\n        this.style();\n        this.position();\n        this.layoutReady = this.loadContent().then(function () {\n          return _this4.anchor();\n        }).then(function () {\n          return _this4.match();\n        }).then(function () {\n          return _this4.layoutContent();\n        }).then(function () {\n          return _this4.center();\n        }).then(function () {\n          return _this4.applyTransform();\n        });\n      }\n\n      return this.layoutReady;\n    }\n  }, {\n    key: \"style\",\n    value: function style() {\n      // The zIndex creates a stacking context for the contents of the container\n      // element so that they don't interfere with other containers.\n      Object.assign(this.el.style, { zIndex: 1 }, this.css);\n    }\n  }, {\n    key: \"position\",\n    value: function position() {\n      var _this5 = this;\n\n      if (this.constraints == null) return;\n      var styles = { position: \"absolute\" };\n      [\"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\"].forEach(function (prop) {\n        var value = _this5.constraints[prop];\n        if (value != null && Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"type\"])(value) !== \"object\") {\n          styles[prop] = value;\n        }\n      });\n      Object.assign(this.el.style, styles);\n    }\n  }, {\n    key: \"resetTransform\",\n    value: function resetTransform() {\n      if (this.postLayoutTransform != null) {\n        this.el.style.transform = \"none\";\n      }\n    }\n  }, {\n    key: \"applyTransform\",\n    value: function applyTransform() {\n      if (this.postLayoutTransform != null) {\n        this.el.style.transform = this.postLayoutTransform;\n      }\n    }\n  }, {\n    key: \"anchor\",\n    value: function anchor() {\n      var _this6 = this;\n\n      var pRect = void 0;\n      var promises = this.anchors.map(function (_ref) {\n        var containerEdge = _ref.edge,\n            anchor = _ref.anchor;\n        var _constraints$containe = _this6.constraints[containerEdge],\n            distance = _constraints$containe.distance,\n            anchorEdge = _constraints$containe.edge;\n\n        var containerEdgeType = EDGE_TO_TYPE[containerEdge];\n        var anchorEdgeType = EDGE_TO_TYPE[anchorEdge];\n        var dimension = EDGE_TO_DIMENSION[containerEdge];\n        // Block positioning until the anchor is ready.\n        return anchor.layout().then(function () {\n          if (pRect == null) {\n            pRect = _this6.parent.el.getBoundingClientRect();\n          }\n\n          var rect = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"getRelativeBoundingClientRect\"])(anchor.el);\n          var offset = void 0;\n          switch (containerEdgeType + \" \" + anchorEdgeType) {\n            case \"leading leading\":\n              offset = rect[anchorEdge];\n              break;\n            case \"trailing trailing\":\n              offset = -rect[anchorEdge];\n              break;\n            case \"leading trailing\":\n              offset = pRect[dimension] + rect[anchorEdge];\n              break;\n            case \"trailing leading\":\n              offset = pRect[dimension] - rect[anchorEdge];\n              break;\n          }\n\n          var _parseCSSLength = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"parseCSSLength\"])(distance),\n              value = _parseCSSLength.value,\n              units = _parseCSSLength.units;\n\n          switch (units) {\n            case \"px\":\n              offset += value;\n              break;\n            case \"%\":\n              offset += pRect[dimension] * value / 100;\n              break;\n          }\n\n          _this6.el.style[containerEdge] = offset + \"px\";\n        });\n      });\n      return Promise.all(promises);\n    }\n  }, {\n    key: \"match\",\n    value: function match() {\n      if (this.constraints == null || !(this.constraints.matchWidthToHeight || this.constraints.matchHeightToWidth)) {\n        return;\n      }\n\n      var _el$getBoundingClient = this.el.getBoundingClientRect(),\n          width = _el$getBoundingClient.width,\n          height = _el$getBoundingClient.height;\n\n      if (this.constraints.matchWidthToHeight) {\n        this.el.style.width = height + \"px\";\n      } else if (this.constraints.matchHeightToWidth) {\n        this.el.style.height = width + \"px\";\n      }\n    }\n  }, {\n    key: \"layoutContent\",\n    value: function layoutContent() {\n      var _this7 = this;\n\n      if (this.invalidated) return;\n\n      var promises = this.children.map(function (child) {\n        return child.layout();\n      });\n      if (this.content != null) {\n        promises.push(this.content.layout(this.el));\n      }\n\n      return Promise.all(promises).then(function () {\n        // For containers that serve as wrappers for other containers (i.e. do not\n        // have content), calculate the aggregate bounding rectangle for all\n        // children and resize the container to match the rectangle. This allows\n        // centering to work properly.\n        if (_this7.content != null || _this7.fixedWidth && _this7.fixedHeight) return;\n        var rect = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"getAggregateBoundingClientRect\"])(_this7.children.map(function (child) {\n          return child.el;\n        }));\n        var style = {};\n        if (!_this7.fixedWidth) {\n          style.width = rect.width + \"px\";\n        }\n\n        if (!_this7.fixedHeight) {\n          style.height = rect.height + \"px\";\n        }\n\n        Object.assign(_this7.el.style, style);\n      });\n    }\n  }, {\n    key: \"center\",\n    value: function center() {\n      if (this.constraints == null || !(this.constraints.centerHorizontal || this.constraints.centerVertical)) {\n        return;\n      }\n\n      var pRect = this.parent.el.getBoundingClientRect();\n      var rect = this.el.getBoundingClientRect();\n      if (this.constraints.centerHorizontal) {\n        this.el.style.left = (pRect.width - rect.width) / 2 + \"px\";\n      }\n\n      if (this.constraints.centerVertical) {\n        this.el.style.top = (pRect.height - rect.height) / 2 + \"px\";\n      }\n    }\n  }, {\n    key: \"invalidate\",\n    value: function invalidate() {\n      this.invalidated = true;\n\n      // NOTE(vsingh):\n      // The following is a hack on top of a hack. We invalidate containers when\n      // resetting layout, so that any asynchronous process kicked off\n      // by those containers will have no further effect.\n      // Unfortunately the invalidation hack has holes: there are still\n      // cases where side effects are applied to the DOM element\n      // associated with the container. Therefore, dissociate the\n      // container and the DOM element immediately upon container\n      // invalidation.\n      this.el = document.createElement(\"div\");\n    }\n  }]);\n\n  return Container;\n}(__WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Container);\n\n/***/ }),\n/* 68 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar TEMPLATE = \"<div class=\\\"last-chance-endscreen\\\">\\n  <svg class=\\\"back-cta-icon hidden\\\" width=\\\"24px\\\" height=\\\"24px\\\" fill=\\\"white\\\">\\n    <path d=\\\"M12 17.414 3.293 8.707l1.414-1.414L12 14.586l7.293-7.293 1.414 1.414L12 17.414z\\\"/>\\n  </svg>\\n  <div class=\\\"last-chance-endscreen-container\\\">\\n    <div class=\\\"inner-container hidden\\\">\\n      <img class=\\\"last-chance-logo\\\" />\\n      <div class=\\\"icon-container\\\"></div>\\n      <div class=\\\"caption\\\"></div>\\n      <a class=\\\"liftoff-link liftoff-cta\\\">\\n        <img />\\n        <div class=\\\"common-cta\\\"></div>\\n      </a>\\n    </div>\\n  </div>\\n</div>\";\n\n/**\n * @typedef AppStoreData\n * @property {string} icon - application icon.\n * @property {string} name - application name.\n * @property {string} company - application company/developer.\n * @property {number} rating - application rating on Google Play store.\n * @property {number} rating_count - number of times the app has been rated on\n * the Google Play store.\n * @property {string | number} download_count - number of times the app has been\n * downloaded from the Google Play store.\n * @property {string} content_rating - app content rating on the Google Play\n * store.\n * @property {string} screenshots - screenshots available for the app.\n * @property {string} description - app description.\n */\n\n/**\n * Creates a Liftoff Last Chance Endscreen component which is displayed to the\n * user as an overlay HTML endscreen.\n *\n * @see https://docs.google.com/presentation/d/15EUBJUVXP2DpFbkA3hB0yE8z-iEy6C1I5tlZ-1h-jBw/edit?usp=sharing\n */\n\nvar LastChanceEndscreen = function () {\n  /**\n   *\n   * @param {AppStoreData} appStoreData\n   * @param {Object} parentEl\n   * @param {function} handleClick\n   * @param {boolean} validateUserClick - if true then CTA is only triggered if\n   * click is invoked by the user and not programmatically.\n   * @param {Object} env\n   */\n  function LastChanceEndscreen(appStoreData, parentEl, handleClick) {\n    var validateUserClick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n    var env = arguments[4];\n\n    _classCallCheck(this, LastChanceEndscreen);\n\n    this.appStoreData = appStoreData;\n    this.parentEl = parentEl;\n    this.el = __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"](TEMPLATE);\n    this.handleClick = handleClick;\n    this.validateUserClick = validateUserClick;\n    this.env = env;\n    this.ctaText = env.cta_text || \"INSTALL\";\n    this.autoEndCardCallCount = 0;\n    this.timeout = null;\n\n    if (this.parentEl == null) {\n      console.error(\"Last chance endscreen was created without a parent container\");\n    }\n    // Load app icon when the Liftoff Last Chance Endscreen instance is created.\n    this.images = this.loadImages([this.appStoreData.icon]);\n  }\n\n  _createClass(LastChanceEndscreen, [{\n    key: \"loadImages\",\n    value: function loadImages(imagePaths) {\n      return __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"loadImages\"](imagePaths);\n    }\n  }, {\n    key: \"prepareAutoEndcard\",\n    value: function prepareAutoEndcard() {\n      var _this = this;\n\n      this.el.querySelector(\".caption\").innerHTML = this.appStoreData.name;\n      this.el.querySelector(\".common-cta\").innerHTML = this.ctaText.toUpperCase();\n      // Show all elements in the LO last chance endscreen after app icon is\n      // loaded on the browser.\n      this.images.then(function (values) {\n        values.forEach(function (img) {\n          img.classList.add(\"icon\");\n          _this.el.querySelector(\".icon-container\").appendChild(img);\n        });\n      }).catch(function (error) {\n        console.error(\"Error while rendering app icon: \" + error.message);\n      }).finally(function () {\n        // This will run on success or error.\n        _this.el.querySelector(\".inner-container\").classList.remove(\"hidden\");\n      });\n\n      this.parentEl.appendChild(this.el);\n    }\n  }, {\n    key: \"showAutoEndcard\",\n    value: function showAutoEndcard() {\n      if (this.env.has_html_endscreen) {\n        if (this.env.platform) {\n          // For adding iOS/Android specific styles on the AutoEndcard\n          this.el.closest(\"#liftoff-snippet\").classList.add(this.env.platform);\n        }\n\n        this.el.querySelector(\".back-cta-icon\").classList.remove(\"hidden\");\n        this.el.classList.add(\"rolling-up-animation\");\n      }\n    }\n  }, {\n    key: \"initAutoEndcard\",\n    value: function initAutoEndcard() {\n      if (this.wasShown) return;\n      this.wasShown = true;\n      this.prepareAutoEndcard();\n      this.showAutoEndcard();\n      this.initializeEvents();\n    }\n  }, {\n    key: \"initializeEvents\",\n    value: function initializeEvents() {\n      var _this2 = this;\n\n      var touchstart = 0;\n\n      // Fire CTA if user clicks anywhere on the screen.\n      this.el.addEventListener(\"click\", function (e) {\n        if (!e.target.closest(\".back-cta-icon\")) {\n          var triggerCTA = _this2.validateUserClick ? e.isTrusted : true;\n          if (triggerCTA) {\n            _this2.handleClick(!_this2.useInteractionMonitor ? e : _this2._lastInteraction);\n          }\n        }\n      });\n\n      this.el.querySelector(\".back-cta-icon\").addEventListener(\"click\", function () {\n        _this2.el.classList.add(\"rolling-down-animation\");\n      });\n\n      this.el.addEventListener(\"touchstart\", function (e) {\n        touchstart = e.changedTouches[0].screenY;\n      });\n\n      this.el.addEventListener(\"touchend\", function (e) {\n        // Adding 70px buffer to avoid accidental taps on screen\n        if (e.changedTouches[0].screenY > touchstart + 70) {\n          _this2.el.classList.add(\"rolling-down-animation\");\n        }\n      });\n    }\n  }]);\n\n  return LastChanceEndscreen;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (LastChanceEndscreen);\n\n/***/ }),\n/* 69 */,\n/* 70 */,\n/* 71 */,\n/* 72 */,\n/* 73 */,\n/* 74 */,\n/* 75 */,\n/* 76 */,\n/* 77 */,\n/* 78 */,\n/* 79 */,\n/* 80 */,\n/* 81 */,\n/* 82 */,\n/* 83 */,\n/* 84 */,\n/* 85 */,\n/* 86 */,\n/* 87 */,\n/* 88 */,\n/* 89 */,\n/* 90 */,\n/* 91 */,\n/* 92 */,\n/* 93 */,\n/* 94 */,\n/* 95 */,\n/* 96 */,\n/* 97 */,\n/* 98 */,\n/* 99 */,\n/* 100 */,\n/* 101 */,\n/* 102 */,\n/* 103 */,\n/* 104 */,\n/* 105 */,\n/* 106 */,\n/* 107 */,\n/* 108 */,\n/* 109 */,\n/* 110 */,\n/* 111 */,\n/* 112 */,\n/* 113 */,\n/* 114 */,\n/* 115 */,\n/* 116 */,\n/* 117 */,\n/* 118 */,\n/* 119 */,\n/* 120 */,\n/* 121 */,\n/* 122 */,\n/* 123 */,\n/* 124 */,\n/* 125 */,\n/* 126 */,\n/* 127 */,\n/* 128 */,\n/* 129 */,\n/* 130 */,\n/* 131 */,\n/* 132 */,\n/* 133 */,\n/* 134 */,\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(136);\nmodule.exports = __webpack_require__(140);\n\n\n/***/ }),\n/* 136 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__component__ = __webpack_require__(137);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__creative_utils__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__click_handling__ = __webpack_require__(56);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__interaction_monitor__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__letterbox_config__ = __webpack_require__(138);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__logger__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__window_resize_logger__ = __webpack_require__(139);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__frontendlib_dom_utils__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__frontendlib_utils__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__cta__ = __webpack_require__(21);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__adexp__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__ = __webpack_require__(58);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__madlib__ = __webpack_require__(66);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__lib_last_chance_endscreen_last_chance_endscreen__ = __webpack_require__(68);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__csp_env_messages__ = __webpack_require__(22);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * NOTE(oscar): After 3 seconds, log what mraid methods/events have been\n * supported. This should be right before users typically close the ad\n * which should give enough time to check what events have triggered or\n * methods used.\n */\nvar logMraidSupport = function logMraidSupport() {\n  setTimeout(function () {\n    __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordLog(\"mraid\",\n    // TODO(oscar): Use the data param once adexp logs can save it.\n    JSON.stringify(Object.assign({\n      tag: \"mraidSupport\"\n    }, __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].getSupportedLog())));\n  }, 3000);\n};\n\n/**\n * Function used to handle auto-endcard interaction event from TreSensa\n * creatives made from the \"tresensa-snippet\" Madlib component.\n * @param {*} e\n * @param {*} autoEndcard\n * @param {*} lastChanceEndscreenAutoclick\n * @param {*} lastChanceEndscreenInteractionAutoclick\n * TODO(luis): We need to integrate TreSensa interaction events with the\n * InteractionMonitor class.\n */\nvar onTreSensaInteraction = function onTreSensaInteraction(e, autoEndcard, lastChanceEndscreenAutoclick, lastChanceEndscreenInteractionAutoclick, vxInteractionListeners) {\n  if (e.data === __WEBPACK_IMPORTED_MODULE_16__csp_env_messages__[\"m\" /* MESSAGE_TRESENSA_INTERACTION */]) {\n    if (lastChanceEndscreenAutoclick) {\n      lastChanceEndscreenAutoclick.disable();\n    }\n    // TODO(Luis): This is a temporary fix to handle the case where the\n    // interaction event is triggered from a TreSensa wrapped 3p.\n    // Eventually this needs to be deleted and updated so that a\n    // tre_interaction event does trigger a global interaction that can be\n    // detected by the AutoClick interaction behaviour.\n    if (autoEndcard && lastChanceEndscreenInteractionAutoclick && lastChanceEndscreenInteractionAutoclick._behavior && lastChanceEndscreenInteractionAutoclick._behavior.delay) {\n      // Display auto-endcard after a delay on interaction.\n      setTimeout(function () {\n        autoEndcard.initAutoEndcard();\n      }, lastChanceEndscreenInteractionAutoclick._behavior.delay);\n    }\n\n    // NOTE(Sangeeth): The onTreSensaInteraction handler is only called for\n    // tresensa client wrapped playables. These playables run inside an iframe\n    // so we can't detect interaction events for them through the interaction\n    // monitor.\n    vxInteractionListeners.forEach(function (cb) {\n      return cb();\n    });\n  }\n};\n\nvar Liftoff = function () {\n  function Liftoff() {\n    _classCallCheck(this, Liftoff);\n  }\n\n  _createClass(Liftoff, null, [{\n    key: \"init\",\n    value: function init(env, assets) {\n      var _this = this;\n\n      var trackingTags = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n      try {\n        /** TODO(oscar): Consider logging MRAID support for CSP creatives. */\n        logMraidSupport();\n\n        if (trackingTags != null) {\n          __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].onViewable(function () {\n            var trackingTagHolder = document.getElementById(\"tracking-tag-holder\");\n            __WEBPACK_IMPORTED_MODULE_9__frontendlib_dom_utils__[\"appendImpressionTags\"](trackingTagHolder, trackingTags);\n          });\n        }\n\n        this.env = env;\n        this.populateAppStoreData();\n        // The bid context is often used, giving it an alias saves characters and lines of this JS.\n        this.bidContext = env.bid_context;\n        this.assets = assets;\n        this.testGroups = {};\n        this.bidContext.ab_tests.forEach(function (group) {\n          _this.testGroups[group] = true;\n        });\n        this.lastClickMetric = null;\n        this.resetClickParams();\n        this.interactionMonitor = new __WEBPACK_IMPORTED_MODULE_4__interaction_monitor__[\"a\" /* InteractionMonitor */]();\n        this.vxInteractionListeners = [];\n        this.interactionMonitor.onInteractionChange(function (e) {\n          _this.vxInteractionListeners.forEach(function (cb) {\n            return cb(e);\n          });\n          _this._autoclickBus.forEach(function (ac) {\n            return ac.emitInteractionEvent(e);\n          });\n        });\n\n        this.snippetEl = null;\n        this.updateMRAID();\n        this.loadDOM();\n        this.loadLogger();\n        this.initAutoclickBehaviors();\n        __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"initial_load_count\", 1);\n        this.applyPolicy();\n        this.windowResizeLogger = new __WEBPACK_IMPORTED_MODULE_7__window_resize_logger__[\"a\" /* default */](this.snippetEl, this.env.enable_logging);\n        this.addEventListeners();\n        this.madlibLoaded = false;\n        this.useAutoendcardBehaviour = null;\n\n        __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].on(\"error\", function (e) {\n          return __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordError(e);\n        });\n      } catch (e) {\n        __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordError(e);\n      }\n    }\n  }, {\n    key: \"populateAppStoreData\",\n    value: function populateAppStoreData() {\n      if (!this.env.app_store_data) {\n        try {\n          if (window.parent.VungleHelper) {\n            var tokens = window.parent.VungleHelper.tokens;\n            if (tokens) {\n              this.env.app_store_data = {\n                icon: tokens.APP_ICON,\n                name: tokens.APP_NAME,\n                description: tokens.APP_DESCRIPTION,\n                rating: tokens.APP_STORE_RATING\n              };\n            }\n          }\n        } catch (error) {\n          console.error(\"Error occurred:\", error.message);\n        }\n      }\n    }\n  }, {\n    key: \"initAutoclickBehaviors\",\n    value: function initAutoclickBehaviors() {\n      var _this2 = this;\n\n      this._autoclickBus = [];\n      __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].on(\"clickMethodTried\", function (_ref) {\n        var clickOpenMethod = _ref.clickOpenMethod,\n            isAutoclick = _ref.isAutoclick;\n\n        if (isAutoclick && clickOpenMethod === __WEBPACK_IMPORTED_MODULE_8__constants__[\"t\" /* CLICK_OPEN_METHOD_MRAID */]) {\n          __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"mraid_autoclick_fired_ms\", Date.now() - LIFTOFF_START_TS);\n        }\n      });\n\n      this._viewclick = new __WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__[\"a\" /* default */](this.bidContext.viewclick_behavior, {\n        clickthroughHandler: function clickthroughHandler(lastEvent) {\n          return _this2.handleClick({\n            mac: 1\n          }, Object(__WEBPACK_IMPORTED_MODULE_11__cta__[\"a\" /* clickAreaTypeFromEvent */])({\n            clientX: lastEvent == null ? null : lastEvent.lastInteraction.startX,\n            clientY: lastEvent == null ? null : lastEvent.lastInteraction.startY\n          }));\n        }\n      });\n      this._autoclickBus.push(this._viewclick);\n\n      // We store app store data in this variable for reusability.\n      var appStoreData = this.env.app_store_data;\n\n      var autoEndcard = void 0;\n      // Only initialize autoEndcard if there is app store data in the bid context.\n      if (appStoreData) {\n        autoEndcard = new __WEBPACK_IMPORTED_MODULE_15__lib_last_chance_endscreen_last_chance_endscreen__[\"a\" /* default */](appStoreData, this.snippetEl, function (e) {\n          __WEBPACK_IMPORTED_MODULE_14__madlib__[\"default\"].handleNavigationClick(e, {\n            ae: 1\n          });\n        }, this.bidContext.exchange === \"inmobi\", this.env);\n      }\n\n      this.useAutoendcardBehaviour = this.bidContext.last_chance_endscreen_autoclick_behavior;\n\n      // If exchange is mintegral then only display the auto endcard on delay if\n      // platform is ios.\n      if (this.useAutoendcardBehaviour && (this.bidContext.exchange != \"mintegral\" || this.bidContext.platform === \"ios\")) {\n        this._lastChanceEndscreenAutoclick = new __WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__[\"a\" /* default */](this.useAutoendcardBehaviour, {\n          clickthroughHandler: function clickthroughHandler() {\n            if (autoEndcard) {\n              autoEndcard.initAutoEndcard();\n            }\n          }\n        });\n        this._autoclickBus.push(this._lastChanceEndscreenAutoclick);\n      }\n\n      this._lastChanceEndscreenInteractionAutoclick = new __WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__[\"a\" /* default */](this.bidContext.last_chance_endscreen_interaction_autoclick_behavior, {\n        clickthroughHandler: function clickthroughHandler() {\n          if (autoEndcard) {\n            autoEndcard.initAutoEndcard();\n          }\n        }\n      });\n      this._autoclickBus.push(this._lastChanceEndscreenInteractionAutoclick);\n      /**\n       * Handle cases where the interaction event is triggered from the\n       * \"tresensa-snippet\" Madlib component.\n       */\n      window.addEventListener(\"message\", function (e) {\n        onTreSensaInteraction(e, autoEndcard, _this2._lastChanceEndscreenAutoclick, _this2._lastChanceEndscreenInteractionAutoclick, _this2.vxInteractionListeners);\n      }, true);\n    }\n  }, {\n    key: \"setInteractionPromptReached\",\n    value: function setInteractionPromptReached(e) {\n      this._autoclickBus.forEach(function (ac) {\n        return ac.emitInteractionPromptReachedEvent(e);\n      });\n    }\n  }, {\n    key: \"getAnimationDurationLimit\",\n    value: function getAnimationDurationLimit() {\n      return this.env.creative_policy.animation_duration_limit;\n    }\n  }, {\n    key: \"handleMadlibError\",\n    value: function handleMadlibError(e) {\n      __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordError(e);\n    }\n  }, {\n    key: \"hasTestGroup\",\n    value: function hasTestGroup(group) {\n      return !!this.testGroups[group];\n    }\n  }, {\n    key: \"isExchange\",\n    value: function isExchange(exchange) {\n      return this.bidContext.exchange.toLowerCase() === exchange.toLowerCase();\n    }\n  }, {\n    key: \"updateMRAID\",\n    value: function updateMRAID() {\n      if (this.bidContext.is_interstitial) {\n        var _bidContext = this.bidContext,\n            width = _bidContext.width,\n            height = _bidContext.height;\n\n        __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].lockOrientation(width < height ? \"portrait\" : \"landscape\");\n      }\n    }\n  }, {\n    key: \"loadLogger\",\n    value: function loadLogger() {\n      var _env = this.env,\n          enableLogging = _env.enable_logging,\n          enableHtmlReturn = _env.enable_html_return,\n          endpoint = _env.logging_endpoint,\n          trackingParam = _env.event_tracking_param,\n          delay = _env.html_return_delay;\n\n\n      __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].passContext(endpoint, trackingParam, Object(__WEBPACK_IMPORTED_MODULE_12__adexp__[\"e\" /* getAdexpContextSnapshotFn */])(this.snippetEl, function () {\n        return __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].hasSupport(\"mraid\");\n      }));\n\n      if (!enableLogging) {\n        return;\n      }\n\n      __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].enable();\n      __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].addErrorListeners();\n\n      if (!enableHtmlReturn) {\n        return;\n      }\n      __WEBPACK_IMPORTED_MODULE_1__creative_utils__[\"b\" /* configureHTMLReturn */](endpoint, delay);\n    }\n  }, {\n    key: \"loadDOM\",\n    value: function loadDOM() {\n      var _snippetEl$classList;\n\n      this.snippetEl = document.createElement(\"div\");\n      this.snippetEl.id = \"liftoff-snippet\";\n      this.snippetEl.classList.add(this.bidContext.platform.toLowerCase());\n      (_snippetEl$classList = this.snippetEl.classList).add.apply(_snippetEl$classList, _toConsumableArray(this.bidContext.ab_tests));\n      document.body.appendChild(this.snippetEl);\n      // TreSensa endcards using the adcontainer.js library rely on the\n      // \"tre_container\" div being present.\n      if (this.env.is_tre) {\n        this.treContainerEl = document.createElement(\"div\");\n        this.treContainerEl.id = \"tre_container\";\n        this.treContainerEl.zIndex = 2;\n        this.snippetEl.appendChild(this.treContainerEl);\n      }\n    }\n\n    /**\n     * A creative policy is a collection of special requirements the creative must comply with. These tend\n     * to be country and/or exchange specific.\n     * Creative policies are set in admarkup/core.\n     * @param {Object} policy - A series of requirements.\n     * @param {boolean} policy.add_border - Adds a border around the creative.\n     * @param {string} policy.russian_age_rating - Shows age rating watermark.\n     * @param {number} policy.animation_duration_limit - Stops all animation after a set time.\n     * @param {boolean} policy.show_chinese_watermark - Shows Chinese watermark.\n     * @param {boolean} policy.show_ad_choices - Shows the AdChoices watermark.\n     * @param {boolean} policy.block_notifications - Blocks notification icons from appearing on chat banners.\n     * @param {boolean} policy.block_strobing - Keeps strobing/blinking animations from happening.\n     * @param {boolean} policy.use_custom_close - True iff we should use a custom close button for this\n     *                                            impression.\n     * @param {number} policy.close_delay - Overrides any previously set close delay duration.\n     */\n\n  }, {\n    key: \"applyPolicy\",\n    value: function applyPolicy() {\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.env.creative_policy,\n          add_border = _ref2.add_border,\n          russian_age_rating = _ref2.russian_age_rating,\n          show_chinese_watermark = _ref2.show_chinese_watermark,\n          show_ad_choices = _ref2.show_ad_choices,\n          use_custom_close = _ref2.use_custom_close,\n          close_delay = _ref2.close_delay;\n\n      var bidContext = this.bidContext;\n      __WEBPACK_IMPORTED_MODULE_1__creative_utils__[\"a\" /* applyLiftoffPolicy */](this.snippetEl, {\n        addBorder: add_border,\n        showAdChoices: show_ad_choices,\n        russianAgeRating: russian_age_rating,\n        showChineseWatermark: show_chinese_watermark,\n        useCustomClose: use_custom_close,\n        closeDelay: close_delay,\n        // NOTE(Casey): `applyLiftoffPolicy` globally modifies audio output of the entire creative. Currently,\n        // madlib creatives do not use these global controls -- we depend on components to directly check\n        // the audio policy before making sound. We therefore set `audioPolicy` here to `NO_RESTRICTION` to\n        // disable the global controls.\n        // TODO(Casey): Update this if we decide to use global controls for madlib creatives in the future.\n        audioPolicy: __WEBPACK_IMPORTED_MODULE_8__constants__[\"b\" /* AUDIO_POLICY_NO_RESTRICTIONS */]\n      }, {\n        creativeID: bidContext.creative_id,\n        platform: bidContext.platform,\n        exchange: bidContext.exchange.toLowerCase(),\n        sourceAppName: bidContext.source_app_name,\n        sourceAppID: bidContext.source_app_id,\n        cdnURL: bidContext.cdnURL\n      });\n    }\n  }, {\n    key: \"onMadlibLoaded\",\n    value: function onMadlibLoaded() {\n      this.madlibLoaded = true;\n    }\n  }, {\n    key: \"resetClickParams\",\n    value: function resetClickParams() {\n      this.clickParams = {};\n    }\n  }, {\n    key: \"mergeClickParams\",\n    value: function mergeClickParams(params) {\n      Object.assign(this.clickParams, params);\n    }\n  }, {\n    key: \"getClickParams\",\n    value: function getClickParams() {\n      return this.clickParams;\n    }\n\n    /** Handles clickthrough/CTA clicks. */\n\n  }, {\n    key: \"handleClick\",\n    value: function handleClick() {\n      var queryParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var clickAreaType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n      /**\n       * NOTE(oscar): To prevent aggressive behavior, we disable autoclick the\n       * first time the store page is opened regardless of how.\n       * mac=1 means there will be no UX change.\n       */\n      if (this._lastChanceEndscreenAutoclick && !queryParams.mac) {\n        this._lastChanceEndscreenAutoclick.disable();\n      }\n      // NOTE(oscar): pv=1 clicks should mean the MMP is not sent a click.\n      if (!queryParams.pv) {\n        this._viewclick.disable();\n      }\n\n      var clickTrackingParams = __WEBPACK_IMPORTED_MODULE_2__click_handling__[\"a\" /* getClickTrackingQueryParams */](this.interactionMonitor.getAllInteractionData());\n\n      var allQueryParams = Object.assign({\n        cbl: this.madlibLoaded ? 0 : 1\n      }, this.getClickParams(), clickTrackingParams, queryParams);\n\n      if (clickAreaType != null) {\n        allQueryParams.ca = clickAreaType;\n      }\n\n      var bidContext = this.bidContext,\n          clickConfig = this.env.click_config;\n\n      __WEBPACK_IMPORTED_MODULE_2__click_handling__[\"b\" /* handleClick */]({\n        clickConfig: {\n          clickthroughURL: clickConfig.clickthrough_url,\n          clickTrackingURLs: clickConfig.click_tracking_urls\n        },\n        queryParams: allQueryParams,\n        isReengagement: bidContext.is_reengagement,\n        platform: bidContext.platform,\n        exchange: bidContext.exchange,\n        abTests: bidContext.ab_tests\n      });\n    }\n  }, {\n    key: \"onClickCapture\",\n    value: function onClickCapture(e) {\n      var _this3 = this;\n\n      // An array of EventTarget objects, some of which may be instances of Element.\n      var path = e.composedPath && e.composedPath() || e.path;\n      if (path == null) {\n        return;\n      }\n\n      var foundSnippet = path.some(function (el) {\n        return el === _this3.snippetEl;\n      });\n      if (!foundSnippet) {\n        return;\n      }\n\n      var rect = this.snippetEl.getBoundingClientRect();\n      var clickMetric = {\n        x: Math.round(e.pageX - rect.left),\n        y: Math.round(e.pageY - rect.top),\n        time_ms: Date.now() - LIFTOFF_START_TS,\n        // NOTE(vsingh): The click type below must be one of AdexpMetric.ClickType.\n        type: __WEBPACK_IMPORTED_MODULE_8__constants__[\"q\" /* CLICK_METRIC_TYPE_UNKNOWN */]\n      };\n\n      // Helper function that returns true if some Elements in `path` satisfy the condition `pred`.\n      var someElements = function someElements(pred) {\n        return path.some(function (eventtarget) {\n          return eventtarget instanceof Element && pred(eventtarget);\n        });\n      };\n\n      if (someElements(function (el) {\n        return el.classList.contains(\"liftoff-close-target\");\n      })) {\n        clickMetric.type = __WEBPACK_IMPORTED_MODULE_8__constants__[\"n\" /* CLICK_METRIC_TYPE_CLOSE */];\n      } else if (Object(__WEBPACK_IMPORTED_MODULE_11__cta__[\"c\" /* pointInCTA */])(e.clientX, e.clientY)) {\n        clickMetric.type = __WEBPACK_IMPORTED_MODULE_8__constants__[\"o\" /* CLICK_METRIC_TYPE_CTA */];\n      } else if (someElements(function (el) {\n        return el.classList.contains(\"liftoff-deadzone\");\n      })) {\n        clickMetric.type = __WEBPACK_IMPORTED_MODULE_8__constants__[\"p\" /* CLICK_METRIC_TYPE_DEADZONE */];\n      } else if (someElements(function (el) {\n        return el.id === \"liftoff-close\";\n      })) {\n        // NOTE(vsingh): Special/weird case: if we hit liftoff-close but not liftoff-close-target,\n        // consider it a deadzone click. There are just a few pixels around the close button that\n        // trigger this `if` clause.\n        clickMetric.type = __WEBPACK_IMPORTED_MODULE_8__constants__[\"p\" /* CLICK_METRIC_TYPE_DEADZONE */];\n      }\n\n      __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"click\", clickMetric);\n      this.lastClickMetric = clickMetric;\n    }\n  }, {\n    key: \"addEventListeners\",\n    value: function addEventListeners() {\n      var _this4 = this;\n\n      __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].onViewable(function () {\n        __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"first_viewable_ms\", Date.now() - LIFTOFF_START_TS);\n      });\n      __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].onViewable(function (e) {\n        _this4._autoclickBus.forEach(function (ac) {\n          return ac.emitViewableEvent(e);\n        });\n      }, true);\n      __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].onViewableChange(function (e) {\n        _this4._autoclickBus.forEach(function (ac) {\n          return ac.emitViewableChangeEvent(e);\n        });\n      });\n\n      window.addEventListener(\"click\", function (e) {\n        _this4.onClickCapture(e);\n        if (_this4._lastChanceEndscreenAutoclick) {\n          _this4._lastChanceEndscreenAutoclick.disable();\n        }\n      }, true);\n    }\n  }, {\n    key: \"onLoadCompleted\",\n    value: function onLoadCompleted() {\n      // NOTE(oscar): We log the initial dimensions immediately in case no \"resize\" event triggers.\n      this.windowResizeLogger.logInitialDims();\n    }\n  }, {\n    key: \"onFirstLayoutFinished\",\n    value: function onFirstLayoutFinished() {\n      __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"load_time_ms\", Date.now() - LIFTOFF_START_TS);\n      this._autoclickBus.forEach(function (ac) {\n        return ac.emitHtmlLoadedEvent();\n      });\n    }\n  }, {\n    key: \"getLetterboxConfig\",\n    value: function getLetterboxConfig() {\n      return new __WEBPACK_IMPORTED_MODULE_5__letterbox_config__[\"a\" /* default */](this.snippetEl);\n    }\n  }, {\n    key: \"resolveAsset\",\n    value: function resolveAsset(assetType, assetID) {\n      var asset = this.assets[assetType + \"s\"][assetID];\n      if (asset == null) {\n        throw new Error(assetType + \": \" + assetID + \" not found\");\n      }\n\n      switch (assetType) {\n        // NOTE(oscar): By default, we should assume only 1 asset URL per original will be passed to the markup.\n        // Occasionally, we will test how we serve our assets, which may entail providing more than 1 version to\n        // be selected here.\n\n        // The common structure for an original asset is as follows:\n        /**\n         * {\n         *  \"id\",\n         *  \"asset-versions\": [{ \"public-url\", \"version-id\" }, ...]\n         * }\n         */\n        case \"image_original\":\n          return asset.image_versions[0][\"public-url\"];\n        case \"video_original\":\n          return asset.video_versions[0][\"public-url\"];\n      }\n\n      return asset.url;\n    }\n\n    /**\n     * Enables exclusive format creatives to listen for Madlib interaction events.\n     * Note: This method does not register interaction events for Madlib CSPs.\n     */\n\n  }, {\n    key: \"addVXInteractionEventListener\",\n    value: function addVXInteractionEventListener(cb) {\n      this.vxInteractionListeners.push(cb);\n    }\n  }]);\n\n  return Liftoff;\n}();\n\nObject.assign(Liftoff, {\n  Component: __WEBPACK_IMPORTED_MODULE_0__component__[\"a\" /* default */],\n  DOMUtils: __WEBPACK_IMPORTED_MODULE_9__frontendlib_dom_utils__,\n  LiftoffMRAID: __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */],\n  Logger: __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */],\n  Utils: __WEBPACK_IMPORTED_MODULE_10__frontendlib_utils__\n});\n\nwindow.Liftoff = Liftoff;\n\n/***/ }),\n/* 137 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__ = __webpack_require__(11);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__logger__ = __webpack_require__(6);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nvar overrideMethods = {\n  layout: true,\n  load: true,\n  resize: true,\n  start: true,\n  stop: true,\n  restart: true\n};\n\nvar Component = function (_EventListener) {\n  _inherits(Component, _EventListener);\n\n  _createClass(Component, null, [{\n    key: \"init\",\n    value: function init() {\n      this.registry = {};\n    }\n  }, {\n    key: \"register\",\n    value: function register(name, cls) {\n      if (this.registry[name] != null) {\n        throw new Error(\"ComponentError: \" + name + \" already registered\");\n      }\n\n      this.assertSubclassed(cls);\n      this.registry[name] = cls;\n    }\n  }, {\n    key: \"new\",\n    value: function _new(name, config) {\n      var cls = this.registry[name];\n      if (cls == null) {\n        throw new Error(\"ComponentError: component \\\"\" + name + \"\\\" not registered\");\n      }\n\n      return new cls(config);\n    }\n  }, {\n    key: \"assertSubclassed\",\n    value: function assertSubclassed(cls) {\n      var _this2 = this;\n\n      var methods = Object.getOwnPropertyNames(this.prototype);\n      methods.forEach(function (method) {\n        if (overrideMethods[method] !== true) return;\n        if (cls.prototype[method] === _this2.prototype[method]) {\n          throw new Error(\"ComponentError: \" + method + \" must be overridden\");\n        }\n      });\n    }\n  }]);\n\n  function Component(config) {\n    _classCallCheck(this, Component);\n\n    var _this = _possibleConstructorReturn(this, (Component.__proto__ || Object.getPrototypeOf(Component)).call(this));\n\n    _this.config = config;\n    _this.on({\n      start: function start() {\n        return _this.start();\n      },\n      stop: function stop() {\n        return _this.stop();\n      },\n      restart: function restart() {\n        return _this.restart();\n      }\n    });\n    return _this;\n  }\n\n  _createClass(Component, [{\n    key: \"error\",\n    value: function error(err) {\n      this.emit(\"error\", this.constructor.name + \"Error: \" + err);\n    }\n\n    // The layout method should prepare the component to take up a stable size and\n    // position within the DOM.\n\n  }, {\n    key: \"layout\",\n    value: function layout(parentNode) {\n      this.parentNode = parentNode;\n    }\n\n    // The load method should load assets. This is intended to capture the time it\n    // takes for the component to be fully visible (all images/videos loaded).\n\n  }, {\n    key: \"load\",\n    value: function load() {}\n  }, {\n    key: \"resize\",\n    value: function resize() {}\n  }, {\n    key: \"start\",\n    value: function start() {}\n  }, {\n    key: \"stop\",\n    value: function stop() {}\n  }, {\n    key: \"restart\",\n    value: function restart() {}\n  }, {\n    key: \"recordInteraction\",\n    value: function recordInteraction() {\n      __WEBPACK_IMPORTED_MODULE_1__logger__[\"a\" /* default */].recordMetricV2(\"interaction_count\", 1);\n    }\n  }, {\n    key: \"recordInteractionPromptReached\",\n    value: function recordInteractionPromptReached() {\n      __WEBPACK_IMPORTED_MODULE_1__logger__[\"a\" /* default */].recordMetricV2(\"interaction_prompt_reached_count\", 1);\n      if (window.Liftoff != null && window.Liftoff.setInteractionPromptReached != null) {\n        window.Liftoff.setInteractionPromptReached();\n      }\n    }\n  }]);\n\n  return Component;\n}(__WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__[\"a\" /* default */]);\n\nComponent.init();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component);\n\n/***/ }),\n/* 138 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * This config is used for letterboxing Madlib creatives. It works by changing the size\n * of liftoff-layout element (specific to Madlib), and scale it within liftoff-snippet\n * (provided by Liftoff.js).\n *\n * Arguably the better way to implement letterboxing is by controlling the size of\n * liftoff-snippet element based on Madlib configuration (i.e. fixed size or\n * stretchable, in the future), for example, by displaying Madlib creative in\n * an iFrame. If iFrames do not involve performance penalty, it would be\n * preferable since it would be another step to unify Madlib and CSP creatives.\n */\nvar LetterboxConfig = function () {\n  /**\n   * @typedef {Object} Dimensions\n   * @property {number} width - The width of the element.\n   * @property {number} height - The height of the element.\n   */\n\n  /**\n   * @typedef {Object} LetterboxConfigData\n   * @property {Dimensions} viewportSize - The size of the viewport.\n   * @property {Dimensions} bidCreativeSize - The size of the bid creative.\n   * @property {boolean} enable - Indicates if the creative should be letterboxed.\n   * @property {boolean} useDarkRootBackground - Indicates if the root element should use a dark background.\n   * @property {boolean} useLayoutBackground - Indicates if the layout element should use its own light-colored background.\n   */\n\n  function LetterboxConfig(snippetEl) {\n    _classCallCheck(this, LetterboxConfig);\n\n    this.snippetEl = snippetEl;\n\n    /** @type {LetterboxConfigData} */\n    this.config = this.getLetterboxConfig();\n  }\n\n  _createClass(LetterboxConfig, [{\n    key: \"enabled\",\n    value: function enabled() {\n      return this.config.enable;\n    }\n  }, {\n    key: \"useDarkRootBackground\",\n    value: function useDarkRootBackground() {\n      return this.config.useDarkRootBackground;\n    }\n  }, {\n    key: \"useLayoutBackground\",\n    value: function useLayoutBackground() {\n      return this.config.useLayoutBackground;\n    }\n\n    /**\n     * Choose the appropriate config based on viewport dimensions.\n     * If one orientation's config is missing, default to the other one.\n     */\n\n  }, {\n    key: \"getCreativePreferredOrientation\",\n    value: function getCreativePreferredOrientation(_ref) {\n      var width = _ref.width,\n          height = _ref.height;\n\n      return width <= height ? \"portrait\" : \"landscape\";\n    }\n\n    /**\n     * Analyze the viewport and make some decisions about how we will present our\n     * creative content.\n     * @returns {LetterboxConfigData}\n     */\n\n  }, {\n    key: \"getLetterboxConfig\",\n    value: function getLetterboxConfig() {\n      var dims = function dims(obj) {\n        return { width: obj.width, height: obj.height };\n      };\n\n      var viewportSize = dims(this.snippetEl.getBoundingClientRect());\n      var bidCreativeSize = dims(Liftoff.bidContext);\n\n      var viewportOrientation = viewportSize.width <= viewportSize.height ? \"portrait\" : \"landscape\";\n\n      // We are trying to show a portrait creative in a landscape-size viewport, or a landscape creative\n      // in a portrait-size viewport.\n      var orientationMismatch = viewportOrientation !== this.getCreativePreferredOrientation(bidCreativeSize);\n\n      var isRotated = Liftoff.bidContext.is_interstitial && orientationMismatch;\n\n      var useWhiteBars = isRotated;\n      var useDarkRootBackground = !useWhiteBars;\n      var useLayoutBackground = useDarkRootBackground;\n      var enable = useWhiteBars || isRotated;\n\n      return {\n        viewportSize: viewportSize,\n        bidCreativeSize: bidCreativeSize,\n        enable: enable,\n        useDarkRootBackground: useDarkRootBackground,\n        useLayoutBackground: useLayoutBackground\n      };\n    }\n\n    // Returns the scaling factor necessary to scale `contentSize` up to `viewportSize`\n    // whilst maintaining the aspect ratio of the content.\n\n  }, {\n    key: \"preserveAspectRatioScalingFactor\",\n    value: function preserveAspectRatioScalingFactor(contentSize, viewportSize) {\n      if (contentSize.height * viewportSize.width <= viewportSize.height * contentSize.width) {\n        return viewportSize.width / contentSize.width;\n      } else {\n        return viewportSize.height / contentSize.height;\n      }\n    }\n\n    // Given a letterbox config, returns information that is useful for laying out the various DOM elements.\n    // Returns an object with the following keys:\n    //   scaleFactor: the scale factor to be applied to the layout element\n    //   rootContainerSize: the width and height in pixels of the layout element\n    //   rootContainerOffset: the x and y coordinates in pixels of the layout element\n    //   rootContainerTransformedArea: expected values in pixels for the x, y, width, and height of the root\n    //     container after scale and rotation are applied\n\n  }, {\n    key: \"getLetterboxLayoutInfo\",\n    value: function getLetterboxLayoutInfo() {\n      var _config = this.config,\n          viewportSize = _config.viewportSize,\n          bidCreativeSize = _config.bidCreativeSize;\n\n\n      var scaleFactor = this.preserveAspectRatioScalingFactor(bidCreativeSize, viewportSize);\n      var rootContainerSize = bidCreativeSize;\n      var rootContainerOffset = {\n        x: (viewportSize.width - rootContainerSize.width) / 2,\n        y: (viewportSize.height - rootContainerSize.height) / 2\n      };\n\n      var rootContainerScaled = {\n        width: bidCreativeSize.width * scaleFactor,\n        height: bidCreativeSize.height * scaleFactor\n      };\n      var rootContainerTransformedArea = {\n        x: (viewportSize.width - rootContainerScaled.width) / 2,\n        y: (viewportSize.height - rootContainerScaled.height) / 2,\n        width: rootContainerScaled.width,\n        height: rootContainerScaled.height\n      };\n\n      return {\n        scaleFactor: scaleFactor,\n        rootContainerSize: rootContainerSize,\n        rootContainerOffset: rootContainerOffset,\n        rootContainerTransformedArea: rootContainerTransformedArea\n      };\n    }\n  }, {\n    key: \"getLetterboxConstraintsForMadlibRootElement\",\n    value: function getLetterboxConstraintsForMadlibRootElement() {\n      var _getLetterboxLayoutIn = this.getLetterboxLayoutInfo(),\n          scaleFactor = _getLetterboxLayoutIn.scaleFactor,\n          rootContainerSize = _getLetterboxLayoutIn.rootContainerSize,\n          rootContainerOffset = _getLetterboxLayoutIn.rootContainerOffset;\n\n      return {\n        rootConstraints: {\n          left: rootContainerOffset.x + \"px\",\n          top: rootContainerOffset.y + \"px\",\n          width: rootContainerSize.width + \"px\",\n          height: rootContainerSize.height + \"px\"\n        },\n        rootPostLayoutTransform: \"scale(\" + scaleFactor + \")\"\n      };\n    }\n  }, {\n    key: \"getStyleForClickElement\",\n    value: function getStyleForClickElement() {\n      var _getLetterboxLayoutIn2 = this.getLetterboxLayoutInfo(),\n          rootContainerTransformedArea = _getLetterboxLayoutIn2.rootContainerTransformedArea;\n\n      return {\n        left: rootContainerTransformedArea.x + \"px\",\n        top: rootContainerTransformedArea.y + \"px\",\n        width: rootContainerTransformedArea.width + \"px\",\n        height: rootContainerTransformedArea.height + \"px\",\n        right: \"auto\",\n        bottom: \"auto\"\n      };\n    }\n  }]);\n\n  return LetterboxConfig;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (LetterboxConfig);\n\n/***/ }),\n/* 139 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__logger__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar initialScreenAngle = Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"getIn\"])(window, [\"screen\", \"orientation\", \"angle\"]);\n\nvar RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER = 0.1;\n\n/**\n * Logs window resize events to Adexp.\n */\n\nvar WindowResizeLogger = function () {\n  function WindowResizeLogger(snippetEl, enable_logging) {\n    var _this = this;\n\n    _classCallCheck(this, WindowResizeLogger);\n\n    // We log resizes at a lower sampling frequency, because the log messages can be very numerous.\n    this.enableResizeLogging = enable_logging ? Math.random() < RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER : false;\n\n    this.resizeCount = 0;\n    this.resizeLog = [];\n    this.snippetEl = snippetEl;\n\n    window.addEventListener(\"resize\", function () {\n      _this.logResizedDims();\n    });\n  }\n\n  _createClass(WindowResizeLogger, [{\n    key: \"_logDims\",\n    value: function _logDims() {\n      if (!this.enableResizeLogging) return;\n\n      var _snippetEl$getBoundin = this.snippetEl.getBoundingClientRect(),\n          width = _snippetEl$getBoundin.width,\n          height = _snippetEl$getBoundin.height;\n\n      var data = {\n        height: height,\n        width: width,\n        sinceStartMS: Date.now() - LIFTOFF_START_TS,\n        \"screen.orientation.angle\": Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"getIn\"])(window, [\"screen\", \"orientation\", \"angle\"]),\n        initialScreenAngle: initialScreenAngle,\n        resizeCount: this.resizeCount,\n        // Check support of rotation events.\n        supportsOrientationChange: \"onorientationchange\" in window,\n        supportsDeviceOrientation: \"ondeviceorientation\" in window,\n        \"window.innerWidth\": window.innerWidth,\n        \"window.innerHeight\": window.innerHeight,\n        \"documentElement.clientWidth\": document.documentElement != null && document.documentElement.clientWidth,\n        \"documentElement.clientHeight\": document.documentElement != null && document.documentElement.clientHeight\n      };\n      this.resizeLog = [].concat(_toConsumableArray(this.resizeLog), [data]);\n      __WEBPACK_IMPORTED_MODULE_0__logger__[\"a\" /* default */].recordLog(\"resize\", \"resize\", { resizeLog: this.resizeLog });\n    }\n  }, {\n    key: \"logInitialDims\",\n    value: function logInitialDims() {\n      this._logDims();\n    }\n  }, {\n    key: \"logResizedDims\",\n    value: function logResizedDims() {\n      this.resizeCount += 1;\n      this._logDims();\n    }\n  }]);\n\n  return WindowResizeLogger;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (WindowResizeLogger);\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// liftoff-58ea9097a7f92539efa7.js"," \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, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\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 = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 135);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4c081c14b06df0b018c2","export const appendParamObjectToURL = (url, params) => {\n  return appendQueryStringToURL(url, objToQueryString(params));\n};\n\nexport const appendQueryStringToURL = (url, queryString) => {\n  if (queryString === \"\") return url;\n\n  const separator = url.includes(\"?\") ? \"&\" : \"?\";\n\n  return `${url}${separator}${queryString}`;\n};\n\n// If any key in the `defaults` object doesn't exist in `target`, the key is\n// merged. Additional `sources` object arguments are merged into `target`, but\n// only the keys that exist in `defaults`.\nexport const assignWithDefaults = (target, defaults, ...sources) => {\n  Object.keys(defaults).forEach((key) => {\n    if (!target.hasOwnProperty(key) || target[key] === undefined) {\n      target[key] = defaults[key];\n    }\n\n    sources\n      .filter((source) => {\n        return (\n          source != null &&\n          source.hasOwnProperty(key) &&\n          source[key] !== undefined\n        );\n      })\n      .forEach((source) => (target[key] = source[key]));\n  });\n\n  return target;\n};\n\n/**\n * Takes an ordered array and returns the first value where fn(value) returns true.\n */\nexport const binaryFind = (arr, fn) => {\n  let high = arr.length + 1;\n  let low = 0;\n  while (low + 1 < high) {\n    const mid = low + ((high - low) >> 1);\n    if (fn(arr[mid])) {\n      high = mid;\n    } else {\n      low = mid;\n    }\n  }\n\n  return arr[high];\n};\n\nexport const camelCase = (str, { isSuffix = false } = {}) => {\n  return str\n    .split(/[-_]/g)\n    .map((part, i) =>\n      i === 0 && !isSuffix ? part.toLowerCase() : capitalize(part.toLowerCase())\n    )\n    .join(\"\");\n};\n\nexport const capitalize = (str) => {\n  if (str === \"\") return str;\n\n  return `${str[0].toUpperCase()}${str.slice(1)}`;\n};\n\nexport const clamp = (x, a, b) => {\n  if (a > b) {\n    return clamp(x, b, a);\n  }\n\n  if (x < a) {\n    return a;\n  }\n\n  if (x > b) {\n    return b;\n  }\n\n  return x;\n};\n\nexport const clone = (obj) => {\n  if (obj === undefined) return undefined;\n\n  return JSON.parse(JSON.stringify(obj));\n};\n\nexport const compareNumbers = (a, b) => {\n  if (a == null && b == null) return 0;\n  else if (a == null) return -1;\n  else if (b == null) return 1;\n\n  return a - b;\n};\n\nexport const compareStrings = (a, b) => {\n  return (a || \"\")\n    .trim()\n    .toLowerCase()\n    .localeCompare((b || \"\").trim().toLowerCase());\n};\n\n/**\n * Composes functions such that any returned Promise is resolved before the next invocation.\n * @param  {Function[]} funcs - A list of potentially async functions that each take a single param. Any null/\n * undefined values are ignored.\n */\nexport const composeAsync = (...funcs) => {\n  return (arg) => {\n    let res = Promise.resolve(arg);\n    for (let i = funcs.length - 1; i >= 0; i--) {\n      const f = funcs[i];\n      if (f == null) {\n        continue;\n      }\n      res = res.then((arg) => f(arg));\n    }\n    return res;\n  };\n};\n\nexport const smartCompare = (a, b, { reverse = false } = {}) => {\n  if (a === b) return 0;\n  if (type(a) !== type(b) && b != null && a != null) {\n    throw new Error(\n      `Don't know how to compare type ${type(a)} with type ${type(b)}!`\n    );\n  }\n  const compareType = a != null ? type(a) : type(b);\n\n  const [valueA, valueB] = reverse ? [b, a] : [a, b];\n  switch (compareType) {\n    case \"string\":\n      return compareStrings(valueA, valueB);\n    case \"number\":\n      return compareNumbers(valueA, valueB);\n    default:\n      // TODO(oscar): Add more types for comparison such as Dates.\n      throw new Error(`Missing method for comparing type ${compareType}`);\n  }\n};\n\n/**\n * Recursively compares 2 JS objects.\n * @param {any} a\n * @param {any} b\n * @param {Object} options\n * @param {boolean} options.toJSON - Uses clone() in order to compare objects as\n * their JSON representations.\n * Useful when comparing plain objects to class instances.\n */\nexport const deepEqual = (a, b, { toJSON = false } = {}) => {\n  if (a === b) {\n    return true;\n  }\n\n  const compareA = toJSON ? clone(a) : a;\n  const compareB = toJSON ? clone(b) : b;\n  const tA = type(compareA);\n  const tB = type(compareB);\n\n  if (tA === \"array\" && tB === \"array\") {\n    if (compareA.length !== compareB.length) return false;\n\n    for (let i = 0; i < compareA.length; i++) {\n      if (!deepEqual(compareA[i], compareB[i])) return false;\n    }\n\n    return true;\n  }\n\n  if (tA === \"set\" && tB === \"set\") {\n    if (compareA.size !== compareB.size) return false;\n\n    const bShallowCopy = new Set(compareB);\n    aLoop: for (const aElement of compareA) {\n      // First check if there's an equivalent reference in the two sets before checking for deep equality,\n      // since the latter is very inefficient.\n      if (bShallowCopy.has(aElement)) {\n        bShallowCopy.delete(aElement);\n        continue;\n      }\n\n      for (const bElement of bShallowCopy) {\n        if (deepEqual(aElement, bElement)) {\n          bShallowCopy.delete(bElement);\n          continue aLoop;\n        }\n      }\n\n      return false;\n    }\n\n    return true;\n  }\n\n  if (tA === \"object\" && tB === \"object\") {\n    for (const k in compareA) {\n      if (!(k in compareB)) return false;\n    }\n\n    for (const k in compareB) {\n      if (!(k in compareA) || !deepEqual(compareA[k], compareB[k]))\n        return false;\n    }\n\n    return true;\n  }\n\n  return compareA === compareB;\n};\n\nexport const deepInclude = (parent, child) => {\n  if (type(parent.some) === \"function\") {\n    return parent.some((obj) => deepEqual(obj, child));\n  } else if (type(parent) === \"object\") {\n    return Object.values(parent).some((obj) => deepEqual(obj, child));\n  }\n  return false;\n};\n\nexport const deepUnique = (arr) => {\n  let index = 0;\n  while (index < arr.length) {\n    const item = arr[index];\n    arr = arr\n      .slice(0, index + 1)\n      .concat(\n        arr.slice(index).filter((currItem) => !deepEqual(item, currItem))\n      );\n    index += 1;\n  }\n\n  return arr;\n};\n\n/**\n * @param {Object} a\n * @param {Object} b\n * @param {boolean} includeAKeys\n * @returns {Object} - An object containing keys in `b` if the values differ\n * from those in `a`. If `includeAKeys` is true, the keys in `a` that are NOT in\n * `b` are also included.\n */\nexport const diffObjects = (a, b, includeAKeys = false) => {\n  const result = {};\n  for (const k in b) {\n    if (!deepEqual(a[k], b[k])) {\n      result[k] = b[k];\n    }\n  }\n  if (includeAKeys) {\n    for (const k in a) {\n      if (!(k in b)) {\n        result[k] = null;\n      }\n    }\n  }\n\n  return result;\n};\n\n// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\nexport const escapeRegExp = (str) => {\n  return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, \"\\\\$&\");\n};\n\nexport const flatten = (arr) => {\n  return [].concat.apply([], arr);\n};\n\n/**\n * Takes a list of words and joins them via coordinating conjunction grammar rules. Oxford comma is mandatory.\n * @param {String[]} words\n */\nexport const formatConjunction = (words, conjunction = \"and\") => {\n  const wc = words.length;\n  if (wc <= 2) {\n    return words.join(` ${conjunction} `);\n  } else {\n    return [...words.slice(0, wc - 1), `${conjunction} ${words[wc - 1]}`].join(\n      \", \"\n    );\n  }\n};\n\nexport const formatFileSize = (size) => {\n  // NOTE: Math.log10 is not available in every browser and Math.log / Math.LN10\n  // is unreliable.\n  const thousands = Math.floor((`${size}`.length - 1) / 3);\n  return `${Math.round(size / Math.pow(10, 3 * thousands))}${\n    \"BKMGTP\"[thousands]\n  }`;\n};\n\nexport const formatUSD = (val, options = {}) => {\n  options = Object.assign(\n    {\n      style: \"currency\",\n      currency: \"USD\",\n    },\n    options\n  );\n\n  return type(val) !== \"number\" ? null : val.toLocaleString(\"en\", options);\n};\n\nexport const getLocale = () => {\n  const { navigator } = window;\n  if (navigator == null) return null;\n  return navigator.languages && navigator.languages.length\n    ? navigator.languages[0]\n    : navigator.language;\n};\n\n/**\n * This function is a wrapper for Number.toLocalString() however it tries to use\n * the device's language. If all else fails, it uses \"en\".\n *\n * TODO(oscar): Fix the Intl polyfill we use, so there's no issue using\n * `undefined` as the locale.\n */\nexport const numberToLocaleString = (n, options, locale) => {\n  const f = (locale) => {\n    try {\n      return Number(n).toLocaleString(locale, options);\n    } catch (e) {}\n  };\n  return f(locale) || f() || f(getLocale()) || f(\"en\");\n};\n\nexport const getIn = (m, ks, d) => {\n  if (m == null) return d;\n  if (ks.length === 1) {\n    return m[ks[0]];\n  }\n\n  return getIn(m[ks[0]], ks.slice(1));\n};\n\nexport const kebabCase = (str) => {\n  // A \"-\" will be inserted before every capital letter, so make sure the first\n  // character isn't capitalized.\n  str = str.charAt(0).toLowerCase() + str.slice(1);\n  // Convert camel case to kebab case.\n  str = str.replace(/[A-Z]/g, \"-$&\").toLowerCase();\n  // Convert snake case to kebab case.\n  str = str.replace(/_/g, \"-\");\n\n  return str;\n};\n\nexport const isPromise = (obj) => {\n  return Promise.resolve(obj) === obj;\n};\n\nexport const isEmpty = (obj) =>\n  obj == null ||\n  (Object.keys(obj).length === 0 &&\n    // Needed for iterables like `Set`.\n    Array.from(obj).length === 0 &&\n    (obj.size || 0) === 0);\n\nexport const loadImage = (url, crossOrigin = null) => {\n  if (!url) return Promise.reject(new Error(\"No image URL provided\"));\n\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    img.crossOrigin = crossOrigin;\n    img.addEventListener(\"load\", () => resolve(img));\n    img.addEventListener(\"error\", reject);\n    img.src = url;\n    if (img.complete) {\n      resolve(img);\n    }\n  });\n};\n\nexport const loadImages = (urls, crossOrigin = null) =>\n  Promise.all(\n    urls.filter((url) => url != null).map((url) => loadImage(url, crossOrigin))\n  );\n\nexport const mapByID = (arr, fn = null) => {\n  return arr.reduce((map, item) => {\n    map[item.id] = fn != null ? fn(item) : item;\n    return map;\n  }, {});\n};\n\nexport const mapcat = (arr, fn) => {\n  return [].concat.apply([], arr.map(fn));\n};\n\n// Like `Object.assign`, merges subsequent object arguments into the first\n// object argument `defaults`, but only keys that exist in `defaults`.\n// Unlike `Object.assign`, does not modify the first argument, but returns a\n// shallow clone instead.\nexport const mergePropertiesWithDefaults = (defaults, ...args) => {\n  if (args.length === 0) return defaults;\n\n  const target = Object.assign(defaults);\n  const keys = Object.keys(target);\n\n  args.forEach((source) => {\n    if (source == null) return;\n\n    keys.forEach((key) => {\n      if (source.hasOwnProperty(key) && source[key] !== undefined) {\n        target[key] = source[key];\n      }\n    });\n  });\n\n  return target;\n};\n\nexport const objFromQueryString = (str = location.search.slice(1)) => {\n  return str.split(\"&\").reduce((acc, part) => {\n    const [key, value] = part.split(\"=\", 2).map(decodeURIComponent);\n    if (key != null && value != null) {\n      acc[key] = value;\n    }\n\n    return acc;\n  }, {});\n};\n\nexport const objToQueryString = (obj) => {\n  return Object.keys(obj)\n    .filter((key) => obj[key] != null)\n    .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`)\n    .join(\"&\");\n};\n\n/**\n * Given a `Promise` that should resolve with a `Response` (e.g. a `Promise` returned by `fetch`), returns\n * a new Promise that will reject if 1) the original `Promise` rejects, 2) the original `Promise` resolves\n * with something that's not a `Response`, or 3) the original response had an error status.\n */\nconst wrapResponsePromise = (responsePromise) => {\n  return new Promise((resolve, reject) => {\n    return responsePromise\n      .then((response) => {\n        if (!(response instanceof Response && response.ok)) {\n          reject(response);\n          return;\n        }\n\n        resolve(response);\n      })\n      .catch(reject);\n  });\n};\n\n/**\n * Like `fetch` but returns a `Promise` that rejects if `!response.ok`. This allows calling code to handle\n * non-ok responses (e.g. 404s and 500s) using `Promise.catch`.\n */\nexport const errorSensitiveFetch = (...args) =>\n  wrapResponsePromise(fetch(...args));\n\nexport const postJSON = (url, json, options) => {\n  return makeJSONRequest(url, json, \"POST\", options);\n};\n\nexport const patchJSON = (url, json, options) => {\n  return makeJSONRequest(url, json, \"PATCH\", options);\n};\n\n/**\n * Sends a `fetch` request to `url` using the given `method` (e.g. \"GET\", \"POST\", \"PATCH\") and returns a\n * `Promise` that resolves with a `Response`. If `options.rejectOnErrorResponse === true`, the returned\n * `Promise` will reject if the sever returns an error response.\n */\nfunction makeJSONRequest(url, json, method, options = {}) {\n  const { rejectOnErrorResponse = false } = options;\n  const fetchPromise = fetch(url, {\n    body: JSON.stringify(json),\n    credentials: \"same-origin\",\n    headers: { \"Content-Type\": \"application/json; charset=utf-8\" },\n    method,\n  });\n  if (!rejectOnErrorResponse) {\n    return fetchPromise;\n  }\n  return wrapResponsePromise(fetchPromise);\n}\n\nexport const ping = (url) => {\n  const img = new Image();\n  img.src = url;\n};\n\n// Polls a `url` for up to `timeoutMS`. Assumes the response is a JSON object\n// with keys { state, value } where the values for `state` are one of\n// [\"success\", \"failed\", \"timeout\"].\nexport const poll = (url, timeoutMS) => {\n  let timedOut = false;\n  setTimeout(() => (timedOut = true), timeoutMS);\n\n  const request = () => {\n    if (timedOut) {\n      return Promise.reject(new Error(\"poll exceeded timeout duration\"));\n    }\n\n    return fetch(url, { credentials: \"same-origin\" })\n      .then((response) => response.json())\n      .then(({ state, value }) => {\n        switch (state) {\n          case \"success\":\n            return value;\n          case \"failed\":\n            throw new Error(\n              `poll received failed response with value: ${value}`\n            );\n          case \"timeout\":\n            return request();\n          default:\n            throw new Error(\n              `poll received response with unknown state: ${state}`\n            );\n        }\n      });\n  };\n\n  return request();\n};\n\nexport const precisionRound = (number, precision) => {\n  const factor = Math.pow(10, precision);\n\n  return Math.round(number * factor) / factor;\n};\n\nexport const randomInt = (low, high) => {\n  return low + Math.floor(Math.random() * (high - low));\n};\n\n// Returns an array of integers from [start, stop) (i.e. exclusive of stop).\n// Special case: if start === stop, return array with start as the only\n// element.\nexport const range = (start, stop, step = 1) => {\n  if (start === stop) return [start];\n\n  if (stop - start < 0 !== step < 0) {\n    throw new Error(`Invalid call to range: range(${start}, ${stop}, ${step})`);\n  }\n\n  return Array(((stop - start) / step) | 0)\n    .fill(null)\n    .map((_, i) => start + i * step);\n};\n\nexport const request = (method, url, headers = {}, body = null) => {\n  return new Promise((resolve, reject) => {\n    const req = new XMLHttpRequest();\n    req.onreadystatechange = () => {\n      if (req.readyState === 4 && req.status === 200) {\n        resolve(req);\n      }\n    };\n    req.addEventListener(\"load\", resolve.bind(null, req));\n    req.addEventListener(\"error\", reject.bind(null, req));\n    req.open(method.toUpperCase(), url);\n    Object.keys(headers).forEach((key) => {\n      req.setRequestHeader(key, headers[key]);\n    });\n    req.send(body);\n  });\n};\n\nexport const runAsync = (fn) => {\n  setTimeout(fn, 0);\n};\n\nexport const removeKeys = (source, keys) => {\n  if (source == null) return {};\n\n  return Object.keys(source)\n    .filter((key) => !keys.includes(key))\n    .reduce((target, key) => {\n      target[key] = source[key];\n\n      return target;\n    }, {});\n};\n\n/** Remove keys if their value is empty.  */\nexport const removeEmptyKeys = (source) => {\n  return selectKeys(source, (_, val) => !isEmpty(val));\n};\n\nexport const selectKeys = (source, keys) => {\n  if (source == null) return {};\n\n  switch (type(keys)) {\n    case \"array\":\n      return keys.reduce((target, key) => {\n        if (source.hasOwnProperty(key)) {\n          target[key] = source[key];\n        }\n\n        return target;\n      }, {});\n    case \"function\":\n      return Object.keys(source).reduce((target, key) => {\n        if (keys(key, source[key])) {\n          target[key] = source[key];\n        }\n\n        return target;\n      }, {});\n  }\n};\n\n/**\n * Reorders items randomly into a new Array.\n * @param {Iterable} arr\n * @returns {Array}\n */\nexport const shuffle = (arr) => {\n  const result = [...arr];\n  for (let i = result.length - 1; i > 0; i--) {\n    const j = Math.floor(Math.random() * (i + 1));\n    [result[i], result[j]] = [result[j], result[i]];\n  }\n  return result;\n};\n\n// Like `Array.sort()`, but maintains the relative order of array items with\n// equal sort values and does not mutate the original array.\nexport const stableSort = (arr, sortFn) => {\n  const index = arr.reduce((agg, item, i) => {\n    agg.set(item, i);\n\n    return agg;\n  }, new Map());\n\n  return arr\n    .slice()\n    .sort((a, b) => sortFn(a, b) || index.get(a) - index.get(b));\n};\n\nexport const timeDifference = (a, b) => {\n  const msPerSecond = 1000,\n    msPerMinute = msPerSecond * 60,\n    msPerHour = msPerMinute * 60,\n    msPerDay = msPerHour * 24,\n    msPerWeek = msPerDay * 7,\n    msPerMonth = msPerWeek * 4,\n    msPerYear = msPerMonth * 13,\n    elapsed = Math.abs(a - b);\n  if (a <= b && elapsed < 1000 * 10) {\n    return \"just now\";\n  } else {\n    let val, units;\n    if (elapsed < msPerMinute) {\n      val = Math.round(elapsed / msPerSecond);\n      units = \"second\";\n    } else if (elapsed < msPerHour) {\n      val = Math.round(elapsed / msPerMinute);\n      units = \"minute\";\n    } else if (elapsed < msPerDay) {\n      val = Math.round(elapsed / msPerHour);\n      units = \"hour\";\n    } else if (elapsed < msPerWeek) {\n      val = Math.round(elapsed / msPerDay);\n      units = \"day\";\n    } else if (elapsed < msPerMonth) {\n      val = Math.round(elapsed / msPerWeek);\n      units = \"week\";\n    } else if (elapsed < msPerYear) {\n      val = Math.round(elapsed / msPerMonth);\n      units = \"month\";\n    } else {\n      val = Math.round(elapsed / msPerYear);\n      units = \"year\";\n    }\n\n    return [\n      val,\n      `${units}${val === 1 ? \"\" : \"s\"}`,\n      a < b ? \"ago\" : \"from now\",\n    ].join(\" \");\n  }\n};\n\nexport const type = (object) => {\n  return {}.toString\n    .call(object)\n    .match(/\\s([a-zA-Z]+)/)[1]\n    .toLowerCase();\n};\n\n/** Returns a Promise that resolves after `ms` ms. */\nexport const wait = (ms) => {\n  return new Promise((resolve) => {\n    setTimeout(resolve, ms);\n  });\n};\n\n/** Returns a Promise that rejects after `ms` ms. */\nexport const timeout = (ms) => {\n  return new Promise((_, reject) => {\n    setTimeout(() => reject(new Error(`Promise timed out after ${ms}ms`)), ms);\n  });\n};\n\nexport const unique = (arr) => {\n  return arr.filter((el, i) => arr.indexOf(el) === i);\n};\n\nexport const isFunction = (object) => type(object) === \"function\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/frontendlib/utils.js","import {\n  camelCase,\n  type,\n  range,\n  binaryFind,\n  isFunction,\n  timeout,\n} from \"./utils\";\n\nexport const addOneTimeListener = (\n  el,\n  eventName,\n  fn,\n  ignoreBubbling = false\n) => {\n  const listener = (event) => {\n    if (ignoreBubbling && event.target !== el) return;\n\n    el.removeEventListener(eventName, listener);\n    fn(event);\n  };\n  el.addEventListener(eventName, listener);\n};\n\n/** Responds to the first event triggered. Useful for polyfilling webkit prefixed events. */\nconst eventRacePromise = (\n  el,\n  events,\n  { timeout, matchTarget = false } = {}\n) => {\n  const eventsString = [].concat(events).join(\" \");\n  return new Promise((resolve) => {\n    let callbackRun = false;\n    const callback = (...args) => {\n      if (callbackRun || (matchTarget && el !== args[0].target)) return;\n      callbackRun = true;\n      resolve(...args);\n      off(el, { [eventsString]: callback });\n    };\n\n    on(el, { [eventsString]: callback });\n    if (timeout != null) {\n      setTimeout(() => callback({ message: \"Promise timed out.\" }), timeout);\n    }\n  });\n};\n\nexport const animationEndPromise = (el, options = {}) => {\n  return eventRacePromise(el, \"animationend webkitAnimationEnd\", options);\n};\n\nexport const transitionEndPromise = (el, options = {}) => {\n  return eventRacePromise(el, \"transitionend webkitTransitionEnd\", options);\n};\n\n/**\n * Given:\n *   - `el` - a DOM node\n *   - `transitions` - an array where each element is either 1) a function, or 2) an object of style property\n *     names to values\n * this sequentially 1) runs the function and waits for the Promise returned by the function to resolve (if\n * the function returns a Promise) before moving onto the next step, or 2) applies the styles to `el` and\n * waits for a `transitionend` event before moving onto the next step. Returns a Promise. `timeoutMS` is\n * an optional duration (in ms) after which the next transition should be run even if the previous transition\n * has not completed or if the previous function's returned promise has not resolved.\n */\nexport const runTransitionSequence = (\n  el,\n  transitions,\n  { timeoutMS = null, continueFn = () => true } = {}\n) => {\n  return transitions.reduce((prevTransitionEndPromise, thisTransition) => {\n    return prevTransitionEndPromise.finally(() => {\n      if (!continueFn()) {\n        return Promise.resolve();\n      }\n\n      let currentTransitionEndPromise;\n      if (isFunction(thisTransition)) {\n        currentTransitionEndPromise = thisTransition();\n      } else {\n        currentTransitionEndPromise = transitionEndPromise(el);\n        Object.assign(el.style, thisTransition);\n      }\n\n      if (timeoutMS == null) {\n        return currentTransitionEndPromise;\n      }\n\n      return Promise.race([timeout(timeoutMS), currentTransitionEndPromise]);\n    });\n  }, Promise.resolve());\n};\n\nexport const appendChildren = (node, children) => {\n  const fragment = document.createDocumentFragment();\n\n  children.forEach((child) => {\n    if (!child) return;\n\n    fragment.appendChild(child instanceof Node ? child : createElement(child));\n  });\n\n  node.appendChild(fragment);\n};\n\nexport const copyToClipboard = (text, multiline) => {\n  const elemType = multiline ? \"textarea\" : \"input\";\n  const el = document.createElement(elemType);\n  document.body.appendChild(el);\n  el.value = text;\n  el.select();\n  document.execCommand(\"copy\");\n  el.remove();\n};\n\n/**\n * @param {Object} elementConfig A map of options specifying a new Element.\n * @param {String} [elementConfig.namespace = null] A namespace URI to associate with the new element.\n * See https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS for details.\n * @param {String} [elementConfig.tagName = \"div\"] The tag name determining the result\n * Element's type. Defaults to \"div\".\n * @param {String[]} [elementConfig.classList = []] A list of classes. Falsy values\n * are ignored. Defaults to [].\n * @param {{}} [elementConfig.style = {}] A map of style settings to merge into the result\n * Element's style. Defaults to {}.\n * @param {{}} [elementConfig.attributes = {}] A map of attributes to set on the result\n * Element. Defaults to {}.\n * @param {{}} [elementConfig.data = {}] A map of data to merge into the result Element's\n * dataset. Defaults to {}.\n * @param {({}|Element)[]} [elementConfig.children = []] An array of Elements or\n * elementConfigs to append as children. Falsy values are ignored. Defaults to [].\n * @param {{}} [elementConfig.eventHandlers = {}] A map from event names to handlers,\n * which will all be assigned to listen on the result Element. Defaults to {}.\n * @returns {HTMLElement} An Element object with properties corresponding to the parameters.\n */\nexport const createElement = (elementConfig) => {\n  if (type(elementConfig) === \"string\" || type(elementConfig) === \"number\") {\n    return document.createTextNode(elementConfig);\n  }\n\n  const {\n    namespace = null,\n    tagName = \"div\",\n    classList = [],\n    style = {},\n\n    attributes = {},\n    data = {},\n\n    children = [],\n\n    eventHandlers = {},\n    ...unintendedProps\n  } = elementConfig;\n\n  const unintendedKeys = Object.keys(unintendedProps);\n  if (unintendedKeys.length > 0) {\n    throw new Error(\n      `\\`createElement\\` must not receive unintended keys: ${JSON.stringify(\n        unintendedKeys\n      )}`\n    );\n  }\n\n  const element =\n    namespace == null\n      ? document.createElement(tagName)\n      : document.createElementNS(namespace, tagName);\n  const filteredClassList = (classList || []).filter((className) => className);\n  if (filteredClassList.length > 0) {\n    element.classList.add(...filteredClassList);\n  }\n  Object.assign(element.style, style);\n\n  Object.entries(attributes).forEach(([name, value]) => {\n    element.setAttribute(name, value);\n  });\n  Object.assign(element.dataset, data);\n\n  if (children.length > 0) {\n    appendChildren(element, children);\n  }\n\n  on(element, eventHandlers);\n\n  return element;\n};\n\nexport const empty = (node) => {\n  while (node.firstChild) {\n    node.removeChild(node.firstChild);\n  }\n\n  return node;\n};\n\nexport const fetchHTML = (url) => {\n  return fetch(url)\n    .then((response) => response.text())\n    .then(strToElement);\n};\n\nexport const firstAncestor = (node, selector, halt = \"body\") => {\n  while (node != null && !node.matches(selector)) {\n    if (node.matches(halt)) return null;\n\n    node = node.parentNode;\n  }\n\n  return node;\n};\n\n/**\n * Returns a DocumentFragment containing the given HTML string, or null if\n * the string is empty or falsey.\n */\nexport const fragmentFromString = (strHTML) => {\n  if (!strHTML) {\n    return null;\n  }\n\n  const templateEl = document.createElement(\"template\");\n  templateEl.innerHTML = strHTML;\n  return templateEl.content;\n};\n\n// Forces a reflow of the element so that cached styles are recomputed. This is\n// important for ensuring that animations are used when changing styles or CSS\n// classes via JS. See http://stackoverflow.com/q/11131875.\nexport const forceReflow = (el) => {\n  el.offsetHeight;\n};\n\nexport const generateSnippetMap = (html) => {\n  const wrapper = document.createElement(\"div\");\n  wrapper.innerHTML = html;\n  const snippets = [...wrapper.querySelectorAll(\"[data-snippet]\")].reduce(\n    (coll, node) => {\n      const name = node.dataset.snippet;\n      coll[name] = node;\n      node.removeAttribute(\"data-snippet\");\n      node.remove();\n\n      return coll;\n    },\n    {}\n  );\n\n  return (name) => {\n    if (snippets[name] == null) return;\n\n    return snippets[name].cloneNode(true);\n  };\n};\n\nexport const getCSSProperty = (node, property) => {\n  return window.getComputedStyle(node).getPropertyValue(property);\n};\n\nexport const getElementsByClass = (parent, classNames) => {\n  return classNames.reduce((elements, name) => {\n    elements[camelCase(name)] = parent.querySelector(`.${name}`);\n\n    return elements;\n  }, {});\n};\n\n// A version of `getBoundingClientRect` relative to a reference node instead\n// of the window.\nexport const getRelativeBoundingClientRect = (node, reference = null) => {\n  if (reference == null) {\n    reference = node.parentNode;\n  }\n\n  const rect = node.getBoundingClientRect();\n  const refRect = reference.getBoundingClientRect();\n  return {\n    top: rect.top - refRect.top,\n    bottom: rect.bottom - refRect.bottom,\n    left: rect.left - refRect.left,\n    right: rect.right - refRect.right,\n    width: rect.width,\n    height: rect.height,\n  };\n};\n\n// Determines a bounding rectangle that encompasses all given nodes.\nexport const getAggregateBoundingClientRect = (nodes) => {\n  return [...nodes].reduce(\n    (agg, node) => {\n      const rect = node.getBoundingClientRect();\n      agg.top = Math.min(agg.top, rect.top);\n      agg.bottom = Math.max(agg.bottom, rect.bottom);\n      agg.left = Math.min(agg.left, rect.left);\n      agg.right = Math.max(agg.right, rect.right);\n      agg.width = Math.max(agg.width, rect.left - agg.left + rect.width);\n      agg.height = Math.max(agg.height, rect.top - agg.top + rect.height);\n      return agg;\n    },\n    {\n      top: Infinity,\n      bottom: 0,\n      left: Infinity,\n      right: 0,\n      width: 0,\n      height: 0,\n    }\n  );\n};\n\n// Given an element, this will return an integer that is the maximum font size (in px) that allows all the\n// text to fit without overflow.\nexport const getFontSizeToFit = (el, maxFontSizePx = 24) => {\n  const startingFontSize = el.style.fontSize;\n  const startingOverflow = el.style.overflow;\n  el.style.overflow = \"hidden\";\n  let high = maxFontSizePx + 1;\n  let low = 0;\n  el.style.fontSize = `${high}px`;\n  while (low + 1 < high) {\n    const mid = low + ((high - low) >> 1);\n    el.style.fontSize = `${mid}px`;\n    if (el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth) {\n      high = mid;\n    } else {\n      low = mid;\n    }\n  }\n\n  el.style.fontSize = startingFontSize;\n  el.style.overflow = startingOverflow;\n  return low;\n};\n\n/**\n * Attempt to calculate the `font-size` needed to have the text of `el` fit within the given number of lines.\n *\n * This is far from a perfect solution as there are several factors that determine line count not to mention\n * occasional ambiguity of what constitutes a \"line\" when there's `innerHTML` to contend with.\n *\n * @param {HTMLElement} el - Element with text to fit `maxLines`.\n * @param {number} maxLines - Max line count to calculate for.\n * @param {number} [precision] - The amount in px to incrementally adjust `font-size` by to determine changes.\n * @return {number} - In px.\n */\nexport const getFontSizeToFitLines = (el, maxLines, precision = 0.5) => {\n  /**\n   * NOTE(oscar): The computed style of certain \"older\" properties should always be in px regardless of\n   * applied style.\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle\n   */\n  const fontSize = parseFloat(getCSSProperty(el, \"font-size\"));\n\n  const prevFontSizeStyle = el.style.fontSize;\n  const prevHeight = el.style.height;\n  const prevLineHeight = el.style.lineHeight;\n  el.style.height = \"unset\";\n\n  // NOTE(oscar): Ensures line-height is sensitive to changes in font-size.\n  el.style.lineHeight = \"10em\";\n\n  const computedFontSize =\n    binaryFind(range(precision, fontSize, precision), (value) => {\n      el.style.fontSize = `${value + precision}px`;\n      const lineHeight = parseFloat(getCSSProperty(el, \"line-height\"));\n      const paddingTop = parseFloat(getCSSProperty(el, \"padding-top\"));\n      const paddingBottom = parseFloat(getCSSProperty(el, \"padding-bottom\"));\n      const textHeight =\n        el.getBoundingClientRect().height - paddingTop - paddingBottom;\n      return textHeight > lineHeight * maxLines;\n    }) || fontSize;\n\n  el.style.height = prevHeight;\n  el.style.fontSize = prevFontSizeStyle;\n  el.style.lineHeight = prevLineHeight;\n  return computedFontSize;\n};\n\nexport const indexOf = (node) => {\n  return [].indexOf.call(node.parentNode.children, node);\n};\n\n// Returns a Promise that resolves when the passed Image is rendered (determined by polling for a non-zero\n// clientWidth and clientHeight).\nexport const imageIsRendered = (img, timeout = 10000) => {\n  const start = Date.now();\n  return new Promise((resolve, reject) => {\n    const checkRendered = () => {\n      if (Date.now() - start >= timeout) {\n        reject(new Error(`Timeout loading image \"${img.src}\"`));\n      } else if (img.clientWidth === 0 || img.clientHeight === 0) {\n        requestAnimationFrame(checkRendered);\n      } else {\n        resolve();\n      }\n    };\n\n    requestAnimationFrame(checkRendered);\n  });\n};\n\nexport const off = (node, events) => {\n  Object.keys(events).forEach((names) => {\n    const listener = events[names];\n\n    names\n      .trim()\n      .split(/\\s+/)\n      .forEach((name) => {\n        node.removeEventListener(name, listener);\n      });\n  });\n};\n\nexport const on = (node, events) => {\n  Object.keys(events).forEach((names) => {\n    const listener = events[names];\n\n    names\n      .trim()\n      .split(/\\s+/)\n      .forEach((name) => {\n        node.addEventListener(name, listener);\n      });\n  });\n};\n\nexport const onAnimationsComplete = (els, callback) => {\n  let animationsLeft = els.length;\n  els.forEach((el) => {\n    addOneTimeListener(el, \"webkitAnimationEnd\", () => {\n      animationsLeft -= 1;\n      if (animationsLeft === 0) {\n        callback();\n      }\n    });\n  });\n};\n\n// Returns a map of { units, value } for a CSS length property.\n// The length must be a string with \"px\" or \"%\" units or a value of 0.\nexport const parseCSSLength = (length) => {\n  if (length === 0 || length === \"0\") return { value: 0, units: \"px\" };\n\n  const match = /(.+)(px|%)/.exec(length);\n  if (!match) return null;\n\n  const [_, value, units] = match;\n  if (value == null || units == null) return null;\n\n  return { units, value: Number(value) };\n};\n\nexport const prependChild = (parentNode, node) => {\n  parentNode.insertBefore(node, parentNode.children[0]);\n\n  return parentNode;\n};\n\nexport const replaceStyle = (element, ...newStyles) => {\n  element.removeAttribute(\"style\");\n  Object.assign(element.style, ...newStyles);\n};\n\nexport const scrollIntoView = (node) => {\n  const rect = node.getBoundingClientRect();\n  const pRect = node.parentNode.getBoundingClientRect();\n  const topDiff = rect.top - pRect.top;\n  const botDiff = rect.bottom - pRect.bottom;\n\n  if (topDiff < 0 && botDiff > 0) {\n    node.parentNode.scrollTop += (topDiff + botDiff) / 2;\n  } else if (topDiff < 0) {\n    node.parentNode.scrollTop += topDiff;\n  } else if (botDiff > 0) {\n    node.parentNode.scrollTop += botDiff;\n  }\n};\n\nexport const strToElement = (str) => {\n  const div = document.createElement(\"div\");\n  div.innerHTML = str.replace(/\\n\\s*/g, \"\");\n\n  return div.firstChild;\n};\n\nexport const strToStyle = (str) => {\n  const style = document.createElement(\"style\");\n  style.innerHTML = str;\n\n  return style;\n};\n\n/** Writes `contentHTML` into `iframeEl`. */\nexport const writeToIframe = (iframeEl, contentHTML) => {\n  iframeEl.contentWindow.document.open();\n  iframeEl.contentWindow.document.write(contentHTML);\n  iframeEl.contentWindow.document.close();\n};\n\nexport const preparetagHTML = (tagHTML) => {\n  const wrapperEl = document.createElement(\"div\");\n  wrapperEl.innerHTML = tagHTML;\n\n  // Script tags must be reattached in order to run.\n  [...wrapperEl.querySelectorAll(\"script\")].forEach((originalScriptTag) => {\n    const replacementScriptTag = document.createElement(\"script\");\n    [...originalScriptTag.attributes].forEach(\n      ({ nodeName: name, nodeValue: value }) => {\n        replacementScriptTag.setAttribute(name, value);\n      }\n    );\n    replacementScriptTag.innerHTML = originalScriptTag.innerHTML;\n    originalScriptTag.parentNode.replaceChild(\n      replacementScriptTag,\n      originalScriptTag\n    );\n  });\n\n  return wrapperEl;\n};\n\nexport const appendImpressionTags = (containerEl, impressionTags) => {\n  impressionTags.forEach((tagHTML) => {\n    const wrapper = preparetagHTML(tagHTML);\n    containerEl.append(wrapper);\n  });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/frontendlib/dom_utils.js","export const PLATFORM_ANDROID = \"android\";\nexport const PLATFORM_IOS = \"ios\";\n\nexport const AUDIO_POLICY_ALWAYS_MUTE = \"always-mute\";\nexport const AUDIO_POLICY_ON_INTERACTION = \"on-interaction\";\nexport const AUDIO_POLICY_NO_RESTRICTIONS = \"no-restrictions\";\n\n// TODO(Casey): Use constants instead of string literals for all exchanges\n// throughout.\nexport const EXCHANGE_APPLOVIN = \"applovin\";\nexport const EXCHANGE_DOUBLECLICK = \"doubleclick\";\nexport const EXCHANGE_INNERACTIVE = \"inneractive-direct\";\nexport const EXCHANGE_IRONSOURCE = \"ironsource\";\nexport const EXCHANGE_MOPUB = \"mopub\";\nexport const EXCHANGE_MINTEGRAL = \"mintegral\";\nexport const EXCHANGE_VUNGLE = \"vungle\";\n\nexport const ORIENTATION_PORTRAIT = \"portrait\";\nexport const ORIENTATION_LANDSCAPE = \"landscape\";\n\n// These must correspond to the rtb.proto ConnectionType enum definition.\nexport const CONNECTION_TYPE_WIFI = 2;\n\n// These must correspond to the rtb.proto ClickAreaType enum definition.\nexport const CLICK_AREA_TYPE_OTHER = 1;\nexport const CLICK_AREA_TYPE_CTA = 3;\n\nexport const CLICK_METRIC_TYPE_CLOSE = \"CLOSE\";\nexport const CLICK_METRIC_TYPE_CTA = \"CTA\";\nexport const CLICK_METRIC_TYPE_DEADZONE = \"DEADZONE\";\nexport const CLICK_METRIC_TYPE_UNKNOWN = \"UNKNOWN_CLICK_TYPE\";\n\n// This must correspond to the rtb.proto ClickRejectionReason enum definition.\nexport const CLICK_REJECTION_REASON_UNKNOWN = 0;\nexport const CLICK_REJECTION_REASON_NO_INTERACTIONS = 1;\n\n// This must correspond to the auction.proto ClickthroughURLType.\nexport const CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT = 1;\nexport const CLICKTHROUGH_URL_TYPE_APP_STORE = 2;\n\n// This must correspond to the auction.proto ClickTrackingURLType.\nexport const CLICK_TRACKING_URL_TYPE_UNKNOWN = 0;\nexport const CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT = 1;\n\n// This must correspond to the rtb.proto TrackingMethod enum definition.\nexport const TRACKING_METHOD_OPEN_METHOD = 1;\nexport const TRACKING_METHOD_IMAGE = 2;\nexport const TRACKING_METHOD_BEACON = 3;\n\nexport const AUTOCLICK_TYPE_LAST_INTERACTION = \"lastInteraction\";\nexport const AUTOCLICK_TYPE_INTERACTION_COUNT = \"interactionCount\";\nexport const AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT =\n  \"lastInteractionAndInteractionCount\";\nexport const AUTOCLICK_TYPE_COMPLETED_DELAY = \"completedDelay\";\nexport const AUTOCLICK_TYPE_LOAD_DELAY = \"loadDelay\";\nexport const AUTOCLICK_TYPE_VIEWABLE_DELAY = \"viewableDelay\";\nexport const AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET =\n  \"viewableDelayWithReset\";\n\nexport const CLICK_OPEN_METHOD_WINDOW_OPEN = \"window_open\";\nexport const CLICK_OPEN_METHOD_MRAID = \"mraid\";\nexport const CLICK_OPEN_METHOD_ANCHOR = \"anchor\";\nexport const CLICK_OPEN_METHOD_LOCATION = \"location\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/constants.js","import {\n  AdexpLog,\n  AdexpMetricV2,\n  AdexpMessage,\n  AdexpJavaScriptError,\n} from \"./adexp\";\nimport {\n  normalizeError,\n  normalizeErrorEvent,\n  shouldIgnoreError,\n} from \"../error_handling\";\nimport { request } from \"../frontendlib/utils\";\n\n/**\n * Sends log to Adexp.\n */\nconst postJSON = (url, data) => {\n  /**\n   * TODO(oscar): Investigate if we could improve empty payloads.\n   * @see https://github.com/liftoffio/liftoff/pull/25293\n   */\n  if (data == null) {\n    console.error(\"No data to post for logging.\");\n    return Promise.resolve();\n  }\n  const payload = JSON.stringify(data);\n\n  if (payload.length < 2) {\n    console.error(\"Data could not be stringified for logging.\");\n    return Promise.resolve();\n  }\n\n  return request(\n    \"POST\",\n    url,\n    {\n      // Don't set the content type to \"application/json\" because that requires\n      // a preflight OPTIONS request (because this is a cross-domain request).\n      \"Content-Type\": \"text/plain\",\n    },\n    payload\n  ).catch(() => {\n    console.error(\"Failed to post JSON for logging.\");\n  });\n};\n\nconst postMetricV2 = (\n  { adexpContextSnapshotFn, endpoint, eventTrackingParam },\n  name,\n  value\n) => {\n  const adexpContext = adexpContextSnapshotFn();\n  const payload = new AdexpMessage({\n    context: adexpContext,\n    metric: new AdexpMetricV2(name, value),\n  });\n\n  return postJSON(`${endpoint}/adexp_metrics/${eventTrackingParam}`, payload);\n};\n\nclass Logger {\n  // #if process.env.NODE_ENV === \"test\"\n//   static resetForTests() {\n//     delete this.enabled;\n//     delete this.loggedErrors;\n//     delete this.endpoint;\n//     delete this.eventTrackingParam;\n//     delete this.adexpContextSnapshotFn;\n//   }\n  // #endif\n\n  static init() {\n    this.enabled = false;\n    this.loggedErrors = [];\n  }\n\n  static enable() {\n    this.enabled = true;\n  }\n\n  /**\n   * Pass the logger required context\n   * @param {string} endpoint - The endpoint to which the creative will post\n   * AdExp logs or metrics.\n   * @param {string} eventTrackingParam - The tracking parameter string which\n   * includes encoded bid context information.\n   * @param {function} adexpContextSnapshotFn - A function to call that will\n   * take a snapshot of the current environment and return an `AdexpContext`\n   * object.\n   */\n  static passContext(endpoint, eventTrackingParam, adexpContextSnapshotFn) {\n    this.endpoint = endpoint;\n    this.eventTrackingParam = eventTrackingParam;\n    this.adexpContextSnapshotFn = adexpContextSnapshotFn;\n  }\n\n  /**\n   * Listens for errors that are caught by the window and reports them to adexp.\n   * Don't call this if you use your own custom error handlers.\n   */\n  static addErrorListeners() {\n    window.addEventListener(\"error\", (errorEvent) => {\n      const normalizedError = normalizeErrorEvent(errorEvent);\n      this.recordError(normalizedError);\n    });\n  }\n\n  /**\n   * recordError takes an object like:\n   * { message, line, column, sourceURL ... }\n   * and logs the error to adexp.\n   */\n  static recordError(e) {\n    this.recordLabeledError(\"error\", e);\n  }\n\n  static recordLabeledError(tag, e) {\n    // #if process.env.NODE_ENV !== \"test\"\n    console.error(e);\n    // #endif\n    this._processError(tag, e);\n  }\n\n  static _processError(tag, errorObj) {\n    if (shouldIgnoreError(errorObj)) {\n      return;\n    }\n\n    const normalizedErr = normalizeError(errorObj);\n\n    // Only log one error per (sourceURL, line #, message) combination. This\n    // prevents noise from certain errors that are logged many times\n    // from a single impression.\n    const errorIdentifier = [\n      normalizedErr.sourceURL,\n      normalizedErr.line,\n      normalizedErr.message,\n    ].join(\"-\");\n\n    if (this.loggedErrors.includes(errorIdentifier)) {\n      return;\n    }\n\n    this.loggedErrors.push(errorIdentifier);\n    this.recordLog(\n      tag,\n      normalizedErr.message,\n      new AdexpJavaScriptError(normalizedErr)\n    );\n  }\n\n  static recordLog(tag, message, data) {\n    if (!this.enabled) {\n      return;\n    }\n\n    const adexpContext = this.adexpContextSnapshotFn();\n    const payload = new AdexpMessage({\n      context: adexpContext,\n      log: new AdexpLog(tag, message, data),\n    });\n\n    return postJSON(\n      `${this.endpoint}/adexp_log/${this.eventTrackingParam}`,\n      payload\n    );\n  }\n\n  static recordMetricV2(name, value) {\n    if (!this.enabled) {\n      return Promise.resolve();\n    }\n    return postMetricV2(\n      {\n        endpoint: this.endpoint,\n        eventTrackingParam: this.eventTrackingParam,\n        adexpContextSnapshotFn: this.adexpContextSnapshotFn,\n      },\n      name,\n      value\n    );\n  }\n\n  static recordVXOnlyAdexpMetric(name, value) {\n    if (!Number.isInteger(value)) {\n      console.debug(\"Expected an integer value for VXOnlyAdexpMetric: \" + name);\n      return;\n    }\n\n    return this.alwaysRecordMetricV2(\"custom_event\", {\n      name: name,\n      value: value,\n    });\n  }\n\n  static alwaysRecordMetricV2(name, value) {\n    return postMetricV2(\n      {\n        endpoint: this.endpoint,\n        eventTrackingParam: this.eventTrackingParam,\n        adexpContextSnapshotFn: this.adexpContextSnapshotFn,\n      },\n      name,\n      value\n    );\n  }\n}\n\n// TODO(oscar): Create a global Logger.\nLogger.init();\n\nexport default Logger;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/logger.js","class AutoclickBehaviorAbstract {\n  constructor({ autoclick, behavior, delayClickthroughHandler }) {\n    this._autoclick = autoclick;\n    this._behavior = behavior;\n    this.internalCount = 0;\n    this.delayClickthroughHandler = delayClickthroughHandler;\n    this.init();\n  }\n\n  /** Runs when the class is instantiated. */\n  init() {}\n\n  /**\n   * Only relevant for types that count something like interactions.\n   * @returns {number} - Minimum amount until enabling delayed clickthrough.\n   */\n  getBehaviorCount() {\n    return this._behavior == null ? null : this._behavior.count;\n  }\n\n  getBehaviorType() {\n    return this._behavior == null ? null : this._behavior.type;\n  }\n\n  /**\n   * How long to delay clickthrough by.\n   * @returns {number} - Delay value in milliseconds.\n   */\n  getBehaviorDelay() {\n    return this._behavior == null ? null : this._behavior.delay;\n  }\n\n  isCountReached() {\n    return this.getCurrentCount() >= this.getBehaviorCount();\n  }\n\n  getCurrentCount() {\n    return this.internalCount;\n  }\n\n  setCurrentCount(n) {\n    if (typeof n !== \"number\") {\n      throw new Error(`n must be a number, got: ${n}`);\n    }\n    this.internalCount = n;\n  }\n\n  /** Triggers a delayed clickthrough event. */\n  delayClickthrough(delay = this.getBehaviorDelay()) {\n    if (!this.isCountReached()) return;\n\n    this.delayClickthroughHandler(delay);\n  }\n\n  /**\n   * Triggered by the InteractionMonitor class.\n   */\n  onInteraction(_) {}\n\n  /**\n   * Should trigger when the creative is \"finished\". Typically this is the moment\n   * an endscreen will appear.\n   */\n  onCompleted() {}\n\n  /**\n   * Triggers when an \"engagement\" event occurs. Engagement must be fired by the\n   * creative or a subcomponent thereof.\n   */\n  onEngagement() {}\n\n  onHtmlLoaded() {}\n\n  onViewable() {}\n\n  onViewableChange(_) {}\n}\nexport default AutoclickBehaviorAbstract;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/AutoclickBehaviorAbstract.js","import { mergePropertiesWithDefaults, selectKeys } from \"./frontendlib/utils\";\n\n// if process.env.NODE_ENV === \"test\"\nexport const isTestError = (error) => {\n  // NOTE(Austin): Annoyingly, assertion errors will loop back here in\n  // tests, so we have to ignore these.\n  return error != null && error.constructor.name === \"AssertionError\";\n};\n// #endif\n\nexport class Warning extends Error {\n  constructor(...params) {\n    super(...params);\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, Warning);\n    }\n    this.severity = \"warning\";\n  }\n}\n\nconst tryConvertStringToNumber = (str) => {\n  if (str == null) {\n    return 0;\n  }\n\n  const parsed = parseInt(str);\n  if (Number.isNaN(parsed)) {\n    return 0;\n  }\n\n  return parsed;\n};\n\nexport const tryParseStackInfo = (stack) => {\n  if (stack == null) {\n    return null;\n  }\n\n  const match = String(stack).match(\n    // NOTE(Austin): We include about:srcdoc for inner_env errors.\n    /(\\b(?:[^ ]*\\.js.*?)|(?:about:srcdoc)):(\\d+)?:?(\\d+)?/\n  );\n\n  if (match == null) {\n    return null;\n  }\n\n  // Line and column need to be integers. We have them in our adexp\n  // protobuf this way, so if they aren't we'll get a malformed message.\n  return {\n    sourceURL: match[1],\n    line: tryConvertStringToNumber(match[2]),\n    column: tryConvertStringToNumber(match[3]),\n  };\n};\n\n/**\n * Converts an Error or string into a map like\n * { message, stack, sourceURL, line, column }\n */\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Error\nexport const normalizeError = (obj) => {\n  if (obj == null) {\n    return null;\n  }\n\n  if (typeof obj === \"string\") {\n    return {\n      message: obj,\n    };\n  }\n\n  const errorProps = selectKeys(obj, Object.getOwnPropertyNames(obj));\n\n  return {\n    ...tryParseStackInfo(errorProps.stack),\n    ...errorProps,\n  };\n};\n\n/**\n * Converts an ErrorEvent object to a map like:\n * { message, line, column, sourceURL }\n * plus any additional information the error object contains.\n */\nexport const normalizeErrorEvent = ({\n  // https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent\n  message,\n  filename,\n  lineno,\n  colno,\n  error,\n}) => {\n  try {\n    // Possible keys in an ErrorEvent:\n    // [stack, name, fileName, lineNumber, columnNumber]\n    const errorProps =\n      error != null ? selectKeys(error, Object.getOwnPropertyNames(error)) : {};\n\n    const errorObj = {\n      message,\n      severity: error && error.severity ? error.severity : \"error\",\n      line: lineno,\n      column: colno,\n      sourceURL: filename,\n      ...errorProps,\n    };\n\n    if (error == null) {\n      return errorObj;\n    }\n\n    const parsedInfo = tryParseStackInfo(error.stack);\n    return mergePropertiesWithDefaults(errorObj, parsedInfo);\n  } catch (e) {\n    console.error(`Error in normalizeErrorEvent: ${e.stack}`);\n    return null;\n  }\n};\n\n/**\n * Converts an PromiseRejectionEvent object to a map like\n * { message, line, column, sourceURL }\n * plus any additional information the error object contains.\n */\nexport const normalizePromiseRejectionEvent = ({\n  // https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n  reason,\n}) => {\n  try {\n    const reasonIsError = reason instanceof Error;\n    const reasonIsString = typeof reason === \"string\";\n\n    const errorMessage = reasonIsString ? reason : reason.message;\n\n    // Possible keys in object (* are non-standard):\n    // [message, stack*, name, fileName*, lineNumber*, columnNumber*]\n    const errorProps = reasonIsError\n      ? selectKeys(reason, Object.getOwnPropertyNames(reason))\n      : {};\n\n    const errorObj = {\n      message: errorMessage,\n      ...errorProps,\n    };\n\n    return mergePropertiesWithDefaults(\n      errorObj,\n      tryParseStackInfo(reason.stack)\n    );\n  } catch (e) {\n    console.error(`Error in normalizePromiseRejectionEvent: ${e.stack}`);\n    return null;\n  }\n};\n\n/**\n * Normalizes the error and returns true if the error should be ingored;\n * otherwise, returns false.\n */\nexport const shouldIgnoreError = (errorObj) => {\n  // Report only errors with non-malformed sourceURL.\n  if (errorObj == null || errorObj.sourceURL === \"undefined\") {\n    return true;\n  }\n\n  // mraid.js from adverty.com is a buggy implemenation. SMAATO and PUBMATIC are\n  // the exchanges using such version and we see strange errors from the most.\n  // While we are working with them to get a good MRAID implementation we filter\n  // the noisy error messages by checking where the mraid.js is from.\n  const stackFilter = new RegExp(\"adverty\\\\.com/.*mraid\\\\.js\");\n\n  // We see these errors quite often, and they are not related to our code.\n  const regexFilters = [\n    \"Cannot read properties of undefined \\\\(reading 'fireEvent'\\\\)\",\n    \"Cannot read property 'fireEvent' of undefined\",\n    \"showInterstitial\",\n    \"al_onPoststitialDismiss\",\n    \"AFMA_ReceiveMessage\",\n    \"webviewDidAppear\",\n    \"AFMA_updateActiveView is not a function\",\n    \"al_onAdViewRendered\",\n    \"mraidbridge\",\n    \"MoatMAK\",\n    \"$adgIOS\",\n    \"googqscp\",\n    \"inmobi\",\n    \"Script error\",\n    \"avidbridge\",\n  ];\n  const messageFilter = new RegExp(regexFilters.join(\"|\"));\n  const errorStr = errorObj.message || errorObj.toString();\n  if (messageFilter.test(errorStr) || stackFilter.test(errorObj.stack)) {\n    return true;\n  }\n\n  const normalized = selectKeys(errorObj, [\n    \"message\",\n    \"line\",\n    \"column\",\n    \"stack\",\n    \"sourceURL\",\n  ]);\n\n  const nKeys = Object.keys(normalized).length;\n  const onlyMessage =\n    \"message\" in errorObj &&\n    nKeys === 1 &&\n    errorObj.message === \"undefined is not a function\";\n\n  const onlyMessageStack =\n    \"stack\" in errorObj &&\n    \"message\" in errorObj &&\n    nKeys === 2 &&\n    errorObj.stack === \"\" &&\n    errorObj.message === \"undefined is not a function\";\n\n  const noSourceURL = errorObj.sourceURL == null && nKeys === 5;\n  return onlyMessage || onlyMessageStack || noSourceURL;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/error_handling.js","import { selectKeys, type } from \"./utils\";\n\nclass EventListener {\n  static pubsubify(object) {\n    const methods = Object.getOwnPropertyNames(EventListener.prototype).filter(\n      (name) => name !== \"constructor\"\n    );\n    Object.assign(object, new EventListener());\n    Object.assign(object, selectKeys(EventListener.prototype, methods));\n  }\n\n  constructor() {\n    this.events = {};\n  }\n\n  on(map, callback) {\n    if (type(map) !== \"object\") {\n      map = { [map]: callback };\n    }\n\n    Object.keys(map).forEach((name) => {\n      if (this.events[name] == null) {\n        this.events[name] = [];\n      }\n\n      this.events[name].push(map[name]);\n    });\n  }\n\n  once(name, callback) {\n    const single = (...args) => {\n      this.off(name, single);\n      callback.apply(null, args);\n    };\n\n    this.on(name, single);\n  }\n\n  off(map, callback) {\n    if (type(map) !== \"object\") {\n      map = { [map]: callback };\n    }\n\n    Object.keys(map).forEach((name) => {\n      if (this.events[name] == null) return;\n\n      const callback = map[name];\n      if (callback == null) return delete this.events[name];\n\n      this.events[name] = this.events[name].filter((cb) => cb !== callback);\n      if (this.events[name].length === 0) {\n        delete this.events[name];\n      }\n    });\n  }\n\n  emit(name, ...args) {\n    if (this.events[name] == null) return;\n\n    return Promise.all(this.events[name].map((cb) => cb.apply(null, args)));\n  }\n\n  relay(listener, onEvent, emitEvent = onEvent) {\n    this.on(onEvent, listener.emit.bind(listener, emitEvent));\n  }\n}\n\nexport default EventListener;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/frontendlib/event_listener.js","import EventListener from \"../frontendlib/event_listener\";\nimport { runAsync, type, appendParamObjectToURL } from \"../frontendlib/utils\";\nimport {\n  EXCHANGE_IRONSOURCE,\n  EXCHANGE_MINTEGRAL,\n  EXCHANGE_VUNGLE,\n  EXCHANGE_INNERACTIVE,\n  TRACKING_METHOD_OPEN_METHOD,\n  CLICK_OPEN_METHOD_WINDOW_OPEN,\n  CLICK_OPEN_METHOD_MRAID,\n  CLICK_OPEN_METHOD_ANCHOR,\n  CLICK_OPEN_METHOD_LOCATION,\n} from \"../constants\";\nimport Logger from \"./logger\";\nimport { Warning } from \"../error_handling\";\n\n/**\n * This interval is the time between attempts to open a URL via different\n * methods (see `LiftoffMRAID.open`).\n */\nconst CLICK_RETRY_INTERVAL_MS = 1000;\n\nconst CLICK_OPEN_METHODS = {\n  WINDOW_OPEN: \"window_open\",\n  MRAID: \"mraid\",\n  ANCHOR: \"anchor\",\n  LOCATION: \"location\",\n};\n\n/**\n * This is a low-level wrapper around mraid that should be usable generally\n * (i.e. in any HTML ad environment). It's used by both madlib and third-party\n * creatives.\n */\nclass LiftoffMRAID {\n  /**\n   * Among other things, this function attaches event listeners to the\n   * window.mraid object. It should be called as soon as possible after\n   * window.mraid is defined. Because of this side-effect, it should also only\n   * be called once.\n   */\n  static init() {\n    this.liftoffMraidInitTimestamp = Date.now();\n\n    EventListener.pubsubify(this);\n    this.on = this.on.bind(this);\n    this.once = this.once.bind(this);\n    this._addMraidEventListener = this._addMraidEventListener.bind(this);\n\n    this.viewableDurationMS = null;\n    this.lastViewableTS = null;\n    this.clickRetryTimeout = null;\n    this.lastOpenedURL = null;\n    this.isOrientationLocked = false;\n    this.orientationToLock = null;\n    this.viewable = null;\n    this.isViewableByEvent = null;\n\n    /** Keeps track of each version of window.mraid loaded. */\n    this.mraids = [];\n    /** This index of this.mraids that is currently loaded on window.mraid. */\n    this.mraidIndex = null;\n\n    /**\n     * This object keeps track of what the current mraid object supports at the\n     * moment support was checked.\n     */\n    this.supported = {\n      methods: {},\n      /**\n       * NOTE(oscar): Unlike MRAID methods, we log mraid events that we listen\n       * to as they occur.\n       */\n      events: {},\n    };\n\n    this._setInitialState();\n    this._addEventListeners();\n  }\n\n  /** Returns time since LiftoffMRAID has been initialized in milliseconds. */\n  static sinceInit() {\n    return Date.now() - this.liftoffMraidInitTimestamp;\n  }\n\n  static getSupportedLog() {\n    return {\n      \"document.hidden\": document.hidden,\n      \"document.visibilityState\": document.visibilityState,\n      \"LiftoffMRAID.viewable\": LiftoffMRAID.viewable,\n      MRAID_ENV: window.MRAID_ENV,\n      ...this.supported,\n    };\n  }\n\n  static _setInitialState() {\n    const mraid = this.getMRAID();\n    this.ready = this._mraidTry(\n      () => {\n        return this.hasSupport(\"getState\") && mraid.getState() === \"default\";\n      },\n      { tag: \"getState\", fallback: false }\n    );\n\n    this.isViewableByEvent = this.hasSupport(\"isViewable\")\n      ? this._mraidTry(() => mraid.isViewable(), {\n          tag: \"isViewable\",\n          // NOTE(oscar): If isViewable() still fails, we fall back to\n          // document.visibilityState.\n          fallback: document.visibilityState !== \"hidden\",\n        })\n      : document.visibilityState !== \"hidden\";\n    this.processViewableChange(\n      this.isViewableByEvent && this.isViewportShown()\n    );\n    this.viewableDurationMS = 0;\n  }\n\n  /** TODO(oscar): Don't append to log if it won't be sent to Adexp. */\n  static _appendEventLog(eventName, mraidIndex, args) {\n    if (this.supported.events[eventName] == null) {\n      this.supported.events[eventName] = [];\n    }\n    this.supported.events[eventName].push({\n      sinceInitMs: this.sinceInit(),\n      args,\n      mraidIndex,\n      version: this.getMRAIDVersion(),\n    });\n  }\n\n  /**\n   * This function is used to wrap calls to mraid methods in a try/catch block.\n   * Any error gets logged in this.supported.errors.\n   *\n   * In general, this.hasSupport() is used to check for support. This function\n   * serves as a further safeguard against errors due to faulty mraid\n   * implementations.\n   */\n  static _mraidTry(\n    func,\n    { tag = \"other\", fallback = undefined, logError = true }\n  ) {\n    try {\n      return func();\n    } catch (e) {\n      if (logError) {\n        // Record the error.\n        this.supported.errors = this.supported.errors || [];\n        let version;\n        try {\n          version = this.getMRAID().getVersion();\n        } catch (ee) {\n          console.error(\"Failed to get MRAID version\", ee);\n        }\n        this.supported.errors.push({\n          tag,\n          sinceInitMs: this.sinceInit(),\n          message: e != null ? e.message : null,\n          mraidIndex: this.mraidIndex,\n          version,\n        });\n      }\n      return fallback;\n    }\n  }\n\n  static _addMraidEventListener(eventName, callback) {\n    if (!this.hasSupport(\"addEventListener\")) return;\n\n    const mraid = this.getMRAID();\n    const mraidIndex = this.mraidIndex;\n\n    this._mraidTry(\n      () => {\n        mraid.addEventListener(eventName, (...args) => {\n          this._appendEventLog(eventName, mraidIndex, args);\n\n          callback(...args);\n        });\n      },\n      { tag: eventName }\n    );\n  }\n\n  static _addEventListeners() {\n    // \"error\" events include 2 arguments: a message and an action. The action\n    // is the MRAID API call that caused the error.\n    this._addMraidEventListener(\"error\", (...args) => {\n      const e = new Error(`MRAID error: ${args}`);\n      this.emit(\"error\", e);\n    });\n    this._addMraidEventListener(\"ready\", () => {\n      if (this.ready) return;\n      this.ready = true;\n      this.emit(\"ready\");\n    });\n    this._addMraidEventListener(\"viewableChange\", (viewable) => {\n      this.isViewableByEvent = viewable;\n      this.processViewableChange(\n        this.isViewableByEvent && this.isViewportShown()\n      );\n    });\n\n    // NOTE(oscar): We're using _addMraidEventListener to log this event.\n    this._addMraidEventListener(\"exposureChange\", () => {});\n\n    /**\n     * The following is a fallback in case mraid's viewableChange is not\n     * supported.\n     */\n    document.addEventListener(\"visibilitychange\", (...args) => {\n      this._appendEventLog(\"document.visibilitychange\", this.mraidIndex, args);\n\n      /**\n       * We delay the following by an event cycle to allow mraid's\n       * viewableChange event to occur first.\n       */\n      runAsync(() => {\n        if (this.supported.events.viewableChange == null) {\n          this.isViewableByEvent = document.visibilityState !== \"hidden\";\n          this.processViewableChange(\n            this.isViewableByEvent && this.isViewportShown()\n          );\n        }\n      });\n    });\n  }\n\n  static processViewableChange(isViewable) {\n    /**\n     * NOTE(oscar): On the off chance the mraid implementation gives us\n     * truthy/falsey values instead.\n     */\n    const normalizedIsViewable = !!isViewable;\n    if (normalizedIsViewable === this.viewable) return;\n    this.viewable = normalizedIsViewable;\n\n    if (this.viewable) {\n      this.lastViewableTS = Date.now();\n      if (!this.isOrientationLocked && this.orientationToLock != null) {\n        // NOTE(oscar): We won't lock the orientation until after the ad is\n        // viewable.\n        this.lockOrientation(this.orientationToLock);\n      }\n    } else {\n      this.viewableDurationMS +=\n        this.lastViewableTS == null ? 0 : Date.now() - this.lastViewableTS;\n      this.lastOpenedURL = null;\n      clearTimeout(this.clickRetryTimeout);\n    }\n\n    if (this.viewable) {\n      this.emit(\"viewable\");\n    }\n    this.emit(\"viewableChange\", this.viewable);\n  }\n\n  static onReady(fn) {\n    if (this.ready) {\n      runAsync(fn);\n      return;\n    }\n    this.once(\"ready\", fn);\n  }\n\n  /**\n   * Adds a listener to the \"viewable\" event. The \"viewable\" event fires\n   * whenever we believe the ad has become visible to the user. If the ad was\n   * already visible, then it fires the listener immediately.\n   * @param {Function} callback\n   * @param {boolean} continuous – Whether to listen to all viewable events.\n   * Defaults to false, meaning it will only trigger the callback once.\n   * @returns\n   */\n  static onViewable(callback, continuous = false) {\n    if (this.viewable) {\n      runAsync(callback);\n      if (!continuous) return;\n    }\n    const deferrer = continuous ? this.on : this.once;\n    deferrer(\"viewable\", callback);\n  }\n\n  /** Runs fn now with current viewable value and on \"viewableChange\" event. */\n  static nowAndOnViewableChange(fn) {\n    runAsync(() => fn(this.viewable));\n\n    this.on(\"viewableChange\", fn);\n  }\n\n  // TODO(oscar): Replace with nowAndOnViewableChange once v2 productionizes.\n  static onViewableChange(fn) {\n    this.nowAndOnViewableChange(fn);\n  }\n\n  // IMPORTANT: This method MUST be called synchronously with a user action.\n  static open(\n    url,\n    {\n      // NOTE(Austin): Disable eslint for fields being unused, because\n      // we don't want to have to keep removing/re-adding it.\n      exchange,\n      // eslint-disable-next-line\n      platform,\n      // eslint-disable-next-line\n      abTests = [],\n      isLiftoffURL = false,\n      isAutoclick = false,\n    }\n  ) {\n    // To prevent the click waterfall from resetting if the user clicks twice in\n    // rapid succession, don't restart the waterfall unless the URL being opened\n    // is different.\n    if (this.lastOpenedURL === url) return;\n\n    this.lastOpenedURL = url;\n    clearTimeout(this.clickRetryTimeout);\n\n    const mraid = this.getMRAID();\n    // NOTE(oscar): Check to see if mraid.open is currently available.\n    const mraidOpenIsSupported = this.hasSupport(\"open\");\n    // NOTE(Casey): Ironsource requires us to only use mraid.open\n    // for opening clickthrough URLs.\n    const requireMRAID =\n      mraidOpenIsSupported && (isAutoclick || exchange === EXCHANGE_IRONSOURCE);\n\n    const clickWaterfallDisabled =\n      exchange === EXCHANGE_MINTEGRAL ||\n      exchange === EXCHANGE_VUNGLE ||\n      exchange == EXCHANGE_INNERACTIVE;\n\n    const getFinalClickURL = (openMethod) => {\n      return isLiftoffURL\n        ? appendParamObjectToURL(url, {\n            open_method: openMethod,\n            tracking_method: TRACKING_METHOD_OPEN_METHOD,\n          })\n        : url;\n    };\n\n    // To ensure that the user can click through, attempt multiple methods of\n    // navigating to the URL. In order, they are:\n    // 1. `mraid.open`, if mraid is available\n    // 2. A fake anchor element\n    // 3. `window.location`\n    let openMethods = [\n      // NOTE(vsingh): The window.open method is not used currently, but may be\n      // used in future tests that compare click methods.\n      {\n        type: CLICK_OPEN_METHOD_WINDOW_OPEN,\n        enabled: false,\n        fn: (url) => window.open(url),\n      },\n      {\n        type: CLICK_OPEN_METHOD_MRAID,\n        enabled: mraidOpenIsSupported,\n        fn: (url) => {\n          if (!this.ready) {\n            this.emit(\n              \"error\",\n              new Error(\"Called mraid.open before mraid was ready\")\n            );\n          }\n\n          mraid.open(url);\n        },\n      },\n      {\n        type: CLICK_OPEN_METHOD_ANCHOR,\n        enabled: !requireMRAID,\n        fn: (url) => {\n          const a = document.createElement(\"a\");\n          a.href = url;\n          a.target = \"_blank\";\n          a.click();\n        },\n      },\n      {\n        type: CLICK_OPEN_METHOD_LOCATION,\n        enabled: !requireMRAID,\n        fn: (url) => {\n          window.location = url;\n        },\n      },\n    ].filter(({ enabled }) => enabled);\n\n    if (clickWaterfallDisabled) {\n      openMethods = openMethods.slice(0, 1);\n    }\n\n    /**\n     * Checks if we expect for the SKProductView will open. If so, then it's\n     * likely for no visibility event to occur.\n     * TODO(oscar/cwu): Replace url check with other `skproductview` indicating\n     * boolean that should be populated from h2go.\n     */\n    const isOpenSKProductView = (openMethod, url) => {\n      const appleStoreUrlPrefix = new RegExp(\"^(https?://)?apps\\\\.apple\\\\.com\");\n      return (\n        openMethod.type === CLICK_OPEN_METHODS.MRAID &&\n        appleStoreUrlPrefix.test(url)\n      );\n    };\n\n    const tryOpen = (index = 0) => {\n      // We don't emit any error if we're in the waterfall experiment\n      // because this is guaranteed to happen if the user clicks more than\n      // once (whereas in the original this will only happen if it thinks a\n      // click failed).\n      if (index > 0) {\n        const methodType = openMethods[index - 1].type;\n        this.emit(\n          \"error\",\n          new Warning(`Failed to open ${url} using ${methodType}`)\n        );\n      }\n      if (index === openMethods.length - 1) {\n        this.lastOpenedURL = null;\n      }\n      if (\n        index >= openMethods.length &&\n        !(index === 1 && isOpenSKProductView(openMethods[0], url))\n      ) {\n        this.emit(\n          \"error\",\n          new Error(\n            `Failed to open ${url} by any methods. Tried ${openMethods.length} method(s)`\n          )\n        );\n        return;\n      }\n\n      const openMethod = openMethods[index];\n      const finalClickURL = getFinalClickURL(openMethod.type);\n      openMethod.fn(finalClickURL);\n      this.emit(\"clickMethodTried\", {\n        clickOpenMethod: openMethod.type,\n        isAutoclick,\n      });\n\n      this.clickRetryTimeout = setTimeout(\n        tryOpen.bind(this, index + 1),\n        CLICK_RETRY_INTERVAL_MS\n      );\n    };\n\n    tryOpen();\n  }\n\n  static close() {\n    this.onReady(() => {\n      Logger.recordMetricV2(\"close_count\", 1);\n\n      if (!this.hasSupport(\"close\")) {\n        this.emit(\n          \"error\",\n          new Warning(\n            \"Attempted to call 'MRAID.close' when it is not supported.\"\n          )\n        );\n        return;\n      }\n\n      this.getMRAID().close();\n    });\n  }\n\n  // NOTE(brian): The `useCustomClose` method is deprecated (read: ignored) in\n  // MRAID 3.0.\n  // NOTE(Casey): Unity's `useCustomClose` throws an error. Although we handle\n  // this case by not trying custom custom close on Unity, this implementation\n  // handles that scenario in case other exchanges are (unknowingly) similar.\n  /**\n   * Returns a `Promise` that resolves with `false` if custom close was not set\n   * or to `true` if custom close was set successfully. The `Promise` rejects\n   * if an error was thrown.\n   */\n  static useCustomClose(use) {\n    return new Promise((resolve, reject) => {\n      try {\n        this.onReady(() => {\n          if (\n            !(\n              this.hasSupport(\"useCustomClose\") &&\n              this.hasSupport(\"close\") &&\n              use\n            )\n          ) {\n            return resolve(false);\n          }\n          const mraid = this.getMRAID();\n          mraid.useCustomClose(use);\n          resolve(use);\n        });\n      } catch (e) {\n        reject(e);\n      }\n    });\n  }\n\n  static getViewableDurationMS() {\n    if (!this.viewable) return this.viewableDurationMS;\n    if (this.lastViewableTS == null) {\n      console.error(\n        \"Internal LiftoffMRAID error: this.lastViewableTS should be set.\"\n      );\n      return this.viewableDurationMS;\n    }\n    return this.viewableDurationMS + (Date.now() - this.lastViewableTS);\n  }\n\n  static lockOrientation(orientation) {\n    if (\n      !this.ready ||\n      !this.viewable ||\n      !this.hasSupport(\"setOrientationProperties\")\n    ) {\n      return;\n    }\n\n    this.orientationToLock = orientation;\n    const mraid = this.getMRAID();\n    this._mraidTry(\n      () => {\n        mraid.setOrientationProperties({\n          allowOrientationChange: false,\n          forceOrientation: orientation,\n        });\n      },\n      { tag: \"setOrientationProperties\" }\n    );\n    this.isOrientationLocked = true;\n  }\n\n  static getMRAID() {\n    const windowMraid = window.mraid;\n    if (windowMraid != null) {\n      // NOTE(oscar): There are some sdks that will delete window.mraid after it\n      // was initialized. In some cases at least, this is done to replace the\n      // mraid object with a new one, but it's unclear why this is done in an\n      // asynchronous way. In order not to race with the SDK's implementation of\n      // MRAID, we will use the last mraid object loaded as a fallback.\n      // Related test: https://docs.google.com/document/d/1TWLnTFlTGFc6ZJB_UXfR8QvmEa8x_d3k532fmX-13Fs\n      // Related test 2: https://docs.google.com/document/d/1iChTG_zLZvQzI5Opw-6kpHqRCXRYklTPpbNB7TPBFdQ\n      this.mraidIndex = this.mraids.indexOf(windowMraid);\n      if (this.mraidIndex === -1) {\n        this.mraidIndex = this.mraids.length;\n        this.mraids.push(windowMraid);\n      }\n    }\n\n    return this.mraids[this.mraidIndex];\n  }\n\n  static logMethodSupport(methodName, isSupported) {\n    if (this.supported.methods[methodName] == null) {\n      this.supported.methods[methodName] = {};\n    }\n    if (this.supported.methods[methodName][this.mraidIndex] == null) {\n      this.supported.methods[methodName][this.mraidIndex] = [];\n    }\n    // NOTE(oscar): The MRAID spec allows for a method to go from no support to\n    // support when the mraid's \"ready\" event triggers.\n    this.supported.methods[methodName][this.mraidIndex].push({\n      sinceInitMs: this.sinceInit(),\n      ready: this.ready,\n      support: isSupported,\n      /** Logging is disabled here to prevent an infinite loop. */\n      version: this.getMRAIDVersion({ log: false }),\n    });\n  }\n\n  /**\n   * Checks to see if the MRAID implementation supports the given method.\n   * More specifically, this checks to see if the method is a function on the\n   * window.mraid object. It does not actually call the method to see if it\n   * works and any caller should be prepared to handle errors.\n   *\n   * @param {string} prop - The name of the method to check.\n   * @param {Object} options\n   * @param {boolean} options.log - Whether to log the result of the check.\n   */\n  static hasSupport(prop, { log = true } = {}) {\n    const mraid = this.getMRAID();\n    if (mraid == null) {\n      return false;\n    }\n\n    if (prop === \"mraid\") {\n      return true;\n    }\n\n    const support = type(mraid[prop]) === \"function\";\n\n    if (log) {\n      this.logMethodSupport(prop, support);\n    }\n\n    return support;\n  }\n\n  /** Returns the currently loaded MRAID version. */\n  static getMRAIDVersion({ log = true } = {}) {\n    return this._mraidTry(\n      () => {\n        return this.hasSupport(\"getVersion\", { log })\n          ? this.getMRAID().getVersion()\n          : null;\n      },\n      { tag: \"getVersion\", logError: log }\n    );\n  }\n\n  static isViewportShown() {\n    return window.innerHeight > 0 && window.innerWidth > 0;\n  }\n}\n\nif (window._LiftoffMRAID == null) {\n  LiftoffMRAID.init();\n  /**\n   * NOTE(oscar): Global state is needed in order to only call .init() once and\n   * to ensure that the same LiftoffMRAID is exported.\n   */\n  window._LiftoffMRAID = LiftoffMRAID;\n}\n\nexport default window._LiftoffMRAID;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/liftoff_mraid.js","// Wrappers around adexp objects contained in adexpjson.go\n\nexport class AdexpMetricV2 {\n  constructor(name, value) {\n    this.name = name;\n    this.value = value;\n  }\n}\n\nexport class AdexpJavaScriptError {\n  constructor({\n    message,\n    severity = \"error\",\n    sourceURL,\n    line,\n    column,\n    stack,\n  } = {}) {\n    this.error = {\n      message,\n      severity,\n      sourceURL,\n      line,\n      column,\n      stack,\n    };\n  }\n}\n\nexport class AdexpLog {\n  constructor(tag, message, data) {\n    this.tag = tag;\n    this.message = message;\n    Object.assign(this, data);\n  }\n}\n\nexport class AdexpContext {\n  constructor({ viewportWidth, viewportHeight, adLanguage, mraid } = {}) {\n    this.ad_language = adLanguage;\n    this.mraid = mraid;\n    this.viewport_height = viewportHeight;\n    this.viewport_width = viewportWidth;\n  }\n}\n\nexport class AdexpMessage {\n  constructor({ context, metric, log } = {}) {\n    Object.assign(this, context);\n    // NOTE(Austin): metrics_v2 must be an array. For now\n    // we don't log more than one metric at a time though.\n    this.metrics_v2 = metric != null ? [metric] : undefined;\n    this.log = log;\n  }\n}\n\n// TODO(Austin): Consolidate ClickMetric here.\n\n/**\n * Returns a function that takes a snapshot of the current environment\n * and returns a `AdexpContext`.\n */\nexport const getAdexpContextSnapshotFn = (viewportEl, hasMraidFn) => () => {\n  const { width, height } =\n    viewportEl != null ? viewportEl.getBoundingClientRect() : {};\n  return new AdexpContext({\n    viewportWidth: width != null ? Math.round(width) : undefined,\n    viewportHeight: height != null ? Math.round(height) : undefined,\n    adLanguage: navigator.language,\n    mraid: hasMraidFn(),\n  });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/adexp.js","const patchedObjects = [];\n\nclass MonkeyPatch {\n  // #if process.env.NODE_ENV === \"test\"\n//   static resetAll() {\n//     patchedObjects.forEach(({ obj, propertyName, dataKey, value }) => {\n//       MonkeyPatch._applyPatch(obj, propertyName, { [dataKey]: value });\n//     });\n// \n//     // Clear the array.\n//     patchedObjects.splice(0, patchedObjects.length);\n//   }\n  // #endif\n\n  static _applyPatch(obj, propertyName, protoMap) {\n    if (obj.propertyName !== undefined) {\n      delete obj[propertyName];\n    }\n\n    try {\n      // See\n      // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description\n      Object.defineProperty(obj, propertyName, protoMap);\n    } catch (e) {\n      // TODO(Austin): Delete added patchedObject entry?\n      throw new Error(\n        `Cannot monkey patch ${obj.constructor.name}[${propertyName}], because: '${e}'.`\n      );\n    }\n  }\n\n  static _patch(obj, propertyName, dataKey, value) {\n    const originalValue = Object.getOwnPropertyDescriptor(obj, propertyName)[\n      dataKey\n    ];\n\n    patchedObjects.push({\n      obj,\n      propertyName,\n      dataKey,\n      value: originalValue,\n    });\n\n    MonkeyPatch._applyPatch(obj, propertyName, { [dataKey]: value });\n  }\n\n  static patchFunction(obj, propertyName, fn) {\n    // \"value\" is the property value. See doc in _applyPatch.\n    MonkeyPatch._patch(obj, propertyName, \"value\", fn);\n  }\n\n  static patchSetter(obj, propertyName, fn) {\n    // \"set\" is the property setter. See doc in _applyPatch.\n    MonkeyPatch._patch(obj, propertyName, \"set\", fn);\n  }\n\n  static patchGetter(obj, propertyName, fn) {\n    // \"get\" is the property getter. See doc in _applyPatch.\n    MonkeyPatch._patch(obj, propertyName, \"get\", fn);\n  }\n}\n\nexport default MonkeyPatch;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/monkey_patch.js","/**\n * Contains logic to determine whether cta was clicked. This is not the optimal\n * way to do it - a better way would be to include CTA location as part of the\n * creative's concept rendering configuration and to set it explicitly.\n */\n\nimport { CLICK_AREA_TYPE_CTA, CLICK_AREA_TYPE_OTHER } from \"../constants\";\n\nconst pointInEl = (el, x, y) => {\n  const {\n    top: elTop,\n    right: elRight,\n    bottom: elBottom,\n    left: elLeft,\n  } = el.getBoundingClientRect();\n  return x >= elLeft && x <= elRight && y >= elTop && y <= elBottom;\n};\n\n/**\n * Returns true iff (x, y) is within the bounds of a CTA. We\n * consider an element to be a \"CTA element\" if it's part of the generic-cta or\n * custom-cta components or is in a container that has 'cta' in the id. This can\n * give both false positives (e.g. if a non-CTA image is placed in a CTA\n * container) and false negatives (e.g. if a CTA is embedded in a larger image\n * in one of the \"fill\" templates), but it's probably close to the best we can\n * do without manual tagging. We include all descendants of cta\n * containers/components, because sometimes their children overflow.\n */\nexport const pointInCTA = (x, y) => {\n  return [\n    ...document.querySelectorAll(\n      [\n        \".generic-cta\",\n        \".generic-cta *\",\n        \".custom-cta\",\n        \".custom-cta *\",\n        \".cta-container\",\n        \".cta-container *\",\n        \".liftoff-cta\",\n        \".liftoff-cta *\",\n        \".product-view-cta .light\",\n        \".last-chance-endscreen-container\",\n      ].join(\", \")\n    ),\n  ].some((ctaEl) => {\n    return pointInEl(ctaEl, x, y);\n  });\n};\n\n/**\n * Returns true iff e is a MouseEvent that occurred over a CTA.\n */\nexport const clickAreaTypeFromEvent = (e) => {\n  return pointInCTA(e.clientX, e.clientY)\n    ? CLICK_AREA_TYPE_CTA\n    : CLICK_AREA_TYPE_OTHER;\n};\n\nexport const isDeadzoneCoord = ({ x, y }) => {\n  if (!Number.isFinite(x) || !Number.isFinite(y)) {\n    console.warn(\"Unexpected coords\", { x, y });\n    return;\n  }\n  return [...document.body.querySelectorAll(\".liftoff-deadzone\")].some((el) =>\n    pointInEl(el, x, y)\n  );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/cta.js","export const MESSAGE_CREATIVE_MADE_SOUND = \"CREATIVE_MADE_SOUND\";\nexport const MESSAGE_TOGGLE_MUTED = \"TOGGLE_MUTED\";\nexport const MESSAGE_INTERACTION_CHANGE = \"INTERACTION_CHANGE\";\nexport const MESSAGE_CLICKTHROUGH = \"CLICKTHROUGH\";\nexport const MESSAGE_MRAID_EVENT = \"MRAID_EVENT\";\nexport const MESSAGE_MRAID_CALL = \"MRAID_CALL\";\nexport const MESSAGE_UPDATED_MRAID_PROPERTIES = \"UPDATED_MRAID_PROPERTIES\";\nexport const MESSAGE_INNER_ENV_INIT_COMPLETE = \"INNER_ENV_INIT_COMPLETE\";\nexport const MESSAGE_OUTER_ENV_INIT_COMPLETE = \"OUTER_ENV_INIT_COMPLETE\";\nexport const MESSAGE_REQUEST_DOM_SNAPSHOT = \"REQUEST_DOM_SNAPSHOT\";\nexport const MESSAGE_DOM_SNAPSHOT = \"DOM_SNAPSHOT\";\nexport const MESSAGE_INNER_ENV_ERROR = \"INNER_ENV_ERROR\";\nexport const MESSAGE_RESIZE = \"RESIZE\";\n\n// External Messages from Vungle.\nexport const MESSAGE_VUNGLE_CLICKTHROUGH = \"download\";\n\n// External Messages from Tresensa creatives.\nexport const MESSAGE_TRESENSA_INTERACTION = \"tre_interaction\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/csp-env/messages.js","import { strToElement } from \"../frontendlib/dom_utils\";\n\nclass AudioToggleIcon {\n  constructor() {\n    this.el = strToElement(`\n      <div class=\"audio-toggle-icon\"\n          style=\"margin:10px;border-radius:25px;background-color:black;line-height:10px\">\n        <svg fill=\"#FFFFFF\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n          width=\"30\" height=\"30\" viewBox=\"0 0 16 16\"\n        >\n          <g class=\"audio-toggle-unmute\" transform=\"translate(8 8) scale(0.69 0.69) translate(-8 -8)\">\n            <polygon points=\"\n              14.293,14.293 1.707,1.707 1,2.414 4.586,6 4,6 4,10 7,10 11,14 11,12.414 13.586,15\n            \"></polygon>\n            <polygon points=\"11,2 7.207,5.793 11,9.586\"></polygon>\n          </g>\n          <g class=\"audio-toggle-mute\" transform=\"translate(8 8) scale(0.69 0.69) translate(-8 -8)\">\n            <polygon points=\"7,6 4,6 4,10 7,10 11,14 11,2\"></polygon>\n          </g>\n        </svg>\n      </div>\n    `);\n\n    this.setMuted(true);\n  }\n\n  getElement() {\n    return this.el;\n  }\n\n  setMuted(muted) {\n    this.el.querySelector(\".audio-toggle-unmute\").style.display = muted\n      ? \"\"\n      : \"none\";\n    this.el.querySelector(\".audio-toggle-mute\").style.display = muted\n      ? \"none\"\n      : \"\";\n  }\n}\n\nexport default AudioToggleIcon;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/audio_toggle_icon.js","import MonkeyPatch from \"./monkey_patch\";\n\n/**\n * Returns true iff `el` is a media (audio or video) element;\n */\nconst isMediaElement = (el) => el.tagName === \"VIDEO\" || el.tagName === \"AUDIO\";\n\n/**\n * Assuming `el` is a playing video, returns `true` iff it has audio data.\n */\nconst doesVideoHaveAudio = (el) => {\n  return (\n    (el.audioTracks != null && el.audioTracks.length > 0) ||\n    (el.webkitAudioDecodedByteCount != null &&\n      el.webkitAudioDecodedByteCount > 0)\n  );\n};\n\n// Minimum bin size of a web audio analyzer node frequency spectrum. See:\n// https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/fftSize#Value.\nconst MIN_FFT_SIZE = 32;\n\n/**\n * Global controller for web audio. This works by monkey-patching the\n * `AudioContext` constructor and redefining `AudioContext.destination`\n * (normally an `AudioDestinationNode` that routes sound to the speakers)\n * to a node that allows the global controller to intercept and control all\n * output. This is used by `GlobalAudioController`--it's not intended to be\n * used directly. `cb` is a function that will be called the first time any\n * `AudioContext` produces a sound.\n */\nclass GlobalWebAudioController {\n  // if process.env.NODE_ENV === \"test\"\n  /**\n   * Resets all state back to it's uninitialized state.\n   * Used for testing purposes.\n   */\n  static reset() {\n    GlobalWebAudioController._firstSoundMade = false;\n    GlobalWebAudioController._muted = null;\n  }\n  // #endif\n\n  static init(cb) {\n    GlobalWebAudioController._muted = null;\n    GlobalWebAudioController._cb = cb;\n    GlobalWebAudioController._firstSoundMade = false;\n    GlobalWebAudioController._gainNodes = [];\n\n    try {\n      const originalAudioContext =\n        window.AudioContext || window.webkitAudioContext;\n\n      /**\n       * An alternative to monkey-patching the `AudioContext` constructor would\n       * be to monkey-patch the `AudioContext.prototype.destination` getter,\n       * but this doesn't work on old (pre-getter) browsers.\n       */\n      window.AudioContext = window.webkitAudioContext = function AudioContext(\n        ...args\n      ) {\n        const audioCtx = new originalAudioContext(...args);\n        const gainNode = audioCtx.createGain();\n        const analyserNode = audioCtx.createAnalyser();\n        // We just want to know if the `AudioContext` is producing _any_ sound\n        // and don't care about the frequency spectrum per se. We therefore used\n        // the smallest allowed FFT size.\n        analyserNode.fftSize = MIN_FFT_SIZE;\n        const freqData = new Uint8Array(analyserNode.frequencyBinCount);\n        const soundPollInterval = setInterval(() => {\n          analyserNode.getByteFrequencyData(freqData);\n          let i = 0;\n          for (; i < freqData.length; i++) {\n            if (freqData[i] !== 0) break;\n          }\n          if (i === freqData.length) return;\n          clearInterval(soundPollInterval);\n          GlobalWebAudioController._handleFirstSound();\n        }, 10);\n        /**\n         * The resulting node structure is:\n         *   input -> analyser -> gain -> destination\n         * We use the analyser node to detect when the AudioContext is producing\n         * sound and the gain node to globally control output.\n         */\n        const originalDestination = audioCtx.destination;\n        analyserNode.connect(gainNode);\n        gainNode.connect(originalDestination);\n        gainNode.gain.value = GlobalWebAudioController._muted ? 0 : 1;\n        GlobalWebAudioController._gainNodes.push(gainNode);\n\n        Object.defineProperty(audioCtx, \"destination\", {\n          value: analyserNode,\n          // Ensure that our destination node is the only destination node.\n          writable: false,\n          configurable: false,\n        });\n\n        return audioCtx;\n      };\n    } catch (_) {\n      console.error(\"Unable to monkey-patch AudioContext\");\n    }\n  }\n\n  static _handleFirstSound() {\n    if (GlobalWebAudioController._firstSoundMade) return;\n    GlobalWebAudioController._cb();\n    GlobalWebAudioController._firstSoundMade = true;\n  }\n\n  /**\n   * Mutes all `AudioContext`s when `shouldMute === true` and restores all\n   * `AudioContext`s to the state set by the user when `shouldMute === false`.\n   */\n  static setMuted(shouldMute) {\n    if (GlobalWebAudioController._muted === shouldMute) {\n      return;\n    }\n    GlobalWebAudioController._muted = shouldMute;\n    GlobalWebAudioController._gainNodes.forEach((gainNode) => {\n      gainNode.gain.value = shouldMute ? 0 : 1;\n    });\n  }\n}\n\n/**\n * Utility for tracking media elements. Media elements can come into existence\n * in several different ways, which requies multiple different tricks for\n * becoming aware of their existence:\n *   1) They may exist in the DOM on page load (i.e. be embedded directly in\n *      the HTML document) - these can be detected by querying the dom for video\n *      and audio elements\n *   2) They can be produced from an HTML string (e.g. `someEl.innerHTML =\n *      \"<audio ... />\"`) and appended to the DOM. They must fire a \"loadstart\"\n *      event after being appended to the DOM, or the `load` or `play` methods\n *      may be called directly on the element. These can be detected by\n *      listening for \"loadstart\" events and by monkey-patching the `load` and\n *      `play` methods. This is true regardless of whether or not autoplay is\n *      true.\n *   3) `document.createElement` - these are detected by monkey-patching\n *      `Document.prototype.createElement`. These won't be caught by the\n *      approaches in 2 if the \"autoplay\" attribute is set to `true` (since they\n *      can make sound without ever being explicitly loaded, played, or append\n *      to the DOM).\n *   4) The `Audio` constructor - these are detected by monkey-patching the\n *      `Audio` constructor.\n */\nclass MediaElementWatcher {\n  constructor() {\n    throw new Error(\"Cannot construct instances of MediaElementWatcher.\");\n  }\n\n  /**\n   * Initializes the class, and immediately calls function `cb` once for each\n   * media element that already exists. Subsequently calls `cb` whenever a new\n   * media element is created. This should only be called once.\n   */\n  static init(cb) {\n    MediaElementWatcher._cb = cb;\n    MediaElementWatcher._seenElements = new WeakSet();\n\n    const originalCreateElement = Document.prototype.createElement;\n    MonkeyPatch.patchFunction(\n      Document.prototype,\n      \"createElement\",\n      function (...args) {\n        const el = originalCreateElement.apply(this, args);\n        MediaElementWatcher._handleNewElement(el);\n        return el;\n      }\n    );\n\n    const originalAudio = window.Audio;\n    window.Audio = function Audio(...args) {\n      const a = new originalAudio(...args);\n      MediaElementWatcher._handleNewElement(a);\n      return a;\n    };\n    window.Audio.prototype = originalAudio.prototype;\n\n    [\"play\", \"load\"].forEach((methodName) => {\n      const originalMethod = HTMLMediaElement.prototype[methodName];\n      MonkeyPatch.patchFunction(\n        HTMLMediaElement.prototype,\n        methodName,\n        function (...args) {\n          MediaElementWatcher._handleNewElement(this);\n          return originalMethod.apply(this, args);\n        }\n      );\n    });\n\n    window.addEventListener(\n      \"loadstart\",\n      (e) => {\n        MediaElementWatcher._handleNewElement(e.target);\n      },\n      true\n    );\n\n    document.querySelectorAll(\"video, audio\").forEach((el) => {\n      MediaElementWatcher._cb(el);\n    });\n  }\n\n  static _handleNewElement(el) {\n    if (!isMediaElement(el) || MediaElementWatcher._seenElements.has(el)) {\n      return;\n    }\n    MediaElementWatcher._seenElements.add(el);\n    MediaElementWatcher._cb(el);\n  }\n}\n\n/**\n * Global controller for media (audio and video) elements. Used by\n * `GlobalAudioController` and not intended to be used directly. `cb` is a\n * function that will be called the first time any media element can\n * produce a sound (were global control not applied).\n */\nclass GlobalMediaElementAudioController {\n  // #if process.env.NODE_ENV === \"test\"\n//   /**\n//    * Resets all state back to it's uninitialized state.\n//    * Used for testing purposes.\n//    */\n//   static reset() {\n//     GlobalMediaElementAudioController._firstSoundMade = false;\n//     GlobalMediaElementAudioController._globallyMuted = null;\n//   }\n  // #endif\n\n  constructor() {\n    throw new Error(\n      \"Cannot construct instances of GlobalMediaElementAudioController.\"\n    );\n  }\n\n  static init(cb) {\n    GlobalMediaElementAudioController._globallyMuted = null;\n    /**\n     * We keep track of the values for el.muted set by the user for each media\n     * el. When we globally unmute, we restore the set state (so calling\n     * `GlobalMediaElementAudioController.unmute()` does not unmute\n     * elements that the user has set to be muted).\n     */\n    GlobalMediaElementAudioController._elToSetState = new WeakMap();\n    GlobalMediaElementAudioController._allMediaEls = [];\n    GlobalMediaElementAudioController._firstSoundMade = false;\n    GlobalMediaElementAudioController._cb = cb;\n\n    try {\n      GlobalMediaElementAudioController._originalMutedSetter =\n        Object.getOwnPropertyDescriptor(\n          HTMLMediaElement.prototype,\n          \"muted\"\n        ).set;\n      const originalMutedGetter = Object.getOwnPropertyDescriptor(\n        HTMLMediaElement.prototype,\n        \"muted\"\n      ).get;\n\n      MonkeyPatch.patchSetter(\n        HTMLMediaElement.prototype,\n        \"muted\",\n        function (val) {\n          GlobalMediaElementAudioController._elToSetState.set(this, val);\n          if (GlobalMediaElementAudioController._canMakeSound(this)) {\n            GlobalMediaElementAudioController._handleFirstSound();\n          }\n\n          const systemMutedState = originalMutedGetter.call(this);\n          if (\n            GlobalMediaElementAudioController._globallyMuted &&\n            (systemMutedState || !val)\n          ) {\n            return;\n          }\n          GlobalMediaElementAudioController._originalMutedSetter.call(\n            this,\n            val\n          );\n        }\n      );\n\n      // Patch the \"muted\" getter so that it returns the value set by the user,\n      // rather than the underlying \"system\" value.\n      MonkeyPatch.patchGetter(HTMLMediaElement.prototype, \"muted\", function () {\n        const recordedSetState =\n          GlobalMediaElementAudioController._elToSetState.get(this);\n        return recordedSetState == null\n          ? originalMutedGetter.call(this)\n          : recordedSetState;\n      });\n      // #if process.env.NODE_ENV === \"test\"\n//       // Expose the underlying system muted setting to tests.\n//       Object.defineProperty(HTMLMediaElement.prototype, \"systemMutedState\", {\n//         get: originalMutedGetter,\n//       });\n      // #endif\n    } catch (_) {\n      /**\n       * Monkey-patching will fail on old (pre-setter) browsers. In this case,\n       * we have no way of keeping track of the set state.\n       * (Listening for \"volumechange\" events doesn't work, because if we force\n       * the state to `true` due to globally muting, then the event will not\n       * fire if the user subsequently sets the `muted` to `true`.) In this\n       * case, we just keep the page globally muted.\n       */\n      GlobalMediaElementAudioController._originalMutedSetter = function (mute) {\n        this.muted = mute;\n      };\n      console.error(\"Unable to monkey-patch HTMLMediaElement.muted\");\n    }\n\n    MediaElementWatcher.init((el) => {\n      if (!GlobalMediaElementAudioController._allMediaEls.includes(el)) {\n        GlobalMediaElementAudioController._allMediaEls.push(el);\n      }\n      GlobalMediaElementAudioController._watchForSound(el);\n      GlobalMediaElementAudioController._toggleElementMuted(\n        el,\n        GlobalMediaElementAudioController._globallyMuted\n      );\n    });\n  }\n\n  /**\n   * Returns `true` iff `el` would be able to make a sound were it not being\n   * controlled by this global controller. We consider an element able to make\n   * a sound if it is either an audio element or is a video with audio tracks.\n   * Assumes that `el` is in the playing state (whether or not a video has\n   * audio cannot be determined for all browsers for media that are not\n   * playing).\n   */\n  static _canMakeSound(el) {\n    const isMuted = GlobalMediaElementAudioController._elToSetState.get(el);\n    return !isMuted && (el.tagName === \"AUDIO\" || doesVideoHaveAudio(el));\n  }\n\n  static _watchForSound(el) {\n    if (!el.paused && GlobalMediaElementAudioController._canMakeSound(el)) {\n      GlobalMediaElementAudioController._handleFirstSound();\n      return;\n    }\n\n    el.addEventListener(\"playing\", () => {\n      if (!GlobalMediaElementAudioController._canMakeSound(el)) return;\n      GlobalMediaElementAudioController._handleFirstSound();\n    });\n  }\n\n  /**\n   * Forces `el.muted` to `muted` (a boolean). Assumes that if `muted === true`,\n   * the value of `el.muted` is the state set by the user.\n   * (i.e. This is not idempotent.)\n   */\n  static _toggleElementMuted(el, muted) {\n    if (muted) {\n      GlobalMediaElementAudioController._elToSetState.set(el, el.muted);\n      GlobalMediaElementAudioController._originalMutedSetter.call(el, true);\n      return;\n    }\n\n    GlobalMediaElementAudioController._originalMutedSetter.call(\n      el,\n      GlobalMediaElementAudioController._elToSetState.get(el)\n    );\n  }\n\n  static _toggleMediaMuted(muted) {\n    GlobalMediaElementAudioController._allMediaEls.forEach((el) => {\n      GlobalMediaElementAudioController._toggleElementMuted(el, muted);\n    });\n  }\n\n  static _handleFirstSound() {\n    if (GlobalMediaElementAudioController._firstSoundMade) return;\n    GlobalMediaElementAudioController._cb();\n    GlobalMediaElementAudioController._firstSoundMade = true;\n  }\n\n  /**\n   * Mutes all HTML media elements when `shouldMute === true` and restores the\n   * set state of all HTML media elements when `shouldMute === false`.\n   */\n  static setMuted(shouldMute) {\n    if (GlobalMediaElementAudioController._globallyMuted === shouldMute) {\n      return;\n    }\n    GlobalMediaElementAudioController._toggleMediaMuted(shouldMute);\n    GlobalMediaElementAudioController._globallyMuted = shouldMute;\n  }\n}\n\n/**\n * Global controller for all possible sources of audio in a web page, except\n * for `iframe`s. The public interface consists of only two methods:\n *   - `GlobalAudioController.setMuted` - takes a boolean indicating whether\n *      audio from all sound sources (HTML media elements and web audio) should\n *      be muted (true) or not (false);\n *   - `GlobalAudioController.onFirstSound` - receives one argument, a function\n *      that will be called immediately if the page is already making sound or\n *      otherwise will be called once when the page first makes a sound\n *      (possibly never).\n */\nclass GlobalAudioController {\n  // #if process.env.NODE_ENV === \"test\"\n//   /**\n//    * Just to facilitate testing of `onFirstSound` by allowing the registered\n//    * callback to be run multiple times when new sources of sound are added to\n//    * the testing environment page.\n//    */\n//   static reset() {\n//     GlobalAudioController._firstSoundMade = false;\n//     GlobalAudioController._onFirstSoundCallbacks = [];\n// \n//     GlobalMediaElementAudioController.reset();\n//     GlobalWebAudioController.reset();\n//   }\n  // #endif\n\n  constructor() {\n    throw new Error(\"Cannot construct instances of GlobalAudioController.\");\n  }\n\n  /**\n   * This class is invasive insofar as implements a series of monkey patches on\n   * browser API objects. We thus only initialize it when it's actually used.\n   */\n  static _init() {\n    if (GlobalAudioController._initialized) {\n      return;\n    }\n    GlobalAudioController._initialized = true;\n    GlobalAudioController._firstSoundMade = false;\n    GlobalAudioController._onFirstSoundCallbacks = [];\n\n    const handleFirstSound = () => {\n      if (GlobalAudioController._firstSoundMade) {\n        return;\n      }\n      GlobalAudioController._firstSoundMade = true;\n      GlobalAudioController._onFirstSoundCallbacks.forEach((cb) => cb());\n    };\n    GlobalMediaElementAudioController.init(handleFirstSound);\n    GlobalWebAudioController.init(handleFirstSound);\n  }\n\n  static setMuted(shouldMute) {\n    GlobalAudioController._init();\n    GlobalMediaElementAudioController.setMuted(shouldMute);\n    GlobalWebAudioController.setMuted(shouldMute);\n  }\n\n  static runAfterFirstSound(cb) {\n    GlobalAudioController._init();\n    if (GlobalAudioController._firstSoundMade) {\n      cb();\n      return;\n    }\n\n    GlobalAudioController._onFirstSoundCallbacks.push(cb);\n  }\n}\nGlobalAudioController._initialized = false;\n\nexport default GlobalAudioController;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/global_audio_controller.js","import AudioToggleIcon from \"./lib/audio_toggle_icon\";\nimport GlobalAudioController from \"./lib/global_audio_controller\";\nimport LiftoffMRAID from \"./madlib/liftoff_mraid\";\nimport {\n  AUDIO_POLICY_ALWAYS_MUTE,\n  AUDIO_POLICY_ON_INTERACTION,\n  EXCHANGE_DOUBLECLICK,\n} from \"./constants\";\nimport * as Utils from \"./frontendlib/utils\";\n\nconst CLOSE_Z = 99;\nconst WATERMARKS_Z = 98;\n\n/**\n * Returns a close element with a countdown timer that starts at `delay` seconds.\n */\nconst createCloseEl = (delay) => {\n  const closeEl = document.createElement(\"div\");\n  closeEl.id = \"liftoff-close\";\n  Object.assign(closeEl.style, {\n    display: \"block\",\n    position: \"absolute\",\n    top: \"10px\",\n    right: \"10px\",\n    width: \"32px\",\n    height: \"32px\",\n    zIndex: CLOSE_Z,\n  });\n  const buttonStyles = {\n    width: \"100%\",\n    height: \"100%\",\n    display: \"block\",\n    position: \"absolute\",\n    top: \"0\",\n    left: \"0\",\n    fontSize: \"16px\",\n    lineHeight: \"28px\",\n    textAlign: \"center\",\n    border: \"2px solid #FFF\",\n    borderRadius: \"50%\",\n    boxSizing: \"border-box\",\n    pointerEvents: \"all\",\n  };\n  const closeTargetEl = document.createElement(\"div\");\n  closeTargetEl.classList.add(\"liftoff-close-target\");\n  Object.assign(closeTargetEl.style, buttonStyles, {\n    color: \"#EEE\",\n    backgroundColor: \"#000\",\n  });\n  // This is a nice close X.\n  closeTargetEl.innerHTML = \"&#10005\";\n  closeTargetEl.addEventListener(\"click\", (e) => {\n    LiftoffMRAID.close();\n    e.stopPropagation();\n  });\n  closeEl.appendChild(closeTargetEl);\n  if (delay > 0) {\n    const closeDelayEl = document.createElement(\"div\");\n    closeDelayEl.classList.add(\"liftoff-close-delay\");\n    Object.assign(closeDelayEl.style, buttonStyles, {\n      color: \"#555\",\n      backgroundColor: \"#BBB\",\n    });\n    let countdown = delay;\n    closeDelayEl.textContent = countdown;\n    closeDelayEl.style.display = \"block\";\n    const closeDelayInterval = setInterval(() => {\n      countdown -= 1;\n      if (countdown > 0) {\n        closeDelayEl.textContent = countdown;\n        return;\n      }\n      closeDelayEl.style.display = \"none\";\n      clearInterval(closeDelayInterval);\n    }, 1000);\n    closeEl.appendChild(closeDelayEl);\n  }\n  return closeEl;\n};\n\n/**\n * Calls `callback` on the user's first interaction.\n */\nconst onFirstInteraction = (callback) => {\n  let hasUserInteracted = false;\n  const handleFirstInteraction = (e) => {\n    window.removeEventListener(\"mousedown\", handleFirstInteraction, true);\n    window.removeEventListener(\"touchstart\", handleFirstInteraction, true);\n    if (hasUserInteracted) return;\n    hasUserInteracted = true;\n    callback(e);\n  };\n  window.addEventListener(\"mousedown\", handleFirstInteraction, true);\n  window.addEventListener(\"touchstart\", handleFirstInteraction, true);\n};\n\n/**\n * Creates an icon in the lower-right corner that allows the user to globally toggle the creative's audio on\n * and off. The toggle only appears on creatives that have autoplay audio (i.e. audio that plays prior to user\n * interaction). For creatives that have autoplay audio, the creative is globally muted by default but will\n * become globally unmuted when the user interacts with the creative.\n */\nconst createGlobalAudioToggle = () => {\n  const el = document.createElement(\"div\");\n  el.classList.add(\"liftoff-global-audio-toggle\");\n  Object.assign(el.style, {\n    opacity: \"0.5\",\n    display: \"none\",\n    pointerEvents: \"all\",\n    right: \"0\",\n    bottom: \"0\",\n    position: \"absolute\",\n  });\n  const icon = new AudioToggleIcon();\n  const iconEl = icon.getElement();\n  el.appendChild(iconEl);\n\n  let isCurrentlyMuted = false;\n  const setMuted = (shouldMute) => {\n    if (shouldMute === isCurrentlyMuted) return;\n    isCurrentlyMuted = shouldMute;\n    GlobalAudioController.setMuted(shouldMute);\n    icon.setMuted(shouldMute);\n  };\n\n  let hasUserInteracted = false;\n  onFirstInteraction((e) => {\n    hasUserInteracted = true;\n    // Interactions with the global audio toggle icon are handled by the click listener below.\n    if (el.contains(e.target)) return;\n    setMuted(false);\n  });\n\n  iconEl.addEventListener(\"click\", () => {\n    setMuted(!isCurrentlyMuted);\n  });\n\n  GlobalAudioController.runAfterFirstSound(() => {\n    if (hasUserInteracted) return;\n    el.style.display = \"inline-block\";\n  });\n\n  setMuted(true);\n  return el;\n};\n\nconst globallyMuteAllAudio = () => {\n  GlobalAudioController.setMuted(true);\n};\n\n/**\n * Performs various operations required to conform to exchange- and/or country-specific creative policies.\n * This is used by both madlib HTML and CSP (third-party) creatives.\n * Requires:\n *   - creativePolicy - An object with keys:\n *       addBorder (boolean)\n *       showAdChoices (boolean)\n *       showChineseWatermark (boolean)\n *       russianAgeRating (number)\n *   - bidContext - An object with keys: { creativeID, platform, exchange, sourceAppName, sourceAppID }\n */\nexport const applyLiftoffPolicy = (\n  snippetEl,\n  {\n    addBorder,\n    showAdChoices,\n    russianAgeRating,\n    showChineseWatermark,\n    useCustomClose,\n    closeDelay,\n    audioPolicy,\n  },\n  { creativeID, platform, exchange, sourceAppName, sourceAppID, cdnURL }\n) => {\n  const watermarksEl = document.createElement(\"div\");\n  watermarksEl.classList.add(\"liftoff-watermarks\");\n  Object.assign(watermarksEl.style, {\n    position: \"absolute\",\n    bottom: \"0\",\n    left: \"0\",\n    zIndex: `${WATERMARKS_Z}`,\n    height: \"18px\",\n    pointerEvents: \"none\",\n  });\n\n  /**\n   * Creates an element to apply a border around the whole creative (required for banners on certain\n   * exchanges). We do this rather than adding a border directly to `#liftoff-snippet`, because the latter\n   * changes the size of the snippet content by 2 * border-width, resulting in slightly inconsistent\n   * rendering depending on whether the border is there or not.\n   */\n  if (addBorder) {\n    const el = document.createElement(\"div\");\n    el.id = \"liftoff-border\";\n    Object.assign(el.style, {\n      width: \"100%\",\n      height: \"100%\",\n      position: \"absolute\",\n      border: \"1px solid #AAA\",\n      boxSizing: \"border-box\",\n      zIndex: \"10\",\n      pointerEvents: \"none\",\n    });\n    document.body.appendChild(el);\n  }\n\n  if (showAdChoices) {\n    // NOTE(Austin): We append these parameters for Google Analytics and more\n    // granular cloudfront logs.\n    const queryParams = {\n      creative_id: creativeID,\n      platform: platform,\n      exchange: exchange,\n      source_app_name: sourceAppName,\n      source_app_id: sourceAppID,\n    };\n\n    const a = document.createElement(\"a\");\n    a.classList.add(\"ad-choices-icon\");\n    const optoutPageURL = Utils.appendParamObjectToURL(\n      `${cdnURL}/optout.html`,\n      queryParams\n    );\n\n    if (exchange === EXCHANGE_DOUBLECLICK) {\n      // NOTE (Austin): Letting the click from the anchor tag intentionally take\n      // the user out of the ad provides a better experience, as the in-app\n      // browser is broken on some inventory (e.g., DoubleClick). Some\n      // exchanges, such as Unity, open the in-app browser regardless, leading to\n      // a poor user experience. Additionally, certain exchanges ignore our\n      // mraid.open or window.open parameters, opening the clickthrough URL in a\n      // new browser anyway.\n      // TODO(Austin): Test making this the default.\n      a.setAttribute(\"target\", \"_blank\");\n      a.setAttribute(\"href\", optoutPageURL);\n    } else {\n      // NOTE(oscar): Chartboost recommends we open the ad choices link using\n      // MRAID.\n      a.addEventListener(\"click\", (e) => {\n        e.preventDefault();\n        LiftoffMRAID.open(optoutPageURL, { exchange, platform });\n      });\n    }\n\n    Object.assign(a.style, {\n      width: \"20px\",\n      height: \"100%\",\n      display: \"inline-block\",\n      backgroundColor: \"rgba(204, 204, 204, 0.6)\",\n      backgroundImage: `url(${cdnURL}/adchoices.png)`,\n      backgroundPosition: \"center\",\n      backgroundRepeat: \"no-repeat\",\n      backgroundSize: \"12px 12px\",\n      pointerEvents: \"all\",\n    });\n    watermarksEl.appendChild(a);\n  }\n\n  if (russianAgeRating != null) {\n    const ageTag = document.createElement(\"div\");\n    ageTag.textContent = `${russianAgeRating}+`;\n    ageTag.classList.add(\"age-rating\");\n    Object.assign(ageTag.style, {\n      color: \"blue\",\n      fontSize: \"10px\",\n      fontWeight: \"500\",\n      background: \"whitesmoke\",\n      borderRadius: \"0 5px 0 0\",\n      padding: \"0 3px\",\n      opacity: \"0.75\",\n      display: \"inline\",\n      verticalAlign: \"bottom\",\n      pointerEvents: \"none\",\n      lineHeight: \"20px\",\n    });\n    watermarksEl.appendChild(ageTag);\n  }\n\n  if (showChineseWatermark) {\n    const el = document.createElement(\"div\");\n    el.classList.add(\"chinese-watermark\");\n    Object.assign(el.style, {\n      display: \"inline-block\",\n      height: \"100%\",\n      width: \"42px\",\n      pointerEvents: \"none\",\n      backgroundColor: \"rgba(204, 204, 204, 0.6)\",\n      backgroundImage: `url(${cdnURL}/chinese_watermark.png)`,\n      backgroundPosition: \"center\",\n      backgroundRepeat: \"no-repeat\",\n      backgroundSize: \"contain\",\n    });\n    watermarksEl.appendChild(el);\n  }\n\n  if (audioPolicy === AUDIO_POLICY_ALWAYS_MUTE) {\n    globallyMuteAllAudio();\n  } else if (audioPolicy === AUDIO_POLICY_ON_INTERACTION) {\n    const globalAudioToggleEl = createGlobalAudioToggle();\n    snippetEl.appendChild(globalAudioToggleEl);\n  }\n\n  LiftoffMRAID.useCustomClose(useCustomClose).then((isUsingCustomClose) => {\n    if (!isUsingCustomClose) return;\n    const closeEl = createCloseEl(closeDelay);\n    snippetEl.appendChild(closeEl);\n  });\n\n  snippetEl.appendChild(watermarksEl);\n  return snippetEl;\n};\n\nexport const postHTMLReturn = (adexpEndpoint, html) => {\n  return Utils.request(\n    \"POST\",\n    `${adexpEndpoint}/html_return`,\n    {\n      // Don't set the content type to \"application/json\" because that requires\n      // a preflight OPTIONS request (because this is a cross-domain request).\n      \"Content-Type\": \"text/plain\",\n    },\n    html\n  );\n};\n\nexport const getDOMSnapshot = () => document.documentElement.outerHTML;\n\n/**\n * Given `adexpEndpoint` (the AdExp host as a `String`), this sends an HTML\n * return after `htmlReturnDelay` ms. Returns a `Promise` that resolves when\n * the HTML return HTTP request is complete.\n */\nexport const configureHTMLReturn = (adexpEndpoint, htmlReturnDelay) => {\n  const postHTML = () => {\n    console.info(\"Returning HTML\");\n    return postHTMLReturn(adexpEndpoint, getDOMSnapshot());\n  };\n\n  if (htmlReturnDelay == null || htmlReturnDelay === 0) {\n    // NOTE(oscar): A delay of 0 ideally should return the DOM before any JS\n    // manipulation, so we capture the state of the DOM immediately.\n    return postHTML();\n  }\n\n  return new Promise((resolve, reject) => {\n    setTimeout(() => postHTML().then(resolve, reject), htmlReturnDelay);\n  });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/creative_utils.js","import { isDeadzoneCoord } from \"../cta\";\n\nexport const throttle = (f, ms) => {\n  let ignore = false;\n\n  return (...args) => {\n    if (ignore) return;\n    f(...args);\n    ignore = true;\n    setTimeout(() => {\n      ignore = false;\n    }, ms);\n  };\n};\n\nexport const intentionalInteractionCounterFn = (minimumInteractions) => {\n  /**\n   * InteractionMonitor has somewhat imperfect de-duplication logic for what\n   * counts as a full interaction. It also doesn't account for intentional\n   * interactions. Also note that onInteractionChange() triggers for every\n   * start, drag, and end event.\n   *\n   * For our purposes, we'll use both InteractionMonitor's count and a custom\n   * counter.\n   */\n  let intentionalInteractionsFromMonitor = new Set();\n  let intentionalInteractionCountFromThrottle = 0;\n\n  const countIntentionalInteractionThrottle = throttle(\n    () => {\n      intentionalInteractionCountFromThrottle += 1;\n    },\n    /** Count interactions only once every 0.4 seconds. */\n    400\n  );\n\n  const getCurrentCount = () =>\n    Math.min(\n      intentionalInteractionCountFromThrottle,\n      intentionalInteractionsFromMonitor.size\n    );\n\n  const countIntentionalInteractions = (e) => {\n    if (\n      isDeadzoneCoord({\n        x: e.lastInteraction.startX,\n        y: e.lastInteraction.startY,\n      })\n    ) {\n      return;\n    }\n    /**\n     * NOTE(oscar): e.cumulativeStats.interactionCount is only incremented for\n     * full interactions (or at least in theory). It also counts deadzone\n     * interactions. Here we use interactionCount to identify which counts are\n     * intentional.\n     */\n    if (\n      e.cumulativeStats.interactionCount > 0 &&\n      intentionalInteractionsFromMonitor.size <= minimumInteractions\n    ) {\n      intentionalInteractionsFromMonitor.add(\n        e.cumulativeStats.interactionCount\n      );\n    }\n    countIntentionalInteractionThrottle();\n  };\n  return (e) => {\n    countIntentionalInteractions(e);\n    return getCurrentCount();\n  };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/autoclick_utils.js","import * as DOMUtils from \"../frontendlib/dom_utils\";\n\n/*\n * ClickInteraction is used to connect elements that respond to clicks\n * with the elements that trigger click events. Primarily, this allows\n * dynamic CTAs to respond to click events on click overlays or any\n * other clickthrough element.\n */\n\n// Global state for two-click CTAs.\nlet hasBeenClicked = false;\nconst firstClickHandlers = [];\n\n// Global state for slider CTAs.\nconst SLIDER_COMPLETION_RATIO = 0.7;\nconst sliders = [];\n\nconst setSlideDistance = (value) => {\n  sliders.forEach(({ sliderSize, setSlideRatio }) =>\n    setSlideRatio(value / sliderSize)\n  );\n};\n\nconst getPointerEventX = (e) =>\n  (\n    (e.changedTouches && e.changedTouches[0]) ||\n    (e.touches && e.touches[0]) ||\n    e\n  ).clientX;\n\nclass ClickInteraction {\n  static captureFirstClick(handleFirstClick) {\n    firstClickHandlers.push(handleFirstClick);\n  }\n\n  static captureSlideClick({ onCompleted, sliderSize, setSlideRatio }) {\n    sliders.push({ onCompleted, sliderSize, setSlideRatio });\n  }\n\n  static addListeners(clickEl, onClickComplete) {\n    clickEl.addEventListener(\n      \"click\",\n      (e) => {\n        if (sliders.length > 0) {\n          return;\n        }\n\n        if (!hasBeenClicked) {\n          hasBeenClicked = true;\n\n          if (firstClickHandlers.length > 0) {\n            firstClickHandlers.forEach((handler) => handler(e));\n\n            return;\n          }\n        }\n\n        onClickComplete(e);\n      },\n      true\n    );\n\n    let slideStartPosition = null;\n    DOMUtils.on(clickEl, {\n      \"mousedown touchstart\": (e) => {\n        slideStartPosition = getPointerEventX(e);\n      },\n      \"mousemove touchmove\": (e) => {\n        if (slideStartPosition == null) return;\n\n        setSlideDistance(getPointerEventX(e) - slideStartPosition);\n      },\n      \"mouseup mouseleave touchend\": (e) => {\n        if (slideStartPosition == null) return;\n\n        const slideDistance = getPointerEventX(e) - slideStartPosition;\n        const completedSliders = sliders.filter(\n          ({ sliderSize }) =>\n            slideDistance > sliderSize * SLIDER_COMPLETION_RATIO\n        );\n\n        if (completedSliders.length > 0) {\n          completedSliders.forEach(({ onCompleted }) => onCompleted());\n          Promise.resolve(onClickComplete(e))\n            .then(() => new Promise((resolve) => setTimeout(resolve, 1000)))\n            .then(() => setSlideDistance(0));\n        } else {\n          setSlideDistance(0);\n        }\n\n        slideStartPosition = null;\n      },\n    });\n  }\n}\n\nexport default ClickInteraction;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/click_interaction.js","import { strToElement } from \"../frontendlib/dom_utils\";\n\n/** TODO(oscar): This is a temporary solution to add deadzones to CSPs. */\nexport const addDeadzoneStyles = () => {\n  const el = strToElement(`\n  <style>\n    .liftoff-deadzone.deadzone-experiment {\n      position: absolute;\n      width: max(50px, min(85px, 11vw));\n      height: max(50px, min(85px, 11vw));\n      z-index: 96;\n    }\n    .liftoff-deadzone.top-left {\n      top: 0;\n      left: 0;\n    }\n    .liftoff-deadzone.top-right {\n      top: 0;\n      right: 0;\n    }\n  </style>\n  `);\n  document.head.appendChild(el);\n};\n\nconst addDeadzones = (useExpandedZones, rootEl = document.body) => {\n  const deadzoneEls = [\n    strToElement(`<div class=\"liftoff-deadzone top-left\"></div>`),\n    strToElement(`<div class=\"liftoff-deadzone top-right\"></div>`),\n  ];\n  deadzoneEls.forEach((el) => {\n    if (useExpandedZones) {\n      el.classList.add(\"deadzone-experiment\");\n    }\n    rootEl.appendChild(el);\n  });\n};\n\nexport default addDeadzones;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/addDeadzones.js","import LiftoffMRAID from \"./madlib/liftoff_mraid\";\nimport Logger from \"./madlib/logger\";\nimport {\n  CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT,\n  CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT,\n  TRACKING_METHOD_IMAGE,\n  TRACKING_METHOD_BEACON,\n  PLATFORM_ANDROID,\n} from \"./constants\";\nimport * as Utils from \"./frontendlib/utils\";\n\nconst getLiftoffContainerRect = () => {\n  // NOTE(Casey): 'liftoff-snippet' might not exist if the creative is not\n  // fully initialized.\n  const containerEl =\n    document.getElementById(\"liftoff-snippet\") || document.body;\n  return containerEl.getBoundingClientRect();\n};\n\nexport const getClickTrackingQueryParams = (allInteractionData) => {\n  const { lastInteraction, cumulativeStats } = allInteractionData || {};\n\n  const containerRect = getLiftoffContainerRect();\n\n  const params = {\n    // Unix timestamp of when the click is sent.\n    ct: Date.now(),\n    // Width of #liftoff-snippet in px.\n    aw: containerRect.width.toFixed(),\n    // Height of #liftoff-snippet in px.\n    ah: containerRect.height.toFixed(),\n    // Whether or not MRAID is supported for this impression, determined\n    // empirically based on the presence/absence of the mraid object.\n    m: LiftoffMRAID.hasSupport(\"mraid\") ? 1 : 0,\n    // Total duration, in ms, that the creative was viewable prior to the\n    // click. This depends on the mraid \"viewableChange\" event, so its\n    // accuracy depends on the exchange's implementation.\n    tv: LiftoffMRAID.getViewableDurationMS(),\n  };\n\n  if (lastInteraction == null) {\n    return params;\n  }\n\n  // NOTE(Casey): We see some rare events that do not have x/y coordinates.\n  if (lastInteraction.startX != null) {\n    // The horizontal position of the click in pixels, relative to the\n    // upper-left corner of #liftoff-snippet.\n    params.cx = (lastInteraction.startX - containerRect.left).toFixed();\n  }\n\n  if (lastInteraction.startY != null) {\n    // The vertical position of the click in pixels, relative to the\n    // upper-left corner of #liftoff-snippet.\n    params.cy = (lastInteraction.startY - containerRect.top).toFixed();\n  }\n\n  if (lastInteraction.durationMS != null) {\n    // Duration in milliseconds of the click, as measured by the difference\n    // between timestamps on the start and end events (e.g. touchstart and\n    // touchend).\n    params.dur = lastInteraction.durationMS.toFixed();\n  }\n\n  Object.assign(params, {\n    // The value of Event.isTrusted (see\n    // https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted).\n    it: lastInteraction.isTrusted ? 1 : 0,\n    // Maximum force of the interaction on a 0-100 scale. derived from\n    // Touch.force (for TouchEvents), MouseEvent.webkitForce, or\n    // PointerEvent.pressure.  This may be 0 or have some arbitrary value if\n    // the pointer device/surface doesn't support force/pressure measurement.\n    frc: Math.round(lastInteraction.maxForce * 100),\n    // Maximum area of the screen with which the user interacted in px^2  (e.g.\n    // the area of the screen covered by a finger during a click). May be 0 or\n    // have some arbitrary value if the pointer device/surface doesn't support\n    // area measurement.\n    ar: lastInteraction.maxArea.toFixed(),\n    // Path length traversed from the beginning to the end of the click, in px.\n    d: lastInteraction.distance.toFixed(),\n    // An enum describing the type of pointing device--Mouse, Touch, or other\n    // (e.g. pen/stylus). See the constants defined in `InteractionMonitor`\n    // and the corresponding definitions in rtb.proto.\n    pt: lastInteraction.pointerType,\n    // Total number of distinct interactions detected prior to and including the\n    // click. \"Distinct interactions\" are bounded by start/end events or by\n    // the pointing device leaving the creative.\n    ic: cumulativeStats.interactionCount,\n    // Total path length of all interactions.\n    tid: cumulativeStats.totalDistance.toFixed(),\n  });\n\n  return params;\n};\n\n/**\n * Given a baseClickURL (a string), attaches the caller's query\n * parameters provided as an object, and returns a string.\n */\nexport const constructLiftoffClickURL = (baseClickURL, queryParams) => {\n  return Utils.appendParamObjectToURL(baseClickURL, queryParams);\n};\n\n/**\n * Returns a Promise that resolves when the tracking pixel at url is loaded.\n */\nconst pingTrackingURLWithImage = (url) => {\n  return new Promise((resolve) => {\n    // NOTE(Austin): Image is a the best method here as far as we know because\n    // it's a foolproof way to get a no-cors request and avoid any strange\n    // behavior with XMLHttpRequest. One downside is that Image only tells us\n    // when it's fully loaded, and technically we don't need to wait that long.\n    // We technically only need to wait for the request to send (we don't need\n    // to wait for the response).\n\n    // NOTE(Casey): In some cases (e.g. SKAdNetwork impressions on some\n    // exchanges), we \"force\" a direct clickthrough with a click-tracking URL\n    // that redirects to the MMP and app store. We still use an image tag to\n    // ping Usher and the MMP, but it will generate an error. We still want\n    // to click through in this case.\n\n    // TODO(Casey): Consider alternatives to this (e.g. using an iframe).\n\n    const img = new Image();\n    img.onload = () => resolve(url);\n\n    // TODO(Austin): Investigate if there are errors here that should be\n    // rejected.\n    img.onerror = () => resolve(url);\n    img.src = url;\n  }).catch((e) => {\n    Logger.recordLabeledError(\"clicktracking_img_error\", e || {});\n  });\n};\n\n/**\n * pingTrackingURLWithBeacon sends a ping using the beacon API,\n * which guarantees that the url will be reached before the page is disposed.\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API\n */\nconst pingTrackingURLWithBeacon = (url) => {\n  return new Promise((resolve, reject) => {\n    if (navigator.sendBeacon(url)) {\n      resolve();\n    } else {\n      reject();\n    }\n  });\n};\n\n/**\n * NOTE(Casey): When the return_js=true query param is attached to an Usher URL,\n * Usher will return a JavaScript file containing\n * '_loOpen(\"{{HTTP_REDIRECT_URL}}\")'. For unknown reasons, this\n * method for fetching the redirect URL works better than fetching it via XHR,\n * possibly due to CORS restrictions. See\n * https://docs.google.com/document/d/1nzlGVs9HNSY_Wd29UzoZSx1luZIwufl6yiQ8AXol7cU/\n */\nconst clickthroughWithScriptTag = ({\n  clickthroughURL,\n  platform,\n  exchange,\n  abTests = [],\n  onlyMraid = false,\n}) => {\n  window._loOpen = (clickURL) =>\n    // We assume the url returned is never a liftoff url.\n    LiftoffMRAID.open(clickURL, {\n      platform,\n      exchange,\n      abTests,\n      isLiftoffURL: false,\n      onlyMraid,\n    });\n  return new Promise((resolve) => {\n    const script = document.createElement(\"script\");\n    script.onload = resolve;\n    script.onerror = (e) => {\n      Logger.recordLabeledError(\"click_script_error\", e || {});\n    };\n    script.src = Utils.appendParamObjectToURL(clickthroughURL, {\n      return_js: true,\n    });\n    document.body.appendChild(script);\n  }).catch((e) => {\n    Logger.recordLabeledError(\"clickthrough_error\", e || {});\n  });\n};\n\n/**\n * Returns true if clickTrackingURL (an object like { url, type }) is a Liftoff\n * click tracking URL.\n */\nconst isLiftoffClickTrackingURL = (clickTrackingURL) => {\n  return clickTrackingURL.type === CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT;\n};\n\n/**\n * Prepares and pings a clickTrackingURL (an object like { url, type }); common\n * Liftoff query parameters and the caller's queryParams are attached only to\n * Liftoff clickTrackingURLs.\n */\nconst pingClickTrackingURL = (clickTrackingURL, queryParams, abTests = []) => {\n  const getClickTrackingURLString = (trackingMethod) => {\n    // NOTE(Austin): Right now we should only have \"liftoff\" click tracking\n    // URLs (i.e. http://click.liftoff.io/v1/campaign_click/... ).\n    return isLiftoffClickTrackingURL(clickTrackingURL)\n      ? constructLiftoffClickURL(clickTrackingURL.url, {\n          ...queryParams,\n          tracking_method: trackingMethod,\n        })\n      : clickTrackingURL.url;\n  };\n\n  // The waterfall of click tracking methods to try (in priority order).\n  // Each object in the array should contain a map with the following\n  // keys:\n  // - method: The tracking method integer, as described in rtb.proto\n  //           TrackingMethod.\n  // - canUse: Whether the method should be tried.\n  // - pingFn: The function to ping that takes a URL string and returns a\n  //           promise.\n  const clickTrackingWaterfall = [\n    {\n      method: TRACKING_METHOD_BEACON,\n      canUse:\n        abTests != null &&\n        abTests.includes(\"madlib-beacon-ping-experiment\") &&\n        isLiftoffClickTrackingURL(clickTrackingURL) &&\n        navigator.sendBeacon != null,\n      pingFn: pingTrackingURLWithBeacon,\n    },\n    {\n      method: TRACKING_METHOD_IMAGE,\n      canUse: true,\n      pingFn: pingTrackingURLWithImage,\n    },\n  ];\n\n  // Chain all promises to try each click tracking method. If the\n  // method at the previous index returns a rejected promise,\n  // we try the next; otherwise we return. If we reach the end without\n  // any methods succeeding, this method returns a rejected promise.\n  return clickTrackingWaterfall\n    .filter(({ canUse }) => canUse)\n    .reduce(\n      (prevPromiseFn, nextWaterfallOption) => () => {\n        const { method, pingFn } = nextWaterfallOption;\n        const urlString = getClickTrackingURLString(method);\n        return prevPromiseFn().catch(() => pingFn(urlString));\n      },\n      () => Promise.reject()\n    )();\n};\n\nconst handleClickTracking = (clickTrackingURLs, queryParams, abTests = []) => {\n  return new Promise((resolve) => {\n    const pingCompletePromises = clickTrackingURLs.map((clickTrackingURL) => {\n      return pingClickTrackingURL(clickTrackingURL, queryParams, abTests);\n    });\n\n    Promise.all(pingCompletePromises).then(resolve);\n  }).catch((e) => {\n    Logger.recordLabeledError(\"clicktracking_error\", e || {});\n  });\n};\n\nconst isLiftoffClickthroughURL = (clickthroughURL) => {\n  return clickthroughURL.type === CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT;\n};\n\n/**\n * Opens a clickthrough URL (object like { url, type }) using the best method\n * for the given context (platform, isReengagement).\n */\nconst handleClickthrough = ({\n  clickthroughURL,\n  queryParams,\n  exchange,\n  platform,\n  isReengagement,\n  abTests = [],\n}) => {\n  /**\n   * NOTE(oscar): As of it 2022-10-31, we only want to use MRAID for iOS POD.\n   * The main reason for this is because we want to guarantee that:\n   *\n   * 1. SKStoreProductViewController (i.e. App Store overlay) is used. This\n   * assumes mraid is needed for this.\n   * 2. The click waterfall does not also open the App Store. This is an issue\n   * we've seen with AppLovin, but it may affect other exchanges.\n   */\n  const isAutoclick = !!queryParams.pv;\n\n  return new Promise((resolve) => {\n    const isLiftoffURL = isLiftoffClickthroughURL(clickthroughURL);\n    const urlStr = isLiftoffURL\n      ? constructLiftoffClickURL(clickthroughURL.url, queryParams)\n      : clickthroughURL.url;\n\n    if (queryParams.mac || queryParams.dap) {\n      // The method name here is pingClickTrackingURL we do ping clickthrough\n      // URL here as this is a background click.\n      pingClickTrackingURL(clickthroughURL, queryParams, abTests);\n    } else {\n      /**\n       * NOTE(Casey): On Android, script tag clicks perform better than redirect\n       * clicks, while on iOS the opposite is true. However, for reengagement on\n       * iOS, trackers may use \"universal links\", which are special web pages that\n       * deeplink to an app or redirect to the app store. These links historically\n       * have not worked with redirects, so we fetch the link and send the user\n       * directly.\n       * NOTE(Polly): We append a suffix to certain fyber clickthrough urls when\n       * the native browser should be opened upon a click. We should not use the\n       * script tag when the \"FYBER_OPEN_BROWSER\" suffix is present in the url.\n       * TODO(Casey): Test if we can now redirect to universal links on iOS\n       * (we have been told that this may have been fixed).\n       */\n      if (\n        isLiftoffURL &&\n        (platform === PLATFORM_ANDROID || isReengagement) &&\n        !urlStr.includes(\"FYBER_OPEN_BROWSER\")\n      ) {\n        return clickthroughWithScriptTag({\n          clickthroughURL: urlStr,\n          platform,\n          exchange,\n          abTests,\n        });\n      }\n\n      LiftoffMRAID.open(urlStr, {\n        exchange,\n        platform,\n        abTests,\n        isLiftoffURL,\n        isAutoclick,\n      });\n    }\n\n    resolve();\n  }).catch((e) => {\n    Logger.recordLabeledError(\"clickthrough_error\", e || {});\n  });\n};\n\n/**\n * Given clickConfig, an object like:\n *\n *   {\n *     clickthroughURL: { url, type },\n *     clickTrackingURLs: [{ url, type }, { url, type }, ...],\n *   }\n *\n * prepares all URLs as appropriate based on type, pings tracking URLs, and\n * opens the click URL using the optimal method for a given context\n * (isReengagement, platform).\n */\nexport const handleClick = ({\n  clickConfig,\n  queryParams,\n  isReengagement,\n  platform,\n  exchange,\n  // NOTE(Austin): The below parameters are being used temporarily\n  // for different AB tests.\n  abTests = null,\n}) => {\n  // NOTE(oscar): Some exchanges wrap our URLs in order to track their\n  // metrics. We perform an asynchronous ping to this link while redirecting\n  // users to our actual link to reduce latency.\n\n  // TODO(Casey): Determine if we can move the exchange ping URL into\n  // clickTrackingURLs and handle along with our own tracking URLs.\n  const exchangePingElem = document.getElementById(\"exchange-ping-url\");\n\n  if (exchangePingElem != null && exchangePingElem.href != null) {\n    Utils.ping(exchangePingElem.href);\n  }\n\n  const { clickthroughURL, clickTrackingURLs } = clickConfig;\n\n  const clickthroughParams = {\n    clickthroughURL,\n    queryParams,\n    platform,\n    isReengagement,\n    exchange,\n    abTests,\n  };\n  /**\n   * Handles both clicktracking and clickthrough.\n   *\n   * NOTE(Austin): We are testing waiting for the exchange ping to see if there\n   * is some race condition.\n   *\n   * TODO(Austin): Consolidate rejected promises and log errors here.\n   */\n  const doFullClick = () => {\n    /** Product View clicks are not tracked. */\n    let promise = Promise.resolve();\n    if (!queryParams.pv) {\n      promise = handleClickTracking(clickTrackingURLs, queryParams, abTests);\n    }\n\n    return promise.then(() => handleClickthrough(clickthroughParams));\n  };\n\n  return doFullClick();\n};\n\nexport const _forUnitTestingOnly = {\n  pingTrackingURLWithImage,\n  isLiftoffClickTrackingURL,\n  pingClickTrackingURL,\n  handleClickTracking,\n  isLiftoffClickthroughURL,\n  clickthroughWithScriptTag,\n  handleClickthrough,\n  // We re-export LiftoffMRAID for unit testing to ensure that tests and the\n  // functions in this file refer to the identical LiftoffMRAID object.\n  LiftoffMRAID,\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/click_handling.js","/**\n * This includes classes for tracking interactions with creatives. The data\n * they collect are attached as query parameters to clicks (the last\n * interaction prior to a click is assumed to be the click itself).\n *\n * We listen for all three possible types of events (MouseEvents,\n * PointerEvents, and TouchEvents), because 1) device capabilities differ, so\n * different events may fire on different devices, and 2) some third-party\n * creatives block propagation of some events such that later events do not\n * fire (e.g. if they stop propagation of a PointerEvent, then the\n * corresponding TouchEvent will not fire). However, we collect data from\n * only one type of event in the following order of priority: 1) touch,\n * 2) pointer, 3) mouse (e.g. we only collect pointer data if we're not\n * receiving touch events).\n *\n * We somewhat arbitrarily define interactions as starting and ending at\n * the window's boundaries (i.e. if the user moves over a path that leaves\n * and then re-enters window, this would count as two interactions: one ends\n * when their finger leaves the window, and another one starts when it\n * re-enters the window).\n */\nimport { deepEqual } from \"./frontendlib/utils\";\n\nconst POINTER_TYPE_TOUCH = 1;\nconst POINTER_TYPE_MOUSE = 2;\n// POINTER_TYPE_POINTER is a catch-all for anything other than touch or mouse.\nconst POINTER_TYPE_POINTER = 3;\n\n/**\n * Returns the pointer type of a PointerEvent.\n */\nconst getPointerEventPointerType = (pointerEvent) => {\n  switch (pointerEvent.pointerType) {\n    case \"mouse\":\n      return POINTER_TYPE_MOUSE;\n    case \"touch\":\n      return POINTER_TYPE_TOUCH;\n    default:\n      return POINTER_TYPE_POINTER;\n  }\n};\n\n/**\n * Given a MouseEvent or a PointerEvent, returns true iff a device button\n * is pressed (returns false if this cannot be determined from the event).\n */\nconst isButtonPressed = (e) => {\n  // e.which is a non-standard fallback for old versions of Safari.\n  const buttons = e.buttons != null ? e.buttons : e.which;\n  return buttons != null && buttons !== 0;\n};\n\n/** Returns the linear distance between (startX, startY) and (endX, endY). */\nconst computeDistance = (startX, startY, endX, endY) => {\n  return Math.sqrt(Math.pow(startX - endX, 2) + Math.pow(startY - endY, 2));\n};\n\n/**\n * Returns true iff the given TouchEvent has some touch-point within the bounds\n * of the window.\n */\nconst isTouchInWindow = (e) => {\n  return [...e.changedTouches].some((touch) => {\n    const { clientX, clientY } = touch;\n    return (\n      clientX >= 0 &&\n      clientX <= window.innerWidth &&\n      clientY >= 0 &&\n      clientY <= window.innerHeight\n    );\n  });\n};\n\n/**\n * Returns the maximum force of all touches in a TouchEvent, or 0 if force\n * information is not available.\n */\nconst maxTouchEventForce = (e) => {\n  const touchForces = [...e.changedTouches, ...e.touches].map(\n    (touch) => touch.force || 0\n  );\n\n  return Math.max(0, ...touchForces);\n};\n\n/**\n * Returns the total touch area of a TouchEvent, or 0 if touch area is not\n * available.\n */\nconst touchEventArea = (e) => {\n  return [...e.touches].reduce((sum, touch) => {\n    const { radiusX, radiusY } = touch;\n    const area =\n      radiusX == null || radiusY == null ? 0 : Math.PI * radiusX * radiusY;\n    return sum + area;\n  }, 0);\n};\n\nclass Interaction {\n  constructor(startEvent) {\n    this._startEvent = startEvent;\n    this._lastMoveEvent = null;\n    this._endEvent = null;\n    this._maxForce = startEvent.force;\n    this._maxArea = startEvent.area;\n    this._totalDistance = 0;\n  }\n\n  setEndEvent(endEvent) {\n    this._updateMetrics(endEvent);\n    this._endEvent = endEvent;\n  }\n\n  setLastMoveEvent(moveEvent) {\n    this._updateMetrics(moveEvent);\n    this._lastMoveEvent = moveEvent;\n  }\n\n  isInProgress() {\n    return this._startEvent != null && this._endEvent == null;\n  }\n\n  isComplete() {\n    return this._startEvent != null && this._endEvent != null;\n  }\n\n  getMetrics() {\n    const metrics = {\n      startX: this._startEvent.x,\n      startY: this._startEvent.y,\n      isTrusted: this._startEvent.isTrusted,\n      maxForce: this._maxForce,\n      maxArea: this._maxArea,\n      distance: this._totalDistance,\n      pointerType: this._startEvent.pointerType,\n      // Omit durationMS because a null duration is different\n      // than a duration of 0, it's important to distinguish the two.\n      // The nullable value is allowed by the rtb.proto.Click object.\n    };\n\n    if (this.isComplete()) {\n      // Add data that requires the interaction to be complete,\n      // (i.e. has a end event).\n      Object.assign(metrics, {\n        durationMS: this._endEvent.timestamp - this._startEvent.timestamp,\n      });\n    }\n\n    return metrics;\n  }\n\n  _updateMetrics(newEvent) {\n    this._maxForce = Math.max(this._maxForce, newEvent.force);\n    this._lastMaxArea = Math.max(this._maxArea, newEvent.area);\n\n    const lastEvent = this._lastMoveEvent || this._startEvent;\n    this._totalDistance += computeDistance(\n      lastEvent.x,\n      lastEvent.y,\n      newEvent.x,\n      newEvent.y\n    );\n  }\n}\n\n/**\n * This is an abstract base class for monitoring interaction events. Concrete\n * subclasses must define two methods:\n *\n * 1) _attachEventListeners: this must attach the relevant listeners to the\n * window and call _handleStartEvent, _handleEndEvent, and _handleMoveEvent\n * with the proper raw event.\n * 2) _normalizeEvent: this must take a raw event of the relevant type and\n * return a \"normalized event\" (an object like { x, y, isTrusted, timestamp,\n * force, area, pointerType }.\n */\nclass InteractionEventMonitor {\n  // #if process.env.NODE_ENV === \"test\"\n//   destroy() {\n//     this._attachedEventListeners.forEach(\n//       ({ eventName, handler, listenerOptions }) => {\n//         window.removeEventListener(eventName, handler, listenerOptions);\n//       }\n//     );\n//     this._attachedEventListeners = [];\n//   }\n  // #endif\n\n  constructor() {\n    this._interactionCount = 0;\n    this._totalInteractionDistance = 0;\n    this._lastInteraction = null;\n    this._interactionStartHandlers = [];\n    this._interactionEndHandlers = [];\n    this._attachedEventListeners = [];\n    this._attachEventListeners();\n  }\n\n  listenFor(eventName, handler, options = {}) {\n    const listenerOptions = {\n      // NOTE(Austin): By default, it's absolutely critical we capture events\n      // as they bubble down so we have interaction data before developers\n      // presumably call our `Liftoff.open` method in an event listener handler.\n      capture: true,\n      ...options,\n    };\n    this._attachedEventListeners.push({\n      eventName,\n      handler,\n      listenerOptions,\n    });\n    window.addEventListener(eventName, handler, listenerOptions);\n  }\n\n  onInteractionStart(handlerFn) {\n    if (this._interactionStartHandlers.includes(handlerFn)) {\n      return;\n    }\n\n    this._interactionStartHandlers.push(handlerFn);\n  }\n\n  _handleStartEvent(e) {\n    if (this.isInteractionInProgress()) {\n      // This could occur if another interaction starts before another one\n      // completes (e.g. in the case of multiple pointer devices) or if the\n      // device fires multiple 'start' events in some cases (e.g. firing\n      // \"pointerover\" and then \"pointerdown\" for touch events).\n      return;\n    }\n\n    const normalizedEvent = this._normalizeEvent(e);\n    this._lastInteraction = new Interaction(normalizedEvent);\n    this._interactionStartHandlers.forEach((handler) => handler());\n  }\n\n  onInteractionEnd(handlerFn) {\n    if (this._interactionEndHandlers.includes(handlerFn)) {\n      return;\n    }\n\n    this._interactionEndHandlers.push(handlerFn);\n  }\n\n  _handleEndEvent(e) {\n    if (!this.isInteractionInProgress()) {\n      return;\n    }\n    const normalizedEvent = this._normalizeEvent(e);\n    this._lastInteraction.setEndEvent(normalizedEvent);\n\n    this._updateCumulativeInteractionStats();\n    this._interactionEndHandlers.forEach((handler) => handler());\n  }\n\n  _handleMoveEvent(e) {\n    if (!this.isInteractionInProgress()) {\n      return;\n    }\n\n    const normalizedEvent = this._normalizeEvent(e);\n    this._lastInteraction.setLastMoveEvent(normalizedEvent);\n  }\n\n  isInteractionInProgress() {\n    return (\n      this._lastInteraction != null && this._lastInteraction.isInProgress()\n    );\n  }\n\n  isLastInteractionComplete() {\n    return this._lastInteraction != null && this._lastInteraction.isComplete();\n  }\n\n  getLastInteractionData() {\n    return this._lastInteraction && this._lastInteraction.getMetrics();\n  }\n\n  getAllInteractionData() {\n    return {\n      lastInteraction: this.getLastInteractionData(),\n      cumulativeStats: this.getCumulativeInteractionStats(),\n    };\n  }\n\n  _updateCumulativeInteractionStats() {\n    this._interactionCount += 1;\n    this._totalInteractionDistance +=\n      this._lastInteraction.getMetrics().distance;\n  }\n\n  getCumulativeInteractionStats() {\n    return {\n      interactionCount: this._interactionCount,\n      totalDistance: this._totalInteractionDistance,\n    };\n  }\n\n  _normalizeEvent(_) {\n    throw new Error(\n      \"_normalizeEvent must be implemented by a concrete subclass\"\n    );\n  }\n\n  _attachEventListeners() {\n    throw new Error(\n      \"_attachEventListeners must be implemented by a concrete subclass\"\n    );\n  }\n}\n\nclass MouseEventMonitor extends InteractionEventMonitor {\n  constructor() {\n    super();\n  }\n\n  _normalizeEvent(e) {\n    return {\n      x: e.pageX,\n      y: e.pageY,\n      isTrusted: e.isTrusted,\n      timestamp: e.timeStamp,\n      // NOTE(Casey): MouseEvent.webkitForce is non-standard, but we collect\n      // it if it's available anyway.\n      force: e.webkitForce || 0,\n      area: 0,\n      pointerType: POINTER_TYPE_MOUSE,\n    };\n  }\n\n  _attachEventListeners() {\n    super.listenFor(\"mousedown\", (e) => this._handleStartEvent(e));\n    super.listenFor(\"mouseover\", (e) => {\n      if (!isButtonPressed(e)) return;\n      this._handleStartEvent(e);\n    });\n    super.listenFor(\"mouseup\", (e) => this._handleEndEvent(e));\n    super.listenFor(\"mouseout\", (e) => {\n      if (!isButtonPressed(e)) return;\n      this._handleEndEvent(e);\n    });\n    super.listenFor(\"mousemove\", (e) => {\n      if (!isButtonPressed(e)) return;\n      this._handleMoveEvent(e);\n    });\n  }\n}\n\nclass PointerEventMonitor extends InteractionEventMonitor {\n  constructor() {\n    super();\n  }\n\n  _normalizeEvent(e) {\n    return {\n      x: e.pageX,\n      y: e.pageY,\n      isTrusted: e.isTrusted,\n      timestamp: e.timeStamp,\n      force: e.pressure,\n      // NOTE(Casey): We consider pointer area as an ellipse for consistency\n      // with touch events.\n      area: (Math.PI * e.width * e.height) / 4,\n      pointerType: getPointerEventPointerType(e),\n    };\n  }\n\n  _attachEventListeners() {\n    super.listenFor(\"pointerdown\", (e) => this._handleStartEvent(e));\n    super.listenFor(\"pointerover\", (e) => {\n      if (!isButtonPressed(e)) return;\n      this._handleStartEvent(e);\n    });\n    super.listenFor(\"pointerup\", (e) => this._handleEndEvent(e));\n    super.listenFor(\"pointercancel\", (e) => this._handleEndEvent(e));\n    super.listenFor(\"pointerout\", (e) => {\n      if (!isButtonPressed(e)) return;\n      this._handleEndEvent(e);\n    });\n    super.listenFor(\"pointermove\", (e) => {\n      if (!isButtonPressed(e)) return;\n      this._handleMoveEvent(e);\n    });\n  }\n}\n\nclass TouchEventMonitor extends InteractionEventMonitor {\n  constructor() {\n    super();\n  }\n\n  _normalizeEvent(e) {\n    return {\n      // NOTE(Casey): We arbitrarily choose a changed touch to use for the\n      // interaction position, making distance measures inaccurate for multi-\n      // touch interactions.\n      x: e.changedTouches[0].pageX,\n      y: e.changedTouches[0].pageY,\n      isTrusted: e.isTrusted,\n      timestamp: e.timeStamp,\n      force: maxTouchEventForce(e),\n      area: touchEventArea(e),\n      pointerType: POINTER_TYPE_TOUCH,\n    };\n  }\n\n  _attachEventListeners() {\n    super.listenFor(\"touchstart\", (e) => this._handleStartEvent(e));\n    super.listenFor(\"touchend\", (e) => {\n      if (e.touches.length !== 0) return;\n      this._handleEndEvent(e);\n    });\n    super.listenFor(\"touchcancel\", (e) => this._handleEndEvent(e));\n    super.listenFor(\"touchmove\", (e) => {\n      // NOTE(Casey): There are no touch events analogous to\n      // mouseover/pointerover and mouseout/pointerout, so we check if the touch\n      // is within the window during move events instead.\n      const isInWindow = isTouchInWindow(e);\n      if (!isInWindow && this.isInteractionInProgress()) {\n        // The touch started inside the window and has now moved outside of it.\n        this._handleEndEvent(e);\n      } else if (isInWindow && this.isLastInteractionComplete()) {\n        // The touch started outside of the window and moved into the window,\n        // so we need to start tracking a new interaction.\n        this._handleStartEvent(e);\n      } else {\n        // This event is part of the interaction we're currently tracking.\n        this._handleMoveEvent(e);\n      }\n    });\n  }\n}\n\nclass InteractionMonitor {\n  // #if process.env.NODE_ENV === \"test\"\n//   destroy() {\n//     this._monitors.forEach((monitor) => {\n//       monitor.destroy();\n//     });\n//     this._monitors = [];\n//   }\n  // #endif\n\n  constructor() {\n    // These events are ordered by priority, from highest to lowest.\n    this._monitors = [\n      new TouchEventMonitor(),\n      new PointerEventMonitor(),\n      new MouseEventMonitor(),\n    ];\n\n    this._monitors.forEach((monitor) => {\n      monitor.onInteractionStart(this._handleInteractionEvent.bind(this));\n    });\n    this._monitors.forEach((monitor) => {\n      monitor.onInteractionEnd(this._handleInteractionEvent.bind(this));\n    });\n\n    this._previousAllInteractionData = null;\n    this._interactionChangeHandlers = [];\n  }\n\n  /**\n   * Given a function that will receive an object like that returned by\n   * getAllInteractionData, sets up listeners so that handlerFn will be called\n   * whenever any interaction data change.\n   */\n  onInteractionChange(handlerFn) {\n    if (this._interactionChangeHandlers.includes(handlerFn)) {\n      return;\n    }\n\n    this._interactionChangeHandlers.push(handlerFn);\n  }\n\n  _handleInteractionEvent() {\n    const currentAllInteractionData = this.getAllInteractionData();\n    if (\n      deepEqual(this._previousAllInteractionData, currentAllInteractionData)\n    ) {\n      return;\n    }\n\n    this._previousAllInteractionData = currentAllInteractionData;\n    this._interactionChangeHandlers.forEach((handler) => {\n      handler(currentAllInteractionData);\n    });\n  }\n\n  _chooseEventMonitorWithInProgressInteractions() {\n    return this._monitors.find((eventMonitor) =>\n      eventMonitor.isInteractionInProgress()\n    );\n  }\n\n  _chooseEventMonitorWithCompletedInteractions() {\n    return this._monitors.find((eventMonitor) =>\n      eventMonitor.isLastInteractionComplete()\n    );\n  }\n\n  _chooseEventMonitor() {\n    // Since this class is used by in-house and third-party creatives\n    // we prioritize partial interactions (i.e. clickthrough events\n    // that fire before the touchEnd/clickEnd/etc. fires).\n    return (\n      this._chooseEventMonitorWithInProgressInteractions() ||\n      this._chooseEventMonitorWithCompletedInteractions()\n    );\n  }\n\n  /**\n   * Returns a map containing the last interaction and the cumulative\n   * statistics. Prefer using this over calling `getLastInteractionData` and\n   * `getCumulativeInteractionStats` separately.\n   */\n  getAllInteractionData() {\n    const eventMonitor = this._chooseEventMonitor();\n    if (eventMonitor == null) {\n      return null;\n    }\n\n    return eventMonitor.getAllInteractionData();\n  }\n\n  /**\n   * Returns an object like { startX, startY, isTrusted, durationMS, maxForce\n   * maxArea, distance, pointerType } describing the last interaction.\n   */\n  getLastInteractionData() {\n    const eventMonitor = this._chooseEventMonitor();\n    if (eventMonitor == null) {\n      return null;\n    }\n\n    return eventMonitor.getLastInteractionData();\n  }\n\n  /** Returns an object like { interactionCount, totalDistance }. */\n  getCumulativeInteractionStats() {\n    const eventMonitor = this._chooseEventMonitor();\n    if (eventMonitor == null) {\n      return null;\n    }\n\n    return eventMonitor.getCumulativeInteractionStats();\n  }\n}\n\nexport {\n  InteractionMonitor,\n  // #if process.env.NODE_ENV === \"test\"\n//   POINTER_TYPE_TOUCH,\n//   POINTER_TYPE_MOUSE,\n//   POINTER_TYPE_POINTER,\n  // #endif\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/interaction_monitor.js","import {\n  AUTOCLICK_TYPE_COMPLETED_DELAY,\n  AUTOCLICK_TYPE_INTERACTION_COUNT,\n  AUTOCLICK_TYPE_LAST_INTERACTION,\n  AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT,\n  AUTOCLICK_TYPE_LOAD_DELAY,\n  AUTOCLICK_TYPE_VIEWABLE_DELAY,\n  AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET,\n} from \"../../constants\";\nimport AutoclickBehaviorCompletedDelay from \"./behaviors/AutoclickBehaviorCompletedDelay\";\nimport AutoclickBehaviorInteractionCount from \"./behaviors/AutoclickBehaviorInteractionCount\";\nimport AutoclickBehaviorLastInteraction from \"./behaviors/AutoclickBehaviorLastInteraction\";\nimport AutoclickBehaviorLastInteractionAndCount from \"./behaviors/AutoclickBehaviorLastInteractionAndCount\";\nimport AutoclickBehaviorLoadDelay from \"./behaviors/AutoclickBehaviorLoadDelay\";\nimport AutoclickBehaviorViewableDelay from \"./behaviors/AutoclickBehaviorViewableDelay\";\nimport AutoclickBehaviorViewableDelayWithReset from \"./behaviors/AutoclickBehaviorViewableDelayWithReset\";\n\nconst behaviorClasses = {\n  [AUTOCLICK_TYPE_COMPLETED_DELAY]: AutoclickBehaviorCompletedDelay,\n  [AUTOCLICK_TYPE_INTERACTION_COUNT]: AutoclickBehaviorInteractionCount,\n  [AUTOCLICK_TYPE_LAST_INTERACTION]: AutoclickBehaviorLastInteraction,\n  [AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT]:\n    AutoclickBehaviorLastInteractionAndCount,\n  [AUTOCLICK_TYPE_LOAD_DELAY]: AutoclickBehaviorLoadDelay,\n  [AUTOCLICK_TYPE_VIEWABLE_DELAY]: AutoclickBehaviorViewableDelay,\n  [AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET]:\n    AutoclickBehaviorViewableDelayWithReset,\n};\n\nconst MONITORED_EVENTS = {\n  INTERACTION_EVENT: \"interactionEvent\",\n  COMPLETED: \"completed\",\n  ENGAGEMENT: \"engagement\",\n  HTML_LOADED: \"htmlLoaded\",\n  VIEWABLE: \"viewable\",\n  VIEWABLE_CHANGE: \"viewableChange\",\n};\n\nconst AUTOCLICK_EVENT_COUNT_CHANGE = \"countChanged\";\n\n/**\n * @callback ClickthroughHandler\n * @param  {object} lastEvent - The last Interaction event.\n */\n\n/**\n * @typedef AutoclickBehaviorConfig\n * @property {string} type - autoclick variant type.\n * @property {number} delay - In ms. Time to wait until opening App Store from\n * autoclick click.\n * @property {number} count - Max occurrences of events as determined by type.\n */\n\n/**\n * Controls App Store On Interaction, aka. autoclick, behavior.\n * @see https://docs.google.com/document/d/1QYHzXt1oxmGIx2F63XErz7dF4SD6pxSi-1mkxxnHsUU/edit#heading=h.bypyxke51ec\n */\nclass Autoclick {\n  /**\n   *\n   * @param {AutoclickBehaviorConfig} behavior - Describes the autoclick behavior.\n   * @param {Object} ctx\n   * @param {ClickthroughHandler} ctx.clickthroughHandler\n   * @returns\n   */\n  constructor(behavior, { clickthroughHandler }) {\n    if (behavior == null) {\n      this.disable();\n      return;\n    }\n    this._clickthroughHandler = clickthroughHandler;\n    this._lastCount = 0;\n    this._lastInteraction = null;\n\n    this._behavior = behavior;\n    const behaviorType = behavior == null ? null : behavior.type;\n    if (behaviorClasses[behaviorType] == null) {\n      console.error(`Behavior class not found: ${behaviorType}`);\n      this.disable();\n      return;\n    }\n    /** @type {AutoclickBehaviorInteractionCount|AutoclickBehaviorCompletedDelay|AutoclickBehaviorLastInteraction|AutoclickBehaviorLastInteractionAndCount} */\n    this.behaviorClass = new behaviorClasses[behaviorType]({\n      autoclick: this,\n      behavior,\n      delayClickthroughHandler: this._handleDelayClickthrough.bind(this),\n    });\n\n    this._handleDelayClickthrough = this._handleDelayClickthrough.bind(this);\n\n    this.eventListeners = {\n      [MONITORED_EVENTS.ENGAGEMENT]: [\n        this.behaviorClass.onEngagement.bind(this.behaviorClass),\n      ],\n      [MONITORED_EVENTS.HTML_LOADED]: [\n        this.behaviorClass.onHtmlLoaded.bind(this.behaviorClass),\n      ],\n      [MONITORED_EVENTS.VIEWABLE]: [\n        this.behaviorClass.onViewable.bind(this.behaviorClass),\n      ],\n      [MONITORED_EVENTS.VIEWABLE_CHANGE]: [\n        this.behaviorClass.onViewableChange.bind(this.behaviorClass),\n      ],\n      [MONITORED_EVENTS.COMPLETED]: [\n        this.behaviorClass.onCompleted.bind(this.behaviorClass),\n      ],\n      [MONITORED_EVENTS.INTERACTION_EVENT]:\n        // Order matters.\n        [\n          this._recordLastInteraction.bind(this),\n          this.behaviorClass.onInteraction.bind(this.behaviorClass),\n        ],\n      [AUTOCLICK_EVENT_COUNT_CHANGE]: [],\n    };\n  }\n\n  disable() {\n    this.autoclickDisabled = true;\n  }\n\n  emitInteractionEvent(...args) {\n    this.emit(MONITORED_EVENTS.INTERACTION_EVENT, ...args);\n  }\n\n  emitInteractionPromptReachedEvent(...args) {\n    this.emit(MONITORED_EVENTS.COMPLETED, ...args);\n  }\n\n  emitHtmlLoadedEvent(...args) {\n    this.emit(MONITORED_EVENTS.HTML_LOADED, ...args);\n  }\n\n  emitViewableEvent(...args) {\n    this.emit(MONITORED_EVENTS.VIEWABLE, ...args);\n  }\n\n  emitViewableChangeEvent(...args) {\n    this.emit(MONITORED_EVENTS.VIEWABLE_CHANGE, ...args);\n  }\n\n  _recordLastInteraction(e) {\n    this._lastInteraction = e;\n  }\n\n  _handleDelayClickthrough(delay) {\n    clearTimeout(this._delayTimer);\n    if (this.autoclickDisabled) return;\n\n    this._delayTimer = setTimeout(() => {\n      this._clickthrough();\n    }, delay || 0);\n  }\n\n  _clickthrough() {\n    if (this.autoclickDisabled) return;\n    this._clickthroughHandler(this._lastInteraction);\n    this.disable();\n  }\n\n  emit(eventName, ...args) {\n    if (this.autoclickDisabled) return;\n    if (!(eventName in this.eventListeners)) {\n      throw new Error(`Event ${eventName} not found!`);\n    }\n    this.eventListeners[eventName].forEach((f) => {\n      f(...args);\n    });\n  }\n}\n\nexport default Autoclick;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/Autoclick.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorCompletedDelay extends AutoclickBehaviorAbstract {\n  onCompleted() {\n    this.delayClickthrough(this.getBehaviorDelay());\n  }\n}\n\nexport default AutoclickBehaviorCompletedDelay;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorCompletedDelay.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\nimport { intentionalInteractionCounterFn } from \"../autoclick_utils\";\n\nclass AutoclickBehaviorInteractionCount extends AutoclickBehaviorAbstract {\n  init() {\n    this._counter = intentionalInteractionCounterFn(this.getBehaviorCount());\n    this.triggered = false;\n  }\n\n  onInteraction(e) {\n    this.setCurrentCount(this._counter(e));\n\n    if (!this.isCountReached() || this.triggered) return;\n    this.triggered = true;\n\n    this.delayClickthrough(this.getBehaviorDelay());\n  }\n}\n\nexport default AutoclickBehaviorInteractionCount;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorInteractionCount.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorLastInteraction extends AutoclickBehaviorAbstract {\n  onInteraction() {\n    this.delayClickthrough(this.getBehaviorDelay());\n  }\n}\n\nexport default AutoclickBehaviorLastInteraction;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLastInteraction.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\nimport { intentionalInteractionCounterFn } from \"../autoclick_utils\";\n\nclass AutoclickBehaviorLastInteractionAndCount extends AutoclickBehaviorAbstract {\n  init() {\n    this._counter = intentionalInteractionCounterFn(this.getBehaviorCount());\n  }\n\n  onInteraction(e) {\n    this.setCurrentCount(this._counter(e));\n\n    this.delayClickthrough(this.getBehaviorDelay());\n  }\n}\n\nexport default AutoclickBehaviorLastInteractionAndCount;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLastInteractionAndCount.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorLoadDelay extends AutoclickBehaviorAbstract {\n  onHtmlLoaded() {\n    this.delayClickthrough(this.getBehaviorDelay());\n  }\n}\n\nexport default AutoclickBehaviorLoadDelay;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLoadDelay.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorViewableDelay extends AutoclickBehaviorAbstract {\n  onViewable() {\n    this.delayClickthrough(this.getBehaviorDelay());\n  }\n}\n\nexport default AutoclickBehaviorViewableDelay;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorViewableDelay.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorViewableDelay extends AutoclickBehaviorAbstract {\n  onViewable() {\n    this.delayClickthrough(this.getBehaviorDelay());\n  }\n\n  onViewableChange(isViewable) {\n    if (!isViewable) {\n      clearTimeout(this._autoclick._delayTimer);\n    }\n  }\n}\n\nexport default AutoclickBehaviorViewableDelay;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorViewableDelayWithReset.js","import { empty } from \"../frontendlib/dom_utils\";\nimport { clone, escapeRegExp, type } from \"../frontendlib/utils\";\nimport EventListener from \"../frontendlib/event_listener\";\n\nimport ClickInteraction from \"../lib/click_interaction\";\n\nimport Container from \"../container\";\nimport { clickAreaTypeFromEvent } from \"./cta\";\nimport LiftoffMRAID from \"./liftoff_mraid\";\nimport addDeadzones from \"./addDeadzones\";\n\nclass Madlib {\n  static init() {\n    EventListener.pubsubify(this);\n\n    this.rootEl = null;\n    this.config = null;\n\n    this.loaded = false;\n    this.containerByID = {};\n    this.allContainers = [];\n    this.rootContainer = null;\n\n    // TODO(vsingh): Remove hacky global once we are more clear on how Madlib resize events should\n    //   be handled.\n    this.didEverApplyLetterboxStyles = false;\n\n    this.productIndex = 0;\n\n    this.on(\"navigation-click\", (queryParams, clickAreaType) => {\n      Liftoff.handleClick(queryParams, clickAreaType);\n    });\n  }\n\n  /**\n   * Returns a product cycling indefinitely.\n   */\n  static getNextProduct() {\n    const { products = [] } = Liftoff.env;\n\n    const { productIndex } = this;\n    this.productIndex += 1;\n\n    return products[productIndex % products.length];\n  }\n\n  static error(e = new Error(\"Unspecified Madlib error.\")) {\n    Liftoff.handleMadlibError(e);\n  }\n\n  static load(rootEl, config) {\n    this.rootEl = rootEl;\n    this.config = config;\n    this.applyExchangePolicies();\n    this.loadDOM();\n    this.addEventListeners();\n    this.coordinate();\n    this.layout();\n\n    Liftoff.onLoadCompleted();\n  }\n\n  static applyExchangePolicies() {\n    const animationDurationLimit = Liftoff.getAnimationDurationLimit();\n    if (animationDurationLimit > 0) {\n      setTimeout(() => {\n        Madlib.allContainers.forEach((container) => {\n          const { content } = container;\n          if (content == null) return;\n          container.layout().then(() => {\n            content.stop();\n          });\n        });\n      }, animationDurationLimit);\n    }\n  }\n\n  static loadDOM() {\n    this.layoutEl = document.createElement(\"div\");\n    this.layoutEl.id = \"liftoff-layout\";\n    this.rootEl.appendChild(this.layoutEl);\n\n    this.clickEl = document.createElement(\"div\");\n    this.clickEl.id = \"liftoff-click\";\n    ClickInteraction.addListeners(this.clickEl, (e) => {\n      this.handleNavigationClick(e);\n    });\n    this.rootEl.appendChild(this.clickEl);\n\n    const { is_interstitial, is_reengagement } = Liftoff.bidContext;\n    // TODO(oscar): Cleanup test code once crserve-deadzone experiment is over.\n    const isDeadzoneExperiment = Liftoff.hasTestGroup(\n      \"crserve-deadzone-v2-experiment\"\n    );\n    const useDeadzones =\n      is_interstitial && (!is_reengagement || isDeadzoneExperiment);\n    if (useDeadzones) {\n      addDeadzones(isDeadzoneExperiment, this.rootEl);\n    }\n  }\n\n  static handleNavigationClick(e, queryParams = {}) {\n    this.emit(\"navigation-click\", queryParams, clickAreaTypeFromEvent(e));\n  }\n\n  static addEventListeners() {\n    window.addEventListener(\"resize\", () => {\n      this.layout();\n    });\n  }\n\n  static coordinate() {\n    this.on(\"wait\", ({ timeMS }) => {\n      return new Promise((resolve) => setTimeout(resolve, Number(timeMS)));\n    });\n  }\n\n  static getEvents() {\n    return [{ name: \"beforeVisible\" }].map((e) => {\n      e.type = \"madlib\";\n      return e;\n    });\n  }\n\n  static getActions() {\n    return [\n      {\n        name: \"wait\",\n        data: [\"timeMS\"],\n      },\n    ].map((a) => {\n      a.type = \"madlib\";\n      return a;\n    });\n  }\n\n  static getCreativeConfig() {\n    // TODO(cory) Implement rendering for multiple scenes. For now, all configs have exactly one scene.\n    return this.config.scenes[0].layoutContent;\n  }\n\n  static configureLetterbox(letterboxConfig) {\n    const useDarkRootBackground = letterboxConfig.useDarkRootBackground();\n    const useLayoutBackground = letterboxConfig.useLayoutBackground();\n\n    this.rootEl.classList.toggle(\n      \"letterbox-dark-background\",\n      useDarkRootBackground\n    );\n    this.layoutEl.classList.toggle(\n      \"letterbox-layout-background\",\n      useLayoutBackground\n    );\n\n    this.didEverApplyLetterboxStyles = true;\n\n    Object.assign(\n      this.clickEl.style,\n      letterboxConfig.getStyleForClickElement()\n    );\n  }\n\n  static layout() {\n    if (this.rootContainer != null) {\n      this.rootContainer.invalidate();\n    }\n\n    this.reset();\n\n    const letterboxConfig = Liftoff.getLetterboxConfig();\n    var rootElementConstraints = null;\n\n    if (letterboxConfig.enabled()) {\n      this.configureLetterbox(letterboxConfig);\n      rootElementConstraints =\n        letterboxConfig.getLetterboxConstraintsForMadlibRootElement();\n    }\n\n    this.parseCreativeConfig(\n      this.layoutEl,\n      this.getCreativeConfig(),\n      rootElementConstraints\n    );\n\n    const { allContainers, rootContainer } = this;\n\n    const loaded = rootContainer.loadContent().catch((e) => this.error(e));\n\n    const ready = rootContainer\n      .layout()\n      .then(() => {\n        LiftoffMRAID.onViewable(() => {\n          if (rootContainer.invalidated) return;\n          allContainers.forEach(({ content }) => {\n            if (content) content.start();\n          });\n        });\n      })\n      .catch((e) => this.error(e));\n\n    Promise.all([loaded, ready]).then(() => {\n      if (!this.loaded) {\n        this.loaded = true;\n        Liftoff.onMadlibLoaded();\n        this.emit(\"beforeVisible\");\n        Liftoff.onFirstLayoutFinished();\n      }\n    });\n  }\n\n  static reset() {\n    this.productIndex = 0;\n    // TODO(brian): Teardown existing components here.\n    Liftoff.resetClickParams();\n    this.clickEl.classList.remove(\"active\");\n    empty(this.layoutEl);\n    if (this.didEverApplyLetterboxStyles) {\n      [this.layoutEl, this.clickEl].forEach((el) => {\n        [\n          \"left\",\n          \"top\",\n          \"width\",\n          \"height\",\n          \"right\",\n          \"bottom\",\n          \"transform\",\n        ].forEach((prop) => {\n          el.style[prop] = \"\";\n        });\n      });\n    }\n  }\n\n  static parseCreativeConfig(rootEl, config, rootElementConstraints) {\n    const componentParams = config.componentParams;\n\n    const { clickTargets, constraints, containers, coordination, css } = config;\n\n    const { rootConstraints, rootPostLayoutTransform } =\n      rootElementConstraints || {};\n\n    const traverse = (parent, { id, children }) => {\n      const container = new Container(document.createElement(\"div\"), id);\n      container.parent = parent;\n      container.children = (children || []).map(traverse.bind(null, container));\n      container.css = css[id];\n      container.constraints = constraints[id];\n      if (componentParams[id] != null) {\n        let { component, params } = componentParams[id];\n        const subcomponents = [];\n        const fixValues = (params) => {\n          Object.keys(params).forEach((key) => {\n            const { type, value } = params[key];\n            if (value != null) {\n              switch (type) {\n                case \"array\":\n                  params[key].value = value.map(fixValues);\n                  break;\n                case \"image_original\":\n                case \"video_original\":\n                  params[key].value = Liftoff.resolveAsset(type, value);\n                  break;\n                case \"component\":\n                  const componentName = value.component;\n                  const componentParams = fixValues(clone(value.params));\n                  const component = Liftoff.Component.new(\n                    componentName,\n                    componentParams\n                  );\n                  params[key].value = component;\n                  subcomponents.push(component);\n                  break;\n              }\n            }\n\n            params[key] = params[key].value;\n          });\n          return params;\n        };\n\n        params = fixValues(clone(params));\n        container.content = Liftoff.Component.new(component, params);\n        container.content.on(\"error\", this.error.bind(this));\n        // Errors from all subcomponents, regardless of nesting depth, are\n        // relayed directly to the top-level component.\n        subcomponents.forEach((subcomponent) =>\n          subcomponent.relay(container.content, \"error\")\n        );\n      }\n\n      this.containerByID[id] = container;\n      this.allContainers.push(container);\n      return container;\n    };\n\n    this.containerByID = {};\n    this.allContainers = [];\n    this.rootContainer = new Container(rootEl);\n    this.rootContainer.parent = new Container(rootEl.parentNode);\n    this.rootContainer.children = containers.map(\n      traverse.bind(null, this.rootContainer)\n    );\n    this.rootContainer.css = { overflow: \"hidden\" };\n    this.rootContainer.constraints = rootConstraints || {\n      width: \"100%\",\n      height: \"100%\",\n    };\n    this.rootContainer.postLayoutTransform = rootPostLayoutTransform;\n\n    this.attachAnchors();\n    this.configureCoordination(coordination);\n    this.configureClickTargets(clickTargets);\n\n    this.rootContainer.layout();\n  }\n\n  static attachAnchors() {\n    this.allContainers.forEach((container) => {\n      if (container.constraints == null) return;\n      container.anchors = [\"top\", \"right\", \"bottom\", \"left\"]\n        .filter((edge) => type(container.constraints[edge]) === \"object\")\n        .map((edge) => {\n          return {\n            edge,\n            anchor: this.containerByID[container.constraints[edge].anchor],\n          };\n        });\n    });\n  }\n\n  // Link events with actions.\n  static configureCoordination(coordination) {\n    coordination\n      .filter(({ event }) => event.name != null)\n      .forEach(({ event, actions }) => {\n        const {\n          name: eventName,\n          type: eventType,\n          source,\n          data: eventMacros,\n        } = event;\n\n        const actors = actions\n          .map((action) => {\n            const {\n              name: actionName,\n              type: actionType,\n              target,\n              data: actionMacros,\n            } = action;\n            let actor;\n            switch (actionType) {\n              case \"madlib\":\n                actor = this;\n                break;\n              case \"component\":\n                actor = this.containerByID[target].content;\n                break;\n              case \"container\":\n                actor = this.containerByID[target];\n                break;\n            }\n\n            return { actionName, actor, actionMacros };\n          })\n          .filter(({ actionName }) => actionName != null);\n\n        let emitter;\n        switch (eventType) {\n          case \"madlib\":\n            emitter = this;\n            break;\n          case \"component\":\n            emitter = this.containerByID[source].content;\n            break;\n          case \"container\":\n            emitter = this.containerByID[source];\n            break;\n        }\n\n        const getMacroValues = (eventPayload) => {\n          const macroValues = {};\n          Object.keys(eventMacros).forEach((key) => {\n            const macro = eventMacros[key];\n            macroValues[macro] = eventPayload[key];\n          });\n\n          return macroValues;\n        };\n\n        const expandMacros = (macroValues, actionMacros) => {\n          const actionPayload = {};\n          Object.keys(actionMacros).forEach((key) => {\n            const expansion = Object.keys(macroValues).reduce((s, macro) => {\n              // TODO(oscar): Tokenize macro better.\n              s = s == null ? \"\" : s;\n              const r = escapeRegExp(macro);\n              const sub =\n                macroValues[macro] == null ? \"\" : String(macroValues[macro]);\n              return s.replace(new RegExp(r, \"g\"), sub);\n            }, actionMacros[key]);\n\n            actionPayload[key] = expansion;\n          });\n\n          return actionPayload;\n        };\n\n        const processEventPayload = (eventPayload, actionMacros) => {\n          return expandMacros(getMacroValues(eventPayload), actionMacros);\n        };\n\n        const dispatchActions = (eventPayload = {}) => {\n          // \"Waterfall\" the `.emit` Promises to process them serially.\n          return actors\n            .reduce((promise, { actionName, actor, actionMacros }) => {\n              const data = processEventPayload(eventPayload, actionMacros);\n              return promise.then(() => actor.emit(actionName, data));\n            }, Promise.resolve())\n            .catch((e) => this.error(e));\n        };\n\n        emitter.on(eventName, dispatchActions);\n      });\n  }\n\n  // Setup click listeners.\n  static configureClickTargets(clickTargets) {\n    if (clickTargets.length > 0) {\n      clickTargets.forEach((id) => {\n        ClickInteraction.addListeners(this.containerByID[id].el, (e) => {\n          this.handleNavigationClick(e);\n        });\n      });\n    }\n    // tre HTML endcards have their own way of handling click events.\n    else if (!window.Liftoff.env.is_tre || !window.TreSensa) {\n      this.clickEl.classList.add(\"active\");\n    }\n  }\n}\n\nMadlib.init();\n\nMadlib.ClickInteraction = ClickInteraction;\n\nwindow.Madlib = Madlib;\n\nexport default Madlib;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/madlib.js","import {\n  getRelativeBoundingClientRect,\n  getAggregateBoundingClientRect,\n  parseCSSLength,\n} from \"./frontendlib/dom_utils\";\nimport { type } from \"./frontendlib/utils\";\nimport EventListener from \"./frontendlib/event_listener\";\n\nconst EDGE_TO_TYPE = {\n  left: \"leading\",\n  right: \"trailing\",\n  top: \"leading\",\n  bottom: \"trailing\",\n};\nconst EDGE_TO_DIMENSION = {\n  left: \"width\",\n  right: \"width\",\n  top: \"height\",\n  bottom: \"height\",\n};\n\n// We currently require CTA containers to be prefixed with \"CTA\", but we're\n// more liberal here to support some legacy templates.\nconst ctaContainerRegex = /\\bcta\\b/i;\nconst isCTAContainer = (containerID) => {\n  return ctaContainerRegex.test(containerID);\n};\n\nclass Container extends EventListener {\n  static getEvents() {\n    return [{ name: \"beforeLayout\", system: true }, { name: \"onClick\" }].map(\n      (e) => {\n        e.type = \"container\";\n        return e;\n      }\n    );\n  }\n\n  static getActions() {\n    return [{ name: \"show\" }, { name: \"hide\" }].map((a) => {\n      a.type = \"container\";\n      return a;\n    });\n  }\n\n  /** @param {HTMLDivElement} el - The container element. */\n  constructor(el, id = \"\") {\n    super();\n    this.el = el;\n    this.el.classList.add(\"madlib-container\");\n    if (isCTAContainer(id)) {\n      // We tag CTA containers to help us detect when clicks occur on CTAs.\n      this.el.classList.add(\"cta-container\");\n    }\n    // `parent` and `children` refer to other Containers.\n    this.parent = null;\n    this.children = [];\n\n    this.fixedWidth = false;\n    this.fixedHeight = false;\n\n    this.css = null;\n    this.constraints = null;\n    this.anchors = [];\n    this.content = null;\n\n    this.layoutReady = null;\n    this.contentReady = null;\n    this.hidden = false;\n\n    this.postLayoutTransform = null;\n\n    this.addEventListeners();\n    this.coordinate();\n  }\n\n  addEventListeners() {\n    this.el.addEventListener(\"click\", () => this.emit(\"onClick\"));\n  }\n\n  coordinate() {\n    this.on({\n      hide: () => {\n        Object.assign(this.el.style, {\n          pointerEvents: \"none\",\n          visibility: \"hidden\",\n        });\n      },\n      show: () => {\n        Object.assign(this.el.style, {\n          pointerEvents: (this.css && this.css[\"pointer-events\"]) || \"auto\",\n          visibility: (this.css && this.css.visibility) || \"visible\",\n        });\n      },\n    });\n  }\n\n  loadContent() {\n    if (this.contentReady == null) {\n      const promises = this.children.map((child) => child.loadContent());\n      if (this.content != null) {\n        promises.push(this.content.load());\n      }\n\n      this.contentReady = Promise.all(promises);\n    }\n\n    return this.contentReady;\n  }\n\n  layout() {\n    if (this.layoutReady == null) {\n      // NOTE(oscar): beforeLayout should probably only trigger at most once per\n      // container.\n      this.emit(\"beforeLayout\");\n    }\n    if (this.layoutReady == null) {\n      if (this.el.parentNode !== this.parent.el) {\n        this.parent.el.appendChild(this.el);\n      }\n\n      if (this.constraints != null) {\n        if (\n          (this.constraints.left != null && this.constraints.right != null) ||\n          this.constraints.width != null\n        ) {\n          this.fixedWidth = true;\n        }\n\n        if (\n          (this.constraints.top != null && this.constraints.bottom != null) ||\n          this.constraints.height != null\n        ) {\n          this.fixedHeight = true;\n        }\n      }\n\n      // The child components do not layout properly if a transform is active.\n      // So, let's reset the transform before we proceed, then apply it later.\n      this.resetTransform();\n\n      this.style();\n      this.position();\n      this.layoutReady = this.loadContent()\n        .then(() => this.anchor())\n        .then(() => this.match())\n        .then(() => this.layoutContent())\n        .then(() => this.center())\n        .then(() => this.applyTransform());\n    }\n\n    return this.layoutReady;\n  }\n\n  style() {\n    // The zIndex creates a stacking context for the contents of the container\n    // element so that they don't interfere with other containers.\n    Object.assign(this.el.style, { zIndex: 1 }, this.css);\n  }\n\n  position() {\n    if (this.constraints == null) return;\n    const styles = { position: \"absolute\" };\n    [\"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\"].forEach((prop) => {\n      const value = this.constraints[prop];\n      if (value != null && type(value) !== \"object\") {\n        styles[prop] = value;\n      }\n    });\n    Object.assign(this.el.style, styles);\n  }\n\n  resetTransform() {\n    if (this.postLayoutTransform != null) {\n      this.el.style.transform = \"none\";\n    }\n  }\n\n  applyTransform() {\n    if (this.postLayoutTransform != null) {\n      this.el.style.transform = this.postLayoutTransform;\n    }\n  }\n\n  anchor() {\n    let pRect;\n    const promises = this.anchors.map(({ edge: containerEdge, anchor }) => {\n      const { distance, edge: anchorEdge } = this.constraints[containerEdge];\n      const containerEdgeType = EDGE_TO_TYPE[containerEdge];\n      const anchorEdgeType = EDGE_TO_TYPE[anchorEdge];\n      const dimension = EDGE_TO_DIMENSION[containerEdge];\n      // Block positioning until the anchor is ready.\n      return anchor.layout().then(() => {\n        if (pRect == null) {\n          pRect = this.parent.el.getBoundingClientRect();\n        }\n\n        const rect = getRelativeBoundingClientRect(anchor.el);\n        let offset;\n        switch (`${containerEdgeType} ${anchorEdgeType}`) {\n          case \"leading leading\":\n            offset = rect[anchorEdge];\n            break;\n          case \"trailing trailing\":\n            offset = -rect[anchorEdge];\n            break;\n          case \"leading trailing\":\n            offset = pRect[dimension] + rect[anchorEdge];\n            break;\n          case \"trailing leading\":\n            offset = pRect[dimension] - rect[anchorEdge];\n            break;\n        }\n\n        const { value, units } = parseCSSLength(distance);\n        switch (units) {\n          case \"px\":\n            offset += value;\n            break;\n          case \"%\":\n            offset += (pRect[dimension] * value) / 100;\n            break;\n        }\n\n        this.el.style[containerEdge] = `${offset}px`;\n      });\n    });\n    return Promise.all(promises);\n  }\n\n  match() {\n    if (\n      this.constraints == null ||\n      !(\n        this.constraints.matchWidthToHeight ||\n        this.constraints.matchHeightToWidth\n      )\n    ) {\n      return;\n    }\n\n    const { width, height } = this.el.getBoundingClientRect();\n    if (this.constraints.matchWidthToHeight) {\n      this.el.style.width = `${height}px`;\n    } else if (this.constraints.matchHeightToWidth) {\n      this.el.style.height = `${width}px`;\n    }\n  }\n\n  layoutContent() {\n    if (this.invalidated) return;\n\n    const promises = this.children.map((child) => child.layout());\n    if (this.content != null) {\n      promises.push(this.content.layout(this.el));\n    }\n\n    return Promise.all(promises).then(() => {\n      // For containers that serve as wrappers for other containers (i.e. do not\n      // have content), calculate the aggregate bounding rectangle for all\n      // children and resize the container to match the rectangle. This allows\n      // centering to work properly.\n      if (this.content != null || (this.fixedWidth && this.fixedHeight)) return;\n      const rect = getAggregateBoundingClientRect(\n        this.children.map((child) => child.el)\n      );\n      const style = {};\n      if (!this.fixedWidth) {\n        style.width = `${rect.width}px`;\n      }\n\n      if (!this.fixedHeight) {\n        style.height = `${rect.height}px`;\n      }\n\n      Object.assign(this.el.style, style);\n    });\n  }\n\n  center() {\n    if (\n      this.constraints == null ||\n      !(this.constraints.centerHorizontal || this.constraints.centerVertical)\n    ) {\n      return;\n    }\n\n    const pRect = this.parent.el.getBoundingClientRect();\n    const rect = this.el.getBoundingClientRect();\n    if (this.constraints.centerHorizontal) {\n      this.el.style.left = `${(pRect.width - rect.width) / 2}px`;\n    }\n\n    if (this.constraints.centerVertical) {\n      this.el.style.top = `${(pRect.height - rect.height) / 2}px`;\n    }\n  }\n\n  invalidate() {\n    this.invalidated = true;\n\n    // NOTE(vsingh):\n    // The following is a hack on top of a hack. We invalidate containers when\n    // resetting layout, so that any asynchronous process kicked off\n    // by those containers will have no further effect.\n    // Unfortunately the invalidation hack has holes: there are still\n    // cases where side effects are applied to the DOM element\n    // associated with the container. Therefore, dissociate the\n    // container and the DOM element immediately upon container\n    // invalidation.\n    this.el = document.createElement(\"div\");\n  }\n}\n\nexport default Container;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/container.js","import * as DOMUtils from \"../../frontendlib/dom_utils\";\nimport * as Utils from \"../../frontendlib/utils\";\n\nconst TEMPLATE = `<div class=\"last-chance-endscreen\">\n  <svg class=\"back-cta-icon hidden\" width=\"24px\" height=\"24px\" fill=\"white\">\n    <path d=\"M12 17.414 3.293 8.707l1.414-1.414L12 14.586l7.293-7.293 1.414 1.414L12 17.414z\"/>\n  </svg>\n  <div class=\"last-chance-endscreen-container\">\n    <div class=\"inner-container hidden\">\n      <img class=\"last-chance-logo\" />\n      <div class=\"icon-container\"></div>\n      <div class=\"caption\"></div>\n      <a class=\"liftoff-link liftoff-cta\">\n        <img />\n        <div class=\"common-cta\"></div>\n      </a>\n    </div>\n  </div>\n</div>`;\n\n/**\n * @typedef AppStoreData\n * @property {string} icon - application icon.\n * @property {string} name - application name.\n * @property {string} company - application company/developer.\n * @property {number} rating - application rating on Google Play store.\n * @property {number} rating_count - number of times the app has been rated on\n * the Google Play store.\n * @property {string | number} download_count - number of times the app has been\n * downloaded from the Google Play store.\n * @property {string} content_rating - app content rating on the Google Play\n * store.\n * @property {string} screenshots - screenshots available for the app.\n * @property {string} description - app description.\n */\n\n/**\n * Creates a Liftoff Last Chance Endscreen component which is displayed to the\n * user as an overlay HTML endscreen.\n *\n * @see https://docs.google.com/presentation/d/15EUBJUVXP2DpFbkA3hB0yE8z-iEy6C1I5tlZ-1h-jBw/edit?usp=sharing\n */\nexport default class LastChanceEndscreen {\n  /**\n   *\n   * @param {AppStoreData} appStoreData\n   * @param {Object} parentEl\n   * @param {function} handleClick\n   * @param {boolean} validateUserClick - if true then CTA is only triggered if\n   * click is invoked by the user and not programmatically.\n   * @param {Object} env\n   */\n  constructor(\n    appStoreData,\n    parentEl,\n    handleClick,\n    validateUserClick = false,\n    env\n  ) {\n    this.appStoreData = appStoreData;\n    this.parentEl = parentEl;\n    this.el = DOMUtils.strToElement(TEMPLATE);\n    this.handleClick = handleClick;\n    this.validateUserClick = validateUserClick;\n    this.env = env;\n    this.ctaText = env.cta_text || \"INSTALL\";\n    this.autoEndCardCallCount = 0;\n    this.timeout = null;\n\n    if (this.parentEl == null) {\n      console.error(\n        \"Last chance endscreen was created without a parent container\"\n      );\n    }\n    // Load app icon when the Liftoff Last Chance Endscreen instance is created.\n    this.images = this.loadImages([this.appStoreData.icon]);\n  }\n\n  loadImages(imagePaths) {\n    return Utils.loadImages(imagePaths);\n  }\n\n  prepareAutoEndcard() {\n    this.el.querySelector(\".caption\").innerHTML = this.appStoreData.name;\n    this.el.querySelector(\".common-cta\").innerHTML = this.ctaText.toUpperCase();\n    // Show all elements in the LO last chance endscreen after app icon is\n    // loaded on the browser.\n    this.images\n      .then((values) => {\n        values.forEach((img) => {\n          img.classList.add(\"icon\");\n          this.el.querySelector(\".icon-container\").appendChild(img);\n        });\n      })\n      .catch((error) => {\n        console.error(`Error while rendering app icon: ${error.message}`);\n      })\n      .finally(() => {\n        // This will run on success or error.\n        this.el.querySelector(\".inner-container\").classList.remove(\"hidden\");\n      });\n\n    this.parentEl.appendChild(this.el);\n  }\n\n  showAutoEndcard() {\n    if (this.env.has_html_endscreen) {\n      if (this.env.platform) {\n        // For adding iOS/Android specific styles on the AutoEndcard\n        this.el.closest(\"#liftoff-snippet\").classList.add(this.env.platform);\n      }\n\n      this.el.querySelector(\".back-cta-icon\").classList.remove(\"hidden\");\n      this.el.classList.add(\"rolling-up-animation\");\n    }\n  }\n\n  initAutoEndcard() {\n    if (this.wasShown) return;\n    this.wasShown = true;\n    this.prepareAutoEndcard();\n    this.showAutoEndcard();\n    this.initializeEvents();\n  }\n\n  initializeEvents() {\n    let touchstart = 0;\n\n    // Fire CTA if user clicks anywhere on the screen.\n    this.el.addEventListener(\"click\", (e) => {\n      if (!e.target.closest(\".back-cta-icon\")) {\n        const triggerCTA = this.validateUserClick ? e.isTrusted : true;\n        if (triggerCTA) {\n          this.handleClick(\n            !this.useInteractionMonitor ? e : this._lastInteraction\n          );\n        }\n      }\n    });\n\n    this.el.querySelector(\".back-cta-icon\").addEventListener(\"click\", () => {\n      this.el.classList.add(\"rolling-down-animation\");\n    });\n\n    this.el.addEventListener(\"touchstart\", (e) => {\n      touchstart = e.changedTouches[0].screenY;\n    });\n\n    this.el.addEventListener(\"touchend\", (e) => {\n      // Adding 70px buffer to avoid accidental taps on screen\n      if (e.changedTouches[0].screenY > touchstart + 70) {\n        this.el.classList.add(\"rolling-down-animation\");\n      }\n    });\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/last_chance_endscreen/last_chance_endscreen.js","import Component from \"./component\";\nimport * as CreativeUtils from \"../creative_utils\";\nimport * as ClickHandling from \"../click_handling\";\nimport LiftoffMRAID from \"./liftoff_mraid\";\nimport { InteractionMonitor } from \"../interaction_monitor\";\nimport LetterboxConfig from \"./letterbox_config\";\nimport Logger from \"./logger\";\nimport WindowResizeLogger from \"./window_resize_logger\";\nimport {\n  AUDIO_POLICY_NO_RESTRICTIONS,\n  CLICK_METRIC_TYPE_CLOSE,\n  CLICK_METRIC_TYPE_CTA,\n  CLICK_METRIC_TYPE_DEADZONE,\n  CLICK_METRIC_TYPE_UNKNOWN,\n  CLICK_OPEN_METHOD_MRAID,\n} from \"../constants\";\nimport * as DOMUtils from \"../frontendlib/dom_utils\";\nimport * as Utils from \"../frontendlib/utils\";\nimport { clickAreaTypeFromEvent, pointInCTA } from \"./cta\";\nimport { getAdexpContextSnapshotFn } from \"./adexp\";\nimport Autoclick from \"./autoclick/Autoclick\";\nimport Madlib from \"./madlib\";\nimport LastChanceEndscreen from \"../lib/last_chance_endscreen/last_chance_endscreen\";\nimport { MESSAGE_TRESENSA_INTERACTION } from \"./csp-env/messages\";\n\n/**\n * NOTE(oscar): After 3 seconds, log what mraid methods/events have been\n * supported. This should be right before users typically close the ad\n * which should give enough time to check what events have triggered or\n * methods used.\n */\nconst logMraidSupport = () => {\n  setTimeout(() => {\n    Logger.recordLog(\n      \"mraid\",\n      // TODO(oscar): Use the data param once adexp logs can save it.\n      JSON.stringify({\n        tag: \"mraidSupport\",\n        ...LiftoffMRAID.getSupportedLog(),\n      })\n    );\n  }, 3000);\n};\n\n/**\n * Function used to handle auto-endcard interaction event from TreSensa\n * creatives made from the \"tresensa-snippet\" Madlib component.\n * @param {*} e\n * @param {*} autoEndcard\n * @param {*} lastChanceEndscreenAutoclick\n * @param {*} lastChanceEndscreenInteractionAutoclick\n * TODO(luis): We need to integrate TreSensa interaction events with the\n * InteractionMonitor class.\n */\nconst onTreSensaInteraction = (\n  e,\n  autoEndcard,\n  lastChanceEndscreenAutoclick,\n  lastChanceEndscreenInteractionAutoclick,\n  vxInteractionListeners\n) => {\n  if (e.data === MESSAGE_TRESENSA_INTERACTION) {\n    if (lastChanceEndscreenAutoclick) {\n      lastChanceEndscreenAutoclick.disable();\n    }\n    // TODO(Luis): This is a temporary fix to handle the case where the\n    // interaction event is triggered from a TreSensa wrapped 3p.\n    // Eventually this needs to be deleted and updated so that a\n    // tre_interaction event does trigger a global interaction that can be\n    // detected by the AutoClick interaction behaviour.\n    if (\n      autoEndcard &&\n      lastChanceEndscreenInteractionAutoclick &&\n      lastChanceEndscreenInteractionAutoclick._behavior &&\n      lastChanceEndscreenInteractionAutoclick._behavior.delay\n    ) {\n      // Display auto-endcard after a delay on interaction.\n      setTimeout(() => {\n        autoEndcard.initAutoEndcard();\n      }, lastChanceEndscreenInteractionAutoclick._behavior.delay);\n    }\n\n    // NOTE(Sangeeth): The onTreSensaInteraction handler is only called for\n    // tresensa client wrapped playables. These playables run inside an iframe\n    // so we can't detect interaction events for them through the interaction\n    // monitor.\n    vxInteractionListeners.forEach((cb) => cb());\n  }\n};\n\nclass Liftoff {\n  static init(env, assets, trackingTags = []) {\n    try {\n      /** TODO(oscar): Consider logging MRAID support for CSP creatives. */\n      logMraidSupport();\n\n      if (trackingTags != null) {\n        LiftoffMRAID.onViewable(() => {\n          const trackingTagHolder = document.getElementById(\n            \"tracking-tag-holder\"\n          );\n          DOMUtils.appendImpressionTags(trackingTagHolder, trackingTags);\n        });\n      }\n\n      this.env = env;\n      this.populateAppStoreData();\n      // The bid context is often used, giving it an alias saves characters and lines of this JS.\n      this.bidContext = env.bid_context;\n      this.assets = assets;\n      this.testGroups = {};\n      this.bidContext.ab_tests.forEach((group) => {\n        this.testGroups[group] = true;\n      });\n      this.lastClickMetric = null;\n      this.resetClickParams();\n      this.interactionMonitor = new InteractionMonitor();\n      this.vxInteractionListeners = [];\n      this.interactionMonitor.onInteractionChange((e) => {\n        this.vxInteractionListeners.forEach((cb) => cb(e));\n        this._autoclickBus.forEach((ac) => ac.emitInteractionEvent(e));\n      });\n\n      this.snippetEl = null;\n      this.updateMRAID();\n      this.loadDOM();\n      this.loadLogger();\n      this.initAutoclickBehaviors();\n      Logger.recordMetricV2(\"initial_load_count\", 1);\n      this.applyPolicy();\n      this.windowResizeLogger = new WindowResizeLogger(\n        this.snippetEl,\n        this.env.enable_logging\n      );\n      this.addEventListeners();\n      this.madlibLoaded = false;\n      this.useAutoendcardBehaviour = null;\n\n      LiftoffMRAID.on(\"error\", (e) => Logger.recordError(e));\n    } catch (e) {\n      Logger.recordError(e);\n    }\n  }\n\n  static populateAppStoreData() {\n    if (!this.env.app_store_data) {\n      try {\n        if (window.parent.VungleHelper) {\n          const tokens = window.parent.VungleHelper.tokens;\n          if (tokens) {\n            this.env.app_store_data = {\n              icon: tokens.APP_ICON,\n              name: tokens.APP_NAME,\n              description: tokens.APP_DESCRIPTION,\n              rating: tokens.APP_STORE_RATING,\n            };\n          }\n        }\n      } catch (error) {\n        console.error(\"Error occurred:\", error.message);\n      }\n    }\n  }\n\n  static initAutoclickBehaviors() {\n    this._autoclickBus = [];\n    LiftoffMRAID.on(\"clickMethodTried\", ({ clickOpenMethod, isAutoclick }) => {\n      if (isAutoclick && clickOpenMethod === CLICK_OPEN_METHOD_MRAID) {\n        Logger.recordMetricV2(\n          \"mraid_autoclick_fired_ms\",\n          Date.now() - LIFTOFF_START_TS\n        );\n      }\n    });\n\n    this._viewclick = new Autoclick(this.bidContext.viewclick_behavior, {\n      clickthroughHandler: (lastEvent) =>\n        this.handleClick(\n          {\n            mac: 1,\n          },\n          clickAreaTypeFromEvent({\n            clientX:\n              lastEvent == null ? null : lastEvent.lastInteraction.startX,\n            clientY:\n              lastEvent == null ? null : lastEvent.lastInteraction.startY,\n          })\n        ),\n    });\n    this._autoclickBus.push(this._viewclick);\n\n    // We store app store data in this variable for reusability.\n    const appStoreData = this.env.app_store_data;\n\n    let autoEndcard;\n    // Only initialize autoEndcard if there is app store data in the bid context.\n    if (appStoreData) {\n      autoEndcard = new LastChanceEndscreen(\n        appStoreData,\n        this.snippetEl,\n        (e) => {\n          Madlib.handleNavigationClick(e, {\n            ae: 1,\n          });\n        },\n        this.bidContext.exchange === \"inmobi\",\n        this.env\n      );\n    }\n\n    this.useAutoendcardBehaviour =\n      this.bidContext.last_chance_endscreen_autoclick_behavior;\n\n    // If exchange is mintegral then only display the auto endcard on delay if\n    // platform is ios.\n    if (\n      this.useAutoendcardBehaviour &&\n      (this.bidContext.exchange != \"mintegral\" ||\n        this.bidContext.platform === \"ios\")\n    ) {\n      this._lastChanceEndscreenAutoclick = new Autoclick(\n        this.useAutoendcardBehaviour,\n        {\n          clickthroughHandler: () => {\n            if (autoEndcard) {\n              autoEndcard.initAutoEndcard();\n            }\n          },\n        }\n      );\n      this._autoclickBus.push(this._lastChanceEndscreenAutoclick);\n    }\n\n    this._lastChanceEndscreenInteractionAutoclick = new Autoclick(\n      this.bidContext.last_chance_endscreen_interaction_autoclick_behavior,\n      {\n        clickthroughHandler: () => {\n          if (autoEndcard) {\n            autoEndcard.initAutoEndcard();\n          }\n        },\n      }\n    );\n    this._autoclickBus.push(this._lastChanceEndscreenInteractionAutoclick);\n    /**\n     * Handle cases where the interaction event is triggered from the\n     * \"tresensa-snippet\" Madlib component.\n     */\n    window.addEventListener(\n      \"message\",\n      (e) => {\n        onTreSensaInteraction(\n          e,\n          autoEndcard,\n          this._lastChanceEndscreenAutoclick,\n          this._lastChanceEndscreenInteractionAutoclick,\n          this.vxInteractionListeners\n        );\n      },\n      true\n    );\n  }\n\n  static setInteractionPromptReached(e) {\n    this._autoclickBus.forEach((ac) => ac.emitInteractionPromptReachedEvent(e));\n  }\n\n  static getAnimationDurationLimit() {\n    return this.env.creative_policy.animation_duration_limit;\n  }\n\n  static handleMadlibError(e) {\n    Logger.recordError(e);\n  }\n\n  static hasTestGroup(group) {\n    return !!this.testGroups[group];\n  }\n\n  static isExchange(exchange) {\n    return this.bidContext.exchange.toLowerCase() === exchange.toLowerCase();\n  }\n\n  static updateMRAID() {\n    if (this.bidContext.is_interstitial) {\n      const { width, height } = this.bidContext;\n      LiftoffMRAID.lockOrientation(width < height ? \"portrait\" : \"landscape\");\n    }\n  }\n\n  static loadLogger() {\n    const {\n      enable_logging: enableLogging,\n      enable_html_return: enableHtmlReturn,\n      logging_endpoint: endpoint,\n      event_tracking_param: trackingParam,\n      html_return_delay: delay,\n    } = this.env;\n\n    Logger.passContext(\n      endpoint,\n      trackingParam,\n      getAdexpContextSnapshotFn(this.snippetEl, () => {\n        return LiftoffMRAID.hasSupport(\"mraid\");\n      })\n    );\n\n    if (!enableLogging) {\n      return;\n    }\n\n    Logger.enable();\n    Logger.addErrorListeners();\n\n    if (!enableHtmlReturn) {\n      return;\n    }\n    CreativeUtils.configureHTMLReturn(endpoint, delay);\n  }\n\n  static loadDOM() {\n    this.snippetEl = document.createElement(\"div\");\n    this.snippetEl.id = \"liftoff-snippet\";\n    this.snippetEl.classList.add(this.bidContext.platform.toLowerCase());\n    this.snippetEl.classList.add(...this.bidContext.ab_tests);\n    document.body.appendChild(this.snippetEl);\n    // TreSensa endcards using the adcontainer.js library rely on the\n    // \"tre_container\" div being present.\n    if (this.env.is_tre) {\n      this.treContainerEl = document.createElement(\"div\");\n      this.treContainerEl.id = \"tre_container\";\n      this.treContainerEl.zIndex = 2;\n      this.snippetEl.appendChild(this.treContainerEl);\n    }\n  }\n\n  /**\n   * A creative policy is a collection of special requirements the creative must comply with. These tend\n   * to be country and/or exchange specific.\n   * Creative policies are set in admarkup/core.\n   * @param {Object} policy - A series of requirements.\n   * @param {boolean} policy.add_border - Adds a border around the creative.\n   * @param {string} policy.russian_age_rating - Shows age rating watermark.\n   * @param {number} policy.animation_duration_limit - Stops all animation after a set time.\n   * @param {boolean} policy.show_chinese_watermark - Shows Chinese watermark.\n   * @param {boolean} policy.show_ad_choices - Shows the AdChoices watermark.\n   * @param {boolean} policy.block_notifications - Blocks notification icons from appearing on chat banners.\n   * @param {boolean} policy.block_strobing - Keeps strobing/blinking animations from happening.\n   * @param {boolean} policy.use_custom_close - True iff we should use a custom close button for this\n   *                                            impression.\n   * @param {number} policy.close_delay - Overrides any previously set close delay duration.\n   */\n  static applyPolicy(\n    {\n      add_border,\n      russian_age_rating,\n      show_chinese_watermark,\n      show_ad_choices,\n      use_custom_close,\n      close_delay,\n    } = this.env.creative_policy\n  ) {\n    const bidContext = this.bidContext;\n    CreativeUtils.applyLiftoffPolicy(\n      this.snippetEl,\n      {\n        addBorder: add_border,\n        showAdChoices: show_ad_choices,\n        russianAgeRating: russian_age_rating,\n        showChineseWatermark: show_chinese_watermark,\n        useCustomClose: use_custom_close,\n        closeDelay: close_delay,\n        // NOTE(Casey): `applyLiftoffPolicy` globally modifies audio output of the entire creative. Currently,\n        // madlib creatives do not use these global controls -- we depend on components to directly check\n        // the audio policy before making sound. We therefore set `audioPolicy` here to `NO_RESTRICTION` to\n        // disable the global controls.\n        // TODO(Casey): Update this if we decide to use global controls for madlib creatives in the future.\n        audioPolicy: AUDIO_POLICY_NO_RESTRICTIONS,\n      },\n      {\n        creativeID: bidContext.creative_id,\n        platform: bidContext.platform,\n        exchange: bidContext.exchange.toLowerCase(),\n        sourceAppName: bidContext.source_app_name,\n        sourceAppID: bidContext.source_app_id,\n        cdnURL: bidContext.cdnURL,\n      }\n    );\n  }\n\n  static onMadlibLoaded() {\n    this.madlibLoaded = true;\n  }\n\n  static resetClickParams() {\n    this.clickParams = {};\n  }\n\n  static mergeClickParams(params) {\n    Object.assign(this.clickParams, params);\n  }\n\n  static getClickParams() {\n    return this.clickParams;\n  }\n\n  /** Handles clickthrough/CTA clicks. */\n  static handleClick(queryParams = {}, clickAreaType = null) {\n    /**\n     * NOTE(oscar): To prevent aggressive behavior, we disable autoclick the\n     * first time the store page is opened regardless of how.\n     * mac=1 means there will be no UX change.\n     */\n    if (this._lastChanceEndscreenAutoclick && !queryParams.mac) {\n      this._lastChanceEndscreenAutoclick.disable();\n    }\n    // NOTE(oscar): pv=1 clicks should mean the MMP is not sent a click.\n    if (!queryParams.pv) {\n      this._viewclick.disable();\n    }\n\n    const clickTrackingParams = ClickHandling.getClickTrackingQueryParams(\n      this.interactionMonitor.getAllInteractionData()\n    );\n\n    const allQueryParams = {\n      cbl: this.madlibLoaded ? 0 : 1,\n      ...this.getClickParams(),\n      ...clickTrackingParams,\n      ...queryParams,\n    };\n\n    if (clickAreaType != null) {\n      allQueryParams.ca = clickAreaType;\n    }\n\n    const {\n      bidContext: bidContext,\n      env: { click_config: clickConfig },\n    } = this;\n    ClickHandling.handleClick({\n      clickConfig: {\n        clickthroughURL: clickConfig.clickthrough_url,\n        clickTrackingURLs: clickConfig.click_tracking_urls,\n      },\n      queryParams: allQueryParams,\n      isReengagement: bidContext.is_reengagement,\n      platform: bidContext.platform,\n      exchange: bidContext.exchange,\n      abTests: bidContext.ab_tests,\n    });\n  }\n\n  static onClickCapture(e) {\n    // An array of EventTarget objects, some of which may be instances of Element.\n    const path = (e.composedPath && e.composedPath()) || e.path;\n    if (path == null) {\n      return;\n    }\n\n    const foundSnippet = path.some((el) => el === this.snippetEl);\n    if (!foundSnippet) {\n      return;\n    }\n\n    const rect = this.snippetEl.getBoundingClientRect();\n    const clickMetric = {\n      x: Math.round(e.pageX - rect.left),\n      y: Math.round(e.pageY - rect.top),\n      time_ms: Date.now() - LIFTOFF_START_TS,\n      // NOTE(vsingh): The click type below must be one of AdexpMetric.ClickType.\n      type: CLICK_METRIC_TYPE_UNKNOWN,\n    };\n\n    // Helper function that returns true if some Elements in `path` satisfy the condition `pred`.\n    const someElements = (pred) =>\n      path.some(\n        (eventtarget) => eventtarget instanceof Element && pred(eventtarget)\n      );\n\n    if (someElements((el) => el.classList.contains(\"liftoff-close-target\"))) {\n      clickMetric.type = CLICK_METRIC_TYPE_CLOSE;\n    } else if (pointInCTA(e.clientX, e.clientY)) {\n      clickMetric.type = CLICK_METRIC_TYPE_CTA;\n    } else if (\n      someElements((el) => el.classList.contains(\"liftoff-deadzone\"))\n    ) {\n      clickMetric.type = CLICK_METRIC_TYPE_DEADZONE;\n    } else if (someElements((el) => el.id === \"liftoff-close\")) {\n      // NOTE(vsingh): Special/weird case: if we hit liftoff-close but not liftoff-close-target,\n      // consider it a deadzone click. There are just a few pixels around the close button that\n      // trigger this `if` clause.\n      clickMetric.type = CLICK_METRIC_TYPE_DEADZONE;\n    }\n\n    Logger.recordMetricV2(\"click\", clickMetric);\n    this.lastClickMetric = clickMetric;\n  }\n\n  static addEventListeners() {\n    LiftoffMRAID.onViewable(() => {\n      Logger.recordMetricV2(\"first_viewable_ms\", Date.now() - LIFTOFF_START_TS);\n    });\n    LiftoffMRAID.onViewable((e) => {\n      this._autoclickBus.forEach((ac) => ac.emitViewableEvent(e));\n    }, true);\n    LiftoffMRAID.onViewableChange((e) => {\n      this._autoclickBus.forEach((ac) => ac.emitViewableChangeEvent(e));\n    });\n\n    window.addEventListener(\n      \"click\",\n      (e) => {\n        this.onClickCapture(e);\n        if (this._lastChanceEndscreenAutoclick) {\n          this._lastChanceEndscreenAutoclick.disable();\n        }\n      },\n      true\n    );\n  }\n\n  static onLoadCompleted() {\n    // NOTE(oscar): We log the initial dimensions immediately in case no \"resize\" event triggers.\n    this.windowResizeLogger.logInitialDims();\n  }\n\n  static onFirstLayoutFinished() {\n    Logger.recordMetricV2(\"load_time_ms\", Date.now() - LIFTOFF_START_TS);\n    this._autoclickBus.forEach((ac) => ac.emitHtmlLoadedEvent());\n  }\n\n  static getLetterboxConfig() {\n    return new LetterboxConfig(this.snippetEl);\n  }\n\n  static resolveAsset(assetType, assetID) {\n    const asset = this.assets[`${assetType}s`][assetID];\n    if (asset == null) {\n      throw new Error(`${assetType}: ${assetID} not found`);\n    }\n\n    switch (assetType) {\n      // NOTE(oscar): By default, we should assume only 1 asset URL per original will be passed to the markup.\n      // Occasionally, we will test how we serve our assets, which may entail providing more than 1 version to\n      // be selected here.\n\n      // The common structure for an original asset is as follows:\n      /**\n       * {\n       *  \"id\",\n       *  \"asset-versions\": [{ \"public-url\", \"version-id\" }, ...]\n       * }\n       */\n      case \"image_original\":\n        return asset.image_versions[0][\"public-url\"];\n      case \"video_original\":\n        return asset.video_versions[0][\"public-url\"];\n    }\n\n    return asset.url;\n  }\n\n  /**\n   * Enables exclusive format creatives to listen for Madlib interaction events.\n   * Note: This method does not register interaction events for Madlib CSPs.\n   */\n  static addVXInteractionEventListener(cb) {\n    this.vxInteractionListeners.push(cb);\n  }\n}\n\nObject.assign(Liftoff, {\n  Component,\n  DOMUtils,\n  LiftoffMRAID,\n  Logger,\n  Utils,\n});\n\nwindow.Liftoff = Liftoff;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/liftoff.js","import EventListener from \"../frontendlib/event_listener\";\nimport Logger from \"./logger\";\n\nconst overrideMethods = {\n  layout: true,\n  load: true,\n  resize: true,\n  start: true,\n  stop: true,\n  restart: true,\n};\n\nclass Component extends EventListener {\n  static init() {\n    this.registry = {};\n  }\n\n  static register(name, cls) {\n    if (this.registry[name] != null) {\n      throw new Error(`ComponentError: ${name} already registered`);\n    }\n\n    this.assertSubclassed(cls);\n    this.registry[name] = cls;\n  }\n\n  static new(name, config) {\n    const cls = this.registry[name];\n    if (cls == null) {\n      throw new Error(`ComponentError: component \"${name}\" not registered`);\n    }\n\n    return new cls(config);\n  }\n\n  static assertSubclassed(cls) {\n    const methods = Object.getOwnPropertyNames(this.prototype);\n    methods.forEach((method) => {\n      if (overrideMethods[method] !== true) return;\n      if (cls.prototype[method] === this.prototype[method]) {\n        throw new Error(`ComponentError: ${method} must be overridden`);\n      }\n    });\n  }\n\n  constructor(config) {\n    super();\n    this.config = config;\n    this.on({\n      start: () => this.start(),\n      stop: () => this.stop(),\n      restart: () => this.restart(),\n    });\n  }\n\n  error(err) {\n    this.emit(\"error\", `${this.constructor.name}Error: ${err}`);\n  }\n\n  // The layout method should prepare the component to take up a stable size and\n  // position within the DOM.\n  layout(parentNode) {\n    this.parentNode = parentNode;\n  }\n\n  // The load method should load assets. This is intended to capture the time it\n  // takes for the component to be fully visible (all images/videos loaded).\n  load() {}\n\n  resize() {}\n\n  start() {}\n\n  stop() {}\n\n  restart() {}\n\n  recordInteraction() {\n    Logger.recordMetricV2(\"interaction_count\", 1);\n  }\n\n  recordInteractionPromptReached() {\n    Logger.recordMetricV2(\"interaction_prompt_reached_count\", 1);\n    if (\n      window.Liftoff != null &&\n      window.Liftoff.setInteractionPromptReached != null\n    ) {\n      window.Liftoff.setInteractionPromptReached();\n    }\n  }\n}\n\nComponent.init();\n\nexport default Component;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/component.js","/**\n * This config is used for letterboxing Madlib creatives. It works by changing the size\n * of liftoff-layout element (specific to Madlib), and scale it within liftoff-snippet\n * (provided by Liftoff.js).\n *\n * Arguably the better way to implement letterboxing is by controlling the size of\n * liftoff-snippet element based on Madlib configuration (i.e. fixed size or\n * stretchable, in the future), for example, by displaying Madlib creative in\n * an iFrame. If iFrames do not involve performance penalty, it would be\n * preferable since it would be another step to unify Madlib and CSP creatives.\n */\nclass LetterboxConfig {\n  /**\n   * @typedef {Object} Dimensions\n   * @property {number} width - The width of the element.\n   * @property {number} height - The height of the element.\n   */\n\n  /**\n   * @typedef {Object} LetterboxConfigData\n   * @property {Dimensions} viewportSize - The size of the viewport.\n   * @property {Dimensions} bidCreativeSize - The size of the bid creative.\n   * @property {boolean} enable - Indicates if the creative should be letterboxed.\n   * @property {boolean} useDarkRootBackground - Indicates if the root element should use a dark background.\n   * @property {boolean} useLayoutBackground - Indicates if the layout element should use its own light-colored background.\n   */\n\n  constructor(snippetEl) {\n    this.snippetEl = snippetEl;\n\n    /** @type {LetterboxConfigData} */\n    this.config = this.getLetterboxConfig();\n  }\n\n  enabled() {\n    return this.config.enable;\n  }\n\n  useDarkRootBackground() {\n    return this.config.useDarkRootBackground;\n  }\n\n  useLayoutBackground() {\n    return this.config.useLayoutBackground;\n  }\n\n  /**\n   * Choose the appropriate config based on viewport dimensions.\n   * If one orientation's config is missing, default to the other one.\n   */\n  getCreativePreferredOrientation({ width, height }) {\n    return width <= height ? \"portrait\" : \"landscape\";\n  }\n\n  /**\n   * Analyze the viewport and make some decisions about how we will present our\n   * creative content.\n   * @returns {LetterboxConfigData}\n   */\n  getLetterboxConfig() {\n    const dims = (obj) => ({ width: obj.width, height: obj.height });\n\n    const viewportSize = dims(this.snippetEl.getBoundingClientRect());\n    const bidCreativeSize = dims(Liftoff.bidContext);\n\n    const viewportOrientation =\n      viewportSize.width <= viewportSize.height ? \"portrait\" : \"landscape\";\n\n    // We are trying to show a portrait creative in a landscape-size viewport, or a landscape creative\n    // in a portrait-size viewport.\n    const orientationMismatch =\n      viewportOrientation !==\n      this.getCreativePreferredOrientation(bidCreativeSize);\n\n    const isRotated = Liftoff.bidContext.is_interstitial && orientationMismatch;\n\n    const useWhiteBars = isRotated;\n    const useDarkRootBackground = !useWhiteBars;\n    const useLayoutBackground = useDarkRootBackground;\n    const enable = useWhiteBars || isRotated;\n\n    return {\n      viewportSize,\n      bidCreativeSize,\n      enable,\n      useDarkRootBackground,\n      useLayoutBackground,\n    };\n  }\n\n  // Returns the scaling factor necessary to scale `contentSize` up to `viewportSize`\n  // whilst maintaining the aspect ratio of the content.\n  preserveAspectRatioScalingFactor(contentSize, viewportSize) {\n    if (\n      contentSize.height * viewportSize.width <=\n      viewportSize.height * contentSize.width\n    ) {\n      return viewportSize.width / contentSize.width;\n    } else {\n      return viewportSize.height / contentSize.height;\n    }\n  }\n\n  // Given a letterbox config, returns information that is useful for laying out the various DOM elements.\n  // Returns an object with the following keys:\n  //   scaleFactor: the scale factor to be applied to the layout element\n  //   rootContainerSize: the width and height in pixels of the layout element\n  //   rootContainerOffset: the x and y coordinates in pixels of the layout element\n  //   rootContainerTransformedArea: expected values in pixels for the x, y, width, and height of the root\n  //     container after scale and rotation are applied\n  getLetterboxLayoutInfo() {\n    const { viewportSize, bidCreativeSize } = this.config;\n\n    const scaleFactor = this.preserveAspectRatioScalingFactor(\n      bidCreativeSize,\n      viewportSize\n    );\n    const rootContainerSize = bidCreativeSize;\n    const rootContainerOffset = {\n      x: (viewportSize.width - rootContainerSize.width) / 2,\n      y: (viewportSize.height - rootContainerSize.height) / 2,\n    };\n\n    const rootContainerScaled = {\n      width: bidCreativeSize.width * scaleFactor,\n      height: bidCreativeSize.height * scaleFactor,\n    };\n    const rootContainerTransformedArea = {\n      x: (viewportSize.width - rootContainerScaled.width) / 2,\n      y: (viewportSize.height - rootContainerScaled.height) / 2,\n      width: rootContainerScaled.width,\n      height: rootContainerScaled.height,\n    };\n\n    return {\n      scaleFactor,\n      rootContainerSize,\n      rootContainerOffset,\n      rootContainerTransformedArea,\n    };\n  }\n\n  getLetterboxConstraintsForMadlibRootElement() {\n    const { scaleFactor, rootContainerSize, rootContainerOffset } =\n      this.getLetterboxLayoutInfo();\n\n    return {\n      rootConstraints: {\n        left: `${rootContainerOffset.x}px`,\n        top: `${rootContainerOffset.y}px`,\n        width: `${rootContainerSize.width}px`,\n        height: `${rootContainerSize.height}px`,\n      },\n      rootPostLayoutTransform: `scale(${scaleFactor})`,\n    };\n  }\n\n  getStyleForClickElement() {\n    const { rootContainerTransformedArea } = this.getLetterboxLayoutInfo();\n    return {\n      left: `${rootContainerTransformedArea.x}px`,\n      top: `${rootContainerTransformedArea.y}px`,\n      width: `${rootContainerTransformedArea.width}px`,\n      height: `${rootContainerTransformedArea.height}px`,\n      right: \"auto\",\n      bottom: \"auto\",\n    };\n  }\n}\n\nexport default LetterboxConfig;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/letterbox_config.js","import Logger from \"./logger\";\nimport { getIn } from \"../frontendlib/utils\";\n\nconst initialScreenAngle = getIn(window, [\"screen\", \"orientation\", \"angle\"]);\n\nconst RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER = 0.1;\n\n/**\n * Logs window resize events to Adexp.\n */\nclass WindowResizeLogger {\n  constructor(snippetEl, enable_logging) {\n    // We log resizes at a lower sampling frequency, because the log messages can be very numerous.\n    this.enableResizeLogging = enable_logging\n      ? Math.random() < RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER\n      : false;\n\n    this.resizeCount = 0;\n    this.resizeLog = [];\n    this.snippetEl = snippetEl;\n\n    window.addEventListener(\"resize\", () => {\n      this.logResizedDims();\n    });\n  }\n\n  _logDims() {\n    if (!this.enableResizeLogging) return;\n    const { width, height } = this.snippetEl.getBoundingClientRect();\n    const data = {\n      height,\n      width,\n      sinceStartMS: Date.now() - LIFTOFF_START_TS,\n      \"screen.orientation.angle\": getIn(window, [\n        \"screen\",\n        \"orientation\",\n        \"angle\",\n      ]),\n      initialScreenAngle,\n      resizeCount: this.resizeCount,\n      // Check support of rotation events.\n      supportsOrientationChange: \"onorientationchange\" in window,\n      supportsDeviceOrientation: \"ondeviceorientation\" in window,\n      \"window.innerWidth\": window.innerWidth,\n      \"window.innerHeight\": window.innerHeight,\n      \"documentElement.clientWidth\":\n        document.documentElement != null &&\n        document.documentElement.clientWidth,\n      \"documentElement.clientHeight\":\n        document.documentElement != null &&\n        document.documentElement.clientHeight,\n    };\n    this.resizeLog = [...this.resizeLog, data];\n    Logger.recordLog(\"resize\", \"resize\", { resizeLog: this.resizeLog });\n  }\n\n  logInitialDims() {\n    this._logDims();\n  }\n\n  logResizedDims() {\n    this.resizeCount += 1;\n    this._logDims();\n  }\n}\n\nexport default WindowResizeLogger;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/window_resize_logger.js"],"sourceRoot":""}