{"version":3,"file":"LiquidImage.Gy-R2Mjr.mjs","names":["useRef","useState","useCallback","p","vs","fs"],"sources":["https:/framerusercontent.com/modules/jvWKQq8MuUJup3mTZdPt/Q6g7pi8QVpn88W4673CA/LiquidImage.js"],"sourcesContent":["// Liquid Image Hover Effect with Color Reveal and Hotspots (Optimized)\n// Real-time water-like displacement, grayscale-to-color reveal, persistent hotspots, and performance optimizations.\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useRef,useEffect,useState,useCallback}from\"react\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";const defaultImage={src:\"https://framerusercontent.com/images/GfGkADagM4KEibNcIiRUWlfrR0.jpg\",alt:\"Gradient 1 - Blue\"};/**\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function LiquidImage(props){const{image=defaultImage,strength=.15,speed=.18,style,hotspots=[],borderRadius=8}=props;const canvasRef=useRef(null);const[size,setSize]=useState({width:400,height:300});const dprRef=useRef(1);const isStatic=useIsStaticRenderer();// Animation and interaction refs\nconst mouseRef=useRef({x:-10,y:-10,active:false});const maskRadiusRef=useRef(0);const wakeRef=useRef([]);const hotspotsRef=useRef(hotspots);const hoveredRef=useRef(false);const animatingRef=useRef(false);// Only update hotspotsRef when hotspots prop changes\nuseEffect(()=>{hotspotsRef.current=hotspots;},[hotspots]);// Resize observer (with devicePixelRatio)\nuseEffect(()=>{if(!canvasRef.current)return;const resize=()=>{let dpr=1;if(typeof window!==\"undefined\"){dpr=window.devicePixelRatio||1;}dprRef.current=dpr;const w=Math.round(canvasRef.current.offsetWidth*dpr);const h=Math.round(canvasRef.current.offsetHeight*dpr);setSize({width:w,height:h});};resize();if(typeof window!==\"undefined\"){window.addEventListener(\"resize\",resize);return()=>window.removeEventListener(\"resize\",resize);}return()=>{};},[]);// Mouse events (no state updates on move)\nconst handleMove=useCallback(e=>{if(!canvasRef.current)return;const rect=canvasRef.current.getBoundingClientRect();let x,y;if(e.touches&&e.touches.length>0){x=(e.touches[0].clientX-rect.left)/rect.width;y=(e.touches[0].clientY-rect.top)/rect.height;}else{x=(e.clientX-rect.left)/rect.width;y=(e.clientY-rect.top)/rect.height;}x=Math.max(0,Math.min(1,x));y=Math.max(0,Math.min(1,y));mouseRef.current={x,y,active:true};hoveredRef.current=true;// Add a wake point (limit to 8 recent)\nconst now=Date.now();wakeRef.current=[...wakeRef.current.filter(w=>now-w.t<1200),{x,y,t:now}].slice(-8);},[]);const handleLeave=useCallback(()=>{mouseRef.current={...mouseRef.current,active:false};hoveredRef.current=false;},[]);// Animate mask radius on hover in/out (single animation loop, easeInOut cubic)\nuseEffect(()=>{let animId;let lastHovered=false;let start=null;let from=0;let to=0;let duration=650// ms, slower for smoother effect\n;function easeInOutCubic(t){return t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2;}function animate(ts){const hovered=hoveredRef.current;if(hovered!==lastHovered){lastHovered=hovered;start=ts;from=maskRadiusRef.current;to=hovered?1.5:0;}if(start===null)start=ts;const elapsed=Math.min((ts-start)/duration,1);const eased=easeInOutCubic(elapsed);maskRadiusRef.current=from+(to-from)*eased;if(elapsed<1){animId=requestAnimationFrame(animate);}else{maskRadiusRef.current=to;animId=requestAnimationFrame(animate);}}animId=requestAnimationFrame(animate);return()=>animId&&cancelAnimationFrame(animId);},[]);// WebGL shader effect (single stable render loop)\nuseEffect(()=>{if(!canvasRef.current||isStatic)return;// Set canvas size for high-DPI\nconst dpr=dprRef.current||1;canvasRef.current.width=size.width;canvasRef.current.height=size.height;canvasRef.current.style.width=size.width/dpr+\"px\";canvasRef.current.style.height=size.height/dpr+\"px\";let gl=canvasRef.current.getContext(\"webgl\");if(!gl)return;let animationId;let img=new window.Image;img.crossOrigin=\"anonymous\";img.src=image.src;let tex,program,uTime,uMouse,uStrength,uSpeed,uResolution,uWake,uWakeCount,uMaskRadius;let startTime=Date.now();let loaded=false;// Vertex shader\nconst vs=`\n            attribute vec2 a_position;\n            varying vec2 v_uv;\n            void main() {\n                v_uv = a_position * 0.5 + 0.5;\n                gl_Position = vec4(a_position, 0, 1);\n            }\n        `;// Fragment shader with wake effect and grayscale/color reveal\nconst fs=`\n            precision highp float;\n            varying vec2 v_uv;\n            uniform sampler2D u_image;\n            uniform vec2 u_mouse;\n            uniform float u_time;\n            uniform float u_strength;\n            uniform float u_speed;\n            uniform vec2 u_resolution;\n            #define MAX_WAKE 16\n            uniform int u_wakeCount;\n            uniform vec3 u_wake[MAX_WAKE]; // x, y, t (t = seconds since start)\n            uniform float u_maskRadius; // in [0,1], relative to min(width, height)\n            void main() {\n                vec2 uv = v_uv;\n                float total = 0.0;\n                // Wake ripples\n                for (int i = 0; i < MAX_WAKE; ++i) {\n                    if (i >= u_wakeCount) break;\n                    vec2 w = u_wake[i].xy;\n                    float t = u_time - u_wake[i].z;\n                    float dist = distance(uv, w);\n                    float amp = exp(-dist * 16.0) * exp(-t * 1.2);\n                    float ripple = sin(32.0 * dist - t * 8.0 * u_speed) * 0.04;\n                    uv += normalize(uv - w) * ripple * u_strength * amp * 2.0;\n                }\n                // Live mouse ripple\n                if (u_mouse.x >= 0.0 && u_mouse.x <= 1.0 && u_mouse.y >= 0.0 && u_mouse.y <= 1.0) {\n                    float dist = distance(uv, u_mouse);\n                    float ripple = sin(32.0 * dist - u_time * 8.0 * u_speed) * 0.04;\n                    float effect = exp(-dist * 12.0);\n                    uv += normalize(uv - u_mouse) * ripple * u_strength * effect * 2.0;\n                }\n                uv = clamp(uv, 0.0, 1.0);\n                vec4 color = texture2D(u_image, uv);\n                // Grayscale\n                float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));\n                vec3 grayColor = vec3(gray);\n                // Color reveal mask: union of all active hotspots and mouse\n                float mask = 0.0;\n                float maskRadius = u_maskRadius; // in [0,1], relative to min(width, height)\n                // Mouse mask\n                if (u_mouse.x >= 0.0 && u_mouse.x <= 1.0 && u_mouse.y >= 0.0 && u_mouse.y <= 1.0 && maskRadius > 0.0) {\n                    float d = distance(uv, u_mouse);\n                    mask = max(mask, smoothstep(maskRadius, maskRadius * 0.8, d));\n                }\n                // Hotspot masks\n                for (int i = 0; i < MAX_WAKE; ++i) {\n                    if (i >= u_wakeCount) break;\n                    vec2 w = u_wake[i].xy;\n                    float d = distance(uv, w);\n                    mask = max(mask, smoothstep(maskRadius, maskRadius * 0.8, d));\n                }\n                // Blend\n                vec3 finalColor = mix(grayColor, color.rgb, mask);\n                gl_FragColor = vec4(finalColor, color.a);\n            }\n        `;function createShader(type,src){let s=gl.createShader(type);gl.shaderSource(s,src);gl.compileShader(s);return s;}function createProgram(vs,fs){let p=gl.createProgram();gl.attachShader(p,vs);gl.attachShader(p,fs);gl.linkProgram(p);return p;}function setup(){// Create shaders\nlet vshader=createShader(gl.VERTEX_SHADER,vs);let fshader=createShader(gl.FRAGMENT_SHADER,fs);program=createProgram(vshader,fshader);gl.useProgram(program);// Quad\nlet pos=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,pos);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,1,1]),gl.STATIC_DRAW);let loc=gl.getAttribLocation(program,\"a_position\");gl.enableVertexAttribArray(loc);gl.vertexAttribPointer(loc,2,gl.FLOAT,false,0,0);// Uniforms\nuTime=gl.getUniformLocation(program,\"u_time\");uMouse=gl.getUniformLocation(program,\"u_mouse\");uStrength=gl.getUniformLocation(program,\"u_strength\");uSpeed=gl.getUniformLocation(program,\"u_speed\");uResolution=gl.getUniformLocation(program,\"u_resolution\");uWake=gl.getUniformLocation(program,\"u_wake\");uWakeCount=gl.getUniformLocation(program,\"u_wakeCount\");uMaskRadius=gl.getUniformLocation(program,\"u_maskRadius\");// Texture\ntex=gl.createTexture();gl.bindTexture(gl.TEXTURE_2D,tex);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,true);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,img);gl.activeTexture(gl.TEXTURE0);gl.uniform1i(gl.getUniformLocation(program,\"u_image\"),0);loaded=true;}img.onload=()=>{setup();render();};function updateTexture(){if(!tex)return;gl.bindTexture(gl.TEXTURE_2D,tex);gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,true);// Draw image to offscreen canvas with cover logic (high-DPI)\nlet offW=size.width;let offH=size.height;let offCanvas=document.createElement(\"canvas\");offCanvas.width=offW;offCanvas.height=offH;let ctx=offCanvas.getContext(\"2d\");// Calculate cover\nlet iw=img.width,ih=img.height;let scale=Math.max(offW/iw,offH/ih);let sw=iw*scale,sh=ih*scale;let sx=(offW-sw)/2,sy=(offH-sh)/2;ctx.clearRect(0,0,offW,offH);ctx.drawImage(img,sx,sy,sw,sh);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,offCanvas);}function render(){if(!loaded)return;updateTexture();gl.viewport(0,0,size.width,size.height);gl.clear(gl.COLOR_BUFFER_BIT);const now=(Date.now()-startTime)/1e3;gl.uniform1f(uTime,now);// Clamp mouse to [0,1] and invert y for WebGL\nlet mx=mouseRef.current.active?Math.max(0,Math.min(1,mouseRef.current.x)):-10;let my=mouseRef.current.active?Math.max(0,Math.min(1,mouseRef.current.y)):-10;my=1-my;gl.uniform2f(uMouse,mx,my);gl.uniform1f(uStrength,strength*2.5);gl.uniform1f(uSpeed,speed);gl.uniform2f(uResolution,size.width,size.height);// Wake effect (user + hotspots)\nlet nowMs=Date.now();let wakeArr=wakeRef.current.slice(-8);// Add persistent hotspots\nlet hotspotArr=(hotspotsRef.current||[]).slice(0,8).map(h=>({x:h.x,y:h.y,t:nowMs-1e5}));let allWake=[...wakeArr,...hotspotArr].slice(-16);let wakeData=new Float32Array(16*3);let count=0;for(let i=0;i<allWake.length;++i){let w=allWake[i];// Invert y for WebGL\nwakeData[i*3+0]=w.x;wakeData[i*3+1]=1-w.y;wakeData[i*3+2]=(w.t-startTime)/1e3;count++;}gl.uniform1i(uWakeCount,count);gl.uniform3fv(uWake,wakeData);// Mask radius\ngl.uniform1f(uMaskRadius,maskRadiusRef.current);gl.drawArrays(gl.TRIANGLE_STRIP,0,4);animationId=requestAnimationFrame(render);}return()=>{if(animationId)cancelAnimationFrame(animationId);gl=null;};},[image.src,size.width,size.height,strength,speed,isStatic]);// Static fallback\nif(isStatic){return /*#__PURE__*/_jsx(\"div\",{style:{...style,width:\"100%\",height:\"100%\",position:\"relative\",overflow:\"hidden\",borderRadius},children:/*#__PURE__*/_jsx(\"img\",{src:image.src,alt:image.alt,style:{width:\"100%\",height:\"100%\",objectFit:\"cover\",display:\"block\",borderRadius}})});}return /*#__PURE__*/_jsx(\"div\",{style:{...style,width:\"100%\",height:\"100%\",position:\"relative\",overflow:\"hidden\",borderRadius},onMouseMove:handleMove,onMouseLeave:handleLeave,onTouchMove:handleMove,onTouchEnd:handleLeave,children:/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,width:size.width,height:size.height,style:{width:\"100%\",height:\"100%\",display:\"block\",borderRadius},\"aria-label\":image.alt})});}addPropertyControls(LiquidImage,{image:{type:ControlType.ResponsiveImage,title:\"Image\",description:\"Add your image here.\"},strength:{type:ControlType.Number,title:\"Strength\",description:\"Amount of displacement.\",defaultValue:.03,min:.01,max:.5,step:.01},speed:{type:ControlType.Number,title:\"Speed\",description:\"Speed of animation.\",defaultValue:.14,min:.01,max:1,step:.01},borderRadius:{type:ControlType.Number,title:\"Radius\",description:\"Radius of displacement.\",defaultValue:8,min:0,max:64}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"LiquidImage\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LiquidImage.map"],"mappings":"qNAKG,SAAwB,EAAY,EAAM,CAAC,GAAK,CAAC,QAAM,EAAa,WAAS,IAAI,QAAM,IAAI,QAAM,WAAS,EAAE,CAAC,eAAa,GAAG,EAAY,EAAUA,EAAO,KAAK,CAAM,CAAC,EAAK,GAASC,EAAS,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,CAAO,EAAOD,EAAO,EAAE,CAAO,EAAS,GAAqB,CAC7Q,EAASA,EAAO,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,GAAM,CAAC,CAAO,EAAcA,EAAO,EAAE,CAAO,EAAQA,EAAO,EAAE,CAAC,CAAO,EAAYA,EAAO,EAAS,CAAO,EAAWA,EAAO,GAAM,CAAoB,EAAO,GAAM,CAC3M,MAAc,CAAC,EAAY,QAAQ,GAAW,CAAC,EAAS,CAAC,CACzD,MAAc,CAAC,GAAG,CAAC,EAAU,QAAQ,OAAO,IAAM,MAAW,CAAC,IAAI,EAAI,EAAY,IAAS,SAAa,EAAI,EAAO,kBAAkB,GAAG,EAAO,QAAQ,EAAiH,EAAQ,CAAC,MAA9G,KAAK,MAAM,EAAU,QAAQ,YAAY,EAAI,CAAyE,OAAhE,KAAK,MAAM,EAAU,QAAQ,aAAa,EAAI,CAA2B,CAAC,EAA4I,OAAzI,GAAQ,CAAW,IAAS,WAAuH,IAA1G,EAAO,iBAAiB,SAAS,EAAO,KAAW,EAAO,oBAAoB,SAAS,EAAO,GAAiB,EAAE,CAAC,CACjc,IAAM,EAAWE,EAAY,GAAG,CAAC,GAAG,CAAC,EAAU,QAAQ,OAAO,IAAM,EAAK,EAAU,QAAQ,uBAAuB,CAAK,EAAE,EAAK,EAAE,SAAS,EAAE,QAAQ,OAAO,GAAG,GAAG,EAAE,QAAQ,GAAG,QAAQ,EAAK,MAAM,EAAK,MAAM,GAAG,EAAE,QAAQ,GAAG,QAAQ,EAAK,KAAK,EAAK,SAAa,GAAG,EAAE,QAAQ,EAAK,MAAM,EAAK,MAAM,GAAG,EAAE,QAAQ,EAAK,KAAK,EAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAS,QAAQ,CAAC,IAAE,IAAE,OAAO,GAAK,CAAC,EAAW,QAAQ,GACpb,IAAM,EAAI,KAAK,KAAK,CAAC,EAAQ,QAAQ,CAAC,GAAG,EAAQ,QAAQ,OAAO,GAAG,EAAI,EAAE,EAAE,KAAK,CAAC,CAAC,IAAE,IAAE,EAAE,EAAI,CAAC,CAAC,MAAM,GAAG,EAAG,EAAE,CAAC,CAAO,EAAYA,MAAgB,CAAC,EAAS,QAAQ,CAAC,GAAG,EAAS,QAAQ,OAAO,GAAM,CAAC,EAAW,QAAQ,IAAQ,EAAE,CAAC,CAkF8D,OAjFjS,MAAc,CAAC,IAAI,EAAW,EAAY,GAAU,EAAM,KAAS,EAAK,EAAM,EAAG,EAChF,SAAS,EAAe,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAW,GAAG,EAAE,IAAE,EAAG,EAAG,SAAS,EAAQ,EAAG,CAAC,IAAM,EAAQ,EAAW,QAAW,IAAU,IAAa,EAAY,EAAQ,EAAM,EAAG,EAAK,EAAc,QAAQ,EAAG,EAAQ,IAAI,GAAM,IAAQ,OAAK,EAAM,GAAG,IAAM,EAAQ,KAAK,KAAK,EAAG,GAAO,IAAS,EAAE,CAAO,EAAM,EAAe,EAAQ,CAAC,EAAc,QAAQ,GAAM,EAAG,GAAM,EAAS,EAAQ,IAA+C,EAAc,QAAQ,GAAlE,EAAO,sBAAsB,EAAQ,CAA8G,MAAtC,GAAO,sBAAsB,EAAQ,KAAW,GAAQ,qBAAqB,EAAO,EAAG,EAAE,CAAC,CAC7kB,MAAc,CAAC,GAAG,CAAC,EAAU,SAAS,EAAS,OAC/C,IAAM,EAAI,EAAO,SAAS,EAAE,EAAU,QAAQ,MAAM,EAAK,MAAM,EAAU,QAAQ,OAAO,EAAK,OAAO,EAAU,QAAQ,MAAM,MAAM,EAAK,MAAM,EAAI,KAAK,EAAU,QAAQ,MAAM,OAAO,EAAK,OAAO,EAAI,KAAK,IAAI,EAAG,EAAU,QAAQ,WAAW,QAAQ,CAAC,GAAG,CAAC,EAAG,OAAO,IAAI,EAAgB,EAAI,IAAI,EAAO,MAAM,EAAI,YAAY,YAAY,EAAI,IAAI,EAAM,IAAI,IAAI,EAAI,EAAQ,EAAM,EAAO,EAAU,EAAO,EAAY,EAAM,EAAW,EAAgB,EAAU,KAAK,KAAK,CAAK,EAAO,GAkE7c,SAAS,EAAa,EAAK,EAAI,CAAC,IAAI,EAAE,EAAG,aAAa,EAAK,CAA4C,OAA3C,EAAG,aAAa,EAAE,EAAI,CAAC,EAAG,cAAc,EAAE,CAAQ,EAAG,SAAS,EAAc,EAAG,EAAG,CAAC,IAAIC,EAAE,EAAG,eAAe,CAA+D,OAA9D,EAAG,aAAaA,EAAEC,EAAG,CAAC,EAAG,aAAaD,EAAEE,EAAG,CAAC,EAAG,YAAYF,EAAE,CAAQA,EAAG,SAAS,GAAO,CAC5K,EAAQ,EAA1F,EAAa,EAAG,cAAc;;;;;;;UAAG,CAAa,EAAa,EAAG,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAAG,CAAuC,CAAC,EAAG,WAAW,EAAQ,CAC3J,IAAI,EAAI,EAAG,cAAc,CAAC,EAAG,WAAW,EAAG,aAAa,EAAI,CAAC,EAAG,WAAW,EAAG,aAAa,IAAI,aAAa,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAG,YAAY,CAAC,IAAI,EAAI,EAAG,kBAAkB,EAAQ,aAAa,CAAC,EAAG,wBAAwB,EAAI,CAAC,EAAG,oBAAoB,EAAI,EAAE,EAAG,MAAM,GAAM,EAAE,EAAE,CACtR,EAAM,EAAG,mBAAmB,EAAQ,SAAS,CAAC,EAAO,EAAG,mBAAmB,EAAQ,UAAU,CAAC,EAAU,EAAG,mBAAmB,EAAQ,aAAa,CAAC,EAAO,EAAG,mBAAmB,EAAQ,UAAU,CAAC,EAAY,EAAG,mBAAmB,EAAQ,eAAe,CAAC,EAAM,EAAG,mBAAmB,EAAQ,SAAS,CAAC,EAAW,EAAG,mBAAmB,EAAQ,cAAc,CAAC,EAAY,EAAG,mBAAmB,EAAQ,eAAe,CAC7Z,EAAI,EAAG,eAAe,CAAC,EAAG,YAAY,EAAG,WAAW,EAAI,CAAC,EAAG,cAAc,EAAG,WAAW,EAAG,eAAe,EAAG,cAAc,CAAC,EAAG,cAAc,EAAG,WAAW,EAAG,eAAe,EAAG,cAAc,CAAC,EAAG,cAAc,EAAG,WAAW,EAAG,mBAAmB,EAAG,OAAO,CAAC,EAAG,cAAc,EAAG,WAAW,EAAG,mBAAmB,EAAG,OAAO,CAAC,EAAG,YAAY,EAAG,oBAAoB,GAAK,CAAC,EAAG,WAAW,EAAG,WAAW,EAAE,EAAG,KAAK,EAAG,KAAK,EAAG,cAAc,EAAI,CAAC,EAAG,cAAc,EAAG,SAAS,CAAC,EAAG,UAAU,EAAG,mBAAmB,EAAQ,UAAU,CAAC,EAAE,CAAC,EAAO,GAAM,EAAI,WAAW,CAAC,GAAO,CAAC,GAAQ,EAAG,SAAS,GAAe,CAAC,GAAG,CAAC,EAAI,OAAO,EAAG,YAAY,EAAG,WAAW,EAAI,CAAC,EAAG,YAAY,EAAG,oBAAoB,GAAK,CAC3qB,IAAI,EAAK,EAAK,MAAU,EAAK,EAAK,OAAW,EAAU,SAAS,cAAc,SAAS,CAAC,EAAU,MAAM,EAAK,EAAU,OAAO,EAAK,IAAI,EAAI,EAAU,WAAW,KAAK,CACjK,EAAG,EAAI,MAAM,EAAG,EAAI,OAAW,EAAM,KAAK,IAAI,EAAK,EAAG,EAAK,EAAG,CAAK,EAAG,EAAG,EAAM,EAAG,EAAG,EAAU,GAAI,EAAK,GAAI,EAAE,GAAI,EAAK,GAAI,EAAE,EAAI,UAAU,EAAE,EAAE,EAAK,EAAK,CAAC,EAAI,UAAU,EAAI,EAAG,EAAG,EAAG,EAAG,CAAC,EAAG,WAAW,EAAG,WAAW,EAAE,EAAG,KAAK,EAAG,KAAK,EAAG,cAAc,EAAU,CAAE,SAAS,GAAQ,CAAC,GAAG,CAAC,EAAO,OAAO,GAAe,CAAC,EAAG,SAAS,EAAE,EAAE,EAAK,MAAM,EAAK,OAAO,CAAC,EAAG,MAAM,EAAG,iBAAiB,CAAC,IAAM,GAAK,KAAK,KAAK,CAAC,GAAW,IAAI,EAAG,UAAU,EAAM,EAAI,CAC9b,IAAI,EAAG,EAAS,QAAQ,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,EAAS,QAAQ,EAAE,CAAC,CAAC,IAAQ,EAAG,EAAS,QAAQ,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,EAAS,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAG,EAAE,EAAG,EAAG,UAAU,EAAO,EAAG,EAAG,CAAC,EAAG,UAAU,EAAU,EAAS,IAAI,CAAC,EAAG,UAAU,EAAO,EAAM,CAAC,EAAG,UAAU,EAAY,EAAK,MAAM,EAAK,OAAO,CAC/S,IAAI,EAAM,KAAK,KAAK,CAAK,EAAQ,EAAQ,QAAQ,MAAM,GAAG,CACtD,GAAY,EAAY,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAM,IAAI,EAAE,CAAK,EAAQ,CAAC,GAAG,EAAQ,GAAG,EAAW,CAAC,MAAM,IAAI,CAAK,EAAS,IAAI,aAAa,GAAK,CAAK,EAAM,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAQ,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,EAAQ,GAC1O,EAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAS,EAAE,EAAE,IAAI,EAAE,EAAE,GAAW,IAAI,IAAS,EAAG,UAAU,EAAW,EAAM,CAAC,EAAG,WAAW,EAAM,EAAS,CACnJ,EAAG,UAAU,EAAY,EAAc,QAAQ,CAAC,EAAG,WAAW,EAAG,eAAe,EAAE,EAAE,CAAC,EAAY,sBAAsB,EAAO,CAAE,UAAU,CAAI,GAAY,qBAAqB,EAAY,CAAC,EAAG,OAAS,CAAC,EAAM,IAAI,EAAK,MAAM,EAAK,OAAO,EAAS,EAAM,EAAS,CAAC,CAChQ,EAA8B,EAAK,MAAM,CAAC,MAAM,CAAC,GAAG,EAAM,MAAM,OAAO,OAAO,OAAO,SAAS,WAAW,SAAS,SAAS,eAAa,CAAC,SAAsB,EAAK,MAAM,CAAC,IAAI,EAAM,IAAI,IAAI,EAAM,IAAI,MAAM,CAAC,MAAM,OAAO,OAAO,OAAO,UAAU,QAAQ,QAAQ,QAAQ,eAAa,CAAC,CAAC,CAAC,CAAC,CAAsB,EAAK,MAAM,CAAC,MAAM,CAAC,GAAG,EAAM,MAAM,OAAO,OAAO,OAAO,SAAS,WAAW,SAAS,SAAS,eAAa,CAAC,YAAY,EAAW,aAAa,EAAY,YAAY,EAAW,WAAW,EAAY,SAAsB,EAAK,SAAS,CAAC,IAAI,EAAU,MAAM,EAAK,MAAM,OAAO,EAAK,OAAO,MAAM,CAAC,MAAM,OAAO,OAAO,OAAO,QAAQ,QAAQ,eAAa,CAAC,aAAa,EAAM,IAAI,CAAC,CAAC,CAAC,wBA1FpoB,IAAyD,IAAwE,CAAM,EAAa,CAAC,IAAI,sEAAsE,IAAI,oBAAoB,CA0F+Y,EAAoB,EAAY,CAAC,MAAM,CAAC,KAAK,EAAY,gBAAgB,MAAM,QAAQ,YAAY,uBAAuB,CAAC,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,YAAY,0BAA0B,aAAa,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,YAAY,sBAAsB,aAAa,IAAI,IAAI,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,YAAY,0BAA0B,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC"}