{"status":"OK","geo":"US","deviceDetected":1,"fiViewerId":"bd9acacc7c6d702e6bd7f8ff357ee33e","pageViewUniqueId":115995803067997,"datasource":"LIVE","options":{"cmp_enableintegration":true,"amp":{"initialMinSpacing":0.9,"initialMinSpacingUnits":"vp"},"hb_analytics":true,"has_blocked_urls":false,"has_blocked_urls_slashend":"none","has_blocked_urls_withparams":"none","notHotDog":{"enabled":false,"selectors":[]},"siteLang":"en","campaignLimitations":{},"eventTracking":{"trackingDomains":[{"host":"cdn.firstimpression.io","type":"full"}],"trackScroll":1,"trackTimeOnPage":1,"probability":12,"cookiename":"fitracking"},"prependScript":"if( (new Date() - new Date(FI.options.builtOn)) \/ (1000*60*60) > 24 ) {\n    if(!window.fi_reloaded) { window.fi_reloaded=true;\n    \tfetch(\"https:\/\/\" + FI.options.ecdnDomain + \"\/fi_client.js\",  {cache: \"reload\"}).then(()=>{ \t\t\n    \t    clearTimeout(FI.g_clientManager.appendLoopTimeout);\n    \t\tvar body = document.getElementsByTagName(\"head\")[0];\n                newdiv = document.createElement(\"script\");\n    \t\t    newdiv.setAttribute(\"type\", \"text\/javascript\");\n    \t\t    newdiv.setAttribute(\"src\", \"https:\/\/\" + FI.options.ecdnDomain + \"\/fi_client.js\");    \n    \t    delete FI; delete fipb; delete fiQuery;\n    \t    body.appendChild(newdiv);\n    \t\tthrow (\"Cache problem!\");\n    \t});\n    \treturn;\n    }\n}\n\/*{trackingcode|cookiename:fitracking}*\/\n\nfiQuery(window).on('SPCReturned', function () {\n    FI.state.utils = fiUtils = {\n        getPlacementsPerCond: function (...cond) {\n            var count = 0;\n            return fiQuery.map(FI.g_clientManager.placementQueue, function ($placement) {\n                count = 0;\n                for (let i = 0; i < cond.length; i++) {\n                    if (fiUtils[cond[i].placement]($placement, cond[i].is)) count++;\n                }\n                if (count == cond.length) return [$placement];\n            });\n        },\n        enabledExtraOption: function ($placement, option) {\n            return (typeof $placement.options.extra != 'undefined' && typeof $placement.options.extra[option] != 'undefined' && (typeof $placement.options.extra[option].enabled != 'undefined' && $placement.options.extra[option].enabled || typeof $placement.options.extra[option].enabled == 'undefined'))\n                || (typeof $placement.options[option] != 'undefined' && (typeof $placement.options[option].enabled != 'undefined' && $placement.options[option].enabled || typeof $placement.options[option].enabled == 'undefined'));\n        },\n        enabledExtraValue: function ($placement, optionPathAndValueArr) {\n            let optionVal = optionPathAndValueArr.length - 1,\n                placementOption = typeof $placement.options.extra != 'undefined' ? $placement.options.extra : $placement.options,\n                optionNotFound = false;\n            for (var i = 0; i <= optionPathAndValueArr.length - 2; i++) {\n                if (typeof placementOption[optionPathAndValueArr[i]] != \"undefined\")\n                    placementOption = placementOption[optionPathAndValueArr[i]];\n                else {\n                    optionNotFound = true;\n                    break;\n                }\n            }\n            return !optionNotFound && placementOption == optionVal;\n        },\n        enabledOptionValue: function ($placement, optionPathAndValueArr) {\n            let optionVal = optionPathAndValueArr.length - 1,\n                placementOption = $placement.options,\n                optionNotFound = false;\n            for (var i = 0; i <= optionPathAndValueArr.length - 2; i++) {\n                if (typeof placementOption[optionPathAndValueArr[i]] != \"undefined\")\n                    placementOption = placementOption[optionPathAndValueArr[i]];\n                else {\n                    optionNotFound = true;\n                    break;\n                }\n            }\n            return !optionNotFound && placementOption == optionVal;\n        },\n        multiInstance: function ($placement) {\n            return $placement.options.totalRenderedInstancesLimitation > 1;\n        },\n        type: function ($placement, type) {\n            return $placement.type == type;\n        },\n        pageErrors: [],\n        getAllErrors: function (_module) {\n            let errors = [];\n            for (var i = 0; i < this.pageErrors.length; i++) {\n                if (typeof _module == \"undefined\" || this.pageErrors[i].module == _module) {\n                    this.console(this.pageErrors[i].message, \"Error\", this.pageErrors[i].module);\n                    errors.push(this.pageErrors[i]);\n                }\n            }\n            return errors;\n        },\n        console: function (message, type, _module, placementId, bannerId) {\n            FI.console.log(typeof message != \"undefined\" ? message : \"No message here.. This seems odd\",\n                typeof placementId != \"undefined\" ? placementId : '',\n                typeof bannerId != \"undefined\" ? bannerId : '',\n                typeof type != \"undefined\" ? type : 'Misc',\n                typeof _module != \"undefined\" ? _module : '')\n        },\n        pageError: function (message, _module, placement) {\n            this.pageErrors.push({ \"message\": message, \"module\": _module, \"placement\": placement });\n            this.console(message, \"Error\", _module);\n        },\n        getExtra: function ($placement) {\n            if (typeof $placement == \"object\" && typeof $placement.options != \"undefined\")\n                return typeof $placement.options.extra != \"undefined\" ? $placement.options.extra : $placement.options;\n            else if (typeof $placement == \"number\")\n                return typeof FI.g_clientManager.getPlacement($placement).options.extra != \"undefined\" ? $placement.options.extra : $placement.options;\n            else {\n                fiUtils.pageError(\"Invoking getExtra but providing ${$placement} which is not a number or an object\");\n                return { \"options\": { \"extra\": {} } }\n            }\n        },\n        getWebsiteMacro: function (macro) {\n            return macro.indexOf(\"{\") == -1 ? macro : null;\n        },\n        isLastInstance: function ($instance) {\n            return $instance.instanceId.split('_')[2] == $instance.placement.instances.length - 1;\n        },\n        getInstanceId: function ($instance) {\n            return $instance.instanceId.split(\"_\")[2];\n        },\n        isPlacementOptionEnabled: function ($instance, option) {\n            if (typeof $instance.placement.options.extra != \"undefined\")\n                return typeof $instance.placement.options.extra[option] != \"undefined\" && $instance.placement.options.extra[option][\"enabled\"];\n            return false;\n        },\n        appenndRecorderDiv: function (recorderClass) {\n            if (fiQuery(\"recorder\").length == 0) {\n                fiQuery('body').append(`<div class=recorder ${recorderClass}><\/div>`);\n            } else {\n                fiQuery(\"recorder\").addClass(`${recorderClass}`);\n            }\n        },\n        detectDeviceOrientation: function () {\n            return window.matchMedia(\"(orientation: portrait)\") ? \"portrait\" : \"landscape\";\n        },\n        getManupiliationStateByHighestValuePerPlacementType: function (arr, placementType) {\n            arr = arr.map((state, index, array) => {\n                if (typeof state != \"undefined\") return typeof fiUtils.fixed.manupiliateElementsPerPlacementType[placementType][state.name] != \"undefined\" ? state : '';\n            }).filter(elem => elem != \"\");\n\n            return arr.reduce(function (prev, current) {\n                if (typeof current != \"undefined\") return Math.abs(prev.value) > Math.abs(current.value) ? prev : current;\n                return Math.abs(prev.value);\n            });\n        },\n        setRecorder: function (update) {\n            if (fiQuery(\"div#fi_recorder\").length == 0) fiQuery('body').append('<div id=fi_recorder><\/div>');\n            if (typeof update != 'undefined') fiQuery(\"div#fi_recorder\").addClass(update);\n        },\n        getCreativeIndexByCID: function (creatives, targetCID) {\n            for (let i = 0; i < creatives.length; i++) { if (creatives[i].cid == targetCID) return i; }\n        },\n        fixed: {\n            ManipulationState: function (name, CSSKeyValuePair, selector) {\n                this.name = name;\n                \/\/ Selector not found, let's wait for it\n                if (fiQuery(selector).length == 0) {\n                    this.value = fiUtils.fixed.waitForSelector(selector, this, CSSKeyValuePair);\n                    this.selector = null;\n                    \/\/ We need to pull the value dynamically from the DOM\n                } else if (CSSKeyValuePair.property != null) {\n                    this.selector = selector;\n                    this.value = fiQuery(CSSKeyValuePair.value)[CSSKeyValuePair.property]();\n                    \/\/ Seems selector is found and value is static so let's just move on \n                } else {\n                    this.selector = selector;\n                    this.value = CSSKeyValuePair.value;\n                }\n                this.viewable = false;\n            },\n            placementsToManupiliate: [],\n            manupiliateElementsPerPlacementType: {\n                headerKick: {\n                    hide: function (value) {\n                        fiQuery('div#FIHeaderKickInner').css({ transform: `translateY(${value}px)` });\n                        fiQuery('div#FIHeaderKickAnchor').css({ transform: `translateY(${value}px)` });\n                        fiQuery(fiUtils.getWebsiteMacro(\"{{m:nav_on_scroll}}\")).css({ transform: `translateY(0px)` });\n                    },\n                    show: function (value) {\n                        fiQuery('div#FIHeaderKickInner').css({ transform: `translateY(0px)` });\n                        fiQuery('div#FIHeaderKickAnchor').css({ transform: `translateY(0px)` });\n                        fiQuery(fiUtils.getWebsiteMacro(\"{{m:nav_on_scroll}}\")).css({ transform: `translateY(${fiQuery('div#FIHeaderKickAnchor').height()}px)` });\n                    },\n                    close: function (value) {\n                        FI.console.log(`Resetting all manupiliations on other elements since placement was either closed or reached its end of the waterfall`, ``, ``, `fiUtils.fixed`);\n                    },\n                    navBarPush: function (valie) {\n                        fiQuery('div#FIHeaderKickInner').css({ transform: `translateY(0px)` });\n                        fiQuery('div#FIHeaderKickAnchor').css({ transform: `translateY(0px)` });\n                        fiQuery(fiUtils.getWebsiteMacro(\"{{m:nav_on_scroll}}\")).css({ transform: `translateY(${fiQuery('div#FIHeaderKickAnchor').height()}px)` });\n                    }\n                },\n                bottomsticky: {\n                    hide: function (value) {\n                        fiQuery('div#FIBottomStickyInner').css({ transform: `translateY(${-value}px)` });\n                    },\n                    show: function (value) {\n                        fiQuery('div#FIBottomStickyInner').css({ transform: `translateY(0px)` });\n                    },\n                    cookieNoticePush: function (value) {\n                        fiQuery('div#FIBottomStickyInner').css({ transform: `translateY(${-value}px)` });\n                    },\n                    bottomBarPush: function (value) {\n                        fiQuery('div#FIBottomStickyInner').css({ transform: `translateY(${-value}px)` });\n                    }\n                },\n                outerdocked: {\n                    hide: function (value) {\n                        fiQuery('div.fi-docked').css({ zIndex: `${value}` });\n                        fiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({ transform: `translateY(0px)` });\n                    },\n                    show: function (value) {\n                        fiQuery('div.fi-docked').css({ zIndex: 99998 });\n                        fiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({ transform: `translateY(${value}px)` });\n                    },\n                    navBarPush: function (value) {\n                        fiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({ zIndex: 99998 });\n                        fiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({ transform: `translateY(${value}px)` });\n                    }\n                },\n                docked: {\n                    hide: function (value) {\n                        fiQuery('div.fi-docked').css({ zIndex: `${value}` });\n                        fiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({ transform: `translateY(0px)` });\n                    },\n                    show: function (value) {\n                        fiQuery('div.fi-docked').css({ zIndex: 99998 });\n                        fiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({ transform: `translateY(${value}px)` });\n                    },\n                    navBarPush: function (value) {\n                        fiQuery('div.fi-docked').css({ zIndex: 99998 });\n                        fiQuery('div.FIOnDemandWrapper.fi-docked[style*=\"position: fixed;\"]:not([style*=\"overflow: hidden;\"]').css({ transform: `translateY(${value}px)` });\n                    }\n                },\n                hybridDocked: {\n                    initStaticStateFailSafeStyle: function () {\n                        fiQuery('body').append('<style id=\"fi-translateY-control\"> .fi-detachable-hybriddocked[style*=\"static\"] { transform: translateY(0px) !important; } <\/style>');\n                        return true;\n                    },\n                    hide: function (value) {\n                        if (fiQuery('#fi-translateY-control').length == 0) fiUtils.fixed.manupiliateElementsPerPlacementType.hybridDocked.initStaticStateFailSafeStyle();\n                        fiQuery('.fi-detachable-hybriddocked-stripe').css({ transform: `translateY(${value}px)`, transition: `all 0.1s` });\n                        fiQuery('.fi-detachable-hybriddocked.apd_docked').css({ transform: `translateY(${value}px)`, transition: `all 0.1s` });\n                    },\n                    navBarPush: function (value) {\n                        if (fiQuery('#fi-translateY-control').length == 0) fiUtils.fixed.manupiliateElementsPerPlacementType.hybridDocked.initStaticStateFailSafeStyle();\n                        fiQuery('.fi-detachable-hybriddocked-stripe').css({ transform: `translateY(${value}px)`, transition: `all 0.1s` });\n                        fiQuery('.fi-detachable-hybriddocked.apd_docked').css({ transform: `translateY(${value}px)`, transition: `all 0.1s` });\n                    },\n                    show: function (value) {\n                        if (fiQuery('#fi-translateY-control').length == 0) fiUtils.fixed.manupiliateElementsPerPlacementType.hybridDocked.initStaticStateFailSafeStyle();\n                        fiQuery('.fi-detachable-hybriddocked.apd_docked').css({ transform: `translateY(${value}px)`, transition: `all 0.1s` });\n                        fiQuery('.fi-detachable-hybriddocked-stripe').css({ transform: `translateY(${value}px)`, transition: `all 0.1s` });\n                    }\n                }\n            },\n            waitForSelector: function (selector, state, CSSKeyValuePair) {\n                FI.awaitFor(() => fiQuery(selector).length > 0)\n                    .then(() => {\n                        state.selector = selector;\n                        if (CSSKeyValuePair.property != null) state.value = fiQuery(CSSKeyValuePair.value)[CSSKeyValuePair.property]();\n                        else\n                            state.value = CSSKeyValuePair.value;\n                    });\n            },\n            observedManupilationArray: [],\n            trakcedManipulationStatesArray: [],\n            pushObservedManupilationArray: function (name, value, selector) {\n                if (fiUtils.getWebsiteMacro(selector) != null)\n                    fiUtils.fixed.observedManupilationArray.push(new fiUtils.fixed.ManipulationState(name, value, selector));\n            },\n            resetElementViewability: function (initManupilation) {\n                fiUtils.fixed.observedManupilationArray.forEach((element, index, arr) => {\n                    if (element.viewable && fiQuery(element.selector).length == 0) element.viewable = false;\n                });\n                for (var i = 0; i < fiUtils.fixed.trakcedManipulationStatesArray.length; i++) {\n                    if (!fiUtils.fixed.trakcedManipulationStatesArray[i].viewable) {\n                        fiUtils.fixed.trakcedManipulationStatesArray.splice(i, 1);\n                    }\n                }\n                if (fiUtils.fixed.trakcedManipulationStatesArray.length > 0) {\n                    fiUtils.fixed.manupilateThis(fiUtils.fixed.trakcedManipulationStatesArray, initManupilation);\n                }\n            },\n            isFixedState: function () {\n                return fiQuery('div.apd_docked').length > 0 || fiQuery('div#FIHeaderKickInner').length > 0 || fiQuery('div#FIBottomStickyInner').length > 0 || fiQuery('div.FIOnDemandWrapper > div.fi-docked').length > 0;\n            },\n            shouldWeManupiliate: function (arr, initManupilation) {\n                if (fiUtils.fixed.isFixedState()) {\n                    let changedObservedManupilationArray = arr.filter((element, index, array) => fiQuery(element.selector).length > 0 && !element.viewable ? element : '');\n                    if (changedObservedManupilationArray.length == 0 && fiUtils.fixed.trakcedManipulationStatesArray.length > 0) fiUtils.fixed.resetElementViewability(initManupilation);\n                    if (changedObservedManupilationArray.length > 0) {\n                        changedObservedManupilationArray.forEach((manupliationState) => fiUtils.fixed.trakcedManipulationStatesArray.push(manupliationState));\n                        for (var i = 0; i < changedObservedManupilationArray.length; i++) {\n                            for (var j = 0; j < fiUtils.fixed.observedManupilationArray.length; j++) {\n                                if (changedObservedManupilationArray[i].name == fiUtils.fixed.observedManupilationArray[j].name) {\n                                    fiUtils.fixed.observedManupilationArray[j].viewable = true;\n                                    FI.console.log(`${fiUtils.fixed.observedManupilationArray[j].name} is in view!`, ``, ``, `fiUtils.fixed`);\n                                    return true;\n                                }\n                            }\n                        }\n                    }\n                    return false;\n                }\n                return false;\n            },\n            manageManupiliations: function (arr, initManupilation) {\n                if (typeof initManupilation != \"function\") {\n                    FI.console.log(`ERROR: You provided an init manupilate but its not a function. This won't work`, ``, ``, `fiUtils.fixed`)\n                    return;\n                }\n                FI.awaitFor(() => fiUtils.fixed.shouldWeManupiliate(arr, initManupilation))\n                    .then(() => {\n                        fiUtils.fixed.manupilateThis(fiUtils.fixed.trakcedManipulationStatesArray, initManupilation);\n                        \/\/Re-init\n                        fiUtils.fixed.manageManupiliations(arr, initManupilation);\n                    });\n            },\n            manupilateThis(arr, initManupilation) {\n                fiUtils.fixed.placementsToManupiliate.forEach(($placement) => initManupilation(fiUtils.getManupiliationStateByHighestValuePerPlacementType(arr, $placement.type).value, $placement.type, fiUtils.getManupiliationStateByHighestValuePerPlacementType(arr, $placement.type).name));\n            }\n        },\n        getEnabledExtraOption: function ($placement, values, ...keysArr) {\n            let res = [];\n            if (Array.isArray(values) && typeof $placement.options.extra[values[j]] != \"undefined\" && typeof $placement.options.extra[values[j]][keysArr[i]] != \"undefined\") {\n                for (var i = 0; i < keysArr.length; i++) {\n                    for (var j = 0; j < values.length; j++) {\n                        res.push($placement.options.extra[values[j]][keysArr[i]]);\n                    }\n                }\n            }\n            if (res.length == keysArr.length) return res;\n\n            return null;\n        },\n        getOptions: function ($placement, ...options) {\n            return $placement.options[options];\n        },\n        getMoreEnabledExtraOptions: function (placementsArr, ...options) {\n            let placementsLength = 0;\n            options.forEach((option) => {\n                placementsLength += placementsArr.filter(($placement) => typeof $placement.options.extra[option] != \"undefined\" && $placement.options.extra[option].enabled).length\n            });\n            return placementsLength == options.length;\n        },\n        setPlacementOption: function ($placement, option, value) {\n            $placement.options[option] = value;\n        },\n        requireUtilFunctions: (module, ...functions) => functions.filter(func => typeof fiUtils[func] != 'function') > 0 ? fiUtils.console(`Your are missing some functions from the fiUtils in order to successfully use ${module} module`, `error`, module) : true,\n        getHBContainerIndex: (placementId) => FI.g_clientManager.placementQueue[placementId].creatives.findIndex(ele => ele.cid == -1),\n        getNoneHBCreativeIndexByCampaignId: (placementId, campaignId) => FI.g_clientManager.placementQueue[placementId].creatives.findIndex(creative => creative.cid == campaignId),\n        getHBCreativeInnerContainerIndexByCampainId: (placementId, campaignId) => FI.g_clientManager.placementQueue[placementId].creatives[fiUtils.getHBContainerIndex(placementId)].innerCreatives.findIndex(creative => creative.cid == campaignId),\n        getEventTypeFromEventObj: (e) => typeof e != \"undefined\" ? e.type : null,\n        removeBannerFromQueueByCampaignId: function (placementId, campaignId, isHB, e) {\n            if (fiUtils.getEventTypeFromEventObj(e) == 'SPCReturned') {\n                let noCreativeFoundLogMsg = `No matching creatives found for campaignId ${campaignId}! Maybe you forgot to set isHB? isHB value is ${isHB}`;\n\n                if (isHB && fiUtils.getHBContainerIndex(placementId) != -1) {\n                    FI.g_clientManager.placementQueue[placementId].creatives[fiUtils.getHBContainerIndex(placementId)].innerCreatives.splice(fiUtils.getHBCreativeInnerContainerIndexByCampainId(placementId, campaignId), 1);\n                    \/\/ if (FI.g_clientManager.placementQueue[placementId].creatives.length == 0)\n                    return;\n                } else if (fiUtils.getNoneHBCreativeIndexByCampaignId(placementId, campaignId) != -1) {\n                    FI.g_clientManager.placementQueue[placementId].creatives.splice(fiUtils.getNoneHBCreativeIndexByCampaignId(placementId, campaignId), 1);\n                    return;\n                }\n                fiUtils.console(noCreativeFoundLogMsg, `Warning`, `demandCapping`, placementId);\n                return;\n            } else\n                return fiUtils.console(`You either didn't specify the event or you called this method from another event which isn't SPCReturned. event found is ${typeof e != \"undefined\" ? e.type : e}`, `Error`, `demandCapping`, placementId);\n        },\n        removeCampaignFromQueueByCampaignId: (placementId, campaignId, isHB, e) => {\n            if (fiUtils.getEventTypeFromEventObj(e) == 'SPCReturned') {\n                let hbCreative = FI.g_clientManager.placementQueue[placementId].creatives[fiUtils.getHBContainerIndex(placementId)].innerCreatives[fiUtils.getHBCreativeInnerContainerIndexByCampainId(placementId, campaignId)];\n                if (isHB && typeof hbCreative != \"undefined\") return;\n                if ((isHB && hbCreative.cid != -1) || fiUtils.getNoneHBCreativeIndexByCampaignId(placementId, campaignId) != -1) {\n                    fiUtils.removeBannerFromQueueByCampaignId(placementId, campaignId, isHB, e);\n                    fiUtils.removeCampaignFromQueueByCampaignId(placementId, campaignId, isHB, e);\n                }\n                return;\n            } else\n                return fiUtils.console(`You either didn't specify the event or you called this method from another event which isn't SPCReturned. event found is ${typeof e != \"undefined\" ? e.type : e}`, `Error`, `demandCapping`, placementId);\n        },\n        getDaysDiff: (storageDate, currentDate) => {\n            if (storageDate != null && currentDate != null) {\n                var oneDay = 24 * 60 * 60 * 1000,\n                    firstDate = new Date(currentDate),\n                    secondDate = new Date(storageDate),\n                    diffDays = Math.round(Math.abs((firstDate - secondDate) \/ oneDay));\n\n                return diffDays;\n            }\n            return;\n        },\n        requiredExtraOptionProperties: (validationKeysArr, testedObject) => {\n            for (var key of validationKeysArr) {\n                if (!testedObject.hasOwnProperty(key)) return false;\n            }\n            return true;\n        },\n        isInstanceHadPassBackAfterSetVisible: ($instance, moduleName) => {\n            if (typeof FI.g_clientManager.trackingManager.history[$instance.instanceId].PassbackAfterSetVisible != \"undefined\") {\n                fiUtils.console(`PassbackAfterSetVisible received for placement ${$instance.placement.id} this will reset the counter!`, 'message', moduleName, $instance.placement.id);\n                return true;\n            }\n            return false;\n        },\n\t    batchedFor : (array, promiseLogic) => {\n\t        const sendBatch = (batchStart, batchEnd) => { \n\t            new Promise(resolve => {\n\t                for (var i = batchStart; i < batchEnd; i++) {\n\t                    promiseLogic(array, i, batchEnd);\n\t                }\n\t                resolve();\n\t            });\n\t        };\n\t        let length = array.length;\n\t        let batchEnd = 10;\n\t        for (let batchStart = 0, p = Promise.resolve(); batchStart < length; batchStart += 10) {\n\t            p = p.then(() => {\n\t                if (batchEnd + 10 > length) batchEnd = length;\n\t                sendBatch(batchStart, batchEnd);\n\t            })\n\t            .then(() => {\n\t                batchStart = batchEnd;\n\t            })\n\t            .then(() => {\n\t                batchEnd += 10;\n\t            });\n\t        }\n\t    },\n\t    typeExtention : {\n\t        inview: {\n\t            addInstance: ($placement, e) => {\n\t                $placement.stoppedSearch = false;\n\t                if (e.type == 'instanceSetVisibleComplete') $placement.options.placementLimitation++;\n\t                $placement.instances.forEach(instance => {\n\t                    if (! instance.demandFound && ! instance.hidden) instance.setStatus(\"tryLaterInit\");\n\t                });\n\t            }\n\t        }\n\t    },\n\t    getPropertyValueByModule: ($placement, moduleName, property, type, defaultValue = null, required = false) => {\n\t        if (typeof type == 'undefined') fiUtils.pageError('You are requesting a config without a type, this is not allowed', moduleName);\n\t        const res = fiUtils.getExtra($placement)[moduleName][property];\n\t        if (typeof res == 'undefined' && required) fiUtils.pageError(`You've failed to provide the required config ${property}, the module will not run or lead to unexpected resutls`, moduleName);\n\t        if (typeof res != 'undefined' && typeof res != type) fiUtils.pageError(`You've provided ${property} in the type ${typeof property} but it was expected to be ${type}`, moduleName);\n\t        return typeof res != 'undefined' ? res : defaultValue; \n\t    },\n\t    getPlacementConfigByModule: ($placement, moduleName, propertiesObjects) => {\n\t        let config = {};\n\t        for (let propertiesObject of propertiesObjects) {\n\t            config[propertiesObject.prop] = fiUtils.getPropertyValueByModule($placement, moduleName, propertiesObject.prop, propertiesObject.type, propertiesObject.default, propertiesObject.required);\n\t        }\n\t        return config;\n\t    },\n\t    filterElementsInArr : (arr, condition) => {\n\t        return arr.filter((element) => {\n\t            return fiQuery(element.element).filter(condition).length > 0\n\t        })\n\t    },\n        setPlacementRenderLimit : ($placement, limit) => {\n            $placement.options.placementLimitation = limit;\n        }\n    };\n\n\tif (localStorage.apdAdmin == 1) {\n\t    Object.keys(fiUtils).forEach((utilFunc) => {\n\t        if (typeof fiUtils[utilFunc] == \"function\" && utilFunc.indexOf(\"error\") == -1 && FI.options.prependScript.indexOf(`${utilFunc}(`) == -1)\n\t            fiUtils.pageErrors.push({ \"message\": `The fiUtils function ${utilFunc} seems not to be in use in the website prepend`, \"module\": `fiUtils` });\n\t    });\n\t}\n});\nfiQuery(window).on('SPCReturned',function(){\n\tfiQuery('body').append('<div id=\"fi_versionTester\" style=\"width:100%;height:0;position:fixed;pointer-events:none;\"><\/div>');\n\tFI.state.versionTester = fiQuery('div#fi_versionTester').width();\n\tfiQuery('div#fi_versionTester').remove();\n});\n\n\/\/ 30sec refresh test for sticky footers 10\/7\/2018\nfiQuery(window).on('SPCReturned', function(){\n\tFI.state.refreshPlacementCreative = function(placementId,instanceId,bannerId,intervalTime){\n\t\t if (FI.g_clientManager.placementQueue[placementId].instances[0].creative.id == bannerId && !FI.g_clientManager.placementQueue[placementId].instances[0].hidden) {\n\t\t  FI.g_clientManager.getInstance(instanceId).renderCreative();\t\n\t\t  setTimeout(function() {\n\t\t  \tFI.state.refreshPlacementCreative(placementId,instanceId,bannerId,intervalTime); \n\t\t  }, intervalTime); \n\t\t} \n\t} \n});\n\n\/\/WAIT ON\nfiQuery(window).on('SPCReturned', function(){\n    \/\/ Wait on functionality - v 1.1.0 10\/8\/2020\n    FI.state.waitOnManager = $waitOn = {};\n    $waitOn.placementsWaitingOnOtherPlacementsResolutionArray = fiUtils.getPlacementsPerCond({placement: \"enabledExtraOption\", is: \"waitOn\"})\n\n    if ($waitOn.placementsWaitingOnOtherPlacementsResolutionArray.length > 0) {\n        \/\/ Expand the wait on object\n        Object.assign($waitOn, {\n            convertWaitOnObjectToType : function(waitOnObject) {\n               if (! isNaN(waitOnObject))\n                    if (waitOnObject.toString().split('').length == 4) return 'sequenceId';\n                    else return 'placementId';\n                if (waitOnObject.indexOf(\"{\") != -1 && waitOnObject.indexOf(\",\") == -1) {\n                \ttry {\n                \t\tJSON.parse(waitOnObject);\n                \t\treturn 'placementCustomOption';\n                \t} catch(e) {\n                \t\tif (waitOnObject.indexOf(\"}\") == -1)\n                \t\t\tFI.console.log(`Placement #${placementId} seems to be waiting to a custom placement option however it cannot be parsed to a JS object. Make sure to use \\\" and not \"\" or '', also validate that you use proper JSON syntax and both { and }.`, waitingPlacement.id, ``, `Wait on`);\n                \t\telse {\n                \t\t\treturn 'placementCustomOptionKeyOnly';\n                \t\t}\n                \t}\n                }\n                let checkIfSize = waitOnObject.split('x');\n                if (! isNaN(checkIfSize[0]) && ! isNaN(checkIfSize[1])) return 'placementSize';\n                if (typeof waitOnObject == 'string') return 'placementType';\n                return 'error';\n            },\n            removeWaitOnPlacementIdFromWaitOnArray : function(placementId, waitOnArray, waitingPlacement) {\n            \t\/\/ Remove resolved placement from wait on array\n                if (waitOnArray.indexOf(placementId.toString()) != -1) {\n                    waitOnArray.splice(waitOnArray.indexOf(placementId.toString()), 1);\n                    FI.console.log(`Placement #${placementId} has been resolved and cleared from #${waitingPlacement.id} wait on array. ${ (waitOnArray.length == 0 ? `This was the last placement in the wait on array` : `It is now only waiting for the following placements: ${waitOnArray}`) }`, waitingPlacement.id, ``, `Wait on`);\n                }\n                \/\/ Remove all placement in sequence of removed placement\n            \t\/\/ Make sure resolution was placement rendered other wise another placement in the sequence may render\n                if (typeof FI.g_clientManager.placementQueue[placementId].sequence != 'undefined' && fiQuery(`div[id^=FIOnDemandWrapper_fiInstance_${placementId}]`).length) {\n                \tlet sequenceId = FI.g_clientManager.placementQueue[placementId].sequence.id;\n                \tfiQuery.each(FI.g_clientManager.placementQueue, function(anotherPlacementId, anotherPalcement) {\n                \t\tif (typeof FI.g_clientManager.placementQueue[anotherPlacementId].sequence != 'undefined' && FI.g_clientManager.placementQueue[anotherPlacementId].sequence.id == sequenceId && waitOnArray.indexOf(anotherPlacementId.toString()) != -1) {\n                \t\t\t\twaitOnArray.splice(waitOnArray.indexOf(anotherPlacementId.toString()), 1);\n                    \t\t\tFI.console.log(`Placement #${anotherPlacementId} has been resolved since placement ${placementId} has rendered and is in it's sequence has rendered.  It was cleared from #${waitingPlacement.id} wait on array. ${ (waitOnArray.length == 0 ? `This was the last placement in the wait on array` : `It is now only waiting for the following placements: ${waitOnArray}`) }`, waitingPlacement.id, ``, `Wait on`);\n                    \t\t}\n                \t});\n                }\n               \t\/\/ Release the waiting placement if no placement remian to wait on\n                if (waitOnArray.length == 0) {\n                    if (fiQuery('div#fi-wait-on-recorder').length == 0) {\n                        FI.console.log(`Something seems to be wrong since I want to update div#fi-wait-on-recorder but it's missing. I'll add a new one...`, waitingPlacement.id, ``, `Wait on`);\n                        fiQuery('body').append('<div id=fi-wait-on-recorder><\/div>');\n                    }\n                    fiQuery('div#fi-wait-on-recorder').addClass('wo-resolved_' + waitingPlacement.id);\n                    FI.console.log(`Placement #${waitingPlacement.id} is no longer waiting for any placements to be resolved and should continue rendering.`, waitingPlacement.id, ``, `Wait on`);\n                }\n            },\n            getPlacementIdsPerWaitOnObject : function(waitOnObject, waitOnArray, waitingPlacement) {\n                \/\/ Check each entries type : placement id, placement type, placement size, custom option\n                switch (FI.state.waitOnManager.convertWaitOnObjectToType(waitOnObject)) {\n                    case 'placementId':\n                        if (typeof FI.g_clientManager.placementQueue[waitOnObject] != 'undefined' && waitOnArray.indexOf(waitOnObject) == -1) {\n                            FI.console.log(`\"${waitOnObject}\" has been identified as a \"placementId\" and pointed to the following placement: ${waitOnObject.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                            return waitOnObject;\n                        }\n                        break;\n                    case 'sequenceId':\n                        var placementIds = [];\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (placement.sequence && placement.sequence.id == waitOnObject)\n                                placementIds.push(placementId.toString());\n                        });\n                        if (placementIds.length == 0)\n                            FI.console.log(`\"${waitOnObject}\" seems to point to no placements. No placement has been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        else\n                            FI.console.log(`\"${waitOnObject}\" has been identified as a \"sequenceId\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                        break;\n                    case 'placementType':\n                        var placementIds = [];\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (placement.type == waitOnObject)\n                                placementIds.push(placementId.toString());\n                        });\n                        FI.console.log(`\"${waitOnObject}\" has been identified as a \"placementType\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                        break;\n                    case 'placementSize':\n                        var placementSizeInXY = waitOnObject.split('x'),\n                            placementIds = [];\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (placementId.width == placementSizeInXY[0] && placementId.height == placementSizeInXY[1])\n                                placementIds.push(placementId.toString());\n                        });\n                        if (placementIds.length == 0)\n                            FI.console.log(`\"${waitOnObject}\" seems to point to no placements. No placement has been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        else\n                            FI.console.log(`\"${waitOnObject}\" has been identified as a \"placementSize\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                        break;\n                    case 'placementCustomOptionKeyOnly':\n                        var placementIds = [],\n                        \tparsedWaitOnObj = waitOnObject.replace(\"{\",\"\").replace(\"}\",\"\");\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (typeof fiUtils.getExtra(placement)[parsedWaitOnObj] != 'undefined')\n                                placementIds.push(placementId.toString());\n                        });\n                        if (placementIds.length == 0)\n                            FI.console.log(`\"${waitOnObject}\" seems to point to no placements. No placement has been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        else\n                            FI.console.log(`\"${waitOnObject}\" has been identified as a \"placementCustomOptionKeyOnly\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                    \tbreak;\n                    case 'placementCustomOption':\n                        var placementIds = [],\n                        \twaitOnObject = JSON.parse(waitOnObject);\n                        fiQuery.each(FI.g_clientManager.placementQueue, function(placementId, placement) {\n                            if (typeof fiUtils.getExtra(placement)[Object.keys(waitOnObject)[0]] != 'undefined' && fiUtils.getExtra(placement)[Object.keys(waitOnObject)[0]] == waitOnObject[Object.keys(waitOnObject)[0]])\n                                placementIds.push(placementId.toString());\n                        });\n                        if (placementIds.length == 0)\n                            FI.console.log(`\"{ ${Object.keys(waitOnObject)[0]} : ${waitOnObject[Object.keys(waitOnObject)[0]]} }\" seems to point to no placements. No placement has been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        else\n                            FI.console.log(`\"{ ${Object.keys(waitOnObject)[0]} : ${waitOnObject[Object.keys(waitOnObject)[0]]} }\" has been identified as a \"placementCustomOption\" and pointed to the following placements: ${placementIds.toString()}. These have been added to #${waitingPlacement.id} wait on array`, waitingPlacement.id, ``, `Wait on`);\n                        return placementIds;\n                        break;\n                    case 'error':\n                    default:\n                        FI.console.log(`You have specified a waitOn request on placement #${waitingPlacement.id} which cannot be evaluate to any type, i.e. it is not a placement id, type, size or custom option.`, waitingPlacement.id, ``, `Wait on`);\n                        break;\n                }\n            }\n        });\n\n        \/\/ Setup the div recorder to alert on wait on resolved\n        if (fiQuery('div#fi-wait-on-recorder').length == 0)\n            fiQuery('body').append('<div id=fi-wait-on-recorder><\/div>');\n\n        \/\/ Setup the event handlers\n        fiQuery.each($waitOn.placementsWaitingOnOtherPlacementsResolutionArray, function(placementId, waitingPlacement) {\n            var $waitOn = FI.state.waitOnManager;\n            \/\/ What if we are waiting for more then one placement...\n            let waitOnObjectsArray = fiUtils.getExtra(waitingPlacement).waitOn.toString().split(','),\n                waitOnArray = [];\n            \/\/ Populate the waitOnArray per placement\n            fiQuery.each(waitOnObjectsArray, function(i, waitOnObject) {\n                waitOnArray.push($waitOn.getPlacementIdsPerWaitOnObject(waitOnObject, waitOnArray, waitingPlacement));\n            });\n            \/\/ Remove all depth from array\n            waitOnArray = waitOnArray.flat();\n\t\t\t\/\/ Remove all duplicate values\n\t\t\twaitOnArray = waitOnArray.filter((value, index, self) => self.indexOf(value) === index && typeof value != 'undefined');\n            if (waitOnArray.length) {\n            \tfiUtils.getExtra(waitingPlacement).waitOn.compiledWaitOnPlacementsArray = waitOnArray;\n            \tFI.console.log(`Placement #${waitingPlacement.id} will be waiting for the following placements to be resolved: ${waitOnArray}`, waitingPlacement.id, ``, `Wait on`);\n            } else {\n            \tFI.console.log(`Placement #${waitingPlacement.id} seems to wait for no placements so here it goes...`, waitingPlacement.id, ``, `Wait on`);\n            \tfiQuery('div#fi-wait-on-recorder').addClass('wo-resolved_' + waitingPlacement.id);\n            }\n            \/\/ Set events on top of the wait on array\n            fiQuery.each(waitOnArray, function() {\n           \t\tfiQuery(window).on('manualyRemovePlacementFromWaitOn', function(e, data) {\n                    if (waitOnArray.indexOf(data.placementId.toString()) != -1) {\n                    \tFI.console.log(`Placement #${data.placementId} will be manually removed from the wait on array of ${waitingPlacement.id}. It means it's not suppose to render but it's not hidden`, ``, ``, `Wait on`);\n                        $waitOn.removeWaitOnPlacementIdFromWaitOnArray(data.placementId, waitOnArray, waitingPlacement);\n                    }\n            \t});\n                fiQuery(window).on('instanceSetVisibleComplete', function(e, $instance) {\n                    if (waitOnArray.indexOf($instance.placement.id.toString()) != -1) {\n                        $waitOn.removeWaitOnPlacementIdFromWaitOnArray($instance.placement.id, waitOnArray, waitingPlacement);\n                    }\n                });\n                fiQuery(window).on('proceededToNextInSequence', function(e, $placement){\n                    if (waitOnArray.indexOf($placement.id.toString()) != -1) {\n                        $waitOn.removeWaitOnPlacementIdFromWaitOnArray($placement.id, waitOnArray, waitingPlacement);\n                    }\n                });\n            });\n        });\n    }\n});\n\n\nFI.common.infra.importJS('\/\/tag.escalated.io\/?i=KxxajmhPPCsT&d=www.carcomplaints.com&type=display&cust=5890&sid=direct&c=&cust2=direct');"},"sessionTracking":true,"GDPRApplies":false,"USnatApplies":true,"USstatesApplies":false,"cmp_enforce":null,"incognito":null,"placements":[{"id":115812,"width":1,"height":1,"event":"load","type":"static","selectorType":"css","selector":"body","options":{"extra":{"template":114579},"outerClasses":null,"position_dom":"firstChild","morestylesJSON":[],"position_align":"center","validationScript":"","onDemandPlacement":{"timeoutAction":"show","passbackTimeout":1800,"countImpressionIfNoDemand":true,"waterfall":[{"bannerId":105151}]},"innerMorestylesJSON":[],"placementLimitation":1,"instanceValidationSelector":"","validationSelectorCheckOnce":0,"totalRenderedInstancesLimitation":1},"creatives":[{"id":105151,"cid":446,"requestLimitation":1,"foreignid":"","width":1,"height":1,"timeoutAction":"show","passbackTimeout":1800,"countImpressionIfNoDemand":1,"contentType":"html","bannerContent":"<div><\/div>","trackBiddingParams":1}],"prepend":"<script domsafe>\n    FI.state.multiDocked = $multiDocked = {\n        targetPlacements: fiUtils.getPlacementsPerCond({ placement: \"enabledExtraOption\", is: \"multiDocked\" }),\n        setOuterInlinesAllowedValues: { \"first\": true, \"number\": true },\n        defaultValuesObject: {},\n        module_name: `multiDocked`\n    }\n    if ($multiDocked.targetPlacements.length == 0) fiUtils.console(`There are no multi vertical placements on this page`, `message`, $multiDocked.module_name);\n    else {\n        Object.assign($multiDocked, {\n            adjustDistance: (distance) => {\n                if (distance < 6) return { distance: distance * {viewport_height}, msg: `Setting distance between instances to ${distance} viewport_height` };\n                return { distance: distance, msg: `Setting distance between instances to ${distance}px` };\n            },\n            calculateContainerHeight: ($placement, distanceBetweenInstances, instanceId) => {\n                let initialHeight = (instanceId - 1) % fiUtils.getExtra($placement).multiDocked.setEveryNthInstanceAsInline == 0 ? $placement.height : $placement.height + distanceBetweenInstances;\n                let instancesCount = $multiDocked.calculateInstancesCount($placement);\n                let accumlativeHeight = 0;\n                fiQuery(`.multi-docked-container_${$placement.id}`).each(function () {\n                    accumlativeHeight += fiQuery(this).height();\n                });\n                if (instanceId + 1 < instancesCount) return initialHeight;\n                else if ($placement.options.bottomElement != \"\") return fiQuery($placement.options.bottomElement).offset().top - (accumlativeHeight + $multiDocked.setTop(fiUtils.getExtra($placement).multiDocked, $placement));\n                else if (instancesCount == 1) return fiQuery(\"body\").height() - $multiDocked.setTop(fiUtils.getExtra($placement).multiDocked, $placement);\n                else return fiQuery(\"body\").height() - initialHeight - $multiDocked.setTop(fiUtils.getExtra($placement).multiDocked, $placement);\n            },\n            checkAvailSpace: (mdconfig, placementId, placementWidth) => {\n                let left = 0;\n                if (typeof mdconfig.staticPosition.left == \"number\") left = mdconfig.staticPosition.left;\n                if (typeof mdconfig.staticPosition.left == \"string\") left = fiQuery(mdconfig.staticPosition.left).offset().left;\n                if (typeof mdconfig.staticPosition.right == \"number\") left = mdconfig.staticPosition.right;\n                if (typeof mdconfig.staticPosition.right == \"string\") left = fiQuery(mdconfig.staticPosition.right).offset().left + fiQuery(mdconfig.staticPosition.right).width();\n                if (left == 0) return true;\n                \/\/ This assumes that left == 0 => center of the screen\n                \/\/ How is this working for you? espcially in the selector scenario?\n                const isAvailSpace = 0 < left && fiQuery(window).width() \/ 2 + left < fiQuery(window).width() - placementWidth\n                    || 0 > left && fiQuery(window).width() \/ 2 - left > placementWidth;\n                if (!isAvailSpace) {\n                    fiUtils.console(`Not enough room for the placement`, placementId, `message`, $multiDocked.module_name);\n                    return false;\n                }\n                return isAvailSpace;\n            },\n            validateOptionalSelectorWithRequire: (config, property) => {\n                return typeof config[property] == 'undefined'\n                    || (typeof config[property].selector != 'undefined'\n                        && typeof typeof config[property].required)\n                    || (typeof config[property].required == 'undefined');\n            },\n            setDefaultValues: ($placement) => {\n                const mdconfig = fiUtils.getExtra($placement).multiDocked;\n                $multiDocked.defaultValuesObject[$placement.id] = {\n                    defaultDistance: typeof mdconfig.distanceBetweenInstances != \"undefined\" ? mdconfig.distanceBetweenInstances : 2 * {viewport_height},\n                    bottomStopSelectorHeight: $placement.options.bottomElement != \"\" ? fiQuery($placement.options.bottomElement).height() : 0,\n                    leftMargin: typeof mdconfig.staticPosition.leftMargin != \"undefined\" ? mdconfig.staticPosition.leftMargin : 0,\n                    bottomStopSelectoroffsetTop: $placement.options.bottomElement != \"\" ? fiQuery($placement.options.bottomElement).offset().top : 0,\n                    selector: typeof mdconfig.staticPosition.selector == \"undefined\" ? \"body\" : mdconfig.staticPosition.selector,\n                    initialOffsetTop: fiQuery(typeof mdconfig.staticPosition.selector == \"undefined\" ? \"body\" : mdconfig.staticPosition.selector).offset().top,\n                    minimalScrollingDistance: 300,\n                    fixedTop: typeof $placement.options.hangingtop != \"undefined\" ? $placement.options.hangingtop : 5\n                }\n                fiUtils.console(`Default values are set for placement ${$placement.id}. Value are in an object ${JSON.stringify($multiDocked.defaultValuesObject[$placement.id])}`, `message`, $multiDocked.module_name);\n            },\n            validateMultiDockedConfig: (mdconfig, placementId) => {\n                if (mdconfig.staticPosition.selector == \"undefined\") {\n                    if (typeof mdconfig.staticPosition.left == 'undefined'\n                        && typeof mdconfig.staticPosition.right == 'undefined') {\n                        fiUtils.console(`You provided a static position selector which is body. However, no right or left preperties were found. You going to have a bad a time....`, placementId, $multiDocked.module_name);\n                        return false;\n                    }\n                    if (typeof mdconfig.staticPosition.left != 'undefined'\n                        && typeof mdconfig.staticPosition.right != 'undefined') {\n                        fiUtils.console(`You provided a static position selector which is body. However, you provided both right and left preperties were found. You going to have a bad a time....`, placementId, $multiDocked.module_name);\n                        return false;\n                    }\n                    if (typeof mdconfig.staticPosition.top == 'undefined') {\n                        fiUtils.console(`You provided a static position selector which is body. However, no top preperty was found. You going to have a bad a time....`, placementId, $multiDocked.module_name);\n                        return false;\n                    }\n                }\n                if (!$multiDocked.validateOptionalSelectorWithRequire(mdconfig, \"verticalalign\")) {\n                    fiUtils.console(`The config provided for verticalalign is not valid. Please make sure that either verticalalign object is undefined or that is string and required is boolean`, placementId, $multiDocked.module_name);\n                    return false;\n                }\n                if (typeof mdconfig.setEveryNthInstanceAsInline != \"undefined\") {\n                    if (!$multiDocked.setOuterInlinesAllowedValues[mdconfig.setEveryNthInstanceAsInline] && !$multiDocked.setOuterInlinesAllowedValues[typeof mdconfig.setEveryNthInstanceAsInline]) {\n                        fiUtils.console(`You didn't specify a valid value for the outer inlines. Allowed values are ${$multiDocked.setOuterInlinesAllowedValues}`, `message`, $multiDocked.module_name)\n                        return false;\n                    }\n\n                }\n                return true;\n            },\n            performChecks: ($placement) => {\n                return $multiDocked.validateMultiDockedConfig(fiUtils.getExtra($placement).multiDocked, $placement.id);\n            },\n            setLeft: (mdconfig, $placement) => {\n                let left = 0,\n                    right = 0;\n                let leftMargin = $multiDocked.defaultValuesObject[$placement.id].leftMargin;\n                if (typeof fiUtils.getExtra($placement).multiDocked.staticPosition.left == \"number\") left = mdconfig.staticPosition.left;\n                if (typeof mdconfig.staticPosition.left == \"string\") return fiQuery(mdconfig.staticPosition.left).offset().left - $placement.width - leftMargin;\n                if (typeof mdconfig.staticPosition.right == \"number\") right = mdconfig.staticPosition.right;\n                if (typeof mdconfig.staticPosition.right == \"string\") return fiQuery(mdconfig.staticPosition.right).offset().left + $placement.width + fiQuery(mdconfig.staticPosition.right).width() + leftMargin;\n                return left != 0 ? left + (fiQuery(window).width() \/ 2 - fiQuery(window).scrollLeft()) : right + (fiQuery(window).width() \/ 2 - fiQuery(window).scrollLeft());\n            },\n            setTop: (mdconfig, $placement) => {\n                return typeof mdconfig.verticalalign != \"undefined\" ? fiQuery(mdconfig.verticalalign.selector).offset().top : typeof mdconfig.staticPosition.top != \"undefined\" ? mdconfig.staticPosition.top : fiQuery($multiDocked.defaultValuesObject[$placement.id].selector).offset().top;\n            },\n            filterNumberOfInstancesPerFooterTop: ($placement, instancesCount, distanceBetweenInstances) => {\n                if ($multiDocked.defaultValuesObject[$placement.id].bottomStopSelectorHeight > 0) {\n                    let bottomStopSelectorHeight = $multiDocked.defaultValuesObject[$placement.id].bottomStopSelectorHeight,\n                        bottomStopSelectoroffsetTop = $multiDocked.defaultValuesObject[$placement.id].bottomStopSelectoroffsetTop;\n                    for (var i = 0; i < instancesCount; i++) {\n                        if (($placement.height + distanceBetweenInstances + bottomStopSelectorHeight) * i > bottomStopSelectoroffsetTop) {\n                            if (bottomStopSelectoroffsetTop - ($placement.height + distanceBetweenInstances) > $placement.height)\n                                return i;\n                            fiUtils.console(`instances count is set to ${instancesCount}. However, some instances are rendering after the bottomstopselector defined. We will render only ${i} instances`, `message`, $multiDocked.module_name);\n                        }\n                    }\n                }\n                return instancesCount;\n            },\n            calculateInstancesCount: ($placement) => {\n                let bodyHeight = fiQuery(\"body\").height(),\n                    defaultDistance = $multiDocked.defaultValuesObject[$placement.id].defaultDistance,\n                    adjustedDistanceObject = $multiDocked.adjustDistance(defaultDistance);\n                distanceBetweenInstances = adjustedDistanceObject.distance;\n                bottomStopSelectorHeight = $multiDocked.defaultValuesObject[$placement.id].bottomStopSelectorHeight,\n                    initialOffsetTop = $multiDocked.defaultValuesObject[$placement.id].initialOffsetTop,\n                    minimalScrollingDistance = $multiDocked.defaultValuesObject[$placement.id].minimalScrollingDistance;\n                let numberOfInstanes = $multiDocked.filterNumberOfInstancesPerFooterTop($placement, fiUtils.getExtra($placement).multiDocked.setEveryNthInstanceAsInline == \"first\" || fiUtils.getExtra($placement).multiDocked.setEveryNthInstanceAsInline > 1 ? Math.ceil((bodyHeight - initialOffsetTop - 300) \/ ($placement.height + distanceBetweenInstances + bottomStopSelectorHeight)) : Math.round((bodyHeight - initialOffsetTop - 300) \/ ($placement.height + distanceBetweenInstances + bottomStopSelectorHeight)), distanceBetweenInstances);\n                numberOfInstanes = numberOfInstanes < $placement.options.totalRenderedInstancesLimitation ? numberOfInstanes : $placement.options.totalRenderedInstancesLimitation;\n                fiUtils.console(`${adjustedDistanceObject.msg}, this means you'll get ${numberOfInstanes} instances `, `message`, $multiDocked.module_name);\n                return numberOfInstanes;\n            },\n            setNumberOfInstances: ($placement) => {\n                const numberOfInstanes = $multiDocked.calculateInstancesCount($placement);\n                fiUtils.setPlacementRenderLimit($placement, numberOfInstanes);\n            },\n            appendStyle: ($placement, distanceBetweenInstances, instanceId) => {\n                fiQuery(`.multi-docked-container_${$placement.id}._${instanceId}`).append(`<style> \n                        .multi-docked-container_${$placement.id}._${instanceId}:nth-child(${fiUtils.getExtra($placement).multiDocked.setEveryNthInstanceAsInline == \"first\" ? \"1\" : fiUtils.getExtra($placement).multiDocked.setEveryNthInstanceAsInline + \"n + 1\"}) {\n                            height: ${fiUtils.getExtra($placement).multiDocked.setEveryNthInstanceAsInline == 1 ? $multiDocked.calculateContainerHeight($placement, distanceBetweenInstances, instanceId) : $placement.height}px;\n                        }                        \n                        .multi-docked-container_${$placement.id}._${instanceId}:nth-child(${fiUtils.getExtra($placement).multiDocked.setEveryNthInstanceAsInline == \"first\" ? \"1\" : fiUtils.getExtra($placement).multiDocked.setEveryNthInstanceAsInline + \"n + 1\"}) div[fi-placement-id=\"${$placement.id}\"] {\n                            position: relative !important;\n                            left: 0px !important;\n                            top: 0px !important;\n                        }\n                        .multi-docked-container_${$placement.id}._${instanceId} {\n                            top: ${instanceId == 0 ? $multiDocked.setTop(fiUtils.getExtra($placement).multiDocked, $placement) : fiQuery(`.multi-docked-container_${$placement.id}._${instanceId - 1}`).height() + fiQuery(`.multi-docked-container_${$placement.id}._${instanceId - 1}`).offset().top}px; \n                        }\n                        .multi-docked-container_${$placement.id}._${instanceId} {\n                            height: ${$multiDocked.calculateContainerHeight($placement, distanceBetweenInstances, instanceId)}px;\n                          ${fiUtils.getExtra($placement).multiDocked.staticPosition.selector == \"body\" ? `position: absolute;` : ``} \n                          left: ${$multiDocked.setLeft(fiUtils.getExtra($placement).multiDocked, $placement)}px;\n                          ${instanceId > 0 ? `margin-top: 50px;` : \"\"}\n                        }\n                        .multi-docked-container_${$placement.id}._${instanceId} div[fi-placement-id=\"${$placement.id}\"] {\n                            position: ${fiUtils.getExtra($placement).multiDocked.overflowHidden ? \"\" : \"sticky !important\"};\n                            top: ${$multiDocked.defaultValuesObject[$placement.id].fixedTop}px !important;\n                        }\n                      \/*Look like there is a bug with the docked close button since its with display none even though no cloes button is set to false*\/\n                        .multi-docked-container_${$placement.id}._${instanceId} div[fi-placement-id=\"${$placement.id}\"] > div > div:nth-child(1) {\n                            display: block !important;\n                        }\n                    <\/style>`);\n            },\n            appendContainer: ($placement) => {\n                let defaultDistance = $multiDocked.defaultValuesObject[$placement.id].defaultDistance,\n                    distanceBetweenInstances = $multiDocked.adjustDistance(defaultDistance).distance;\n                const numberOfInstanes = $multiDocked.calculateInstancesCount($placement);\n                fiQuery(fiUtils.getExtra($placement).multiDocked.staticPosition.selector).append(`<div id=\"multi-docked-container_${$placement.id}\"><\/div>`);\n                for (var i = 0; i < numberOfInstanes; i++) {\n                    fiQuery(`#multi-docked-container_${$placement.id}`).append(`<div class=\"multi-docked-container_${$placement.id} _${i}\"><div><\/div><\/div>`);\n                    $multiDocked.appendStyle($placement, distanceBetweenInstances, i);\n                }\n            },\n            readjustInstanceHeightAndTop: ($instance, hiddenContainerHeight, instanceId) => {\n                const count = $multiDocked.calculateInstancesCount($instance.placement);\n                let nextInLineTop;\n                for (var i = parseInt(instanceId) + 1; i < count; i++) {\n                    fiQuery(`.multi-docked-container_${$instance.placement.id}._${i}`).css({ top: `${fiQuery(`.multi-docked-container_${$instance.placement.id}._${i}`).offset().top - fiQuery(`.multi-docked-container_${$instance.placement.id}._${i - 1}`).height() - (fiQuery(`.multi-docked-container_${$instance.placement.id}._${i}`).outerHeight(true) - fiQuery(`.multi-docked-container_${$instance.placement.id}._${i}`).height())}px` });\n                    if (i == parseInt(instanceId) + 1) fiQuery(`.multi-docked-container_${$instance.placement.id}._${i}`).css(`margin-top`, `0px`);\n                }\n            },\n        });\n        $multiDocked.targetPlacements.forEach(($placement) => {\n            if ($multiDocked.checkAvailSpace) {\n                FI.awaitFor(() => $multiDocked.performChecks($placement))\n                    .then(() => $multiDocked.setDefaultValues($placement))\n                    .then(() => {\n                        $multiDocked.appendContainer($placement);\n                        $multiDocked.setNumberOfInstances($placement);\n                    });\n            }\n        });\n        fiQuery(window).on(\"instanceHidden\", function (e, $instance) {\n            if (typeof fiUtils.getExtra($instance.placement).multiDocked != \"undefined\") {\n                let hiddenContainerHeight = fiQuery(`.multi-docked-container_${$instance.placement.id}._${fiUtils.getInstanceId($instance)}`).height();\n                if (e.type == \"instanceHidden\") {\n                    $multiDocked.readjustInstanceHeightAndTop($instance, hiddenContainerHeight, fiUtils.getInstanceId($instance));\n                    fiQuery(`.multi-docked-container_${$instance.placement.id}._${fiUtils.getInstanceId($instance)}`).remove();\n                }\n            }\n        });\n    }\n<\/script>\n\n<style>\n    div#FIOnDemandWrapper_{apd-id} {\n        display:none !important;\n    }\n<\/style>","append":""}],"messages":[{"type":"info","text":"Will serve you ALL LIVE placements (all enabled placements, that are not in QA and not hidden)"}],"utm":{"utm_source":"direct","utm_medium":"direct","utm_campaign":"","utm_content":"","utm_keyword":"","utm_ref":""}}