PageSourceSearch

https://leadbru.com/extensions

html leadbru.com collected 2026-09-24 14:46:30 UTC 174,222 bytes, 4,110 lines download raw bytes

1<!DOCTYPE html>
2<!--[if IE 8]> <html lang="en" class="ie8 no-js"> <![endif]-->
3<!--[if IE 9]> <html lang="en" class="ie9 no-js"> <![endif]-->
4<!--[if !IE]><!-->
5<html lang="en">
6<!--<![endif]-->
7<!-- BEGIN HEAD -->
8
9<head>
10  <meta charset="utf-8" />
11  <meta name="description" content="Description" />
12  <meta name="keywords" content="Keywords" />
13  <title>Browser Extensions</title>
14  <meta http-equiv="X-UA-Compatible" content="IE=edge">
15  
16  <meta name="apple-mobile-web-app-capable" content="yes" />
17  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1" />
18  <link rel="dns-prefetch" href="https://cdnjs.cloudflare.com/">
19  <link rel="dns-prefetch" href="https://fonts.googleapis.com/">
20
21  <link href="https://fonts.googleapis.com/css2?family=Overpass:wght@100;200;300;400;600;700&display=swap" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet'" />
22
23      <link rel="preconnect" href="https://fonts.googleapis.com">
24    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
25  
26      <link href="//fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet'" />
27    <noscript>
28      <link href="//fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet" type="text/css" media="all">
29    </noscript>
30  
31  <!--sitekit_code-->
32    <!--end_sitekit_code-->
33
34  
34<script src="/resources/assets/site/forms/crmco-page.js?cache=1748030516" defer></script>
34
35
36      <link rel="shortcut icon" href="/assets/favicon.png" type="image/png" />
37  
38  <style>
39    /** start overwrite the user agent stylesheet */
40    * {
41      box-sizing: border-box
42    }
43
44    h1,
45    h2,
46    h3,
47    h4,
48    h5,
49    h6,
50    p,
51    div,
52    img,
53    ul,
54    li,
55    ol {
56      margin-block-start: 0px;
57      margin-block-end: 0px;
58      margin-inline-start: 0px;
59      margin-inline-end: 0px;
60    }
61
62    ul {
63      list-style: none;
64    }
65    .noAnime {
66      animation: unset !important;
67    }
68    /** end overwrite the user agent stylesheet */
69    * { box-sizing: border-box; } body {margin: 0;}:root{--crm-section-container-max-width:1170px;}.gjs-row{position:relative;display:flex;flex-wrap:wrap;text-align:left;max-width:100%;width:100%;padding:10px;}.cell-1 > .gjs-cell{flex:auto;}.cell-2 > .gjs-cell{flex:1;}.cell-3 > .gjs-cell{flex:1;}.cell-4 > .gjs-cell{flex:1;}.gjs-cell{min-height:75px;position:relative;box-sizing:border-box;}.crm-text i, .crm-text u, .crm-text b, .crm-text strong, .crm-text strike, .crm-text span{display:inline !important;width:auto;}.crm-text .crm-text{display:inline !important;width:auto;}.short-animate{-webkit-transition:.5s ease-in-out;-moz-transition:.5s ease-in-out;-ms-transition:.5s ease-in-out;-o-transition:.5s ease-in-out;transition:.5s ease-in-out;}.lightbox{position:fixed;display:flex;background:rgba(0, 0, 0, 0.2);z-index:501;opacity:0;width:100%;}.lightbox-controls{display:block;position:absolute;overflow:hidden;z-index:502;width:fit-content;}.lightbox:target{top:0%;bottom:0%;opacity:1;}.lightbox:target ~  lightbox-controls{top:0px;}i{text-align:center;height:auto;line-height:inherit;display:flex;justify-content:center;align-items:center;margin:5px;transition-duration:0.3s;transition-property:color, box-shadow, background, border;min-height:1rem;min-width:1rem;}.crm-background-video{height:100%;pointer-events:none;}.crm-background-video > iframe{border:none;width:100%;position:absolute;overflow:hidden;}.crm-bg{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%;z-index:-1;overflow:hidden;}.crm-bg-color{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%;}.crm-bg-image{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%;background-repeat:no-repeat;background-size:cover;}.crm-buttons{display:flex;justify-content:center;font-family:Overpass, sans-serif;padding:5px 0;}.crm-button{font-size:15px;padding:14px 14px 14px 14px;border:2px solid rgba(14, 164, 233, 1);font-weight:700;line-height:1.6;cursor:pointer;border-radius:2px;display:flex;justify-content:space-between;align-items:center;text-decoration:none;transition-duration:0.3s;transition-property:color, box-shadow, background, border;}.video1-wrapper{display:flex;justify-content:center;width:100%;height:auto;padding:0px;}.video1{width:100%;padding:0;display:flex;justify-content:center;align-items:center;background-color:transparent;margin:5px 0px;position:relative;}.video1-inner{width:100%;padding-top:56.25%;}.video1-cover{display:none;overflow:hidden;width:100%;position:absolute;top:0px;height:100% !important;z-index:999;}.cover-image{height:100%;width:100%;object-fit:cover !important;}.cover-image-play{border-radius:50%;bottom:50%;top:50%;width:10%;position:absolute;left:0;right:0;margin:auto;padding:50px;opacity:0.8;}.cover-image-play:hover{opacity:1;cursor:pointer;}.cover-image-play i{position:absolute;left:50%;top:50%;transform:translate(-60%, -70%);}video{width:100%;margin:auto;position:absolute;top:0px;height:100%;}@media (max-width: 19200px){body, h1, h2, h3, h4, h5, h6, p, div, img, ul, li, ol, dl{margin-block-start:0
69px;margin-block-end:0px;margin-inline-start:0px;margin-inline-end:0px;}div.default-color{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:20px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}label{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:20px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}p{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:20px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h1{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:86px;font-weight:900;line-height:normal;letter-spacing:normal;font-style:normal;color:rgba(29, 46, 59, 1);text-decoration:inherit;}h2{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:42px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h3{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:32px;font-weight:600;line-height:normal;letter-spacing:normal;font-style:normal;color:rgba(0, 0, 0, 1);text-decoration:inherit;}h4{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:22px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h5{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:1.4;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}.crm-button p{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:24px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:inherit;color:#ffffff;text-decoration:inherit;}.crm-button i{font-size:24px;line-height:normal;letter-spacing:normal;font-style:inherit;color:#ffffff;text-decoration:inherit;}#isp8{width:100%;display:grid;grid-template-columns:100%;}#ikz5{grid-row-gap:10px;grid-column-gap:10px;margin:auto;}#i42o{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#iz5s{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#ie7v{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#i809{display:inline-flex;justify-content:center;align-self:center;transition-duration:0.3s;transition-property:color, box-shadow, background, border;flex-basis:content;width:100%;max-width:100%;text-align:center;}#iu4r{width:100%;display:grid;grid-template-columns:100%;grid-row-gap:10px;}#iowy8{grid-row-gap:10px;grid-column-gap:10px;margin:auto;}#idio3{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;padding:25px 25px 25px 25px;}#iu7qg{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#i0yxo{grid-row-gap:10px;grid-column-gap:10px;margin:auto;}#iaapb{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#in5sg{height:auto;display:flex;flex-direction:column;align-items:center;max-width:100%;width:100%;}#i8bm1{display:inline-flex;justify-content:center;align-self:center;transition-duration:0.3s;transition-property:color, box-shadow, background, border;flex-basis:content;width:100%;max-width:100%;text-align:center;margin:10px 10px 10px 10px;}#ifmow{width:auto;display:inline;}#iv0rv{display:inline-flex;justify-content:flex-start;align-self:flex-start;transition-duration:0.3s;transition-property:color, box-shadow, background, border;flex-basis:content;width:100%;max-width:100%;text-align:left;font-weight:400;margin:10px 10px 10px 10px;}#iv0rv p{font-weight:400;}#i4ypg{background-color:rgba(0, 0, 0, 0.3);justify-content:center;top:-100%;bottom:100%;left:0;right:0;display:flex;}#iq4yy{background-color:white;align-self:center;min-width:5%;max-height:calc(100vh - 60px);height:auto;min-height:60%;flex-direction:column;justify-content:flex-start;align-items:stretch;overflow:hidden;display:flex;width:100%;max-width:85%;position:relative;padding:50px 50px 50px 50px;}#idjtq{top:0;right:0;position:absolute;cursor:pointer;}#ipiri{color:#0dacff;text-decoration:none;text-align:center;font-size:32px;height:auto;display:flex;justify-content:center;align-items:center;margin:5px;transition-duration:0.3s;transition-property:color, box-shadow, background, border;}#iao4x{width:100%;height:100%;flex-direction:inherit;justify-content:inherit;align-items:inherit;display:flex;overflow:auto;position:relative;}#isvvl{height:951px;width:1690.6666666666665px;top:0.0546875px;left:-290.89583333333326px;}#iaqsi{min-height:auto;width:100%;text-align:center;height:auto;position:relative;}#i6mh6{display:flex;justify-content:center;align-items:center;padding:0px;width:100%;flex-basis:content;}#izorh{background-color:#0dacffff;border-color:#0dacffff;border-style:solid;border-width:0px;cursor:pointer;border-radius:2px;display:flex;justify-content:center;align-items:center;margin:10px 10px 10px 10px;width:250px;max-width:100%;height:55px;}#im69g{margin:0px 5px;}#i84ni{width:auto;display:inline;}#i932i{width:auto;display:inline;}#if68u{width:100%;height:100%;overflow:hidden;ft-file-processing:1;ft-video-id:3k26by;}#i2bz3{width:100%;height:auto;min-height:40px;}#iwx9o{z-index:2;}#isvff{width:auto;display:inline;}#ioq7q{display:none;height:auto;}#i3ucf{width:110px;background-color: rgba(14, 164, 233, 0.4);}#i5dno{color:#0dacff;text-decoration:none;text-align:center;font-size:32px;}#i7x45{border:none;position:absolute;top:0;height:100%;width:100%;}}@media (max-width: 768px){.gjs-row{flex-wrap:wrap;}.cell-2 > .gjs-cell{flex:auto;}.cell-3 > .gjs-cell{flex:auto;}.cell-4 > .gjs-cell{flex:auto;}}@media (max-width: 480px){body, h1, h2, h3, h4, h5, h6, p, div, img, ul, li, ol, dl{margin-block-start:0
69px;margin-block-end:0px;margin-inline-start:0px;margin-inline-end:0px;}div.default-color{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:16px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}label{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:16px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}p{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:16px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h1{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:56px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h2{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:42px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:inherit;color:#000000;text-decoration:none;}h3{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:32px;font-weight:600;line-height:normal;letter-spacing:normal;font-style:inherit;color:rgba(0, 0, 0, 1);text-decoration:inherit;}h4{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h5{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}h6{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:26px;font-weight:500;line-height:1.4;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}.crm-button p{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI emoji;font-size:12px;font-weight:700;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}.crm-button i{font-size:12px;line-height:normal;letter-spacing:normal;font-style:normal;color:#000000;text-decoration:inherit;}}  </style>
70
71  
71<script>
72    var formFbData="";
73    try{
74      var fbc = localStorage.getItem("_fbc");
75      var fbp = localStorage.getItem("_fbp");
76      formFbData = "fbc=" + fbc;
77      if (fbp) {
78        formFbData = formFbData + "&fbp=" + fbp;
79      }
80    
81    }catch(e){
82
83    }
84    var is_test_server=false;    
85    var is_public_calendar=false;
86  </script>
86
87
88  
89      <link rel="preload" href="//unpkg.com/[email protected]/dist/formio.full.min.css" id="crmco-formlib-style" as="style" onload="this.onload=null;this.rel='stylesheet'" />
90    <link rel="preload" href="/resources/assets/site/form-themes/default.min.css" id="crmco-form-theme-default-style" as="style" onload="this.onload=null;this.rel='stylesheet'">
91    <!--link rel="preload" href="/resources/assets/site/forms/commonlib.js?cache=1748030516" as="script"-->
92    <!--link rel="preload" href="/resources/assets/site/forms/formlib.js?cache=1748030516" as="script"-->
93    <link rel="preload" href="/resources/assets/site/forms/custom-form-component.js?cache=1748030516" as="script">
94    <link rel="preload" href="/resources/assets/site/forms/crmco-form.js?cache=1748030516" as="script">
95
96    
96<script src="/resources/site/form/supportdata/t1uvdp?v=1748030516" async></script>
96
97    <noscript>
98      <link rel="stylesheet" href="//unpkg.com/[email protected]/dist/formio.full.min.css" id="crmco-formlib-style" />
99      <link rel="stylesheet" href="/resources/assets/site/form-themes/default.min.css" id="crmco-form-theme-default-style" />
100    </noscript>
101    <!--script src="/resources/assets/site/forms/commonlib.js?cache=1748030516" id="crmco-commonlib-js" defer></!--script-->
102    <!--script src="/resources/assets/site/forms/formlib.js?cache=1748030516" id="crmco-formlib-js" defer></!--script-->
103    
103<script src="/resources/assets/site/forms/custom-form-component.js?cache=1748030516" id="crmco-custom-form-component-js" defer></script>
103
104    
104<script src="/resources/assets/site/forms/crmco-form.js?cache=1748030516" id="crmco-form-js" defer></script>
104
105
106    <link rel="preload" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
107  <link rel="preload" href="//cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'" />
108  <noscript>
109    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" />
110    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" />
111  </noscript>
112
113  
113<script type="text/javascript">
114    function randomEventId(prefixLength) {
115      var str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
116      var result = '';
117      for (var i = prefixLength; i > 0; --i)
118        result += str[Math.floor(Math.random() * str.length)];
119      return result + '-' + new Date().getTime();
120    }
121    window.jsVersion = '?cache=1748030516';
122    window.isDevJs = 0;
123    window.crmcoSt = '962k0c';
124    window.crmcoPage = 't1uvdp';
125    window.crmcoSite = 'p7qpe';
126    /*window.crmcoFacebookEvents = [];*/
127    window.enableFbTrack = false;
128    window.fbEventId = randomEventId(7);
129    window.loadTime = 5;
130    window.scriptLoaded = false;
131
132    const loadScriptsTimer = setTimeout(triggerScriptLoad, window.loadTime * 1000);
133    const userInteractionEvents = ["mouseover", "keydown", "touchstart", "touchmove", "wheel"];
134    userInteractionEvents.forEach(function(event) {
135      window.addEventListener(event, triggerScriptLoad, {
136        passive: !0
137      })
138    });
139
140    /*
141          */
142
143      function app_fb() {
144        if (window.scriptLoaded === true) {
145          return;
146        }
147        window.scriptLoaded = true;
148
149        var fbc = null;
150        try{
151          fbc = window.localStorage.getItem("_fbc");
152        }catch(e){
153          console.log("get fbc error",e);
154        }
155        
156        if (!fbc || fbc.indexOf("fb.1.7777777777777.AbCdEfGhIjKlMnOpQrStUvWxYz") == -1) {
157          console.log("fire fb");
158          ! function(f, b, e, v, n, t, s) {
159            if (f.fbq) return;
160            n = f.fbq = function() {
161              n.callMethod ?
162                n.callMethod.apply(n, arguments) : n.queue.push(arguments)
163            };
164            if (!f._fbq) f._fbq = n;
165            n.push = n;
166            n.loaded = !0;
167            n.version = '2.0';
168            n.queue = [];
169            t = b.createElement(e);
170            t.async = !0;
171            t.src = v;
172            s = b.getElementsByTagName(e)[0];
173            s.parentNode.insertBefore(t, s)
174          }(window, document, 'script', '//connect.facebook.net/en_US/fbevents.js');
175
176          if (typeof window.fireFacebookEventNew == 'function') {
177            console.log("fireFacebookEventNew 1");
178            window.fireFacebookEventNew();
179          } else {
180            window.addEventListener("DOMContentLoaded", function() {
181              console.log("fireFacebookEventNew 2")
182              window.fireFacebookEventNew?.();
183            })
184          }
185        }
186        
187      }
188
189  
190    function triggerScriptLoad() {
191      loadScripts();
192      clearTimeout(loadScriptsTimer);
193
194      userInteractionEvents.forEach(function(event) {
195        window.removeEventListener(event, triggerScriptLoad, {
196          passive: !0
197        })
198      })
199
200    }
201
202    function app_inspect() {
203      /*site_interaction_scripts*/
204            /*end_site_interaction_scripts*/
205          }
206
207    function loadScripts() {
208      document.querySelectorAll("script[data-type='lazy']").forEach(function(elem) {
209        elem.setAttribute("src", elem.getAttribute("data-src"))
210      })
211            app_fb();
212      app_inspect();
213    }
214  </script>
214
215
216        
217  <!--site_header_code-->
218      <meta property="og:image" content="https://www.app.leadbru.com/assets/aws/st_962k0c/site_p7qpe/assets/LeadBru-4_5s7RjGDT_thumb.png"/>    <!--end_site_header_code-->
219    </head>
220
221<body class=" ">
222  <!--site_body_start_code-->
223    <!--end_site_body_start_code-->
224  
225  <div id="wrapper"><div id="isp8" class="crm-grid-wrapper"><div ColumnGap="10px" RowGap="10px" id="ikz5" class="gjs-row cell-1"><div ColumnGap="10px" RowGap="10px" id="i42o" class="gjs-cell"><div id="i809" class="crm-text"><h2 id="iahq">LeadBru&#039;s Browser Extensions</h2></div></div><div ColumnGap="10px" RowGap="10px" id="iz5s" class="gjs-cell"></div><div ColumnGap="10px" RowGap="10px" id="ie7v" class="gjs-cell"></div></div></div><div id="iu4r" class="crm-grid-wrapper"><div ColumnGap="10px" RowGap="10px" id="iowy8" class="gjs-row cell-2"><div ColumnGap="10px" RowGap="10px" id="idio3" class="gjs-cell"><div id="i8bm1" class="crm-text"><p id="it0qi">REDA Browser Extension</p></div><div id="i2bz3">WARNING: Firefox Extension Not Available Yet</div><div id="iv0rv" class="crm-text"><p id="il6w7">A browser extension that allows you to capture property details from Zillow. You can calculate different investment strategies, make notes, create follow-up tasks and reopen the property in Zillow and RentCast. </p></div><div id="i6mh6" class="crm-buttons"><a id="izorh" ft-href="https://chromewebstore.google.com/detail/real-estate-deal-analyzer/dkjlckkpbiebmepehppdjbhdkchjkiek?pli=1" href="https://chromewebstore.google.com/detail/real-estate-deal-analyzer/dkjlckkpbiebmepehppdjbhdkchjkiek?pli=1" class="crm-button"><div id="im69g" class="crm-button-text"><p id="ig2rp">Get It Now!</p></div></a></div><!--popup-i4ypg-start--><div ft-change-transition="top" id="i4ypg" class="popup-wrapper lightbox short-animate"><div ft-show-position="center" ft-icon-position="topRight" ft-auto-popup="No" id="iq4yy" class="popup"><a id="idjtq" class="lightbox-controls"><i id="ipiri" class="fas fa-times"></i></a><div id="iao4x" class="popup-inner"><div class="crmco-form default" input_id="guav00" form_id="ohqsbi" id="iaqsi"><div id="ics9i"><div style="margin:0 auto;text-align:center"><svg selectable="false" class="icon-loading" height="38" width="38" viewBox="0 0 38 38" overflow="visible"><g transform="translate(1 1)" fill="none" fill-rule="evenodd" stroke="#1dcafe" stroke-width="2"><circle stroke-opacity="0.5" cx="18" cy="18" r="18"></circle><path d="M36 18c0-9.94-8.06-18-18-18"><animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indefinite"></animateTransform></path></g></svg></div></div></div></div></div><div detect-type="popup-wrapper" id="i7yj1" class="crm-bg"><div detect-type="popup-wrapper" id="iuzwd" class="crm-bg-image"></div><div detect-type="popup-wrapper" id="ifpel" class="crm-background-video"><iframe id="isvvl" class="crm-background-youtube"></iframe></div><div detect-type="popup-wrapper" id="iw2x5" class="crm-bg-color"></div></div></div><!--popup-i4ypg-end--></div>
225<div ColumnGap="10px" RowGap="10px" id="iu7qg" class="gjs-cell"><div id="i8t8a" class="video1-wrapper"><div id="if68u" class="video1"><div id="i98r7" class="video1-inner"><div id="ioq7q" class="video1-cover"><img src="" class="cover-image"/><div id="i3ucf" class="cover-image-play"><i id="i5dno" class="fa fa-play"></i></div></div><iframe src="https://iframe.mediadelivery.net/embed/78766/f731befd-f0f1-44dd-a57a-e4922e8a6d38?autoplay=true&muted=true" loading="lazy" allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture;" allowfullscreen="true" id="i7x45" class="video1-custom"></iframe></div></div></div></div></div><div ColumnGap="10px" RowGap="10px" id="i0yxo" class="gjs-row cell-2"><div ColumnGap="10px" RowGap="10px" id="iaapb" class="gjs-cell"></div><div ColumnGap="10px" RowGap="10px" id="in5sg" class="gjs-cell"></div></div></div></div>
225<script>var items = document.querySelectorAll('#isp8, #iu4r');
226          for (var i = 0, len = items.length; i < len; i++) {
227            (function(){
228
229  /**
230   * This function manages the mouseOver and mouseOut of the element
231   */
232  const manageMouseOver = (add=true) => {
233    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
234      return;
235    }
236    console.log("manageMouseOver",add);
237    var timer=null;
238    const onmouseenter = () => {
239      if (!timer) {
240        setTimeout(() => {
241          this.classList.remove("noAnime"); 
242          console.log("onmouseenter");
243        }, 50);
244        // if there was no timer and the animation is just run, then add the timer again.
245        timer = setTimeout(() => {
246          console.log("onmouseenter 1");
247          requestAnimationFrame(() => {
248            console.log("onmouseenter 2");
249            timer = null;
250          });
251        }, 100)
252      }
253    }
254    const onmouseleave = () => {
255      requestAnimationFrame(() => {
256        if (!timer && !this.classList.contains("noAnime")) {
257          console.log("onmouseleave");
258          this.classList.add("noAnime");
259          timer=null;
260        }
261      });
262    }
263    if(add){  
264      //this.addEventListener("mouseenter",onmouseenter);
265      //this.addEventListener("mouseleave",onmouseleave);
266      this.onmouseenter = onmouseenter; 
267      this.onmouseleave = onmouseleave;
268    }else{
269      //this.removeEventListener("mouseenter",onmouseenter);
270      //this.removeEventListener("mouseleave",onmouseleave);
271      this.onmouseenter = null;
272      this.onmouseleave = null;
273    }
274  }
275  if(this.getAttribute("on-animate")=="1"){
276    this.classList.add("noAnime");
277    if(this.getAttribute("on-entrance-animate")!="1"){
278      manageMouseOver(true);
279    }else{
280      manageMouseOver(false);
281    }
282  }
283
284  /**
285   * This function manages the intersection of the element for entracnce animation
286   */
287  const observeIntersection = () => {
288    // initialize the global timer variable that shall be used at a time.
289    var timer = null;
290    var isInView = false;
291    const iframe = window.frameElement;
292    const iframeRect = iframe?.getBoundingClientRect() || {};
293    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
294    
295    const callback = (entries) => {
296      entries.forEach((entry) => {
297        // Update isInView state
298        isInView = entry.isIntersecting;
299        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
300        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
301        if(entryRatio < animationTrigger){
302          animationTrigger=entryRatio;
303        }
304        if (entry.isIntersecting) {
305          // Element is entering view
306          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
307          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
308          if (!timer && intersectionRatio >= animationTrigger) {
309            
310            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
311            let delay = 0;
312            try{
313              delay = delayStr?parseFloat(delayStr):0;
314            }catch(e){
315              delay = 0;
316            }
317            setTimeout(() => {
318              if(this.classList.contains("noAnime")){
319                if(delay > 0){
320                  setTimeout(() => {
321                    this.style.removeProperty('opacity');
322                  }, delay*1000+10);
323                }else{
324                  this.style.removeProperty('opacity');
325                }
326                this.classList.remove("noAnime"); 
327                //console.log("enter",this.getAttribute("id"));
328              }
329            }, 50);
330            // if there was no timer and the animation is just run, then add the timer again.
331            timer = setTimeout(() => {
332              //console.log("enter 1",this.getAttribute("id"));
333              requestAnimationFrame(() => {
334                //console.log("enter 2",this.getAttribute("id"));
335                timer = null;
336              });
337            }, delay>0?delay*1000+500:500)
338          }
339        } else {
340          // When element leaves viewport
341          if (this.getAttribute("on-animate")=="1") {
342            // Use requestAnimationFrame to check if element is still out of view
343            requestAnimationFrame(() => {
344              if (!isInView && !timer) {
345                this.classList.add("noAnime");
346                this.style.opacity = '0';
347              }
348            });
349          }
350        }
351      });
352    };
353
354    const myObserver = new IntersectionObserver(callback, { 
355      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
356    });
357    
358    // Set initial opacity and class
359    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
360      this.classList.add("noAnime");
361      this.style.opacity = '0';
362      myObserver.observe(this);
363    }
364  }
365
366  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
367    observeIntersection();
368  }
369
370}.bind(items[i]))();
371          }
372          var items = document.querySelectorAll('#ikz5, #iowy8, #i0yxo');
373          for (var i = 0, len = items.length; i < len; i++) {
374            (function(){
375
376  /**
377   * This function manages the mouseOver and mouseOut of the element
378   */
379  const manageMouseOver = (add=true) => {
380    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
381      return;
382    }
383    console.log("manageMouseOver",add);
384    var timer=null;
385    const onmouseenter = () => {
386      if (!timer) {
387        setTimeout(() => {
388          this.classList.remove("noAnime"); 
389          console.log("onmouseenter");
390        }, 50);
391        // if there was no timer and the animation is just run, then add the timer again.
392        timer = setTimeout(() => {
393          console.log("onmouseenter 1");
394          requestAnimationFrame(() => {
395            console.log("onmouseenter 2");
396            timer = null;
397          });
398        }, 100)
399      }
400    }
401    const onmouseleave = () => {
402      requestAnimationFrame(() => {
403        if (!timer && !this.classList.contains("noAnime")) {
404          console.log("onmouseleave");
405          this.classList.add("noAnime");
406          timer=null;
407        }
408      });
409    }
410    if(add){  
411      //this.addEventListener("mouseenter",onmouseenter);
412      //this.addEventListener("mouseleave",onmouseleave);
413      this.onmouseenter = onmouseenter; 
414      this.onmouseleave = onmouseleave;
415    }else{
416      //this.removeEventListener("mouseenter",onmouseenter);
417      //this.removeEventListener("mouseleave",onmouseleave);
418      this.onmouseenter = null;
419      this.onmouseleave = null;
420    }
421  }
422  if(this.getAttribute("on-animate")=="1"){
423    this.classList.add("noAnime");
424    if(this.getAttribute("on-entrance-animate")!="1"){
425      manageMouseOver(true);
426    }else{
427      manageMouseOver(false);
428    }
429  }
430
431  /**
432   * This function manages the intersection of the element for entracnce animation
433   */
434  const observeIntersection = () => {
435    // initialize the global timer variable that shall be used at a time.
436    var timer = null;
437    var isInView = false;
438    const iframe = window.frameElement;
439    const iframeRect = iframe?.getBoundingClientRect() || {};
440    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
441    
442    const callback = (entries) => {
443      entries.forEach((entry) => {
444        // Update isInView state
445        isInView = entry.isIntersecting;
446        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
447        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
448        if(entryRatio < animationTrigger){
449          animationTrigger=entryRatio;
450        }
451        if (entry.isIntersecting) {
452          // Element is entering view
453          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
454          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
455          if (!timer && intersectionRatio >= animationTrigger) {
456            
457            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
458            let delay = 0;
459            try{
460              delay = delayStr?parseFloat(delayStr):0;
461            }catch(e){
462              delay = 0;
463            }
464            setTimeout(() => {
465              if(this.classList.contains("noAnime")){
466                if(delay > 0){
467                  setTimeout(() => {
468                    this.style.removeProperty('opacity');
469                  }, delay*1000+10);
470                }else{
471                  this.style.removeProperty('opacity');
472                }
473                this.classList.remove("noAnime"); 
474                //console.log("enter",this.getAttribute("id"));
475              }
476            }, 50);
477            // if there was no timer and the animation is just run, then add the timer again.
478            timer = setTimeout(() => {
479              //console.log("enter 1",this.getAttribute("id"));
480              requestAnimationFrame(() => {
481                //console.log("enter 2",this.getAttribute("id"));
482                timer = null;
483              });
484            }, delay>0?delay*1000+500:500)
485          }
486        } else {
487          // When element leaves viewport
488          if (this.getAttribute("on-animate")=="1") {
489            // Use requestAnimationFrame to check if element is still out of view
490            requestAnimationFrame(() => {
491              if (!isInView && !timer) {
492                this.classList.add("noAnime");
493                this.style.opacity = '0';
494              }
495            });
496          }
497        }
498      });
499    };
500
501    const myObserver = new IntersectionObserver(callback, { 
502      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
503    });
504    
505    // Set initial opacity and class
506    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
507      this.classList.add("noAnime");
508      this.style.opacity = '0';
509      myObserver.observe(this);
510    }
511  }
512
513  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
514    observeIntersection();
515  }
516
517}.bind(items[i]))();
518          }
519          var items = document.querySelectorAll('#i42o, #iz5s, #ie7v, #idio3, #iu7qg, #iaapb, #in5sg');
520          for (var i = 0, len = items.length; i < len; i++) {
521            (function(){
522
523  /**
524   * This function manages the mouseOver and mouseOut of the element
525   */
526  const manageMouseOver = (add=true) => {
527    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
528      return;
529    }
530    console.log("manageMouseOver",add);
531    var timer=null;
532    const onmouseenter = () => {
533      if (!timer) {
534        setTimeout(() => {
535          this.classList.remove("noAnime"); 
536          console.log("onmouseenter");
537        }, 50);
538        // if there was no timer and the animation is just run, then add the timer again.
539        timer = setTimeout(() => {
540          console.log("onmouseenter 1");
541          requestAnimationFrame(() => {
542            console.log("onmouseenter 2");
543            timer = null;
544          });
545        }, 100)
546      }
547    }
548    const onmouseleave = () => {
549      requestAnimationFrame(() => {
550        if (!timer && !this.classList.contains("noAnime")) {
551          console.log("onmouseleave");
552          this.classList.add("noAnime");
553          timer=null;
554        }
555      });
556    }
557    if(add){  
558      //this.addEventListener("mouseenter",onmouseenter);
559      //this.addEventListener("mouseleave",onmouseleave);
560      this.onmouseenter = onmouseenter; 
561      this.onmouseleave = onmouseleave;
562    }else{
563      //this.removeEventListener("mouseenter",onmouseenter);
564      //this.removeEventListener("mouseleave",onmouseleave);
565      this.onmouseenter = null;
566      this.onmouseleave = null;
567    }
568  }
569  if(this.getAttribute("on-animate")=="1"){
570    this.classList.add("noAnime");
571    if(this.getAttribute("on-entrance-animate")!="1"){
572      manageMouseOver(true);
573    }else{
574      manageMouseOver(false);
575    }
576  }
577
578  /**
579   * This function manages the intersection of the element for entracnce animation
580   */
581  const observeIntersection = () => {
582    // initialize the global timer variable that shall be used at a time.
583    var timer = null;
584    var isInView = false;
585    const iframe = window.frameElement;
586    const iframeRect = iframe?.getBoundingClientRect() || {};
587    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
588    
589    const callback = (entries) => {
590      entries.forEach((entry) => {
591        // Update isInView state
592        isInView = entry.isIntersecting;
593        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
594        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
595        if(entryRatio < animationTrigger){
596          animationTrigger=entryRatio;
597        }
598        if (entry.isIntersecting) {
599          // Element is entering view
600          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
601          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
602          if (!timer && intersectionRatio >= animationTrigger) {
603            
604            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
605            let delay = 0;
606            try{
607              delay = delayStr?parseFloat(delayStr):0;
608            }catch(e){
609              delay = 0;
610            }
611            setTimeout(() => {
612              if(this.classList.contains("noAnime")){
613                if(delay > 0){
614                  setTimeout(() => {
615                    this.style.removeProperty('opacity');
616                  }, delay*1000+10);
617                }else{
618                  this.style.removeProperty('opacity');
619                }
620                this.classList.remove("noAnime"); 
621                //console.log("enter",this.getAttribute("id"));
622              }
623            }, 50);
624            // if there was no timer and the animation is just run, then add the timer again.
625            timer = setTimeout(() => {
626              //console.log("enter 1",this.getAttribute("id"));
627              requestAnimationFrame(() => {
628                //console.log("enter 2",this.getAttribute("id"));
629                timer = null;
630              });
631            }, delay>0?delay*1000+500:500)
632          }
633        } else {
634          // When element leaves viewport
635          if (this.getAttribute("on-animate")=="1") {
636            // Use requestAnimationFrame to check if element is still out of view
637            requestAnimationFrame(() => {
638              if (!isInView && !timer) {
639                this.classList.add("noAnime");
640                this.style.opacity = '0';
641              }
642            });
643          }
644        }
645      });
646    };
647
648    const myObserver = new IntersectionObserver(callback, { 
649      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
650    });
651    
652    // Set initial opacity and class
653    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
654      this.classList.add("noAnime");
655      this.style.opacity = '0';
656      myObserver.observe(this);
657    }
658  }
659
660  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
661    observeIntersection();
662  }
663
664}.bind(items[i]))();
665          }
666          var items = document.querySelectorAll('#i809, #i8bm1, #iv0rv, #im69g');
667          for (var i = 0, len = items.length; i < len; i++) {
668            (function(){
669var t1,G=this,q=(t1=this.childNodes[0])===null||t1===void 0?void 0:t1.parentElement;this.getAttribute("data-design-mode")!=="1"&&this.getAttribute("ft-popup")&&this.addEventListener("click",function(C){console.log("item click",G.getAttribute("extra_params")),G.getAttribute("extra_params")&&history.pushState({extraParams:G.getAttribute("extra_params")},""),function(Z){var Q=Z.target;if(Z.target.getAttribute("ft-popup")?Q=Z.target:q!=null&&q.getAttribute("ft-popup")&&(Q=q),Q.getAttribute("ft-popup")){Z.preventDefault();var j=document.getElementById(Q.getAttribute("ft-popup")),L=j==null?void 0:j.getAttribute("ft-change-transition"),H=j==null?void 0:j.getElementsByClassName("popup")[0];H&&(H.style.display="flex"),j&&(L==="top"||L==="bottom"?(j.style.top="0%",j.style.bottom="0%"):L!=="right"&&L!=="left"||(j.style.left="0%",j.style.right="0%"),setTimeout(function(){j.style.display="flex",j.style.opacity="1"},50))}}(C)})
670  /**
671   * This function manages the mouseOver and mouseOut of the element
672   */
673  const manageMouseOver = (add=true) => {
674    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
675      return;
676    }
677    console.log("manageMouseOver",add);
678    var timer=null;
679    const onmouseenter = () => {
680      if (!timer) {
681        setTimeout(() => {
682          this.classList.remove("noAnime"); 
683          console.log("onmouseenter");
684        }, 50);
685        // if there was no timer and the animation is just run, then add the timer again.
686        timer = setTimeout(() => {
687          console.log("onmouseenter 1");
688          requestAnimationFrame(() => {
689            console.log("onmouseenter 2");
690            timer = null;
691          });
692        }, 100)
693      }
694    }
695    const onmouseleave = () => {
696      requestAnimationFrame(() => {
697        if (!timer && !this.classList.contains("noAnime")) {
698          console.log("onmouseleave");
699          this.classList.add("noAnime");
700          timer=null;
701        }
702      });
703    }
704    if(add){  
705      //this.addEventListener("mouseenter",onmouseenter);
706      //this.addEventListener("mouseleave",onmouseleave);
707      this.onmouseenter = onmouseenter; 
708      this.onmouseleave = onmouseleave;
709    }else{
710      //this.removeEventListener("mouseenter",onmouseenter);
711      //this.removeEventListener("mouseleave",onmouseleave);
712      this.onmouseenter = null;
713      this.onmouseleave = null;
714    }
715  }
716  if(this.getAttribute("on-animate")=="1"){
717    this.classList.add("noAnime");
718    if(this.getAttribute("on-entrance-animate")!="1"){
719      manageMouseOver(true);
720    }else{
721      manageMouseOver(false);
722    }
723  }
724
725  /**
726   * This function manages the intersection of the element for entracnce animation
727   */
728  const observeIntersection = () => {
729    // initialize the global timer variable that shall be used at a time.
730    var timer = null;
731    var isInView = false;
732    const iframe = window.frameElement;
733    const iframeRect = iframe?.getBoundingClientRect() || {};
734    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
735    
736    const callback = (entries) => {
737      entries.forEach((entry) => {
738        // Update isInView state
739        isInView = entry.isIntersecting;
740        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
741        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
742        if(entryRatio < animationTrigger){
743          animationTrigger=entryRatio;
744        }
745        if (entry.isIntersecting) {
746          // Element is entering view
747          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
748          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
749          if (!timer && intersectionRatio >= animationTrigger) {
750            
751            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
752            let delay = 0;
753            try{
754              delay = delayStr?parseFloat(delayStr):0;
755            }catch(e){
756              delay = 0;
757            }
758            setTimeout(() => {
759              if(this.classList.contains("noAnime")){
760                if(delay > 0){
761                  setTimeout(() => {
762                    this.style.removeProperty('opacity');
763                  }, delay*1000+10);
764                }else{
765                  this.style.removeProperty('opacity');
766                }
767                this.classList.remove("noAnime"); 
768                //console.log("enter",this.getAttribute("id"));
769              }
770            }, 50);
771            // if there was no timer and the animation is just run, then add the timer again.
772            timer = setTimeout(() => {
773              //console.log("enter 1",this.getAttribute("id"));
774              requestAnimationFrame(() => {
775                //console.log("enter 2",this.getAttribute("id"));
776                timer = null;
777              });
778            }, delay>0?delay*1000+500:500)
779          }
780        } else {
781          // When element leaves viewport
782          if (this.getAttribute("on-animate")=="1") {
783            // Use requestAnimationFrame to check if element is still out of view
784            requestAnimationFrame(() => {
785              if (!isInView && !timer) {
786                this.classList.add("noAnime");
787                this.style.opacity = '0';
788              }
789            });
790          }
791        }
792      });
793    };
794
795    const myObserver = new IntersectionObserver(callback, { 
796      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
797    });
798    
799    // Set initial opacity and class
800    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
801      this.classList.add("noAnime");
802      this.style.opacity = '0';
803      myObserver.observe(this);
804    }
805  }
806
807  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
808    observeIntersection();
809  }
810
811}.bind(items[i]))();
812          }
813          var items = document.querySelectorAll('#iahq, #it0qi, #il6w7, #ig2rp');
814          for (var i = 0, len = items.length; i < len; i++) {
815            (function(){
816
817  /**
818   * This function manages the mouseOver and mouseOut of the element
819   */
820  const manageMouseOver = (add=true) => {
821    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
822      return;
823    }
824    console.log("manageMouseOver",add);
825    var timer=null;
826    const onmouseenter = () => {
827      if (!timer) {
828        setTimeout(() => {
829          this.classList.remove("noAnime"); 
830          console.log("onmouseenter");
831        }, 50);
832        // if there was no timer and the animation is just run, then add the timer again.
833        timer = setTimeout(() => {
834          console.log("onmouseenter 1");
835          requestAnimationFrame(() => {
836            console.log("onmouseenter 2");
837            timer = null;
838          });
839        }, 100)
840      }
841    }
842    const onmouseleave = () => {
843      requestAnimationFrame(() => {
844        if (!timer && !this.classList.contains("noAnime")) {
845          console.log("onmouseleave");
846          this.classList.add("noAnime");
847          timer=null;
848        }
849      });
850    }
851    if(add){  
852      //this.addEventListener("mouseenter",onmouseenter);
853      //this.addEventListener("mouseleave",onmouseleave);
854      this.onmouseenter = onmouseenter; 
855      this.onmouseleave = onmouseleave;
856    }else{
857      //this.removeEventListener("mouseenter",onmouseenter);
858      //this.removeEventListener("mouseleave",onmouseleave);
859      this.onmouseenter = null;
860      this.onmouseleave = null;
861    }
862  }
863  if(this.getAttribute("on-animate")=="1"){
864    this.classList.add("noAnime");
865    if(this.getAttribute("on-entrance-animate")!="1"){
866      manageMouseOver(true);
867    }else{
868      manageMouseOver(false);
869    }
870  }
871
872  /**
873   * This function manages the intersection of the element for entracnce animation
874   */
875  const observeIntersection = () => {
876    // initialize the global timer variable that shall be used at a time.
877    var timer = null;
878    var isInView = false;
879    const iframe = window.frameElement;
880    const iframeRect = iframe?.getBoundingClientRect() || {};
881    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
882    
883    const callback = (entries) => {
884      entries.forEach((entry) => {
885        // Update isInView state
886        isInView = entry.isIntersecting;
887        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
888        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
889        if(entryRatio < animationTrigger){
890          animationTrigger=entryRatio;
891        }
892        if (entry.isIntersecting) {
893          // Element is entering view
894          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
895          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
896          if (!timer && intersectionRatio >= animationTrigger) {
897            
898            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
899            let delay = 0;
900            try{
901              delay = delayStr?parseFloat(delayStr):0;
902            }catch(e){
903              delay = 0;
904            }
905            setTimeout(() => {
906              if(this.classList.contains("noAnime")){
907                if(delay > 0){
908                  setTimeout(() => {
909                    this.style.removeProperty('opacity');
910                  }, delay*1000+10);
911                }else{
912                  this.style.removeProperty('opacity');
913                }
914                this.classList.remove("noAnime"); 
915                //console.log("enter",this.getAttribute("id"));
916              }
917            }, 50);
918            // if there was no timer and the animation is just run, then add the timer again.
919            timer = setTimeout(() => {
920              //console.log("enter 1",this.getAttribute("id"));
921              requestAnimationFrame(() => {
922                //console.log("enter 2",this.getAttribute("id"));
923                timer = null;
924              });
925            }, delay>0?delay*1000+500:500)
926          }
927        } else {
928          // When element leaves viewport
929          if (this.getAttribute("on-animate")=="1") {
930            // Use requestAnimationFrame to check if element is still out of view
931            requestAnimationFrame(() => {
932              if (!isInView && !timer) {
933                this.classList.add("noAnime");
934                this.style.opacity = '0';
935              }
936            });
937          }
938        }
939      });
940    };
941
942    const myObserver = new IntersectionObserver(callback, { 
943      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
944    });
945    
946    // Set initial opacity and class
947    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
948      this.classList.add("noAnime");
949      this.style.opacity = '0';
950      myObserver.observe(this);
951    }
952  }
953
954  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
955    observeIntersection();
956  }
957
958}.bind(items[i]))();
959          }
960          var items = document.querySelectorAll('#i2bz3');
961          for (var i = 0, len = items.length; i < len; i++) {
962            (function(){
963
964  /**
965   * This function manages the mouseOver and mouseOut of the element
966   */
967  const manageMouseOver = (add=true) => {
968    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
969      return;
970    }
971    console.log("manageMouseOver",add);
972    var timer=null;
973    const onmouseenter = () => {
974      if (!timer) {
975        setTimeout(() => {
976          this.classList.remove("noAnime"); 
977          console.log("onmouseenter");
978        }, 50);
979        // if there was no timer and the animation is just run, then add the timer again.
980        timer = setTimeout(() => {
981          console.log("onmouseenter 1");
982          requestAnimationFrame(() => {
983            console.log("onmouseenter 2");
984            timer = null;
985          });
986        }, 100)
987      }
988    }
989    const onmouseleave = () => {
990      requestAnimationFrame(() => {
991        if (!timer && !this.classList.contains("noAnime")) {
992          console.log("onmouseleave");
993          this.classList.add("noAnime");
994          timer=null;
995        }
996      });
997    }
998    if(add){  
999      //this.addEventListener("mouseenter",onmouseenter);
1000      //this.addEventListener("mouseleave",onmouseleave);
1001      this.onmouseenter = onmouseenter; 
1002      this.onmouseleave = onmouseleave;
1003    }else{
1004      //this.removeEventListener("mouseenter",onmouseenter);
1005      //this.removeEventListener("mouseleave",onmouseleave);
1006      this.onmouseenter = null;
1007      this.onmouseleave = null;
1008    }
1009  }
1010  if(this.getAttribute("on-animate")=="1"){
1011    this.classList.add("noAnime");
1012    if(this.getAttribute("on-entrance-animate")!="1"){
1013      manageMouseOver(true);
1014    }else{
1015      manageMouseOver(false);
1016    }
1017  }
1018
1019  /**
1020   * This function manages the intersection of the element for entracnce animation
1021   */
1022  const observeIntersection = () => {
1023    // initialize the global timer variable that shall be used at a time.
1024    var timer = null;
1025    var isInView = false;
1026    const iframe = window.frameElement;
1027    const iframeRect = iframe?.getBoundingClientRect() || {};
1028    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
1029    
1030    const callback = (entries) => {
1031      entries.forEach((entry) => {
1032        // Update isInView state
1033        isInView = entry.isIntersecting;
1034        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
1035        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
1036        if(entryRatio < animationTrigger){
1037          animationTrigger=entryRatio;
1038        }
1039        if (entry.isIntersecting) {
1040          // Element is entering view
1041          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
1042          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
1043          if (!timer && intersectionRatio >= animationTrigger) {
1044            
1045            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
1046            let delay = 0;
1047            try{
1048              delay = delayStr?parseFloat(delayStr):0;
1049            }catch(e){
1050              delay = 0;
1051            }
1052            setTimeout(() => {
1053              if(this.classList.contains("noAnime")){
1054                if(delay > 0){
1055                  setTimeout(() => {
1056                    this.style.removeProperty('opacity');
1057                  }, delay*1000+10);
1058                }else{
1059                  this.style.removeProperty('opacity');
1060                }
1061                this.classList.remove("noAnime"); 
1062                //console.log("enter",this.getAttribute("id"));
1063              }
1064            }, 50);
1065            // if there was no timer and the animation is just run, then add the timer again.
1066            timer = setTimeout(() => {
1067              //console.log("enter 1",this.getAttribute("id"));
1068              requestAnimationFrame(() => {
1069                //console.log("enter 2",this.getAttribute("id"));
1070                timer = null;
1071              });
1072            }, delay>0?delay*1000+500:500)
1073          }
1074        } else {
1075          // When element leaves viewport
1076          if (this.getAttribute("on-animate")=="1") {
1077            // Use requestAnimationFrame to check if element is still out of view
1078            requestAnimationFrame(() => {
1079              if (!isInView && !timer) {
1080                this.classList.add("noAnime");
1081                this.style.opacity = '0';
1082              }
1083            });
1084          }
1085        }
1086      });
1087    };
1088
1089    const myObserver = new IntersectionObserver(callback, { 
1090      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
1091    });
1092    
1093    // Set initial opacity and class
1094    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1095      this.classList.add("noAnime");
1096      this.style.opacity = '0';
1097      myObserver.observe(this);
1098    }
1099  }
1100
1101  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1102    observeIntersection();
1103  }
1104
1105}.bind(items[i]))();
1106          }
1107          var items = document.querySelectorAll('#i6mh6');
1108          for (var i = 0, len = items.length; i < len; i++) {
1109            (function(){
1110
1111  /**
1112   * This function manages the mouseOver and mouseOut of the element
1113   */
1114  const manageMouseOver = (add=true) => {
1115    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
1116      return;
1117    }
1118    console.log("manageMouseOver",add);
1119    var timer=null;
1120    const onmouseenter = () => {
1121      if (!timer) {
1122        setTimeout(() => {
1123          this.classList.remove("noAnime"); 
1124          console.log("onmouseenter");
1125        }, 50);
1126        // if there was no timer and the animation is just run, then add the timer again.
1127        timer = setTimeout(() => {
1128          console.log("onmouseenter 1");
1129          requestAnimationFrame(() => {
1130            console.log("onmouseenter 2");
1131            timer = null;
1132          });
1133        }, 100)
1134      }
1135    }
1136    const onmouseleave = () => {
1137      requestAnimationFrame(() => {
1138        if (!timer && !this.classList.contains("noAnime")) {
1139          console.log("onmouseleave");
1140          this.classList.add("noAnime");
1141          timer=null;
1142        }
1143      });
1144    }
1145    if(add){  
1146      //this.addEventListener("mouseenter",onmouseenter);
1147      //this.addEventListener("mouseleave",onmouseleave);
1148      this.onmouseenter = onmouseenter; 
1149      this.onmouseleave = onmouseleave;
1150    }else{
1151      //this.removeEventListener("mouseenter",onmouseenter);
1152      //this.removeEventListener("mouseleave",onmouseleave);
1153      this.onmouseenter = null;
1154      this.onmouseleave = null;
1155    }
1156  }
1157  if(this.getAttribute("on-animate")=="1"){
1158    this.classList.add("noAnime");
1159    if(this.getAttribute("on-entrance-animate")!="1"){
1160      manageMouseOver(true);
1161    }else{
1162      manageMouseOver(false);
1163    }
1164  }
1165
1166  /**
1167   * This function manages the intersection of the element for entracnce animation
1168   */
1169  const observeIntersection = () => {
1170    // initialize the global timer variable that shall be used at a time.
1171    var timer = null;
1172    var isInView = false;
1173    const iframe = window.frameElement;
1174    const iframeRect = iframe?.getBoundingClientRect() || {};
1175    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
1176    
1177    const callback = (entries) => {
1178      entries.forEach((entry) => {
1179        // Update isInView state
1180        isInView = entry.isIntersecting;
1181        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
1182        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
1183        if(entryRatio < animationTrigger){
1184          animationTrigger=entryRatio;
1185        }
1186        if (entry.isIntersecting) {
1187          // Element is entering view
1188          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
1189          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
1190          if (!timer && intersectionRatio >= animationTrigger) {
1191            
1192            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
1193            let delay = 0;
1194            try{
1195              delay = delayStr?parseFloat(delayStr):0;
1196            }catch(e){
1197              delay = 0;
1198            }
1199            setTimeout(() => {
1200              if(this.classList.contains("noAnime")){
1201                if(delay > 0){
1202                  setTimeout(() => {
1203                    this.style.removeProperty('opacity');
1204                  }, delay*1000+10);
1205                }else{
1206                  this.style.removeProperty('opacity');
1207                }
1208                this.classList.remove("noAnime"); 
1209                //console.log("enter",this.getAttribute("id"));
1210              }
1211            }, 50);
1212            // if there was no timer and the animation is just run, then add the timer again.
1213            timer = setTimeout(() => {
1214              //console.log("enter 1",this.getAttribute("id"));
1215              requestAnimationFrame(() => {
1216                //console.log("enter 2",this.getAttribute("id"));
1217                timer = null;
1218              });
1219            }, delay>0?delay*1000+500:500)
1220          }
1221        } else {
1222          // When element leaves viewport
1223          if (this.getAttribute("on-animate")=="1") {
1224            // Use requestAnimationFrame to check if element is still out of view
1225            requestAnimationFrame(() => {
1226              if (!isInView && !timer) {
1227                this.classList.add("noAnime");
1228                this.style.opacity = '0';
1229              }
1230            });
1231          }
1232        }
1233      });
1234    };
1235
1236    const myObserver = new IntersectionObserver(callback, { 
1237      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
1238    });
1239    
1240    // Set initial opacity and class
1241    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1242      this.classList.add("noAnime");
1243      this.style.opacity = '0';
1244      myObserver.observe(this);
1245    }
1246  }
1247
1248  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1249    observeIntersection();
1250  }
1251
1252}.bind(items[i]))();
1253          }
1254          var items = document.querySelectorAll('#izorh');
1255          for (var i = 0, len = items.length; i < len; i++) {
1256            (function(){
1257var t1,G=this,q=(t1=this.childNodes[0])===null||t1===void 0?void 0:t1.parentElement;this.getAttribute("data-design-mode")!=="1"&&this.getAttribute("ft-popup")&&this.addEventListener("click",function(C){console.log("item click",G.getAttribute("extra_params")),G.getAttribute("extra_params")&&history.pushState({extraParams:G.getAttribute("extra_params")},""),function(Z){var Q=Z.target;if(Z.target.getAttribute("ft-popup")?Q=Z.target:q!=null&&q.getAttribute("ft-popup")&&(Q=q),Q.getAttribute("ft-popup")){Z.preventDefault();var j=document.getElementById(Q.getAttribute("ft-popup")),L=j==null?void 0:j.getAttribute("ft-change-transition"),H=j==null?void 0:j.getElementsByClassName("popup")[0];H&&(H.style.display="flex"),j&&(L==="top"||L==="bottom"?(j.style.top="0%",j.style.bottom="0%"):L!=="right"&&L!=="left"||(j.style.left="0%",j.style.right="0%"),setTimeout(function(){j.style.display="flex",j.style.opacity="1"},50))}}(C)})
1258  /**
1259   * This function manages the mouseOver and mouseOut of the element
1260   */
1261  const manageMouseOver = (add=true) => {
1262    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
1263      return;
1264    }
1265    console.log("manageMouseOver",add);
1266    var timer=null;
1267    const onmouseenter = () => {
1268      if (!timer) {
1269        setTimeout(() => {
1270          this.classList.remove("noAnime"); 
1271          console.log("onmouseenter");
1272        }, 50);
1273        // if there was no timer and the animation is just run, then add the timer again.
1274        timer = setTimeout(() => {
1275          console.log("onmouseenter 1");
1276          requestAnimationFrame(() => {
1277            console.log("onmouseenter 2");
1278            timer = null;
1279          });
1280        }, 100)
1281      }
1282    }
1283    const onmouseleave = () => {
1284      requestAnimationFrame(() => {
1285        if (!timer && !this.classList.contains("noAnime")) {
1286          console.log("onmouseleave");
1287          this.classList.add("noAnime");
1288          timer=null;
1289        }
1290      });
1291    }
1292    if(add){  
1293      //this.addEventListener("mouseenter",onmouseenter);
1294      //this.addEventListener("mouseleave",onmouseleave);
1295      this.onmouseenter = onmouseenter; 
1296      this.onmouseleave = onmouseleave;
1297    }else{
1298      //this.removeEventListener("mouseenter",onmouseenter);
1299      //this.removeEventListener("mouseleave",onmouseleave);
1300      this.onmouseenter = null;
1301      this.onmouseleave = null;
1302    }
1303  }
1304  if(this.getAttribute("on-animate")=="1"){
1305    this.classList.add("noAnime");
1306    if(this.getAttribute("on-entrance-animate")!="1"){
1307      manageMouseOver(true);
1308    }else{
1309      manageMouseOver(false);
1310    }
1311  }
1312
1313  /**
1314   * This function manages the intersection of the element for entracnce animation
1315   */
1316  const observeIntersection = () => {
1317    // initialize the global timer variable that shall be used at a time.
1318    var timer = null;
1319    var isInView = false;
1320    const iframe = window.frameElement;
1321    const iframeRect = iframe?.getBoundingClientRect() || {};
1322    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
1323    
1324    const callback = (entries) => {
1325      entries.forEach((entry) => {
1326        // Update isInView state
1327        isInView = entry.isIntersecting;
1328        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
1329        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
1330        if(entryRatio < animationTrigger){
1331          animationTrigger=entryRatio;
1332        }
1333        if (entry.isIntersecting) {
1334          // Element is entering view
1335          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
1336          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
1337          if (!timer && intersectionRatio >= animationTrigger) {
1338            
1339            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
1340            let delay = 0;
1341            try{
1342              delay = delayStr?parseFloat(delayStr):0;
1343            }catch(e){
1344              delay = 0;
1345            }
1346            setTimeout(() => {
1347              if(this.classList.contains("noAnime")){
1348                if(delay > 0){
1349                  setTimeout(() => {
1350                    this.style.removeProperty('opacity');
1351                  }, delay*1000+10);
1352                }else{
1353                  this.style.removeProperty('opacity');
1354                }
1355                this.classList.remove("noAnime"); 
1356                //console.log("enter",this.getAttribute("id"));
1357              }
1358            }, 50);
1359            // if there was no timer and the animation is just run, then add the timer again.
1360            timer = setTimeout(() => {
1361              //console.log("enter 1",this.getAttribute("id"));
1362              requestAnimationFrame(() => {
1363                //console.log("enter 2",this.getAttribute("id"));
1364                timer = null;
1365              });
1366            }, delay>0?delay*1000+500:500)
1367          }
1368        } else {
1369          // When element leaves viewport
1370          if (this.getAttribute("on-animate")=="1") {
1371            // Use requestAnimationFrame to check if element is still out of view
1372            requestAnimationFrame(() => {
1373              if (!isInView && !timer) {
1374                this.classList.add("noAnime");
1375                this.style.opacity = '0';
1376              }
1377            });
1378          }
1379        }
1380      });
1381    };
1382
1383    const myObserver = new IntersectionObserver(callback, { 
1384      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
1385    });
1386    
1387    // Set initial opacity and class
1388    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1389      this.classList.add("noAnime");
1390      this.style.opacity = '0';
1391      myObserver.observe(this);
1392    }
1393  }
1394
1395  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1396    observeIntersection();
1397  }
1398
1399}.bind(items[i]))();
1400          }
1401          var items = document.querySelectorAll('#i4ypg');
1402          for (var i = 0, len = items.length; i < len; i++) {
1403            (function(){
1404var w=this,_=window,F=function(a1){console.log("erappper is",a1);var J=a1==null?void 0:a1.getAttribute("ft-change-transition"),S1=a1==null?void 0:a1.getElementsByClassName("popup")[0];S1&&(S1.style.display="flex"),a1&&(J==="top"||J==="bottom"?(a1.style.top="0%",a1.style.bottom="0%"):J!=="right"&&J!=="left"||(a1.style.left="0%",a1.style.right="0%"),setTimeout(function(){a1.style.display="flex",a1.style.opacity="1"},50))},e1=function(a1,J,S1,I1){var j1="",Y=24*S1*60*60*1e3;if(I1==="day"?Y=24*S1*60*60*1e3:I1==="hour"?Y=60*S1*60*1e3:I1==="minute"&&(Y=60*S1*1e3),S1){var l1=new Date;l1.setTime(l1.getTime()+Y),j1="; expires="+l1.toUTCString()}console.log("i am set cookie"),document.cookie=a1+"="+(J||"")+j1+";; Path=/;"},i1=function(a1){document.cookie=a1+"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;"},I=function(a1){return document.cookie.split("; ").reduce(function(J,S1){var I1=S1.split("=");
1404return I1[0]===a1?decodeURIComponent(I1[1]):J},"")},E=w.getAttribute("exitIntend"),K=w.getAttribute("scrollDepth"),x=w.getAttribute("scrollUnit"),g1=w.getAttribute("duration"),p1=window.location.href.includes("/preview/"),m1=function(a1,J){var S1=w.getAttribute("exitIntend");(S1||S1===0)&&!a1.toElement&&!a1.relatedTarget&&a1.clientY<10&&J&&(I("exitIntentShown"+J.id)||(F(J),e1("exitIntentShown"+J.id,!0,parseFloat(E),g1)))},v1=function(a1){if(w.getAttribute("scrollDepth")!==null){var J=window.scrollY,S1=window.document.documentElement,I1=window.document.body,j1="scrollTop",Y="scrollHeight",l1=(S1[j1]||I1[j1])/((S1[Y]||I1[Y])-S1.clientHeight)*100;x==="%"?Math.floor(l1)!==parseFloat(K)&&Math.ceil(l1)!==parseFloat(K)||I("scrollDepth"+w.id)||(F(w),e1("scrollDepth"+w.id,!0,parseFloat(E),g1)):Math.floor(J)!==parseFloat(K)&&Math.ceil(J)!==parseFloat(K)||I("scrollDepth"+w.id)||(F(w),e1("scrollDepth"+w.id,!0,parseFloat(E),g1))}};p1&&(I("scrollDepth"+w.id)&&i1("scrollDepth"+w.id),I("exitIntentShown"+w.id)&&i1("exitIntentShown"+w.id)),this.getAttribute("data-design-mode")!="1"&&(console.log("wrapper add click event",this.getAttribute("id")),this.addEventListener("click",function(a1){var J,S1,I1;S1=(J=w).querySelector(".popup"),I1=J.getAttribute("ft-change-transition"),setTimeout(function(){I1==="top"?(J.style.top="-100%",J.style.bottom="100%"):I1==="right"?(J.style.left="100%",J.style.right="-100%"):I1==="bottom"?(J.style.top="100%",J.style.bottom="-100%"):I1==="left"&&(J.style.left="-100%",J.style.right="100%"),J.style.opacity="0",console.log("wrapper 2",J,J.style)},50),setTimeout(function(){S1&&(S1.style.display="none")},250)}),E&&!K?setTimeout(function(){window.addEventListener("mouseout",function(a1){return m1(a1,w)},!1)},1e3):K&&!E?(window.removeEventListener("mouseout",function(a1){return m1(a1,w)},!1),_.addEventListener("scroll",v1)):K&&E&&(setTimeout(function(){window.addEventListener("mouseout",function(a1){return m1(a1,w)},!1)},1e3),_.addEventListener("scroll",v1)))
1405  /**
1406   * This function manages the mouseOver and mouseOut of the element
1407   */
1408  const manageMouseOver = (add=true) => {
1409    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
1410      return;
1411    }
1412    console.log("manageMouseOver",add);
1413    var timer=null;
1414    const onmouseenter = () => {
1415      if (!timer) {
1416        setTimeout(() => {
1417          this.classList.remove("noAnime"); 
1418          console.log("onmouseenter");
1419        }, 50);
1420        // if there was no timer and the animation is just run, then add the timer again.
1421        timer = setTimeout(() => {
1422          console.log("onmouseenter 1");
1423          requestAnimationFrame(() => {
1424            console.log("onmouseenter 2");
1425            timer = null;
1426          });
1427        }, 100)
1428      }
1429    }
1430    const onmouseleave = () => {
1431      requestAnimationFrame(() => {
1432        if (!timer && !this.classList.contains("noAnime")) {
1433          console.log("onmouseleave");
1434          this.classList.add("noAnime");
1435          timer=null;
1436        }
1437      });
1438    }
1439    if(add){  
1440      //this.addEventListener("mouseenter",onmouseenter);
1441      //this.addEventListener("mouseleave",onmouseleave);
1442      this.onmouseenter = onmouseenter; 
1443      this.onmouseleave = onmouseleave;
1444    }else{
1445      //this.removeEventListener("mouseenter",onmouseenter);
1446      //this.removeEventListener("mouseleave",onmouseleave);
1447      this.onmouseenter = null;
1448      this.onmouseleave = null;
1449    }
1450  }
1451  if(this.getAttribute("on-animate")=="1"){
1452    this.classList.add("noAnime");
1453    if(this.getAttribute("on-entrance-animate")!="1"){
1454      manageMouseOver(true);
1455    }else{
1456      manageMouseOver(false);
1457    }
1458  }
1459
1460  /**
1461   * This function manages the intersection of the element for entracnce animation
1462   */
1463  const observeIntersection = () => {
1464    // initialize the global timer variable that shall be used at a time.
1465    var timer = null;
1466    var isInView = false;
1467    const iframe = window.frameElement;
1468    const iframeRect = iframe?.getBoundingClientRect() || {};
1469    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
1470    
1471    const callback = (entries) => {
1472      entries.forEach((entry) => {
1473        // Update isInView state
1474        isInView = entry.isIntersecting;
1475        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
1476        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
1477        if(entryRatio < animationTrigger){
1478          animationTrigger=entryRatio;
1479        }
1480        if (entry.isIntersecting) {
1481          // Element is entering view
1482          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
1483          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
1484          if (!timer && intersectionRatio >= animationTrigger) {
1485            
1486            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
1487            let delay = 0;
1488            try{
1489              delay = delayStr?parseFloat(delayStr):0;
1490            }catch(e){
1491              delay = 0;
1492            }
1493            setTimeout(() => {
1494              if(this.classList.contains("noAnime")){
1495                if(delay > 0){
1496                  setTimeout(() => {
1497                    this.style.removeProperty('opacity');
1498                  }, delay*1000+10);
1499                }else{
1500                  this.style.removeProperty('opacity');
1501                }
1502                this.classList.remove("noAnime"); 
1503                //console.log("enter",this.getAttribute("id"));
1504              }
1505            }, 50);
1506            // if there was no timer and the animation is just run, then add the timer again.
1507            timer = setTimeout(() => {
1508              //console.log("enter 1",this.getAttribute("id"));
1509              requestAnimationFrame(() => {
1510                //console.log("enter 2",this.getAttribute("id"));
1511                timer = null;
1512              });
1513            }, delay>0?delay*1000+500:500)
1514          }
1515        } else {
1516          // When element leaves viewport
1517          if (this.getAttribute("on-animate")=="1") {
1518            // Use requestAnimationFrame to check if element is still out of view
1519            requestAnimationFrame(() => {
1520              if (!isInView && !timer) {
1521                this.classList.add("noAnime");
1522                this.style.opacity = '0';
1523              }
1524            });
1525          }
1526        }
1527      });
1528    };
1529
1530    const myObserver = new IntersectionObserver(callback, { 
1531      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
1532    });
1533    
1534    // Set initial opacity and class
1535    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1536      this.classList.add("noAnime");
1537      this.style.opacity = '0';
1538      myObserver.observe(this);
1539    }
1540  }
1541
1542  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1543    observeIntersection();
1544  }
1545
1546}.bind(items[i]))();
1547          }
1548          var items = document.querySelectorAll('#iq4yy');
1549          for (var i = 0, len = items.length; i < len; i++) {
1550            (function(){
1551var s=this;s.getAttribute("data-design-mode")!="1"&&this.addEventListener("click",function(b){console.log("popup click",b),s==b.target&&(b.preventDefault(),b.stopPropagation()),b.cancelBubble=!0});var d=this,m=d.getAttribute("ft-auto-popup");console.log("autoPopup",m),m=="Yes"&&setTimeout(function(){var b=d.closest(".popup-wrapper");if(b){var k=b==null?void 0:b.getAttribute("ft-change-transition");d&&(d.style.display="flex"),b&&(k==="top"||k==="bottom"?(b.style.top="0%",b.style.bottom="0%"):k!=="right"&&k!=="left"||(b.style.left="0%",b.style.right="0%"),setTimeout(function(){b.style.display="flex",b.style.opacity="1"},50))}},1e3)
1552  /**
1553   * This function manages the mouseOver and mouseOut of the element
1554   */
1555  const manageMouseOver = (add=true) => {
1556    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
1557      return;
1558    }
1559    console.log("manageMouseOver",add);
1560    var timer=null;
1561    const onmouseenter = () => {
1562      if (!timer) {
1563        setTimeout(() => {
1564          this.classList.remove("noAnime"); 
1565          console.log("onmouseenter");
1566        }, 50);
1567        // if there was no timer and the animation is just run, then add the timer again.
1568        timer = setTimeout(() => {
1569          console.log("onmouseenter 1");
1570          requestAnimationFrame(() => {
1571            console.log("onmouseenter 2");
1572            timer = null;
1573          });
1574        }, 100)
1575      }
1576    }
1577    const onmouseleave = () => {
1578      requestAnimationFrame(() => {
1579        if (!timer && !this.classList.contains("noAnime")) {
1580          console.log("onmouseleave");
1581          this.classList.add("noAnime");
1582          timer=null;
1583        }
1584      });
1585    }
1586    if(add){  
1587      //this.addEventListener("mouseenter",onmouseenter);
1588      //this.addEventListener("mouseleave",onmouseleave);
1589      this.onmouseenter = onmouseenter; 
1590      this.onmouseleave = onmouseleave;
1591    }else{
1592      //this.removeEventListener("mouseenter",onmouseenter);
1593      //this.removeEventListener("mouseleave",onmouseleave);
1594      this.onmouseenter = null;
1595      this.onmouseleave = null;
1596    }
1597  }
1598  if(this.getAttribute("on-animate")=="1"){
1599    this.classList.add("noAnime");
1600    if(this.getAttribute("on-entrance-animate")!="1"){
1601      manageMouseOver(true);
1602    }else{
1603      manageMouseOver(false);
1604    }
1605  }
1606
1607  /**
1608   * This function manages the intersection of the element for entracnce animation
1609   */
1610  const observeIntersection = () => {
1611    // initialize the global timer variable that shall be used at a time.
1612    var timer = null;
1613    var isInView = false;
1614    const iframe = window.frameElement;
1615    const iframeRect = iframe?.getBoundingClientRect() || {};
1616    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
1617    
1618    const callback = (entries) => {
1619      entries.forEach((entry) => {
1620        // Update isInView state
1621        isInView = entry.isIntersecting;
1622        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
1623        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
1624        if(entryRatio < animationTrigger){
1625          animationTrigger=entryRatio;
1626        }
1627        if (entry.isIntersecting) {
1628          // Element is entering view
1629          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
1630          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
1631          if (!timer && intersectionRatio >= animationTrigger) {
1632            
1633            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
1634            let delay = 0;
1635            try{
1636              delay = delayStr?parseFloat(delayStr):0;
1637            }catch(e){
1638              delay = 0;
1639            }
1640            setTimeout(() => {
1641              if(this.classList.contains("noAnime")){
1642                if(delay > 0){
1643                  setTimeout(() => {
1644                    this.style.removeProperty('opacity');
1645                  }, delay*1000+10);
1646                }else{
1647                  this.style.removeProperty('opacity');
1648                }
1649                this.classList.remove("noAnime"); 
1650                //console.log("enter",this.getAttribute("id"));
1651              }
1652            }, 50);
1653            // if there was no timer and the animation is just run, then add the timer again.
1654            timer = setTimeout(() => {
1655              //console.log("enter 1",this.getAttribute("id"));
1656              requestAnimationFrame(() => {
1657                //console.log("enter 2",this.getAttribute("id"));
1658                timer = null;
1659              });
1660            }, delay>0?delay*1000+500:500)
1661          }
1662        } else {
1663          // When element leaves viewport
1664          if (this.getAttribute("on-animate")=="1") {
1665            // Use requestAnimationFrame to check if element is still out of view
1666            requestAnimationFrame(() => {
1667              if (!isInView && !timer) {
1668                this.classList.add("noAnime");
1669                this.style.opacity = '0';
1670              }
1671            });
1672          }
1673        }
1674      });
1675    };
1676
1677    const myObserver = new IntersectionObserver(callback, { 
1678      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
1679    });
1680    
1681    // Set initial opacity and class
1682    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1683      this.classList.add("noAnime");
1684      this.style.opacity = '0';
1685      myObserver.observe(this);
1686    }
1687  }
1688
1689  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1690    observeIntersection();
1691  }
1692
1693}.bind(items[i]))();
1694          }
1695          var props = {"idjtq":{}};
1696          var ids = Object.keys(props).map(function(id) { return '#'+id }).join(',');
1697          var els = document.querySelectorAll(ids);
1698          for (var i = 0, len = els.length; i < len; i++) {
1699            var el = els[i];
1700            (function $y(o){var n=this.parentNode.parentNode,r=n.getElementsByClassName("popup"),a=r.length>0?r[0]:null;this.getAttribute("data-design-mode")!=="1"&&this.addEventListener("click",function(){if(a){var c=n.getAttribute("ft-change-transition");setTimeout(function(){c==="top"?(n.style.top="-100%",n.style.bottom="100%"):c==="right"?(n.style.left="100%",n.style.right="-100%"):c==="bottom"?(n.style.top="100%",n.style.bottom="-100%"):c==="left"&&(n.style.left="-100%",n.style.right="100%"),n.style.opacity="0"},50),setTimeout(function(){a.style.display="none"},250)}})
1701  /**
1702   * This function manages the mouseOver and mouseOut of the element
1703   */
1704  const manageMouseOver = (add=true) => {
1705    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
1706      return;
1707    }
1708    console.log("manageMouseOver",add);
1709    var timer=null;
1710    const onmouseenter = () => {
1711      if (!timer) {
1712        setTimeout(() => {
1713          this.classList.remove("noAnime"); 
1714          console.log("onmouseenter");
1715        }, 50);
1716        // if there was no timer and the animation is just run, then add the timer again.
1717        timer = setTimeout(() => {
1718          console.log("onmouseenter 1");
1719          requestAnimationFrame(() => {
1720            console.log("onmouseenter 2");
1721            timer = null;
1722          });
1723        }, 100)
1724      }
1725    }
1726    const onmouseleave = () => {
1727      requestAnimationFrame(() => {
1728        if (!timer && !this.classList.contains("noAnime")) {
1729          console.log("onmouseleave");
1730          this.classList.add("noAnime");
1731          timer=null;
1732        }
1733      });
1734    }
1735    if(add){  
1736      //this.addEventListener("mouseenter",onmouseenter);
1737      //this.addEventListener("mouseleave",onmouseleave);
1738      this.onmouseenter = onmouseenter; 
1739      this.onmouseleave = onmouseleave;
1740    }else{
1741      //this.removeEventListener("mouseenter",onmouseenter);
1742      //this.removeEventListener("mouseleave",onmouseleave);
1743      this.onmouseenter = null;
1744      this.onmouseleave = null;
1745    }
1746  }
1747  if(this.getAttribute("on-animate")=="1"){
1748    this.classList.add("noAnime");
1749    if(this.getAttribute("on-entrance-animate")!="1"){
1750      manageMouseOver(true);
1751    }else{
1752      manageMouseOver(false);
1753    }
1754  }
1755
1756  /**
1757   * This function manages the intersection of the element for entracnce animation
1758   */
1759  const observeIntersection = () => {
1760    // initialize the global timer variable that shall be used at a time.
1761    var timer = null;
1762    var isInView = false;
1763    const iframe = window.frameElement;
1764    const iframeRect = iframe?.getBoundingClientRect() || {};
1765    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
1766    
1767    const callback = (entries) => {
1768      entries.forEach((entry) => {
1769        // Update isInView state
1770        isInView = entry.isIntersecting;
1771        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
1772        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
1773        if(entryRatio < animationTrigger){
1774          animationTrigger=entryRatio;
1775        }
1776        if (entry.isIntersecting) {
1777          // Element is entering view
1778          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
1779          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
1780          if (!timer && intersectionRatio >= animationTrigger) {
1781            
1782            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
1783            let delay = 0;
1784            try{
1785              delay = delayStr?parseFloat(delayStr):0;
1786            }catch(e){
1787              delay = 0;
1788            }
1789            setTimeout(() => {
1790              if(this.classList.contains("noAnime")){
1791                if(delay > 0){
1792                  setTimeout(() => {
1793                    this.style.removeProperty('opacity');
1794                  }, delay*1000+10);
1795                }else{
1796                  this.style.removeProperty('opacity');
1797                }
1798                this.classList.remove("noAnime"); 
1799                //console.log("enter",this.getAttribute("id"));
1800              }
1801            }, 50);
1802            // if there was no timer and the animation is just run, then add the timer again.
1803            timer = setTimeout(() => {
1804              //console.log("enter 1",this.getAttribute("id"));
1805              requestAnimationFrame(() => {
1806                //console.log("enter 2",this.getAttribute("id"));
1807                timer = null;
1808              });
1809            }, delay>0?delay*1000+500:500)
1810          }
1811        } else {
1812          // When element leaves viewport
1813          if (this.getAttribute("on-animate")=="1") {
1814            // Use requestAnimationFrame to check if element is still out of view
1815            requestAnimationFrame(() => {
1816              if (!isInView && !timer) {
1817                this.classList.add("noAnime");
1818                this.style.opacity = '0';
1819              }
1820            });
1821          }
1822        }
1823      });
1824    };
1825
1826    const myObserver = new IntersectionObserver(callback, { 
1827      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
1828    });
1829    
1830    // Set initial opacity and class
1831    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1832      this.classList.add("noAnime");
1833      this.style.opacity = '0';
1834      myObserver.observe(this);
1835    }
1836  }
1837
1838  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1839    observeIntersection();
1840  }
1841}.bind(el))(props[el.id]);
1842          }
1843          var items = document.querySelectorAll('#ipiri, #i5dno');
1844          for (var i = 0, len = items.length; i < len; i++) {
1845            (function(){
1846var t1,G=this,q=(t1=this.childNodes[0])===null||t1===void 0?void 0:t1.parentElement;this.getAttribute("data-design-mode")!=="1"&&this.getAttribute("ft-popup")&&this.addEventListener("click",function(C){console.log("item click",G.getAttribute("extra_params")),G.getAttribute("extra_params")&&history.pushState({extraParams:G.getAttribute("extra_params")},""),function(Z){var Q=Z.target;if(Z.target.getAttribute("ft-popup")?Q=Z.target:q!=null&&q.getAttribute("ft-popup")&&(Q=q),Q.getAttribute("ft-popup")){Z.preventDefault();var j=document.getElementById(Q.getAttribute("ft-popup")),L=j==null?void 0:j.getAttribute("ft-change-transition"),H=j==null?void 0:j.getElementsByClassName("popup")[0];H&&(H.style.display="flex"),j&&(L==="top"||L==="bottom"?(j.style.top="0%",j.style.bottom="0%"):L!=="right"&&L!=="left"||(j.style.left="0%",j.style.right="0%"),setTimeout(function(){j.style.display="flex",j.style.opacity="1"},50))}}(C)})
1847  /**
1848   * This function manages the mouseOver and mouseOut of the element
1849   */
1850  const manageMouseOver = (add=true) => {
1851    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
1852      return;
1853    }
1854    console.log("manageMouseOver",add);
1855    var timer=null;
1856    const onmouseenter = () => {
1857      if (!timer) {
1858        setTimeout(() => {
1859          this.classList.remove("noAnime"); 
1860          console.log("onmouseenter");
1861        }, 50);
1862        // if there was no timer and the animation is just run, then add the timer again.
1863        timer = setTimeout(() => {
1864          console.log("onmouseenter 1");
1865          requestAnimationFrame(() => {
1866            console.log("onmouseenter 2");
1867            timer = null;
1868          });
1869        }, 100)
1870      }
1871    }
1872    const onmouseleave = () => {
1873      requestAnimationFrame(() => {
1874        if (!timer && !this.classList.contains("noAnime")) {
1875          console.log("onmouseleave");
1876          this.classList.add("noAnime");
1877          timer=null;
1878        }
1879      });
1880    }
1881    if(add){  
1882      //this.addEventListener("mouseenter",onmouseenter);
1883      //this.addEventListener("mouseleave",onmouseleave);
1884      this.onmouseenter = onmouseenter; 
1885      this.onmouseleave = onmouseleave;
1886    }else{
1887      //this.removeEventListener("mouseenter",onmouseenter);
1888      //this.removeEventListener("mouseleave",onmouseleave);
1889      this.onmouseenter = null;
1890      this.onmouseleave = null;
1891    }
1892  }
1893  if(this.getAttribute("on-animate")=="1"){
1894    this.classList.add("noAnime");
1895    if(this.getAttribute("on-entrance-animate")!="1"){
1896      manageMouseOver(true);
1897    }else{
1898      manageMouseOver(false);
1899    }
1900  }
1901
1902  /**
1903   * This function manages the intersection of the element for entracnce animation
1904   */
1905  const observeIntersection = () => {
1906    // initialize the global timer variable that shall be used at a time.
1907    var timer = null;
1908    var isInView = false;
1909    const iframe = window.frameElement;
1910    const iframeRect = iframe?.getBoundingClientRect() || {};
1911    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
1912    
1913    const callback = (entries) => {
1914      entries.forEach((entry) => {
1915        // Update isInView state
1916        isInView = entry.isIntersecting;
1917        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
1918        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
1919        if(entryRatio < animationTrigger){
1920          animationTrigger=entryRatio;
1921        }
1922        if (entry.isIntersecting) {
1923          // Element is entering view
1924          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
1925          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
1926          if (!timer && intersectionRatio >= animationTrigger) {
1927            
1928            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
1929            let delay = 0;
1930            try{
1931              delay = delayStr?parseFloat(delayStr):0;
1932            }catch(e){
1933              delay = 0;
1934            }
1935            setTimeout(() => {
1936              if(this.classList.contains("noAnime")){
1937                if(delay > 0){
1938                  setTimeout(() => {
1939                    this.style.removeProperty('opacity');
1940                  }, delay*1000+10);
1941                }else{
1942                  this.style.removeProperty('opacity');
1943                }
1944                this.classList.remove("noAnime"); 
1945                //console.log("enter",this.getAttribute("id"));
1946              }
1947            }, 50);
1948            // if there was no timer and the animation is just run, then add the timer again.
1949            timer = setTimeout(() => {
1950              //console.log("enter 1",this.getAttribute("id"));
1951              requestAnimationFrame(() => {
1952                //console.log("enter 2",this.getAttribute("id"));
1953                timer = null;
1954              });
1955            }, delay>0?delay*1000+500:500)
1956          }
1957        } else {
1958          // When element leaves viewport
1959          if (this.getAttribute("on-animate")=="1") {
1960            // Use requestAnimationFrame to check if element is still out of view
1961            requestAnimationFrame(() => {
1962              if (!isInView && !timer) {
1963                this.classList.add("noAnime");
1964                this.style.opacity = '0';
1965              }
1966            });
1967          }
1968        }
1969      });
1970    };
1971
1972    const myObserver = new IntersectionObserver(callback, { 
1973      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
1974    });
1975    
1976    // Set initial opacity and class
1977    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1978      this.classList.add("noAnime");
1979      this.style.opacity = '0';
1980      myObserver.observe(this);
1981    }
1982  }
1983
1984  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
1985    observeIntersection();
1986  }
1987
1988}.bind(items[i]))();
1989          }
1990          var items = document.querySelectorAll('#iao4x');
1991          for (var i = 0, len = items.length; i < len; i++) {
1992            (function(){
1993
1994  /**
1995   * This function manages the mouseOver and mouseOut of the element
1996   */
1997  const manageMouseOver = (add=true) => {
1998    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
1999      return;
2000    }
2001    console.log("manageMouseOver",add);
2002    var timer=null;
2003    const onmouseenter = () => {
2004      if (!timer) {
2005        setTimeout(() => {
2006          this.classList.remove("noAnime"); 
2007          console.log("onmouseenter");
2008        }, 50);
2009        // if there was no timer and the animation is just run, then add the timer again.
2010        timer = setTimeout(() => {
2011          console.log("onmouseenter 1");
2012          requestAnimationFrame(() => {
2013            console.log("onmouseenter 2");
2014            timer = null;
2015          });
2016        }, 100)
2017      }
2018    }
2019    const onmouseleave = () => {
2020      requestAnimationFrame(() => {
2021        if (!timer && !this.classList.contains("noAnime")) {
2022          console.log("onmouseleave");
2023          this.classList.add("noAnime");
2024          timer=null;
2025        }
2026      });
2027    }
2028    if(add){  
2029      //this.addEventListener("mouseenter",onmouseenter);
2030      //this.addEventListener("mouseleave",onmouseleave);
2031      this.onmouseenter = onmouseenter; 
2032      this.onmouseleave = onmouseleave;
2033    }else{
2034      //this.removeEventListener("mouseenter",onmouseenter);
2035      //this.removeEventListener("mouseleave",onmouseleave);
2036      this.onmouseenter = null;
2037      this.onmouseleave = null;
2038    }
2039  }
2040  if(this.getAttribute("on-animate")=="1"){
2041    this.classList.add("noAnime");
2042    if(this.getAttribute("on-entrance-animate")!="1"){
2043      manageMouseOver(true);
2044    }else{
2045      manageMouseOver(false);
2046    }
2047  }
2048
2049  /**
2050   * This function manages the intersection of the element for entracnce animation
2051   */
2052  const observeIntersection = () => {
2053    // initialize the global timer variable that shall be used at a time.
2054    var timer = null;
2055    var isInView = false;
2056    const iframe = window.frameElement;
2057    const iframeRect = iframe?.getBoundingClientRect() || {};
2058    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
2059    
2060    const callback = (entries) => {
2061      entries.forEach((entry) => {
2062        // Update isInView state
2063        isInView = entry.isIntersecting;
2064        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
2065        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
2066        if(entryRatio < animationTrigger){
2067          animationTrigger=entryRatio;
2068        }
2069        if (entry.isIntersecting) {
2070          // Element is entering view
2071          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
2072          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
2073          if (!timer && intersectionRatio >= animationTrigger) {
2074            
2075            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
2076            let delay = 0;
2077            try{
2078              delay = delayStr?parseFloat(delayStr):0;
2079            }catch(e){
2080              delay = 0;
2081            }
2082            setTimeout(() => {
2083              if(this.classList.contains("noAnime")){
2084                if(delay > 0){
2085                  setTimeout(() => {
2086                    this.style.removeProperty('opacity');
2087                  }, delay*1000+10);
2088                }else{
2089                  this.style.removeProperty('opacity');
2090                }
2091                this.classList.remove("noAnime"); 
2092                //console.log("enter",this.getAttribute("id"));
2093              }
2094            }, 50);
2095            // if there was no timer and the animation is just run, then add the timer again.
2096            timer = setTimeout(() => {
2097              //console.log("enter 1",this.getAttribute("id"));
2098              requestAnimationFrame(() => {
2099                //console.log("enter 2",this.getAttribute("id"));
2100                timer = null;
2101              });
2102            }, delay>0?delay*1000+500:500)
2103          }
2104        } else {
2105          // When element leaves viewport
2106          if (this.getAttribute("on-animate")=="1") {
2107            // Use requestAnimationFrame to check if element is still out of view
2108            requestAnimationFrame(() => {
2109              if (!isInView && !timer) {
2110                this.classList.add("noAnime");
2111                this.style.opacity = '0';
2112              }
2113            });
2114          }
2115        }
2116      });
2117    };
2118
2119    const myObserver = new IntersectionObserver(callback, { 
2120      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
2121    });
2122    
2123    // Set initial opacity and class
2124    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2125      this.classList.add("noAnime");
2126      this.style.opacity = '0';
2127      myObserver.observe(this);
2128    }
2129  }
2130
2131  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2132    observeIntersection();
2133  }
2134
2135}.bind(items[i]))();
2136          }
2137          var props = {"iaqsi":{"input_id":"guav00","form_id":"ohqsbi","jsVersion":"","isDevJs":1}};
2138          var ids = Object.keys(props).map(function(id) { return '#'+id }).join(',');
2139          var els = document.querySelectorAll(ids);
2140          for (var i = 0, len = els.length; i < len; i++) {
2141            var el = els[i];
2142            (function(u){var m=u.input_id,l=u.form_id,i=this.id;console.log("form script",i);var h=this,f=window.jsVersion?window.jsVersion:u.jsVersion?u.jsVersion:"",c=window.isDevJs?window.isDevJs:u.isDevJs?u.isDevJs:"";window._crmcoFormInitialized||(window._crmcoFormInitialized={});var k=function(){if(window._crmcoFormInitialized[i]){console.log("Form already initialized for element:",i);return}console.log("initFormLib");var x={inputId:m,formId:l,jsVersion:f,designerMode:h.getAttribute("data-designer-mode")=="1",isDevJs:c,elementId:i};typeof window.initCrmcoEmbedForm=="function"?(console.log("initFormLib 1"),window.initCrmcoEmbedForm(h,x),window._crmcoFormInitialized[i]=!0):typeof initCrmcoEmbedForm!="undefined"&&(console.log("initFormLib 2"),initCrmcoEmbedForm(h,x),window._crmcoFormInitialized[i]=!0)},I=function(){var x=document.createElement("link");x.setAttribute("id","crmco-form-theme-default-style"),x.setAttribute("rel","stylesheet"),x.setAttribute("charset","utf-8"),x.setAttribute("media","all"),x.setAttribute("type","text/css"),x.href="".concat("","/resources/assets/site/form-themes/default.min.css"),document.head.prepend(x);var C=document.createElement("script");C.onload=k,C.onerror=function(){console.error("Failed to load form script, retrying..."),setTimeout(function(){var Y=document.createElement("script");Y.onload=k,Y.async=!1,Y.id="crmco-form-js-retry",Y.src="".concat("","/resources/assets/site/forms/crmco-form.js").concat(f||""),document.head.appendChild(Y)},1e3)},C.async=!1,C.id="crmco-form-js",C.src="".concat("","/resources/assets/site/forms/crmco-form.js").concat(f||""),document.head.appendChild(C)};
2142if(console.log("crmcoFormLoad",typeof initCrmcoEmbedForm=="undefined",typeof window.initCrmcoEmbedForm=="undefined"),typeof initCrmcoEmbedForm=="undefined"&&typeof window.initCrmcoEmbedForm=="undefined"){console.log("crmcoFormLoad 0",document.readyState);var p=document.querySelector('script[src*="cloudflare"]')!==null||document.querySelector('script[src*="cf"]')!==null||document.querySelector('script[src*="cdn-cgi"]')!==null;console.log("Is Cloudflare detected:",p);var L=function d(){console.log("loadForm called"),document.body.contains(h)?I():(console.log("Element not in DOM yet, waiting..."),setTimeout(d,100))};if(document.readyState==="loading"){console.log("crmcoFormLoad 0.1"),L();var y=new MutationObserver(function(d,x){document.body.contains(h)&&(console.log("Element found via MutationObserver"),L(),x.disconnect())});y.observe(document.body,{childList:!0,subtree:!0});var V=["DOMContentLoaded","load"],$=[window,document];V.forEach(function(d){$.forEach(function(x){x.addEventListener(d,function(){console.log("".concat(d," fired on ").concat(x===window?"window":"document")),L()})})});var G=0,ee=50,_=setInterval(function(){G++,document.body.contains(h)?(console.log("Element found via polling"),L(),clearInterval(_)):G>=ee&&(console.log("Max polling attempts reached"),clearInterval(_))},100)}else console.log("crmcoFormLoad 1"),L();setTimeout(function(){typeof initCrmcoEmbedForm=="undefined"&&typeof window.initCrmcoEmbedForm=="undefined"&&(console.log("Fallback: Form not loaded yet, trying again..."),L())},2e3)}else console.log("crmcoFormLoad 3"),k()
2143  /**
2144   * This function manages the mouseOver and mouseOut of the element
2145   */
2146  const manageMouseOver = (add=true) => {
2147    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
2148      return;
2149    }
2150    console.log("manageMouseOver",add);
2151    var timer=null;
2152    const onmouseenter = () => {
2153      if (!timer) {
2154        setTimeout(() => {
2155          this.classList.remove("noAnime"); 
2156          console.log("onmouseenter");
2157        }, 50);
2158        // if there was no timer and the animation is just run, then add the timer again.
2159        timer = setTimeout(() => {
2160          console.log("onmouseenter 1");
2161          requestAnimationFrame(() => {
2162            console.log("onmouseenter 2");
2163            timer = null;
2164          });
2165        }, 100)
2166      }
2167    }
2168    const onmouseleave = () => {
2169      requestAnimationFrame(() => {
2170        if (!timer && !this.classList.contains("noAnime")) {
2171          console.log("onmouseleave");
2172          this.classList.add("noAnime");
2173          timer=null;
2174        }
2175      });
2176    }
2177    if(add){  
2178      //this.addEventListener("mouseenter",onmouseenter);
2179      //this.addEventListener("mouseleave",onmouseleave);
2180      this.onmouseenter = onmouseenter; 
2181      this.onmouseleave = onmouseleave;
2182    }else{
2183      //this.removeEventListener("mouseenter",onmouseenter);
2184      //this.removeEventListener("mouseleave",onmouseleave);
2185      this.onmouseenter = null;
2186      this.onmouseleave = null;
2187    }
2188  }
2189  if(this.getAttribute("on-animate")=="1"){
2190    this.classList.add("noAnime");
2191    if(this.getAttribute("on-entrance-animate")!="1"){
2192      manageMouseOver(true);
2193    }else{
2194      manageMouseOver(false);
2195    }
2196  }
2197
2198  /**
2199   * This function manages the intersection of the element for entracnce animation
2200   */
2201  const observeIntersection = () => {
2202    // initialize the global timer variable that shall be used at a time.
2203    var timer = null;
2204    var isInView = false;
2205    const iframe = window.frameElement;
2206    const iframeRect = iframe?.getBoundingClientRect() || {};
2207    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
2208    
2209    const callback = (entries) => {
2210      entries.forEach((entry) => {
2211        // Update isInView state
2212        isInView = entry.isIntersecting;
2213        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
2214        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
2215        if(entryRatio < animationTrigger){
2216          animationTrigger=entryRatio;
2217        }
2218        if (entry.isIntersecting) {
2219          // Element is entering view
2220          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
2221          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
2222          if (!timer && intersectionRatio >= animationTrigger) {
2223            
2224            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
2225            let delay = 0;
2226            try{
2227              delay = delayStr?parseFloat(delayStr):0;
2228            }catch(e){
2229              delay = 0;
2230            }
2231            setTimeout(() => {
2232              if(this.classList.contains("noAnime")){
2233                if(delay > 0){
2234                  setTimeout(() => {
2235                    this.style.removeProperty('opacity');
2236                  }, delay*1000+10);
2237                }else{
2238                  this.style.removeProperty('opacity');
2239                }
2240                this.classList.remove("noAnime"); 
2241                //console.log("enter",this.getAttribute("id"));
2242              }
2243            }, 50);
2244            // if there was no timer and the animation is just run, then add the timer again.
2245            timer = setTimeout(() => {
2246              //console.log("enter 1",this.getAttribute("id"));
2247              requestAnimationFrame(() => {
2248                //console.log("enter 2",this.getAttribute("id"));
2249                timer = null;
2250              });
2251            }, delay>0?delay*1000+500:500)
2252          }
2253        } else {
2254          // When element leaves viewport
2255          if (this.getAttribute("on-animate")=="1") {
2256            // Use requestAnimationFrame to check if element is still out of view
2257            requestAnimationFrame(() => {
2258              if (!isInView && !timer) {
2259                this.classList.add("noAnime");
2260                this.style.opacity = '0';
2261              }
2262            });
2263          }
2264        }
2265      });
2266    };
2267
2268    const myObserver = new IntersectionObserver(callback, { 
2269      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
2270    });
2271    
2272    // Set initial opacity and class
2273    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2274      this.classList.add("noAnime");
2275      this.style.opacity = '0';
2276      myObserver.observe(this);
2277    }
2278  }
2279
2280  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2281    observeIntersection();
2282  }
2283}.bind(el))(props[el.id]);
2284          }
2285          var items = document.querySelectorAll('#ics9i');
2286          for (var i = 0, len = items.length; i < len; i++) {
2287            (function(){
2288
2289  /**
2290   * This function manages the mouseOver and mouseOut of the element
2291   */
2292  const manageMouseOver = (add=true) => {
2293    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
2294      return;
2295    }
2296    console.log("manageMouseOver",add);
2297    var timer=null;
2298    const onmouseenter = () => {
2299      if (!timer) {
2300        setTimeout(() => {
2301          this.classList.remove("noAnime"); 
2302          console.log("onmouseenter");
2303        }, 50);
2304        // if there was no timer and the animation is just run, then add the timer again.
2305        timer = setTimeout(() => {
2306          console.log("onmouseenter 1");
2307          requestAnimationFrame(() => {
2308            console.log("onmouseenter 2");
2309            timer = null;
2310          });
2311        }, 100)
2312      }
2313    }
2314    const onmouseleave = () => {
2315      requestAnimationFrame(() => {
2316        if (!timer && !this.classList.contains("noAnime")) {
2317          console.log("onmouseleave");
2318          this.classList.add("noAnime");
2319          timer=null;
2320        }
2321      });
2322    }
2323    if(add){  
2324      //this.addEventListener("mouseenter",onmouseenter);
2325      //this.addEventListener("mouseleave",onmouseleave);
2326      this.onmouseenter = onmouseenter; 
2327      this.onmouseleave = onmouseleave;
2328    }else{
2329      //this.removeEventListener("mouseenter",onmouseenter);
2330      //this.removeEventListener("mouseleave",onmouseleave);
2331      this.onmouseenter = null;
2332      this.onmouseleave = null;
2333    }
2334  }
2335  if(this.getAttribute("on-animate")=="1"){
2336    this.classList.add("noAnime");
2337    if(this.getAttribute("on-entrance-animate")!="1"){
2338      manageMouseOver(true);
2339    }else{
2340      manageMouseOver(false);
2341    }
2342  }
2343
2344  /**
2345   * This function manages the intersection of the element for entracnce animation
2346   */
2347  const observeIntersection = () => {
2348    // initialize the global timer variable that shall be used at a time.
2349    var timer = null;
2350    var isInView = false;
2351    const iframe = window.frameElement;
2352    const iframeRect = iframe?.getBoundingClientRect() || {};
2353    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
2354    
2355    const callback = (entries) => {
2356      entries.forEach((entry) => {
2357        // Update isInView state
2358        isInView = entry.isIntersecting;
2359        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
2360        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
2361        if(entryRatio < animationTrigger){
2362          animationTrigger=entryRatio;
2363        }
2364        if (entry.isIntersecting) {
2365          // Element is entering view
2366          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
2367          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
2368          if (!timer && intersectionRatio >= animationTrigger) {
2369            
2370            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
2371            let delay = 0;
2372            try{
2373              delay = delayStr?parseFloat(delayStr):0;
2374            }catch(e){
2375              delay = 0;
2376            }
2377            setTimeout(() => {
2378              if(this.classList.contains("noAnime")){
2379                if(delay > 0){
2380                  setTimeout(() => {
2381                    this.style.removeProperty('opacity');
2382                  }, delay*1000+10);
2383                }else{
2384                  this.style.removeProperty('opacity');
2385                }
2386                this.classList.remove("noAnime"); 
2387                //console.log("enter",this.getAttribute("id"));
2388              }
2389            }, 50);
2390            // if there was no timer and the animation is just run, then add the timer again.
2391            timer = setTimeout(() => {
2392              //console.log("enter 1",this.getAttribute("id"));
2393              requestAnimationFrame(() => {
2394                //console.log("enter 2",this.getAttribute("id"));
2395                timer = null;
2396              });
2397            }, delay>0?delay*1000+500:500)
2398          }
2399        } else {
2400          // When element leaves viewport
2401          if (this.getAttribute("on-animate")=="1") {
2402            // Use requestAnimationFrame to check if element is still out of view
2403            requestAnimationFrame(() => {
2404              if (!isInView && !timer) {
2405                this.classList.add("noAnime");
2406                this.style.opacity = '0';
2407              }
2408            });
2409          }
2410        }
2411      });
2412    };
2413
2414    const myObserver = new IntersectionObserver(callback, { 
2415      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
2416    });
2417    
2418    // Set initial opacity and class
2419    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2420      this.classList.add("noAnime");
2421      this.style.opacity = '0';
2422      myObserver.observe(this);
2423    }
2424  }
2425
2426  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2427    observeIntersection();
2428  }
2429
2430}.bind(items[i]))();
2431          }
2432          var props = {"i7yj1":{"stylePrefix":"crm-"}};
2433          var ids = Object.keys(props).map(function(id) { return '#'+id }).join(',');
2434          var els = document.querySelectorAll(ids);
2435          for (var i = 0, len = els.length; i < len; i++) {
2436            var el = els[i];
2437            (function(b){var k=b.stylePrefix,u1=document.getElementById("".concat(k,"background-style"));if(!u1){var M1=`
2438                .`.concat(k,`bg{
2439                    position: absolute;
2440                    top: 0;
2441                    left: 0;
2442                    bottom:0;
2443                    right:0;
2444                    width: 100%;
2445                    height: 100%;
2446                    z-index:-1;
2447                }
2448                .`).concat(k,`bg-color{
2449                    position: absolute;
2450                    top: 0;
2451                    left: 0;
2452                    bottom:0;
2453                    right:0;
2454                    width: 100%;
2455                    height: 100%;
2456                }
2457                .`).concat(k,`bg-image{
2458                    position: absolute;
2459                    top: 0;
2460                    left: 0;
2461                    bottom:0;
2462                    right:0;
2463                    width: 100%;
2464                    height: 100%;
2465                    background-repeat: no-repeat;
2466                    background-size: cover;
2467                }
2468                .`).concat(k,`bg-video{
2469                    position: absolute;
2470                    top: 0;
2471                    left: 0;
2472                    bottom:0;
2473                    right:0;
2474                    width: 100%;
2475                    height: 100%;
2476                }
2477            `);(u1=document.createElement("style")).id="".concat(k,"background-style"),u1.type="text/css",u
24771.styleSheet?u1.styleSheet.cssText=M1:u1.appendChild(document.createTextNode(M1)),document.head.appendChild(u1)}
2478  /**
2479   * This function manages the mouseOver and mouseOut of the element
2480   */
2481  const manageMouseOver = (add=true) => {
2482    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
2483      return;
2484    }
2485    console.log("manageMouseOver",add);
2486    var timer=null;
2487    const onmouseenter = () => {
2488      if (!timer) {
2489        setTimeout(() => {
2490          this.classList.remove("noAnime"); 
2491          console.log("onmouseenter");
2492        }, 50);
2493        // if there was no timer and the animation is just run, then add the timer again.
2494        timer = setTimeout(() => {
2495          console.log("onmouseenter 1");
2496          requestAnimationFrame(() => {
2497            console.log("onmouseenter 2");
2498            timer = null;
2499          });
2500        }, 100)
2501      }
2502    }
2503    const onmouseleave = () => {
2504      requestAnimationFrame(() => {
2505        if (!timer && !this.classList.contains("noAnime")) {
2506          console.log("onmouseleave");
2507          this.classList.add("noAnime");
2508          timer=null;
2509        }
2510      });
2511    }
2512    if(add){  
2513      //this.addEventListener("mouseenter",onmouseenter);
2514      //this.addEventListener("mouseleave",onmouseleave);
2515      this.onmouseenter = onmouseenter; 
2516      this.onmouseleave = onmouseleave;
2517    }else{
2518      //this.removeEventListener("mouseenter",onmouseenter);
2519      //this.removeEventListener("mouseleave",onmouseleave);
2520      this.onmouseenter = null;
2521      this.onmouseleave = null;
2522    }
2523  }
2524  if(this.getAttribute("on-animate")=="1"){
2525    this.classList.add("noAnime");
2526    if(this.getAttribute("on-entrance-animate")!="1"){
2527      manageMouseOver(true);
2528    }else{
2529      manageMouseOver(false);
2530    }
2531  }
2532
2533  /**
2534   * This function manages the intersection of the element for entracnce animation
2535   */
2536  const observeIntersection = () => {
2537    // initialize the global timer variable that shall be used at a time.
2538    var timer = null;
2539    var isInView = false;
2540    const iframe = window.frameElement;
2541    const iframeRect = iframe?.getBoundingClientRect() || {};
2542    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
2543    
2544    const callback = (entries) => {
2545      entries.forEach((entry) => {
2546        // Update isInView state
2547        isInView = entry.isIntersecting;
2548        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
2549        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
2550        if(entryRatio < animationTrigger){
2551          animationTrigger=entryRatio;
2552        }
2553        if (entry.isIntersecting) {
2554          // Element is entering view
2555          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
2556          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
2557          if (!timer && intersectionRatio >= animationTrigger) {
2558            
2559            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
2560            let delay = 0;
2561            try{
2562              delay = delayStr?parseFloat(delayStr):0;
2563            }catch(e){
2564              delay = 0;
2565            }
2566            setTimeout(() => {
2567              if(this.classList.contains("noAnime")){
2568                if(delay > 0){
2569                  setTimeout(() => {
2570                    this.style.removeProperty('opacity');
2571                  }, delay*1000+10);
2572                }else{
2573                  this.style.removeProperty('opacity');
2574                }
2575                this.classList.remove("noAnime"); 
2576                //console.log("enter",this.getAttribute("id"));
2577              }
2578            }, 50);
2579            // if there was no timer and the animation is just run, then add the timer again.
2580            timer = setTimeout(() => {
2581              //console.log("enter 1",this.getAttribute("id"));
2582              requestAnimationFrame(() => {
2583                //console.log("enter 2",this.getAttribute("id"));
2584                timer = null;
2585              });
2586            }, delay>0?delay*1000+500:500)
2587          }
2588        } else {
2589          // When element leaves viewport
2590          if (this.getAttribute("on-animate")=="1") {
2591            // Use requestAnimationFrame to check if element is still out of view
2592            requestAnimationFrame(() => {
2593              if (!isInView && !timer) {
2594                this.classList.add("noAnime");
2595                this.style.opacity = '0';
2596              }
2597            });
2598          }
2599        }
2600      });
2601    };
2602
2603    const myObserver = new IntersectionObserver(callback, { 
2604      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
2605    });
2606    
2607    // Set initial opacity and class
2608    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2609      this.classList.add("noAnime");
2610      this.style.opacity = '0';
2611      myObserver.observe(this);
2612    }
2613  }
2614
2615  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2616    observeIntersection();
2617  }
2618}.bind(el))(props[el.id]);
2619          }
2620          var items = document.querySelectorAll('#iuzwd');
2621          for (var i = 0, len = items.length; i < len; i++) {
2622            (function(){
2623
2624  /**
2625   * This function manages the mouseOver and mouseOut of the element
2626   */
2627  const manageMouseOver = (add=true) => {
2628    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
2629      return;
2630    }
2631    console.log("manageMouseOver",add);
2632    var timer=null;
2633    const onmouseenter = () => {
2634      if (!timer) {
2635        setTimeout(() => {
2636          this.classList.remove("noAnime"); 
2637          console.log("onmouseenter");
2638        }, 50);
2639        // if there was no timer and the animation is just run, then add the timer again.
2640        timer = setTimeout(() => {
2641          console.log("onmouseenter 1");
2642          requestAnimationFrame(() => {
2643            console.log("onmouseenter 2");
2644            timer = null;
2645          });
2646        }, 100)
2647      }
2648    }
2649    const onmouseleave = () => {
2650      requestAnimationFrame(() => {
2651        if (!timer && !this.classList.contains("noAnime")) {
2652          console.log("onmouseleave");
2653          this.classList.add("noAnime");
2654          timer=null;
2655        }
2656      });
2657    }
2658    if(add){  
2659      //this.addEventListener("mouseenter",onmouseenter);
2660      //this.addEventListener("mouseleave",onmouseleave);
2661      this.onmouseenter = onmouseenter; 
2662      this.onmouseleave = onmouseleave;
2663    }else{
2664      //this.removeEventListener("mouseenter",onmouseenter);
2665      //this.removeEventListener("mouseleave",onmouseleave);
2666      this.onmouseenter = null;
2667      this.onmouseleave = null;
2668    }
2669  }
2670  if(this.getAttribute("on-animate")=="1"){
2671    this.classList.add("noAnime");
2672    if(this.getAttribute("on-entrance-animate")!="1"){
2673      manageMouseOver(true);
2674    }else{
2675      manageMouseOver(false);
2676    }
2677  }
2678
2679  /**
2680   * This function manages the intersection of the element for entracnce animation
2681   */
2682  const observeIntersection = () => {
2683    // initialize the global timer variable that shall be used at a time.
2684    var timer = null;
2685    var isInView = false;
2686    const iframe = window.frameElement;
2687    const iframeRect = iframe?.getBoundingClientRect() || {};
2688    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
2689    
2690    const callback = (entries) => {
2691      entries.forEach((entry) => {
2692        // Update isInView state
2693        isInView = entry.isIntersecting;
2694        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
2695        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
2696        if(entryRatio < animationTrigger){
2697          animationTrigger=entryRatio;
2698        }
2699        if (entry.isIntersecting) {
2700          // Element is entering view
2701          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
2702          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
2703          if (!timer && intersectionRatio >= animationTrigger) {
2704            
2705            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
2706            let delay = 0;
2707            try{
2708              delay = delayStr?parseFloat(delayStr):0;
2709            }catch(e){
2710              delay = 0;
2711            }
2712            setTimeout(() => {
2713              if(this.classList.contains("noAnime")){
2714                if(delay > 0){
2715                  setTimeout(() => {
2716                    this.style.removeProperty('opacity');
2717                  }, delay*1000+10);
2718                }else{
2719                  this.style.removeProperty('opacity');
2720                }
2721                this.classList.remove("noAnime"); 
2722                //console.log("enter",this.getAttribute("id"));
2723              }
2724            }, 50);
2725            // if there was no timer and the animation is just run, then add the timer again.
2726            timer = setTimeout(() => {
2727              //console.log("enter 1",this.getAttribute("id"));
2728              requestAnimationFrame(() => {
2729                //console.log("enter 2",this.getAttribute("id"));
2730                timer = null;
2731              });
2732            }, delay>0?delay*1000+500:500)
2733          }
2734        } else {
2735          // When element leaves viewport
2736          if (this.getAttribute("on-animate")=="1") {
2737            // Use requestAnimationFrame to check if element is still out of view
2738            requestAnimationFrame(() => {
2739              if (!isInView && !timer) {
2740                this.classList.add("noAnime");
2741                this.style.opacity = '0';
2742              }
2743            });
2744          }
2745        }
2746      });
2747    };
2748
2749    const myObserver = new IntersectionObserver(callback, { 
2750      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
2751    });
2752    
2753    // Set initial opacity and class
2754    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2755      this.classList.add("noAnime");
2756      this.style.opacity = '0';
2757      myObserver.observe(this);
2758    }
2759  }
2760
2761  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2762    observeIntersection();
2763  }
2764
2765}.bind(items[i]))();
2766          }
2767          var props = {"ifpel":{}};
2768          var ids = Object.keys(props).map(function(id) { return '#'+id }).join(',');
2769          var els = document.querySelectorAll(ids);
2770          for (var i = 0, len = els.length; i < len; i++) {
2771            var el = els[i];
2772            (function e9(o){var n=this,r=function(a,c){var l=n.children;if(l&&l[0]){var v=function(){var d=o["ft-video-ratio"],m=16,b=9;if(d){var k=d.split(":");k&&k.length===2&&(m=+k[0],b=+k[1])}var u1=n.offsetWidth,M1=b/m*u1;return n.offsetHeight>M1&&(u1=m/b*(M1=n.offsetHeight)),{height:M1,width:u1}}(),f=v.height,s=v.width;a&&c||(a=n.offsetHeight,c=n.offsetWidth),l[0].style.height=f+"px",l[0].style.width=s+"px",l[0].style.top="".concat(-(f/2-a/2),"px"),l[0].style.left="".concat(-(s/2-c/2),"px")}};this.getAttribute("data-design-mode")!="1"&&(new ResizeObserver(function(a){requestAnimationFrame(function(){var c=a[0];r.bind(n,c.contentRect.height,c.contentRect.width)()})}).observe(this),r())
2773  /**
2774   * This function manages the mouseOver and mouseOut of the element
2775   */
2776  const manageMouseOver = (add=true) => {
2777    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
2778      return;
2779    }
2780    console.log("manageMouseOver",add);
2781    var timer=null;
2782    const onmouseenter = () => {
2783      if (!timer) {
2784        setTimeout(() => {
2785          this.classList.remove("noAnime"); 
2786          console.log("onmouseenter");
2787        }, 50);
2788        // if there was no timer and the animation is just run, then add the timer again.
2789        timer = setTimeout(() => {
2790          console.log("onmouseenter 1");
2791          requestAnimationFrame(() => {
2792            console.log("onmouseenter 2");
2793            timer = null;
2794          });
2795        }, 100)
2796      }
2797    }
2798    const onmouseleave = () => {
2799      requestAnimationFrame(() => {
2800        if (!timer && !this.classList.contains("noAnime")) {
2801          console.log("onmouseleave");
2802          this.classList.add("noAnime");
2803          timer=null;
2804        }
2805      });
2806    }
2807    if(add){  
2808      //this.addEventListener("mouseenter",onmouseenter);
2809      //this.addEventListener("mouseleave",onmouseleave);
2810      this.onmouseenter = onmouseenter; 
2811      this.onmouseleave = onmouseleave;
2812    }else{
2813      //this.removeEventListener("mouseenter",onmouseenter);
2814      //this.removeEventListener("mouseleave",onmouseleave);
2815      this.onmouseenter = null;
2816      this.onmouseleave = null;
2817    }
2818  }
2819  if(this.getAttribute("on-animate")=="1"){
2820    this.classList.add("noAnime");
2821    if(this.getAttribute("on-entrance-animate")!="1"){
2822      manageMouseOver(true);
2823    }else{
2824      manageMouseOver(false);
2825    }
2826  }
2827
2828  /**
2829   * This function manages the intersection of the element for entracnce animation
2830   */
2831  const observeIntersection = () => {
2832    // initialize the global timer variable that shall be used at a time.
2833    var timer = null;
2834    var isInView = false;
2835    const iframe = window.frameElement;
2836    const iframeRect = iframe?.getBoundingClientRect() || {};
2837    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
2838    
2839    const callback = (entries) => {
2840      entries.forEach((entry) => {
2841        // Update isInView state
2842        isInView = entry.isIntersecting;
2843        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
2844        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
2845        if(entryRatio < animationTrigger){
2846          animationTrigger=entryRatio;
2847        }
2848        if (entry.isIntersecting) {
2849          // Element is entering view
2850          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
2851          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
2852          if (!timer && intersectionRatio >= animationTrigger) {
2853            
2854            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
2855            let delay = 0;
2856            try{
2857              delay = delayStr?parseFloat(delayStr):0;
2858            }catch(e){
2859              delay = 0;
2860            }
2861            setTimeout(() => {
2862              if(this.classList.contains("noAnime")){
2863                if(delay > 0){
2864                  setTimeout(() => {
2865                    this.style.removeProperty('opacity');
2866                  }, delay*1000+10);
2867                }else{
2868                  this.style.removeProperty('opacity');
2869                }
2870                this.classList.remove("noAnime"); 
2871                //console.log("enter",this.getAttribute("id"));
2872              }
2873            }, 50);
2874            // if there was no timer and the animation is just run, then add the timer again.
2875            timer = setTimeout(() => {
2876              //console.log("enter 1",this.getAttribute("id"));
2877              requestAnimationFrame(() => {
2878                //console.log("enter 2",this.getAttribute("id"));
2879                timer = null;
2880              });
2881            }, delay>0?delay*1000+500:500)
2882          }
2883        } else {
2884          // When element leaves viewport
2885          if (this.getAttribute("on-animate")=="1") {
2886            // Use requestAnimationFrame to check if element is still out of view
2887            requestAnimationFrame(() => {
2888              if (!isInView && !timer) {
2889                this.classList.add("noAnime");
2890                this.style.opacity = '0';
2891              }
2892            });
2893          }
2894        }
2895      });
2896    };
2897
2898    const myObserver = new IntersectionObserver(callback, { 
2899      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
2900    });
2901    
2902    // Set initial opacity and class
2903    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2904      this.classList.add("noAnime");
2905      this.style.opacity = '0';
2906      myObserver.observe(this);
2907    }
2908  }
2909
2910  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
2911    observeIntersection();
2912  }
2913}.bind(el))(props[el.id]);
2914          }
2915          var items = document.querySelectorAll('#isvvl');
2916          for (var i = 0, len = items.length; i < len; i++) {
2917            (function(){
2918
2919  /**
2920   * This function manages the mouseOver and mouseOut of the element
2921   */
2922  const manageMouseOver = (add=true) => {
2923    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
2924      return;
2925    }
2926    console.log("manageMouseOver",add);
2927    var timer=null;
2928    const onmouseenter = () => {
2929      if (!timer) {
2930        setTimeout(() => {
2931          this.classList.remove("noAnime"); 
2932          console.log("onmouseenter");
2933        }, 50);
2934        // if there was no timer and the animation is just run, then add the timer again.
2935        timer = setTimeout(() => {
2936          console.log("onmouseenter 1");
2937          requestAnimationFrame(() => {
2938            console.log("onmouseenter 2");
2939            timer = null;
2940          });
2941        }, 100)
2942      }
2943    }
2944    const onmouseleave = () => {
2945      requestAnimationFrame(() => {
2946        if (!timer && !this.classList.contains("noAnime")) {
2947          console.log("onmouseleave");
2948          this.classList.add("noAnime");
2949          timer=null;
2950        }
2951      });
2952    }
2953    if(add){  
2954      //this.addEventListener("mouseenter",onmouseenter);
2955      //this.addEventListener("mouseleave",onmouseleave);
2956      this.onmouseenter = onmouseenter; 
2957      this.onmouseleave = onmouseleave;
2958    }else{
2959      //this.removeEventListener("mouseenter",onmouseenter);
2960      //this.removeEventListener("mouseleave",onmouseleave);
2961      this.onmouseenter = null;
2962      this.onmouseleave = null;
2963    }
2964  }
2965  if(this.getAttribute("on-animate")=="1"){
2966    this.classList.add("noAnime");
2967    if(this.getAttribute("on-entrance-animate")!="1"){
2968      manageMouseOver(true);
2969    }else{
2970      manageMouseOver(false);
2971    }
2972  }
2973
2974  /**
2975   * This function manages the intersection of the element for entracnce animation
2976   */
2977  const observeIntersection = () => {
2978    // initialize the global timer variable that shall be used at a time.
2979    var timer = null;
2980    var isInView = false;
2981    const iframe = window.frameElement;
2982    const iframeRect = iframe?.getBoundingClientRect() || {};
2983    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
2984    
2985    const callback = (entries) => {
2986      entries.forEach((entry) => {
2987        // Update isInView state
2988        isInView = entry.isIntersecting;
2989        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
2990        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
2991        if(entryRatio < animationTrigger){
2992          animationTrigger=entryRatio;
2993        }
2994        if (entry.isIntersecting) {
2995          // Element is entering view
2996          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
2997          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
2998          if (!timer && intersectionRatio >= animationTrigger) {
2999            
3000            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
3001            let delay = 0;
3002            try{
3003              delay = delayStr?parseFloat(delayStr):0;
3004            }catch(e){
3005              delay = 0;
3006            }
3007            setTimeout(() => {
3008              if(this.classList.contains("noAnime")){
3009                if(delay > 0){
3010                  setTimeout(() => {
3011                    this.style.removeProperty('opacity');
3012                  }, delay*1000+10);
3013                }else{
3014                  this.style.removeProperty('opacity');
3015                }
3016                this.classList.remove("noAnime"); 
3017                //console.log("enter",this.getAttribute("id"));
3018              }
3019            }, 50);
3020            // if there was no timer and the animation is just run, then add the timer again.
3021            timer = setTimeout(() => {
3022              //console.log("enter 1",this.getAttribute("id"));
3023              requestAnimationFrame(() => {
3024                //console.log("enter 2",this.getAttribute("id"));
3025                timer = null;
3026              });
3027            }, delay>0?delay*1000+500:500)
3028          }
3029        } else {
3030          // When element leaves viewport
3031          if (this.getAttribute("on-animate")=="1") {
3032            // Use requestAnimationFrame to check if element is still out of view
3033            requestAnimationFrame(() => {
3034              if (!isInView && !timer) {
3035                this.classList.add("noAnime");
3036                this.style.opacity = '0';
3037              }
3038            });
3039          }
3040        }
3041      });
3042    };
3043
3044    const myObserver = new IntersectionObserver(callback, { 
3045      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
3046    });
3047    
3048    // Set initial opacity and class
3049    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3050      this.classList.add("noAnime");
3051      this.style.opacity = '0';
3052      myObserver.observe(this);
3053    }
3054  }
3055
3056  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3057    observeIntersection();
3058  }
3059
3060}.bind(items[i]))();
3061          }
3062          var items = document.querySelectorAll('#iw2x5');
3063          for (var i = 0, len = items.length; i < len; i++) {
3064            (function(){
3065
3066  /**
3067   * This function manages the mouseOver and mouseOut of the element
3068   */
3069  const manageMouseOver = (add=true) => {
3070    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
3071      return;
3072    }
3073    console.log("manageMouseOver",add);
3074    var timer=null;
3075    const onmouseenter = () => {
3076      if (!timer) {
3077        setTimeout(() => {
3078          this.classList.remove("noAnime"); 
3079          console.log("onmouseenter");
3080        }, 50);
3081        // if there was no timer and the animation is just run, then add the timer again.
3082        timer = setTimeout(() => {
3083          console.log("onmouseenter 1");
3084          requestAnimationFrame(() => {
3085            console.log("onmouseenter 2");
3086            timer = null;
3087          });
3088        }, 100)
3089      }
3090    }
3091    const onmouseleave = () => {
3092      requestAnimationFrame(() => {
3093        if (!timer && !this.classList.contains("noAnime")) {
3094          console.log("onmouseleave");
3095          this.classList.add("noAnime");
3096          timer=null;
3097        }
3098      });
3099    }
3100    if(add){  
3101      //this.addEventListener("mouseenter",onmouseenter);
3102      //this.addEventListener("mouseleave",onmouseleave);
3103      this.onmouseenter = onmouseenter; 
3104      this.onmouseleave = onmouseleave;
3105    }else{
3106      //this.removeEventListener("mouseenter",onmouseenter);
3107      //this.removeEventListener("mouseleave",onmouseleave);
3108      this.onmouseenter = null;
3109      this.onmouseleave = null;
3110    }
3111  }
3112  if(this.getAttribute("on-animate")=="1"){
3113    this.classList.add("noAnime");
3114    if(this.getAttribute("on-entrance-animate")!="1"){
3115      manageMouseOver(true);
3116    }else{
3117      manageMouseOver(false);
3118    }
3119  }
3120
3121  /**
3122   * This function manages the intersection of the element for entracnce animation
3123   */
3124  const observeIntersection = () => {
3125    // initialize the global timer variable that shall be used at a time.
3126    var timer = null;
3127    var isInView = false;
3128    const iframe = window.frameElement;
3129    const iframeRect = iframe?.getBoundingClientRect() || {};
3130    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
3131    
3132    const callback = (entries) => {
3133      entries.forEach((entry) => {
3134        // Update isInView state
3135        isInView = entry.isIntersecting;
3136        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
3137        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
3138        if(entryRatio < animationTrigger){
3139          animationTrigger=entryRatio;
3140        }
3141        if (entry.isIntersecting) {
3142          // Element is entering view
3143          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
3144          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
3145          if (!timer && intersectionRatio >= animationTrigger) {
3146            
3147            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
3148            let delay = 0;
3149            try{
3150              delay = delayStr?parseFloat(delayStr):0;
3151            }catch(e){
3152              delay = 0;
3153            }
3154            setTimeout(() => {
3155              if(this.classList.contains("noAnime")){
3156                if(delay > 0){
3157                  setTimeout(() => {
3158                    this.style.removeProperty('opacity');
3159                  }, delay*1000+10);
3160                }else{
3161                  this.style.removeProperty('opacity');
3162                }
3163                this.classList.remove("noAnime"); 
3164                //console.log("enter",this.getAttribute("id"));
3165              }
3166            }, 50);
3167            // if there was no timer and the animation is just run, then add the timer again.
3168            timer = setTimeout(() => {
3169              //console.log("enter 1",this.getAttribute("id"));
3170              requestAnimationFrame(() => {
3171                //console.log("enter 2",this.getAttribute("id"));
3172                timer = null;
3173              });
3174            }, delay>0?delay*1000+500:500)
3175          }
3176        } else {
3177          // When element leaves viewport
3178          if (this.getAttribute("on-animate")=="1") {
3179            // Use requestAnimationFrame to check if element is still out of view
3180            requestAnimationFrame(() => {
3181              if (!isInView && !timer) {
3182                this.classList.add("noAnime");
3183                this.style.opacity = '0';
3184              }
3185            });
3186          }
3187        }
3188      });
3189    };
3190
3191    const myObserver = new IntersectionObserver(callback, { 
3192      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
3193    });
3194    
3195    // Set initial opacity and class
3196    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3197      this.classList.add("noAnime");
3198      this.style.opacity = '0';
3199      myObserver.observe(this);
3200    }
3201  }
3202
3203  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3204    observeIntersection();
3205  }
3206
3207}.bind(items[i]))();
3208          }
3209          var items = document.querySelectorAll('#i8t8a');
3210          for (var i = 0, len = items.length; i < len; i++) {
3211            (function(){
3212
3213  /**
3214   * This function manages the mouseOver and mouseOut of the element
3215   */
3216  const manageMouseOver = (add=true) => {
3217    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
3218      return;
3219    }
3220    console.log("manageMouseOver",add);
3221    var timer=null;
3222    const onmouseenter = () => {
3223      if (!timer) {
3224        setTimeout(() => {
3225          this.classList.remove("noAnime"); 
3226          console.log("onmouseenter");
3227        }, 50);
3228        // if there was no timer and the animation is just run, then add the timer again.
3229        timer = setTimeout(() => {
3230          console.log("onmouseenter 1");
3231          requestAnimationFrame(() => {
3232            console.log("onmouseenter 2");
3233            timer = null;
3234          });
3235        }, 100)
3236      }
3237    }
3238    const onmouseleave = () => {
3239      requestAnimationFrame(() => {
3240        if (!timer && !this.classList.contains("noAnime")) {
3241          console.log("onmouseleave");
3242          this.classList.add("noAnime");
3243          timer=null;
3244        }
3245      });
3246    }
3247    if(add){  
3248      //this.addEventListener("mouseenter",onmouseenter);
3249      //this.addEventListener("mouseleave",onmouseleave);
3250      this.onmouseenter = onmouseenter; 
3251      this.onmouseleave = onmouseleave;
3252    }else{
3253      //this.removeEventListener("mouseenter",onmouseenter);
3254      //this.removeEventListener("mouseleave",onmouseleave);
3255      this.onmouseenter = null;
3256      this.onmouseleave = null;
3257    }
3258  }
3259  if(this.getAttribute("on-animate")=="1"){
3260    this.classList.add("noAnime");
3261    if(this.getAttribute("on-entrance-animate")!="1"){
3262      manageMouseOver(true);
3263    }else{
3264      manageMouseOver(false);
3265    }
3266  }
3267
3268  /**
3269   * This function manages the intersection of the element for entracnce animation
3270   */
3271  const observeIntersection = () => {
3272    // initialize the global timer variable that shall be used at a time.
3273    var timer = null;
3274    var isInView = false;
3275    const iframe = window.frameElement;
3276    const iframeRect = iframe?.getBoundingClientRect() || {};
3277    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
3278    
3279    const callback = (entries) => {
3280      entries.forEach((entry) => {
3281        // Update isInView state
3282        isInView = entry.isIntersecting;
3283        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
3284        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
3285        if(entryRatio < animationTrigger){
3286          animationTrigger=entryRatio;
3287        }
3288        if (entry.isIntersecting) {
3289          // Element is entering view
3290          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
3291          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
3292          if (!timer && intersectionRatio >= animationTrigger) {
3293            
3294            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
3295            let delay = 0;
3296            try{
3297              delay = delayStr?parseFloat(delayStr):0;
3298            }catch(e){
3299              delay = 0;
3300            }
3301            setTimeout(() => {
3302              if(this.classList.contains("noAnime")){
3303                if(delay > 0){
3304                  setTimeout(() => {
3305                    this.style.removeProperty('opacity');
3306                  }, delay*1000+10);
3307                }else{
3308                  this.style.removeProperty('opacity');
3309                }
3310                this.classList.remove("noAnime"); 
3311                //console.log("enter",this.getAttribute("id"));
3312              }
3313            }, 50);
3314            // if there was no timer and the animation is just run, then add the timer again.
3315            timer = setTimeout(() => {
3316              //console.log("enter 1",this.getAttribute("id"));
3317              requestAnimationFrame(() => {
3318                //console.log("enter 2",this.getAttribute("id"));
3319                timer = null;
3320              });
3321            }, delay>0?delay*1000+500:500)
3322          }
3323        } else {
3324          // When element leaves viewport
3325          if (this.getAttribute("on-animate")=="1") {
3326            // Use requestAnimationFrame to check if element is still out of view
3327            requestAnimationFrame(() => {
3328              if (!isInView && !timer) {
3329                this.classList.add("noAnime");
3330                this.style.opacity = '0';
3331              }
3332            });
3333          }
3334        }
3335      });
3336    };
3337
3338    const myObserver = new IntersectionObserver(callback, { 
3339      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
3340    });
3341    
3342    // Set initial opacity and class
3343    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3344      this.classList.add("noAnime");
3345      this.style.opacity = '0';
3346      myObserver.observe(this);
3347    }
3348  }
3349
3350  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3351    observeIntersection();
3352  }
3353
3354}.bind(items[i]))();
3355          }
3356          var props = {"if68u":{"ft-cover-play-click":true,"ft-cover-image":"","ft-video-link":"https://iframe.mediadelivery.net/embed/78766/f731befd-f0f1-44dd-a57a-e4922e8a6d38","ft-file-processing":"1","ft-video-id":"3k26by","ft-video-controls":true,"ft-video-branding":true,"ft-video-start":0}};
3357          var ids = Object.keys(props).map(function(id) { return '#'+id }).join(',');
3358          var els = document.querySelectorAll(ids);
3359          for (var i = 0, len = els.length; i < len; i++) {
3360            var el = els[i];
3361            (function cb(o){var n=this,r=this.children[0].children[0];removeNoMouseClass=function(){n.children&&n.children[0]&&n.children[0].children[1]&&n.children[0].children[1].classList.remove("no-mouse"),n.children&&n.children[0]&&r&&(r.style["z-index"]="99")},removeNoMouseClass()
3362  /**
3363   * This function manages the mouseOver and mouseOut of the element
3364   */
3365  const manageMouseOver = (add=true) => {
3366    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
3367      return;
3368    }
3369    console.log("manageMouseOver",add);
3370    var timer=null;
3371    const onmouseenter = () => {
3372      if (!timer) {
3373        setTimeout(() => {
3374          this.classList.remove("noAnime"); 
3375          console.log("onmouseenter");
3376        }, 50);
3377        // if there was no timer and the animation is just run, then add the timer again.
3378        timer = setTimeout(() => {
3379          console.log("onmouseenter 1");
3380          requestAnimationFrame(() => {
3381            console.log("onmouseenter 2");
3382            timer = null;
3383          });
3384        }, 100)
3385      }
3386    }
3387    const onmouseleave = () => {
3388      requestAnimationFrame(() => {
3389        if (!timer && !this.classList.contains("noAnime")) {
3390          console.log("onmouseleave");
3391          this.classList.add("noAnime");
3392          timer=null;
3393        }
3394      });
3395    }
3396    if(add){  
3397      //this.addEventListener("mouseenter",onmouseenter);
3398      //this.addEventListener("mouseleave",onmouseleave);
3399      this.onmouseenter = onmouseenter; 
3400      this.onmouseleave = onmouseleave;
3401    }else{
3402      //this.removeEventListener("mouseenter",onmouseenter);
3403      //this.removeEventListener("mouseleave",onmouseleave);
3404      this.onmouseenter = null;
3405      this.onmouseleave = null;
3406    }
3407  }
3408  if(this.getAttribute("on-animate")=="1"){
3409    this.classList.add("noAnime");
3410    if(this.getAttribute("on-entrance-animate")!="1"){
3411      manageMouseOver(true);
3412    }else{
3413      manageMouseOver(false);
3414    }
3415  }
3416
3417  /**
3418   * This function manages the intersection of the element for entracnce animation
3419   */
3420  const observeIntersection = () => {
3421    // initialize the global timer variable that shall be used at a time.
3422    var timer = null;
3423    var isInView = false;
3424    const iframe = window.frameElement;
3425    const iframeRect = iframe?.getBoundingClientRect() || {};
3426    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
3427    
3428    const callback = (entries) => {
3429      entries.forEach((entry) => {
3430        // Update isInView state
3431        isInView = entry.isIntersecting;
3432        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
3433        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
3434        if(entryRatio < animationTrigger){
3435          animationTrigger=entryRatio;
3436        }
3437        if (entry.isIntersecting) {
3438          // Element is entering view
3439          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
3440          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
3441          if (!timer && intersectionRatio >= animationTrigger) {
3442            
3443            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
3444            let delay = 0;
3445            try{
3446              delay = delayStr?parseFloat(delayStr):0;
3447            }catch(e){
3448              delay = 0;
3449            }
3450            setTimeout(() => {
3451              if(this.classList.contains("noAnime")){
3452                if(delay > 0){
3453                  setTimeout(() => {
3454                    this.style.removeProperty('opacity');
3455                  }, delay*1000+10);
3456                }else{
3457                  this.style.removeProperty('opacity');
3458                }
3459                this.classList.remove("noAnime"); 
3460                //console.log("enter",this.getAttribute("id"));
3461              }
3462            }, 50);
3463            // if there was no timer and the animation is just run, then add the timer again.
3464            timer = setTimeout(() => {
3465              //console.log("enter 1",this.getAttribute("id"));
3466              requestAnimationFrame(() => {
3467                //console.log("enter 2",this.getAttribute("id"));
3468                timer = null;
3469              });
3470            }, delay>0?delay*1000+500:500)
3471          }
3472        } else {
3473          // When element leaves viewport
3474          if (this.getAttribute("on-animate")=="1") {
3475            // Use requestAnimationFrame to check if element is still out of view
3476            requestAnimationFrame(() => {
3477              if (!isInView && !timer) {
3478                this.classList.add("noAnime");
3479                this.style.opacity = '0';
3480              }
3481            });
3482          }
3483        }
3484      });
3485    };
3486
3487    const myObserver = new IntersectionObserver(callback, { 
3488      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
3489    });
3490    
3491    // Set initial opacity and class
3492    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3493      this.classList.add("noAnime");
3494      this.style.opacity = '0';
3495      myObserver.observe(this);
3496    }
3497  }
3498
3499  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3500    observeIntersection();
3501  }
3502}.bind(el))(props[el.id]);
3503          }
3504          var items = document.querySelectorAll('#i98r7');
3505          for (var i = 0, len = items.length; i < len; i++) {
3506            (function(){
3507
3508  /**
3509   * This function manages the mouseOver and mouseOut of the element
3510   */
3511  const manageMouseOver = (add=true) => {
3512    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
3513      return;
3514    }
3515    console.log("manageMouseOver",add);
3516    var timer=null;
3517    const onmouseenter = () => {
3518      if (!timer) {
3519        setTimeout(() => {
3520          this.classList.remove("noAnime"); 
3521          console.log("onmouseenter");
3522        }, 50);
3523        // if there was no timer and the animation is just run, then add the timer again.
3524        timer = setTimeout(() => {
3525          console.log("onmouseenter 1");
3526          requestAnimationFrame(() => {
3527            console.log("onmouseenter 2");
3528            timer = null;
3529          });
3530        }, 100)
3531      }
3532    }
3533    const onmouseleave = () => {
3534      requestAnimationFrame(() => {
3535        if (!timer && !this.classList.contains("noAnime")) {
3536          console.log("onmouseleave");
3537          this.classList.add("noAnime");
3538          timer=null;
3539        }
3540      });
3541    }
3542    if(add){  
3543      //this.addEventListener("mouseenter",onmouseenter);
3544      //this.addEventListener("mouseleave",onmouseleave);
3545      this.onmouseenter = onmouseenter; 
3546      this.onmouseleave = onmouseleave;
3547    }else{
3548      //this.removeEventListener("mouseenter",onmouseenter);
3549      //this.removeEventListener("mouseleave",onmouseleave);
3550      this.onmouseenter = null;
3551      this.onmouseleave = null;
3552    }
3553  }
3554  if(this.getAttribute("on-animate")=="1"){
3555    this.classList.add("noAnime");
3556    if(this.getAttribute("on-entrance-animate")!="1"){
3557      manageMouseOver(true);
3558    }else{
3559      manageMouseOver(false);
3560    }
3561  }
3562
3563  /**
3564   * This function manages the intersection of the element for entracnce animation
3565   */
3566  const observeIntersection = () => {
3567    // initialize the global timer variable that shall be used at a time.
3568    var timer = null;
3569    var isInView = false;
3570    const iframe = window.frameElement;
3571    const iframeRect = iframe?.getBoundingClientRect() || {};
3572    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
3573    
3574    const callback = (entries) => {
3575      entries.forEach((entry) => {
3576        // Update isInView state
3577        isInView = entry.isIntersecting;
3578        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
3579        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
3580        if(entryRatio < animationTrigger){
3581          animationTrigger=entryRatio;
3582        }
3583        if (entry.isIntersecting) {
3584          // Element is entering view
3585          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
3586          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
3587          if (!timer && intersectionRatio >= animationTrigger) {
3588            
3589            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
3590            let delay = 0;
3591            try{
3592              delay = delayStr?parseFloat(delayStr):0;
3593            }catch(e){
3594              delay = 0;
3595            }
3596            setTimeout(() => {
3597              if(this.classList.contains("noAnime")){
3598                if(delay > 0){
3599                  setTimeout(() => {
3600                    this.style.removeProperty('opacity');
3601                  }, delay*1000+10);
3602                }else{
3603                  this.style.removeProperty('opacity');
3604                }
3605                this.classList.remove("noAnime"); 
3606                //console.log("enter",this.getAttribute("id"));
3607              }
3608            }, 50);
3609            // if there was no timer and the animation is just run, then add the timer again.
3610            timer = setTimeout(() => {
3611              //console.log("enter 1",this.getAttribute("id"));
3612              requestAnimationFrame(() => {
3613                //console.log("enter 2",this.getAttribute("id"));
3614                timer = null;
3615              });
3616            }, delay>0?delay*1000+500:500)
3617          }
3618        } else {
3619          // When element leaves viewport
3620          if (this.getAttribute("on-animate")=="1") {
3621            // Use requestAnimationFrame to check if element is still out of view
3622            requestAnimationFrame(() => {
3623              if (!isInView && !timer) {
3624                this.classList.add("noAnime");
3625                this.style.opacity = '0';
3626              }
3627            });
3628          }
3629        }
3630      });
3631    };
3632
3633    const myObserver = new IntersectionObserver(callback, { 
3634      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
3635    });
3636    
3637    // Set initial opacity and class
3638    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3639      this.classList.add("noAnime");
3640      this.style.opacity = '0';
3641      myObserver.observe(this);
3642    }
3643  }
3644
3645  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3646    observeIntersection();
3647  }
3648
3649}.bind(items[i]))();
3650          }
3651          var items = document.querySelectorAll('#ioq7q');
3652          for (var i = 0, len = items.length; i < len; i++) {
3653            (function(){
3654var o=this;this.getAttribute("data-design-mode")!="1"&&this.addEventListener("click",function(n){var r=o.parentNode.getElementsByTagName("iframe");if(!(r.length<=0)||(r=o.parentNode.getElementsByTagName("video")),!(r.length<=0)){var a=r[0];o.style.display="none",a.style.display="block",a.setAttribute("src",a.getAttribute("data-src"))}})
3655  /**
3656   * This function manages the mouseOver and mouseOut of the element
3657   */
3658  const manageMouseOver = (add=true) => {
3659    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
3660      return;
3661    }
3662    console.log("manageMouseOver",add);
3663    var timer=null;
3664    const onmouseenter = () => {
3665      if (!timer) {
3666        setTimeout(() => {
3667          this.classList.remove("noAnime"); 
3668          console.log("onmouseenter");
3669        }, 50);
3670        // if there was no timer and the animation is just run, then add the timer again.
3671        timer = setTimeout(() => {
3672          console.log("onmouseenter 1");
3673          requestAnimationFrame(() => {
3674            console.log("onmouseenter 2");
3675            timer = null;
3676          });
3677        }, 100)
3678      }
3679    }
3680    const onmouseleave = () => {
3681      requestAnimationFrame(() => {
3682        if (!timer && !this.classList.contains("noAnime")) {
3683          console.log("onmouseleave");
3684          this.classList.add("noAnime");
3685          timer=null;
3686        }
3687      });
3688    }
3689    if(add){  
3690      //this.addEventListener("mouseenter",onmouseenter);
3691      //this.addEventListener("mouseleave",onmouseleave);
3692      this.onmouseenter = onmouseenter; 
3693      this.onmouseleave = onmouseleave;
3694    }else{
3695      //this.removeEventListener("mouseenter",onmouseenter);
3696      //this.removeEventListener("mouseleave",onmouseleave);
3697      this.onmouseenter = null;
3698      this.onmouseleave = null;
3699    }
3700  }
3701  if(this.getAttribute("on-animate")=="1"){
3702    this.classList.add("noAnime");
3703    if(this.getAttribute("on-entrance-animate")!="1"){
3704      manageMouseOver(true);
3705    }else{
3706      manageMouseOver(false);
3707    }
3708  }
3709
3710  /**
3711   * This function manages the intersection of the element for entracnce animation
3712   */
3713  const observeIntersection = () => {
3714    // initialize the global timer variable that shall be used at a time.
3715    var timer = null;
3716    var isInView = false;
3717    const iframe = window.frameElement;
3718    const iframeRect = iframe?.getBoundingClientRect() || {};
3719    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
3720    
3721    const callback = (entries) => {
3722      entries.forEach((entry) => {
3723        // Update isInView state
3724        isInView = entry.isIntersecting;
3725        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
3726        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
3727        if(entryRatio < animationTrigger){
3728          animationTrigger=entryRatio;
3729        }
3730        if (entry.isIntersecting) {
3731          // Element is entering view
3732          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
3733          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
3734          if (!timer && intersectionRatio >= animationTrigger) {
3735            
3736            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
3737            let delay = 0;
3738            try{
3739              delay = delayStr?parseFloat(delayStr):0;
3740            }catch(e){
3741              delay = 0;
3742            }
3743            setTimeout(() => {
3744              if(this.classList.contains("noAnime")){
3745                if(delay > 0){
3746                  setTimeout(() => {
3747                    this.style.removeProperty('opacity');
3748                  }, delay*1000+10);
3749                }else{
3750                  this.style.removeProperty('opacity');
3751                }
3752                this.classList.remove("noAnime"); 
3753                //console.log("enter",this.getAttribute("id"));
3754              }
3755            }, 50);
3756            // if there was no timer and the animation is just run, then add the timer again.
3757            timer = setTimeout(() => {
3758              //console.log("enter 1",this.getAttribute("id"));
3759              requestAnimationFrame(() => {
3760                //console.log("enter 2",this.getAttribute("id"));
3761                timer = null;
3762              });
3763            }, delay>0?delay*1000+500:500)
3764          }
3765        } else {
3766          // When element leaves viewport
3767          if (this.getAttribute("on-animate")=="1") {
3768            // Use requestAnimationFrame to check if element is still out of view
3769            requestAnimationFrame(() => {
3770              if (!isInView && !timer) {
3771                this.classList.add("noAnime");
3772                this.style.opacity = '0';
3773              }
3774            });
3775          }
3776        }
3777      });
3778    };
3779
3780    const myObserver = new IntersectionObserver(callback, { 
3781      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
3782    });
3783    
3784    // Set initial opacity and class
3785    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3786      this.classList.add("noAnime");
3787      this.style.opacity = '0';
3788      myObserver.observe(this);
3789    }
3790  }
3791
3792  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3793    observeIntersection();
3794  }
3795
3796}.bind(items[i]))();
3797          }
3798          var items = document.querySelectorAll('#i3ucf');
3799          for (var i = 0, len = items.length; i < len; i++) {
3800            (function(){
3801
3802  /**
3803   * This function manages the mouseOver and mouseOut of the element
3804   */
3805  const manageMouseOver = (add=true) => {
3806    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
3807      return;
3808    }
3809    console.log("manageMouseOver",add);
3810    var timer=null;
3811    const onmouseenter = () => {
3812      if (!timer) {
3813        setTimeout(() => {
3814          this.classList.remove("noAnime"); 
3815          console.log("onmouseenter");
3816        }, 50);
3817        // if there was no timer and the animation is just run, then add the timer again.
3818        timer = setTimeout(() => {
3819          console.log("onmouseenter 1");
3820          requestAnimationFrame(() => {
3821            console.log("onmouseenter 2");
3822            timer = null;
3823          });
3824        }, 100)
3825      }
3826    }
3827    const onmouseleave = () => {
3828      requestAnimationFrame(() => {
3829        if (!timer && !this.classList.contains("noAnime")) {
3830          console.log("onmouseleave");
3831          this.classList.add("noAnime");
3832          timer=null;
3833        }
3834      });
3835    }
3836    if(add){  
3837      //this.addEventListener("mouseenter",onmouseenter);
3838      //this.addEventListener("mouseleave",onmouseleave);
3839      this.onmouseenter = onmouseenter; 
3840      this.onmouseleave = onmouseleave;
3841    }else{
3842      //this.removeEventListener("mouseenter",onmouseenter);
3843      //this.removeEventListener("mouseleave",onmouseleave);
3844      this.onmouseenter = null;
3845      this.onmouseleave = null;
3846    }
3847  }
3848  if(this.getAttribute("on-animate")=="1"){
3849    this.classList.add("noAnime");
3850    if(this.getAttribute("on-entrance-animate")!="1"){
3851      manageMouseOver(true);
3852    }else{
3853      manageMouseOver(false);
3854    }
3855  }
3856
3857  /**
3858   * This function manages the intersection of the element for entracnce animation
3859   */
3860  const observeIntersection = () => {
3861    // initialize the global timer variable that shall be used at a time.
3862    var timer = null;
3863    var isInView = false;
3864    const iframe = window.frameElement;
3865    const iframeRect = iframe?.getBoundingClientRect() || {};
3866    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
3867    
3868    const callback = (entries) => {
3869      entries.forEach((entry) => {
3870        // Update isInView state
3871        isInView = entry.isIntersecting;
3872        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
3873        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
3874        if(entryRatio < animationTrigger){
3875          animationTrigger=entryRatio;
3876        }
3877        if (entry.isIntersecting) {
3878          // Element is entering view
3879          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
3880          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
3881          if (!timer && intersectionRatio >= animationTrigger) {
3882            
3883            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
3884            let delay = 0;
3885            try{
3886              delay = delayStr?parseFloat(delayStr):0;
3887            }catch(e){
3888              delay = 0;
3889            }
3890            setTimeout(() => {
3891              if(this.classList.contains("noAnime")){
3892                if(delay > 0){
3893                  setTimeout(() => {
3894                    this.style.removeProperty('opacity');
3895                  }, delay*1000+10);
3896                }else{
3897                  this.style.removeProperty('opacity');
3898                }
3899                this.classList.remove("noAnime"); 
3900                //console.log("enter",this.getAttribute("id"));
3901              }
3902            }, 50);
3903            // if there was no timer and the animation is just run, then add the timer again.
3904            timer = setTimeout(() => {
3905              //console.log("enter 1",this.getAttribute("id"));
3906              requestAnimationFrame(() => {
3907                //console.log("enter 2",this.getAttribute("id"));
3908                timer = null;
3909              });
3910            }, delay>0?delay*1000+500:500)
3911          }
3912        } else {
3913          // When element leaves viewport
3914          if (this.getAttribute("on-animate")=="1") {
3915            // Use requestAnimationFrame to check if element is still out of view
3916            requestAnimationFrame(() => {
3917              if (!isInView && !timer) {
3918                this.classList.add("noAnime");
3919                this.style.opacity = '0';
3920              }
3921            });
3922          }
3923        }
3924      });
3925    };
3926
3927    const myObserver = new IntersectionObserver(callback, { 
3928      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
3929    });
3930    
3931    // Set initial opacity and class
3932    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3933      this.classList.add("noAnime");
3934      this.style.opacity = '0';
3935      myObserver.observe(this);
3936    }
3937  }
3938
3939  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
3940    observeIntersection();
3941  }
3942
3943}.bind(items[i]))();
3944          }
3945          var items = document.querySelectorAll('#i7x45');
3946          for (var i = 0, len = items.length; i < len; i++) {
3947            (function(){
3948
3949  /**
3950   * This function manages the mouseOver and mouseOut of the element
3951   */
3952  const manageMouseOver = (add=true) => {
3953    if(this.getAttribute("on-animate")!="1" || this.getAttribute("on-entrance-animate")=="1"){
3954      return;
3955    }
3956    console.log("manageMouseOver",add);
3957    var timer=null;
3958    const onmouseenter = () => {
3959      if (!timer) {
3960        setTimeout(() => {
3961          this.classList.remove("noAnime"); 
3962          console.log("onmouseenter");
3963        }, 50);
3964        // if there was no timer and the animation is just run, then add the timer again.
3965        timer = setTimeout(() => {
3966          console.log("onmouseenter 1");
3967          requestAnimationFrame(() => {
3968            console.log("onmouseenter 2");
3969            timer = null;
3970          });
3971        }, 100)
3972      }
3973    }
3974    const onmouseleave = () => {
3975      requestAnimationFrame(() => {
3976        if (!timer && !this.classList.contains("noAnime")) {
3977          console.log("onmouseleave");
3978          this.classList.add("noAnime");
3979          timer=null;
3980        }
3981      });
3982    }
3983    if(add){  
3984      //this.addEventListener("mouseenter",onmouseenter);
3985      //this.addEventListener("mouseleave",onmouseleave);
3986      this.onmouseenter = onmouseenter; 
3987      this.onmouseleave = onmouseleave;
3988    }else{
3989      //this.removeEventListener("mouseenter",onmouseenter);
3990      //this.removeEventListener("mouseleave",onmouseleave);
3991      this.onmouseenter = null;
3992      this.onmouseleave = null;
3993    }
3994  }
3995  if(this.getAttribute("on-animate")=="1"){
3996    this.classList.add("noAnime");
3997    if(this.getAttribute("on-entrance-animate")!="1"){
3998      manageMouseOver(true);
3999    }else{
4000      manageMouseOver(false);
4001    }
4002  }
4003
4004  /**
4005   * This function manages the intersection of the element for entracnce animation
4006   */
4007  const observeIntersection = () => {
4008    // initialize the global timer variable that shall be used at a time.
4009    var timer = null;
4010    var isInView = false;
4011    const iframe = window.frameElement;
4012    const iframeRect = iframe?.getBoundingClientRect() || {};
4013    const viewportHeight = iframe ? iframeRect.height : window.innerHeight;
4014    
4015    const callback = (entries) => {
4016      entries.forEach((entry) => {
4017        // Update isInView state
4018        isInView = entry.isIntersecting;
4019        var entryRatio=Math.round(entry.boundingClientRect.height / viewportHeight * 100) / 100;
4020        var animationTrigger=Number(this.getAttribute("trigger-ratio")||1);
4021        if(entryRatio < animationTrigger){
4022          animationTrigger=entryRatio;
4023        }
4024        if (entry.isIntersecting) {
4025          // Element is entering view
4026          let intersectionRatio = Math.round(entry.intersectionRatio * 100) / 100;
4027          //console.log("observeIntersection entry 3",!timer,intersectionRatio, animationTrigger);
4028          if (!timer && intersectionRatio >= animationTrigger) {
4029            
4030            let delayStr=this.getAttribute("animation-delay")?.replace("s","")
4031            let delay = 0;
4032            try{
4033              delay = delayStr?parseFloat(delayStr):0;
4034            }catch(e){
4035              delay = 0;
4036            }
4037            setTimeout(() => {
4038              if(this.classList.contains("noAnime")){
4039                if(delay > 0){
4040                  setTimeout(() => {
4041                    this.style.removeProperty('opacity');
4042                  }, delay*1000+10);
4043                }else{
4044                  this.style.removeProperty('opacity');
4045                }
4046                this.classList.remove("noAnime"); 
4047                //console.log("enter",this.getAttribute("id"));
4048              }
4049            }, 50);
4050            // if there was no timer and the animation is just run, then add the timer again.
4051            timer = setTimeout(() => {
4052              //console.log("enter 1",this.getAttribute("id"));
4053              requestAnimationFrame(() => {
4054                //console.log("enter 2",this.getAttribute("id"));
4055                timer = null;
4056              });
4057            }, delay>0?delay*1000+500:500)
4058          }
4059        } else {
4060          // When element leaves viewport
4061          if (this.getAttribute("on-animate")=="1") {
4062            // Use requestAnimationFrame to check if element is still out of view
4063            requestAnimationFrame(() => {
4064              if (!isInView && !timer) {
4065                this.classList.add("noAnime");
4066                this.style.opacity = '0';
4067              }
4068            });
4069          }
4070        }
4071      });
4072    };
4073
4074    const myObserver = new IntersectionObserver(callback, { 
4075      threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]  // Reduced threshold to detect partial visibility
4076    });
4077    
4078    // Set initial opacity and class
4079    if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
4080      this.classList.add("noAnime");
4081      this.style.opacity = '0';
4082      myObserver.observe(this);
4083    }
4084  }
4085
4086  if (this.getAttribute("on-animate")=="1" && this.getAttribute("on-entrance-animate") == "1") {
4087    observeIntersection();
4088  }
4089
4090}.bind(items[i]))();
4091          }</script>
4091  <!--site_ad_view-->
4092    <!--end_site_ad_view-->
4093
4094      
4094<script>
4095      window.onload = function() {
4096        if ('loading' in HTMLImageElement.prototype) {
4097          const images = document.querySelectorAll('img[loading="lazy"]');
4098          images.forEach(img => {
4099            img.loading = "eager";
4100          });
4101        }
4102
4103      }
4104    </script>
4104
4105  
4106    <!--site_body_end_code-->
4107    <!--end_site_body_end_code-->
4108  </body>
4109
4110</html>

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.