1!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e.SENTRY_RELEASE={id:"9cbd587e329869c755d925bf3f1cd5ee8ae9e3b6"};var t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="b241ba6e-0f2f-4e84-8083-9aa42e68d468",e._sentryDebugIdIdentifier="sentry-dbid-b241ba6e-0f2f-4e84-8083-9aa42e68d468")}catch(e){}}(),(self.webpackChunktiff=self.webpackChunktiff||[]).push([[3821],{3821:(e,t,i)=>{i.r(t),i.d(t,{default:()=>s});var r=i(7728);const s=class extends r.A{static targets=["element"];async connect(){this.refreshTimer=null,this.handleLazyLoad=this.debouncedRefresh.bind(this),document.addEventListener("lazyload:loaded",this.handleLazyLoad);try{await super.connect()}catch(e){console.error("ParallaxController: GSAP failed to load",e)}}debouncedRefresh(){this.refreshTimer&&clearTimeout(this.refreshTimer),this.refreshTimer=setTimeout((()=>{this.ScrollTrigger&&this.ScrollTrigger.refresh()}),400)}async waitForImages(){const e=this.element.querySelectorAll("img");if(0===e.length)return;const t=Array.from(e).map((e=>e.complete?Promise.resolve():new Promise((t=>{e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}))));await Promise.all(t)}async initializeAnimations(){await this.waitForImages(),this.elementTargets.forEach((e=>{this.gsap&&(this.gsap.set(e,{yPercent:10,force3D:!0}),this.gsap.to(e,{yPercent:-8,ease:"none",scrollTrigger:{trigger:this.element,start:"top bottom",end:"bottom top",markers:!1,scrub:1,invalidateOnRefresh:!0}}))})),this.ScrollTrigger&&this.ScrollTrigger.refresh()}disconnect(){this.refreshTimer&&clearTimeout(this.refreshTimer),this.handleLazyLoad&&document.removeEventListener("lazyload:loaded",this.handleLazyLoad),this.ScrollTrigger&&this.ScrollTrigger.getAll().forEach((e=>e.kill())),this.gsap&&this.elementTargets.forEach((e=>{this.gsap.set(e,{clearProps:"all"})})),super.disconnect()}}},7728:(e,t,i)=>{i.d(t,{A:()=>s});var r=i(2891);const s=class extends r.xI{async connect(){const{gsap:e,ScrollTrigger:t,SplitText:r,CSSPlugin:s,CustomEase:a,CSSRulePlugin:n}=await Promise.all([i.e(634),i.e(7015)]).then(i.bind(i,7015));this.gsap=e,this.ScrollTrigger=t,this.SplitText=r,this.CSSPlugin=s,this.CustomEase=a,this.CSSRulePlugin=n,"function"==typeof this.initializeAnimations&&await this.initializeAnimations()}createTimeline(e={}){return this.gsap.timeline({paused:!0,...e})}createScrollTrigger(e,t,i={}){return this.ScrollTrigger.create({trigger:e,animation:t,start:"top bottom",...i})}disconnect(){this.ScrollTrigger?.getAll().forEach((e=>e.kill())),this.gsap?.killTweensOf(this.element)}}}}]);
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.