1(function($){$(document).ready(function(){function initNiceSelect(){$('.hs-form-block select.hs-input').niceSelect();$('.hs-form-block select.hs-input').on('change',function(){$(this).closest('.hs-form-field').addClass('focus')})} 2initNiceSelect();const formObserver=new MutationObserver(function(mutations){mutations.forEach(function(mutation){if(mutation.type==='childList'&&mutation.addedNodes.length>0){mutation.addedNodes.forEach(function(node){if(node.nodeType===1){if($(node).hasClass('hs-form')||$(node).find('.hs-form').length){setTimeout(function(){initNiceSelect()},100)}}})}})});formObserver.observe(document.body,{childList:!0,subtree:!0});$(window).on('message',function(e){if(e.originalEvent.data&&e.originalEvent.data.type==='hsFormCallback'){setTimeout(function(){initNiceSelect()},500)}});var checkCount=0;var checkInterval=setInterval(function(){if($('.hs-form-block select.hs-input').length>0){initNiceSelect();checkCount++} 3if(checkCount>=15){clearInterval(checkInterval)}},1000);setTimeout(function(){initNiceSelect()},3000);function initializeHubSpotFormFields(){const formFields=document.querySelectorAll('.hs-form-field');formFields.forEach(field=>{const input=field.querySelector('.hs-input');const niceSelect=field.querySelector('.nice-select');const checkbox=field.querySelector('input[type="checkbox"]');if(!input&&!niceSelect&&!checkbox)return;function updateFieldState(){const hasValue=input?input.value.trim()!=='':(niceSelect?niceSelect.querySelector('.current').textContent.trim()!=='':(checkbox?checkbox.checked:!1));const isFocused=document.activeElement===input||(niceSelect&&niceSelect.classList.contains('open'))||document.activeElement===checkbox;field.classList.remove('focus');if(isFocused||hasValue){field.classList.add('focus')}} 4if(input){input.addEventListener('focus',updateFieldState);input.addEventListener('blur',updateFieldState);input.addEventListener('input',updateFieldState);input.addEventListener('change',updateFieldState)} 5if(niceSelect){niceSelect.addEventListener('click',updateFieldState);document.addEventListener('click',function(e){if(!niceSelect.contains(e.target)){updateFieldState()}});const observer=new MutationObserver(updateFieldState);observer.observe(niceSelect,{childList:!0,subtree:!0,characterData:!0})} 6if(checkbox){checkbox.addEventListener('change',updateFieldState);checkbox.addEventListener('focus',updateFieldState);checkbox.addEventListener('blur',updateFieldState)} 7updateFieldState()})} 8initializeHubSpotFormFields();const observer=new MutationObserver(function(mutations){mutations.forEach(function(mutation){if(mutation.type==='childList'&&mutation.addedNodes.length>0){mutation.addedNodes.forEach(function(node){if(node.nodeType===1&&node.querySelector&&node.querySelector('.hs-form-field')){initializeHubSpotFormFields()}})}})});observer.observe(document.body,{childList:!0,subtree:!0});if(typeof window.hbspt!=='undefined'){window.addEventListener('message',function(event){if(event.data&&event.data.type==='hsFormCallback'&&event.data.eventName==='onFormReady'){setTimeout(initializeHubSpotFormFields,100)}});window.addEventListener('message',function(event){if(event.data&&event.data.type==='hsFormCallback'&&event.data.eventName==='onFormSubmit'){setTimeout(initializeHubSpotFormFields,100)}})} 9let initAttempts=0;const maxAttempts=5;const initInterval=setInterval(function(){if(initAttempts<maxAttempts){initializeHubSpotFormFields();initAttempts++}else{clearInterval(initInterval)}},2000);if($('.testimonial__slider').length){$('.testimonial__slider').slick({slidesToShow:1,slidesToScroll:1,arrows:!0,dots:!1,infinite:!0,speed:600,adaptiveHeight:!0,autoplay:!0,autoplaySpeed:5000,pauseOnHover:!0,responsive:[{breakpoint:992,settings:{slidesToShow:1,slidesToScroll:1,centerMode:!0,centerPadding:'0px'}}]})} 10if($('.full-testimonial__slider').length){$('.full-testimonial__slider').slick({slidesToShow:1,slidesToScroll:1,arrows:!0,dots:!1,infinite:!0,speed:600,adaptiveHeight:!0,autoplay:!1,autoplaySpeed:5000,pauseOnHover:!0,centerMode:!0,centerPadding:'calc((100% - 962px) / 2)',responsive:[{breakpoint:992,settings:{slidesToShow:1,slidesToScroll:1,centerMode:!1,centerPadding:'0px',arrows:!1,}},{breakpoint:768,settings:"unslick"}]})}
11var counterStarted=!1;function startCounters(){if(counterStarted)return;counterStarted=!0;var counterFrames=document.querySelectorAll('.counter__item-frame');if(counterFrames.length===0)return;var maxWidth=0;counterFrames.forEach(function(frame){var temp=document.createElement('div');temp.style.fontSize=window.getComputedStyle(frame).fontSize;temp.style.fontWeight=window.getComputedStyle(frame).fontWeight;temp.style.fontFamily=window.getComputedStyle(frame).fontFamily;temp.style.visibility='hidden';temp.style.position='absolute';temp.style.whiteSpace='nowrap';temp.style.display='flex';temp.style.justifyContent=window.getComputedStyle(frame).justifyContent;temp.innerHTML=frame.innerHTML;document.body.appendChild(temp);var width=temp.offsetWidth;document.body.removeChild(temp);maxWidth=Math.max(maxWidth,width)});counterFrames.forEach(function(frame){frame.style.width=(maxWidth+60)+'px';frame.style.minWidth=(maxWidth+60)+'px'});var counterItems=document.querySelectorAll('.counter__item-number');counterItems.forEach(function(item){var countTo=parseFloat(item.getAttribute('data-count'));if(isNaN(countTo))return;var duration=2000;var startTime=null;function animateCounter(timestamp){if(!startTime)startTime=timestamp;var progress=timestamp-startTime;var currentCount=Math.min((progress/duration*countTo),countTo);var displayValue=currentCount;if(countTo%1!==0){displayValue=currentCount.toFixed(1)}else{displayValue=Math.floor(currentCount)} 12item.textContent=displayValue;if(progress<duration){requestAnimationFrame(animateCounter)}else{if(countTo%1!==0){item.textContent=countTo.toFixed(1)}else{item.textContent=countTo}}} 13requestAnimationFrame(animateCounter)})} 14function isSectionInView(){var section=document.querySelector('.counter__items');if(!section){return!1} 15var rect=section.getBoundingClientRect();var windowHeight=window.innerHeight;return rect.top<windowHeight&&rect.bottom>0} 16$(window).on('scroll',function(){if(!counterStarted&&isSectionInView()){startCounters()}});if(!counterStarted&&isSectionInView()){startCounters()} 17function initHandsParallaxBlocks(){const sections=document.querySelectorAll('.cta-paralax, .hands-form, .cta-hands');if(!sections.length){return} 18const maxOffset=90;const desktopMinOffset=20;const mobileMinOffset=35;const mobileMq=window.matchMedia('(max-width: 768px)');let ticking=!1;const titleSafeGap=40;const ctaInfoContainerGap=2;function getParallaxOffsets(section){const isCtaInfoParallax=section.classList.contains('cta-info--has-parallax');const isCtaHands=section.classList.contains('cta-hands');const customMobileMin=parseFloat(getComputedStyle(section).getPropertyValue('--cta-paralax-mobile-min-offset'));const mobileMin=Number.isFinite(customMobileMin)?customMobileMin:mobileMinOffset;const desktopMin=isCtaInfoParallax?3:(isCtaHands?14:desktopMinOffset);if(isCtaHands&&mobileMq.matches){return{maxOffset:90,minOffset:mobileMin,}} 19return{maxOffset:isCtaHands?72:90,minOffset:mobileMq.matches?mobileMin:desktopMin,}} 20function getBlockSelectors(section){let prefix='cta-paralax';if(section.classList.contains('hands-form')){prefix='hands-form'}else if(section.classList.contains('cta-hands')){prefix='cta-hands'} 21return{headerTitle:section.querySelector('.'+prefix+'__header-title'),contentSafe:prefix==='cta-hands'?section.querySelector('.cta-hands__content'):(section.querySelector('.'+prefix+'__form-wrap')||section.querySelector('.'+prefix+'__button-wrap')||section.querySelector('.'+prefix+'__header-title')||section.querySelector('.'+prefix+'__content')),inner:section.querySelector('.'+prefix+'__inner'),leftEl:section.querySelector('.'+prefix+'__image--left'),rightEl:section.querySelector('.'+prefix+'__image--right'),}} 22function getContentSafeOffset(section,leftEl,rightEl,fallbackOffset,contentRect,gap){if(mobileMq.matches&&!section.classList.contains('cta-hands')){return fallbackOffset} 23const selectors=getBlockSelectors(section);const inner=selectors.inner;const safeGap=typeof gap==='number'?gap:titleSafeGap;if(!inner||!contentRect||!leftEl||!rightEl){return fallbackOffset} 24const innerRect=inner.getBoundingClientRect();
24const leftWidth=leftEl.offsetWidth||0;const rightWidth=rightEl.offsetWidth||0;if(!leftWidth||!rightWidth){return fallbackOffset} 25const leftRequired=1-((contentRect.left-safeGap-innerRect.left)/leftWidth);const rightRequired=1-((innerRect.right-(contentRect.right+safeGap))/rightWidth);const requiredPercent=Math.max(0,leftRequired*100,rightRequired*100);return Math.max(fallbackOffset,requiredPercent)} 26function getContentSafeOffsets(section,leftEl,rightEl,fallbackOffset,contentRect,gap){if(mobileMq.matches){return{left:fallbackOffset,right:fallbackOffset,}} 27const selectors=getBlockSelectors(section);const inner=selectors.inner;const safeGap=typeof gap==='number'?gap:titleSafeGap;if(!inner||!contentRect||!leftEl||!rightEl){return{left:fallbackOffset,right:fallbackOffset,}} 28const innerRect=inner.getBoundingClientRect();const leftWidth=leftEl.offsetWidth||0;const rightWidth=rightEl.offsetWidth||0;if(!leftWidth||!rightWidth){return{left:fallbackOffset,right:fallbackOffset,}} 29const leftRequired=Math.max(0,(1-((contentRect.left-safeGap-innerRect.left)/leftWidth))*100);const rightRequired=Math.max(0,(1-((innerRect.right-(contentRect.right+safeGap))/rightWidth))*100);return{left:Math.max(fallbackOffset,leftRequired),right:Math.max(fallbackOffset,rightRequired),}} 30function getTitleTextRect(titleEl){if(!titleEl){return null} 31const heading=titleEl.querySelector('h2')||titleEl;const range=document.createRange();try{range.selectNodeContents(heading);const rects=range.getClientRects();if(!rects.length){return heading.getBoundingClientRect()} 32let left=Infinity;let right=-Infinity;let top=Infinity;let bottom=-Infinity;for(let i=0;i<rects.length;i++){const r=rects[i];left=Math.min(left,r.left);right=Math.max(right,r.right);top=Math.min(top,r.top);bottom=Math.max(bottom,r.bottom)} 33return{left:left,right:right,top:top,bottom:bottom,width:right-left,height:bottom-top,}}catch(e){return heading.getBoundingClientRect()}} 34function getTitleSafeOffset(section,leftEl,rightEl,fallbackOffset){const selectors=getBlockSelectors(section);let safeRect=null;if(section.classList.contains('cta-hands')){if(mobileMq.matches){safeRect=getTitleTextRect(selectors.headerTitle);if(!safeRect&&selectors.contentSafe){safeRect=selectors.contentSafe.getBoundingClientRect()}}else if(selectors.contentSafe){safeRect=selectors.contentSafe.getBoundingClientRect()}else if(selectors.headerTitle){safeRect=selectors.headerTitle.getBoundingClientRect()}}else{const safeEl=selectors.headerTitle||selectors.contentSafe;if(safeEl){safeRect=safeEl.getBoundingClientRect()}} 35if(!safeRect){return fallbackOffset} 36const gap=section.classList.contains('cta-hands')?(mobileMq.matches?4:16):titleSafeGap;return getContentSafeOffset(section,leftEl,rightEl,fallbackOffset,safeRect,gap)} 37function getContainerSafeOffsets(section,leftEl,rightEl,fallbackOffset){const container=section.querySelector('.cta-info-container');if(!container){return{left:fallbackOffset,right:fallbackOffset,}} 38return getContentSafeOffsets(section,leftEl,rightEl,fallbackOffset,container.getBoundingClientRect(),ctaInfoContainerGap)} 39function getMobileEndGap(section){if(!mobileMq.matches||(!section.classList.contains('cta-paralax')&&!section.classList.contains('cta-hands'))){return 0} 40const gap=parseFloat(getComputedStyle(section).getPropertyValue('--cta-paralax-mobile-end-gap'));return Number.isFinite(gap)?gap:0} 41function getParallaxImageAdjustments(section){const styles=getComputedStyle(section);const xInset=parseFloat(styles.getPropertyValue('--cta-paralax-image-x-inset'));const yOffset=parseFloat(styles.getPropertyValue('--cta-paralax-image-y-offset'));return{xInset:Number.isFinite(xInset)?xInset:0,yOffset:Number.isFinite(yOffset)?yOffset:0,}} 42function getImageTransform(translate,side,section){const gap=getMobileEndGap(section);const isCtaInfoParallax=section.classList.contains('cta-info--has-parallax');const{xInset,yOffset}=getParallaxImageAdjustments(section);const translateY=yOffset?'translateY(calc(-50% + '+yOffset+'px))':'translateY(-50%)';const leftXInset=xInset?' + '+xInset+'px':'';const rightXInset=xInset?' - '+xInset+'px':'';if(isCtaInfoParallax){if(!gap){return'translateX('+(side==='left'?-translate:translate)+'%)'} 43if(side==='left'){return'translateX(calc('+(-translate)+'% - '+gap+'px))'} 44return'translateX(calc('+translate+'% + '+gap+'px))'} 45if(!gap){if(side==='left'){return translateY+' translateX(calc('+(-translate)+'%'+leftXInset+'))'} 46return translateY+' translateX(calc('+translate+'%'+rightXInset+'))'} 47if(side==='left'){return translateY+' translateX(calc('+(-translate)+'% - '+gap+'px'+leftXInset+'))'} 48return translateY+' translateX(calc('+translate+'% + '+gap+'px'+rightXInset+'))'}
49function getSectionProgress(section,rect,viewportHeight,viewportCenter){if(section.classList.contains('cta-hands')){if(rect.top>=viewportHeight){return 0} 50if(rect.bottom<=0){return 1} 51const startTop=viewportHeight;const endTop=viewportCenter-rect.height/2;const travel=startTop-endTop;if(travel<=0){return 1} 52return Math.max(0,Math.min(1,(startTop-rect.top)/travel))} 53const sectionCenter=rect.top+rect.height/2;const distance=sectionCenter-viewportCenter;const range=viewportHeight;if(distance>=0){return Math.max(0,Math.min(1,1-distance/range))} 54return 1} 55function applyMobileInitialOffset(){if(!mobileMq.matches){return} 56sections.forEach(function(section){if(section.classList.contains('cta-info--has-parallax')){return} 57const selectors=getBlockSelectors(section);const leftEl=selectors.leftEl;const rightEl=selectors.rightEl;const offsets=getParallaxOffsets(section);const parkOffset=section.classList.contains('cta-hands')?offsets.maxOffset:offsets.minOffset;if(leftEl){leftEl.style.transform=getImageTransform(parkOffset,'left',section)} 58if(rightEl){rightEl.style.transform=getImageTransform(parkOffset,'right',section)}})} 59function update(){sections.forEach(function(section){const rect=section.getBoundingClientRect();const viewportHeight=window.innerHeight||document.documentElement.clientHeight;const header=document.querySelector('.site-header');const headerHeight=header?header.offsetHeight:0;const viewportCenter=viewportHeight/2+headerHeight/2;const progress=getSectionProgress(section,rect,viewportHeight,viewportCenter);const offsets=getParallaxOffsets(section);const minOffset=offsets.minOffset;const maxOffset=offsets.maxOffset;const selectors=getBlockSelectors(section);const leftEl=selectors.leftEl;const rightEl=selectors.rightEl;const baseTranslate=Math.max(minOffset,(1-progress)*maxOffset);if(section.classList.contains('cta-info--has-parallax')){const safeOffsets=getContainerSafeOffsets(section,leftEl,rightEl,minOffset);if(leftEl){leftEl.style.transform=getImageTransform(Math.max(safeOffsets.left,baseTranslate),'left',section)} 60if(rightEl){rightEl.style.transform=getImageTransform(Math.max(safeOffsets.right,baseTranslate),'right',section)}}else{const safeMinOffset=getTitleSafeOffset(section,leftEl,rightEl,minOffset);let translate=Math.max(safeMinOffset,baseTranslate);
60if(section.classList.contains('cta-hands')&&mobileMq.matches){const minTravel=20;const endOffset=Math.max(minOffset,Math.min(safeMinOffset,maxOffset-minTravel));translate=maxOffset+(endOffset-maxOffset)*progress} 61if(section.classList.contains('cta-hands')){if(mobileMq.matches){const titleEl=selectors.headerTitle;const innerEl=selectors.inner;if(titleEl&&innerEl){const innerRect=innerEl.getBoundingClientRect();const titleRect=titleEl.getBoundingClientRect();const titleCenter=titleRect.top+titleRect.height/2-innerRect.top;if(leftEl){leftEl.style.top=(titleCenter-10)+'px'} 62if(rightEl){rightEl.style.top=titleCenter+'px'}}}else{if(leftEl){leftEl.style.top=''} 63if(rightEl){rightEl.style.top=''}}} 64if(leftEl){leftEl.style.transform=getImageTransform(translate,'left',section)} 65if(rightEl){rightEl.style.transform=getImageTransform(translate,'right',section)}}});ticking=!1} 66function onScroll(){if(!ticking){window.requestAnimationFrame(update);ticking=!0}} 67window.addEventListener('scroll',onScroll,{passive:!0});window.addEventListener('resize',update);applyMobileInitialOffset();update()} 68initHandsParallaxBlocks()})})(jQuery);document.addEventListener('DOMContentLoaded',function(){var header=document.querySelector('.site-header');window.addEventListener('scroll',function(){if(window.scrollY>20){header.classList.add('header-scrolled')}else{header.classList.remove('header-scrolled')}})});const stickyElement=document.querySelector('.compare-table__header');if(stickyElement&&stickyElement.parentNode){const sentinel=document.createElement('div');stickyElement.parentNode.insertBefore(sentinel,stickyElement);const observer=new IntersectionObserver(([entry])=>{if(!entry.isIntersecting){stickyElement.classList.add('compare-table__header--sticky')}else{stickyElement.classList.remove('compare-table__header--sticky')}},{threshold:[0],rootMargin:'-80px 0px 0px 0px'});observer.observe(sentinel)}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.