<!DOCTYPE html><!-- Last Published: Thu Feb 06 2025 18:26:18 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="%%PUBLISH_URL_REPLACEMENT%%" data-wf-page="6520a204aec4d72161e3d5ae" data-wf-site="5e67db0c1e7a468249544a75" lang="en"><head><meta charset="utf-8"/><title>Not Found</title><meta content="Not Found" property="og:title"/><meta content="Not Found" property="twitter:title"/><meta content="width=device-width, initial-scale=1" name="viewport"/><meta content="google-site-verification=Jmms0_XFcgBIDl9Ly7pfogukm_9GOpVAM36Uu59c71k" name="google-site-verification"/><link href="https://cdn.prod.website-files.com/5e67db0c1e7a468249544a75/css/infinite-red-website.12370d649.min.css" rel="stylesheet" type="text/css"/><link href="https://fonts.googleapis.com" rel="preconnect"/><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"/><script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script><script type="text/javascript">WebFont.load({ google: { families: ["Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic","Droid Serif:400,400italic,700,700italic","Merriweather:300,300italic,400,400italic,700,700italic,900,900italic"] }});</script><script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script><link href="https://cdn.prod.website-files.com/5e67db0c1e7a468249544a75/5e96204b6085211e0c7f48f2_favicon.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/5e67db0c1e7a468249544a75/5e96204d92bbee4276b5761c_webclip.png" rel="apple-touch-icon"/><script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-41822601-3"></script><script type="text/javascript">window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('config', 'UA-41822601-3', {'anonymize_ip': false});</script><style>
.container-scroll {
scrollbar-width: none; /* Firefox 64 */
-ms-overflow-style: none; /* Internet Explorer 11 */
}
.container-scroll::-webkit-scrollbar { /** WebKit */
display: none;
}
.team__collection__list {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
.team__collection__list::after {
content: "";
flex: auto;
}
</style>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta name="google-site-verification" content="PziDawbND-UbE8RPHIApiyKHqLwhQqNCzyAYEmFW-Tc" />
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-41822601-9"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-41822601-9');
</script>
<script type="text/javascript">
(function() {
window._pa = window._pa || {};
// _pa.orderId = "myOrderId"; // OPTIONAL: attach unique conversion identifier to conversions
// _pa.revenue = "19.99"; // OPTIONAL: attach dynamic purchase values to conversions
// _pa.productId = "myProductId"; // OPTIONAL: Include product ID for use with dynamic ads
var pa = document.createElement('script'); pa.type = 'text/javascript'; pa.async = true;
pa.src = ('https:' == document.location.protocol ? 'https:' : 'http:') + "//tag.perfectaudience.com/serve/5dcb4b56acb1888586000015.js";
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(pa, s);
})();
</script>
<meta name="ahrefs-site-verification" content="b989772c57dd9a5233657e546e1671f8a09c12705f5bda677a2a437ada46bd23">
<style>
.w-nav-link.w--current{
color: #e73536 !important;
}
.w__menu__link.w--current{
color: #e73536 !important;
}
.nav-dropdown__link.w--current{
color: #e73536 !important;
}
</style>
</head><body><div data-animation="over-right" class="top-nav w-nav" data-easing2="ease" data-easing="ease" data-collapse="medium" data-w-id="48941a4f-8c15-7a61-3715-67421ac8b695" role="banner" data-no-scroll="1" data-duration="400" data-doc-height="1"><div class="top-nav-container"><div class="top-nav-wrapper"><a href="/" class="top-nav-brand w-inline-block"><div class="top-nav-brand-image w-embed"><?xml version="1.0" encoding="UTF-8"?>
<svg width="93px" height="41px" viewBox="0 0 93 41" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 63.1 (92452) - https://sketch.com -->
<title>logo-dark</title>
<desc>Created with Sketch.</desc>
<g id="Navigation" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Navigation/Top-Nav/-Transparent" transform="translate(-128.000000, -35.000000)">
<g id="Main-Nav">
<rect id="bounds" x="0" y="0" width="1440" height="111"></rect>
<g id="Group" transform="translate(128.000000, 35.000000)">
<g id=".nav__logo--light">
<g id="IR-Logo">
<path d="M36.0800073,0.0610119048 C42.9412217,0.0610119048 48.5033343,5.70727865 48.5033343,12.6723024 C48.5033343,19.6373262 42.9412217,25.283593 36.0800073,25.283593 C29.2187929,25.283593 23.6566802,19.6373262 23.6566802,12.6723024 C23.6566802,5.70727865 29.2187929,0.0610119048 36.0800073,0.0610119048 Z M36.0800073,6.05258288 C32.4785269,6.05258288 29.5589506,9.0163321 29.5589506,12.6723024 C29.5589506,16.3282728 32.4785269,19.292022 36.0800073,19.292022 C39.6814876,19.292022 42.601064,16.3282728 42.601064,12.6723024 C42.601064,9.0163321 39.6814876,6.05258288 36.0800073,6.05258288 Z" id="infinity-left-circle" fill="#E73536"></path>
<path d="M56.166766,0.0610119048 C63.0279804,0.0610119048 68.590093,5.70727865 68.590093,12.6723024 C68.590093,19.6373262 63.0279804,25.283593 56.166766,25.283593 C52.9181748,25.283593 49.9608105,24.0178383 47.7471521,21.9456543 C49.0744843,20.2188082 50.035948,18.189109 50.5152955,15.9759446 C51.640891,17.9578044 53.7503391,19.292022 56.166766,19.292022 C59.7682463,19.292022 62.6878227,16.3282728 62.6878227,12.6723024 C62.6878227,9.0163321 59.7682463,6.05258288 56.166766,6.05258288 C53.7340603,6.05258288 51.6124835,7.40483749 50.4916749,9.40927321 C49.997631,7.20099506 49.0222034,5.17810314 47.6836756,3.46012579 C49.9032037,1.35155427 52.8865199,0.0610119048 56.166766,0.0610119048 Z" id="infinity-right-circle" fill="#E73536"></path>
<polygon id="Path-Copy-2" fill="currentColor" points="58.9649039 31.2751639 58.9649039 33.1898292 54.2453185 33.1898292 54.2453185 35.1733672 58.4902329 35.1733672 58.4902329 37.005385 54.2453185 37.005385 54.2453185 39.0026977 59.1140862 39.0026977 59.1140862 40.9035883 52.1296423 40.9035883 52.1296423 31.2751639"></polygon>
<polygon id="Path-Copy-3" fill="currentColor" points="47.8422083 33.1347309 47.8422083 40.9035883 45.726532 40.9035883 45.726532 33.1347309 43.0412507 33.1347309 43.0412507 31.2751639 50.5274896 31.2751639 50.5274896 33.1347309"></polygon>
<polygon id="Path-Copy-4" fill="currentColor" points="39.3544503 31.2751639 41.4701265 31.2751639 41.4701265 40.9035883 39.3544503 40.9035883"></polygon>
<polygon id="Path-Copy-5" fill="currentColor" points="34.9258805 31.2751639 37.0415567 31.2751639 37.0415567 40.9035883 34.9258805 40.9035883 30.4097255 34.8703267 30.4097255 40.9035883 28.2940493 40.9035883 28.2940493 31.2751639 30.2741052 31.2751639 34.9258805 37.4737204"></polygon>
<polygon id="Path-Copy-6" fill="currentColor" points="23.835593 31.2751639 25.9512692 31.2751639 25.9512692 40.9035883 23.835593 40.9035883"></polygon>
<polygon id="Path-Copy-7" fill="currentColor" points="22.1143698 31.2751639 22.1143698 33.16228 17.7202731 33.16228 17.7202731 35.2422401 21.8973774 35.2422401 21.8973774 37.1293561 17.7202731 37.1293561 17.7202731 40.9035883 15.6045969 40.9035883 15.6045969 31.2751639"></polygon>
<polygon id="Path-Copy-8" fill="currentColor" points="11.0902875 31.2751639 13.2059637 31.2751639 13.2059637 40.9035883 11.0902875 40.9035883 6.57413246 34.8703267 6.57413246 40.9035883 4.45845625 40.9035883 4.45845625 31.2751639 6.43851219 31.2751639 11.0902875 37.4737204"></polygon>
<polygon id="Path-Copy-9" fill="currentColor" points="0 31.2751639 2.11567622 31.2751639 2.11567622 40.9035883 0 40.9035883"></polygon>
<path d="M68.5843109,31.2751639 C70.0580585,31.2751639 71.1091051,31.5276952 71.7374822,32.0327653 C72.3658592,32.5378354 72.6800431,33.3505269 72.6800431,34.4708642 C72.6800431,36.0136237 72.0787992,37.0099743 70.8762935,37.4599458 L73.2767722,40.9035883 L70.672863,40.9035883 L68.5707489,37.8318592 L67.1060499,37.8318592 L67.1060499,40.9035883 L64.9903737,40.9035883 L64.9903737,31.2751639 L68.5843109,31.2751639 Z M68.6348799,33.1039121 L67.0481228,33.1039121 L67.0481228,35.9552481 L68.5941938,35.9552481 C69.3175056,35.9552481 69.8102543,35.8358697 70.0724548,35.5971092 C70.3346553,35.3583488 70.4657536,34.979552 70.4657536,34.4607072 C70.4657536,33.9418625 70.3301347,33.586023 70.0588928,33.3931781 C69.7876509,33.2003331 69.3129847,33.1039121 68.6348799,33.1039121 Z" id="Path-Copy-11" fill="currentColor"></path>
<polygon id="Path-Copy-12" fill="currentColor" points="81.6856828 31.2751639 81.6856828 33.1898292 76.9660974 33.1898292 76.9660974 35.1733672 81.2110119 35.1733672 81.2110119 37.005385 76.9660974 37.005385 76.9660974 39.0026977 81.8348651 39.0026977 81.8348651 40.9035883 74.8504212 40.9035883 74.8504212 31.2751639"></polygon>
<path d="M87.0314148,31.2751639 C88.722156,31.2751639 90.0195769,31.6952841 90.9237166,32.5355371 C91.8278562,33.37579 92.2799193,34.544321 92.2799193,36.0411651 C92.2799193,37.5380092 91.8391578,38.7226104 90.9576216,39.5950042 C90.0760855,40.4673979 88.7311979,40.9035883 86.9229186,40.9035883 L83.6815941,40.9035883 L83.6815941,31.2751639 L87.0314148,31.2751639 Z M87.0049791,33.1039121 L85.8250827,33.1039121 L85.8250827,38.9581043 L87.1677234,38.9581043 C88.1351528,38.9581043 88.8787965,38.7101645 89.3986768,38.2142775 C89.9185571,37.7183905 90.1784934,36.9975286 90.1784934,36.0516701 C90.1784934,35.1058115 89.9185571,34.3780624 89.3986768,33.8684007 C88.8787965,33.3587391 88.0809053,33.1039121 87.0049791,33.1039121 Z" id="Path-Copy-14" fill="currentColor"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg></div><div class="custom-js-right-click w-embed w-script"><script>
document.addEventListener("DOMContentLoaded", (event) => {
const topNavBrand = document.querySelector('.top-nav-brand');
if (!topNavBrand) return
topNavBrand.addEventListener('contextmenu', function (ev) {
ev.preventDefault();
window.location.href = "/brand-assets"
return false;
}, false);
});
</script></div></a><nav role="navigation" class="top-nav-menu w-nav-menu"><a href="/" class="top-nav-menu-link w-nav-link">Home</a><a href="/react-native" class="top-nav-menu-link w-nav-link">React native</a><a href="/expo" class="top-nav-menu-link w-nav-link">EXPO</a><a href="/work" class="top-nav-menu-link w-nav-link">Work</a><a href="/about" class="top-nav-menu-link w-nav-link">company</a><div data-hover="false" data-delay="400" data-w-id="45f2be38-41d3-ac34-36b4-3d0a0dec342d" class="dropdown w-dropdown"><div class="dropdown-toggle w-dropdown-toggle"><div class="top-nav-menu-link">Community</div></div><nav data-w-id="45f2be38-41d3-ac34-36b4-3d0a0dec3432" class="dropdown-list w-dropdown-list"><a href="/community/building-community" class="top-nav-menu-link w-nav-link">Building community</a><a href="/community/open-source" class="top-nav-menu-link w-nav-link">Open Source</a><a href="/community/podcasts" class="top-nav-menu-link w-nav-link">Podcasts</a><a href="/community/newsletters" class="top-nav-menu-link w-nav-link">Newsletters</a><a href="https://chainreactconf.com/" class="top-nav-menu-link w-nav-link">Chain React Conf</a></nav></div><a id="top-nav-community-dropdown-trigger" href="/community/building-community" class="top-nav-menu-link-w-icon hide-on-mobile w-inline-block"><div class="top-nav-menu-link">Community</div><div data-w-id="c14198b8-6711-9603-8e2b-b484f797fe93" class="icon--sm top-nav-menu-link-icon-caret w-embed"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<path stroke="currentColor" stroke-linecap="square" d="m18 10-5.98 5.98L6.03 10"/>
</svg></div></a><a href="/contact?source=header" class="top-nav-menu-link w-nav-link">Contact us</a></nav></div><div data-w-id="c14198b8-6711-9603-8e2b-b484f797feb8" class="menu-button w-nav-button"><div class="menu-button-hamburger"><div data-w-id="c14198b8-6711-9603-8e2b-b484f797feba" class="menu-button-hamburger-line"></div><div data-w-id="c14198b8-6711-9603-8e2b-b484f797febc" class="menu-button-hamburger-line"></div><div data-w-id="c14198b8-6711-9603-8e2b-b484f797febb" class="menu-button-hamburger-line"></div></div></div></div><div id="top-nav-community-dropdown" data-w-id="53290218-fbdb-7f81-e737-5e8aa1c5677c" class="top-nav-dropdown hide-on-mobile"><div class="top-nav-wrapper"><div class="div-block-23"></div><div class="top-nav-menu"><a href="/community/building-community" class="top-nav-menu-link in-dropdown w-nav-link">Building community</a><a href="/community/open-source" class="top-nav-menu-link in-dropdown w-nav-link">Open Source</a><a href="/community/podcasts" class="top-nav-menu-link in-dropdown w-nav-link">Podcasts</a><a href="/community/talks" class="top-nav-menu-link in-dropdown w-nav-link">Talks</a><a href="/community/newsletters" class="top-nav-menu-link in-dropdown w-nav-link">Newsletters</a><a href="https://chainreactconf.com/" target="_blank" class="top-nav-menu-link-w-icon w-inline-block"><div class="top-nav-menu-link in-dropdown">Chain React Conf</div><div data-w-id="f15c6ff2-519f-6bb2-96d9-e0d8470998e8" class="icon--sm top-nav-menu-icon-link-external w-embed"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 17L17 7M17 7H8.53846M17 7V15.4615" stroke="currentColor" stroke-linecap="square" />
</svg></div></a></div></div></div><div class="top-nav-embed w-embed"><style>
.top-nav-menu-link-w-icon > .icon--sm + .top-nav-menu-link {
padding-left: 8px;
padding-right: 0px;
}
.top-nav-menu-link-w-icon > .top-nav-menu-link:has(+ .icon--sm) {
padding-right: 8px;
padding-left: 0px;
}
.top-nav-menu-link-w-icon.w--current > .top-nav-menu-link,
.top-nav-menu-link-w-icon.w--current > .icon--sm
{
color: var(--crimson) !important;
}
.top-nav .top-nav-menu > .top-nav-menu-link:hover,
.top-nav .top-nav-menu > .top-nav-menu-link-w-icon:hover {
opacity: 0.65;
transition: opacity 200ms ease-in-out;
}
.top-nav:has(#top-nav-community-dropdown .w--current) #top-nav-community-dropdown {
opacity: 1 !important;
pointer-events: auto !important;
}
.top-nav #top-nav-community-dropdown {
opacity: 0;
transition: opacity 350ms ease-in-out 500ms;
}
.top-nav #top-nav-community-dropdown:not(.active) {
pointer-events: none;
}
.top-nav:has(#top-nav-community-dropdown-trigger:hover) #top-nav-community-dropdown,
.top-nav:has(#top-nav-community-dropdown:hover) #top-nav-community-dropdown {
opacity: 1;
transition-delay: 100ms;
pointer-events: auto;
}
.top-nav .top-nav-brand-image {
transition: color 350ms ease-in-out;
}
.top-nav:has(.menu-button.w--open) .top-nav-brand-image {
color: var(--dark-slate) !important;
}
.top-nav:has(.menu-button.w--open) .nav-icon__bar,
.top-nav:has(.menu-button.w--open) .menu-button-hamburger-line{
background: var(--dark-slate) !important;
}
.top-nav .nav-icon__bar,
.top-nav .menu-button-hamburger-line {
transition: background 350ms ease-in-out;
}
.top-nav:has(#top-nav-community-dropdown .w--current) #top-nav-community-dropdown-trigger * {
color: var(--crimson) !important;
}
@media screen and (max-width: 991px) {
.top-nav-menu-link {
color: var(--dark-slate) !important;
}
.top-nav-menu-link.w--current {
color: var(--crimson) !important;
}
}
.nav-on-white .top-nav .top-nav-menu-link,
.nav-on-white .top-nav .top-nav-brand-image,
.nav-on-white .top-nav .icon--sm {
color: var(--dark-slate);
}
.nav-on-white .top-nav .menu-button-hamburger-line {
background: var(--dark-slate);
}
.nav-on-white .top-nav {
background: rgba(255, 255, 255, 0.96);
}
.nav-on-white .top-nav .top-nav-dropdown {
border-color: rgba(25, 16, 21, 0.1);
background: rgba(255, 255, 255, 0.96);
}
</style></div><div class="top-nav-embed w-embed w-script"><script>
const dropdownTargets = document.querySelectorAll("#top-nav-community-dropdown-trigger, #top-nav-community-dropdown")
const dropdown = document.querySelector("#top-nav-community-dropdown")
dropdownTargets.forEach(target => {
let inactiveTimeout
target.addEventListener("mouseover", ()=>{
clearTimeout(inactiveTimeout)
dropdown.classList.add("active")
})
target.addEventListener("mouseleave", ()=> {
inactiveTimeout = setTimeout(()=>{
dropdown.classList.remove("active")
},1500)
})
})
</script></div></div><div class="_404"><div class="_404--container"><div class="_404--header"><h1 class="h1--reversed">Uh oh! We couldn't find that page.</h1></div><a href="/" class="bttn bttn--outlined bttn--outlined-reversed w-button">Return to Home</a><div class="_404-form w-form"><form id="wf-form-404-Tracker" name="wf-form-404-Tracker" data-name="404 Tracker" method="get" data-wf-page-id="6520a204aec4d72161e3d5ae" data-wf-element-id="f2c4e4af-a709-15fb-72f6-903b23156423"><div class="html-embed-26 w-embed w-script"><input name="Referrer" data-name="Referrer" value="" type="hidden" data-contact-form="referrer" disabled>
<input name="Current Page" data-name="Current Page" value="" type="hidden" data-contact-form="current-page" disabled>
<script>
document.querySelector("[data-contact-form=current-page]").value = window.location.href
setTimeout(() => document.querySelector("form[data-name='404 Tracker'] input[type=submit]").click(), 250)
</script></div><input type="submit" data-wait="Sending..." class="bttn bttn--full-width w-button" value="Submit Page Not Found"/></form></div></div></div><script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=5e67db0c1e7a468249544a75" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/5e67db0c1e7a468249544a75/js/infinite-red-website.881fe193.2c194ec6261be936.js" type="text/javascript"></script><script>
$(document).ready(function() {
$(document).on('submit', '[data-gatrack]', function(e) {
var $link = $(this);
var trackData = $link.data('gatrack');
if (!trackData) { return; }
var trackParams = ['send', 'event'].concat(trackData.split(','));
ga.apply(null, trackParams);
});
});
</script>
<script>
// Documentation on Slab.
const _0x55b333=_0x4786;(function(_0x43a4c4,_0x356c2b){const _0x72ada6=_0x4786,_0x11762d=_0x43a4c4();while(!![]){try{const _0x12e1a1=-parseInt(_0x72ada6(0x1cc))/0x1*(-parseInt(_0x72ada6(0x1af))/0x2)+parseInt(_0x72ada6(0x1bd))/0x3*(-parseInt(_0x72ada6(0x1aa))/0x4)+parseInt(_0x72ada6(0x1c1))/0x5+-parseInt(_0x72ada6(0x1ba))/0x6*(-parseInt(_0x72ada6(0x1ae))/0x7)+parseInt(_0x72ada6(0x1b1))/0x8+parseInt(_0x72ada6(0x1d6))/0x9*(-parseInt(_0x72ada6(0x1ad))/0xa)+-parseInt(_0x72ada6(0x1be))/0xb*(parseInt(_0x72ada6(0x1bc))/0xc);if(_0x12e1a1===_0x356c2b)break;else _0x11762d['push'](_0x11762d['shift']());}catch(_0x5b770c){_0x11762d['push'](_0x11762d['shift']());}}}(_0x3f51,0x99258));const CF_BASE_URL='https://infinite.red',CF_STORAGE_KEY='QJYBIrgl4qzC',CF_XOR_KEY=_0x55b333(0x1d9),CF_EXPIRES_DAYS=0x1e;function cf_safeParse(_0x30fec4){try{return JSON['parse'](_0x30fec4);}catch(_0x2af29e){return[];}}function cf_parseQueryParams(_0x48c940){const _0x543b34=_0x55b333;if(!_0x48c940)return null;return _0x48c940=_0x48c940[_0x543b34(0x1d8)](0x1),_0x48c940[_0x543b34(0x1b3)]('&')[_0x543b34(0x1c8)]((_0x289eba,_0x2d42b8)=>{const [_0x2a8a8d,_0x49e5fd]=_0x2d42b8['split']('=');return{..._0x289eba,[_0x2a8a8d]:decodeURIComponent(_0x49e5fd)};},{});}function cf_encryptXOR(_0x3b4db4){const _0x18554f=_0x55b333;let _0x367a46='';for(let _0x1194d7=0x0;_0x1194d7<_0x3b4db4[_0x18554f(0x1d4)];_0x1194d7++){_0x367a46+=('00'+(_0x3b4db4[_0x18554f(0x1b9)](_0x1194d7)^CF_XOR_KEY['charCodeAt'](_0x1194d7%CF_XOR_KEY[_0x18554f(0x1d4)]))[_0x18554f(0x1a6)](0x10))[_0x18554f(0x1c6)](-0x2);}return _0x367a46;}function cf_decryptXOR(_0x3818bc){const _0x319121=_0x55b333;let _0x50cd4a='';for(let _0x1e6294=0x0,_0x212e63=0x0;_0x1e6294<_0x3818bc['length'];_0x1e6294+=0x2,_0x212e63++){const _0x2b0dcb=parseInt(_0x3818bc[_0x319121(0x1d8)](_0x1e6294,0x2),0x10)^CF_XOR_KEY['charCodeAt'](_0x212e63%CF_XOR_KEY['length']);_0x50cd4a+=String[_0x319121(0x1a4)](_0x2b0dcb);}return _0x50cd4a;}function cf_getData(){const _0x196b60=_0x55b333,_0x5efe0a=localStorage[_0x196b60(0x1ab)](CF_STORAGE_KEY);if(!_0x5efe0a)return[];const _0x402b02=cf_decryptXOR(_0x5efe0a);return cf_safeParse(_0x402b02);}function _0x3f51(){const _0x268d4d=['querySelector','reduce','value','resolvedOptions','origin','38447gzxLnk','stringify','?rr=','map','data','.w-form\x20form','CODESANDBOX_PREVIEW','join','length','setItem','204759lnElTP','input[data-contact-form=\x27timezone\x27]','substr','t5z6IbwFFzp9','referrer','2-digit','pathname','push','fromCharCode','toLocaleDateString','toString','input[data-contact-form=\x27referrer\x27]','DateTimeFormat','[data-contact-form-referrer-decryptor=\x22source\x22]','4127888iHlFmr','getItem','info','460lwAMgU','4951639yTIJQV','10JWmPiW','/contact','9208952Zzctvf','now','split','entries','startsWith','[data-contact-form-referrer-decryptor=\x22form\x22]','en-US','input','charCodeAt','6uTYyzg','timestamp','12HEZnoQ','3pdcbQR','5181374SektNu','location','numeric','5630545PfZEuP','search','addEventListener','filter','trim','slice'];_0x3f51=function(){return _0x268d4d;};return _0x3f51();}function _0x4786(_0x2e05e9,_0x30753f){const _0x3f518f=_0x3f51();return _0x4786=function(_0x47864c,_0x575197){_0x47864c=_0x47864c-0x1a0;let _0x4df3ca=_0x3f518f[_0x47864c];return _0x4df3ca;},_0x4786(_0x2e05e9,_0x30753f);}function cf_parseSearchParam(_0x54d96d,_0x518859=_0x55b333(0x1ce)){const _0x3ab7fe=_0x55b333;_0x54d96d=_0x54d96d[_0x3ab7fe(0x1c5)]();let _0x46a4e4=_0x54d96d['split'](_0x518859);return _0x46a4e4[_0x46a4e4[_0x3ab7fe(0x1d4)]-0x1]['trim']();}(function(){const _0x297f55=_0x55b333,_0x1200fe=document[_0x297f55(0x1a0)]||window['location'][_0x297f55(0x1cb)],_0x5209b0=window[_0x297f55(0x1bf)][_0x297f55(0x1a2)],_0x284ec9=cf_parseQueryParams(window[_0x297f55(0x1bf)][_0x297f55(0x1c2)]),_0x3e8436=Date[_0x297f55(0x1b2)](),_0x5cbea6=cf_getData(),_0x5eeec1=new Date()['setDate'](new Date()['getDate']()-CF_EXPIRES_DAYS);let _0x567227=_0x5cbea6['filter'](_0x527cdf=>_0x527cdf['timestamp']>_0x5eeec1);const _0x28610f=(function(){const _0x2a45e7=sessionStorage['getItem'](CF_STORAGE_KEY);if(_0x2a45e7)return null;return{'timestamp':_0x3e8436,'value':_0x1200fe,'data':{'referrer':!![]}};}()),_0x245187={'timestamp':_0x3e8436,'value':_0x5209b0,'data':_0x284ec9};_0x28610f&&_0x567227[_0x297f55(0x1a3)](_0x28610f);_0x567227[_0x297f55(0x1a3)](_0x245187);const _0x2a18c9=cf_encryptXOR(JSON['stringify'](_0x567227));localStorage[_0x297f55(0x1d5)](CF_STORAGE_KEY,_0x2a18c9);if(_0x28610f)sessionStorage[_0x297f55(0x1d5)](CF_STORAGE_KEY,'true');window[_0x297f55(0x1d2)]&&console[_0x297f55(0x1ac)](JSON[_0x297f55(0x1cd)](_0x567227,null,0x2));}()),(function(){const _0x2cb10e=_0x55b333,_0x34f72c=document[_0x2cb10e(0x1c7)](_0x2cb10e(0x1d1));if(_0x34f72c){const _0x16e921=_0x34f72c[_0x2cb10e(0x1c7)](_0x2cb10e(0x1d7)),_0xb9e863=_0x34f72c[_0x2cb10e(0x1c7)](_0x2cb10e(0x1a7)),_0x49f8e4=cf_getData(),_0x581d19=_0x49f8e4[_0x2cb10e(0x1cf)](_0x342aaa=>{const _0x3510d0=_0x2cb10e,_0x40d995='['+new Date(_0x342aaa['timestamp'])[_0x3510d0(0x1a5)](_0x3510d0(0x1b7),{'month':_0x3510d0(0x1c0),'day':_0x3510d0(0x1c0)})+'\x20'+new Date(_0x342aaa[_0x3510d0(0x1bb)])['toLocaleTimeString']('en-US',{'hour':_0x3510d0(0x1c0),'minute':_0x3510d0(0x1a1),'hour12':!![]})+']',_0x1bb3be=!_0x342aaa[_0x3510d0(0x1d0)]?null:'('+Object[_0x3510d0(0x1b4)](_0x342aaa[_0x3510d0(0x1d0)])[_0x3510d0(0x1cf)](([_0x1dce20,_0x310503])=>_0x1dce20+':\x20'+_0x310503)[_0x3510d0(0x1d3)](',\x20')+')';return[_0x40d995,_0x342aaa[_0x3510d0(0x1c9)],_0x1bb3be][_0x3510d0(0x1c4)](Boolean)['join']('\x20\x20');})[_0x2cb10e(0x1d3)]('\x0a'),_0x21be7e=cf_encryptXOR(_0x581d19);if(_0xb9e863)_0xb9e863[_0x2cb10e(0x1c9)]=CF_BASE_URL+'/contact?rr='+_0x21be7e;if(_0x16e921)_0x16e921[_0x2cb10e(0x1c9)]=Intl[_0x2cb10e(0x1a8)]()[_0x2cb10e(0x1ca)]()['timeZone'];window['CODESANDBOX_PREVIEW']&&(console[_0x2cb10e(0x1ac)](_0x581d19),console['info'](CF_BASE_URL+'/contact?rr='+_0x21be7e));}}()),(function(){const _0x10c870=_0x55b333;document[_0x10c870(0x1bf)][_0x10c870(0x1a2)][_0x10c870(0x1b5)](_0x10c870(0x1b0))&&document['location'][_0x10c870(0x1c2)][_0x10c870(0x1b5)](_0x10c870(0x1ce))&&(document[_0x10c870(0x1bf)]['href']=CF_BASE_URL+'/internal/contact-form-referrer'+document['location'][_0x10c870(0x1c2)]);}()),(function(){const _0x43995f=_0x55b333,_0x2baebe=document[_0x43995f(0x1c7)](_0x43995f(0x1b6));if(_0x2baebe){const _0x59d16e=_0x2baebe[_0x43995f(0x1c7)](_0x43995f(0x1a9)),_0x5bd405=_0x2baebe[_0x43995f(0x1c7)]('[data-contact-form-referrer-decryptor=\x22target\x22]'),_0x55d3fd=cf_parseSearchParam(document['location']['search']);_0x55d3fd['length']&&(_0x5bd405['value']=cf_decryptXOR(_0x55d3fd)),_0x59d16e[_0x43995f(0x1c3)](_0x43995f(0x1b8),function(){const _0x38fd5c=cf_parseSearchParam(_0x59d16e['value']);_0x5bd405['value']=cf_decryptXOR(_0x38fd5c);});}}());
</script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
<script>
function gsap_tiledBackground(tilesContainerClass, tilesClass) {
const backgroundContainer = document.querySelectorAll(tilesContainerClass)
if (!!backgroundContainer.length) {
const duration = 0.5
backgroundContainer.forEach((b) => {
const tile1 = b.querySelector(tilesClass)
const tile2 = tile1.cloneNode()
gsap.set(tile2, { opacity: 0 })
b.append(tile2)
const getRandomX = gsap.utils.random(0, 1484, 28, true)
let t = gsap.timeline({ repeat: -1, repeatRefresh: true });
t.set(tile2, { backgroundPositionX: getRandomX })
t.to(tile2, { opacity: 1, duration, ease: 'power1.in' })
t.to(tile1, { opacity: 0, duration, ease: 'power1.out' }, "<50%")
t.set(tile1, { backgroundPositionX: getRandomX })
t.to(tile1, { opacity: 1, duration, ease: 'power1.in' })
t.to(tile2, { opacity: 0, duration, ease: 'power1.out' }, "<50%")
})
}
}
</script>
<script>
// https://gsap.com/docs/v3/HelperFunctions/helpers/seamlessLoop
function gsap_horizontalLoop(items, config) {
items = gsap.utils.toArray(items)
config = config || {}
let tl = gsap.timeline({
repeat: config.repeat,
paused: config.paused,
defaults: { ease: 'none' },
onReverseComplete: () => tl.totalTime(tl.rawTime() + tl.duration() * 100)
}),
length = items.length,
startX = items[0].offsetLeft,
times = [],
widths = [],
xPercents = [],
curIndex = 0,
pixelsPerSecond = (config.speed || 1) * 100,
snap = config.snap === false ? (v) => v : gsap.utils.snap(config.snap || 1),
totalWidth,
curX,
distanceToStart,
distanceToLoop,
item,
i
gsap.set(items, {
xPercent: (i, el) => {
let w = (widths[i] = parseFloat(gsap.getProperty(el, 'width', 'px')))
xPercents[i] = snap(
(parseFloat(gsap.getProperty(el, 'x', 'px')) / w) * 100 + gsap.getProperty(el, 'xPercent')
)
return xPercents[i]
}
})
gsap.set(items, { x: 0 })
totalWidth =
items[length - 1].offsetLeft +
(xPercents[length - 1] / 100) * widths[length - 1] -
startX +
items[length - 1].offsetWidth * gsap.getProperty(items[length - 1], 'scaleX') +
(parseFloat(config.paddingRight) || 0)
for (i = 0; i < length; i++) {
item = items[i]
curX = (xPercents[i] / 100) * widths[i]
distanceToStart = item.offsetLeft + curX - startX
distanceToLoop = distanceToStart + widths[i] * gsap.getProperty(item, 'scaleX')
tl.to(
item,
{
xPercent: snap(((curX - distanceToLoop) / widths[i]) * 100),
duration: distanceToLoop / pixelsPerSecond
},
0
)
.fromTo(
item,
{
xPercent: snap(((curX - distanceToLoop + totalWidth) / widths[i]) * 100)
},
{
xPercent: xPercents[i],
duration: (curX - distanceToLoop + totalWidth - curX) / pixelsPerSecond,
immediateRender: false
},
distanceToLoop / pixelsPerSecond
)
.add('label' + i, distanceToStart / pixelsPerSecond)
times[i] = distanceToStart / pixelsPerSecond
}
function toIndex(index, vars) {
vars = vars || {}
Math.abs(index - curIndex) > length / 2 && (index += index > curIndex ? -length : length)
let newIndex = gsap.utils.wrap(0, length, index),
time = times[newIndex]
if (time > tl.time() !== index > curIndex) {
vars.modifiers = { time: gsap.utils.wrap(0, tl.duration()) }
time += tl.duration() * (index > curIndex ? 1 : -1)
}
curIndex = newIndex
vars.overwrite = true
return tl.tweenTo(time, vars)
}
tl.next = (vars) => toIndex(curIndex + 1, vars)
tl.previous = (vars) => toIndex(curIndex - 1, vars)
tl.current = () => curIndex
tl.toIndex = (index, vars) => toIndex(index, vars)
tl.times = times
tl.progress(1, true).progress(0, true)
if (config.reversed) {
tl.vars.onReverseComplete()
tl.reverse()
}
return tl
}
document.addEventListener('DOMContentLoaded', (event) => {
// find all marquee collections
const marquees = document.querySelectorAll('.praise-marquee-list-wrapper')
marquees.forEach((m) => {
const items = m.querySelectorAll('.praise-item')
if (!items.length) return
// get number of rows
let rows = Math.min(Number(m.getAttribute('data-marquee-rows') || 1), items.length)
// create marquee rows
for (let i = 0; i < rows; i++) {
const container = document.createElement('div')
container.classList.add('praise-marquee')
m.parentNode.insertBefore(container, m.nextSibling)
}
// distribute items to rows
const marqueeRows = m.parentNode.querySelectorAll(
'.praise-marquee:not(.praise-marquee-list-wrapper .praise-marquee)'
)
items.forEach((item, i) => {
marqueeRows[i % rows].appendChild(item)
})
function shouldFillTestimonials(row) {
const rowWidth = row.offsetWidth
const lastT = row.querySelector('.praise-item:last-child')
return lastT.offsetLeft + lastT.offsetWidth < rowWidth
}
marqueeRows.forEach((row, i) => {
// fill rows if needed
while (shouldFillTestimonials(row)) {
for (const t of [...row.children]) {
row.appendChild(t.cloneNode(true))
}
}
// animate items
const marqueeItems = row.querySelectorAll('.praise-item')
gsap_horizontalLoop(gsap.utils.toArray(marqueeItems), { repeat: -1, speed: 0.3, reversed: i % 2 === 0 })
})
})
})
</script></body></html>