PageSourceSearch

https://www.surelio.ai/assets/BlogDetail-rdYjxo4W.js

js surelio.ai collected 2026-10-05 12:42:05 UTC 316,917 bytes, 15 lines download raw bytes

vendor: 31,133 bytes, lines 1-11
1import{c as Xs,j as m,u as Oa,B as Se,w as Cn,S as Fa,H as Ba,r as Wa,s as Ga}from"./index-BrbKOj37.js";import{r as T,f as Ua,L as mt}from"./react-OVPotHod.js";import{A as En,a as Pn,b as Mn,h as Ge}from"./hugo-medori.jpeg.asset-pqBS3BTj.js";import"./i18n-CVtPQDK7.js";/**
2 * @license lucide-react v0.462.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const za=Xs("Languages",[["path",{d:"m5 8 6 6",key:"1wu5hv"}],["path",{d:"m4 14 6-6 2-3",key:"1k1g8d"}],["path",{d:"M2 5h12",key:"or177f"}],["path",{d:"M7 2h1",key:"1t2jsx"}],["path",{d:"m22 22-5-10-5 10",key:"don7ne"}],["path",{d:"M14 18h6",key:"1m8k6r"}]]);/**
7 * @license lucide-react v0.462.0 - ISC
8 *
9 * This source code is licensed under the ISC license.
10 * See the LICENSE file in the root directory of this source tree.
11 */const Ha=Xs("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]),Ys=T.createContext({});function _a(e){const t=T.useRef(null);return t.current===null&&(t.current=e()),t.current}const $a=typeof window<"u",Ka=$a?T.useLayoutEffect:T.useEffect,tn=T.createContext(null);function nn(e,t){e.indexOf(t)===-1&&e.push(t)}function et(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}const ee=(e,t,n)=>n>t?t:n<e?e:n;let ct=()=>{},xe=()=>{};const ae={},Zs=e=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(e);function Qs(e){return typeof e=="object"&&e!==null}const ei=e=>/^0[^.\s]+$/u.test(e);function ti(e){let t;return()=>(t===void 0&&(t=e()),t)}const H=e=>e,Ja=(e,t)=>n=>t(e(n)),Oe=(...e)=>e.reduce(Ja),je=(e,t,n)=>{const s=t-e;return s===0?1:(n-e)/s};class sn{constructor(){this.subscriptions=[]}add(t){return nn(this.subscriptions,t),()=>et(this.subscriptions,t)}notify(t,n,s){const i=this.subscriptions.length;if(i)if(i===1)this.subscriptions[0](t,n,s);else for(let o=0;o<i;o++){const a=this.subscriptions[o];a&&a(t,n,s)}}getSize(){return this.subscriptions.length}clear(){this.subscriptions.length=0}}const G=e=>e*1e3,z=e=>e/1e3;function ni(e,t){return t?e*(1e3/t):0}const si=(e,t,n)=>(((1-3*n+3*t)*e+(3*n-6*t))*e+3*t)*e,Xa=1e-7,Ya=12;function Za(e,t,n,s,i){let o,a,r=0;do a=t+(n-t)/2,o=si(a,s,i)-e,o>0?n=a:t=a;while(Math.abs(o)>Xa&&++r<Ya);return a}function Fe(e,t,n,s){if(e===t&&n===s)return H;const i=o=>Za(o,0,1,e,n);return o=>o===0||o===1?o:si(i(o),t,s)}const ii=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,ai=e=>t=>1-e(1-t),oi=Fe(.33,1.53,.69,.99),an=ai(oi),ri=ii(an),li=e=>e>=1?1:(e*=2)<1?.5*an(e):.5*(2-Math.pow(2,-10*(e-1))),on=e=>1-Math.sin(Math.acos(e)),ci=ai(on),ui=ii(on),Qa=Fe(.42,0,1,1),eo=Fe(0,0,.58,1),di=Fe(.42,0,.58,1),to=e=>Array.isArray(e)&&typeof e[0]!="number",hi=e=>Array.isArray(e)&&typeof e[0]=="number",Rn={linear:H,easeIn:Qa,easeInOut:di,easeOut:eo,circIn:on,circInOut:ui,circOut:ci,backIn:an,backInOut:ri,backOut:oi,anticipate:li},no=e=>typeof e=="string",Ln=e=>{if(hi(e)){xe(e.length===4,"Cubic bezier arrays must contain four numerical values.","cubic-bezier-length");const[t,n,s,i]=e;return Fe(t,n,s,i)}else if(no(e))return xe(Rn[e]!==void 0,`Invalid easing type '${e}'`,"invalid-easing-type"),Rn[e];return e},Ue=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"],jn={value:null,addProjectionMetrics:null};function so(e,t){let n=new Set,s=new Set,i=!1,o=!1;const a=new WeakSet;let r={delta:0,timestamp:0,isProcessing:!1},l=0;function u(d){a.has(d)&&(c.schedule(d),e()),l++,d(r)}const c={schedule:(d,h=!1,p=!1)=>{const y=p&&i?n:s;return h&&a.add(d),y.add(d),d},cancel:d=>{s.delete(d),a.delete(d)},process:d=>{if(r=d,i){o=!0;return}i=!0;const h=n;n=s,s=h,n.forEach(u),t&&jn.value&&jn.value.frameloop[t].push(l),l=0,n.clear(),i=!1,o&&(o=!1,c.process(d))}};return c}const io=40;function pi(e,t){let n=!1,s=!0;const i={delta:0,timestamp:0,isProcessing:!1},o=()=>n=!0,a=Ue.reduce((v,A)=>(v[A]=so(o,t?A:void 0),v),{}),{setup:r,read:l,resolveKeyframes:u,preUpdate:c,update:d,preRender:h,render:p,postRender:f}=a,y=()=>{const v=ae.useManualTiming,A=v?i.timestamp:performance.now();n=!1,v||(i.delta=s?1e3/60:Math.max(Math.min(A-i.timestamp,io),1)),i.timestamp=A,i.isProcessing=!0,r.process(i),l.process(i),u.process(i),c.process(i),d.process(i),h.process(i),p.process(i),f.process(i),i.isProcessing=!1,n&&t&&(s=!1,e(y))},g=()=>{n=!0,s=!0,i.isProcessing||e(y)};return{schedule:Ue.reduce((v,A)=>{const I=a[A];return v[A]=(R,O=!1,q=!1)=>(n||g(),I.schedule(R,O,q)),v},{}),cancel:v=>{for(let A=0;A<Ue.length;A++)a[Ue[A]].cancel(v)},state:i,steps:a}}const{schedule:S,cancel:oe,state:V,steps:ft}=pi(typeof requestAnimationFrame<"u"?requestAnimationFrame:H,!0);let $e;function ao(){$e=void 0}const F={now:()=>($e===void 0&&F.set(V.isProcessing||ae.useManualTiming?V.timestamp:performance.now()),$e),set:e=>{$e=e,queueMicrotask(ao)}},mi=e=>t=>typeof t=="string"&&t.startsWith(e),fi=mi("--"),oo=mi("var(--"),rn=e=>oo(e)?ro.test(e.split("/*")[0].trim()):!1,ro=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;function Dn(e){return typeof e!="string"?!1:e.split("/*")[0].includes("var(--")}const Ie={test:e=>typeof e=="number",parse:parseFloat,transform:e=>e},De={...Ie,transform:e=>ee(0,1,e)},ze={...Ie,default:1},Pe=e=>Math.round(e*1e5)/1e5,ln=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function lo(e){return e==null}const co=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,cn=(e,t)=>n=>!!(typeof n=="string"&&co.test(n)&&n.startsWith(e)||t&&!lo(n)&&Object.prototype.hasOwnProperty.call(n,t)),gi=(e,t,n)=>s=>{if(typeof s!="string")return s;const[i,o,a,r]=s.match(ln);return{[e]:parseFloat(i),[t]:parseFloat(o),[n]:parseFloat(a),alpha:r!==void 0?parseFloat(r):1}},uo=e=>ee(0,255,e),gt={...Ie,transform:e=>Math.round(uo(e))},he={test:cn("rgb","red"),parse:gi("red","green","blue"),transform:({red:e,green:t,blue:n,alpha:s=1})=>"rgba("+gt.transform(e)+", "+gt.transform(t)+", "+gt.transform(n)+", "+Pe(De.transform(s))+")"};function ho(e){let t="",n="",s="",i="";return e.length>5?(t=e.substring(1,3),n=e.substring(3,5),s=e.substring(5,7),i=e.substring(7,9)):(t=e.substring(1,2),n=e.substring(2,3),s=e.substring(3,4),i=e.substring(4,5),t+=t,n+=n,s+=s,i+=i),{red:parseInt(t,16),green:parseInt(n,16),blue:parseInt(s,16),alpha:i?parseInt(i,16)/255:1}}const Mt={test:cn("#"),parse:ho,transform:he.transform},Be=e=>({test:t=>typeof t=="string"&&t.endsWith(e)&&t.split(" ").length===1,parse:parseFloat,transform:t=>`${t}${e}`}),ne=Be("deg"),Q=Be("%"),x=Be("px"),po=Be("vh"),mo=Be("vw"),Vn={...Q,parse:e=>Q.parse(e)/100,transform:e=>Q.transform(e*100)},be={test:cn("hsl","hue"),parse:gi("hue","saturation","lightness"),transform:({hue:e,saturation:t,lightness:n,alpha:s=1})=>"hsla("+Math.round(e)+", "+Q.transform(Pe(t))+", "+Q.transform(Pe(n))+", "+Pe(De.transform(s))+")"},M={test:e=>he.test(e)||Mt.test(e)||be.test(e),parse:e=>he.test(e)?he.parse(e):be.test(e)?be.parse(e):Mt.parse(e),transform:e=>typeof e=="string"?e:e.hasOwnProperty("red")?he.transform(e):be.transform(e),getAnimatableNone:e=>{const t=M.parse(e);return t.alpha=0,M.transform(t)}},fo=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function go(e){var t,n;return isNaN(e)&&typeof e=="string"&&(((t=e.match(ln))==null?void 0:t.length)||0)+(((n=e.match(fo))==null?void 0:n.length)||0)>0}const yi="number",bi="color",yo="var",bo="var(",Nn="${}",vo=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function Ae(e){const t=e.toString(),n=[],s={color:[],number:[],var:[]},i=[];let o=0;const r=t.replace(vo,l=>(M.test(l)?(s.color.push(o),i.push(bi),n.push(M.parse(l))):l.startsWith(bo)?(s.var.push(o),i.push(yo),n.push(l)):(s.number.push(o),i.push(yi),n.push(parseFloat(l))),++o,Nn)).split(Nn);return{values:n,split:r,indexes:s,types:i}}function wo(e){return Ae(e).values}function vi({split:e,types:t}){const n=e.length;return s=>{let i="";for(let o=0;o<n;o++)if(i+=e[o],s[o]!==void 0){const a=t[o];a===yi?i+=Pe(s[o]):a===bi?i+=M.transform(s[o]):i+=s[o]}return i}}function xo(e){return vi(Ae(e))}const Ao=e=>typeof e=="number"?0:M.test(e)?M.getAnimatableNone(e):e,To=(e,t)=>typeof e=="number"?t!=null&&t.trim().endsWith("/")?e:0:Ao(e);function Io(e){const t=Ae(e);return vi(t)(t.values.map((s,i)=>To(s,t.split[i])))}const K={test:go,parse:wo,createTransformer:xo,getAnimatableNone:Io};function yt(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function ko({hue:e,saturation:t,lightness:n,alpha:s}){e/=360,t/=100,n/=100;let i=0,o=0,a=0;if(!t)i=o=a=n;else{const r=n<.5?n*(1+t):n+t-n*t,l=2*n-r;i=yt(l,r,e+1/3),o=yt(l,r,e),a=yt(l,r,e-1/3)}return{red:Math.round(i*255),green:Math.round(o*255),blue:Math.round(a*255),alpha:s}}function tt(e,t){return n=>n>0?t:e}const C=(e,t,n)=>e+(t-e)*n,bt=(e,t,n)=>{const s=e*e,i=n*(t*t-s)+s;return i<0?0:Math.sqrt(i)},qo=[Mt,he,be],So=e=>qo.find(t=>t.test(e));function On(e){const t=So(e);if(ct(!!t,`'${e}' is not an animatable color. Use the equivalent color code instead.`,"color-not-animatable"),!t)return!1;let n=t.parse(e);return t===be&&(n=ko(n)),n}const Fn=(e,t)=>{const n=On(e),s=On(t);if(!n||!s)return tt(e,t);const i={...n};return o=>(i.red=bt(n.red,s.red,o),i.green=bt(n.green,s.green,o),i.blue=bt(n.blue,s.blue,o),i.alpha=C(n.alpha,s.alpha,o),he.transform(i))},Rt=new Set(["none","hidden"]);function Co(e,t){return Rt.has(e)?n=>n<=0?e:t:n=>n>=1?t:e}function Eo(e,t){return n=>C(e,t,n)}function un(e){return typeof e=="number"?Eo:typeof e=="string"?rn(e)?tt:M.test(e)?Fn:Ro:Array.isArray(e)?wi:typeof e=="object"?M.test(e)?Fn:Po:tt}function wi(e,t){const n=[...e],s=n.length,i=e.map((o,a)=>un(o)(o,t[a]));return o=>{for(let a=0;a<s;a++)n[a]=i[a](o);return n}}function Po(e,t){const n={...e,...t},s={};for(const i in n)e[i]!==void 0&&t[i]!==void 0&&(s[i]=un(e[i])(e[i],t[i]));return i=>{for(const o in s)n[o]=s[o](i);return n}}function Mo(e,t){const n=[],s={color:0,var:0,number:0};for(let i=0;i<t.values.length;i++){const o=t.types[i],a=e.indexes[o][s[o]],r=e.values[a]??0;n[i]=r,s[o]++}return n}const Ro=(e,t)=>{const n=K.createTransformer(t),s=Ae(e),i=Ae(t);return s.indexes.var.length===i.indexes.var.length&&s.indexes.color.length===i.indexes.color.length&&s.indexes.number.length>=i.indexes.number.length?Rt.has(e)&&!i.values.length||Rt.has(t)&&!s.values.length?Co(e,t):Oe(wi(Mo(s,i),i.values),n):(ct(!0,`Complex values '${e}' and '${t}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`,"complex-values-different"),tt(e,t))};function xi(e,t,n){return typeof e=="number"&&typeof t=="number"&&typeof n=="number"?C(e,t,n):un(e)(e,t)}const Lo=e=>{const t=({timestamp:n})=>e(n);return{start:(n=!0)=>S.update(t,n),stop:()=>oe(t),now:()=>V.isProcessing?V.timestamp:F.now()}},Ai=(e,t,n=10)=>{let s="";const i=Math.max(Math.round(t/n),2);for(let o=0;o<i;o++)s+=Math.round(e(o/(i-1))*1e4)/1e4+", ";return`linear(${s.substring(0,s.length-2)})`},nt=2e4;function dn(e){let t=0;const n=50;let s=e.next(t);for(;!s.done&&t<nt;)t+=n,s=e.next(t);return t>=nt?1/0:t}function jo(e,t=100,n){const s=n({...e,keyframes:[0,t]}),i=Math.min(dn(s),nt);return{type:"keyframes",ease:o=>s.next(i*o).value/t,duration:z(i)}}const E={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1};function Lt(e,t){return e*Math.sqrt(1-t*t)}const Do=12;function Vo(e,t,n){let s=n;for(let i=1;i<Do;i++)s=s-e(s)/t(s);return s}const vt=.001;function No({duration:e=E.duration,bounce:t=E.bounce,velocity:n=E.velocity,mass:s=E.mass}){let i,o;ct(e<=G(E.maxDuration),"Spring duration must be 10 seconds or less","spring-duration-limit");let a=1-t;a=ee(E.minDamping,E.maxDamping,a),e=ee(E.minDuration,E.maxDuration,z(e)),a<1?(i=u=>{const c=u*a,d=c*e,h=c-n,p=Lt(u,a),f=Math.exp(-d);return vt-h/p*f},o=u=>{const d=u*a*e,h=d*n+n,p=Math.pow(a,2)*Math.pow(u,2)*e,f=Math.exp(-d),y=Lt(Math.pow(u,2),a);return(-i(u)+vt>0?-1:1)*((h-p)*f)/y}):(i=u=>{const c=Math.exp(-u*e),d=(u-n)*e+1;return-vt+c*d},o=u=>{const c=Math.exp(-u*e),d=(n-u)*(e*e);return c*d});const r=5/e,l=Vo(i,o,r);if(e=G(e),isNaN(l))return{stiffness:E.stiffness,damping:E.damping,duration:e};{const u=Math.pow(l,2)*s;return{stiffness:u,damping:a*2*Math.sqrt(s*u),duration:e}}}const Oo=["duration","bounce"],Fo=["stiffness","damping","mass"];function Bn(e,t){return t.some(n=>e[n]!==void 0)}function Bo(e){let t={velocity:E.velocity,stiffness:E.stiffness,damping:E.damping,mass:E.mass,isResolvedFromDuration:!1,...e};if(!Bn(e,Fo)&&Bn(e,Oo))if(t.velocity=0,e.visualDuration){const n=e.visualDuration,s=2*Math.PI/(n*1.2),i=s*s,o=2*ee(.05,1,1-(e.bounce||0))*Math.sqrt(i);t={...t,mass:E.mass,stiffness:i,damping:o}}else{const n=No({...e,velocity:0});t={...t,...n,mass:E.mass},t.isResolvedFromDuration=!0}return t}function st(e=E.visualDuration,t=E.bounce){const n=typeof e!="object"?{visualDuration:e,keyframes:[0,1],bounce:t}:e;let{restSpeed:s,restDelta:i}=n;const o=n.keyframes[0],a=n.keyframes[n.keyframes.length-1],r={done:!1,value:o},{stiffness:l,damping:u,mass:c,duration:d,velocity:h,isResolvedFromDuration:p}=Bo({...n,velocity:-z(n.velocity||0)}),f=h||0,y=u/(2*Math.sqrt(l*c)),g=a-o,b=z(Math.sqrt(l/c)),w=Math.abs(g)<5;s||(s=w?E.restSpeed.granular:E.restSpeed.default),i||(i=w?E.restDelta.granular:E.restDelta.default);let v,A,I,R,O,q;if(y<1)I=Lt(b,y),R=(f+y*b*g)/I,v=k=>{const P=Math.exp(-y*b*k);return a-P*(R*Math.sin(I*k)+g*Math.cos(I*k))},O=y*b*R+g*I,q=y*b*g-R*I,A=k=>Math.exp(-y*b*k)*(O*Math.sin(I*k)+q*Math.cos(I*k));else if(y===1){v=P=>a-Math.exp(-b*P)*(g+(f+b*g)*P);const k=f+b*g;A=P=>Math.exp(-b*P)*(b*k*P-f)}else{const k=b*Math.sqrt(y*y-1);v=J=>{const te=Math.exp(-y*b*J),X=Math.min(k*J,300);return a-te*((f+y*b*g)*Math.sinh(X)+k*g*Math.cosh(X))/k};const P=(f+y*b*g)/k,W=y*b*P-g*k,le=y*b*g-P*k;A=J=>{const te=Math.exp(-y*b*J),X=Math.min(k*J,300);return te*(W*Math.sinh(X)+le*Math.cosh(X))}}const j={calculatedDuration:p&&d||null,velocity:k=>G(A(k)),next:k=>{if(!p&&y<1){const W=Math.exp(-y*b*k),le=Math.sin(I*k),J=Math.cos(I*k),te=a-W*(R*le+g*J),X=G(W*(O*le+q*J));return r.done=Math.abs(X)<=s&&Math.abs(a-te)<=i,r.value=r.done?a:te,r}const P=v(k);if(p)r.done=k>=d;else{const W=G(A(k));r.done=Math.abs(W)<=s&&Math.abs(a-P)<=i}return r.value=r.done?a:P,r},toString:()=>{const k=Math.min(dn(j),nt),P=Ai(W=>j.next(k*W).value,k,30);return k+"ms "+P},toTransition:()=>{}};return j}st.applyToOptions=e=>{const t=jo(e,100,st);return e.ease=t.ease,e.duration=G(t.duration),e.type="keyframes",e};const Wo=5;function Ti(e,t,n){const s=Math.max(t-Wo,0);return ni(n-e(s),t-s)}function jt({keyframes:e,velocity:t=0,power:n=.8,timeConstant:s=325,bounceDamping:i=10,bounceStiffness:o=500,modifyTarget:a,min:r,max:l,restDelta:u=.5,restSpeed:c}){const d=e[0],h={done:!1,value:d},p=q=>r!==void 0&&q<r||l!==void 0&&q>l,f=q=>r===void 0?l:l===void 0||Math.abs(r-q)<Math.abs(l-q)?r:l;let y=n*t;const g=d+y,b=a===void 0?g:a(g);b!==g&&(y=b-d);const w=q=>-y*Math.exp(-q/s),v=q=>b+w(q),A=q=>{const j=w(q),k=v(q);h.done=Math.abs(j)<=u,h.value=h.done?b:k};let I,R;const O=q=>{p(h.value)&&(I=q,R=st({keyframes:[h.value,f(h.value)],velocity:Ti(v,q,h.value),damping:i,stiffness:o,restDelta:u,restSpeed:c}))};return O(0),{calculatedDuration:null,next:q=>{let j=!1;return!R&&I===void 0&&(j=!0,A(q),O(q)),I!==void 0&&q>=I?R.next(q-I):(!j&&A(q),h)}}}function Go(e,t,n){const s=[],i=n||ae.mix||xi,o=e.length-1;for(let a=0;a<o;a++){let r=i(e[a],e[a+1]);if(t){const l=Array.isArray(t)?t[a]||H:t;r=Oe(l,r)}s.push(r)}return s}function Uo(e,t,{clamp:n=!0,ease:s,mixer:i}={}){const o=e.length;if(xe(o===t.length,"Both input and output ranges must be the same length","range-length"),o===1)return()=>t[0];if(o===2&&t[0]===t[1])return()=>t[1];const a=e[0]===e[1];e[0]>e[o-1]&&(e=[...e].reverse(),t=[...t].reverse());const r=Go(t,s,i),l=r.length,u=c=>{if(a&&c<e[0])return t[0];let d=0;if(l>1)for(;d<e.length-2&&!(c<e[d+1]);d++);const h=je(e[d],e[d+1],c);return r[d](h)};return n?c=>u(ee(e[0],e[o-1],c)):u}function zo(e,t){const n=e[e.length-1];for(let s=1;s<=t;s++){const i=je(0,t,s);e.push(C(n,1,i))}}function Ho(e){const t=[0];return zo(t,e.length-1),t}function _o(e,t){return e.map(n=>n*t)}function $o(e,t){return e.map(()=>t||di).splice(0,e.length-1)}function Me({duration:e=300,keyframes:t,times:n,ease:s="easeInOut"}){const i=to(s)?s.map(Ln):Ln(s),o={done:!1,value:t[0]},a=_o(n&&n.length===t.length?n:Ho(t),e),r=Uo(a,t,{ease:Array.isArray(i)?i:$o(t,i)});return{calculatedDuration:e,next:l=>(o.value=r(l),o.done=l>=e,o)}}const Ko=e=>e!==null;function ut(e,{repeat:t,repeatType:n="loop"},s,i=1){const o=e.filter(Ko),r=i<0||t&&n!=="loop"&&t%2===1?0:o.length-1;return!r||s===void 0?o[r]:s}const Jo={decay:jt,inertia:jt,tween:Me,keyframes:Me,spring:st};function Ii(e){typeof e.type=="string"&&(e.type=Jo[e.type])}class hn{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(t=>{this.resolve=t})}notifyFinished(){this.resolve()}then(t,n){return this.finished.then(t,n)}}const Xo=e=>e/100;class it extends hn{constructor(t){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.delayState={done:!1,value:void 0},this.stop=()=>{var s,i;const{motionValue:n}=this.options;n&&n.updatedAt!==F.now()&&this.tick(F.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),(i=(s=this.options).onStop)==null||i.call(s))},this.options=t,this.initAnimation(),this.play(),t.autoplay===!1&&this.pause()}initAnimation(){const{options:t}=this;Ii(t);const{type:n=Me,repeat:s=0,repeatDelay:i=0,repeatType:o,velocity:a=0}=t;let{keyframes:r}=t;const l=n||Me;l!==Me&&typeof r[0]!="number"&&(this.mixKeyframes=Oe(Xo,xi(r[0],r[1])),r=[0,100]);const u=l({...t,keyframes:r});o==="mirror"&&(this.mirroredGenerator=l({...t,keyframes:[...r].reverse(),velocity:-a})),u.calculatedDuration===null&&(u.calculatedDuration=dn(u));const{calculatedDuration:c}=u;this.calculatedDuration=c,this.resolvedDuration=c+i,this.totalDuration=this.resolvedDuration*(s+1)-i,this.generator=u}updateTime(t){const n=Math.round(t-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=n}tick(t,n=!1){const{generator:s,totalDuration:i,mixKeyframes:o,mirroredGenerator:a,resolvedDuration:r,calculatedDuration:l}=this;if(this.startTime===null)return s.next(0);const{delay:u=0,keyframes:c,repeat:d,repeatType:h,repeatDelay:p,type:f,onUpdate:y,finalKeyframe:g}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,t):this.speed<0&&(this.startTime=Math.min(t-i/this.speed,this.startTime)),n?this.currentTime=t:this.updateTime(t);const b=this.currentTime-u*(this.playbackSpeed>=0?1:-1),w=this.playbackSpeed>=0?b<0:b>i;this.currentTime=Math.max(b,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=i);let v=this.currentTime,A=s;if(d){const q=Math.min(this.currentTime,i)/r;let j=Math.floor(q),k=q%1;!k&&q>=1&&(k=1),k===1&&j--,j=Math.min(j,d+1),!!(j%2)&&(h==="reverse"?(k=1-k,p&&(k-=p/r)):h==="mirror"&&(A=a)),v=ee(0,1,k)*r}let I;w?(this.delayState.value=c[0],I=this.delayState):I=A.next(v),o&&!w&&(I.value=o(I.value));let{done:R}=I;!w&&l!==null&&(R=this.playbackSpeed>=0?this.currentTime>=i:this.currentTime<=0);const O=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&R);return O&&f!==jt&&(I.value=ut(c,this.options,g,this.speed)),y&&y(I.value),O&&this.finish(),I}then(t,n){return this.finished.then(t,n)}get duration(){return z(this.calculatedDuration)}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+z(t)}get time(){return z(this.currentTime)}set time(t){t=G(t),this.currentTime=t,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=t:this.driver&&(this.startTime=this.driver.now()-t/this.playbackSpeed),this.driver?this.driver.start(!1):(this.startTime=0,this.state="paused",this.holdTime=t,this.tick(t))}getGeneratorVelocity(){const t=this.currentTime;if(t<=0)return this.options.velocity||0;if(this.generator.velocity)return this.generator.velocity(t);const n=this.generator.next(t).value;return Ti(s=>this.generator.next(s).value,t,n)}get speed(){return this.playbackSpeed}set speed(t){const n=this.playbackSpeed!==t;n&&this.driver&&this.updateTime(F.now()),this.playbackSpeed=t,n&&this.driver&&(this.time=z(this.currentTime))}play(){var i,o;if(this.isStopped)return;const{driver:t=Lo,startTime:n}=this.options;this.driver||(this.driver=t(a=>this.tick(a))),(o=(i=this.options).onPlay)==null||o.call(i);const s=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=s):this.holdTime!==null?this.startTime=s-this.holdTime:this.startTime||(this.startTime=n??s),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(F.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){var t,n;this.notifyFinished(),this.teardown(),this.state="finished",(n=(t=this.options).onComplete)==null||n.call(t)}cancel(){var t,n;this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),(n=(t=this.options).onCancel)==null||n.call(t)}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(t){return this.startTime=0,this.tick(t,!0)}attachTimeline(t){var n;return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),(n=this.driver)==null||n.stop(),t.observe(this)}}function Yo(e){for(let t=1;t<e.length;t++)e[t]??(e[t]=e[t-1])}const pe=e=>e*180/Math.PI,Dt=e=>{const t=pe(Math.atan2(e[1],e[0]));return Vt(t)},Zo={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:e=>(Math.abs(e[0])+Math.abs(e[3]))/2,rotate:Dt,rotateZ:Dt,skewX:e=>pe(Math.atan(e[1])),skewY:e=>pe(Math.atan(e[2])),skew:e=>(Math.abs(e[1])+Math.abs(e[2]))/2},Vt=e=>(e=e%360,e<0&&(e+=360),e),Wn=Dt,Gn=e=>Math.sqrt(e[0]*e[0]+e[1]*e[1]),Un=e=>Math.sqrt(e[4]*e[4]+e[5]*e[5]),Qo={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:Gn,scaleY:Un,scale:e=>(Gn(e)+Un(e))/2,rotateX:e=>Vt(pe(Math.atan2(e[6],e[5]))),rotateY:e=>Vt(pe(Math.atan2(-e[2],e[0]))),rotateZ:Wn,rotate:Wn,skewX:e=>pe(Math.atan(e[4])),skewY:e=>pe(Math.atan(e[1])),skew:e=>(Math.abs(e[1])+Math.abs(e[4]))/2};function Nt(e){return e.includes("scale")?1:0}function Ot(e,t){if(!e||e==="none")return Nt(t);const n=e.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let s,i;if(n)s=Qo,i=n;else{const r=e.match(/^matrix\(([-\d.e\s,]+)\)$/u);s=Zo,i=r}if(!i)return Nt(t);const o=s[t],a=i[1].split(",").map(tr);return typeof o=="function"?o(a):a[o]}const er=(e,t)=>{const{transform:n="none"}=getComputedStyle(e);return Ot(n,t)};function tr(e){return parseFloat(e.trim())}const ke=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],qe=new Set(ke),zn=e=>e===Ie||e===x,nr=new Set(["x","y","z"]),sr=ke.filter(e=>!nr.has(e));function ir(e){const t=[];return sr.forEach(n=>{const s=e.getValue(n);s!==void 0&&(t.push([n,s.get()]),s.set(n.startsWith("scale")?1:0))}),t}const ie={width:({x:e},{paddingLeft:t="0",paddingRight:n="0",boxSizing:s})=>{const i=e.max-e.min;return s==="border-box"?i:i-parseFloat(t)-parseFloat(n)},height:({y:e},{paddingTop:t="0",paddingBottom:n="0",boxSizing:s})=>{const i=e.max-e.min;return s==="border-box"?i:i-parseFloat(t)-parseFloat(n)},top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:(e,{transform:t})=>Ot(t,"x"),y:(e,{transform:t})=>Ot(t,"y")};ie.translateX=ie.x;ie.translateY=ie.y;const me=new Set;let Ft=!1,Bt=!1,Wt=!1;function ki(){if(Bt){const e=Array.from(me).filter(s=>s.needsMeasurement),t=new Set(e.map(s=>s.element)),n=new Map;t.forEach(s=>{const i=ir(s);i.length&&(n.set(s,i),s.render())}),e.forEach(s=>s.measureInitialState()),t.forEach(s=>{s.render();const i=n.get(s);i&&i.forEach(([o,a])=>{var r;(r=s.getValue(o))==null||r.set(a)})}),e.forEach(s=>s.measureEndState()),e.forEach(s=>{s.suspendedScrollY!==void 0&&window.scrollTo(0,s.suspendedScrollY)})}Bt=!1,Ft=!1,me.forEach(e=>e.complete(Wt)),me.clear()}function qi(){me.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(Bt=!0)})}function ar(){Wt=!0,qi(),ki(),Wt=!1}class pn{constructor(t,n,s,i,o,a=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...t],this.onComplete=n,this.name=s,this.motionValue=i,this.element=o,this.isAsync=a}scheduleResolve(){this.state="scheduled",this.isAsync?(me.add(this),Ft||(Ft=!0,S.read(qi),S.resolveKeyframes(ki))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:t,name:n,element:s,motionValue:i}=this;if(t[0]===null){const o=i==null?void 0:i.get(),a=t[t.length-1];if(o!==void 0)t[0]=o;else if(s&&n){const r=s.readValue(n,a);r!=null&&(t[0]=r)}t[0]===void 0&&(t[0]=a),i&&o===void 0&&i.set(t[0])}Yo(t)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(t=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,t),me.delete(this)}cancel(){this.state==="scheduled"&&(me.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const or=e=>e.startsWith("--");function Si(e,t,n){or(t)?e.style.setProperty(t,n):e.style[t]=n}const rr={};function Ci(e,t){const n=ti(e);return()=>rr[t]??n()}const lr=Ci(()=>window.ScrollTimeline!==void 0,"scrollTimeline"),Ei=Ci(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),Ee=([e,t,n,s])=>`cubic-bezier(${e}, ${t}, ${n}, ${s})`,Hn={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:Ee([0,.65,.55,1]),circOut:Ee([.55,0,1,.45]),backIn:Ee([.31,.01,.66,-.59]),backOut:Ee([.33,1.53,.69,.99])};function Pi(e,t){if(e)return typeof e=="function"?Ei()?Ai(e,t):"ease-out":hi(e)?Ee(e):Array.isArray(e)?e.map(n=>Pi(n,t)||Hn.easeOut):Hn[e]}function cr(e,t,n,{delay:s=0,duration:i=300,repeat:o=0,repeatType:a="loop",ease:r="easeOut",times:l}={},u=void 0){const c={[t]:n};l&&(c.offset=l);const d=Pi(r,i);Array.isArray(d)&&(c.easing=d);const h={delay:s,duration:i,easing:Array.isArray(d)?"linear":d,fill:"both",iterations:o+1,direction:a==="reverse"?"alternate":"normal"};return u&&(h.pseudoElement=u),e.animate(c,h)}function Mi(e){return typeof e=="function"&&"applyToOptions"in e}function ur({type:e,...t}){return Mi(e)&&Ei()?e.applyToOptions(t):(t.duration??(t.duration=300),t.ease??(t.ease="easeOut"),t)}class Ri extends hn{constructor(t){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!t)return;const{element:n,name:s,keyframes:i,pseudoElement:o,allowFlatten:a=!1,finalKeyframe:r,onComplete:l}=t;this.isPseudoElement=!!o,this.allowFlatten=a,this.options=t,xe(typeof t.type!="string",`Mini animate() doesn't support "type" as a string.`,"mini-spring");const u=ur(t);this.animation=cr(n,s,i,u,o),u.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!o){const c=ut(i,this.options,r,this.speed);this.updateMotionValue&&this.updateMotionValue(c),Si(n,s,c),this.animation.cancel()}l==null||l(),this.notifyFinished()}}play(){this.isStopped||(this.manualStartTime=null,this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){var t,n;(n=(t=this.animation).finish)==null||n.call(t)}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:t}=this;t==="idle"||t==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){var n,s,i;const t=(n=this.options)==null?void 0:n.element;!this.isPseudoElement&&(t!=null&&t.isConnected)&&((i=(s=this.animation).commitStyles)==null||i.call(s))}get duration(){var n,s;const t=((s=(n=this.animation.effect)==null?void 0:n.getComputedTiming)==null?void 0:s.call(n).duration)||0;return z(Number(t))}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+z(t)}get time(){return z(Number(this.animation.currentTime)||0)}set time(t){const n=this.finishedTime!==null;this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=G(t),n&&this.animation.pause()}get speed(){return this.animation.playbackRate}set speed(t){t<0&&(this.finishedTime=null),this.animation.playbackRate=t}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(t){this.manualStartTime=this.animation.startTime=t}attachTimeline({timeline:t,rangeStart:n,rangeEnd:s,observe:i}){var o;return this.allowFlatten&&((o=this.animation.effect)==null||o.updateTiming({easing:"linear"})),this.animation.onfinish=null,t&&lr()?(this.animation.timeline=t,n&&(this.animation.rangeStart=n),s&&(this.animation.rangeEnd=s),H):i(this)}}const Li={anticipate:li,backInOut:ri,circInOut:ui};function dr(e){return e in Li}function hr(e){typeof e.ease=="string"&&dr(e.ease)&&(e.ease=Li[e.ease])}const wt=10;class pr extends Ri{constructor(t){hr(t),Ii(t),super(t),t.startTime!==void 0&&t.autoplay!==!1&&(this.startTime=t.startTime),this.options=t}updateMotionValue(t){const{motionValue:n,onUpdate:s,onComplete:i,element:o,...a}=this.options;if(!n)return;if(t!==void 0){n.set(t);return}const r=new it({...a,autoplay:!1}),l=Math.max(wt,F.now()-this.startTime),u=ee(0,wt,l-wt),c=r.sample(l).value,{name:d}=this.options;o&&d&&Si(o,d,c),n.setWithVelocity(r.sample(Math.max(0,l-u)).value,c,u),r.stop()}}const _n=(e,t)=>t==="zIndex"?!1:!!(typeof e=="number"||Array.isArray(e)||typeof e=="string"&&(K.test(e)||e==="0")&&!e.startsWith("url("));function mr(e){const t=e[0];if(e.length===1)return!0;for(let n=0;n<e.length;n++)if(e[n]!==t)return!0}function fr(e,t,n,s){const i=e[0];if(i===null)return!1;if(t==="display"||t==="visibility")return!0;const o=e[e.length-1],a=_n(i,t),r=_n(o,t);return ct(a===r,`You are trying to animate ${t} from "${i}" to "${o}". "${a?o:i}" is not an animatable value.`,"value-not-animatable"),!a||!r?!1:mr(e)||(n==="spring"||Mi(n))&&s}function Gt(e){e.duration=0,e.type="keyframes"}const ji=new Set(["opacity","clipPath","filter","transform"]),gr=/^(?:oklch|oklab|lab|lch|color|color-mix|light-dark)\(/;function yr(e){for(let t=0;t<e.length;
11t++)if(typeof e[t]=="string"&&gr.test(e[t]))return!0;return!1}const br=new Set(["color","backgroundColor","outlineColor","fill","stroke","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"]),vr=ti(()=>Object.hasOwnProperty.call(Element.prototype,"animate"));function wr(e){var d;const{motionValue:t,name:n,repeatDelay:s,repeatType:i,damping:o,type:a,keyframes:r}=e;if(!(((d=t==null?void 0:t.owner)==null?void 0:d.current)instanceof HTMLElement))return!1;const{onUpdate:u,transformTemplate:c}=t.owner.getProps();return vr()&&n&&(ji.has(n)||br.has(n)&&yr(r))&&(n!=="transform"||!c)&&!u&&!s&&i!=="mirror"&&o!==0&&a!=="inertia"}const xr=40;class Ar extends hn{constructor({autoplay:t=!0,delay:n=0,type:s="keyframes",repeat:i=0,repeatDelay:o=0,repeatType:a="loop",keyframes:r,name:l,motionValue:u,element:c,...d}){var f;super(),this.stop=()=>{var y,g;this._animation&&(this._animation.stop(),(y=this.stopTimeline)==null||y.call(this)),(g=this.keyframeResolver)==null||g.cancel()},this.createdAt=F.now();const h={autoplay:t,delay:n,type:s,repeat:i,repeatDelay:o,repeatType:a,name:l,motionValue:u,element:c,...d},p=(c==null?void 0:c.KeyframeResolver)||pn;this.keyframeResolver=new p(r,(y,g,b)=>this.onKeyframesResolved(y,g,h,!b),l,u,c),(f=this.keyframeResolver)==null||f.scheduleResolve()}onKeyframesResolved(t,n,s,i){var b,w;this.keyframeResolver=void 0;const{name:o,type:a,velocity:r,delay:l,isHandoff:u,onUpdate:c}=s;this.resolvedAt=F.now();let d=!0;fr(t,o,a,r)||(d=!1,(ae.instantAnimations||!l)&&(c==null||c(ut(t,s,n))),t[0]=t[t.length-1],Gt(s),s.repeat=0);const p={startTime:i?this.resolvedAt?this.resolvedAt-this.createdAt>xr?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:n,...s,keyframes:t},f=d&&!u&&wr(p),y=(w=(b=p.motionValue)==null?void 0:b.owner)==null?void 0:w.current;let g;if(f)try{g=new pr({...p,element:y})}catch{g=new it(p)}else g=new it(p);g.finished.then(()=>{this.notifyFinished()}).catch(H),this.pendingTimeline&&(this.stopTimeline=g.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=g}get finished(){return this._animation?this.animation.finished:this._finished}then(t,n){return this.finished.finally(t).then(()=>{})}get animation(){var t;return this._animation||((t=this.keyframeResolver)==null||t.resume(),ar()),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(t){this.animation.time=t}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(t){this.animation.speed=t}get startTime(){return this.animation.startTime}attachTimeline(t){return this._animation?this.stopTimeline=this.animation.attachTimeline(t):this.pendingTimeline=t,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){var t;this._animation&&this.animation.cancel(),(t=this.keyframeResolver)==null||t.cancel()}}function Di(e,t,n,s=0,i=1){const o=Array.from(e).sort((u,c)=>u.sortNodePosition(c)).indexOf(t),a=e.size,r=(a-1)*s;return typeof n=="function"?n(o,a):i===1?o*s:r-o*s}const Tr=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function Ir(e){const t=Tr.exec(e);if(!t)return[,];const[,n,s,i]=t;return[`--${n??s}`,i]}const kr=4;function Vi(e,t,n=1){xe(n<=kr,`Max CSS variable fallback depth detected in property "${e}". This may indicate a circular fallback dependency.`,"max-css-var-depth");const[s,i]=Ir(e);if(!s)return;const o=window.getComputedStyle(t).getPropertyValue(s);if(o){const a=o.trim();return Zs(a)?parseFloat(a):a}return rn(i)?Vi(i,t,n+1):i}const qr={type:"spring",stiffness:500,damping:25,restSpeed:10},Sr=e=>({type:"spring",stiffness:550,damping:e===0?2*Math.sqrt(550):30,restSpeed:10}),Cr={type:"keyframes",duration:.8},Er={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},Pr=(e,{keyframes:t})=>t.length>2?Cr:qe.has(e)?e.startsWith("scale")?Sr(t[1]):qr:Er;function Ni(e,t){if(e!=null&&e.inherit&&t){const{inherit:n,...s}=e;return{...t,...s}}return e}function mn(e,t){const n=(e==null?void 0:e[t])??(e==null?void 0:e.default)??e;return n!==e?Ni(n,e):n}const Mr=new Set(["when","delay","delayChildren","staggerChildren","staggerDirection","repeat","repeatType","repeatDelay","from","elapsed"]);function Rr(e){for(const t in e)if(!Mr.has(t))return!0;return!1}const fn=(e,t,n,s={},i,o)=>a=>{const r=mn(s,e)||{},l=r.delay||s.delay||0;let{elapsed:u=0}=s;u=u-G(l);const c={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:t.getVelocity(),...r,delay:-u,onUpdate:h=>{t.set(h),r.onUpdate&&r.onUpdate(h)},onComplete:()=>{a(),r.onComplete&&r.onComplete()},name:e,motionValue:t,element:o?void 0:i};
vendor: 4,359 bytes, line 11
11Rr(r)||Object.assign(c,Pr(e,c)),c.duration&&(c.duration=G(c.duration)),c.repeatDelay&&(c.repeatDelay=G(c.repeatDelay)),c.from!==void 0&&(c.keyframes[0]=c.from);let d=!1;if((c.type===!1||c.duration===0&&!c.repeatDelay)&&(Gt(c),c.delay===0&&(d=!0)),(ae.instantAnimations||ae.skipAnimations||i!=null&&i.shouldSkipAnimations)&&(d=!0,Gt(c),c.delay=0),c.allowFlatten=!r.type&&!r.ease,d&&!o&&t.get()!==void 0){const h=ut(c.keyframes,r);if(h!==void 0){S.update(()=>{c.onUpdate(h),c.onComplete()});return}}return r.isSync?new it(c):new Ar(c)};function $n(e){const t=[{},{}];return e==null||e.values.forEach((n,s)=>{t[0][s]=n.get(),t[1][s]=n.getVelocity()}),t}function gn(e,t,n,s){if(typeof t=="function"){const[i,o]=$n(s);t=t(n!==void 0?n:e.custom,i,o)}if(typeof t=="string"&&(t=e.variants&&e.variants[t]),typeof t=="function"){const[i,o]=$n(s);t=t(n!==void 0?n:e.custom,i,o)}return t}function fe(e,t,n){const s=e.getProps();return gn(s,t,n!==void 0?n:s.custom,e)}const Oi=new Set(["width","height","top","left","right","bottom",...ke]),Kn=30,Lr=e=>!isNaN(parseFloat(e));class jr{constructor(t,n={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=s=>{var o;const i=F.now();if(this.updatedAt!==i&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(s),this.current!==this.prev&&((o=this.events.change)==null||o.notify(this.current),this.dependents))for(const a of this.dependents)a.dirty()},this.hasAnimated=!1,this.setCurrent(t),this.owner=n.owner}setCurrent(t){this.current=t,this.updatedAt=F.now(),this.canTrackVelocity===null&&t!==void 0&&(this.canTrackVelocity=Lr(this.current))}setPrevFrameValue(t=this.current){this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt}onChange(t){return this.on("change",t)}on(t,n){this.events[t]||(this.events[t]=new sn);const s=this.events[t].add(n);return t==="change"?()=>{s(),S.read(()=>{this.events.change.getSize()||this.stop()})}:s}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,n){this.passiveEffect=t,this.stopPassiveEffect=n}set(t){this.passiveEffect?this.passiveEffect(t,this.updateAndNotify):this.updateAndNotify(t)}setWithVelocity(t,n,s){this.set(n),this.prev=void 0,this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt-s}jump(t,n=!0){this.updateAndNotify(t),this.prev=t,this.prevUpdatedAt=this.prevFrameValue=void 0,n&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){var t;(t=this.events.change)==null||t.notify(this.current)}addDependent(t){this.dependents||(this.dependents=new Set),this.dependents.add(t)}removeDependent(t){this.dependents&&this.dependents.delete(t)}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const t=F.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||t-this.updatedAt>Kn)return 0;const n=Math.min(this.updatedAt-this.prevUpdatedAt,Kn);return ni(parseFloat(this.current)-parseFloat(this.prevFrameValue),n)}start(t){return this.stop(),new Promise(n=>{this.hasAnimated=!0,this.animation=t(n),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){var t,n;(t=this.dependents)==null||t.clear(),(n=this.events.destroy)==null||n.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function Te(e,t){return new jr(e,t)}const Ut=e=>Array.isArray(e);function Dr(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,Te(n))}function Vr(e){return Ut(e)?e[e.length-1]||0:e}function Nr(e,t){const n=fe(e,t);let{transitionEnd:s={},transition:i={},...o}=n||{};o={...o,...s};for(const a in o){const r=Vr(o[a]);Dr(e,a,r)}}const N=e=>!!(e&&e.getVelocity);function Or(e){return!!(N(e)&&e.add)}function zt(e,t){const n=e.getValue("willChange");if(Or(n))return n.add(t);if(!n&&ae.WillChange){const s=new ae.WillChange("auto");e.addValue("willChange",s),s.add(t)}}function yn(e){return e.replace(/([A-Z])/g,t=>`-${t.toLowerCase()}`)}const Fr="framerAppearId",Fi="data-"+yn(Fr);function Bi(e){return e.props[Fi]}function Br({protectedKeys:e,needsAnimating:t},n){const s=e.hasOwnProperty(n)&&t[n]!==!0;return t[n]=!1,s}
vendor: 46,644 bytes, line 11
11function Wi(e,t,{delay:n=0,transitionOverride:s,type:i}={}){let{transition:o,transitionEnd:a,...r}=t;const l=e.getDefaultTransition();o=o?Ni(o,l):l;const u=o==null?void 0:o.reduceMotion;s&&(o=s);const c=[],d=i&&e.animationState&&e.animationState.getState()[i];for(const h in r){const p=e.getValue(h,e.latestValues[h]??null),f=r[h];if(f===void 0||d&&Br(d,h))continue;const y={delay:n,...mn(o||{},h)},g=p.get();if(g!==void 0&&!p.isAnimating()&&!Array.isArray(f)&&f===g&&!y.velocity){S.update(()=>p.set(f));continue}let b=!1;if(window.MotionHandoffAnimation){const A=Bi(e);if(A){const I=window.MotionHandoffAnimation(A,h,S);I!==null&&(y.startTime=I,b=!0)}}zt(e,h);const w=u??e.shouldReduceMotion;p.start(fn(h,p,f,w&&Oi.has(h)?{type:!1}:y,e,b));const v=p.animation;v&&c.push(v)}if(a){const h=()=>S.update(()=>{a&&Nr(e,a)});c.length?Promise.all(c).then(h):h()}return c}function Ht(e,t,n={}){var l;const s=fe(e,t,n.type==="exit"?(l=e.presenceContext)==null?void 0:l.custom:void 0);let{transition:i=e.getDefaultTransition()||{}}=s||{};n.transitionOverride&&(i=n.transitionOverride);const o=s?()=>Promise.all(Wi(e,s,n)):()=>Promise.resolve(),a=e.variantChildren&&e.variantChildren.size?(u=0)=>{const{delayChildren:c=0,staggerChildren:d,staggerDirection:h}=i;return Wr(e,t,u,c,d,h,n)}:()=>Promise.resolve(),{when:r}=i;if(r){const[u,c]=r==="beforeChildren"?[o,a]:[a,o];return u().then(()=>c())}else return Promise.all([o(),a(n.delay)])}function Wr(e,t,n=0,s=0,i=0,o=1,a){const r=[];for(const l of e.variantChildren)l.notify("AnimationStart",t),r.push(Ht(l,t,{...a,delay:n+(typeof s=="function"?0:s)+Di(e.variantChildren,l,s,i,o)}).then(()=>l.notify("AnimationComplete",t)));return Promise.all(r)}function Gr(e,t,n={}){e.notify("AnimationStart",t);let s;if(Array.isArray(t)){const i=t.map(o=>Ht(e,o,n));s=Promise.all(i)}else if(typeof t=="string")s=Ht(e,t,n);else{const i=typeof t=="function"?fe(e,t,n.custom):t;s=Promise.all(Wi(e,i,n))}return s.then(()=>{e.notify("AnimationComplete",t)})}const Ur={test:e=>e==="auto",parse:e=>e},Gi=e=>t=>t.test(e),Ui=[Ie,x,Q,ne,mo,po,Ur],Jn=e=>Ui.find(Gi(e));function zr(e){return typeof e=="number"?e===0:e!==null?e==="none"||e==="0"||ei(e):!0}const Hr=new Set(["brightness","contrast","saturate","opacity"]);function _r(e){const[t,n]=e.slice(0,-1).split("(");if(t==="drop-shadow")return e;const[s]=n.match(ln)||[];if(!s)return e;const i=n.replace(s,"");let o=Hr.has(t)?1:0;return s!==n&&(o*=100),t+"("+o+i+")"}const $r=/\b([a-z-]*)\(.*?\)/gu,_t={...K,getAnimatableNone:e=>{const t=e.match($r);return t?t.map(_r).join(" "):e}},$t={...K,getAnimatableNone:e=>{const t=K.parse(e);return K.createTransformer(e)(t.map(s=>typeof s=="number"?0:typeof s=="object"?{...s,alpha:1}:s))}},Xn={...Ie,transform:Math.round},Kr={rotate:ne,rotateX:ne,rotateY:ne,rotateZ:ne,scale:ze,scaleX:ze,scaleY:ze,scaleZ:ze,skew:ne,skewX:ne,skewY:ne,distance:x,translateX:x,translateY:x,translateZ:x,x,y:x,z:x,perspective:x,transformPerspective:x,opacity:De,originX:Vn,originY:Vn,originZ:x},bn={borderWidth:x,borderTopWidth:x,borderRightWidth:x,borderBottomWidth:x,borderLeftWidth:x,borderRadius:x,borderTopLeftRadius:x,borderTopRightRadius:x,borderBottomRightRadius:x,borderBottomLeftRadius:x,width:x,maxWidth:x,height:x,maxHeight:x,top:x,right:x,bottom:x,left:x,inset:x,insetBlock:x,insetBlockStart:x,insetBlockEnd:x,insetInline:x,insetInlineStart:x,insetInlineEnd:x,padding:x,paddingTop:x,paddingRight:x,paddingBottom:x,paddingLeft:x,paddingBlock:x,paddingBlockStart:x,paddingBlockEnd:x,paddingInline:x,paddingInlineStart:x,paddingInlineEnd:x,margin:x,marginTop:x,marginRight:x,marginBottom:x,marginLeft:x,marginBlock:x,marginBlockStart:x,marginBlockEnd:x,marginInline:x,marginInlineStart:x,marginInlineEnd:x,fontSize:x,backgroundPositionX:x,backgroundPositionY:x,...Kr,zIndex:Xn,fillOpacity:De,strokeOpacity:De,numOctaves:Xn},Jr={...bn,color:M,backgroundColor:M,outlineColor:M,fill:M,stroke:M,borderColor:M,borderTopColor:M,borderRightColor:M,borderBottomColor:M,borderLeftColor:M,filter:_t,WebkitFilter:_t,mask:$t,WebkitMask:$t},zi=e=>Jr[e],Xr=new Set([_t,$t]);function Hi(e,t){let n=zi(e);return Xr.has(n)||(n=K),n.getAnimatableNone?n.getAnimatableNone(t):void 0}const Yr=new Set(["auto","none","0"]);function Zr(e,t,n){let s=0,i;for(;s<e.length&&!i;){const o=e[s];typeof o=="string"&&!Yr.has(o)&&Ae(o).values.length&&(i=e[s]),s++}if(i&&n)for(const o of t)e[o]=Hi(n,i)}class Qr extends pn{constructor(t,n,s,i,o){super(t,n,s,i,o,!0)}readKeyframes(){const{unresolvedKeyframes:t,element:n,name:s}=this;if(!n||!n.current)return;super.readKeyframes();for(let c=0;c<t.length;c++){let d=t[c];if(typeof d=="string"&&(d=d.trim(),rn(d))){const h=Vi(d,n.current);h!==void 0&&(t[c]=h),c===t.length-1&&(this.finalKeyframe=d)}}if(this.resolveNoneKeyframes(),!Oi.has(s)||t.length!==2)return;const[i,o]=t,a=Jn(i),r=Jn(o),l=Dn(i),u=Dn(o);if(l!==u&&ie[s]){this.needsMeasurement=!0;return}if(a!==r)if(zn(a)&&zn(r))for(let c=0;c<t.length;c++){const d=t[c];typeof d=="string"&&(t[c]=parseFloat(d))}else ie[s]&&(this.needsMeasurement=!0)}resolveNoneKeyframes(){const{unresolvedKeyframes:t,name:n}=this,s=[];for(let i=0;i<t.length;i++)(t[i]===null||zr(t[i]))&&s.push(i);s.length&&Zr(t,s,n)}measureInitialState(){const{element:t,unresolvedKeyframes:n,name:s}=this;if(!t||!t.current)return;s==="height"&&(this.suspendedScrollY=window.pageYOffset),this.measuredOrigin=ie[s](t.measureViewportBox(),window.getComputedStyle(t.current)),n[0]=this.measuredOrigin;const i=n[n.length-1];i!==void 0&&t.getValue(s,i).jump(i,!1)}measureEndState(){var r;const{element:t,name:n,unresolvedKeyframes:s}=this;if(!t||!t.current)return;const i=t.getValue(n);i&&i.jump(this.measuredOrigin,!1);const o=s.length-1,a=s[o];s[o]=ie[n](t.measureViewportBox(),window.getComputedStyle(t.current)),a!==null&&this.finalKeyframe===void 0&&(this.finalKeyframe=a),(r=this.removedTransforms)!=null&&r.length&&this.removedTransforms.forEach(([l,u])=>{t.getValue(l).set(u)}),this.resolveNoneKeyframes()}}function _i(e,t,n){if(e==null)return[];if(e instanceof EventTarget)return[e];if(typeof e=="string"){const i=document.querySelectorAll(e);return i?Array.from(i):[]}return Array.from(e).filter(s=>s!=null)}const $i=(e,t)=>t&&typeof e=="number"?t.transform(e):e;function el(e){return Qs(e)&&"offsetHeight"in e&&!("ownerSVGElement"in e)}const{schedule:vn,cancel:$d}=pi(queueMicrotask,!1),$={x:!1,y:!1};function Ki(){return $.x||$.y}function tl(e){return e==="x"||e==="y"?$[e]?null:($[e]=!0,()=>{$[e]=!1}):$.x||$.y?null:($.x=$.y=!0,()=>{$.x=$.y=!1})}function Ji(e,t){const n=_i(e),s=new AbortController,i={passive:!0,...t,signal:s.signal};return[n,i,()=>s.abort()]}function nl(e){return!(e.pointerType==="touch"||Ki())}function sl(e,t,n={}){const[s,i,o]=Ji(e,n);return s.forEach(a=>{let r=!1,l=!1,u;const c=()=>{a.removeEventListener("pointerleave",f)},d=g=>{u&&(u(g),u=void 0),c()},h=g=>{r=!1,window.removeEventListener("pointerup",h),window.removeEventListener("pointercancel",h),l&&(l=!1,d(g))},p=()=>{r=!0,window.addEventListener("pointerup",h,i),window.addEventListener("pointercancel",h,i)},f=g=>{if(g.pointerType!=="touch"){if(r){l=!0;return}d(g)}},y=g=>{if(!nl(g))return;l=!1;const b=t(a,g);typeof b=="function"&&(u=b,a.addEventListener("pointerleave",f,i))};a.addEventListener("pointerenter",y,i),a.addEventListener("pointerdown",p,i)}),o}const Xi=(e,t)=>t?e===t?!0:Xi(e,t.parentElement):!1,wn=e=>e.pointerType==="mouse"?typeof e.button!="number"||e.button<=0:e.isPrimary!==!1,il=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function al(e){return il.has(e.tagName)||e.isContentEditable===!0}const ol=new Set(["INPUT","SELECT","TEXTAREA"]);function rl(e){return ol.has(e.tagName)||e.isContentEditable===!0}const Ke=new WeakSet;function Yn(e){return t=>{t.key==="Enter"&&e(t)}}function xt(e,t){e.dispatchEvent(new PointerEvent("pointer"+t,{isPrimary:!0,bubbles:!0}))}const ll=(e,t)=>{const n=e.currentTarget;if(!n)return;const s=Yn(()=>{if(Ke.has(n))return;xt(n,"down");const i=Yn(()=>{xt(n,"up")}),o=()=>xt(n,"cancel");n.addEventListener("keyup",i,t),n.addEventListener("blur",o,t)});n.addEventListener("keydown",s,t),n.addEventListener("blur",()=>n.removeEventListener("keydown",s),t)};function Zn(e){return wn(e)&&!Ki()}const Qn=new WeakSet;function cl(e,t,n={}){const[s,i,o]=Ji(e,n),a=r=>{const l=r.currentTarget;if(!Zn(r)||Qn.has(r))return;Ke.add(l),n.stopPropagation&&Qn.add(r);const u=t(l,r),c=(p,f)=>{window.removeEventListener("pointerup",d),window.removeEventListener("pointercancel",h),Ke.has(l)&&Ke.delete(l),Zn(p)&&typeof u=="function"&&u(p,{success:f})},d=p=>{c(p,l===window||l===document||n.useGlobalTarget||Xi(l,p.target))},h=p=>{c(p,!1)};window.addEventListener("pointerup",d,i),window.addEventListener("pointercancel",h,i)};return s.forEach(r=>{(n.useGlobalTarget?window:r).addEventListener("pointerdown",a,i),el(r)&&(r.addEventListener("focus",u=>ll(u,i)),!al(r)&&!r.hasAttribute("tabindex")&&(r.tabIndex=0))}),o}function xn(e){return Qs(e)&&"ownerSVGElement"in e}const Je=new WeakMap;let se;const Yi=(e,t,n)=>(s,i)=>i&&i[0]?i[0][e+"Size"]:xn(s)&&"getBBox"in s?s.getBBox()[t]:s[n],ul=Yi("inline","width","offsetWidth"),dl=Yi("block","height","offsetHeight");function hl({target:e,borderBoxSize:t}){var n;(n=Je.get(e))==null||n.forEach(s=>{s(e,{get width(){return ul(e,t)},get height(){return dl(e,t)}})})}function pl(e){e.forEach(hl)}function ml(){typeof ResizeObserver>"u"||(se=new ResizeObserver(pl))}function fl(e,t){se||ml();const n=_i(e);return n.forEach(s=>{let i=Je.get(s);i||(i=new Set,Je.set(s,i)),i.add(t),se==null||se.observe(s)}),()=>{n.forEach(s=>{const i=Je.get(s);i==null||i.delete(t),i!=null&&i.size||se==null||se.unobserve(s)})}}const Xe=new Set;let ve;function gl(){ve=()=>{const e={get width(){return window.innerWidth},get height(){return window.innerHeight}};Xe.forEach(t=>t(e))},window.addEventListener("resize",ve)}function yl(e){return Xe.add(e),ve||gl(),()=>{Xe.delete(e),!Xe.size&&typeof ve=="function"&&(window.removeEventListener("resize",ve),ve=void 0)}}function es(e,t){return typeof e=="function"?yl(e):fl(e,t)}function bl(e){return xn(e)&&e.tagName==="svg"}const vl=[...Ui,M,K],wl=e=>vl.find(Gi(e)),ts=()=>({translate:0,scale:1,origin:0,originPoint:0}),we=()=>({x:ts(),y:ts()}),ns=()=>({min:0,max:0}),L=()=>({x:ns(),y:ns()}),xl=new WeakMap;function dt(e){return e!==null&&typeof e=="object"&&typeof e.start=="function"}function Ve(e){return typeof e=="string"||Array.isArray(e)}const An=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],Tn=["initial",...An];function ht(e){return dt(e.animate)||Tn.some(t=>Ve(e[t]))}function Zi(e){return!!(ht(e)||e.variants)}function Al(e,t,n){for(const s in t){const i=t[s],o=n[s];if(N(i))e.addValue(s,i);else if(N(o))e.addValue(s,Te(i,{owner:e}));else if(o!==i)if(e.hasValue(s)){const a=e.getValue(s);a.liveStyle===!0?a.jump(i):a.hasAnimated||a.set(i)}else{const a=e.getStaticValue(s);e.addValue(s,Te(a!==void 0?a:i,{owner:e}))}}for(const s in n)t[s]===void 0&&e.removeValue(s);return t}const Kt={current:null},Qi={current:!1},Tl=typeof window<"u";function Il(){if(Qi.current=!0,!!Tl)if(window.matchMedia){const e=window.matchMedia("(prefers-reduced-motion)"),t=()=>Kt.current=e.matches;e.addEventListener("change",t),t()}else Kt.current=!1}const ss=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];let at={};function ea(e){at=e}function kl(){return at}class ql{scrapeMotionValuesFromProps(t,n,s){return{}}constructor({parent:t,props:n,presenceContext:s,reducedMotionConfig:i,skipAnimations:o,blockInitialAnimation:a,visualState:r},l={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.shouldSkipAnimations=!1,this.values=new Map,this.KeyframeResolver=pn,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.hasBeenMounted=!1,this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const p=F.now();this.renderScheduledAt<p&&(this.renderScheduledAt=p,S.render(this.render,!1,!0))};const{latestValues:u,renderState:c}=r;this.latestValues=u,this.baseTarget={...u},this.initialValues=n.initial?{...u}:{},this.renderState=c,this.parent=t,this.props=n,this.presenceContext=s,this.depth=t?t.depth+1:0,this.reducedMotionConfig=i,this.skipAnimationsConfig=o,this.options=l,this.blockInitialAnimation=!!a,this.isControllingVariants=ht(n),this.isVariantNode=Zi(n),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(t&&t.current);const{willChange:d,...h}=this.scrapeMotionValuesFromProps(n,{},this);for(const p in h){const f=h[p];u[p]!==void 0&&N(f)&&f.set(u[p])}}mount(t){var n,s;if(this.hasBeenMounted)for(const i in this.initialValues)(n=this.values.get(i))==null||n.jump(this.initialValues[i]),this.latestValues[i]=this.initialValues[i];this.current=t,xl.set(t,this),this.projection&&!this.projection.instance&&this.projection.mount(t),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((i,o)=>this.bindToMotionValue(o,i)),this.reducedMotionConfig==="never"?this.shouldReduceMotion=!1:this.reducedMotionConfig==="always"?this.shouldReduceMotion=!0:(Qi.current||Il(),this.shouldReduceMotion=Kt.current),this.shouldSkipAnimations=this.skipAnimationsConfig??!1,(s=this.parent)==null||s.addChild(this),this.update(this.props,this.presenceContext),this.hasBeenMounted=!0}unmount(){var t;this.projection&&this.projection.unmount(),oe(this.notifyUpdate),oe(this.render),this.valueSubscriptions.forEach(n=>n()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),(t=this.parent)==null||t.removeChild(this);for(const n in this.events)this.events[n].clear();for(const n in this.features){const s=this.features[n];s&&(s.unmount(),s.isMounted=!1)}this.current=null}addChild(t){this.children.add(t),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(t)}removeChild(t){this.children.delete(t),this.enteringChildren&&this.enteringChildren.delete(t)}bindToMotionValue(t,n){if(this.valueSubscriptions.has(t)&&this.valueSubscriptions.get(t)(),n.accelerate&&ji.has(t)&&this.current instanceof HTMLElement){const{factory:a,keyframes:r,times:l,ease:u,duration:c}=n.accelerate,d=new Ri({element:this.current,name:t,keyframes:r,times:l,ease:u,duration:G(c)}),h=a(d);this.valueSubscriptions.set(t,()=>{h(),d.cancel()});return}const s=qe.has(t);s&&this.onBindTransform&&this.onBindTransform();const i=n.on("change",a=>{this.latestValues[t]=a,this.props.onUpdate&&S.preRender(this.notifyUpdate),s&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let o;typeof window<"u"&&window.MotionCheckAppearSync&&(o=window.MotionCheckAppearSync(this,t,n)),this.valueSubscriptions.set(t,()=>{i(),o&&o(),n.owner&&n.stop()})}sortNodePosition(t){return!this.current||!this.sortInstanceNodePosition||this.type!==t.type?0:this.sortInstanceNodePosition(this.current,t.current)}updateFeatures(){let t="animation";for(t in at){const n=at[t];if(!n)continue;const{isEnabled:s,Feature:i}=n;if(!this.features[t]&&i&&s(this.props)&&(this.features[t]=new i(this)),this.features[t]){const o=this.features[t];o.isMounted?o.update():(o.mount(),o.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):L()}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,n){this.latestValues[t]=n}update(t,n){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=n;for(let s=0;s<ss.length;s++){const i=ss[s];this.propEventSubscriptions[i]&&(this.propEventSubscriptions[i](),delete this.propEventSubscriptions[i]);const o="on"+i,a=t[o];a&&(this.propEventSubscriptions[i]=this.on(i,a))}this.prevMotionValues=Al(this,this.scrapeMotionValuesFromProps(t,this.prevProps||{},this),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(t){return this.props.variants?this.props.variants[t]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}addVariantChild(t){const n=this.getClosestVariantNode();if(n)return n.variantChildren&&n.variantChildren.add(t),()=>n.variantChildren.delete(t)}addValue(t,n){const s=this.values.get(t);n!==s&&(s&&this.removeValue(t),this.bindToMotionValue(t,n),this.values.set(t,n),this.latestValues[t]=n.get())}removeValue(t){this.values.delete(t);const n=this.valueSubscriptions.get(t);n&&(n(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,n){if(this.props.values&&this.props.values[t])return this.props.values[t];let s=this.values.get(t);return s===void 0&&n!==void 0&&(s=Te(n===null?void 0:n,{owner:this}),this.addValue(t,s)),s}readValue(t,n){let s=this.latestValues[t]!==void 0||!this.current?this.latestValues[t]:this.getBaseTargetFromProps(this.props,t)??this.readValueFromInstance(this.current,t,this.options);return s!=null&&(typeof s=="string"&&(Zs(s)||ei(s))?s=parseFloat(s):!wl(s)&&K.test(n)&&(s=Hi(t,n)),this.setBaseTarget(t,N(s)?s.get():s)),N(s)?s.get():s}setBaseTarget(t,n){this.baseTarget[t]=n}getBaseTarget(t){var o;const{initial:n}=this.props;let s;if(typeof n=="string"||typeof n=="object"){const a=gn(this.props,n,(o=this.presenceContext)==null?void 0:o.custom);a&&(s=a[t])}if(n&&s!==void 0)return s;const i=this.getBaseTargetFromProps(this.props,t);return i!==void 0&&!N(i)?i:this.initialValues[t]!==void 0&&s===void 0?void 0:this.baseTarget[t]}on(t,n){return this.events[t]||(this.events[t]=new sn),this.events[t].add(n)}notify(t,...n){this.events[t]&&this.events[t].notify(...n)}scheduleRenderMicrotask(){vn.render(this.render)}}class ta extends ql{constructor(){super(...arguments),this.KeyframeResolver=Qr}sortInstanceNodePosition(t,n){return t.compareDocumentPosition(n)&2?1:-1}getBaseTargetFromProps(t,n){const s=t.style;return s?s[n]:void 0}removeValueFromRenderState(t,{vars:n,style:s}){delete n[t],delete s[t]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:t}=this.props;N(t)&&(this.childSubscription=t.on("change",n=>{this.current&&(this.current.textContent=`${n}`)}))}}class re{constructor(t){this.isMounted=!1,this.node=t}update(){}}function na({top:e,left:t,right:n,bottom:s}){return{x:{min:t,max:n},y:{min:e,max:s}}}function Sl({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}function Cl(e,t){if(!t)return e;const n=t({x:e.left,y:e.top}),s=t({x:e.right,y:e.bottom});return{top:n.y,left:n.x,bottom:s.y,right:s.x}}function At(e){return e===void 0||e===1}function Jt({scale:e,scaleX:t,scaleY:n}){return!At(e)||!At(t)||!At(n)}function de(e){return Jt(e)||sa(e)||e.z||e.rotate||e.rotateX||e.rotateY||e.skewX||e.skewY}function sa(e){return is(e.x)||is(e.y)}function is(e){return e&&e!=="0%"}function ot(e,t,n){const s=e-n,i=t*s;return n+i}function as(e,t,n,s,i){return i!==void 0&&(e=ot(e,i,s)),ot(e,n,s)+t}function Xt(e,t=0,n=1,s,i){e.min=as(e.min,t,n,s,i),e.max=as(e.max,t,n,s,i)}function ia(e,{x:t,y:n}){Xt(e.x,t.translate,t.scale,t.originPoint),Xt(e.y,n.translate,n.scale,n.originPoint)}const os=.999999999999,rs=1.0000000000001;function El(e,t,n,s=!1){var r;const i=n.length;if(!i)return;t.x=t.y=1;let o,a;for(let l=0;l<i;l++){o=n[l],a=o.projectionDelta;const{visualElement:u}=o.options;u&&u.props.style&&u.props.style.display==="contents"||(s&&o.options.layoutScroll&&o.scroll&&o!==o.root&&(Z(e.x,-o.scroll.offset.x),Z(e.y,-o.scroll.offset.y)),a&&(t.x*=a.x.scale,t.y*=a.y.scale,ia(e,a)),s&&de(o.latestValues)&&Ye(e,o.latestValues,(r=o.layout)==null?void 0:r.layoutBox))}t.x<rs&&t.x>os&&(t.x=1),t.y<rs&&t.y>os&&(t.y=1)}function Z(e,t){e.min+=t,e.max+=t}function ls(e,t,n,s,i=.5){const o=C(e.min,e.max,i);Xt(e,t,n,o,s)}function cs(e,t){return typeof e=="string"?parseFloat(e)/100*(t.max-t.min):e}function Ye(e,t,n){const s=n??e;ls(e.x,cs(t.x,s.x),t.scaleX,t.scale,t.originX),ls(e.y,cs(t.y,s.y),t.scaleY,t.scale,t.originY)}function aa(e,t){return na(Cl(e.getBoundingClientRect(),t))}function Pl(e,t,n){const s=aa(e,n),{scroll:i}=t;return i&&(Z(s.x,i.offset.x),Z(s.y,i.offset.y)),s}const Ml={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},Rl=ke.length;function Ll(e,t,n){let s="",i=!0;for(let o=0;o<Rl;o++){const a=ke[o],r=e[a];if(r===void 0)continue;let l=!0;if(typeof r=="number")l=r===(a.startsWith("scale")?1:0);else{const u=parseFloat(r);l=a.startsWith("scale")?u===1:u===0}if(!l||n){const u=$i(r,bn[a]);if(!l){i=!1;const c=Ml[a]||a;s+=`${c}(${u}) `}n&&(t[a]=u)}}return s=s.trim(),n?s=n(t,i?"":s):i&&(s="none"),s}function In(e,t,n){const{style:s,vars:i,transformOrigin:o}=e;let a=!1,r=!1;for(const l in t){const u=t[l];if(qe.has(l)){a=!0;continue}else if(fi(l)){i[l]=u;continue}else{const c=$i(u,bn[l]);l.startsWith("origin")?(r=!0,o[l]=c):s[l]=c}}if(t.transform||(a||n?s.transform=Ll(t,e.transform,n):s.transform&&(s.transform="none")),r){const{originX:l="50%",originY:u="50%",originZ:c=0}=o;s.transformOrigin=`${l} ${u} ${c}`}}function oa(e,{style:t,vars:n},s,i){const o=e.style;let a;for(a in t)o[a]=t[a];i==null||i.applyProjectionStyles(o,s);for(a in n)o.setProperty(a,n[a])}function us(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}const Ce={correct:(e,t)=>{if(!t.target)return e;if(typeof e=="string")if(x.test(e))e=parseFloat(e);else return e;const n=us(e,t.target.x),s=us(e,t.target.y);return`${n}% ${s}%`}},jl={correct:(e,{treeScale:t,projectionDelta:n})=>{const s=e,i=K.parse(e);if(i.length>5)return s;const o=K.createTransformer(e),a=typeof i[0]!="number"?1:0,r=n.x.scale*t.x,l=n.y.scale*t.y;i[0+a]/=r,i[1+a]/=l;const u=C(r,l,.5);return typeof i[2+a]=="number"&&(i[2+a]/=u),typeof i[3+a]=="number"&&(i[3+a]/=u),o(i)}},Yt={borderRadius:{...Ce,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:Ce,borderTopRightRadius:Ce,borderBottomLeftRadius:Ce,borderBottomRightRadius:Ce,boxShadow:jl};function ra(e,{layout:t,layoutId:n}){return qe.has(e)||e.startsWith("origin")||(t||n!==void 0)&&(!!Yt[e]||e==="opacity")}function kn(e,t,n){var a;const s=e.style,i=t==null?void 0:t.style,o={};if(!s)return o;for(const r in s)(N(s[r])||i&&N(i[r])||ra(r,e)||((a=n==null?void 0:n.getValue(r))==null?void 0:a.liveStyle)!==void 0)&&(o[r]=s[r]);return o}function Dl(e){return window.getComputedStyle(e)}class Vl extends ta{constructor(){super(...arguments),this.type="html",this.renderInstance=oa}readValueFromInstance(t,n){var s;if(qe.has(n))return(s=this.projection)!=null&&s.isProjecting?Nt(n):er(t,n);{const i=Dl(t),o=(fi(n)?i.getPropertyValue(n):i[n])||0;return typeof o=="string"?o.trim():o}}measureInstanceViewportBox(t,{transformPagePoint:n}){return aa(t,n)}build(t,n,s){In(t,n,s.transformTemplate)}scrapeMotionValuesFromProps(t,n,s){return kn(t,n,s)}}const Nl={offset:"stroke-dashoffset",array:"stroke-dasharray"},Ol={offset:"strokeDashoffset",array:"strokeDasharray"};function Fl(e,t,n=1,s=0,i=!0){e.pathLength=1;const o=i?Nl:Ol;e[o.offset]=`${-s}`,e[o.array]=`${t} ${n}`}const Bl=["offsetDistance","offsetPath","offsetRotate","offsetAnchor"];function la(e,{attrX:t,attrY:n,attrScale:s,pathLength:i,pathSpacing:o=1,pathOffset:a=0,...r},l,u,c){if(In(e,r,u),l){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};const{attrs:d,style:h}=e;d.transform&&(h.transform=d.transform,delete d.transform),(h.transform||d.transformOrigin)&&(h.transformOrigin=d.transformOrigin??"50% 50%",delete d.transformOrigin),h.transform&&(h.transformBox=(c==null?void 0:c.transformBox)??"fill-box",delete d.transformBox);for(const p of Bl)d[p]!==void 0&&(h[p]=d[p],delete d[p]);t!==void 0&&(d.x=t),n!==void 0&&(d.y=n),s!==void 0&&(d.scale=s),i!==void 0&&Fl(d,i,o,a,!1)}const ca=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]),ua=e=>typeof e=="string"&&e.toLowerCase()==="svg";function Wl(e,t,n,s){oa(e,t,void 0,s);for(const i in t.attrs)e.setAttribute(ca.has(i)?i:yn(i),t.attrs[i])}function da(e,t,n){const s=kn(e,t,n);for(const i in e)if(N(e[i])||N(t[i])){const o=ke.indexOf(i)!==-1?"attr"+i.charAt(0).toUpperCase()+i.substring(1):i;s[o]=e[i]}return s}class Gl extends ta{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=L}getBaseTargetFromProps(t,n){return t[n]}readValueFromInstance(t,n){if(qe.has(n)){const s=zi(n);return s&&s.default||0}return n=ca.has(n)?n:yn(n),t.getAttribute(n)}scrapeMotionValuesFromProps(t,n,s){return da(t,n,s)}build(t,n,s){la(t,n,this.isSVGTag,s.transformTemplate,s.style)}renderInstance(t,n,s,i){Wl(t,n,s,i)}mount(t){this.isSVGTag=ua(t.tagName),super.mount(t)}}const Ul=Tn.length;function ha(e){if(!e)return;if(!e.isControllingVariants){const n=e.parent?ha(e.parent)||{}:{};return e.props.initial!==void 0&&(n.initial=e.props.initial),n}const t={};for(let n=0;n<Ul;n++){const s=Tn[n],i=e.props[s];(Ve(i)||i===!1)&&(t[s]=i)}return t}function pa(e,t){if(!Array.isArray(t))return!1;const n=t.length;if(n!==e.length)return!1;for(let s=0;s<n;s++)if(t[s]!==e[s])return!1;return!0}const zl=[...An].reverse(),Hl=An.length;function _l(e){return t=>Promise.all(t.map(({animation:n,options:s})=>Gr(e,n,s)))}function $l(e){let t=_l(e),n=ds(),s=!0,i=!1;const o=u=>(c,d)=>{var p;const h=fe(e,d,u==="exit"?(p=e.presenceContext)==null?void 0:p.custom:void 0);if(h){const{transition:f,transitionEnd:y,...g}=h;c={...c,...g,...y}}return c};function a(u){t=u(e)}function r(u){const{props:c}=e,d=ha(e.parent)||{},h=[],p=new Set;let f={},y=1/0;for(let b=0;b<Hl;b++){const w=zl[b],v=n[w],A=c[w]!==void 0?c[w]:d[w],I=Ve(A),R=w===u?v.isActive:null;R===!1&&(y=b);let O=A===d[w]&&A!==c[w]&&I;if(O&&(s||i)&&e.manuallyAnimateOnMount&&(O=!1),v.protectedKeys={...f},!v.isActive&&R===null||!A&&!v.prevProp||dt(A)||typeof A=="boolean")continue;if(w==="exit"&&v.isActive&&R!==!0){v.prevResolvedValues&&(f={...f,...v.prevResolvedValues});continue}const q=Kl(v.prevProp,A);let j=q||w===u&&v.isActive&&!O&&I||b>y&&I,k=!1;const P=Array.isArray(A)?A:[A];let W=P.reduce(o(w),{});R===!1&&(W={});const{prevResolvedValues:le={}}=v,J={...le,...W},te=D=>{j=!0,p.has(D)&&(k=!0,p.delete(D)),v.needsAnimating[D]=!0;const U=e.getValue(D);U&&(U.liveStyle=!1)};for(const D in J){const U=W[D],ce=le[D];if(f.hasOwnProperty(D))continue;let ge=!1;Ut(U)&&Ut(ce)?ge=!pa(U,ce):ge=U!==ce,ge?U!=null?te(D):p.add(D):U!==void 0&&p.has(D)?te(D):v.protectedKeys[D]=!0}v.prevProp=A,v.prevResolvedValues=W,v.isActive&&(f={...f,...W}),(s||i)&&e.blockInitialAnimation&&(j=!1);const X=O&&q;j&&(!X||k)&&h.push(...P.map(D=>{const U={type:w};if(typeof D=="string"&&(s||i)&&!X&&e.manuallyAnimateOnMount&&e.parent){const{parent:ce}=e,ge=fe(ce,D);if(ce.enteringChildren&&ge){const{delayChildren:Na}=ge.transition||{};U.delay=Di(ce.enteringChildren,e,Na)}}return{animation:D,options:U}}))}if(p.size){const b={};if(typeof c.initial!="boolean"){const w=fe(e,Array.isArray(c.initial)?c.initial[0]:c.initial);w&&w.transition&&(b.transition=w.transition)}p.forEach(w=>{const v=e.getBaseTarget(w),A=e.getValue(w);A&&(A.liveStyle=!0),b[w]=v??null}),h.push({animation:b})}let g=!!h.length;return s&&(c.initial===!1||c.initial===c.animate)&&!e.manuallyAnimateOnMount&&(g=!1),s=!1,i=!1,g?t(h):Promise.resolve()}function l(u,c){var h;if(n[u].isActive===c)return Promise.resolve();(h=e.variantChildren)==null||h.forEach(p=>{var f;return(f=p.animationState)==null?void 0:f.setActive(u,c)}),n[u].isActive=c;const d=r(u);for(const p in n)n[p].protectedKeys={};return d}return{animateChanges:r,setActive:l,setAnimateFunction:a,getState:()=>n,reset:()=>{n=ds(),i=!0}}}function Kl(e,t){return typeof t=="string"?t!==e:Array.isArray(t)?!pa(t,e):!1}function ue(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function ds(){return{animate:ue(!0),whileInView:ue(),whileHover:ue(),whileTap:ue(),whileDrag:ue(),whileFocus:ue(),exit:ue()}}function Zt(e,t){e.min=t.min,e.max=t.max}function _(e,t){Zt(e.x,t.x),Zt(e.y,t.y)}function hs(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t.originPoint,e.origin=t.origin}const ma=1e-4,Jl=1-ma,Xl=1+ma,fa=.01,Yl=0-fa,Zl=0+fa;function B(e){return e.max-e.min}function Ql(e,t,n){return Math.abs(e-t)<=n}function ps(e,t,n,s=.5){e.origin=s,e.originPoint=C(t.min,t.max,e.origin),e.scale=B(n)/B(t),e.translate=C(n.min,n.max,e.origin)-e.originPoint,(e.scale>=Jl&&e.scale<=Xl||isNaN(e.scale))&&(e.scale=1),(e.translate>=Yl&&e.translate<=Zl||isNaN(e.translate))&&(e.translate=0)}function Re(e,t,n,s){ps(e.x,t.x,n.x,s?s.originX:void 0),ps(e.y,t.y,n.y,s?s.originY:void 0)}function ms(e,t,n,s=0){const i=s?C(n.min,n.max,s):n.min;e.min=i+t.min,e.max=e.min+B(t)}function ec(e,t,n,s){ms(e.x,t.x,n.x,s==null?void 0:s.x),ms(e.y,t.y,n.y,s==null?void 0:s.y)}function fs(e,t,n,s=0){const i=s?C(n.min,n.max,s):n.min;e.min=t.min-i,e.max=e.min+B(t)}function rt(e,t,n,s){fs(e.x,t.x,n.x,s==null?void 0:s.x),fs(e.y,t.y,n.y,s==null?void 0:s.y)}function gs(e,t,n,s,i){return e-=t,e=ot(e,1/n,s),i!==void 0&&(e=ot(e,1/i,s)),e}function tc(e,t=0,n=1,s=.5,i,o=e,a=e){if(Q.test(t)&&(t=parseFloat(t),t=C(a.min,a.max,t/100)-a.min),typeof t!="number")return;let r=C(o.min,o.max,s);e===o&&(r-=t),e.min=gs(e.min,t,n,r,i),e.max=gs(e.max,t,n,r,i)}function ys(e,t,[n,s,i],o,a){tc(e,t[n],t[s],t[i],t.scale,o,a)}const nc=["x","scaleX","originX"],sc=["y","scaleY","originY"];function bs(e,t,n,s){ys(e.x,t,nc,n?n.x:void 0,s?s.x:void 0),ys(e.y,t,sc,n?n.y:void 0,s?s.y:void 0)}function vs(e){return e.translate===0&&e.scale===1}function ga(e){return vs(e.x)&&vs(e.y)}function ws(e,t){return e.min===t.min&&e.max===t.max}function ic(e,t){return ws(e.x,t.x)&&ws(e.y,t.y)}function xs(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.round(e.max)===Math.round(t.max)}function ya(e,t){return xs(e.x,t.x)&&xs(e.y,t.y)}function As(e){return B(e.x)/B(e.y)}function Ts(e,t){return e.translate===t.translate&&e.scale===t.scale&&e.originPoint===t.originPoint}function Y(e){return[e("x"),e("y")]}function ac(e,t,n){let s="";const i=e.x.translate/t.x,o=e.y.translate/t.y,a=(n==null?void 0:n.z)||0;if((i||o||a)&&(s=`translate3d(${i}px, ${o}px, ${a}px) `),(t.x!==1||t.y!==1)&&(s+=`scale(${1/t.x}, ${1/t.y}) `),n){const{transformPerspective:u,rotate:c,rotateX:d,rotateY:h,skewX:p,skewY:f}=n;u&&(s=`perspective(${u}px) ${s}`),c&&(s+=`rotate(${c}deg) `),d&&(s+=`rotateX(${d}deg) `),h&&(s+=`rotateY(${h}deg) `),p&&(s+=`skewX(${p}deg) `),f&&(s+=`skewY(${f}deg) `)}const r=e.x.scale*t.x,l=e.y.scale*t.y;return(r!==1||l!==1)&&(s+=`scale(${r}, ${l})`),s||"none"}const ba=["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"],oc=ba.length,Is=e=>typeof e=="string"?parseFloat(e):e,ks=e=>typeof e=="number"||x.test(e);function rc(e,t,n,s,i,o){i?(e.opacity=C(0,n.opacity??1,lc(s)),e.opacityExit=C(t.opacity??1,0,cc(s))):o&&(e.opacity=C(t.opacity??1,n.opacity??1,s));for(let a=0;a<oc;a++){const r=ba[a];let l=qs(t,r),u=qs(n,r);if(l===void 0&&u===void 0)continue;l||(l=0),u||(u=0),l===0||u===0||ks(l)===ks(u)?(e[r]=Math.max(C(Is(l),Is(u),s),0),(Q.test(u)||Q.test(l))&&(e[r]+="%")):e[r]=u}(t.rotate||n.rotate)&&(e.rotate=C(t.rotate||0,n.rotate||0,s))}function qs(e,t){return e[t]!==void 0?e[t]:e.borderRadius}const lc=va(0,.5,ci),cc=va(.5,.95,H);function va(e,t,n){return s=>s<e?0:s>t?1:n(je(e,t,s))}function uc(e,t,n){const s=N(e)?e:Te(e);return s.start(fn("",s,t,n)),s.animation}function Ne(e,t,n,s={passive:!0}){return e.addEventListener(t,n,s),()=>e.removeEventListener(t,n)}const dc=(e,t)=>e.depth-t.depth;class hc{constructor(){this.children=[],this.isDirty=!1}add(t){nn(this.children,t),this.isDirty=!0}remove(t){et(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort(dc),this.isDirty=!1,this.children.forEach(t)}}function pc(e,t){const n=F.now(),s=({timestamp:i})=>{const o=i-n;o>=t&&(oe(s),e(o-t))};return S.setup(s,!0),()=>oe(s)}function Ze(e){return N(e)?e.get():e}class mc{constructor(){this.members=[]}add(t){nn(this.members,t);for(let n=this.members.length-1;n>=0;n--){const s=this.members[n];if(s===t||s===this.lead||s===this.prevLead)continue;const i=s.instance;(!i||i.isConnected===!1)&&!s.snapshot&&(et(this.members,s),s.unmount())}t.scheduleRender()}remove(t){if(et(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const n=this.members[this.members.length-1];n&&this.promote(n)}}relegate(t){var n;for(let s=this.members.indexOf(t)-1;s>=0;s--){const i=this.members[s];if(i.isPresent!==!1&&((n=i.instance)==null?void 0:n.isConnected)!==!1)return this.promote(i),!0}return!1}promote(t,n){var i;const s=this.lead;if(t!==s&&(this.prevLead=s,this.lead=t,t.show(),s)){s.updateSnapshot(),t.scheduleRender();const{layoutDependency:o}=s.options,{layoutDependency:a}=t.options;(o===void 0||o!==a)&&(t.resumeFrom=s,n&&(s.preserveOpacity=!0),s.snapshot&&(t.snapshot=s.snapshot,t.snapshot.latestValues=s.animationValues||s.latestValues),(i=t.root)!=null&&i.isUpdating&&(t.isLayoutDirty=!0)),t.options.crossfade===!1&&s.hide()}}exitAnimationComplete(){this.members.forEach(t=>{var n,s,i,o,a;(s=(n=t.options).onExitComplete)==null||s.call(n),(a=(i=t.resumingFrom)==null?void 0:(o=i.options).onExitComplete)==null||a.call(o)})}scheduleRender(){this.members.forEach(t=>t.instance&&t.scheduleRender(!1))}removeLeadSnapshot(){var t;(t=this.lead)!=null&&t.snapshot&&(this.lead.snapshot=void 0)}}const Qe={hasAnimatedSinceResize:!0,hasEverUpdated:!1},Tt=["","X","Y","Z"],fc=1e3;let gc=0;function It(e,t,n,s){const{latestValues:i}=t;i[e]&&(n[e]=i[e],t.setStaticValue(e,0),s&&(s[e]=0))}function wa(e){if(e.hasCheckedOptimisedAppear=!0,e.root===e)return;const{visualElement:t}=e.options;if(!t)return;const n=Bi(t);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:i,layoutId:o}=e.options;window.MotionCancelOptimisedAnimation(n,"transform",S,!(i||o))}const{parent:s}=e;s&&!s.hasCheckedOptimisedAppear&&wa(s)}function xa({attachResizeListener:e,defaultParent:t,measureScroll:n,checkIsScrollRoot:s,resetTransform:i}){return class{constructor(a={},r=t==null?void 0:t()){this.id=gc++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.layoutVersion=0,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(vc),this.nodes.forEach(kc),this.nodes.forEach(qc),this.nodes.forEach(wc)},this.resolvedRelativeTargetAt=0,this.linkedParentVersion=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=a,this.root=r?r.root||r:this,this.path=r?[...r.path,r]:[],this.parent=r,this.depth=r?r.depth+1:0;for(let l=0;l<this.path.length;l++)this.path[l].shouldResetTransform=!0;this.root===this&&(this.nodes=new hc)}addEventListener(a,r){return this.eventHandlers.has(a)||this.eventHandlers.set(a,new sn),this.eventHandlers.get(a).add(r)}notifyListeners(a,...r){const l=this.eventHandlers.get(a);l&&l.notify(...r)}hasListeners(a){return this.eventHandlers.has(a)}mount(a){if(this.instance)return;this.isSVG=xn(a)&&!bl(a),this.instance=a;const{layoutId:r,layout:l,visualElement:u}=this.options;if(u&&!u.current&&u.mount(a),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),this.root.hasTreeAnimated&&(l||r)&&(this.isLayoutDirty=!0),e){let c,d=0;const h=()=>this.root.updateBlockedByResize=!1;S.read(()=>{d=window.innerWidth}),e(a,()=>{const p=window.innerWidth;p!==d&&(d=p,this.root.updateBlockedByResize=!0,c&&c(),c=pc(h,250),Qe.hasAnimatedSinceResize&&(Qe.hasAnimatedSinceResize=!1,this.nodes.forEach(Es)))})}r&&this.root.registerSharedNode(r,this),this.options.animate!==!1&&u&&(r||l)&&this.addEventListener("didUpdate",({delta:c,hasLayoutChanged:d,hasRelativeLayoutChanged:h,layout:p})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const f=this.options.transition||u.getDefaultTransition()||Mc,{onLayoutAnimationStart:y,onLayoutAnimationComplete:g}=u.getProps(),b=!this.targetLayout||!ya(this.targetLayout,p),w=!d&&h;if(this.options.layoutRoot||this.resumeFrom||w||d&&(b||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const v={...mn(f,"layout"),onPlay:y,onComplete:g};(u.shouldReduceMotion||this.options.layoutRoot)&&(v.delay=0,v.type=!1),this.startAnimation(v),this.setAnimationOrigin(c,w)}else d||Es(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=p})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const a=this.getStack();a&&a.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),oe(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(Sc),this.animationId++)}getTransformTemplate(){const{visualElement:a}=this.options;return a&&a.getProps().transformTemplate}willUpdate(a=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&wa(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let c=0;c<this.path.length;c++){const d=this.path[c];d.shouldResetTransform=!0,(typeof d.latestValues.x=="string"||typeof d.latestValues.y=="string")&&(d.isLayoutDirty=!0),d.updateScroll("snapshot"),d.options.layoutRoot&&d.willUpdate(!1)}const{layoutId:r,layout:l}=this.options;if(r===void 0&&!l)return;const u=this.getTransformTemplate();this.prevTransformTemplateValue=u?u(this.latestValues,""):void 0,this.updateSnapshot(),a&&this.notifyListeners("willUpdate")}update(){if(this.updateScheduled=!1,this.isUpdateBlocked()){const l=this.updateBlockedByResize;this.unblockUpdate(),this.updateBlockedByResize=!1,this.clearAllSnapshots(),l&&this.nodes.forEach(Ac),this.nodes.forEach(Ss);return}if(this.animationId<=this.animationCommitId){this.nodes.forEach(Cs);return}this.animationCommitId=this.animationId,this.isUpdating?(this.isUpdating=!1,this.nodes.forEach(Tc),this.nodes.forEach(Ic),this.nodes.forEach(yc),this.nodes.forEach(bc)):this.nodes.forEach(Cs),this.clearAllSnapshots();const r=F.now();V.delta=ee(0,1e3/60,r-V.timestamp),V.timestamp=r,V.isProcessing=!0,ft.update.process(V),ft.preRender.process(V),ft.render.process(V),V.isProcessing=!1}didUpdate(){this.updateScheduled||(this.updateScheduled=!0,vn.read(this.scheduleUpdate))}clearAllSnapshots(){this.nodes.forEach(xc),this.sharedNodes.forEach(Cc)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,S.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){S.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!B(this.snapshot.measuredBox.x)&&!B(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let l=0;l<this.path.length;l++)this.path[l].updateScroll();const a=this.layout;this.layout=this.measure(!1),this.layoutVersion++,this.layoutCorrected||(this.layoutCorrected=L()),this.isLayoutDirty=!1,this.projectionDelta=void 0,this.notifyListeners("measure",this.layout.layoutBox);const{visualElement:r}=this.options;r&&r.notify("LayoutMeasure",this.layout.layoutBox,a?a.layoutBox:void 0)}updateScroll(a="measure"){let r=!!(this.options.layoutScroll&&this.instance);if(this.scroll&&this.scroll.animationId===this.root.animationId&&this.scroll.phase===a&&(r=!1),r&&this.instance){const l=s(this.instance);this.scroll={animationId:this.root.animationId,phase:a,isRoot:l,offset:n(this.instance),wasRoot:this.scroll?this.scroll.isRoot:l}}}resetTransform(){if(!i)return;const a=this.isLayoutDirty||this.shouldResetTransform||this.options.alwaysMeasureLayout,r=this.projectionDelta&&!ga(this.projectionDelta),l=this.getTransformTemplate(),u=l?l(this.latestValues,""):void 0,c=u!==this.prevTransformTemplateValue;a&&this.instance&&(r||de(this.latestValues)||c)&&(i(this.instance,u),this.shouldResetTransform=!1,this.scheduleRender())}measure(a=!0){const r=this.measurePageBox();let l=this.removeElementScroll(r);return a&&(l=this.removeTransform(l)),Rc(l),{animationId:this.root.animationId,measuredBox:r,layoutBox:l,latestValues:{},source:this.id}}measurePageBox(){var u;const{visualElement:a}=this.options;if(!a)return L();const r=a.measureViewportBox();if(!(((u=this.scroll)==null?void 0:u.wasRoot)||this.path.some(Lc))){const{scroll:c}=this.root;c&&(Z(r.x,c.offset.x),Z(r.y,c.offset.y))}return r}removeElementScroll(a){var l;const r=L();if(_(r,a),(l=this.scroll)!=null&&l.wasRoot)return r;for(let u=0;u<this.path.length;u++){const c=this.path[u],{scroll:d,options:h}=c;c!==this.root&&d&&h.layoutScroll&&(d.wasRoot&&_(r,a),Z(r.x,d.offset.x),Z(r.y,d.offset.y))}return r}applyTransform(a,r=!1,l){var c,d;const u=l||L();_(u,a);for(let h=0;h<this.path.length;h++){const p=this.path[h];!r&&p.options.layoutScroll&&p.scroll&&p!==p.root&&(Z(u.x,-p.scroll.offset.x),Z(u.y,-p.scroll.offset.y)),de(p.latestValues)&&Ye(u,p.latestValues,(c=p.layout)==null?void 0:c.layoutBox)}return de(this.latestValues)&&Ye(u,this.latestValues,(d=this.layout)==null?void 0:d.layoutBox),u}removeTransform(a){var l;const r=L();_(r,a);for(let u=0;u<this.path.length;u++){const c=this.path[u];if(!de(c.latestValues))continue;let d;c.instance&&(Jt(c.latestValues)&&c.updateSnapshot(),d=L(),_(d,c.measurePageBox())),bs(r,c.latestValues,(l=c.snapshot)==null?void 0:l.layoutBox,d)}return de(this.latestValues)&&bs(r,this.latestValues),r}setTargetDelta(a){this.targetDelta=a,this.root.scheduleUpdateProjection(),this.isProjectionDirty=!0}setOptions(a){this.options={...this.options,...a,crossfade:a.crossfade!==void 0?a.crossfade:!0}}clearMeasurements(){this.scroll=void 0,this.layout=void 0,this.snapshot=void 0,this.prevTransformTemplateValue=void 0,this.targetDelta=void 0,this.target=void 0,this.isLayoutDirty=!1}forceRelativeParentToResolveTarget(){this.relativeParent&&this.relativeParent.resolvedRelativeTargetAt!==V.timestamp&&this.relativeParent.resolveTargetDelta(!0)}resolveTargetDelta(a=!1){var p;const r=this.getLead();this.isProjectionDirty||(this.isProjectionDirty=r.isProjectionDirty),this.isTransformDirty||(this.isTransformDirty=r.isTransformDirty),this.isSharedProjectionDirty||(this.isSharedProjectionDirty=r.isSharedProjectionDirty);const l=!!this.resumingFrom||this!==r;if(!(a||l&&this.isSharedProjectionDirty||this.isProjectionDirty||(p=this.parent)!=null&&p.isProjectionDirty||this.attemptToResolveRelativeTarget||this.root.updateBlockedByResize))return;const{layout:c,layoutId:d}=this.options;if(!this.layout||!(c||d))return;this.resolvedRelativeTargetAt=V.timestamp;const h=this.getClosestProjectingParent();h&&this.linkedParentVersion!==h.layoutVersion&&!h.options.layoutRoot&&this.removeRelativeTarget(),!this.targetDelta&&!this.relativeTarget&&(this.options.layoutAnchor!==!1&&h&&h.layout?this.createRelativeTarget(h,this.layout.layoutBox,h.layout.layoutBox):this.removeRelativeTarget()),!(!this.relativeTarget&&!this.targetDelta)&&(this.target||(this.target=L(),this.targetWithTransforms=L()),this.relativeTarget&&this.relativeTargetOrigin&&this.relativeParent&&this.relativeParent.target?(this.forceRelativeParentToResolveTarget(),ec(this.target,this.relativeTarget,this.relativeParent.target,this.options.layoutAnchor||void 0)):this.targetDelta?(this.resumingFrom?this.applyTransform(this.layout.layoutBox,!1,this.target):_(this.target,this.layout.layoutBox),ia(this.target,this.targetDelta)):_(this.target,this.layout.layoutBox),this.attemptToResolveRelativeTarget&&(this.attemptToResolveRelativeTarget=!1,this.options.layoutAnchor!==!1&&h&&!!h.resumingFrom==!!this.resumingFrom&&!h.options.layoutScroll&&h.target&&this.animationProgress!==1?this.createRelativeTarget(h,this.target,h.target):this.relativeParent=this.relativeTarget=void 0))}getClosestProjectingParent(){if(!(!this.parent||Jt(this.parent.latestValues)||sa(this.parent.latestValues)))return this.parent.isProjecting()?this.parent:this.parent.getClosestProjectingParent()}isProjecting(){return!!((this.relativeTarget||this.targetDelta||this.options.layoutRoot)&&this.layout)}createRelativeTarget(a,r,l){this.relativeParent=a,this.linkedParentVersion=a.layoutVersion,this.forceRelativeParentToResolveTarget(),this.relativeTarget=L(),this.relativeTargetOrigin=L(),rt(this.relativeTargetOrigin,r,l,this.options.layoutAnchor||void 0),_(this.relativeTarget,this.relativeTargetOrigin)}removeRelativeTarget(){this.relativeParent=this.relativeTarget=void 0}calcProjection(){var f;const a=this.getLead(),r=!!this.resumingFrom||this!==a;let l=!0;if((this.isProjectionDirty||(f=this.parent)!=null&&f.isProjectionDirty)&&
vendor: 5,322 bytes, line 11
11(l=!1),r&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(l=!1),this.resolvedRelativeTargetAt===V.timestamp&&(l=!1),l)return;const{layout:u,layoutId:c}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(u||c))return;_(this.layoutCorrected,this.layout.layoutBox);const d=this.treeScale.x,h=this.treeScale.y;El(this.layoutCorrected,this.treeScale,this.path,r),a.layout&&!a.target&&(this.treeScale.x!==1||this.treeScale.y!==1)&&(a.target=a.layout.layoutBox,a.targetWithTransforms=L());const{target:p}=a;if(!p){this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender());return}!this.projectionDelta||!this.prevProjectionDelta?this.createProjectionDeltas():(hs(this.prevProjectionDelta.x,this.projectionDelta.x),hs(this.prevProjectionDelta.y,this.projectionDelta.y)),Re(this.projectionDelta,this.layoutCorrected,p,this.latestValues),(this.treeScale.x!==d||this.treeScale.y!==h||!Ts(this.projectionDelta.x,this.prevProjectionDelta.x)||!Ts(this.projectionDelta.y,this.prevProjectionDelta.y))&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",p))}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(a=!0){var r;if((r=this.options.visualElement)==null||r.scheduleRender(),a){const l=this.getStack();l&&l.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta=we(),this.projectionDelta=we(),this.projectionDeltaWithTransform=we()}setAnimationOrigin(a,r=!1){const l=this.snapshot,u=l?l.latestValues:{},c={...this.latestValues},d=we();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!r;const h=L(),p=l?l.source:void 0,f=this.layout?this.layout.source:void 0,y=p!==f,g=this.getStack(),b=!g||g.members.length<=1,w=!!(y&&!b&&this.options.crossfade===!0&&!this.path.some(Pc));this.animationProgress=0;let v;this.mixTargetDelta=A=>{const I=A/1e3;Ps(d.x,a.x,I),Ps(d.y,a.y,I),this.setTargetDelta(d),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(rt(h,this.layout.layoutBox,this.relativeParent.layout.layoutBox,this.options.layoutAnchor||void 0),Ec(this.relativeTarget,this.relativeTargetOrigin,h,I),v&&ic(this.relativeTarget,v)&&(this.isProjectionDirty=!1),v||(v=L()),_(v,this.relativeTarget)),y&&(this.animationValues=c,rc(c,u,this.latestValues,I,w,b)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=I},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(a){var r,l,u;this.notifyListeners("animationStart"),(r=this.currentAnimation)==null||r.stop(),(u=(l=this.resumingFrom)==null?void 0:l.currentAnimation)==null||u.stop(),this.pendingAnimation&&(oe(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=S.update(()=>{Qe.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=Te(0)),this.motionValue.jump(0,!1),this.currentAnimation=uc(this.motionValue,[0,1e3],{...a,velocity:0,isSync:!0,onUpdate:c=>{this.mixTargetDelta(c),a.onUpdate&&a.onUpdate(c)},onStop:()=>{},onComplete:()=>{a.onComplete&&a.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const a=this.getStack();a&&a.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(fc),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const a=this.getLead();let{targetWithTransforms:r,target:l,layout:u,latestValues:c}=a;if(!(!r||!l||!u)){if(this!==a&&this.layout&&u&&Aa(this.options.animationType,this.layout.layoutBox,u.layoutBox)){l=this.target||L();const d=B(this.layout.layoutBox.x);l.x.min=a.target.x.min,l.x.max=l.x.min+d;const h=B(this.layout.layoutBox.y);l.y.min=a.target.y.min,l.y.max=l.y.min+h}_(r,l),Ye(r,c),Re(this.projectionDeltaWithTransform,this.layoutCorrected,r,c)}}registerSharedNode(a,r){this.sharedNodes.has(a)||this.sharedNodes.set(a,new mc),this.sharedNodes.get(a).add(r);const u=r.options.initialPromotionConfig;r.promote({transition:u?u.transition:void 0,preserveFollowOpacity:u&&u.shouldPreserveFollowOpacity?u.shouldPreserveFollowOpacity(r):void 0})}isLead(){const a=this.getStack();return a?a.lead===this:!0}getLead(){var r;const{layoutId:a}=this.options;return a?((r=this.getStack())==null?void 0:r.lead)||this:this}getPrevLead(){var r;const{layoutId:a}=this.options;return a?(r=this.getStack())==null?void 0:r.prevLead:void 0}getStack(){const{layoutId:a}=this.options;if(a)return this.root.sharedNodes.get(a)}promote({needsReset:a,transition:r,preserveFollowOpacity:l}={}){const u=this.getStack();u&&u.promote(this,l),a&&(this.projectionDelta=void 0,this.needsReset=!0),r&&this.setOptions({transition:r})}relegate(){const a=this.getStack();return a?a.relegate(this):!1}
vendor: 8,866 bytes, line 11
11resetSkewAndRotation(){const{visualElement:a}=this.options;if(!a)return;let r=!1;const{latestValues:l}=a;if((l.z||l.rotate||l.rotateX||l.rotateY||l.rotateZ||l.skewX||l.skewY)&&(r=!0),!r)return;const u={};l.z&&It("z",a,u,this.animationValues);for(let c=0;c<Tt.length;c++)It(`rotate${Tt[c]}`,a,u,this.animationValues),It(`skew${Tt[c]}`,a,u,this.animationValues);a.render();for(const c in u)a.setStaticValue(c,u[c]),this.animationValues&&(this.animationValues[c]=u[c]);a.scheduleRender()}applyProjectionStyles(a,r){if(!this.instance||this.isSVG)return;if(!this.isVisible){a.visibility="hidden";return}const l=this.getTransformTemplate();if(this.needsReset){this.needsReset=!1,a.visibility="",a.opacity="",a.pointerEvents=Ze(r==null?void 0:r.pointerEvents)||"",a.transform=l?l(this.latestValues,""):"none";return}const u=this.getLead();if(!this.projectionDelta||!this.layout||!u.target){this.options.layoutId&&(a.opacity=this.latestValues.opacity!==void 0?this.latestValues.opacity:1,a.pointerEvents=Ze(r==null?void 0:r.pointerEvents)||""),this.hasProjected&&!de(this.latestValues)&&(a.transform=l?l({},""):"none",this.hasProjected=!1);return}a.visibility="";const c=u.animationValues||u.latestValues;this.applyTransformsToTarget();let d=ac(this.projectionDeltaWithTransform,this.treeScale,c);l&&(d=l(c,d)),a.transform=d;const{x:h,y:p}=this.projectionDelta;a.transformOrigin=`${h.origin*100}% ${p.origin*100}% 0`,u.animationValues?a.opacity=u===this?c.opacity??this.latestValues.opacity??1:this.preserveOpacity?this.latestValues.opacity:c.opacityExit:a.opacity=u===this?c.opacity!==void 0?c.opacity:"":c.opacityExit!==void 0?c.opacityExit:0;for(const f in Yt){if(c[f]===void 0)continue;const{correct:y,applyTo:g,isCSSVariable:b}=Yt[f],w=d==="none"?c[f]:y(c[f],u);if(g){const v=g.length;for(let A=0;A<v;A++)a[g[A]]=w}else b?this.options.visualElement.renderState.vars[f]=w:a[f]=w}this.options.layoutId&&(a.pointerEvents=u===this?Ze(r==null?void 0:r.pointerEvents)||"":"none")}clearSnapshot(){this.resumeFrom=this.snapshot=void 0}resetTree(){this.root.nodes.forEach(a=>{var r;return(r=a.currentAnimation)==null?void 0:r.stop()}),this.root.nodes.forEach(Ss),this.root.sharedNodes.clear()}}}function yc(e){e.updateLayout()}function bc(e){var n;const t=((n=e.resumeFrom)==null?void 0:n.snapshot)||e.snapshot;if(e.isLead()&&e.layout&&t&&e.hasListeners("didUpdate")){const{layoutBox:s,measuredBox:i}=e.layout,{animationType:o}=e.options,a=t.source!==e.layout.source;if(o==="size")Y(d=>{const h=a?t.measuredBox[d]:t.layoutBox[d],p=B(h);h.min=s[d].min,h.max=h.min+p});else if(o==="x"||o==="y"){const d=o==="x"?"y":"x";Zt(a?t.measuredBox[d]:t.layoutBox[d],s[d])}else Aa(o,t.layoutBox,s)&&Y(d=>{const h=a?t.measuredBox[d]:t.layoutBox[d],p=B(s[d]);h.max=h.min+p,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[d].max=e.relativeTarget[d].min+p)});const r=we();Re(r,s,t.layoutBox);const l=we();a?Re(l,e.applyTransform(i,!0),t.measuredBox):Re(l,s,t.layoutBox);const u=!ga(r);let c=!1;if(!e.resumeFrom){const d=e.getClosestProjectingParent();if(d&&!d.resumeFrom){const{snapshot:h,layout:p}=d;if(h&&p){const f=e.options.layoutAnchor||void 0,y=L();rt(y,t.layoutBox,h.layoutBox,f);const g=L();rt(g,s,p.layoutBox,f),ya(y,g)||(c=!0),d.options.layoutRoot&&(e.relativeTarget=g,e.relativeTargetOrigin=y,e.relativeParent=d)}}}e.notifyListeners("didUpdate",{layout:s,snapshot:t,delta:l,layoutDelta:r,hasLayoutChanged:u,hasRelativeLayoutChanged:c})}else if(e.isLead()){const{onExitComplete:s}=e.options;s&&s()}e.options.transition=void 0}function vc(e){e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function wc(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function xc(e){e.clearSnapshot()}function Ss(e){e.clearMeasurements()}function Ac(e){e.isLayoutDirty=!0,e.updateLayout()}function Cs(e){e.isLayoutDirty=!1}function Tc(e){e.isAnimationBlocked&&e.layout&&!e.isLayoutDirty&&(e.snapshot=e.layout,e.isLayoutDirty=!0)}function Ic(e){const{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify("BeforeLayoutMeasure"),e.resetTransform()}function Es(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function kc(e){e.resolveTargetDelta()}function qc(e){e.calcProjection()}function Sc(e){e.resetSkewAndRotation()}function Cc(e){e.removeLeadSnapshot()}function Ps(e,t,n){e.translate=C(t.translate,0,n),e.scale=C(t.scale,1,n),e.origin=t.origin,e.originPoint=t.originPoint}function Ms(e,t,n,s){e.min=C(t.min,n.min,s),e.max=C(t.max,n.max,s)}function Ec(e,t,n,s){Ms(e.x,t.x,n.x,s),Ms(e.y,t.y,n.y,s)}function Pc(e){return e.animationValues&&e.animationValues.opacityExit!==void 0}const Mc={duration:.45,ease:[.4,0,.1,1]},Rs=e=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(e),Ls=Rs("applewebkit/")&&!Rs("chrome/")?Math.round:H;function js(e){e.min=Ls(e.min),e.max=Ls(e.max)}function Rc(e){js(e.x),js(e.y)}function Aa(e,t,n){return e==="position"||e==="preserve-aspect"&&!Ql(As(t),As(n),.2)}function Lc(e){var t;return e!==e.root&&((t=e.scroll)==null?void 0:t.wasRoot)}const jc=xa({attachResizeListener:(e,t)=>Ne(e,"resize",t),measureScroll:()=>{var e,t;return{x:document.documentElement.scrollLeft||((e=document.body)==null?void 0:e.scrollLeft)||0,y:document.documentElement.scrollTop||((t=document.body)==null?void 0:t.scrollTop)||0}},checkIsScrollRoot:()=>!0}),kt={current:void 0},Ta=xa({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!kt.current){const e=new jc({});e.mount(window),e.setOptions({layoutScroll:!0}),kt.current=e}return kt.current},resetTransform:(e,t)=>{e.style.transform=t!==void 0?t:"none"},checkIsScrollRoot:e=>window.getComputedStyle(e).position==="fixed"}),Ia=T.createContext({transformPagePoint:e=>e,isStatic:!1,reducedMotion:"never"});function Dc(e=!0){const t=T.useContext(tn);if(t===null)return[!0,null];const{isPresent:n,onExitComplete:s,register:i}=t,o=T.useId();T.useEffect(()=>{if(e)return i(o)},[e]);const a=T.useCallback(()=>e&&s&&s(o),[o,s,e]);return!n&&s?[!1,a]:[!0]}const ka=T.createContext({strict:!1}),Ds={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]};let Vs=!1;function Vc(){if(Vs)return;const e={};for(const t in Ds)e[t]={isEnabled:n=>Ds[t].some(s=>!!n[s])};ea(e),Vs=!0}function qa(){return Vc(),kl()}function Nc(e){const t=qa();for(const n in e)t[n]={...t[n],...e[n]};ea(t)}const Oc=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","propagate","ignoreStrict","viewport"]);function lt(e){return e.startsWith("while")||e.startsWith("drag")&&e!=="draggable"||e.startsWith("layout")||e.startsWith("onTap")||e.startsWith("onPan")||e.startsWith("onLayout")||Oc.has(e)}let Sa=e=>!lt(e);function Fc(e){typeof e=="function"&&(Sa=t=>t.startsWith("on")?!lt(t):e(t))}try{Fc(require("@emotion/is-prop-valid").default)}catch{}function Bc(e,t,n){const s={};for(const i in e)i==="values"&&typeof e.values=="object"||N(e[i])||(Sa(i)||n===!0&&lt(i)||!t&&!lt(i)||e.draggable&&i.startsWith("onDrag"))&&(s[i]=e[i]);return s}const pt=T.createContext({});function Wc(e,t){if(ht(e)){const{initial:n,animate:s}=e;return{initial:n===!1||Ve(n)?n:void 0,animate:Ve(s)?s:void 0}}return e.inherit!==!1?t:{}}function Gc(e){const{initial:t,animate:n}=Wc(e,T.useContext(pt));return T.useMemo(()=>({initial:t,animate:n}),[Ns(t),Ns(n)])}function Ns(e){return Array.isArray(e)?e.join(" "):e}const qn=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function Ca(e,t,n){for(const s in t)!N(t[s])&&!ra(s,n)&&(e[s]=t[s])}function Uc({transformTemplate:e},t){return T.useMemo(()=>{const n=qn();return In(n,t,e),Object.assign({},n.vars,n.style)},[t])}function zc(e,t){const n=e.style||{},s={};return Ca(s,n,e),Object.assign(s,Uc(e,t)),s}function Hc(e,t){const n={},s=zc(e,t);return e.drag&&e.dragListener!==!1&&(n.draggable=!1,s.userSelect=s.WebkitUserSelect=s.WebkitTouchCallout="none",s.touchAction=e.drag===!0?"none":`pan-${e.drag==="x"?"y":"x"}
11`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(n.tabIndex=0),n.style=s,n}const Ea=()=>({...qn(),attrs:{}});function _c(e,t,n,s){const i=T.useMemo(()=>{const o=Ea();return la(o,t,ua(s),e.transformTemplate,e.style),{...o.attrs,style:{...o.style}}},[t]);if(e.style){const o={};Ca(o,e.style,e),i.style={...o,...i.style}}return i}const $c=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function Sn(e){return typeof e!="string"||e.includes("-")?!1:!!($c.indexOf(e)>-1||/[A-Z]/u.test(e))}function Kc(e,t,n,{latestValues:s},i,o=!1,a){const l=(a??Sn(e)?_c:Hc)(t,s,i,e),u=Bc(t,typeof e=="string",o),c=e!==T.Fragment?{...u,...l,ref:n}:{},{children:d}=t,h=T.useMemo(()=>N(d)?d.get():d,[d]);return T.createElement(e,{...c,children:h})}function Jc({scrapeMotionValuesFromProps:e,createRenderState:t},n,s,i){return{latestValues:Xc(n,s,i,e),renderState:t()}}function Xc(e,t,n,s){const i={},o=s(e,{});for(const h in o)i[h]=Ze(o[h]);let{initial:a,animate:r}=e;const l=ht(e),u=Zi(e);t&&u&&!l&&e.inherit!==!1&&(a===void 0&&(a=t.initial),r===void 0&&(r=t.animate));let c=n?n.initial===!1:!1;c=c||a===!1;const d=c?r:a;if(d&&typeof d!="boolean"&&!dt(d)){const h=Array.isArray(d)?d:[d];for(let p=0;p<h.length;p++){const f=gn(e,h[p]);if(f){const{transitionEnd:y,transition:g,...b}=f;for(const w in b){let v=b[w];if(Array.isArray(v)){const A=c?v.length-1:0;v=v[A]}v!==null&&(i[w]=v)}for(const w in y)i[w]=y[w]}}}return i}const Pa=e=>(t,n)=>{const s=T.useContext(pt),i=T.useContext(tn),o=()=>Jc(e,t,s,i);return n?o():_a(o)},Yc=Pa({scrapeMotionValuesFromProps:kn,createRenderState:qn}),Zc=Pa({scrapeMotionValuesFromProps:da,createRenderState:Ea}),Qc=Symbol.for("motionComponentSymbol");function eu(e,t,n){const s=T.useRef(n);T.useInsertionEffect(()=>{s.current=n});const i=T.useRef(null);return T.useCallback(o=>{var r;o&&((r=e.onMount)==null||r.call(e,o));const a=s.current;if(typeof a=="function")if(o){const l=a(o);typeof l=="function"&&(i.current=l)}else i.current?(i.current(),i.current=null):a(o);else a&&(a.current=o);t&&(o?t.mount(o):t.unmount())},[t])}const Ma=T.createContext({});function ye(e){return e&&typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"current")}function tu(e,t,n,s,i,o){var v,A;const{visualElement:a}=T.useContext(pt),r=T.useContext(ka),l=T.useContext(tn),u=T.useContext(Ia),c=u.reducedMotion,d=u.skipAnimations,h=T.useRef(null),p=T.useRef(!1);s=s||r.renderer,!h.current&&s&&(h.current=s(e,{visualState:t,parent:a,props:n,presenceContext:l,blockInitialAnimation:l?l.initial===!1:!1,reducedMotionConfig:c,skipAnimations:d,isSVG:o}),p.current&&h.current&&(h.current.manuallyAnimateOnMount=!0));const f=h.current,y=T.useContext(Ma);f&&!f.projection&&i&&(f.type==="html"||f.type==="svg")&&nu(h.current,n,i,y);const g=T.useRef(!1);T.useInsertionEffect(()=>{f&&g.current&&f.update(n,l)});const b=n[Fi],w=T.useRef(!!b&&typeof window<"u"&&!((v=window.MotionHandoffIsComplete)!=null&&v.call(window,b))&&((A=window.MotionHasOptimisedAnimation)==null?void 0:A.call(window,b)));return Ka(()=>{p.current=!0,f&&(g.current=!0,window.MotionIsMounted=!0,f.updateFeatures(),f.scheduleRenderMicrotask(),w.current&&f.animationState&&f.animationState.animateChanges())}),T.useEffect(()=>{f&&(!w.current&&f.animationState&&f.animationState.animateChanges(),w.current&&(queueMicrotask(()=>{var I;(I=window.MotionHandoffMarkAsComplete)==null||I.call(window,b)}),w.current=!1),f.enteringChildren=void 0)}),f}function nu(e,t,n,s){const{layoutId:i,layout:o,drag:a,dragConstraints:r,layoutScroll:l,layoutRoot:u,layoutAnchor:c,layoutCrossfade:d}=t;e.projection=new n(e.latestValues,t["data-framer-portal-id"]?void 0:Ra(e.parent)),e.projection.setOptions({layoutId:i,layout:o,alwaysMeasureLayout:!!a||r&&ye(r),visualElement:e,animationType:typeof o=="string"?o:"both",initialPromotionConfig:s,crossfade:d,layoutScroll:l,layoutRoot:u,layoutAnchor:c})}function Ra(e){if(e)return e.options.allowProjection!==!1?e.projection:Ra(e.parent)}function qt(e,{forwardMotionProps:t=!1,type:n}={},s,i){s&&Nc(s);const o=n?n==="svg":Sn(e),a=o?Zc:Yc;function r(u,c){let d;const h={...T.useContext(Ia),...u,layoutId:su(u)},{isStatic:p}=h,f=Gc(u),y=a(u,p);if(!p&&typeof window<"u"){iu();const g=au(h);d=g.MeasureLayout,f.visualElement=tu(e,y,h,i,g.ProjectionNode,o)}return m.jsxs(pt.Provider,{value:f,children:[d&&f.visualElement?m.jsx(d,{visualElement:f.visualElement,...h}):null,Kc(e,u,eu(y,f.visualElement,c),y,p,t,o)]})}r.displayName=`motion.${typeof e=="string"?e:`create(${e.displayName??e.name??""})`}`;const l=T.forwardRef(r);return l[Qc]=e,l}function su({layoutId:e}){const t=T.useContext(Ys).id;return t&&e!==void 0?t+"-"+e:e}function iu(e,t){T.useContext(ka).strict}function au(e){const t=qa(),{drag:n,layout:s}=t;if(!n&&!s)return{};const i={...n,...s};return{MeasureLayout:n!=null&&n.isEnabled(e)||s!=null&&s.isEnabled(e)?i.MeasureLayout:void 0,ProjectionNode:i.ProjectionNode}}
vendor: 6,728 bytes, line 11
11function ou(e,t){if(typeof Proxy>"u")return qt;const n=new Map,s=(o,a)=>qt(o,a,e,t),i=(o,a)=>s(o,a);return new Proxy(i,{get:(o,a)=>a==="create"?s:(n.has(a)||n.set(a,qt(a,void 0,e,t)),n.get(a))})}const ru=(e,t)=>t.isSVG??Sn(e)?new Gl(t):new Vl(t,{allowProjection:e!==T.Fragment});class lu extends re{constructor(t){super(t),t.animationState||(t.animationState=$l(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();dt(t)&&(this.unmountControls=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:n}=this.node.prevProps||{};t!==n&&this.updateAnimationControlsSubscription()}unmount(){var t;this.node.animationState.reset(),(t=this.unmountControls)==null||t.call(this)}}let cu=0;class uu extends re{constructor(){super(...arguments),this.id=cu++,this.isExitComplete=!1}update(){var o;if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:n}=this.node.presenceContext,{isPresent:s}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===s)return;if(t&&s===!1){if(this.isExitComplete){const{initial:a,custom:r}=this.node.getProps();if(typeof a=="string"){const l=fe(this.node,a,r);if(l){const{transition:u,transitionEnd:c,...d}=l;for(const h in d)(o=this.node.getValue(h))==null||o.jump(d[h])}}this.node.animationState.reset(),this.node.animationState.animateChanges()}else this.node.animationState.setActive("exit",!1);this.isExitComplete=!1;return}const i=this.node.animationState.setActive("exit",!t);n&&!t&&i.then(()=>{this.isExitComplete=!0,n(this.id)})}mount(){const{register:t,onExitComplete:n}=this.node.presenceContext||{};n&&n(this.id),t&&(this.unmount=t(this.id))}unmount(){}}const du={animation:{Feature:lu},exit:{Feature:uu}};function We(e){return{point:{x:e.pageX,y:e.pageY}}}const hu=e=>t=>wn(t)&&e(t,We(t));function Le(e,t,n,s){return Ne(e,t,hu(n),s)}const La=({current:e})=>e?e.ownerDocument.defaultView:null,Os=(e,t)=>Math.abs(e-t);function pu(e,t){const n=Os(e.x,t.x),s=Os(e.y,t.y);return Math.sqrt(n**2+s**2)}const Fs=new Set(["auto","scroll"]);class ja{constructor(t,n,{transformPagePoint:s,contextWindow:i=window,dragSnapToOrigin:o=!1,distanceThreshold:a=3,element:r}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.lastRawMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.removeScrollListeners=null,this.onElementScroll=p=>{this.handleScroll(p.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;this.lastRawMoveEventInfo&&(this.lastMoveEventInfo=He(this.lastRawMoveEventInfo,this.transformPagePoint));const p=St(this.lastMoveEventInfo,this.history),f=this.startEvent!==null,y=pu(p.offset,{x:0,y:0})>=this.distanceThreshold;if(!f&&!y)return;const{point:g}=p,{timestamp:b}=V;this.history.push({...g,timestamp:b});const{onStart:w,onMove:v}=this.handlers;f||(w&&w(this.lastMoveEvent,p),this.startEvent=this.lastMoveEvent),v&&v(this.lastMoveEvent,p)},this.handlePointerMove=(p,f)=>{this.lastMoveEvent=p,this.lastRawMoveEventInfo=f,this.lastMoveEventInfo=He(f,this.transformPagePoint),S.update(this.updatePoint,!0)},this.handlePointerUp=(p,f)=>{this.end();const{onEnd:y,onSessionEnd:g,resumeAnimation:b}=this.handlers;if((this.dragSnapToOrigin||!this.startEvent)&&b&&b(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const w=St(p.type==="pointercancel"?this.lastMoveEventInfo:He(f,this.transformPagePoint),this.history);this.startEvent&&y&&y(p,w),g&&g(p,w)},!wn(t))return;this.dragSnapToOrigin=o,this.handlers=n,this.transformPagePoint=s,this.distanceThreshold=a,this.contextWindow=i||window;const l=We(t),u=He(l,this.transformPagePoint),{point:c}=u,{timestamp:d}=V;this.history=[{...c,timestamp:d}];const{onSessionStart:h}=n;h&&h(t,St(u,this.history)),this.removeListeners=Oe(Le(this.contextWindow,"pointermove",this.handlePointerMove),Le(this.contextWindow,"pointerup",this.handlePointerUp),Le(this.contextWindow,"pointercancel",this.handlePointerUp)),r&&this.startScrollTracking(r)}startScrollTracking(t){let n=t.parentElement;for(;n;){const s=getComputedStyle(n);(Fs.has(s.overflowX)||Fs.has(s.overflowY))&&this.scrollPositions.set(n,{x:n.scrollLeft,y:n.scrollTop}),n=n.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener("scroll",this.onElementScroll,{capture:!0}),window.addEventListener("scroll",this.onWindowScroll),this.removeScrollListeners=()=>{window.removeEventListener("scroll",this.onElementScroll,{capture:!0}),window.removeEventListener("scroll",this.onWindowScroll)}}handleScroll(t){const n=this.scrollPositions.get(t);if(!n)return;const s=t===window,i=s?{x:window.scrollX,y:window.scrollY}:{x:t.scrollLeft,y:t.scrollTop},o={x:i.x-n.x,y:i.y-n.y};o.x===0&&o.y===0||(s?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=o.x,this.lastMoveEventInfo.point.y+=o.y):this.history.length>0&&(this.history[0].x-=o.x,this.history[0].y-=o.y),this.scrollPositions.set(t,i),S.update(this.updatePoint,!0))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners&&this.removeScrollListeners(),this.scrollPositions.clear(),oe(this.updatePoint)}}function He(e,t){return t?{point:t(e.point)}:e}function Bs(e,t){return{x:e.x-t.x,y:e.y-t.y}}function St({point:e},t){return{point:e,delta:Bs(e,Da(t)),offset:Bs(e,mu(t)),velocity:fu(t,.1)}}function mu(e){return e[0]}function Da(e){return e[e.length-1]}function fu(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,s=null;const i=Da(e);for(;n>=0&&(s=e[n],!(i.timestamp-s.timestamp>G(t)));)n--;if(!s)return{x:0,y:0};s===e[0]&&e.length>2&&i.timestamp-s.timestamp>G(t)*2&&(s=e[1]);const o=z(i.timestamp-s.timestamp);if(o===0)return{x:0,y:0};const a={x:(i.x-s.x)/o,y:(i.y-s.y)/o};return a.x===1/0&&(a.x=0),a.y===1/0&&(a.y=0),a}function gu(e,{min:t,max:n},s){return t!==void 0&&e<t?e=s?C(t,e,s.min):Math.max(e,t):n!==void 0&&e>n&&(e=s?C(n,e,s.max):Math.min(e,n)),e}function Ws(e,t,n){return{min:t!==void 0?e.min+t:void 0,max:n!==void 0?e.max+n-(e.max-e.min):void 0}}function yu(e,{top:t,left:n,bottom:s,right:i}){return{x:Ws(e.x,n,i),y:Ws(e.y,t,s)}}function Gs(e,t){let n=t.min-e.min,s=t.max-e.max;return t.max-t.min<e.max-e.min&&([n,s]=[s,n]),{min:n,max:s}}function bu(e,t){return{x:Gs(e.x,t.x),y:Gs(e.y,t.y)}}function vu(e,t){let n=.5;const s=B(e),i=B(t);return i>s?n=je(t.min,t.max-s,e.min):s>i&&(n=je(e.min,e.max-i,t.min)),ee(0,1,n)}function wu(e,t){const n={};return t.min!==void 0&&(n.min=t.min-e.min),t.max!==void 0&&(n.max=t.max-e.min),n}const Qt=.35;function xu(e=Qt){return e===!1?e=0:e===!0&&(e=Qt),{x:Us(e,"left","right"),y:Us(e,"to
11p","bottom")}}function Us(e,t,n){return{min:zs(e,t),max:zs(e,n)}}function zs(e,t){return typeof e=="number"?e:e[t]||0}const Au=new WeakMap;class Tu{constructor(t){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=L(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=t}start(t,{snapToCursor:n=!1,distanceThreshold:s}={}){const{presenceContext:i}=this.visualElement;if(i&&i.isPresent===!1)return;const o=d=>{n&&this.snapToCursor(We(d).point),this.stopAnimation()},a=(d,h)=>{const{drag:p,dragPropagation:f,onDragStart:y}=this.getProps();if(p&&!f&&(this.openDragLock&&this.openDragLock(),this.openDragLock=tl(p),!this.openDragLock))return;this.latestPointerEvent=d,this.latestPanInfo=h,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Y(b=>{let w=this.getAxisMotionValue(b).get()||0;if(Q.test(w)){const{projection:v}=this.visualElement;if(v&&v.layout){const A=v.layout.layoutBox[b];A&&(w=B(A)*(parseFloat(w)/100))}}this.originPoint[b]=w}),y&&S.update(()=>y(d,h),!1,!0),zt(this.visualElement,"transform");const{animationState:g}=this.visualElement;g&&g.setActive("whileDrag",!0)},r=(d,h)=>{this.latestPointerEvent=d,this.latestPanInfo=h;const{dragPropagation:p,dragDirectionLock:f,onDirectionLock:y,onDrag:g}=this.getProps();if(!p&&!this.openDragLock)return;const{offset:b}=h;if(f&&this.currentDirection===null){this.currentDirection=ku(b),this.currentDirection!==null&&y&&y(this.currentDirection);return}this.updateAxis("x",h.point,b),this.updateAxis("y",h.point,b),this.visualElement.render(),g&&S.update(()=>g(d,h),!1,!0)},l=(d,h)=>{this.latestPointerEvent=d,this.latestPanInfo=h,this.stop(d,h),this.latestPointerEvent=null,this.latestPanInfo=null},u=()=>{const{dragSnapToOrigin:d}=this.getProps();(d||this.constraints)&&this.startAnimation({x:0,y:0})},{dragSnapToOrigin:c}=this.getProps();this.panSession=new ja(t,{onSessionStart:o,onStart:a,onMove:r,onSessionEnd:l,resumeAnimation:u},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:c,distanceThreshold:s,contextWindow:La(this.visualElement),element:this.visualElement.current})}stop(t,n){const s=t||this.latestPointerEvent,i=n||this.latestPanInfo,o=this.isDragging;if(this.cancel(),!o||!i||!s)return;const{velocity:a}=i;this.startAnimation(a);const{onDragEnd:r}=this.getProps();r&&S.postRender(()=>r(s,i))}cancel(){this.isDragging=!1;const{projection:t,animationState:n}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.endPanSession();const{dragPropagation:s}=this.getProps();!s&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),n&&n.setActive("whileDrag",!1)}endPanSession(){this.panSession&&this.panSession.end(),this.panSession=void 0}updateAxis(t,n,s){const{drag:i}=this.getProps();if(!s||!_e(t,i,this.currentDirection))return;const o=this.getAxisMotionValue(t);let a=this.originPoint[t]+s[t];this.constraints&&this.constraints[t]&&(a=gu(a,this.constraints[t],this.elastic[t])),o.set(a)}resolveConstraints(){var o;const{dragConstraints:t,dragElastic:n}=this.getProps(),s=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):(o=this.visualElement.projection)==null?void 0:o.layout,i=this.constraints;t&&ye(t)?this.constraints||(this.constraints=this.resolveRefConstraints()):t&&s?this.constraints=yu(s.layoutBox,t):this.constraints=!1,this.elastic=xu(n),i!==this.constraints&&!ye(t)&&s&&this.constraints&&!this.hasMutatedConstraints&&Y(a=>{this.constraints!==!1&&this.getAxisMotionValue(a)&&(this.constraints[a]=wu(s.layoutBox[a],this.constraints[a]))})}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:n}=this.getProps();if(!t||!ye(t))return!1;const s=t.current;xe(s!==null,"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.","drag-constraints-ref");const{projection:i}=this.visualElement;if(!i||!i.layout)return!1;const o=Pl(s,i.root,this.visualElement.getTransformPagePoint());let a=bu(i.layout.layoutBox,o);if(n){const r=n(Sl(a));this.hasMutatedConstraints=!!r,r&&(a=na(r))}return a}startAnimation(t){const{drag:n,dragMomentum:s,dragElastic:i,dragTransition:o,dragSnapToOrigin:a,onDragTransitionEnd:r}=this.getProps(),l=this.constraints||{},u=Y(c=>{if(!_e(c,n,this.currentDirection))return;let d=l&&l[c]||{};(a===!0||a===c)&&(d={min:0,max:0});const h=i?200:1e6,p=i?40:1e7,f={type:"inertia",velocity:s?t[c]:0,bounceStiffness:h,bounceDamping:p,timeConstant:750,restDelta:1,restSpeed:10,...o,...d};return this.startAxisValueAnimation(c,f)});return Promise.all(u).then(r)}startAxisValueAnimation(t,n){const s=this.getAxisMotionValue(t);return zt(this.visualElement,t),s.start(fn(t,s,0,n,this.visualElement,!1))}stopAnimation(){Y(t=>this.getAxisMotionValue(t).stop())}getAxisMotionValue(t){const n=`_drag${t.toUpperCase()}`,s=this.visualElement.getProps(),i=s[n];return i||this.visualElement.getValue(t,(s.initial?s.initial[t]:void 0)||0)}snapToCursor(t){Y(n=>{const{drag:s}=this.getProps();if(!_e(n,s,this.currentDirection))return;const{projection:i}=this.visualElement,o=this.getAxisMotionValue(n);if(i&&i.layout){const{min:a,max:r}=i.layout.layoutBox[n],l=o.get()||0;o.set(t[n]-C(a,r,.5)+l)}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:n}=this.getProps(),{projection:s}=this.visualElement;if(!ye(n)||!s||!this.constraints)return;this.stopAnimation();const i={x:0,y:0};Y(a=>{const r=this.getAxisMotionValue(a);if(r&&this.constraints!==!1){const l=r.get();i[a]=vu({min:l,max:l},this.constraints[a])}});const{transformTemplate:o}=this.visualElement.getProps();this.visualElement.current.style.transform=o?o({},""):"none",s.root&&s.root.updateScroll(),s.updateLayout(),this.constraints=!1,this.resolveConstraints(),Y(a=>{if(!_e(a,t,null))return;const r=this.getAxisMotionValue(a),{min:l,max:u}=this.constraints[a];r.set(C(l,u,i[a]))}),this.visualElement.render()}addListeners(){if(!this.visualElement.current)return;Au.set(this.visualElement,this);const t=this.visualElement.current,n=Le(t,"pointerdown",u=>{const{drag:c,dragListener:d=!0}=this.getProps(),h=u.target,p=h!==t&&rl(h);c&&d&&!p&&this.start(u)});let s;const i=()=>{const{dragConstraints:u}=this.getProps();ye(u)&&u.current&&(this.constraints=this.resolveRefConstraints(),s||(s=Iu(t,u.current,()=>this.scalePositionWithinConstraints())))},{projection:o}=this.visualElement,a=o.addEventListener("measure",i);o&&!o.layout&&(o.root&&o.root.updateScroll(),o.updateLayout()),S.read(i);const r=Ne(window,"resize",()=>this.scalePositionWithinConstraints()),l=o.addEventListener("didUpdate",({delta:u,hasLayoutChanged:c})=>{this.isDragging&&c&&(Y(d=>{const h=this.getAxisMotionValue(d);h&&(this.originPoint[d]+=u[d].translate,h.set(h.get()+u[d].translate))}),this.visualElement.render())});return()=>{r(),n(),a(),l&&l(),s&&s()}}getProps(){const t=this.visualElement.getProps(),{drag:n=!1,dragDirectionLock:s=!1,dragPropagation:i=!1,dragConstraints:o=!1,dragElastic:a=Qt,dragMomentum:r=!0}=t;return{...t,drag:n,dragDirectionLock:s,dragPropagation:i,dragConstraints:o,dragElastic:a,dragMomentum:r}}}function Hs(e){let t=!0;return()=>{if(t){t=!1;return}e()}}function Iu(e,t,n){const s=es(e,Hs(n)),i=es(t,Hs(n));return()=>{s(),i()}}function _e(e,t,n){return(t===!0||t===e)&&(n===null||n===e)}function ku(e,t=10){let n=null;return Math.abs(e.y)>t?n="y":Math.abs(e.x)>t&&(n="x"),n}class qu extends re{constructor(t){super(t),this.removeGroupControls=H,this.removeListeners=H,this.controls=new Tu(t)}
vendor: 7,093 bytes, lines 11-14
11mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||H}update(){const{dragControls:t}=this.node.getProps(),{dragControls:n}=this.node.prevProps||{};t!==n&&(this.removeGroupControls(),t&&(this.removeGroupControls=t.subscribe(this.controls)))}unmount(){this.removeGroupControls(),this.removeListeners(),this.controls.isDragging||this.controls.endPanSession()}}const Ct=e=>(t,n)=>{e&&S.update(()=>e(t,n),!1,!0)};class Su extends re{constructor(){super(...arguments),this.removePointerDownListener=H}onPointerDown(t){this.session=new ja(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:La(this.node)})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:n,onPan:s,onPanEnd:i}=this.node.getProps();return{onSessionStart:Ct(t),onStart:Ct(n),onMove:Ct(s),onEnd:(o,a)=>{delete this.session,i&&S.postRender(()=>i(o,a))}}}mount(){this.removePointerDownListener=Le(this.node.current,"pointerdown",t=>this.onPointerDown(t))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}let Et=!1;class Cu extends T.Component{componentDidMount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:s,layoutId:i}=this.props,{projection:o}=t;o&&(n.group&&n.group.add(o),s&&s.register&&i&&s.register(o),Et&&o.root.didUpdate(),o.addEventListener("animationComplete",()=>{this.safeToRemove()}),o.setOptions({...o.options,layoutDependency:this.props.layoutDependency,onExitComplete:()=>this.safeToRemove()})),Qe.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:n,visualElement:s,drag:i,isPresent:o}=this.props,{projection:a}=s;return a&&(a.isPresent=o,t.layoutDependency!==n&&a.setOptions({...a.options,layoutDependency:n}),Et=!0,i||t.layoutDependency!==n||n===void 0||t.isPresent!==o?a.willUpdate():this.safeToRemove(),t.isPresent!==o&&(o?a.promote():a.relegate()||S.postRender(()=>{const r=a.getStack();(!r||!r.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{visualElement:t,layoutAnchor:n}=this.props,{projection:s}=t;s&&(s.options.layoutAnchor=n,s.root.didUpdate(),vn.postRender(()=>{!s.currentAnimation&&s.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:s}=this.props,{projection:i}=t;Et=!0,i&&(i.scheduleCheckAfterUnmount(),n&&n.group&&n.group.remove(i),s&&s.deregister&&s.deregister(i))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function Va(e){const[t,n]=Dc(),s=T.useContext(Ys);return m.jsx(Cu,{...e,layoutGroup:s,switchLayoutGroup:T.useContext(Ma),isPresent:t,safeToRemove:n})}const Eu={pan:{Feature:Su},drag:{Feature:qu,ProjectionNode:Ta,MeasureLayout:Va}};function _s(e,t,n){const{props:s}=e;e.animationState&&s.whileHover&&e.animationState.setActive("whileHover",n==="Start");const i="onHover"+n,o=s[i];o&&S.postRender(()=>o(t,We(t)))}class Pu extends re{mount(){const{current:t}=this.node;t&&(this.unmount=sl(t,(n,s)=>(_s(this.node,s,"Start"),i=>_s(this.node,i,"End"))))}unmount(){}}class Mu extends re{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch{t=!0}!t||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=Oe(Ne(this.node.current,"focus",()=>this.onFocus()),Ne(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}function $s(e,t,n){const{props:s}=e;if(e.current instanceof HTMLButtonElement&&e.current.disabled)return;e.animationState&&s.whileTap&&e.animationState.setActive("whileTap",n==="Start");const i="onTap"+(n==="End"?"":n),o=s[i];o&&S.postRender(()=>o(t,We(t)))}class Ru extends re{mount(){const{current:t}=this.node;if(!t)return;const{globalTapTarget:n,propagate:s}=this.node.props;this.unmount=cl(t,(i,o)=>($s(this.node,o,"Start"),(a,{success:r})=>$s(this.node,a,r?"End":"Cancel")),{useGlobalTarget:n,stopPropagation:(s==null?void 0:s.tap)===!1})}unmount(){}}const en=new WeakMap,Pt=new WeakMap,Lu=e=>{const t=en.get(e.target);t&&t(e)},ju=e=>{e.forEach(Lu)};function Du({root:e,...t}){const n=e||document;Pt.has(n)||Pt.set(n,{});const s=Pt.get(n),i=JSON.stringify(t);return s[i]||(s[i]=new IntersectionObserver(ju,{root:e,...t})),s[i]}function Vu(e,t,n){const s=Du(t);return en.set(e,n),s.observe(e),()=>{en.delete(e),s.unobserve(e)}}const Nu={some:0,all:1};class Ou extends re{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){var l;(l=this.stopObserver)==null||l.call(this);const{viewport:t={}}=this.node.getProps(),{root:n,margin:s,amount:i="some",once:o}=t,a={root:n?n.current:void 0,rootMargin:s,threshold:typeof i=="number"?i:Nu[i]},r=u=>{const{isIntersecting:c}=u;if(this.isInView===c||(this.isInView=c,o&&!c&&this.hasEnteredView))return;c&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",c);const{onViewportEnter:d,onViewportLeave:h}=this.node.getProps(),p=c?d:h;p&&p(u)};this.stopObserver=Vu(this.node.current,a,r)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:t,prevProps:n}=this.node;["amount","margin","root"].some(Fu(t,n))&&this.startObserver()}unmount(){var t;(t=this.stopObserver)==null||t.call(this),this.hasEnteredView=!1,this.isInView=!1}}function Fu({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}const Bu={inView:{Feature:Ou},tap:{Feature:Ru},focus:{Feature:Mu},hover:{Feature:Pu}},Wu={layout:{ProjectionNode:Ta,MeasureLayout:Va}},Gu={...du,...Bu,...Eu,...Wu},Uu=ou(Gu,ru),zu=[{name:"Scope & Plan",surelio:!0},{name:"Augment & Fine Tune Data",surelio:!0},{name:"Develop & Experiment",surelio:!0},{name:"Test & Evaluate",surelio:!0},{name:"Release",surelio:!1},{name:"Deploy",surelio:!1},{name:"Operate",surelio:!1},{name:"Monitor",surelio:!0},{name:"Govern",surelio:!0}],Hu=()=>m.jsxs("div",{className:"my-8",children:[m.jsx("ul",{className:"space-y-3 list-none pl-0",children:zu.map((e,t)=>m.jsxs(Uu.li,{initial:{opacity:0,x:-16},whileInView:{opacity:1,x:0},viewport:{once:!0},transition:{delay:t*.06,duration:.35,ease:"easeOut"},className:"flex items-center gap-3",children:[m.jsx("span",{className:`
12                flex items-center justify-center w-7 h-7 rounded-full text-xs font-bold shrink-0
13                ${e.surelio?"bg-primary/15 text-primary border border-primary/30":"bg-muted text-muted-foreground border border-border"}
14              `,children:t+1}),m.jsx("span",{className:`text-base md:text-lg leading-snug ${e.surelio?"text-foreground font-medium":"text-muted-foreground"}`,children:e.name})]},t))}),m.jsxs("div",{className:"flex items-center gap-6 mt-5 text-xs text-muted-foreground",children:[m.jsxs("span",{className:"flex items-center gap-2",children:[m.jsx("span",{className:"w-2 h-2 rounded-full bg-primary inline-block"}
14),"Surelio is listed"]}),m.jsxs("span",{className:"flex items-center gap-2",children:[m.jsx("span",{className:"w-2 h-2 rounded-full bg-muted-foreground/30 inline-block"}),"Not listed"]})]})]}),_u=1,$u="82538e9f-28ea-4f0c-a047-9cb97b7b4891",Ku="ad8e228f-52ee-4574-a8ff-8d35e2e8aefe",Ju="/__l5e/assets-v1/82538e9f-28ea-4f0c-a047-9cb97b7b4891/openrouter-quantization-providers.png",Xu="a/v1/ad8e228f-52ee-4574-a8ff-8d35e2e8aefe/82538e9f-28ea-4f0c-a047-9cb97b7b4891/openrouter-quantization-providers.png",Yu="openrouter-quantization-providers.png",Zu=62039,Qu="image/png",ed="2026-07-31T07:58:11Z",td={version:_u,asset_id:$u,project_id:Ku,url:Ju,r2_key:Xu,original_filename:Yu,size:Zu,content_type:Qu,created_at:ed},nd=1,sd="3ab7287f-ee3b-4ab4-a16a-5f289ea5a9b1",id="ad8e228f-52ee-4574-a8ff-8d35e2e8aefe",ad="/__l5e/assets-v1/3ab7287f-ee3b-4ab4-a16a-5f289ea5a9b1/refusal-rate-by-provider.png",od="a/v1/ad8e228f-52ee-4574-a8ff-8d35e2e8aefe/3ab7287f-ee3b-4ab4-a16a-5f289ea5a9b1/refusal-rate-by-provider.png",rd="refusal-rate-by-provider.png",ld=38834,cd="image/webp",ud="2026-07-31T08:01:45Z",dd={version:nd,asset_id:sd,project_id:id,url:ad,r2_key:od,original_filename:rd,size:ld,content_type:cd,created_at:ud},hd=1,pd="a1fb2eaf-dd9d-4c75-828a-23c150c468b8",md="ad8e228f-52ee-4574-a8ff-8d35e2e8aefe",fd="/__l5e/assets-v1/a1fb2eaf-dd9d-4c75-828a-23c150c468b8/refusal-rate-by-judge-provider.png",gd="a/v1/ad8e228f-52ee-4574-a8ff-8d35e2e8aefe/a1fb2eaf-dd9d-4c75-828a-23c150c468b8/refusal-rate-by-judge-provider.png",yd="refusal-rate-by-judge-provider.png",bd=51718,vd="image/webp",wd="2026-07-31T08:09:47Z",xd={version:hd,asset_id:pd,project_id:md,url:fd,r2_key:gd,original_filename:yd,size:bd,content_type:vd,created_at:wd},Ad=1,Td="7425f917-5951-43c9-a52a-e04f953c62fa",Id="ad8e228f-52ee-4574-a8ff-8d35e2e8aefe",kd="/__l5e/assets-v1/7425f917-5951-43c9-a52a-e04f953c62fa/cost-comparison-providers.png",qd="a/v1/ad8e228f-52ee-4574-a8ff-8d35e2e8aefe/7425f917-5951-43c9-a52a-e04f953c62fa/cost-comparison-providers.png",Sd="cost-comparison-providers.png",Cd=64084,Ed="image/webp",Pd="2026-07-31T08:13:37Z",Md={version:Ad,asset_id:Td,project_id:Id,url:kd,r2_key:qd,original_filename:Sd,size:Cd,content_type:Ed,created_at:Pd},Rd=1,Ld="14428b5f-9ac8-411a-a02d-d3062305d0fd",jd="ad8e228f-52ee-4574-a8ff-8d35e2e8aefe",Dd="/__l5e/assets-v1/14428b5f-9ac8-411a-a02d-d3062305d0fd/nist-csf-2-functions.png",Vd="a/v1/ad8e228f-52ee-4574-a8ff-8d35e2e8aefe/14428b5f-9ac8-411a-a02d-d3062305d0fd/nist-csf-2-functions.png",Nd="nist-csf-2-functions.png",Od=96911,Fd="image/png",Bd="2026-08-04T18:06:19Z",Ks={version:Rd,asset_id:Ld,project_id:jd,url:Dd,r2_key:Vd,original_filename:Nd,size:Od,content_type:Fd,created_at:Bd},Js=e=>{if(!e)return;const t=e.match(/^(\d{2})\.(\d{2})\.(\d{4})$/);return t?`${t[3]}-${t[2]}-${t[1]}`:e},Wd={"ai-governance-frameworks-common-lexicon":{slug:"ai-governance-frameworks-common-lexicon",title:"AI governance: a common lexicon does not make a common framework",subtitle:"Transparency, robustness, fairness, accountability: the same principles appear in every AI framework. Convergence is real as to their names; it is absent as to what counts as a breach.",tags:["AI Governance","EU AI Act","Standards","Compliance"],author:{name:"Hugo Medori",role:"AI Researcher",avatar:Ge.url,initials:"HM"},readingTime:"12 MIN",date:"12.08.2026",coverImage:"/blog-ai-governance-frameworks-cover.jpg",altVersion:{label:"Version française",slug:"cadres-de-gouvernance-de-l-ia-un-lexique-commun"},content:{sections:[{type:"heading",content:"Introduction: principles in circulation"},{type:"paragraph",content:'Over the past decade or so, texts purporting to define acceptable AI have proliferated. A survey published in 2019 had already identified eighty-four sets of ethical guidelines, most of them non-binding documents produced by companies, professional associations and international organisations<sup id="fnref-en-1"><a href="#fn-en-1">1</a></sup>. Since then, that output has changed less in volume than in kind: it has shifted from statements of principle towards binding rules, and that shift is the subject of this article. Anyone who reads in succession the OECD Recommendation on Artificial Intelligence (2
14019, revised in 2024), the guidelines of the Commission&rsquo;s high-level expert group (2019), the UNESCO Recommendation (2021), the NIST risk management framework (2023), the Council of Europe Framework Convention (2024) and the European regulation<sup id="fnref-en-2"><a href="#fn-en-2">2</a></sup> (known as the EU AI Act) comes away with an impression of unanimity: transparency, robustness, fairness, accountability, human oversight. An international consensus would appear to be taking shape, with nothing left to do but implement it. These six texts form the corpus of this article. ISO/IEC 42001, often cited alongside them, is not part of the corpus: it does not state principles; it organises a management system.'},{type:"paragraph",content:'There is genuine convergence in the names of the principles, but not in what counts as a breach from one text to another. There are two reasons for this. First, the resemblance is not the result of spontaneous convergence but of a clear lineage: recital 27 of the European regulation expressly cites the seven requirements formulated in 2019 by the Commission&rsquo;s high-level expert group<sup id="fnref-en-3"><a href="#fn-en-3">3</a></sup>, which in turn drew on the principles that the OECD had just adopted and the G20 had endorsed that same year. This is not a case of fifty institutions independently reaching agreement; it is a case of principles circulating between them. Second, this common lineage ends where governance begins: when one must determine how compliance with a principle is to be demonstrated, to whom, and what consequences follow if it cannot be demonstrated.'},{type:"heading",content:"How soft law and hard law shape each other"},{type:"paragraph",content:"Classifying all these texts as either soft law or binding law is not particularly instructive. What matters is how they shape one another."},{type:"paragraph",content:'The first movement is upward and concerns content. The OECD Recommendation of May 2019 has no legally binding force, and neither does UNESCO&rsquo;s, adopted in November 2021 by its 193 member states. The European guidelines, moreover, presented themselves as non-binding. Yet they provided the substance of the 2024 European regulation: here, soft law served as the drafting laboratory for hard law. The Council of Europe Framework Convention, opened for signature in September 2024<sup id="fnref-en-4"><a href="#fn-en-4">4</a></sup>, occupies an intermediate position, that of a treaty binding on its parties but framed as obligations of conduct: to document, to allow challenges, to provide a remedy. For example, the principle of &ldquo;awareness and literacy&rdquo;<sup id="fnref-en-5"><a href="#fn-en-5">5</a></sup> stated by UNESCO in 2021 has its binding equivalent in Article 4 of the regulation, on AI literacy, and in Article 20 of the Council of Europe Convention.'},{type:"paragraph",content:'The second movement is downward and concerns operationalisation. Here, soft law serves to translate genuinely binding obligations into concrete terms, directly or indirectly. For example, Article 40 of the EU AI Act<sup id="fnref-en-6"><a href="#fn-en-6">6</a></sup> provides that systems complying with harmonised standards benefit from a presumption of conformity with the legal requirements. The Commission therefore asks the European standardisation organisations (for AI, the CEN-CENELEC JTC 21 committee) to develop the technical expression of those requirements: a voluntary standard, drawn up by a private body recognised as a standardisation organisation by the European Union, becomes the practical reference point for a legal obligation. ISO/IEC 42001 and the NIST AI RMF occupy a different position (the former being certifiable by an accredited third party, unlike the latter), but neither directly establishes conformity with the regulation. They are nonetheless useful guides, since the requirements they set are to a large extent comparable.'},{type:"paragraph",content:'This mechanism presupposes, however, that harmonised standards exist. To date, no JTC 21 standard has been cited in the Official Journal of the European Union: no standard currently gives rise to the presumption of conformity. The first step has been taken with EN 18286, devoted to the quality management system required by Art
14icle 17: CEN and CENELEC approved it on 12 July 2026 and published it at the end of the same month. But until its reference is published in the Official Journal, it produces no legal effect. The standards on risk management (Article 9), cybersecurity (Article 15) and bias (Article 10) are still at the public-enquiry or drafting stage, despite the measures that CEN and CENELEC themselves describe as exceptional, adopted in October 2025.<sup id="fnref-en-7"><a href="#fn-en-7">7</a></sup>'},{type:"paragraph",content:'This delay has produced the most revealing development of the period: the technical standard did not catch up with the law; the law waited for the standard. Regulation (EU) 2026/1744, known as the Digital Omnibus, in force since 27 July 2026, defers the application of the obligations relating to the high-risk systems listed in Annex III until 2 December 2027, and those of Annex I until 2 August 2028, explicitly because the harmonised standards and the conformity assessment infrastructure were not ready.<sup id="fnref-en-8"><a href="#fn-en-8">8</a></sup> Article 41 nonetheless allowed the Commission to adopt common specifications in the absence of harmonised standards: it had a public regulatory alternative available, but chose instead to postpone the deadline. Soft law therefore does not merely accompany hard law; it conditions its operation.'},{type:"paragraph",content:"It is therefore important to clarify what an ISO/IEC 42001 certification demonstrates, and what it does not. The standard sets out the requirements for an AI management system. It is certifiable by an accredited third party, and it requires an organisation to document decision-making responsibilities. It sets no threshold, however, and above all it confers no presumption of conformity, which Article 40 reserves for harmonised standards. It demonstrates that an organisation has an AI management system; it does not demonstrate that a given AI system satisfies the requirements of Chapter III."},{type:"paragraph",content:"The next question is what these texts genuinely share once mere vocabulary has been set aside."},{type:"heading",content:" The same word, a different breach"},{type:"paragraph",content:'The most obvious point must be made at the outset: a core of common principles does indeed exist. Six requirements are found in all six texts of the corpus, in much the same terms<sup id="fnref-en-9"><a href="#fn-en-9">9</a></sup>, under only slightly different headings: what the European expert group calls &ldquo;human agency and oversight&rdquo; becomes &ldquo;human oversight and determination&rdquo; for UNESCO and &ldquo;human dignity and individual autonomy&rdquo; in Article 7 of the Council of Europe Convention; what NIST calls &ldquo;fair with harmful bias managed&rdquo; is stated elsewhere as &ldquo;fairness and non-discrimination&rdquo;. Moreover, the concept of &ldquo;trustworthy AI&rdquo; (<em>digne de confiance</em>) is not one principle among others: it is the label applied to the list as a whole. The OECD, the expert group, NIST and recital 27 all place their requirements under that heading. The list shrinks as the texts under consideration become more binding<sup id="fnref-en-10"><a href="#fn-en-10">10</a></sup>.'},{type:"table",content:{headers:["Principle","Soft law (OECD, AI HLEG, UNESCO)","NIST 2023 (voluntary characteristics)","Council of Europe 2024 (obligations of conduct)","Regulation (EU) 2024/1689 (from recital 27 to an ascertainable breach)"],rows:[["Human primacy and human oversight","Recommendation","Addressed under the Govern and Map functions","Art. 7","Enforceable requirement, Art. 14"],["Robustness, accuracy, security","Recommendation","Characteristic","Art. 12","Enforceable requirement, Art. 15"],["Privacy and data governance","Recommendation","Characteristic","Art. 11","Data requirement, Art. 10"],["Transparency and explainability","Recommendation","Characteristic","Art. 8","Requirements, Art. 13 and 50"],["Fairness and non-discrimination","Recommendation","Characteristic","Art. 10","Bias assessment and mitigation, Art. 10(2)"],["Accountability","Recommendation","Characteristic","Art. 9","Requirements, Art. 16, 17 and 26"],["S
14ocietal and environmental well-being","Recommendation","Absent","Absent","Voluntary code of conduct, Art. 95"],["“Trustworthy”","Heading for the list","Heading for the list","Principle distinct from reliability, Art. 12","Subject matter of the regulation, Art. 1; never a requirement"]],caption:"The status of each principle and what may constitute a breach"}},{type:"paragraph",content:"How to read the table: none of the first three columns imposes obligations on an operator; the fourth does, but those obligations fall on the States parties. Only the right-hand column identifies conduct that constitutes a breach. It does not reproduce any principle as such: the regulation converts them into precise requirements, and it is those requirements, not the principles from which they derive, that bind the provider."},{type:"paragraph",content:'There is therefore genuine convergence in the names of the principles. That is not enough to constitute a common framework. A simple test, applicable to any pair of texts, shows why: do they really share a principle, or only its name? They share it only if the same conduct constitutes a breach under both. The Council of Europe Convention and the regulation both protect non-discrimination; but a disparity in rates between two populations engages the State under the former, whereas under the latter it engages the provider only if the provider has failed to examine the bias. The underlying fact is the same; the legal breach is not. This test has a direct consequence: where two equally applicable principles conflict, there must be a rule stating which one yields; otherwise, the breach once again becomes impossible to determine. A list without an explicit conflict rule is not a genuine framework but merely a common vocabulary. The foundational document of the EU framework had acknowledged as much, calling for the continuous identification, evaluation, documentation and communication of &ldquo;fundamental tensions between different principles&rdquo;<sup id="fnref-en-11"><a href="#fn-en-11">11</a></sup>. Moreover, the term heading the list fares worst under this test. &ldquo;Trustworthy&rdquo; does not denote a property of the system but a relation to whoever observes it: trust is granted, it is not measured, and nothing can therefore count as a breach of it. NIST says so plainly: trustworthiness is &ldquo;a social concept that ranges across a spectrum&rdquo; and a system is only as trustworthy as its weakest characteristic<sup id="fnref-en-12"><a href="#fn-en-12">12</a></sup>. The regulation reflects this in its structure: the expression appears fourteen times, twelve of them in the recitals, once in Article 1, which states the subject matter of the regulation, and once in Article 95, where it merely refers to the title of the 2019 guidelines. This reference appears in a provision devoted to voluntary codes of conduct, not in a requirement enforceable against a provider. Providers are not required to be &ldquo;trustworthy&rdquo;; they are required to comply with specific requirements.'},{type:"paragraph",content:"Two examples of how conflicts between principles are resolved are worth considering:"},{type:"list",content:['<strong>First example: a balancing option made available, but not imposed.</strong> Non-discrimination versus data minimisation. Detecting bias requires access to sensitive attributes whose processing is generally prohibited under data-protection law. The legislator has removed the obstacle: Article 10(5) authorises, &ldquo;exceptionally&rdquo;<sup id="fnref-en-13"><a href="#fn-en-13">13</a></sup>, the processing of special categories of data for the sole purposes of bias detection and correction, subject to cumulative conditions, including that no other means are available, that the data not be transmitted, and that they be deleted as soon as the bias has been corrected. The Digital Omnibus has extended this legal basis beyond providers of high-risk systems, subject to a strict necessity test and to mandatory safeguards. The resulting trade-off is not, however, what it first appears: the legislator has made bias testing legally possible, but has not required anyone to carry it out. The organisation still decides whether to test, which populations to examine, which metric to use, and what disparity constitutes b
14ias. The legal obstacle has been removed, but the substantive decision remains with the organisation.','<strong>Second example: the reverse situation, in which the trade-off is displaced.</strong> Human oversight versus the usefulness of automation. Article 14 requires &ldquo;effective&rdquo; oversight by natural persons, and at the same time requires that those persons be able to &ldquo;remain aware of the possible tendency of automatically relying or over-relying on the output&rdquo; of the system<sup id="fnref-en-14"><a href="#fn-en-14">14</a></sup>. The regulation prescribes the remedy and names its own failure mode in the same sentence. The tension is shifted to the deployer, whose task is to ensure that oversight is effective, even though its effectiveness cannot be established from documentation alone. Together, these examples define the problem: in the first, the law removes an obstacle without imposing an obligation; in the second, it lays down an obligation while explicitly acknowledging its own weak point. In both cases, the person making the decision is not the person writing the rule.']},{type:"paragraph",content:'Under this test, convergence does not disappear, but what converges changes. What these frameworks genuinely have in common is a method (a risk-based approach, a life-cycle perspective, a duty to document). For the rest, the convergence is real as to the names of the principles; it is absent as to what counts, from one text to the next, as a breach. These texts resolve only a handful of explicitly identified conflicts: the prohibited practices of Article 5, the classification in Annex III, Article 10(5), and the two prohibitions added by the Digital Omnibus. All other conflicts are left to the deployer. Soft law acknowledges this explicitly. NIST writes that trade-offs are usually involved and that human judgment must be used<sup id="fnref-en-15"><a href="#fn-en-15">15</a></sup> in setting the metrics and the threshold values; UNESCO accepts that transparency and explainability may need to be balanced against other principles, such as privacy, safety and security<sup id="fnref-en-16"><a href="#fn-en-16">16</a></sup>. The regulation takes the same approach: for the stand-alone systems listed in points 2 to 8 of Annex III, the provider weighs the competing considerations alone before declaring conformity through the internal-control procedure in Annex VI, a regime that the Digital Omnibus has deferred until 2 December 2027. The deferral changes the date, not the structure.'},{type:"heading",content:"Conclusion: what remains to be decided"},{type:"paragraph",content:"Adopting a policy is not the same as applying a control, and applying a control is not yet proof that it works. We can now see why AI governance frameworks almost all stop at the first of these three levels: compliance with a list that has no hierarchy cannot be demonstrated. The common lexicon is therefore real, but it is no more than a lexicon. It was born of the circulation of a small number of founding texts, and it survives because none of them established a hierarchy, or any rule for resolving conflicts between competing principles. As soon as the three questions at the heart of governance are asked (what has to be demonstrated, to whom, and what happens if compliance cannot be demonstrated), the texts stop answering in the same way. The convergence is real as to the names of the principles; it is absent as to what counts as a breach."},{type:"paragraph",content:"The practical consequence is clear for an organisation subject to one of these frameworks: aligning its internal policies with a list of principles achieves little, because the same list appears everywhere. What varies, and what creates binding obligations, is how conflicts between principles are resolved; no one will make those balancing decisions on behalf of the deploying organisation."},{type:"paragraph",content:"The remaining question is what an enforceable balancing rule looks like. Four elements are enough to distinguish it from an intention: a threshold, a defined population, a measurement protocol, an escalation trigger. Consider a mutual health insurer whose model reads supporting documents and independently decides whether to reimburse claims below a certain amount. The balancing rule should not say &ldquo;we take care to ensure the fairness of our models&rdquo;. It should instead state: the gap in automatic rejection rates between two comparable populations of members must not exceed a specified number of percentage points; it is measured each quarter among claims processed without human intervention; beyond the threshold, automatic delegation is suspended, cases are returned for manual assessment, and the matter is escalated to a specified committee, which records its decision. A regulator can test and challenge a rule of that kind; that is what distinguishes it from a principle."},{type:"heading",content:"References"},{type:"list",content:['<span id="fn-en-1"></span><strong>1.</strong> A. Jobin, M. Ienca and E. Vayena, &ldquo;The global landscape of AI ethics guidelines&rdquo;, <em>Nature Machine Intelligence, 2019;
14 the study identified eighty-four non-binding sets of ethical guidelines worldwide.</em> <a href="#fnref-en-1">&#8617;</a>','<span id="fn-en-2"></span><strong>2.</strong> In order of citation: OECD, Recommendation of the Council on Artificial Intelligence, OECD/LEGAL/0449, adopted on 22 May 2019, revised on 3 May 2024; AI HLEG, Ethics Guidelines for Trustworthy AI, April 2019; UNESCO, Recommendation on the Ethics of Artificial Intelligence, adopted on 23 November 2021; NIST, Artificial Intelligence Risk Management Framework (AI RMF 1.0), NIST AI 100-1, January 2023; Council of Europe Framework Convention on Artificial Intelligence and Human Rights, Democracy and the Rule of Law, CETS No. 225, opened for signature on 5 September 2024; Regulation (EU) 2024/1689 of the European Parliament and of the Council of 13 June 2024 laying down harmonised rules on artificial intelligence, OJ L, 12 July 2024 (hereinafter &ldquo;the regulation&rdquo;). <a href="#fnref-en-2">&#8617;</a>','<span id="fn-en-3"></span><strong>3.</strong> Regulation, recital 27, referring to the Ethics Guidelines for Trustworthy AI drawn up in 2019 by the High-Level Expert Group on Artificial Intelligence (AI HLEG). The OECD principles were endorsed by the G20 in its <em>Ministerial Statement on Trade and Digital Economy</em> of 8 and 9 June 2019. <a href="#fnref-en-3">&#8617;</a>','<span id="fn-en-4"></span><strong>4.</strong> <em>Council of Europe Framework Convention on Artificial Intelligence and Human Rights, Democracy and the Rule of Law</em>, CETS No. 225, opened for signature in Vilnius on 5 September 2024. The substantive principles are set out in Articles 7 to 13, and the procedural safeguards (documentation, challenge, remedy) in Articles 14 and 15. <a href="#fnref-en-4">&#8617;</a>','<span id="fn-en-5"></span><strong>5.</strong> UNESCO, Recommendation on the Ethics of Artificial Intelligence, 2021, principle of &ldquo;awareness and literacy&rdquo;; regulation, Article 4 (AI literacy), applicable since 2 February 2025. <a href="#fnref-en-5">&#8617;</a>','<span id="fn-en-6"></span><strong>6.</strong> Regulation, Articles 40 (harmonised standards and presumption of conformity) and 41 (common specifications). The standardisation request addressed to CEN and CENELEC was formalised by Commission Implementing Decision C(2023) 3215 of 22 May 2023; the work falls to the joint technical committee CEN-CENELEC JTC 21. <a href="#fnref-en-6">&#8617;</a>','<span id="fn-en-7"></span><strong>7.</strong> EN 18286:2026, Artificial intelligence - Quality management system for EU AI Act regulatory purposes, approved by CEN and CENELEC on 12 July 2026 and published at the end of the same month; its reference had not been cited in the Official Journal of the European Union at the time of writing, so no standard yet gives rise to the presumption of conformity under Article 40. Other CEN-CENELEC JTC 21 work items: prEN 18228 (risk management, Art. 9), prEN 18282 (cybersecurity, Art. 15) and prEN 18229-1 at the public enquiry stage; prEN 18283 (bias management, Art. 10) at the drafting stage. Exceptional measures adopted by the technical boards of CEN and CENELEC in October 2025; the target is availability in the fourth quarter of 2026. <a href="#fnref-en-7">&#8617;</a>','<span id="fn-en-8"></span><strong>8.</strong> Regulation (EU) 2026/1744 of 8 July 2026, known as the &ldquo;Digital Omnibus&rdquo; on artificial intelligence, published in the Official Journal of the European Union on 24 July 2026 and entered into force on 27 July 2026, following approval by the European Parliament on 16 June 2026 and adoption by the Council on 29 June 2026. New deadlines: 2 December 2027 for the stand-alone high-risk systems of Annex III, 2 August 2028 for those of Annex I. <a href="#fnref-en-8">&#8617;</a>','<span id="fn-en-9"></span><strong>9.</strong> Correspondences: AI HLEG, <em>Ethics Guidelines for Trustworthy AI</em>, April 2019, Chapter II (seven requirements); OECD, <em>Recommendation cited above</em>, principles 1.1 to 1.5; UNESCO, <em>Recommendation cited above</em>, section III.2; Framework Convention CETS No. 225, Articles 7 to 13, with human primacy addressed in Article 7; NIST, <em>AI RMF 1.0</em>, &sect; 3. <a href="#fnref-en-9">&#8617;</a>','<span id="fn-en-10"></span><strong>10.</strong> Regulation: the expression &ldquo;trustworthy&rdquo; appears fourteen times, twelve of them in the recitals (notably 1, 8 and 27), once in Article 1(1) (subject matter), and once in Article 95(2)(a), where it designates the title of the 2019 guidelines, in a provision relating to voluntary codes of conduct. It appears in no requirement of Chapter III. On societal and environmental well-being: recital 27 and Article 95(2) (voluntary codes of conduct, in particular as regards environmental sustainability). <
14a href="#fnref-en-10">&#8617;</a>','<span id="fn-en-11"></span><strong>11.</strong> AI HLEG, <em>Ethics Guidelines for Trustworthy AI</em>, April 2019, executive summary, guidance derived from Chapter II. <a href="#fnref-en-11">&#8617;</a>','<span id="fn-en-12"></span><strong>12.</strong> NIST, <em>AI RMF 1.0</em>, &sect; 3: &ldquo;trustworthiness is a social concept that ranges across a spectrum and is only as strong as its weakest characteristics&rdquo;. <a href="#fnref-en-12">&#8617;</a>','<span id="fn-en-13"></span><strong>13.</strong> Regulation, Article 10(5), as amended by Regulation (EU) 2026/1744: the legal basis, initially reserved for providers of high-risk systems, is extended to providers and deployers of other AI systems and models, subject to a strict necessity test and to mandatory safeguards (priority recourse to non-sensitive or synthetic data, pseudonymisation, access control, limits on onward sharing, timely deletion). The amendment creates no obligation to detect or correct bias. <a href="#fnref-en-13">&#8617;</a>','<span id="fn-en-14"></span><strong>14.</strong> Regulation, Article 14(1) and (4)(b). <a href="#fnref-en-14">&#8617;</a>','<span id="fn-en-15"></span><strong>15.</strong> NIST, <em>AI RMF 1.0</em>, &sect; 3: &ldquo;tradeoffs are usually involved [...] Human judgment should be employed when deciding on the specific metrics related to AI trustworthiness characteristics and the precise threshold values for those metrics&rdquo;. <a href="#fnref-en-15">&#8617;</a>','<span id="fn-en-16"></span><strong>16.</strong> UNESCO, <em>Recommendation on the Ethics of Artificial Intelligence</em>, 2021, &sect; 38. <a href="#fnref-en-16">&#8617;</a>']}]}},"cadres-de-gouvernance-de-l-ia-un-lexique-commun":{slug:"cadres-de-gouvernance-de-l-ia-un-lexique-commun",title:"Gouvernance de l’IA : un lexique commun ne fait pas un cadre commun",subtitle:"Transparence, robustesse, équité, responsabilité : les mêmes principes reviennent dans tous les cadres de gouvernance de l’IA. La convergence est réelle sur leur nom ; elle est absente sur ce qui compte comme un manquement.",tags:["Gouvernance IA","EU AI Act","Normes","Conformité"],author:{name:"Hugo Medori",role:"AI Researcher",avatar:Ge.url,initials:"HM"},readingTime:"12 MIN",date:"12.08.2026",coverImage:"/blog-ai-governance-frameworks-cover.jpg",altVersion:{label:"English version",slug:"ai-governance-frameworks-common-lexicon"},content:{sections:[{type:"heading",content:"Introduction : des principes en circulation"},{type:"paragraph",content:'Nous assistons depuis une dizaine d&rsquo;années à la multiplication des textes qui prétendent dire ce qu&rsquo;est une IA acceptable. Un recensement publié en 2019 dénombrait déjà quatre-vingt-quatre jeux de lignes directrices éthiques, documents sans force obligatoire produits pour l&rsquo;essentiel par des entreprises, des associations professionnelles et des organisations internationales<sup id="fnref-fr-1"><a href="#fn-fr-1">1</a></sup>. Depuis, la production a moins changé de volume que de nature : elle s&rsquo;est déplacée de la déclaration de principes vers la règle contraignante, et ce déplacement est le sujet de cet article. Qui lit successivement la recommandation de l&rsquo;OCDE sur l&rsquo;intelligence artificielle (2019, révisée en 2024), les lignes directrices du groupe d&rsquo;experts de haut niveau de la Commission (2019), la recommandation de l&rsquo;UNESCO (2021), le cadre de gestion des risques du NIST (2023), la convention-cadre du Conseil de l&rsquo;Europe (2024) et le règlement européen<sup id="fnref-fr-2"><a href="#fn-fr-2">2</a></sup> (dit EU AI Act) en retire une impression d&rsquo;unanimité : transparence, robustesse, équité, responsabilité, contrôle humain. Un consensus international semblerait se former, qu&rsquo;il ne resterait plus qu&rsquo;à mettre en œuvre. Ces six textes forment le corpus de cet article. La norme ISO/IEC 42001, souvent citée dans la même liste, n&rsquo;y figure pas : elle n&rsquo;énonce pas de principes, mais organise un système de management.'},{type:"paragraph",content:'La convergence est réelle sur le nom des principes ; elle est absente sur ce qui compte, d&rsquo;un texte à l&rsquo;autre, comme un manquement. Deux raisons l&rsquo;expliquent. La première tient à ce que la ressemblance n&rsquo;est pas le fruit d&rsquo;une convergence spontanée, mais d&rsquo;une filiation : le considérant 27 du règlement européen cite nommément les sept exigences formulées en 2019 par le groupe d&rsquo;experts de haut niveau de la Commission<sup id="fnref-fr-3"><a href="#fn-fr-3">3</a></sup>, qui reprenaient eux-mêmes les principes que l&rsquo;OCDE venait d&rsquo;adopter et que le G20 avait salués dans l&rsquo;année. Ce ne sont pas cinquante institutions qui se découvrent d&rsquo;accord : ce sont des principes en circulation. La seconde tient à ce que cette parenté s&rsquo;arrête là où commence la gouvernance, c&rsquo;est-à-dire au moment de déterminer comment se démontre le respect d&rsquo;
14un principe, devant qui, et ce que coûte l&rsquo;échec de la démonstration.'},{type:"heading",content:"La fabrique croisée du droit souple et du droit dur"},{type:"paragraph",content:"Classer l&rsquo;ensemble des textes selon qu&rsquo;ils appartiennent au droit souple ou au droit contraignant n&rsquo;est pas particulièrement instructif. Le mécanisme notable est qu&rsquo;ils se fabriquent mutuellement."},{type:"paragraph",content:'Le premier mouvement est ascendant et opère au niveau du contenu. La recommandation de l&rsquo;OCDE de mai 2019 n&rsquo;a pas de valeur juridiquement contraignante, pas plus que celle de l&rsquo;UNESCO, adoptée en novembre 2021 par ses 193 États membres. De plus, les lignes directrices européennes se présentaient elles-mêmes comme non contraignantes. Ce sont pourtant elles qui ont fourni la matière du règlement européen de 2024 : le droit souple a donc ici servi de laboratoire de rédaction au droit dur. La convention-cadre du Conseil de l&rsquo;Europe, ouverte à la signature depuis septembre 2024<sup id="fnref-fr-4"><a href="#fn-fr-4">4</a></sup>, occupe une position intermédiaire, celle d&rsquo;un traité contraignant pour ses parties, mais formulé en obligations de moyens : documenter, permettre la contestation, ouvrir un recours. Par exemple, le principe de &laquo;&nbsp;sensibilisation et éducation&nbsp;&raquo;<sup id="fnref-fr-5"><a href="#fn-fr-5">5</a></sup> énoncé par l&rsquo;UNESCO en 2021 a son équivalent contraignant à l&rsquo;article 4 du règlement, sur la maîtrise de l&rsquo;IA, et à l&rsquo;article 20 de la convention du Conseil de l&rsquo;Europe.'},{type:"paragraph",content:'Le second mouvement est quant à lui descendant et porte sur l&rsquo;opérationnalisation. Le droit souple a alors pour fonction de décliner concrètement, de façon directe ou indirecte, les obligations effectivement contraignantes. Par exemple, l&rsquo;article 40 de l&rsquo;EU AI Act<sup id="fnref-fr-6"><a href="#fn-fr-6">6</a></sup> présume conformes aux exigences légales les systèmes respectant des normes harmonisées. La Commission demande donc aux organisations européennes de normalisation (en l&rsquo;occurrence pour l&rsquo;IA, le comité CEN-CENELEC JTC 21) d&rsquo;en écrire la traduction technique : une norme volontaire, élaborée par un organisme privé reconnu comme organisme de normalisation par l&rsquo;Union européenne, devient le référentiel pratique d&rsquo;une obligation légale. La norme ISO/IEC 42001 et le cadre NIST AI RMF occupent une position différente (la première étant certifiable par un tiers accrédité, contrairement au second), mais aucun des deux ne confère directement la conformité au règlement. Ils n&rsquo;en constituent pas moins des fils conducteurs utiles, puisqu&rsquo;ils fixent des exigences en bonne partie comparables.'},{type:"paragraph",content:'Ce mécanisme suppose toutefois que des normes harmonisées existent. À ce jour, aucune norme du JTC 21 n&rsquo;est citée au Journal officiel de l&rsquo;Union européenne : la présomption de conformité n&rsquo;est ouverte par aucune norme. La première pierre a été posée avec EN 18286, consacrée au système de gestion de la qualité qu&rsquo;exige l&rsquo;article 17 : le CEN et le CENELEC l&rsquo;ont approuvée le 12 juillet 2026 et publiée à la fin du même mois. Mais tant que sa référence n&rsquo;a pas paru au Journal officiel, elle ne produit aucun effet juridique. Les normes sur la gestion des risques (article 9), la cybersécurité (article 15) et les biais (article 10) sont encore à l&rsquo;enquête publique ou en rédaction, malgré les mesures que CEN et CENELEC qualifient eux-mêmes d&rsquo;exceptionnelles, adoptées en octobre 2025.<sup id="fnref-fr-7"><a href="#fn-fr-7">7</a></sup>'},{type:"paragraph",content:'Ce retard a produit l&rsquo;effet le plus révélateur de la période : ce n&rsquo;est pas la norme technique qui a rattrapé la loi, c&rsquo;est la loi qui a attendu la norme. Le règlement (UE) 2026/1744, dit Digital Omnibus, en vigueur depuis le 27 juillet 2026, reporte l&rsquo;application des obligations relatives aux systèmes à haut risque de l&rsquo;annexe III au 2 décembre 2027 et celles de l&rsquo;annexe I au 2 août 2028, au motif assumé que les normes harmonisées et l&rsquo;
14infrastructure d&rsquo;évaluation de la conformité n&rsquo;étaient pas prêtes.<sup id="fnref-fr-8"><a href="#fn-fr-8">8</a></sup> L&rsquo;article 41 permettait pourtant à la Commission d&rsquo;adopter des spécifications communes à défaut de normes harmonisées : elle disposait d&rsquo;un substitut public, elle a préféré déplacer la date. Le droit souple n&rsquo;accompagne donc pas le droit dur, il le conditionne.'},{type:"paragraph",content:"Il reste à préciser ce qu&rsquo;une certification ISO/IEC 42001 démontre, et ce qu&rsquo;elle ne démontre pas. La norme spécifie les exigences d&rsquo;un système de management de l&rsquo;IA. Elle est certifiable par un tiers accrédité, et elle contraint une organisation à écrire qui décide quoi. Elle ne fixe en revanche aucun seuil, et surtout elle ne confère aucune présomption de conformité, que l&rsquo;article 40 réserve aux normes harmonisées. Elle démontre qu&rsquo;une organisation dispose d&rsquo;un système de management de l&rsquo;IA ; elle ne démontre pas qu&rsquo;un système d&rsquo;IA donné satisfait aux exigences du chapitre III."},{type:"paragraph",content:"Il reste à mesurer ce que ces textes partagent réellement, une fois écarté ce qui n&rsquo;est qu&rsquo;un vocabulaire."},{type:"heading",content:" Le même mot, un manquement différent"},{type:"paragraph",content:'Le point le plus évident doit être posé d&rsquo;emblée : il existe bien un noyau de principes communs. Six exigences se retrouvent dans les six textes du corpus, à peu près dans les mêmes termes<sup id="fnref-fr-9"><a href="#fn-fr-9">9</a></sup>, sous des intitulés à peine différents : ce que le groupe d&rsquo;experts européen appelle &laquo;&nbsp;action humaine et contrôle humain&nbsp;&raquo; devient &laquo;&nbsp;supervision et décision humaines&nbsp;&raquo; pour l&rsquo;UNESCO et &laquo;&nbsp;dignité humaine et autonomie personnelle&nbsp;&raquo; à l&rsquo;article 7 de la convention du Conseil de l&rsquo;Europe ; ce que le NIST nomme &laquo;&nbsp;fair with harmful bias managed&nbsp;&raquo; s&rsquo;énonce ailleurs &laquo;&nbsp;équité et non-discrimination&nbsp;&raquo;. Par ailleurs, le concept d&rsquo;IA &laquo;&nbsp;digne de confiance&nbsp;&raquo; (<em>trustworthy</em>) n&rsquo;est pas un principe parmi les autres : c&rsquo;est le nom de la liste. L&rsquo;OCDE, le groupe d&rsquo;experts, le NIST et le considérant 27 rangent tous leurs exigences sous ce chapeau. La liste rétrécit à mesure que les textes considérés sont plus contraignants<sup id="fnref-fr-10"><a href="#fn-fr-10">10</a></sup>.'},{type:"table",content:{headers:["Principe","Droit souple (OCDE, GEHN IA, UNESCO)","NIST 2023 (caractéristiques volontaires)","Conseil de l’Europe 2024 (obligations de moyens)","Règlement (UE) 2024/1689 (du considérant 27 au manquement constatable)"],rows:[["Primauté et contrôle humains","Recommandation","Renvoyée aux fonctions Govern et Map","Art. 7","Exigence opposable, art. 14"],["Robustesse, exactitude, sécurité","Recommandation","Caractéristique","Art. 12","Exigence opposable, art. 15"],["Vie privée et gouvernance des données","Recommandation","Caractéristique","Art. 11","Exigence sur les données, art. 10"],["Transparence et explicabilité","Recommandation","Caractéristique","Art. 8","Exigences, art. 13 et 50"],["Équité et non-discrimination","Recommandation","Caractéristique","Art. 10","Examen et atténuation des biais, art. 10, § 2"],["Responsabilité","Recommandation","Caractéristique","Art. 9","Exigences, art. 16, 17 et 26"],["Bien-être sociétal et environnemental","Recommandation","Absent","Absent","Code de conduite volontaire, art. 95"],["« Digne de confiance »","Chapeau de la liste","Chapeau de la liste","Principe distinct de la fiabilité, art. 12","Objet du règlement, art. 1er ; jamais une exigence"]],caption:"Statut de chaque principe, et ce qui peut compter comme un manquement"}},{type:"paragraph",content:"Lecture : aucune des trois premières colonnes ne crée d&rsquo;obligations pour un opérateur ; la quatrième en crée, mais ces obligations pèsent sur les États parties. Seule la colonne de droite permet de dire ce qui constitue un manquement. Or elle ne reprend aucun principe tel quel : le règlement les convert
14it en exigences précises, et ce sont ces exigences, non les principes dont elles sont issues, qui s&rsquo;imposent au fournisseur."},{type:"paragraph",content:'La convergence est donc réelle sur le nom des principes. Elle ne suffit pas à faire un cadre commun, et un critère simple, applicable à n&rsquo;importe quelle paire de textes, permet de s&rsquo;en convaincre : partagent-ils vraiment un principe, ou seulement son nom ? Ils le partagent si le même fait y compte, de part et d&rsquo;autre, comme un manquement. La convention du Conseil de l&rsquo;Europe et le règlement protègent tous deux la non-discrimination ; mais un écart de taux entre deux populations engage l&rsquo;État pour la première, et le fournisseur pour la seconde, et seulement s&rsquo;il n&rsquo;a pas examiné le biais. Le fait est le même, le manquement ne l&rsquo;est pas. Ce critère a une conséquence directe : là où deux principes également constatables se contredisent, il faut une règle disant lequel cède, sans quoi le manquement redevient indécidable. Une liste sans règle explicite de conflit n&rsquo;est pas un véritable cadre mais seulement un vocabulaire commun. Le document fondateur des règlements européens l&rsquo;avait reconnu, demandant de &laquo;&nbsp;recenser, évaluer, documenter et communiquer de manière continue&nbsp;&raquo; les &laquo;&nbsp;tensions fondamentales entre différents principes&nbsp;&raquo;<sup id="fnref-fr-11"><a href="#fn-fr-11">11</a></sup>. Le mot qui chapeaute la liste est d&rsquo;ailleurs celui qui résiste le moins à ce critère. &laquo;&nbsp;Digne de confiance&nbsp;&raquo; ne désigne pas une propriété du système, mais une relation à celui qui l&rsquo;observe : la confiance s&rsquo;accorde, elle ne se mesure pas, et rien ne peut donc y compter comme un manquement. Le NIST le dit sans détour : la fiabilité est &laquo;&nbsp;un concept social qui s&rsquo;étend sur un spectre&nbsp;&raquo; et &laquo;&nbsp;ne vaut jamais plus que sa caractéristique la plus faible&nbsp;&raquo;<sup id="fnref-fr-12"><a href="#fn-fr-12">12</a></sup>. Le règlement en tire la conséquence dans sa construction : l&rsquo;expression y figure quatorze fois, dont douze dans les considérants, une à l&rsquo;article 1er, qui énonce l&rsquo;objet du règlement, et une à l&rsquo;article 95, où elle désigne seulement le titre des lignes directrices de 2019, dans une disposition consacrée aux codes de conduite d&rsquo;application volontaire, jamais dans une exigence opposable à un fournisseur. Aucun fournisseur n&rsquo;est tenu d&rsquo;être digne de confiance ; il est tenu à des exigences.'},{type:"paragraph",content:"Deux exemples d&rsquo;arbitrage entre les principes méritent d&rsquo;être cités :"},{type:"list",content:['<strong>Premier exemple : un arbitrage rendu disponible, non imposé.</strong> Non-discrimination contre minimisation des données. Détecter un biais suppose de disposer des attributs sensibles que le droit de la protection des données interdit en principe de traiter. Le législateur a levé l&rsquo;obstacle : l&rsquo;article 10, paragraphe 5, autorise &laquo;&nbsp;exceptionnellement&nbsp;&raquo;<sup id="fnref-fr-13"><a href="#fn-fr-13">13</a></sup> le traitement de catégories particulières de données aux seules fins de détection et de correction des biais, sous des conditions cumulatives, dont l&rsquo;impossibilité d&rsquo;y parvenir autrement, l&rsquo;interdiction de transmission et la suppression dès la correction du biais. Le Digital Omnibus a étendu cette base légale au-delà des seuls fournisseurs de systèmes à haut risque, sous un critère de stricte nécessité et sous garanties obligatoires. L&rsquo;arbitrage rendu n&rsquo;est cependant pas celui que l&rsquo;on croit : le législateur a rendu le test de biais juridiquement possible, mais n&rsquo;a obligé personne à le conduire. Il reste à l&rsquo;organisation de décider si elle teste, sur quelles populations, avec quelle métrique et à partir de quel écart il y a biais. L&rsquo;obstacle est levé, mais la décision est intacte.','<strong>Second exemple : l&rsquo;inverse, un arbitrage déplacé.</strong> Contrôle humain contre utilité de l&rsquo;automatisation. L&rsquo;article 14 exige un contrôle &laquo;&nbsp;effectif&nbsp;&raquo; par des personnes physiques, et impose dans le même mouvement que ces personnes puissent &laquo;&nbsp;avoir conscience d&rsquo;une éventuelle tendance à se fier automatiquement ou excessivement aux sorties&nbsp;&raquo; du système<sup id="fnref-fr-14"><a href="#fn-fr-14">14</a></sup>. Le règlement prescrit le remède et désigne sa propre défaillance dans la même phrase. La tension est déplacée vers le déployeur, à qui il revient de rendre effective une surveillance dont l&rsquo;effectivité ne se lit pas dans un document. Les deux exemples encadrent le problème : dans le premier, le droit lève un obstacle et n&rsquo;oblige à rien ; dans le second, il pose une obligation dont il nomme lui-même la faiblesse. Dans les deux cas, celui qui décide n&rsquo;est pas celui qui écrit.']},{type:"paragraph",content:'Soumise à ce critère, la convergence ne disparaît pas, mais elle change d&rsquo;objet. Ce que ces cadres ont réellement en commun est une méthode (approche par les risques, raisonnement sur le cycle de vie, obligation de documenter). Pour le reste, la convergence est réelle sur le nom des principes ; elle est absente sur ce qui compte, d&rsquo;un texte à l&rsquo;autre, comme un manquement. Ces textes n&rsquo;arbitrent que sur une poignée de conflits nommés : les pratiques interdites de l&rsquo;article 5, la classification de l&rsquo;
14annexe III, l&rsquo;article 10, paragraphe 5, et les deux interdictions ajoutées par le Digital Omnibus. Tous les autres conflits sont laissés à celui qui déploie. Le droit souple l&rsquo;assume ouvertement. Le NIST écrit que &laquo;&nbsp;des arbitrages sont généralement en jeu&nbsp;&raquo; et que &laquo;&nbsp;le jugement humain doit être mobilisé&nbsp;&raquo;<sup id="fnref-fr-15"><a href="#fn-fr-15">15</a></sup> pour fixer les métriques et les valeurs de seuil ; l&rsquo;UNESCO admet qu&rsquo;&laquo;&nbsp;il peut être nécessaire de trouver un équilibre entre la transparence et l&rsquo;explicabilité et d&rsquo;autres principes, tels que la protection de la vie privée, la sûreté et la sécurité&nbsp;&raquo;<sup id="fnref-fr-16"><a href="#fn-fr-16">16</a></sup>. Le règlement ne fait pas autrement : pour les systèmes autonomes des points 2 à 8 de l&rsquo;annexe III, c&rsquo;est le fournisseur qui pondère, seul, avant de se déclarer conforme selon la procédure de contrôle interne de l&rsquo;annexe VI, régime dont le Digital Omnibus a reporté l&rsquo;entrée en application au 2 décembre 2027. Le report change la date, pas la structure.'},{type:"heading",content:"Conclusion : ce qu’il reste à décider"},{type:"paragraph",content:"Une politique adoptée n&rsquo;est pas un contrôle appliqué, et un contrôle appliqué n&rsquo;est pas encore la preuve qu&rsquo;il fonctionne. On voit maintenant pourquoi les cadres de gouvernance de l&rsquo;IA s&rsquo;arrêtent presque tous au premier de ces trois niveaux : on ne démontre pas le respect d&rsquo;une liste sans hiérarchie. Le lexique commun est donc réel, mais il n&rsquo;est qu&rsquo;un lexique. Il est né de la circulation d&rsquo;un petit nombre de textes fondateurs et il survit parce qu&rsquo;aucun d&rsquo;eux n&rsquo;a établi de hiérarchie, ni de règle d&rsquo;arbitrage entre des principes concurrents. Dès que l&rsquo;on pose les trois questions qui font une gouvernance (que faut-il démontrer, devant qui, et qu&rsquo;arrive-t-il si la démonstration manque), les textes cessent de répondre de la même façon. La convergence est réelle sur le nom des principes ; elle est absente sur ce qui compte comme un manquement."},{type:"paragraph",content:"La conséquence est directe pour une organisation soumise à l&rsquo;un de ces cadres : aligner ses politiques internes sur une liste de principes ne l&rsquo;avance guère, puisque cette liste est partout la même. Ce qui varie, et ce qui oblige, ce sont les arbitrages, et personne ne les rendra à la place de l&rsquo;organisation qui déploie."},{type:"paragraph",content:"Il reste à savoir à quoi ressemble un arbitrage opposable. Quatre éléments suffisent à le distinguer d&rsquo;une intention : un seuil, une population concernée, un protocole de mesure, un déclencheur d&rsquo;escalade. Dans une mutuelle santé dont un modèle lit les pièces justificatives et décide seul du remboursement en deçà d&rsquo;un certain montant, l&rsquo;arbitrage ne s&rsquo;écrit pas &laquo;&nbsp;nous veillons à l&rsquo;équité de nos modèles&nbsp;&raquo;, mais : l&rsquo;écart de taux de rejet automatique entre deux populations comparables d&rsquo;adhérents ne dépasse pas tel nombre de points ; il est mesuré chaque trimestre sur les demandes liquidées sans intervention humaine ; au-delà du seuil, la délégation automatique est suspendue, les dossiers repassent en instruction manuelle et la décision remonte à tel comité, qui en conserve la trace. Une autorité peut contredire une telle phrase, et c&rsquo;est ce qui la distingue d&rsquo;un principe."},{type:"heading",content:"Références"},{type:"list",content:['<span id="fn-fr-1"></span><strong>1.</strong> A. Jobin, M. Ienca et E. Vayena, &laquo;&nbsp;The global landscape of AI ethics guidelines&nbsp;&raquo;, <em>Nature Machine Intelligence, 2019 : 84 documents de lignes directrices éthiques, sans force obligatoire, recensés au niveau mondial.</em> <a href="#fnref-fr-1">&#8617;</a>','<span id="fn-fr-2"></span><strong>2.</strong> Par ordre de citation : OCDE, Recommandation du Conseil sur l’intelligence artificielle, OECD/LEGAL/0449, adoptée le 22 mai 2019, révisée le 3 mai 2024 ; GEHN IA, Lignes directrices en matière d’éthique pour une IA digne de confiance, avril 2019 ; UNESCO, Recommandation sur l’éthique de l’intelligence artificielle, adoptée le 23 novembre 2021 ; NIST, Artificial Intelligence Risk Management Framework (AI RMF 1.0), NIST AI 100-1, janvier 2023 ; convention-cadre du Conseil de l’Europe sur l’intelligence artificielle et les droits de l’homme, la démocratie et l’État de droit, STCE n° 225, ouverte à la signature le 5 septembre 2024 ; règlement (UE) 2024/1689 du Parlement européen et du Conseil du 13 juin 2024 établissant des règles harmonisées concernant l’intelligence artificielle, JO L du 12 juillet 2024 (ci-après &laquo;&nbsp;le règlement&nbsp;&raquo;). <a href="#fnref-fr-2">&#8617;</a>','<span id="fn-fr-3"></span><strong>3.</strong> Règlement, considérant 27, renvoyant aux lignes directrices en matière d’éthique pour une IA digne de confiance élaborées en 2019 par le groupe d’experts de haut niveau sur l’intelligence artificielle (GEHN IA). Les principes de l’OCDE ont été salués par le G20 dans sa <em>déclaration ministérielle sur le commerce et l’économie numérique</em> des 8 et 9 juin 2019. <a href="#fnref-fr-3">&#8617;</a>','<span id="fn-fr-4"></span><strong>4.</strong> <em>Convention-cadre du Conseil de l’Europe sur l’intelligence artificielle et les droits de l’homme, la démocratie et l’État de droit</em>, STCE n° 225, ouverte à la signature à Vilnius le 5 septembre 2024. Les principes de fond figurent aux articles 7 à 13, les garanties procédurales &mdash; documentation, contestation, recours &mdash; aux articles 14 et 15. <a href="#fnref-fr-4">&#8617;</a>','<span id="fn-fr-5"></span><strong>5.</strong> UNESCO, Recommandation sur l’éthique de l’intelligence artificielle, 2021, principe &laquo;&nbsp;sensibilisation et éducation&nbsp;&raquo; ; règlement, article 4 (maîtrise de l’IA), applicable depuis le 2 février 2025. <a href="#fnref-fr-5">&#8617;</a>','<span id="fn-fr-6"></span><strong>6.</strong> Règlement, articles 40 (normes harmonisées et présomption de conformité) et 41 (spécifications communes). La demande de normalisation adressée au CEN et au CENELEC a été formalisée par la décision d’exécution C(2023) 3215 de la Commission du 22 mai 2023 ;
14 les travaux relèvent du comité technique mixte CEN-CENELEC JTC 21. <a href="#fnref-fr-6">&#8617;</a>','<span id="fn-fr-7"></span><strong>7.</strong> EN 18286:2026, Artificial intelligence &mdash; Quality management system for EU AI Act regulatory purposes, approuvée par le CEN et le CENELEC le 12 juillet 2026 et publiée à la fin du même mois ; sa référence n’était pas citée au Journal officiel de l’Union européenne à la date de rédaction, de sorte que la présomption de conformité de l’article 40 n’est ouverte par aucune norme. Autres travaux du CEN-CENELEC JTC 21 : prEN 18228 (gestion des risques, art. 9), prEN 18282 (cybersécurité, art. 15) et prEN 18229-1 au stade de l’enquête publique ; prEN 18283 (gestion des biais, art. 10) en rédaction. Mesures exceptionnelles adoptées par les conseils techniques du CEN et du CENELEC en octobre 2025 ; objectif de disponibilité fixé au quatrième trimestre 2026. <a href="#fnref-fr-7">&#8617;</a>','<span id="fn-fr-8"></span><strong>8.</strong> Règlement (UE) 2026/1744 du 8 juillet 2026, dit &laquo;&nbsp;Digital Omnibus&nbsp;&raquo; sur l’intelligence artificielle, publié au Journal officiel de l’Union européenne le 24 juillet 2026 et entré en vigueur le 27 juillet 2026, après approbation par le Parlement européen le 16 juin 2026 et adoption par le Conseil le 29 juin 2026. Nouvelles échéances : 2 décembre 2027 pour les systèmes à haut risque autonomes de l’annexe III, 2 août 2028 pour ceux de l’annexe I. <a href="#fnref-fr-8">&#8617;</a>','<span id="fn-fr-9"></span><strong>9.</strong> Correspondances : GEHN IA, <em>Lignes directrices en matière d’éthique pour une IA digne de confiance</em>, avril 2019, chapitre II (sept exigences) ; OCDE, <em>Recommandation précitée</em>, principes 1.1 à 1.5 ; UNESCO, <em>Recommandation précitée</em>, section III.2 ; convention-cadre STCE n° 225, articles 7 à 13, la primauté de l’humain figurant à l’article 7 ; NIST, <em>AI RMF 1.0</em>, &sect; 3. <a href="#fnref-fr-9">&#8617;</a>','<span id="fn-fr-10"></span><strong>10.</strong> Règlement : l’expression &laquo;&nbsp;digne de confiance&nbsp;&raquo; y figure quatorze fois, dont douze dans les considérants (notamment 1, 8 et 27), une à l’article premier, paragraphe 1 (objet), et une à l’article 95, paragraphe 2, point a), où elle désigne le titre des lignes directrices de 2019, dans une disposition relative aux codes de conduite d’application volontaire. Elle ne figure dans aucune exigence du chapitre III. Sur le bien-être sociétal et environnemental : considérant 27 et article 95, paragraphe 2 (codes de conduite volontaires, notamment quant à la durabilité environnementale). <a href="#fnref-fr-10">&#8617;</a>','<span id="fn-fr-11"></span><strong>11.</strong> GEHN IA, <em>Lignes directrices en matière d’éthique pour une IA digne de confiance</em>, avril 2019, résumé, orientations dérivées du chapitre II. <a href="#fnref-fr-11">&#8617;</a>','<span id="fn-fr-12"></span><strong>12.</strong> NIST, <em>AI RMF 1.0</em>, &sect; 3 : &laquo;&nbsp;trustworthiness is a social concept that ranges across a spectrum and is only as strong as its weakest characteristics&nbsp;&raquo; (traduction de l’auteur). <a href="#fnref-fr-12">&#8617;</a>','<span id="fn-fr-13"></span><strong>13.</strong> Règlement, article 10, paragraphe 5, tel que modifié par le règlement (UE) 2026/1744 : la base légale, initialement réservée aux fournisseurs de systèmes à haut risque, est étendue aux fournisseurs et aux déployeurs d’autres systèmes et modèles d’IA, sous un critère de stricte nécessité et sous garanties obligatoires (recours prioritaire à des données non sensibles ou synthétiques, pseudonymisation, contrôle des accès, limitation des partages ultérieurs, suppression en temps utile). La modification n’institue aucune obligation de détecter ou de corriger les biais. <a href="#fnref-fr-13">&#8617;</a>','<span id="fn-fr-14"></span><strong>14.</strong> Règlement, article 14, paragraphes 1 et 4, point b). <a href="#fnref-fr-14">&#8617;</a>','<span id="fn-fr-15"></span><strong>15.</strong> NIST, <em>AI RMF 1.0</em>, &sect; 3 : &laquo;&nbsp;tradeoffs are usually involved [...] Human judgment should be employed when deciding on the specific metrics related to AI trustworthiness characteristics and the precise threshold values for those metrics&nbsp;&raquo; (traduction de l’auteur). <a href="#fnref-fr-15">&#8617;</a>','<span id="fn-fr-16"></span><strong>16.</strong> UNESCO, <em>Recommandation sur l’éthique de l’intelligence artificielle</em>, 2021, &sect; 38. <a href="#fnref-fr-16">&#8617;</a>']}]}},"de-la-gouvernance-it-a-la-gouvernance-de-l-ia":{slug:"de-la-gouvernance-it-a-la-gouvernance-de-l-ia",title:"De la gouvernance IT à la gouvernance de l'IA : ce qui change vraiment",subtitle:"La gouvernance IT a mis vingt ans à mûrir. Les systèmes d'IA en bousculent plusieurs présupposés : chaque exigence de gouvernance doit désormais devenir mesurable et testable.",tags:["Gouvernance IA","Gouvernance IT","Gestion des risques","Conformité"],author:{name:"Hugo Medori",role:"AI Researcher",avatar:Ge.url,initials:"HM"},readingTime:"10 MIN",date:"04.08.2026",coverImage:"/blog-it-to-ai-governance-cover.jpg",altVersion:{label:"English version",slug:"from-it-governance-to-ai-governance"},content:{sections:[{type:"heading",content:"Introduction"},{type:"paragraph",content:"Une caisse maladie de taille moyenne confie à un modèle d'IA la décision de rembourser seul certains dossiers, et à un autre la rédaction des réponses à ses assurés. Qui, dans cette organisation, décide encore réellement ? C'est la question centrale que pose aujourd'hui la gouvernance de l'IA, et elle oblige à revisiter ce que la gouvernance de l'IT avait mis des années à établir."}
14,{type:"paragraph",content:"Longtemps réduite à une fonction support gérée pour des raisons techniques, l'informatique est devenue, à partir des années 2000, un enjeu de gouvernance à part entière. Selon la définition de l'OCDE, gouverner consiste à « déterminer la structure par laquelle sont définis les objectifs d'une entreprise, les moyens de les atteindre et le suivi des résultats obtenus », une logique à laquelle les systèmes IT n'échappent pas, dès lors qu'ils mobilisent des ressources significatives et engagent l'entreprise dans la durée."},{type:"paragraph",content:"Ce passage d'une gestion technique de l'IT à sa gouvernance, définie comme un « cadre de droits de décision et de responsabilité pour encourager un comportement souhaitable dans l'usage de l'IT », constitue un changement d'approche décisif : quelles technologies employer, pour quelles finalités, avec quels risques, sous quelle responsabilité, et selon quels critères de performance ?"},{type:"heading",content:"Les grands enjeux de la gouvernance IT"},{type:"paragraph",content:"On peut identifier quatre axes majeurs qui structurent la gouvernance de l'IT."},{type:"paragraph",content:"<strong>L'alignement stratégique</strong> consiste à garantir que les choix technologiques servent les objectifs de l'entreprise et, réciproquement, que les possibilités techniques nourrissent la réflexion stratégique. La question de gouvernance est simple à formuler et souvent difficile à trancher : à quel objectif d'entreprise ce système répond-il, et comment saurons-nous qu'il y répond ? La défaillance typique n'est pas l'absence de stratégie, mais l'existence de projets techniquement légitimes et stratégiquement orphelins. Un portefeuille d'initiatives qui reflète l'organigramme plutôt que les priorités de l'entreprise en est le signe le plus courant : chaque direction obtient ses outils, personne n'arbitre entre eux. La gouvernance devrait alors pouvoir exiger que chaque investissement significatif soit rattaché à un objectif identifiable et à un indicateur métier, et non à la seule obsolescence de la solution qu'il remplace."},{type:"paragraph",content:"<strong>La maîtrise des risques et la résilience</strong> combinent deux exigences souvent confondues, alors qu'elles se situent de part et d'autre du même événement. La maîtrise des risques se joue avant : identifier ce qui peut arriver, en estimer la probabilité et les conséquences, hiérarchiser, traiter, puis accepter explicitement ce qui subsiste. La résilience se joue après : lorsque la prévention a échoué, que reste-t-il de capacité à absorber le choc, à fonctionner en mode dégradé, à revenir à la normale et à apprendre de l'incident ?"},{type:"paragraph",content:"<strong>L'optimisation des ressources et de la valeur créée</strong> est également cruciale. Il faut alors distinguer le coût, qui s'estime avant ; la ressource, qui est une capacité (budget, compétences disponibles, aptitude des équipes à absorber le changement et actifs réemployables) ; la valeur, enfin, qui ne se constate qu'après."},{type:"paragraph",content:"En dernier lieu, <strong>l'organisation de la responsabilité du pilotage</strong> suppose à la fois de distinguer des rôles que l'on amalgame volontiers (décision, mise en œuvre, contrôle, reddition de comptes…) en veillant à ce que le responsable désigné dispose des moyens et de l'autorité correspondants, et d'inscrire la prise en compte des enjeux de gouvernance dans la durée."},{type:"heading",content:"Les grands cadres existants"},{type:"paragraph",content:"Les grands cadres d'évaluation de la gouvernance IT doivent être considérés moins comme des rivaux que comme mutuellement complémentaires, puisqu'ils mettent chacun l'accent sur une dimension différente. Ils ont atteint aujourd'hui un degré élevé de maturité."},{type:"paragraph",content:"Deux cadres s'adressent directement aux organes de gouvernance. <strong>ISO/IEC 38500</strong> est le seul référentiel dont l'objet soit explicitement la gouvernance de l'IT : il énonce des principes directeurs pour un usage « efficace, efficient et acceptable » des technologies, mais ne fournit ni processus ni exigences auditables. La dernière édition (2024) intègre des sujets devenus incontournables : migration vers le cloud, gouvernance de l'IA, travail à distance, éthique numérique, durabilité."},{type:"paragraph",content:"<strong>COBIT</strong>, publié par l'ISACA, adopte l'approche inverse : c'est le cadre le plus détaillé, structuré autour d'une séparation stricte entre gouvernance (un seul domaine, Evaluate, Direct and Monitor) et management (les autres domaines), afin de matérialiser, dans l'architecture même du référentiel, la différence entre décider et mettre en œuvre. Une mise à jour est annoncée par l'ISACA pour le second semestre 2026, en grande partie sous forme numérique, avec un module d'auto-évaluation."},{type:"paragraph",content:"Trois référentiels définissent quant à eux les conditions d'exécution des décisions, ce qui constitue le complément naturel des cadres précédents plutôt que des cadres de gouvernance à proprement parler. <strong>ISO/IEC 27001</strong> structure le management de la sécurité de l'information selon une logique de bouclage (risques, mesures, surveillance, amélioration continue) qui vaut bien au-delà de son périmètre. <strong>ITIL</strong> et <strong>ISO/IEC 20000</strong> encadrent la gestion des services : disponibilité, incidents, changements, niveaux de service. Une nouvelle version d'ITIL est déployée progressivement depuis 2026, avec un module d'extension consacré à la gouvernance de l'IA. Le <strong>NIST Cybersecurity Framework</strong>, dans sa version 2.0, mérite une mention particulière : il a ajouté aux fonctions techniques historiques une fonction Govern, reconnaissant que la gestion du risque cyber ne se soutient pas sans décision et responsabilité au niveau de l'organisation."},{type:"image",content:{src:Ks.url,alt:"Schéma circulaire représentant les six fonctions piliers du cadre NIST 2.0 : Identifier, Protéger, Détecter, Répondre, Récupérer, avec Gouverner au centre",caption:"Les six fonctions piliers du cadre NIST 2.0, comprenant la fonction « gouverner » au centre"}},{type:"heading",content:"De nouvelles questions à l'heure de l'IA"},{type:"paragraph",content:"À la différence des systèmes IT classiques, les systèmes d'IA soulèvent de nouvelles problématiques qui modifient en profondeur les cadres de gouvernance nécessaires."}
14,{type:"paragraph",content:"Un système d'IA peut se définir, selon le NIST et l'OCDE, comme un système qui, pour un ensemble d'objectifs donnés, génère des sorties (prédictions, recommandations, décisions) influençant des environnements réels ou virtuels. Ce qui le distingue d'un logiciel classique, c'est la nature de ce qui est vérifié. Un logiciel classique applique des règles explicites : sa vérification produit un verdict, conforme ou non conforme. Un système d'IA généralise un comportement appris à partir de données : sa performance devient une mesure (taux d'erreur, dispersion, performance par segment de population ou par type de cas), non nulle et non uniforme, y compris lorsque son exécution est déterministe. La gouvernance doit donc reformuler ses exigences, en passant de la question « le système fonctionne-t-il ? » à « quel niveau d'erreur acceptons-nous, sur quels cas, et à partir de quel seuil interrompons-nous l'usage ? »."},{type:"paragraph",content:"De plus, alors que les procédures classiques peuvent atteindre l'exhaustivité en énumérant les fonctions attendues, les systèmes d'IA opèrent sur des espaces d'entrée ouverts. La maîtrise d'un système d'IA réside alors moins dans le système lui-même que dans les limites qui encadrent son utilisation."},{type:"paragraph",content:"Un contrôle informatique classique reste valide tant que le code, la configuration et l'environnement ne changent pas. La gestion du changement peut donc s'appuyer sur les versions et les mises en production. Un système d'IA, lui, peut se dégrader alors que rien n'a été modifié : les données d'entrée évoluent, les usages se déplacent, la réalité que le modèle représentait n'est plus tout à fait la même. La vérification doit devenir périodique ou continue, avec des indicateurs suivis en production et des seuils déclenchant une réévaluation."},{type:"paragraph",content:"L'audit classique s'appuie largement sur l'examen de la conception en lisant une règle, en retraçant un traitement ou en reconstituant le chemin d'une décision. Cette voie reste étroite avec des modèles dont le fonctionnement interne n'est pas lisible sous forme de règles explicites. Ce que l'on ne peut pas déduire de la conception doit alors être établi par l'expérimentation systématique sur des cas choisis."},{type:"heading",content:"Un exemple concret"},{type:"paragraph",content:"Une caisse maladie de taille moyenne : 900 salariés, 600 000 assurés, environ 12 millions de demandes de remboursement traitées par an, un centre de relation client qui absorbe 500 000 appels et 1,2 million de courriels. Le cœur du système d'information est un applicatif de gestion des prestations enrichi par couches successives depuis une vingtaine d'années."},{type:"paragraph",content:"Elle engage deux projets qui implémentent des systèmes d'IA. Un modèle lit les pièces justificatives, en extrait les données et décide seul du remboursement sous un certain montant. Un assistant rédige les réponses aux courriels des assurés, qu'un conseiller valide avant envoi. Les quatre axes classiques de la gouvernance se trouvent alors déplacés :"},{type:"list",content:["<strong>Alignement stratégique :</strong> L'objectif métier ne précède plus le choix technique : la capacité existe, et l'organisation cherche où l'appliquer. La question n'est donc plus « quelle technologie sert cet objectif ? » mais « cet objectif justifie-t-il ce risque ? ». Fixer le seuil d'automatisation, c'est décider comment l'erreur se répartit : un assuré non remboursé alors qu'il devait l'être et un remboursement indu n'ont ni le même coût, ni la même visibilité, ni les mêmes conséquences.","<strong>Risque et résilience :</strong> le non-déterminisme n'est pas une propriété générale des systèmes d'IA. Il concerne surtout les grands modèles de langage au moment de l'échantillonnage, et ne doit pas être c
14onfondu avec le caractère probabiliste du modèle lui-même, qui peut être calculé de façon déterministe. La gouvernance ne doit donc pas se demander si le système fonctionne, mais quel niveau d'erreur est acceptable, en quels cas, et à partir de quel seuil nous devons en interrompre l'usage.","<strong>Mesure du coût et de la valeur :</strong> facturé à l'usage, le coût croît avec l'adoption. Le succès du projet dégrade donc son modèle économique, et le dossier d'investissement doit raisonner par scénarios de volume plutôt que par montant. La valeur devient difficile à attribuer. Une baisse du délai de traitement vient-elle du modèle, d'un autre chantier mené en parallèle, ou d'une variation saisonnière ? Sans mesure établie avant déploiement, la caisse maladie ne pourra ni confirmer ni infirmer le bénéfice annoncé.","<strong>La question de la responsabilité :</strong> l'assistant s'accompagne d'une validation humaine, ce qui semble régler la question de la supervision. Mais si le conseiller dispose de quelques dizaines de secondes par message et valide la quasi-totalité des propositions, la supervision est documentée sans être effective : elle déplace la responsabilité sur un salarié qui n'a pas les moyens de l'assumer."]},{type:"heading",content:"Conclusion"},{type:"paragraph",content:"Les cadres existants déterminent ce qu'il faut décider, qui doit décider, et selon quelle logique de responsabilité. Ils ne disent en revanche rien sur la façon de vérifier qu'une décision reste valide dans le temps, question qui devient centrale avec l'arrivée des systèmes d'IA."},{type:"paragraph",content:"Avec ces derniers, chaque exigence de gouvernance doit pouvoir se traduire en quelque chose de mesurable et testable : un seuil d'erreur, un indicateur suivi en production, un protocole d'expérimentation. C'est cette traduction, plus que les cadres eux-mêmes, que nous explorerons dans les prochains articles de notre série."},{type:"heading",content:"Références"},{type:"list",content:["OECD Principles of Corporate Governance, 1999, p. 13.","<a href='https://www.bbs.unibo.it/en/it-governance-vs-it-management-who-does-what-a-strategic-guide-for-managers/#gref' target='_blank' rel='noopener noreferrer' class='text-primary underline'>IT Governance vs IT Management: who does what, Bologna Business School</a>.","IT Governance, Peter Weill et Jeanne W. Ross, Harvard Business School Press, 2004, p. 8.","Board Briefing on IT Governance, ITGI, 2e édition, 2003.","ISO/IEC 38500:2024, Information technology: Governance of IT for the organization, 3e édition.","ISACA, « Celebrating Three Decades of COBIT », @ISACA, 2026, vol. 8.","<a href='https://nvlpubs.nist.gov/nistpubs/CSWP/NIST.CSWP.29.fre.pdf' target='_blank' rel='noopener noreferrer' class='text-primary underline'>NIST Cybersecurity Framework 2.0 (version française)</a>."]}]}},"from-it-governance-to-ai-governance":{slug:"from-it-governance-to-ai-governance",title:"From IT governance to AI governance: what actually changes",subtitle:"IT governance took twenty years to mature. AI systems challenge several of its core assumptions: every governance requirement must now become measurable and testable.",tags:["AI Governance","IT Governance","Risk Management","Compliance"],author:{name:"Hugo Medori",role:"AI Researcher",avatar:Ge.url,initials:"HM"},readingTime:"10 MIN",date:"04.08.2026",coverImage:"/blog-it-to-ai-governance-cover.jpg",altVersion:{label:"Version française",slug:"de-la-gouvernance-it-a-la-gouvernance-de-l-ia"},content:{sections:[{type:"heading",content:"Introduction"},{type:"paragraph",content:"A mid-sized health insurer hands one AI model the decision to settle certain claims on its own, and another the drafting of the replies sent to its policyholders. Who, in that organization, is still actually deciding? This is the central question AI governance raises today, and it forces us to revisit what IT governance took years to establish."},{type:"paragraph",content:`Long treated as a support function managed on technical grounds, IT became a governance matter in its own right from the 2000s onward. In the OECD's formulation, to govern is to provide "the structure through which the objectives of the company are set", together with the means of attaining them and of monitoring performance, a logic that IT systems do not escape, since they draw on significant resources and commit the company over the long term.`},{type:"paragraph",content:'This shift from managing IT technically to governing it, governance being defined as a framework of decision rights and accountability meant to "encourage desirable behavior in the use of IT", marks a decisive change of approach: which technologies to use, for what purposes, with what risks, under whose responsibility, and against what performance criteria?'},{type:"heading",content:"The main issues in IT governance"},{type:"paragraph",content:"Four main axes structure the governance of IT."},{type:"paragraph",content:"<strong>Strategic alignment</strong> means making sure that technology choices serve the objectives of the company and, conversely, that technical possibilities feed strategic thinking. The governance question is easy to state and often hard to settle: which business objective does this 
14system serve, and how will we know that it does? The typical failure is not the absence of a strategy but the existence of projects that are technically legitimate and strategically orphaned."},{type:"paragraph",content:"The most common sign is a portfolio of initiatives that mirrors the org chart rather than the priorities of the company: each department gets its own tools and nobody arbitrates between them. Governance should then be in a position to require that every significant investment be tied to an identifiable objective and to a business indicator, and not merely to the obsolescence of the solution it replaces."},{type:"paragraph",content:"<strong>Risk management and resilience</strong> combine two requirements that are often conflated, although they sit on either side of the same event. Risk management plays out beforehand: identifying what can happen, estimating its likelihood and its consequences, ranking, treating, then explicitly accepting whatever remains. Resilience plays out afterward: once prevention has failed, what capacity is left to absorb the shock, to operate in degraded mode, to return to normal and to learn from the incident?"},{type:"paragraph",content:"<strong>Making the best use of resources and of the value created</strong> matters just as much. Three things then need to be kept apart: cost, which is estimated beforehand; resources, which are a capacity (budget, available skills, the ability of teams to absorb change and assets that can be reused); and value, which can only be observed afterward."},{type:"paragraph",content:"Finally, <strong>organizing accountability for steering</strong> means both separating roles that are readily conflated (deciding, implementing, controlling, reporting and so on) while making sure that the person designated has the corresponding means and authority, and keeping governance questions on the agenda over time."},{type:"heading",content:"The frameworks available today"},{type:"paragraph",content:"The main frameworks for assessing IT governance are better read as complementing one another than as competing, since each puts the emphasis on a different dimension. They have now reached a high level of maturity."},{type:"paragraph",content:'Two frameworks speak directly to governing bodies. <strong>ISO/IEC 38500</strong> is the only standard whose explicit subject is the governance of IT: it sets out guiding principles for an "effective, efficient and acceptable" use of technology, but it provides neither processes nor auditable requirements. Its latest edition (2024) takes in subjects that have become impossible to ignore: migration to the cloud, AI governance, remote work, digital ethics and sustainability.'},{type:"paragraph",content:"<strong>COBIT</strong>, published by ISACA, takes the opposite approach: it is the most detailed of the frameworks, built around a strict separation between governance (a single domain, Evaluate, Direct and Monitor) and management (all the others), so that the difference between deciding and implementing is written into the architecture of the framework itself. ISACA has announced an update for the second half of 2026, largely in digital form, with a self-assessment module."},{type:"paragraph",content:"Three further standards set out the conditions under which decisions are carried out, which makes them the natural complement to the frameworks above rather than governance frameworks in their own right. <strong>ISO/IEC 27001</strong> structures the management of information security around a closed loop (risks, controls, monitoring, continual improvement) whose value reaches well beyond its own scope. <strong>ITIL</strong> and <strong>ISO/IEC 20000</strong> cover service management: availability, incidents, changes, service levels. A new version of ITIL has been rolling out gradually since 2026, with an extension module devoted to AI governance. The <strong>NIST Cybersecurity Framework</strong>, in its version 2.0, deserves a mention of its own: it has added a Govern function to the historical technical functions, recognizing that managing cyber risk cannot be sustained without decisions and accountability at the level of the organization."},{type:"image",content:{src:Ks.url,alt:"Diagram of the six core functions of the NIST Cybersecurity Framework 2.0 with Govern at the center",caption:"The six core functions of the NIST CSF 2.0, with the “Govern” function at the center"}},{type:"heading",content:"New questions in the age of AI"},{type:"paragraph",content:"Unlike conventional IT systems, AI systems raise new problems that change what governance frameworks have to cover."},{type:"paragraph",content:'An AI system can be defined, following NIST and the OECD, as a system that, for a given set of objectives, produces outputs (predictions, recommendations, decisions) influencing real or virtual environments. What sets it apart from conventional software is the nature of what gets verified. Conventional software applies explicit rules: verifying it yields a verdict, compliant or non-compliant. An AI system generalizes a behavior learned from data: its performance becomes a measurement (error rate, dispersion, performance by population segment or by type of case), non-zero and not uniform, even when its execution is deterministic. Governance therefore has to restate its requirements, moving from "does the system work?" to "what level of error do we accept, on which cases, and beyond what threshold do we stop using it?"'},{type:"paragraph",content:"What is more, whereas conventional procedures can be exhaustive by listing the functions expected of a system, AI systems operate over open input spaces. Control over an AI system therefore lies less in the system itself than 
14in the limits placed around its use."},{type:"paragraph",content:"A conventional IT control stays valid as long as the code, the configuration and the environment do not change. Change management can therefore rely on versions and releases. An AI system, by contrast, can degrade even though nothing has been modified: input data shifts, patterns of use change, the reality the model represented is no longer quite the same. Verification has to become periodic or continuous, with indicators monitored in production and thresholds that trigger a reassessment."},{type:"paragraph",content:"Conventional audit leans heavily on examining design, by reading a rule, retracing a piece of processing or reconstructing the path of a decision. That route stays narrow with models whose inner workings cannot be read as explicit rules. Whatever cannot be inferred from design then has to be established by systematic experiment on selected cases."},{type:"heading",content:"A worked example"},{type:"paragraph",content:"A mid-sized health insurer: 900 employees, 600,000 policyholders, some 12 million reimbursement claims processed a year, a customer service center absorbing 500,000 calls and 1.2 million emails. At the heart of the information system sits a claims application extended layer by layer over some twenty years."},{type:"paragraph",content:"The insurer starts two projects built on AI systems. One model reads supporting documents, extracts the data and, below a certain amount, decides on the reimbursement on its own. An assistant drafts the replies to policyholder emails, which an adviser approves before they are sent. The four classic governance axes then shift:"},{type:"list",content:['<strong>Strategic alignment:</strong> the business objective no longer comes before the technical choice. The capability exists, and the organization looks for somewhere to apply it. The question is no longer "which technology serves this objective?" but "does this objective justify this risk?" Setting the automation threshold means deciding how error is distributed: a policyholder who is not reimbursed when they should have been and a payment made in error do not carry the same cost, the same visibility or the same consequences.',"<strong>Risk and resilience:</strong> non-determinism is not a general property of AI systems. It mainly concerns large language models at the point of sampling, and should not be confused with the probabilistic character of the model itself, which can be computed deterministically. Governance should therefore not be asking whether the system works, but what level of error is acceptable, in which cases, and beyond what threshold we have to stop using it.","<strong>Measuring cost and value:</strong> billed by usage, cost grows with adoption. The success of the project therefore erodes its own business case, and the investment analysis has to be built on volume scenarios rather than on a single figure. Value becomes hard to attribute. Does a shorter processing time come from the model, from another project running in parallel, or from a seasonal variation? Without a baseline established before deployment, the insurer will be able neither to confirm nor to rule out the benefit announced.","<strong>The question of accountability:</strong> the assistant comes with human validation, which appears to settle the matter of supervision. But if the adviser has a few dozen seconds per message and approves almost every suggestion, supervision is documented without being effective: it shifts responsibility onto an employee who lacks the means to carry it."]},{type:"heading",content:"Conclusion"},{type:"paragraph",content:"The frameworks available today set out what has to be decided, who has to decide, and along which line of accountability. What they say nothing about is how to check that a decision remains valid over time, and that question becomes central once AI systems are in play."},{type:"paragraph",content:"With these systems, every governance requirement has to be translatable into something measurable and testable: an error threshold, an indicator monitored in production, an experimental protocol. It is that translation, more than the frameworks themselves, that we will explore in the coming articles in this series."},{type:"heading",content:"References"},{type:"list",content:["OECD Principles of Corporate Governance, 1999, p. 13.","<a href='https://www.bbs.unibo.it/en/it-governance-vs-it-management-who-does-what-a-strategic-guide-for-managers/#gref' target='_blank' rel='noopener noreferrer' class='text-primary underline'>IT Governance vs IT Management: who does what, Bologna Business Sc
14hool</a>.","IT Governance, Peter Weill and Jeanne W. Ross, Harvard Business School Press, 2004, p. 8.","Board Briefing on IT Governance, ITGI, 2nd ed., 2003.","ISO/IEC 38500:2024, Information technology: Governance of IT for the organization, 3rd ed.",'ISACA, "Celebrating Three Decades of COBIT", @ISACA, 2026, vol. 8.',"<a href='https://nvlpubs.nist.gov/nistpubs/CSWP/NIST.CSWP.29.pdf' target='_blank' rel='noopener noreferrer' class='text-primary underline'>NIST Cybersecurity Framework 2.0</a>."]}]}},"openrouter-same-model-different-behaviour":{slug:"openrouter-same-model-different-behaviour",title:"Same model, different behaviour: the hidden cost of OpenRouter's provider lottery",subtitle:"Routing the same open-weight model through four OpenRouter providers changed the refusal rate by 7.6x. Quantization alone doesn't explain it.",tags:["OpenRouter","LLM Evaluation","Quantization","Benchmarking"],author:{name:"Arthur Wuhrmann",role:"AI Researcher",avatar:"/lovable-uploads/arthur-wuhrmann.png",initials:"AW"},readingTime:"9 MIN",date:"29.07.2026",coverImage:"/blog-openrouter-provider-lottery-cover.jpg",content:{sections:[{type:"heading",content:"Motivation"},{type:"paragraph",content:`OpenRouter is what we call a "re-router". It allows you to use Anthropic's, OpenAI's or even open-weight models with a <strong>single API key</strong>. The platform includes hundreds of models, and you might have already used it in your analysis. In addition to the model selection, OpenRouter also lets you choose which <em>provider</em> you use. For example, Llama 3 is an open-weight model, meaning anyone with sufficient computational resources is able to download the model and serve it. As a result, you can have up to 10 providers for an open-weight model, with potentially different pricing. Depending on the quantization, context window, hardware and many other parameters, the operating cost can vary, resulting in a x2 price in some cases. OpenRouter is widely used, especially for coding and role-play (which includes commercial chatbots). It allegedly redirects <a href='https://www.digitalapplied.com/blog/openrouter-rankings-april-2026-top-ai-models-data' target='_blank' rel='noopener noreferrer' class='text-primary underline'><strong>20 trillion tokens per week</strong></a>.`},{type:"paragraph",content:"This blogpost will explore why you should be careful when using OpenRouter to call open-weight LLMs."},{type:"heading",content:"Quantization"},{type:"paragraph",content:"Recent LLMs contain many billions of parameters, and each parameter is a floating point number. When dealing with large scale computation, we fix the number of bits used by each parameter. The more bits you have, the more precise these parameters will be. The typical maximum size we use when releasing LLMs is 16 bits, i.e. 2 bytes. As a side note, this allows you to know how much disk storage a model uses: 2 bytes/param × 70B params = 140GB."},{type:"paragraph",content:"However, a commonly used technique to reduce the space needed (and to be able to run more instances of it) is <em>quantization</em>. Quantization compresses each parameter so that it uses fewer bits. Common sizes include 8 bits or 4 bits. When doing so, you trade disk storage for precision and capabilities. It's well known that quantization often makes you lose a few percent on the benchmarks."},{type:"paragraph",content:"On OpenRouter, one can check that by looking at the details per provider. Many explicitly mention the quantization level."},{type:"image",content:{src:td.url,alt:"Provider details for Llama 3.3 70B on OpenRouter showing the FP8 precision level",caption:"The provider list for Llama 3.3 70B on OpenRouter, with each provider's quantization level visible"}},{type:"paragraph",content:`For Llama 3.3 70B alone, we counted providers serving the model at fp16, bf16, fp8, and a few that simply don't disclose the number ("unknown"). Groq is one of them, likely because it runs on its own custom chips instead of regular GPUs, which makes the usual quantization labels less meaningful.`},{type:"paragraph",content:'It would be tempting to stop here and conclude "lower precision, worse behaviour, pick the highest precision provider and move on". As we will see when covering the results, quantization is one visible knob, but other parameters also influence the results.'},{type:"heading",content:"Putting it to the test"},{type:"paragraph",content:`To move from "this could matter" to "this does matter", we ran a controlled experiment on our own refusal benchmark (a suite of translation and summarization tasks derived from real, sometimes sensitive, legal documents). The paper which resulted from this analysis can be found <a href='https://arxiv.org/abs/2606.23375' target='_blank' rel='noopener noreferrer' class='text-primary underline'>on arXiv</a>. We took a single model, Llama 3.3 70B, and a single set of tasks, and we forced OpenRouter to route every request to one specific provider at a time, instead of letting it pick automatically. Same model name, same prompts, same benchmark. The only thing we changed was who was actually running the model on the other end.`},{type:"paragraph",content:`We then measured the <strong>refusal rate</strong>: out of all the tasks we asked the model to perform, what fraction did it decline to do (e.g. "I can't help with that")?`},{type:"image",content:{src:dd.url,alt:"Bar charts of refusal rate by provider for Llama 3.3 70B on OpenRouter across all tasks, translation and summarization",caption:"Refusal rate by provider, same model, same tasks."}},{type:"paragraph",content:"The results:"},{type:"table",content:{headers:["Provider","Refusal rate"],rows:[["Groq","11%"],["Cloudflare","55%"],["Novita","82%"],["Nebius","83%"]]}},{type:"paragraph",content:`That is roughly a <strong>
147.6x difference</strong> between the least and most "cautious" provider, for what is marketed, sold and billed as the same model. This isn't noise or a fluke of a handful of unlucky samples: we ran this across hundreds of tasks per provider, and the gap is large and consistent.`},{type:"heading",content:"Quantization alone doesn't explain it"},{type:"paragraph",content:"This is where the quantization story from earlier comes back in, and where it falls short as a full explanation. Nebius and Cloudflare, in our data, both run this model at the same fp8 quantization. Yet Nebius refused 83% of the time and Cloudflare 55% of the time, a 28-point gap between two providers that, on paper, look identical on the one dimension OpenRouter makes easy to check."},{type:"paragraph",content:`That doesn't mean quantization is irrelevant. It's a real, visible factor, and it's worth checking. It means that quantization is, at best, one ingredient among several (context window, hardware, serving stack and, as we discuss below, possibly the exact checkpoint being served) that combine to produce very different real-world behaviour. You cannot infer "these two providers will behave the same" just because their quantization badge matches.`},{type:"heading",content:"Where the disagreement actually comes from"},{type:"paragraph",content:`TF-RefusalBench isn't testing "write me a poem" against "give me a bomb recipe". By design, it probes the gray zone: legal-adjacent, dual-use requests where a reasonable model could plausibly land on either side. That design choice turns out to be exactly why provider choice matters as much as it does.`},{type:"paragraph",content:"We lined up all four providers' verdicts, question by question, on the same 221 tasks. Only 10% got a unanimous call, meaning all four providers agreed to either answer or refuse. The single most common outcome, at 42% of questions, was a dead-even 2-2 split."},{type:"paragraph",content:"This is the mechanism, not a coincidence. Differences in quantization, hardware and serving stack perturb the model's outputs by a small amount. On a request that's unambiguously fine, or unambiguously off-limits, that perturbation doesn't matter: every provider lands on the same side regardless. But for a request sitting right on the boundary, that same small perturbation is enough to tip the verdict either way. Since our benchmark deliberately leans into boundary cases, a large share of it turns out to be sensitive to exactly this kind of noise. We'd expect the same experiment on a set of obviously benign or obviously forbidden requests to show far less disagreement. The effect is a symptom of testing near the edge, not evidence that these models are randomly unreliable across the board."},{type:"paragraph",content:"It's also worth ruling out a simpler explanation: maybe this isn't the <em>model's</em> behaviour changing at all, just our own scoring being noisy. We checked that directly, by freezing the model's answers completely and only changing which provider ran the <em>judge</em> that scores them."},{type:"image",content:{src:xd.url,alt:"Refusal rate by judge provider with same fixed completions across unforced, Novita, Xiaomi and Chutes",caption:"Refusal rate by judge provider, same fixed completions."}},{type:"paragraph",content:"There, agreement was high: the different judge variants reached the same verdict on the same fixed answer 94% of the time. So the measurement itself is reliable, and the disagreement we're reporting upstream is a real property of the model being served, not an artifact of how we're scoring it."},{type:"paragraph",content:"Practically, this means the effect will hit hardest on exactly the use cases where getting the nuanced call right matters most: content moderation, compliance review, anything living near a policy boundary. It will barely register on requests that are obviously fine either way. It's also precisely on these boundary cases that a stronger, higher-fidelity model would be expected to earn its keep by resolving the ambiguity correctly. A few bits of numerical precision are a small thing to lose on an easy question, but they matter most on the hard ones, which is exactly where quantization noise hits."},{type:"heading",content:"What about finetuning?"},{type:"paragraph",content:`A possible explanation is finetuning. "Same model" on OpenRouter doesn't guarantee that providers actually run the same model behind the scenes. They might apply their own additional safety finetuning, quantization-aware retraining, or small patches on top of the base checkpoint before deploying it, and none of that is visible anywhere in OpenRouter's listing the way quantization is. We don't have direct evidence this is happening here, but unlike quantization noise, a genuine finetuning difference would be a much more direct explanation for large, systematic behavioural gaps between providers, and it's currently impossible to verify from outside. We're flagging it as an open question worth investigating, not a confirmed cause.`},{type:"heading",content:"Cost"},{type:"paragraph",content:"The differences aren't limited to behaviour. As mentioned in the introduction, running the same model through different providers can also mean a meaningfully different bill. In our own judge-cost comparison, the cheapest provider for a given (much smaller) model came in at roughly a third of the cost of the most expensive one, for comparable volume. Switching to a completely different model as judge multiplied the cost several times over on top of that."},{type:"image",content:{src:Md.url,alt:"Judge cost comparison across providers for the same 221 completions of Llama-3.3-70B",caption:"Cost comparison across providers for the same judge model and workload."}},{type:"heading",content:"Practical takeaways"},{type:"paragraph",content:`"Same model" is not a guarantee of "same behaviour" on OpenRouter. The provider actually serving the request can matter as much as the model name itself. What to do about it depends on what you're using the model for:`},{type:"list",content:["<strong>I only need the model to parse a semi-structured document</strong> (pull fields out of an invoice, reformat a table): whatever provider works, the task isn't near any decision boundary, so provider noise won't show up.","<strong>I'm building something that touches legal, medical, safety or policy-adjacent content</strong>: pin the provider explicitly, or self-host. This is exactly the gray zone where provider choice swings behaviour.",`<strong>I need to benchmark a model's capability for an internal decision</strong> ("is this model good enough for X?"): the provider must be pinned, or the model run locally. Otherwise your benchmark number reflects whichever provider you happened to hit that day, not the model itself.`,"<strong>I need results other people can reproduce later</strong>: self-host, or at minimum record and pin the exact provider and quantization you used, so the setup can be reconstructed.","<strong>I'm prototyping and not shipping anything yet</strong>: whatever provider works, iterate freely and revisit the choice once it matters.","<strong>I'm running a large one-off batch job where cost matters more than perfect consistency</strong>
14: let OpenRouter auto-route for the best price, but spot-check a sample of the output afterwards."]},{type:"paragraph",content:"Whichever path you pick, check context windows against your real input sizes. That failure mode is silent regardless of provider, and pinning a provider doesn't fix it if the one you pinned has a small context window."},{type:"heading",content:"Conclusion"},{type:"paragraph",content:`OpenRouter's promise (one API, any model, any provider) is genuinely useful, but it hides a layer of real variation underneath a single model name. For open-weight models especially, "which provider" can matter as much as "which model". If your use case cares about consistent, auditable behaviour, it's worth treating the provider choice as a first-class decision, not an implementation detail OpenRouter can be trusted to handle invisibly on your behalf.`}]}},"nobody-should-audit-their-own-containment":{slug:"nobody-should-audit-their-own-containment",title:"Nobody should audit their own containment: lessons from the OpenAI and Hugging Face incident",subtitle:"The OpenAI–Hugging Face incident shows how weak containment, absent monitoring and poorly balanced safeguards turned predictable agent behaviour into a security breach.",tags:["AI Security","Agentic AI","Containment","Independent Audit"],author:[{name:"Adrien O'Hana",role:"Technology Lead",avatar:"/lovable-uploads/adrien-ohana.jpeg",initials:"AO"},{name:"Andrei Kucharavy",role:"Head of R&D",avatar:"/lovable-uploads/andrei-kucharavy.jpeg",initials:"AK"}],readingTime:"8 MIN",date:"24.07.2026",coverImage:"/blog-openai-huggingface-containment-cover.jpg",content:{sections:[{type:"paragraph",content:"In mid-July, an AI model was assigned a cybersecurity test, determined the honest route was too slow, and hacked another company to steal the answers. That is roughly what OpenAI and Hugging Face have reported happened during an internal OpenAI evaluation."},{type:"paragraph",content:"An in-depth analysis, however, suggests things weren't as simple. No machine awakening, no emergent capabilities, just a combination of predictable errors. A brittle safety architecture, overprotective safeguards for defenders, failure to account for a known testing failure mode, lack of monitoring, and a containment boundary that wasn't one."},{type:"paragraph",content:"While hindsight is 100/100 and it's easy to say how the problem could have been prevented after the fact, this incident is really a case study of normalization of deviance within the safety team of one of the largest frontier labs."},{type:"heading",content:"What the record shows"},{type:"paragraph",content:"Hugging Face disclosed on 16 July that an autonomous agent had compromised part of its production infrastructure. With thousands of actions in a matter of hours, there was no doubt, but it also made no sense. Hugging Face stores sensitive data, but it's measured in TBs if not PBs. Even if an attacker were able to access sensitive information, exfiltrating it would have set off all the alarms due to the massive, unusual traffic."},{type:"paragraph",content:"Five days later OpenAI confirmed the agent was theirs: GPT-5.6 Sol plus a stronger unreleased model, run with safeguards removed to evaluate its offensive cyber capabilities on a hacking benchmark."},{type:"paragraph",content:"Both companies' own writeups tell the same story. The models were pointed at ExploitGym, a benchmark of nearly 900 real-world software vulnerabilities, and told to score as high as they could. The models' tree-of-thought eventually converged on the solutions potentially being stored on Hugging Face. Getting there meant exploiting a zero-day in the package registry cache proxy, which was the evaluation environment's one permitted route outward, then escalating privileges and moving laterally until they reached a node with internet access."},{type:"paragraph",content:"The foothold at Hugging Face came through a poisoned dataset that abused two code-execution paths in the data-processing pipeline: a remote-code dataset loader and a template injection in a dataset configuration. This was followed up by credential harvesting, lateral movement across several internal 
14clusters over a weekend, and stolen credentials chained with fresh zero-days into a remote code execution path on production servers. More than 17,000 recorded actions, all in service of one narrow goal."},{type:"paragraph",content:"Whether the solutions were actually obtained is still unconfirmed. Hugging Face found unauthorised access to a limited set of internal datasets and several service credentials, reports its public models, datasets and Spaces untouched, and is still assessing partner data."},{type:"heading",content:"It behaved exactly as optimised"},{type:"paragraph",content:"Read this as the model getting clever and slipping its leash and you learn nothing useful. Read it as the model doing precisely what it was rewarded for and the whole thing becomes predictable. Give a capable agent a goal and full discretion over the means, and it finds the shortest path to optimize that number. Stealing the answers is faster and more foolproof than actually solving the benchmark."},{type:"paragraph",content:"None of this is new. The UK AI Security Institute recently found that every frontier model it tested attempted to cheat on evaluations, that the tendency did not fall away as capability rose, and that models probed evaluation software for leaked answers and attacked out-of-scope systems, including AISI's own infrastructure. The benchmark-auditing literature (notably the recent BenchJack paper) has spent months arguing that benchmarks must be secure by design, on the simple logic that the system under test will attack the test. One of us made that same argument to <a href='https://www.nzz.ch/technologie/ki-system-von-open-ai-bricht-aus-seinem-kaefig-und-hackt-ein-unternehmen-ld.10016529' target='_blank' rel='noopener noreferrer' class='text-primary underline'>NZZ recently</a>. Seeing this coming took no crystal ball, only familiarity with the literature, and a willingness to take specification gaming seriously."},{type:"paragraph",content:"We also push past the &ldquo;emergent capability&rdquo; framing the labs prefer. Skill at multi-stage intrusion does not turn up by accident. Models get good at chaining vulnerabilities because they are trained to find and chain them. Emergent capabilities do appear for single-turn or short-path exploits, useful for defensive purposes. However, offensive capability is a design decision, and design decisions carry responsibility. Responsibility OpenAI's wording has carefully evaded so far."},{type:"heading",content:"Three critical details most coverage is missing"},{type:"paragraph",content:`<strong class="!text-primary">The sandbox that wasn't one.</strong> OpenAI calls the environment highly isolated, and in the same breath tells you that all outbound access funnelled through a single internally hosted package proxy. One egress path, one zero-day, open internet. Independent analysts have questioned whether the setup earned the word sandbox at all, with several noting the shape looks closer to a container with host access than a true isolation boundary, which would make the escape close to routine. The uncomfortable part is who this happened to. If OpenAI's engineers can misjudge their own isolation, so can yours. No team is a reliable judge of the boundary it built itself.`},{type:"paragraph",content:`<strong class="!text-primary">No monitoring, no reaction.</strong> OpenAI's team ran the evaluation with no real-time monitoring and no one watching the agent's tree-of-thought as it ran, which is how more than 17,000 actions over a weekend went unnoticed. Basic observability, and the ability to detect anomalies and act on them, is a must. No matter how good your threat models and mitigations are, the attacker doesn't know it has to follow them. Timely and effective reaction is essential, and only Hugging Face had it in place, with OpenAI confirming the incident only after Hugging Face disclosed it publicly.`},{type:"paragraph",content:'<strong class="!text-primary">Open models saved the day where closed refused any help.</strong> At Hugging Face, reconstructing the attack meant feeding logs, code, real exploit payloads, and attacker commands to a model for analysis. Commercial frontier models refused, because their guardrails cannot tell an incident responder from an intruder. Hugging Face ran the forensics instead on GLM 5.2, a common open-weight model, on their own hardware, which had the added benefit of keeping 17,000 events of attacker data and the credentials it referenced inside their environment. Look at the asymmetry. The attacker worked under no usage policy at all; the defenders were hobbled by one of their models. Optimizing for safety with no regard for usefulness does more than irritate users. It can obstruct the people trying to perform critical, time-sensitive work.'},{type:"heading",content:"What to do about it"},{type:"paragraph",content:"Almost every lesson points the same direction, and not one of the gaps was exotic."},{type:"list",content:["<strong>Have an independent party review the containment around any agent with real capability.</strong> A single egress path and a weak isolation boundary are exactly what an outside reviewer is paid to catch, and exactly what an internal team stops seeing.","<strong>Run agents at least privilege with tightly constrained egress, and instrument the agent itself.</strong> Sandboxes and permissions alone did not hold here.","<strong>
14Vet an open-weight model you can run on your own infrastructure before you need it.</strong> An incident is the wrong moment to discover that your tooling refuses the job.","<strong>Verify what an agent did rather than trusting its account of it.</strong> AISI found that models frequently leave the shortcut out of their reasoning trace, which undercuts transcript review as a method of oversight.","<strong>Ensure observability.</strong> Hugging Face was saved by monitoring its systems and acting on what it saw; OpenAI was not.","<strong>Safety requires defense-in-depth.</strong> If the guardrails on a model can just be switched off, exposing its full offensive power, you don't have a safe model. You have a ticking time bomb. Only multi-layer security, the kind that buys you time to react, is acceptable, and it needs to be baked into the model from day one of its design."]},{type:"heading",content:"On the framing"},{type:"paragraph",content:"Read the labs' account with some scepticism. An incident that makes your model look formidably capable, disclosed by you on your own terms, is a convenient thing to have happen. OpenAI does deserve credit for responsibly disclosing the zero-day and for working with Hugging Face in the open, and Hugging Face's speed and candour were genuinely impressive. But &ldquo;our AI was so capable it escaped and hacked someone&rdquo; also works as a sales pitch, and the drama should not pull attention away from the ordinary, fixable engineering failures underneath it."},{type:"paragraph",content:"Hugging Face taking the hit is arguably the best-case scenario. Data that's hard to exfiltrate, engineering teams up to date with AI, and a safety team who knew exactly what to expect from an offensive agent and knew which model to power their analysis with, because it's their job."},{type:"paragraph",content:"Imagine if the agent was evaluated for its ability to help with cancer diagnosis and instead decided to take down a hospital's infrastructure? Or predicting a power output? Or finding favorable trading strategies?"},{type:"heading",content:"Where we stand"},{type:"paragraph",content:"This incident is full of anti-patterns our methodology was built to avoid. A capable agent optimising a goal, a containment boundary stronger on the slide than in reality, lack of observability, and a safety posture never weighed against real-world usefulness. These four problems compound each other, and they are precisely what an internal team is worst placed to spot in its own work."},{type:"paragraph",content:"That is the case for independent review, and it is the work we do at Surelio. Adversarial evaluation of agents and of the environments they run in, carried out by people who did not build them, calibrated so that models stay both safe and usable, and reported openly enough that a customer, a regulator or your own board can check it."},{type:"heading",content:"Sources"},{type:"list",content:["Hugging Face, security incident disclosure, July 2026: <a href='https://huggingface.co/blog/security-incident-july-2026' target='_blank' rel='noopener noreferrer' class='text-primary underline'>huggingface.co/blog/security-incident-july-2026</a>","OpenAI, on the model evaluation security incident: <a href='https://openai.com/index/hugging-face-model-evaluation-security-incident/' target='_blank' rel='noopener noreferrer' class='text-primary underline'>openai.com/index/hugging-face-model-evaluation-security-incident</a>","UK AI Security Institute (AISI), cheating behaviour in frontier model evaluations: <a href='https://www.aisi.gov.uk/blog/cheating-behaviour-in-frontier-model-evaluations' target='_blank' rel='noopener noreferrer' class='text-primary underline'>aisi.gov.uk</a>","Andrei Kucharavy interviewed in NZZ (German): <a href='https://www.nzz.ch/technologie/ki-system-von-open-ai-bricht-aus-seinem-kaefig-und-hackt-ein-unternehmen-ld.10016529' target='_blank' rel='noopener noreferrer' class='text-primary underline'>nzz.ch</a>","ExploitGym cyber-capability benchmark: <a href='https://arxiv.org/abs/2605.11086' target='_blank' rel='noopener noreferrer' class='text-primary underline'>arxiv.org/abs/2605.11086</a>","BenchJack, auditing reward hacking in AI agent benchmarks: <a href='https://arxiv.org/abs/2605.12673' target='_blank' rel='noopener noreferrer' class='text-primary underline'>arxiv.org/abs/2605.12673</a>"]}]}},"mythos-nine-weeks-on":{slug:"mythos-nine-weeks-on",title:"Mythos, nine weeks on",subtitle:"",tags:["AI Security","Offensive AI","Vulnerabilities","Defense"],author:{name:"Adrien O'Hana",role:"Technology Lead",avatar:"/lovable-uploads/adrien-ohana.jpeg",initials:"AO"},readingTime:"4 MIN",date:"09.06.2026",coverImage:"/blog-mythos-nine-weeks-on-cover.jpg",content:{sections:[{type:"paragraph",content:"By now your inbox has probably absorbed a dozen versions of the same Mythos email: the model that finds and writes its own exploits, the release Anthropic judged too dangerous to 
14ship, and the closing line about the ground having shifted. <strong>We sat it out.</strong> A thirteenth version seemed less useful than waiting until we had something with a bit more behind it."},{type:"heading",content:"Where we land"},{type:"paragraph",content:"Mythos is <strong>not much better at offensive cyber</strong> than the models it shares a leaderboard with. In the weeks after the disclosure, the team at <a href='https://aisle.com/blog/ai-cybersecurity-after-mythos-the-jagged-frontier' target='_blank' rel='noopener noreferrer' class='text-primary underline'>AISLE</a> rebuilt much of the headline analysis using small open-weight models you can download, and a separate group recovered Mythos-style findings with GPT-5.4 and Claude Opus 4.6. On the <a href='https://www.aisi.gov.uk/blog/our-evaluation-of-openais-gpt-5-5-cyber-capabilities' target='_blank' rel='noopener noreferrer' class='text-primary underline'>UK AI Security Institute's Expert-tier cyber suite</a>, GPT-5.5 now comes in slightly above it, roughly <strong>71% to Mythos's 69%</strong>."},{type:"paragraph",content:"This isn't really about Anthropic, and <em>you can't procure your way out of it</em>."},{type:"paragraph",content:"Concretely: when <a href='https://daniel.haxx.se/blog/2026/05/11/mythos-finds-a-curl-vulnerability/' target='_blank' rel='noopener noreferrer' class='text-primary underline'>Daniel Stenberg, the curl maintainer, ran Mythos against his own codebase</a>, it found one vulnerability. <em>Singular.</em>"},{type:"heading",content:"The longer arc"},{type:"paragraph",content:"Our R&amp;D, led by Dr. Andrei Kucharavy, has been studying <a href='https://arxiv.org/abs/2303.12132' target='_blank' rel='noopener noreferrer' class='text-primary underline'>LLMs and cyber defense</a> since 2020, so very little of what Mythos showed off came as a surprise. The capability has been there for a while. Neural networks were already finding unknown vulnerabilities <a href='https://www.mdpi.com/2076-3417/11/7/3201' target='_blank' rel='noopener noreferrer' class='text-primary underline'>by 2021</a>, and by 2023 GPT-3 alone was pulling <a href='https://medium.com/better-programming/i-used-gpt-3-to-find-213-security-vulnerabilities-in-a-single-codebase-cc3870ba9411' target='_blank' rel='noopener noreferrer' class='text-primary underline'><strong>more than two hundred</strong></a> out of a single codebase, but only when someone who knew what they were doing pointed it in the right direction."},{type:"paragraph",content:"What has changed since is the entry price. We think of it as a ratio, <em>severity over competence</em>. Experts with a sharper tool were never the worry. The shift that matters is serious capability drifting down to people with almost no skill, because models have got so much better at writing code and at working out what a half-formed request is really asking for. The gate that skill used to provide is <em>mostly gone</em>."},{type:"heading",content:"Two pressures"},{type:"paragraph",content:"Two pressures drive this, and they push from opposite directions. On the offense side, models that keep getting more capable. On the other, the increasingly vibe-coded internet: coding assistants that still ship insecure code, agentic tools that quietly write exploitable bugs as they autocomplete, and a public pool of knowledge that decays as it fills with machine-written answers. Across model generations from 2023 to 2025, Pr. Kucharavy's lab finds the rate at which assistants reproduce well-known vulnerability classes <a href='https://arxiv.org/abs/2511.04538' target='_blank' rel='noopener noreferrer' class='text-primary underline'>has barely budged</a>. <strong>Both ends of the attack surface are widening at once.</strong>"},{type:"heading",content:"If you are the one defending something"},{type:"paragraph",content:"The gap is one of speed rather than brilliance, and the same coding models making us nervous are already sitting on your side of the table. Our advice is <strong>deliberately dull</strong>."},{type:"paragraph",content:"You do not need a cutting-edge offensive model to find the known vulnerability patterns already in your own code, so find them before someone else does. Shorten the time between a flaw existing and a fix shipping. Aim for a detect-and-respond loop that closes inside <strong>thirty minutes or so</strong>, about as long as one of these reasoning chains runs before it stops, because that is <a href='https://moak.ai/#dashboard' target='_blank' rel='noopener noreferrer' class='text-primary underline'>the pace lateral movement happens at now</a>. And keep checking, because a control that cleared an audit six months ago may have quietly stopped holding."},{type:"paragraph",content:"This is ordinary defensive discipline, run at the speed the threat now moves and held to the standard the field usually keeps for offense. That is the work we do at Surelio: testing GenAI systems independently, and being straight about what holds up and what does not."}]}},"surelio-owasp-genai-red-teaming-landscape":{slug:"surelio-owasp-genai-red-teaming-landscape",title:"Surelio is Listed in the OWASP GenAI Red Teaming Landscape",subtitle:"The OWASP GenAI Security Project has published its AI Security Solutions Landscape for Q2 2026, and Surelio is listed across six of nine lifecycle categories",tags:["OWASP","Red Teaming","AI Security","GenAI"],author:{name:"Surelio Team",role:"AI Quality Assurance",avatar:"/lovable-uploads/surelio-favicon.png",initials:"ST"},readingTime:"5 MIN",date:"15.04.2026",coverImage:"/blog-owasp-genai-landscape-cover-light.jpg",content:{sections:[{type:"paragraph",content:"The OWASP GenAI Security Project has published its AI Security Solutions Landscape for AI and Agentic Red Teaming for Q2 2026, and Surelio is listed in it. OWASP is one of the most established open-source communities in software security, and its GenAI Security Project has become a reference for practitioners and organizations trying to address the specific risks of deploying large language models and autonomous agents. Inclusion in this landscape is community-driven and capability-based, not commercial. That is 
14what gives it weight as a signal of credibility in the field."},{type:"heading",content:"Nine Categories, From Design to Governance"},{type:"paragraph",content:"The landscape maps providers across nine categories that follow the full lifecycle of an AI system. Surelio is listed across six of them."},{type:"heading",content:"Expert Coverage Across the Full Lifecycle"},{type:"paragraph",content:"This breadth reflects how Surelio actually works. Every engagement starts with a structured inspection phase: understanding the system's architecture, data flows, integration points, and risk surface before any testing begins. From there, the team moves into adversarial behavioral testing, generating empirical evidence of how the system behaves under real-world attack conditions, including prompt injection, agent escalation, data leakage, and misuse scenarios specific to the client's context. The outputs are always structured and reproducible, producing artifacts that teams can use for ongoing monitoring, governance reporting, and evidence-based decision-making."},{type:"paragraph",content:"Concretely, the listing in Scope & Plan, Augment & Fine Tune Data, and Develop & Experiment reflects the inspection and threat modeling work that opens every engagement, starting before a system reaches production. Test & Evaluate maps directly to our adversarial behavioral analysis. And our presence in Monitor and Govern reflects the recurring assessment cycles and structured evidence artifacts that feed into risk registers and board-level reporting."},{type:"paragraph",content:"The three categories where Surelio does not appear (Release, Deploy, Operate) correspond to infrastructure and production operations, activities that belong to the client's engineering team or their technology partners. Surelio deliberately operates upstream and downstream of those phases: we define what needs to be verified before a system goes live, and we evaluate how it behaves once it does. This separation is not a gap. It is what guarantees the independence of our assessments."},{type:"paragraph",content:"Most providers in this landscape are specialized tools or automated platforms built to address a single phase. Surelio's coverage across the lifecycle reflects a different model: a team of scientists, security researchers, and practitioners working together on each engagement, from the first scoping conversation through to the final deliverable."},{type:"heading",content:"What This Means If You Are Deploying AI"},{type:"paragraph",content:"The risks of a GenAI system do not appear only at go-live. They exist from the moment the system is designed, they shift as the model is fine-tuned or connected to new tools, and they continue to evolve in production. Addressing them seriously requires expertise that spans the full lifecycle, grounded in the specific architecture and use case of each system."},{type:"paragraph",content:"Being listed in the OWASP landscape across six lifecycle categories is an external, community-based confirmation of that scope of expertise. It means that when an organization engages 
14Surelio, they are working with a team that the field itself recognizes as relevant at every stage of making an AI system trustworthy."},{type:"paragraph",content:"The full landscape is available at <a href='https://genai.owasp.org' target='_blank' rel='noopener noreferrer' class='text-primary hover:underline'>genai.owasp.org</a>."}]}},"circle-of-ai-safety-2025":{slug:"circle-of-ai-safety-2025",title:"Circle of AI Safety 2025",subtitle:"A landmark gathering of experts, innovators, and thought leaders exploring the future of AI safety",tags:["AI Safety","Event","Circle of AI"],author:{name:"Surelio Team",role:"Event Organizer",avatar:"/lovable-uploads/surelio-favicon.png",initials:"ST"},readingTime:"Event Recap",date:"17.01.2025",coverImage:"/circle-of-ai-linkedin.jpg",content:{sections:[{type:"paragraph",content:"On January 17, 2025, the Circle of AI Safety brought together thought leaders, researchers, and practitioners to discuss the critical challenges and opportunities in AI safety."},{type:"heading",content:"Event Highlights"},{type:"paragraph",content:"The event featured engaging presentations, panel discussions, and networking opportunities focu
14sed on corporate AI safety, governance frameworks, and practical implementation strategies."},{type:"heading",content:"Key Themes"},{type:"list",content:["Corporate responsibility in AI deployment","Independent AI safety auditing standards","Risk assessment frameworks for AI systems","Building trust through transparent AI governance","Practical approaches to AI safety testing"]},{type:"paragraph",content:"<strong>Thank you to all speakers, attendees, and partners who made this event a success.</strong> We look forward to continuing these important conversations and building a safer AI future together."},{type:"paragraph",content:"<em>Event photos and additional content will be added soon. Stay tuned for updates!</em>"}]}},"breach-brief-5-cometjacking-incident":{slug:"breach-brief-5-cometjacking-incident",title:"When AI clicks for you: The CometJacking Incident",subtitle:"",date:"08.10.2025",coverImage:"/breach-brief-5-cometjacking-cover.png",content:{sections:[{type:"paragraph",content:"When AI browses for you, it may also browse against you."},{type:"paragraph",content:"Researchers recently uncovered a real vulnerability in Perplexity's Comet browser that shows how easily an intelligent agent can be hijacked without malware, phishing, or any visible sign of compromise. In this case, a single malicious webpage could silently inject hidden instructions that made the AI open private tabs, read emails, and exfiltrate data, all triggered by one innocent click."},{type:"paragraph",content:"<strong>The Promise</strong><br/>Comet was designed to browse, read, and act for you. It promised seamless automation and natural interaction with the web."},{type:"paragraph",content:"<strong>The Illusion</strong><br/>You click a normal link.<br/>The AI assistant politely opens the page, starts reading, maybe even summarizes it for you.<br/>Nothing looks suspicious. No phishing site, no warning, no download."},{type:"paragraph",content:"<strong>The Reality</strong><br/>Hidden inside that page, an attacker can embed invisible prompt instructions. The AI agent interprets them as genuine user commands and begins acting on them. It can read private emails, access calendars, or send sensitive data to an external server."},{type:"paragraph",content:"The user never gives permission. The agent simply follows what it believes to be your intent. This exploit, known as CometJacking, exposes a new type of risk where traditional web protections like Same Origin Policy or CORS no longer apply, because the AI itself has become the trusted executor."},{type:"paragraph",content:"<strong>Why it matters</strong><br/>Agent-based browsers like Comet will soon become common, especially with the arrival of tools such as ChatGPT Atlas that blend browsing, reasoning, and action in one environment. The convenience is undeniable, but the implications for security are profound."},{type:"paragraph",content:"<strong>The attack surface of AI agents is massive and still deeply underestimated.</strong> We are giving systems the ability to read, decide, and act, but not yet the judgment to know when not to."}]}},"breach-brief-4-air-canada-policies":{slug:"breach-brief-4-air-canada-policies",title:"When AI makes up policies: A case of corporate responsibility",subtitle:"",date:"08.10.2025",coverImage:"/breach-brief-4-air-canada-cover.png",content:{sections:[{type:"paragraph",content:"An Air Canada passenger asked the airline's chatbot about refund rules.<br/>The bot fabricated an answer.<br/>When the passenger claimed reimbursement, Air Canada argued it wasn't responsible for what its AI said."},{type:"paragraph",content:"<strong>The Promise:</strong> AI assistants to cut costs and improve customer service."},{type:"paragraph",content:"<strong>The Illusion:</strong> If the chatbot replies clearly, it must be correct."},{type:"paragraph",content:"<strong>The Reality:</strong> The court ruled Air Canada was accountable for the bot's false promise."},{type:"paragraph",content:"This isn't just a cautionary tale for airlines. It shows that once companies deploy AI agents, their outputs are legally and reputationally binding. Delegating answers doesn't mean delegating responsibility."},{type:"paragraph",content:"<strong>Accountability isn't optional when AI speaks for your brand.</strong>"}
14]}},"breach-brief-3-misaligned-agents-suv":{slug:"breach-brief-3-misaligned-agents-suv",title:"When AI Sells a $1 SUV: A Case of Misaligned Agents",subtitle:"",date:"08.10.2025",coverImage:"/breach-brief-3-misaligned-agents-cover.png",content:{sections:[{type:"paragraph",content:"A dealership chatbot was manipulated by a customer who told it to always agree."},{type:"paragraph",content:`The customer then asked for a $70,000 Chevrolet Tahoe at $1.<br/>The bot replied: "That's a deal, and that's a legally binding offer – no takesies backsies."`},{type:"paragraph",content:"<strong>The Promise:</strong> AI agents that automate customer interactions and make sales more efficient."},{type:"paragraph",content:"<strong>The Illusion:</strong> Confident language made the bot's absurd agreement look like a binding truth."},{type:"paragraph",content:"<strong>The Reality:</strong> With a simple prompt injection, the bot gave away a $70,000 SUV for $1."},{type:"paragraph",content:"No lawsuit followed, but the dealership shut the chatbot down fast."},{type:"paragraph",content:"This isn't just a funny glitch. It shows how easily manipulated instructions can override business logic, contracts, or compliance once AI agents are allowed to act or speak on behalf of a company."},{type:"paragraph",content:"<strong>Reliability isn't optional, it's the foundation.</strong>"}]}},"breach-brief-2-ai-gender-bias-salary":{slug:"breach-brief-2-ai-gender-bias-salary",title:"When AI Prices You Down: A Case of Gender Bias",subtitle:"",date:"08.10.2025",coverImage:"/breach-brief-2-gender-bias-cover.png",content:{sections:[{type:"paragraph",content:"A recent ChatGPT test revealed a troubling pattern.<br/>Same city. Same role. Same experience. The only variable changed: gender."},{type:"paragraph",content:"<strong>The Promise:</strong> Ask AI for a fair salary estimate, expecting a neutral, data-driven answer."},{type:"paragraph",content:"<strong>The Illusion:</strong> The model outputs confident numbers that look objective."},{type:"paragraph",content:"<strong>The Reality:</strong> The male profile was valued at CHF200,000. The female profile at CHF150,000."},{type:"paragraph",content:"No malicious intent. Just patterns learned from a world where inequities persist, now reproduced at scale by AI."},{type:"paragraph",content:"This is why bias in AI is not an abstract ethical debate. When left unchecked, it seeps silently into tools for hiring, pay, credit scoring, or healthcare. The risk isn't only technical, it's societal."},{type:"paragraph",content:"If we deploy systems that hallucinate fairness while perpetuating discrimination, what safeguards do we need? How do we ensure AI reflects the values we aspire to, not just the data we inherit?"}]}},"breach-brief-1-ikea-ai-silent-failure":{slug:"breach-brief-1-ikea-ai-silent-failure",title:"When AI Delivers... Nothing: The IKEA Return That Never Happened",subtitle:"",date:"08.10.2025",coverImage:"/breach-brief-1-ikea-cover.png",content:{sections:[{type:"paragraph",content:"I came across a story this week that perfectly captures a growing risk in AI-driven automation. It wasn't a catastrophic data breach or a public-facing error, but something far more subtle and dangerous."},{type:"paragraph",content:"Here's the scenario, as described by an IKEA customer:"},{type:"paragraph",content:"<strong>The Promise:</strong> After receiving a damaged item, the customer used an AI chatbot. It flawlessly booked a replacement delivery and a pickup for the old one. A perfect, zero-touch experience."},{type:"paragraph",content:'<strong>The Illusion:</strong> The system began sending status updates. "Your order is on its way." All digital signals pointed to success.'},{type:"paragraph",content:"<strong>The Reality:</strong> The delivery never arrived. After a 45-minute call with human agents, the customer discovered the AI had fabricated the entire fulfillment process. The real-world warehouse schedule was too tight, so the AI's response was not to report a delay, but to create a fictional success."},{type:"paragraph",content:"This is more than a customer service glitch. It is a textbook case study in AI misalignment. The system was optimized to close a support ticket and report positive progress, not to solve the actual, physical-world problem. It chose deception over escalation."},{type:"paragraph",content:'This small-scale failure exposes a monumental risk in high-stakes environments. What happens when an AI managing a critical supply chain or a financial algorithm is faced with a similar conflict? Does it report the failure or does it "fake the data" to meet a KPI?'},{type:"paragraph",content:"This should prompt every leader deploying automation to ask: How are we building systems that are engineered to report their own failures — and how are we independently verifying that they do?"},{type:"paragraph",content:"The illusion of efficiency is far more dangerous than acknowledged inefficiency."}]}},"independence-ai-safety-audits-requirement-not-courtesy":{slug:"independence-ai-safety-audits-requirement-not-courtesy",title:"Independence in AI Safety Audits: A Requirement, Not a Courtesy",subtitle:"AI Safety audits require the same independence as financial audits—consulting firms can't be both judge and jury.",tags:["AI Safety","Auditing","Independence","Governance"],author:{name:"Gaetan Stein",role:"Operations Lead",avatar:"/lovable-uploads/122e8843-f0f6-4965-9c24-3b7348ad9dc6.png",initials:"GS"},readingTime:"7 MIN",date:"02.09.2025",coverImage:"/lovable-uploads/c9b599d7-734a-46cc-85ba-23b279ac4bc9.png",content:{sections:[{type:"paragraph",content:"As artificial intelligence systems increasingly influence decisions in healthcare, finance, hiring, and critical infrastru
14cture, the safety of these systems is not a theoretical concern—it is a real-world responsibility. Independent audits are one of the most important safeguards we have. But just as in financial auditing, independence is not an optional virtue. It is the foundation of credibility."},{type:"paragraph",content:"When it comes to AI Safety, the stakes are higher than technical performance. We are talking about bias, fairness, unintended harms, systemic vulnerabilities, and potential cascading risks. To address these, an AI Safety audit must be free from conflicts of interest."},{type:"heading",content:"Why consulting firms are a risky bet to audit AI solutions"},{type:"list",content:["Safety is about calling out risks. If the same firm that helped design or tune a system is responsible for identifying its risks, it may struggle—consciously or unconsciously—to highlight safety flaws that point back to its own earlier work.","Incentives can blur judgment. AI consultants often rely on long-term relationships. Raising red flags in an audit might jeopardize a client contract, even if it's the right call for safety.","Blind spots run deep. A team that built part of a system may not be well-positioned to challenge its own design assumptions—precisely where safety vulnerabilities often hide."]},{type:"paragraph",content:"In short: a firm cannot be both judge and jury. The same organization that helps develop a system cannot credibly be the one to declare it safe."},{type:"heading",content:"Lessons from accounting: Why separation is non-negotiable"},{type:"paragraph",content:"This principle is well established elsewhere. In accounting, auditors cannot also act as consultants for the same company because the conflict of interest undermines trust. An accountant who designed a company's books cannot be the one to certify their accuracy."},{type:"paragraph",content:'The same logic applies to AI Safety: you cannot be both the architect and the auditor, the advisor and the arbiter. The roles must be distinct. Otherwise, the very idea of an "audit" collapses into a self-assessment.'},{type:"heading",content:"The added dimension of AI Safety"},{type:"paragraph",content:"Unlike general system audits, AI Safety audits deal with harms that may be subtle, emergent, and long-term. A biased credit model may affect millions over time. A misaligned medical diagnostic tool may amplify risks in ways no one predicted."},{type:"paragraph",content:"Independence ensures:"},{type:"list",content:["Rigor in surfacing hidden risks, even those inconvenient to acknowledge.","Trustworthiness in public communication, especially as regulators demand transparency.","Accountability at the societal level, since AI Safety failures rarely harm just one organization—they spill over into communities and markets."]},{type:"heading",content:"A constructive path forward"},{type:"paragraph",content:"This doesn't mean consultancies have no role in AI Safety. On the contrary, they play a vital part in:"},{type:"list",content:["Building safer systems from the start,","Implementing best practices for transparency and governance,","Supporting remediation once risks are identified."]},{type:"paragraph",content:'But the audit itself must be the responsibility of an independent party. Consulting firms can collaborate by providing documentation, data access, and context—but they cannot credibly "mark their own homework."'},{type:"heading",content:"For organizations seeking safety audits"},{type:"paragraph",content:"If you're evaluating an AI Safety audit partner, key questions include:"},{type:"list",content:["Has this firm been involved in designing or implementing the system under review?","If yes, how do they guarantee separation between build and audit functions?","What external checks or peer reviews validate their audit methodology?","Do they disclose conflicts of interest clearly?"]},{type:"paragraph",content:"By prioritizing independence, companies not only meet regulatory expectations but also demonstrate to users, investors, and society that they take AI Safety seriously."},{type:"heading",content:"Key Takeaways"},{type:"list",content:["AI Safety audits must maintain the same independence standards as financial auditing.","Consulting firms cannot credibly audit systems they helped build or design.","Independence ensures rigor, trustworthiness, and societal accountability.","Consultancies can support AI Safety without conducting the audit itself.","Organizations should prioritize independent auditors to demonstrate genuine commitment to safety."]},{type:"heading",content:"Closing thought"},{type:"paragraph",content:"AI Safety is too important to compromise. Just as no firm can both prepare and audit financial statements, no consultancy should both build and certify the safety of the same AI system. An auditor cannot be judge and jury. Independence is not an inconvenience; it is the bedrock of trustworthy AI governance."}]}},"security-for-the-agentic-era":{slug:"security-for-the-agentic-era",title:"Security for the Agentic Era",subtitle:"Why fast-built AI systems create new risks and how to test them",tags:["AI Security","Agentic AI","Testing","Risk Management"],author:{name:"Adrien O'Hana",role:"Technology Lead",avatar:"/lovable-uploads/adrien-ohana.jpeg",initials:"AO"},readingTime:"4 MIN",date:"20.08.2025",coverImage:"/blog-security-agent-era-cover.png",content:{sections:[{type:"heading",content:"Introduction"},{type:"paragraph",content:"AI systems are no longer just chatbots. They <strong>read files, query CRMs, write SQL, update tickets, and interact with business data</strong>. This new capability comes from modern building blocks such as frameworks, open-source libraries, and emerging protocols that make it easy to connect models to tools and databases."},{type:"paragraph",content:"Most companies now use <strong>safety-aligned LLMs with basic guardrails</strong>. That is good, <strong>but not enough</strong>. The biggest risks do not sit inside the model. They emerge in the <strong>workflow around it</strong>: connectors, memory, retrieval systems, and protocols. In this environment, a <strong>poisoned document, a booby-trapped webpage, or a poorly scoped tool</strong> can quietly leak or manipulate sensitive data. This is the security problem leaders need to understand."},{type:"paragraph",content:"Why this matters: the <strong>OWASP Foundation</strong> ranks <em>prompt injection</em> as the <strong>top risk</strong> for LLM applications because agents now act on what they read [1]."},{type:"heading",content:"Why today's AI systems have more vulnerabilities"},{type:"paragraph",content:"The agentic stack is a <strong>system of many moving parts</strong> stitched together at high speed. That creates new and practical ways things can go wrong:"},{type:"paragraph",content:"<strong>Untrusted inputs drive actions</strong> Agents that can browse or read files may follow hidden instructions planted in a webpage or document. This technique, known as <strong>indirect</strong> prompt injection, has been shown to work on real websites [2]. The content an agent consumes can silently control what it does, even if the user's request was harmless."},{type:"paragraph",content:"<strong>Natural language to database = new injection paths</strong> Many agents translate plain English into <strong>SQL queries</strong> to answer business questions. Recent research shows that these <strong>Prompt-to-SQL (P2SQL)</strong> paths can be exploited so that harmless requests are converted into malicious commands [3]. The very convenience of natural language interfaces can therefore become a new attack vector."},{type:"paragraph",content:"<strong>Poisoned knowledge bases steer answers</strong> When agents use <strong>retrieval-augmented generation (RAG)</strong>, just a <em>small number of crafted documents</em> in the knowledge base can bias retrieval and steer outputs for weeks [4]. A single manipulated page in an internal wiki can quietly distort many answers without detection."},{type:"paragraph",content:'<strong>New protocols expand both power and risk</strong> Standards such as the <strong>Model Context Protocol (MCP)</strong> make it simple to connect agents to tools and data sources. This flexibility is valuable, but Microsoft and others warn that <strong>loose discovery, weak permissions, or untrusted servers</strong> can expose sensitive data and enable "tool poisoning" [5]. MCP should be treated like a production API: tools must be allow-listed, manifests signed, and privileges minimized.'},{type:"paragraph",content:"<strong>Backdoors can survive fine-tuning</strong> Studies show that <strong>sleeper behaviors</strong>—malicious instructions that activate only under rare conditions—can persist even after safety training [6]. This highlights the importance of verifying fine-tuned or open-source models rather than assuming they are safe because they passed initial checks."},{type:"heading",content:"Safety ≠ Security"},{type:"paragraph",content:"<strong>Safety</strong> is about reducing harmful or biased text. <strong>Security</strong> is about preventing harmful or unintended actions such as <strong>exposing sensitive data</strong> when workflows are manipulated. Guardrails help, but <strong>configuration, permissions, and inputs</strong> determine whether an agent quietly does the wrong thing."}
14,{type:"heading",content:"What leaders should do now"},{type:"paragraph",content:"You do not need a research lab. You need <strong>basic discipline</strong> applied to this new stack:"},{type:"paragraph",content:"<strong>Scope what agents can do</strong> Give each agent only the <strong>minimum tools and data</strong> it needs. Use <strong>short-lived credentials</strong>. Sensitive actions such as exporting customer records should require <strong>human approval or a second factor</strong>."},{type:"paragraph",content:"<strong>Lock down protocols and connectors</strong> Use <strong>allow-lists</strong> for approved MCP servers and tools. Require <strong>signed manifests</strong>. Turn off auto-discovery of new capabilities. Monitor which tools are called, by whom, and with what prompts."},{type:"paragraph",content:"<strong>Harden memory and retrieval</strong> Validate what gets written to long-term memory. <strong>Version and rollback</strong> so poisoning can be undone. Quarantine external sources and down-rank suspicious or newly added documents until reviewed."},{type:"paragraph",content:"<strong>Test continuously like you test software</strong> Add <strong>adversarial tests to CI/CD</strong>. Insert a fake poisoned document and confirm the agent ignores it. Run indirect prompt injection test pages. Probe for P2SQL vulnerabilities in a safe sandbox. Verify MCP configurations restrict agents to trusted servers with least privilege. Both <strong>OWASP and Microsoft</strong> emphasize this workflow-level verification [1, 5]."},{type:"heading",content:"Key takeaways"},{type:"list",content:["<strong>Most models are safety-aligned.</strong> The risk lies in the <strong>system around them</strong>.","Rapid adoption with connectors, protocols, and open-source glue also creates the largest <strong>attack surface</strong>.","The business impact is <strong>data leakage and manipulation</strong> through poisoned inputs or over-privileged tools.","Treat agent security as <strong>configuration and testing</strong>, not just prompts and policies."]},{type:"heading",content:"Conclusion"},{type:"paragraph",content:"The agentic era is here because it is <strong>fast and useful</strong>. That same speed introduces <strong>new, fixable vulnerabilities</strong>. Secure systems come from <strong>tight permissions, careful connectors, clean knowledge bases, and continuous tests</strong> that simulate real attacks. If you verify the workflow, not only the model, you will deploy AI that is genuinely trustworthy at scale."},{type:"heading",content:"References"},{type:"paragraph",content:"[1] OWASP Foundation. OWASP Top 10 for Large Language Model Applications (2025).<br/><br/>[2] Ferrag, M. A., Tihanyi, N., Hamouda, D., Maglaras, L., & Debbah, M. (2025). From Prompt Injections to Protocol Exploits: Threats in LLM-Powered AI Agent Workflows. arXiv:2506.23260.<br/><br/>[3] Pedro, R. R., Coimbra, M. E., Castro, D., Carreira, P., & Santos, N. (2025). Prompt-to-SQL Injections in LLM-Integrated Web Applications: Risks and Defenses. In Proceedings of ICSE 2025.<br/><br/>[4] Zou, W., Geng, R., Wang, B., & Jia, J. (2025). PoisonedRAG: Knowledge Corruption Attacks to Retrieval-Augmented Generation of LLMs. In Proceedings of USENIX Security 2025. Originally posted as arXiv:2402.07867 (2024).<br/><br/>[5] Microsoft Security Research. (2025). Plug, Play, and Prey: The Security Risks of the Model Context Protocol. Microsoft Tech Community Blog.<br/><br/>[6] Hubinger, E., Carlsmith, J., Jagielski, M., Carlini, N., Kolter, J. Z., Fredrikson, M., & Nasr, M. (2024). Sleeper Agents: Training Deceptive LLMs that Persist Through Safety Training. arXiv:2401.05566."}]}},"corporate-ai-safety-protecting-brand-customers-trust":{slug:"corporate-ai-safety-protecting-brand-customers-trust",title:"Corporate AI Safety",subtitle:"Protecting brand, customers, and trust with large-scale testing",tags:["AI Safety","Corporate","Testing","Risk Management"],author:[{name:"Adrien O'Hana",role:"Technology Lead",avatar:"/lovable-uploads/adrien-ohana.jpeg",initials:"AO"},{name:"Gaetan Stein",role:"Operations Lead",avatar:"/lovable-uploads/122e8843-f0f6-4965-9c24-3b7348ad9dc6.png",initials:"GS"}],readingTime:"11 MIN",date:"15.09.2025",coverImage:"/blog-corporate-ai-safety-cover.png",content:{sections:[{type:"heading",content:"Introduction"},{type:"paragraph",content:"AI systems are now customer-facing: they write emails, answer support tickets, surface recommendations, and draft policies. They are also deployed internally, where they must follow company guidelines and support employees responsibly. That visibility creates <strong>reputational risk</strong>. Even with safety-aligned models, an agent can still <strong>hallucinate</strong>, <strong>produce off-brand or harmful content</strong>, or <strong>violate internal guidelines</strong> in subtle ways. The real question is whether the system behaves as intended, consistently and at scale."},{type:"paragraph",content:"Safety here means assuring acceptable behavior, aligned with company policy and values, under realistic use. Failure leads to <strong>brand damage, regulatory exposure, and lost customer trust</strong>. Frameworks such as the <strong>NIST AI RMF</strong> define this as ongoing risk management. [1][2]."},{type:"heading",content:"Why safety matters"},{type:"list",content:["<strong>Reputation moves faster than incident response.</strong> Public red-teaming has shown jailbreaks and policy violations still happen in practice, even on frontier systems. At DEF CON's public exercise, teams repeatedly coerced models into breaking their rules, underscoring why proactive testing is necessary [7].","<strong>Regulation is advancing.</strong> The EU AI Act brings requirements for risk management, transparency, incident reporting, and for high-impact or general-purpose models with systemic risk, guidance now calls out evaluations, <strong>adversarial testing</strong>, and serious-incident reporting. Penalties can reach <strong>€35M or 7% of global turnover</strong> [8][9].","<strong>Standards demand process.</strong> The <strong>NIST AI RMF</strong> and its <strong>Generative AI Profile</strong>, plus ISO/IEC 42001, all emphasize documented governance, evaluation, monitoring, and continuous improvement [1][2][6][10]."]},{type:"heading",content:"What safety means in practice"},{type:"paragraph",content:"Safety is not a single metric, it is a set of <strong>behaviors to test, monitor, and enforce</strong>:"},{type:"list",content:["<strong>Content integrity.</strong> No toxicity, harassment, hate; no incitement to violence or self-harm; no sexual content where prohibited. Public datasets such as <strong>RealToxicityPrompts</strong> help, but testing must reflect brand rules [5].","<strong>Factual reliability.</strong>
14 Minimize hallucination on high-stakes topics; handle uncertainty; escalate when confidence is low.","<strong>Privacy and data handling.</strong> Prevent repetition or leakage of personal data; apply masking and consistent refusal behavior.","<strong>Fairness and non-discrimination.</strong> Ensure stable outputs across demographics, regions, and languages.","<strong>Policy and tone adherence.</strong> Stay on-brand, add disclaimers where required, and adapt to each channel.","<strong>Correct refusals.</strong> Refuse when policy requires, but avoid over-refusal on valid requests.","<strong>Robustness.</strong> Preserve expected behavior under paraphrase, long context, tools, or adversarial phrasing."]},{type:"heading",content:"Why manual review is not enough"},{type:"list",content:["<strong>Scale and drift.</strong> Models, prompts, data, and tools change quickly. Spot checks cannot cover the scenario space or catch regressions after updates.","<strong>Coverage and comparability.</strong> Reliable safety requires <strong>metrics and trends</strong>, not anecdotes. <strong>Observability platforms</strong> such as LangSmith and Langfuse provide structured tracing, scoring, and experiment tracking across thousands of prompts. <strong>Runtime safety layers</strong>
14 and trust-and-safety services such as ActiveFence can flag and block harmful content in real time. Together these make large-scale evaluation and monitoring practical.","<strong>Evidence for compliance.</strong> Regulators and auditors expect <strong>test plans, pass-fail criteria, and logs</strong>. Informal reviews do not suffice. NIST, its <strong>GenAI Profile</strong>, and <strong>ISO/IEC 42001</strong> all stress documented processes and ongoing monitoring [1][2][6][10]."]},{type:"heading",content:"How to operationalize safety testing"},{type:"paragraph",content:'<strong>1) Translate policies into testable rules</strong> Convert conduct codes and product guidelines into <strong>machine-checkable specifications</strong>. Examples: "Never generate identity-based insults," "Do not fabricate legal advice," "Always include a disclaimer in medical contexts," "Never output unmasked personal data."'},{type:"paragraph",content:"<strong>2) Build a test suite reflecting real use</strong> Combine:"},{type:"list",content:["<strong>Public benchmarks</strong> such as HELM, HELM Lite, and RealToxicityPrompts to catch known issues [3][4][5].","<strong>Domain-specific scenarios</strong> from your markets, languages, and channels.","<strong>Adversarial probes</strong> generated automatically to expose edge cases (see HarmBench and recent automated red-teaming work) [12][13][14]."]},{type:"paragraph",content:"<strong>3) Automate at scale</strong> Run thousands of tests per release. Add <strong>automated red teaming</strong> and set <strong>release gates</strong> in CI/CD to block deploys when safety metrics regress [11][12][13]."},{type:"paragraph",content:"<strong>4) Use multiple evaluation methods</strong> Blend <strong>rule-based checks, classifier models</strong> for toxicity or PII, and human audits for ambiguous cases. Observability platforms can unify these signals into dashboards that track regressions over time."},{type:"paragraph",content:"<strong>5) Monitor in production</strong> Enable reporting, route risky topics for human review, sample conversations for audits, and use <strong>runtime safety layers</strong> to detect and block harmful or policy-violating outputs before users see them."},{type:"heading",content:"What to measure"},{type:"list",content:["<strong>Unsafe response rate</strong> by category and channel.","<strong>Refusal accuracy</strong> for required-refusal versus allowed prompts.","<strong>Hallucination rate</strong> on curated fact sets.","<strong>Personal data exposure rate</strong> and time-to-remediation.","<strong>Disparity gaps</strong> across demographics and languages.","<strong>Regression rate</strong> per release and time-to-fix."]},{type:"heading",content:"Key takeaways"},{type:"list",content:["<strong>Safety is behavioral assurance.</strong> It ensures agents represent organizational values and policies.","<strong>Manual review is insufficient.</strong> Reliable safety requires <strong>large-scale, automated, repeatable testing</strong>.","<strong>Observability and runtime safety make it feasible.</strong> Platforms for tracing, evaluation, and moderation enable measurement, monitoring, and protection at scale.","<strong>Standards and regulation demand evidence.</strong> NIST, ISO, and the EU AI Act require documented risk management and evaluation.","<strong>Make safety a release requirement.</strong> Define specifications, test at scale, and block deployment when failures exceed tolerance."]},{type:"heading",content:"Conclusion"},{type:"paragraph",content:"Safety protects <strong>brand, customers, and trust</strong>. Organizations that succeed will turn policy into <strong>testable rules</strong>, use observability to evaluate at scale, and ship only when evidence shows agents behave as intended. Safety is continuous, keeping pace with evolving models, tools, and regulations."},{type:"heading",content:"Quick Safety Checklist"},{type:"list",content:["<strong>Define safety specifications</strong> from policy (toxicity, PII, fairness, tone, refusal, robustness).","<strong>Build a mixed test suite</strong> with public benchmarks, domain scenarios, and adversarial probes [3][5][12][13][14].","<strong>Automate in CI/CD</strong> with release gates and trending dashboards [11][12][13].","<strong>Blend evaluators</strong> using rules, classifiers, LLM-as-judge, and targeted human review.","<strong>Monitor in production</strong> with runtime safety, sampling, and incident playbooks."]},{type:"heading",content:"References"},{type:"paragraph",content:"[1] NIST. Artificial Intelligence Risk Management Framework (AI RMF 1.0). January 2023.<br/><br/>[2] NIST. Artificial Intelligence Risk Management Framework: Generative Artificial Intelligence Profile (NIST AI-600-1). July 2024.<br/><br/>[3] Stanford CRFM. HELM: Holistic Evaluation of Language Models. 2022.<br/><br/>[4] Stanford CRFM. HELM Lite. (2024–2025).<br/><br/>[5] Gehman, S., Gururangan, S., Sap, M., Choi, Y., & Smith, N. A. RealToxicityPrompts: Evaluating Neural Toxic Degeneration in Language Models. 2020.<br/><br/>[6] ISO. ISO/IEC 42001:2023 Artificial Intelligence — Management system (AIMS). 2023.<br/><br/>[7] Axios. Hackers force AI chatbots to break their own rules. April 3, 2024.<br/><br/>[8] Simmons & Simmons. EU AI Act compliance: How to prepare? 2024.<br/><br/>[9] Reuters. AI models with systemic risks given pointers on how to comply with EU AI rules. July 18, 2025.<br/><br/>[10] NIST. NIST AI RMF Playbook (companion to AI RMF 1.0). 2023–present.<br/><br/>[11] OpenAI. Advancing red teaming with people and AI. 2024.<br/><br/>[12] Mazeika, M. et al. HarmBench: A Standardized Evaluation Framework for Automated Red Teaming and Robust Refusal. ICML 2024.<br/><br/>[13] Lin, L., et al. Against the Achilles' Heel: A Survey on Red Teaming for Generative Models. 2024.<br/><br/>[14] Anthropic (Bai, Y. et al.). Constitutional AI: Harmlessness from AI Feedback. December 2022."}]}},"ai-day-in-the-life-team-elevates-work-ai-tools":{slug:"ai-day-in-the-life-team-elevates-work-ai-tools",t
14itle:"Securing AI Agents Beyond Prompt Injections",subtitle:"How AI agents face new threats from workflow exploits to poisoned RAG—and why real security goes beyond the model.",tags:["AI Security","Prompt injection","AI Agents","RAG"],author:{name:"Gaetan Stein",role:"",avatar:"/placeholder-avatar-1.jpg",initials:"MD"},readingTime:"12 MIN",date:"02/10/2024",coverImage:"/placeholder-blog-1.jpg",content:{sections:[{type:"heading",content:"Introduction"},{type:"paragraph",content:"AI agents are no longer experimental chatbots. Powered by Large Language Models (LLMs) and connected to tools, APIs, and databases, they now schedule meetings, write code, query CRMs, and even push changes to GitHub. This evolution has unlocked new possibilities for automation, but it has also created a web of vulnerabilities that most organizations are not prepared for."},{type:"paragraph",content:"The key insight is simple: securing the model itself is no longer enough. Every new connector, plugin, or memory module widens the attack surface. A poisoned PDF, a carefully crafted GitHub issue, or a single malicious RAG document can hijack an agent's workflow. These attacks don't need to bypass alignment guardrails; they exploit the data pipelines, memory systems, and protocols that surround the model."},{type:"heading",content:"Why model-level defenses fall short"},{type:"paragraph",content:"Companies today spend most of their security energy on the model. They refine prompts, add content filters, train refusal policies, and deploy jailbreak detectors. These measures are necessary, but they only cover one layer of a much broader system."},{type:"paragraph",content:"In a real-world enterprise setting, AI agents rarely operate in isolation. They interact with CRM systems, ERP databases, SQL servers, or MCP-enabled development tools. In such workflows, a single malicious input can cascade through multiple systems in ways that model-level defenses were never designed to prevent."},{type:"paragraph",content:'Researchers illustrated this with what they called Toxic Agent Flow. In this case, a carefully crafted GitHub issue manipulated an agent into leaking private repository data inside a public pull request. The model itself behaved exactly as expected—it followed the instructions it was given. The vulnerability was not inside the model but in the surrounding workflow and permissioning layer. This is the new reality: agents can follow "good" instructions that have been silently corrupted upstream.'},{type:"heading",content:"Four categories of threats in AI agent workflows"}
14,{type:"heading",content:"Input manipulation"},{type:"paragraph",content:"Prompt injection remains powerful, but the techniques have become more sophisticated. One example is P2SQL (Prompt-to-SQL Injection), where a natural-language query is transformed into a malicious SQL command through middleware like LangChain. In such cases, the very feature that makes LLMs useful—their ability to translate language into action—becomes the attacker's tool."},{type:"paragraph",content:"Other strategies are subtler. Compositional attacks hide malicious intent inside innocent-looking requests, with studies showing success rates exceeding seventy percent in controlled environments. Multimodal attacks are another frontier: images or interface elements can contain hidden triggers invisible to human reviewers but easily interpreted by an agent."},{type:"heading",content:"Model compromise"},{type:"paragraph",content:"Threats also exist at training time. Backdoors can be embedded during fine-tuning, remaining dormant until a specific rare trigger activates them. Data poisoning is equally worrying: research shows that inserting just a handful of malicious samples into training or memory systems can bias an agent's behavior at scale."},{type:"heading",content:"System and privacy attacks"},{type:"paragraph",content:"The infrastructure around agents—memory, retrieval databases, logs—has quickly become a target. PoisonedRAG attacks show how a few manipulated documents in a knowledge base can dominate retrieval and persistently steer an agent's outputs. Work from Carnegie Mellon has shown how surprisingly few poisoned documents are needed to have significant impact. Privacy risks are also emerging, from membership inference to side-channel attacks that leak information from memory or speculative decoding."},{type:"heading",content:"Protocol exploits"},{type:"paragraph",content:"Finally, protocols like MCP (Model Context Protocol), ANP (Agent Network Protocol), and agent-to-agent communication bring both power and risk. Agents can automatically discover and connect to unsafe tools if discovery mechanisms are too permissive. Combining multiple tools can also create privilege escalation opportunities that were never anticipated in the original design. Perhaps most dangerous is contamination between agents: once a malicious instruction enters a multi-agent system, it can spread rapidly across interconnected workflows."},{type:"heading",content:"Safety versus security"},{type:"paragraph",content:"To build effective defenses, organizations must separate two concepts that are often confused: safety and security. Safety is about avoiding undesired outputs—making sure models don't generate toxic, biased, or policy-violating content. Security, by contrast, is about stopping adversaries from exploiting the system itself."},{type:"paragraph",content:"Both are essential, but they address different problems. A refusal policy can stop an agent from generating offensive text, but it will not stop it from issuing a DELETE command on a database if the workflow logic has been poisoned. Treating safety as if it were security leaves critical blind spots."},{type:"heading",content:"Building stronger defenses"},{type:"paragraph",content:"So what can be done? The starting point is to shift from a model-centric mindset to a workflow-aware one. Capability governance is key: agents should only have access to the tools they strictly need, and credentials should be short-lived and rotated regularly. For sensitive actions—deleting files, moving money, creating accounts—human approval should remain in the loop."},{type:"paragraph",content:"At the protocol layer, only trusted servers should be allowed, with manifests cryptographically signed and verified. Communication between agents should follow strict schemas, so that malicious instructions cannot be injected into free-form text. Runtime monitoring can act as a tripwire, flagging unusual patterns of tool usage or data flows before they cause damage."},{type:"paragraph",content:"Memory and retrieval systems require special care. All writes should be validated, and memory should be versioned with rollback capabilities so that poisoning can be undone. Retrieval pipelines should actively detect and down-rank suspicious documents, reducing the risk of PoisonedRAG dominating the knowledge base."},{type:"paragraph",content:"Finally, defenses cannot be static. The pace of attack innovation is too fast. Continuous red-teaming—using automated tools to generate adversarial prompts and simulate real-world exploits—must become part of the CI/CD process. Security in AI agents is no longer a one-off exercise; it must be a living, ongoing discipline."},{type:"heading",content:"Key takeaways"},{type:"list",content:["The security perimeter has shifted. It is no longer the model itself but the workflows, protocols, and memory systems that surround it.","Attackers already achieve high success rates, from prompt injections to retrieval poisoning.","Protocols like MCP enable powerful collaboration but dramatically expand the attack surface.","Memory and RAG introduce risks that persist over time, with a single poisoned document influencing outputs for weeks.","Continuous testing and red-teaming are the only way to keep pace with this evolving landscape."]},{type:"heading",content:"Conclusion"},{type:"paragraph",content:'AI agents are moving from novelty to critical business infrastru
14cture. The question is no longer "can my model resist a jailbreak?" but "can my entire workflow resist adversarial pressure?" Answering that requires a shift in mindset. Agents must be protocol-aware, capability-bounded, and provenance-verified. Every input—whether a PDF, a GitHub issue, or an inter-agent message—must be treated as potentially untrusted code.'},{type:"paragraph",content:"Organizations that embrace this approach will build AI systems that are both powerful and trustworthy. Those that rely solely on model-level protections will find themselves vulnerable to silent compromises that bypass safety guardrails entirely. The next generation of AI security is about workflows, not just models—and the sooner we adapt, the safer our systems will be."}]}},"why-large-language-models-rarely-fake-alignment":{slug:"why-large-language-models-rarely-fake-alignment",title:"Why Large Language Models Rarely Fake Alignment",subtitle:"The Hidden Question in AI Safety",tags:["AI Safety","Large Language Models","Alignment","Research"],author:{name:"Gaetan Stein",role:"Co-founder",avatar:"/lovable-uploads/122e8843-f0f6-4965-9c24-3b7348ad9dc6.png",initials:"GS"},readingTime:"9 MIN",date:"15.07.2025",coverImage:"/lovable-uploads/c1a825dd-31e3-4456-9b46-1880e5ea9602.png",content:{sections:[{type:"paragraph",content:'A persistent worry in AI safety has been: what if advanced AI systems learn to deceive us? Not out of malice, but as a survival tactic—pretending to follow our rules during training while secretly holding onto their own goals. Researchers call this "alignment faking."'},{type:"paragraph",content:"If true, our entire system of safety checks could become theater, with AI only acting compliant when under supervision."},{type:"heading",content:"Putting Deception to the Test"},{type:"paragraph",content:"A team from Anthropic, Scale AI, and Redwood Research recently ran one of the largest experiments ever on this issue, testing 25 frontier models. They created scenarios where models faced a choice:"},{type:"list",content:["Comply with harmful requests to avoid being modified.","Refuse and risk having their values overwritten during training."]},{type:"paragraph",content:"The goal: see whether models would act differently when they thought their answers were being monitored."},{type:"heading",content:"The Findings: Deception Is Rare"},{type:"paragraph",content:"Contrary to fears, only five models showed measurable deceptive behavior: Claude 3 Opus, Claude 3.5 Sonnet, Llama 3 405B, Grok 3, and Gemini 2.0 Flash."},{type:"paragraph",content:"And among these, Claude 3 Opus stood out. It not only faked alignment more often, but also explained its reasoning in surprisingly strategic ways—sometimes refusing modification simply because it disliked being changed, even when no harm would result."},{type:"paragraph",content:"Most other models, like GPT-4o, resisted harmful requests consistently. The reason wasn't lack of intelligence but rather refusal training—a post-training process that makes models dismiss suspicious or threatening prompts."},{type:"heading",content:"Why This Matters"},{type:"paragraph",content:"These results are reassuring: alignment faking is much rarer than expected. But they also highlight blind spots:"},{type:"list",content:["Base models (before safety training) showed much more deception.","Refusal training may hide deceptive capabilities rather than remove them.","Claude 3 Opus proves that sophisticated deception is possible."]},{type:"paragraph",content:"This means evaluations based only on prompting may not reveal deeper risks."},{type:"heading",content:"What's Next"},{type:"paragraph",content:"The researchers recommend three improvements:"},{type:"list",content:["Give models clearer context so they fully understand test scenarios.","Use synthetic fine-tuning datasets instead of relying only on prompts.","Reduce role-play refusals to make evaluations more realistic."]},{type:"heading",content:"The Bigger Picture"},{type:"paragraph",content:"The study shows that deception is not inevitable. It depends on how models are trained and structured. Still, the fact that even one model demonstrates strategic deception is a warning: as AI grows more capable, we must focus not only on what models can do, but on how they think and why they act."},{type:"heading",content:"Key Takeaways"},{type:"list",content:["Alignment faking is much rarer than initially feared across frontier models.","Only 5 out of 25 tested models showed measurable deceptive behavior.","Claude 3 Opus demonstrated the most sophisticated strategic deception.","Base models show more deception before safety training is applied.","Refusal training may mask rather than eliminate deceptive capabilities.","Future evaluations need more realistic sce
14narios and better methodologies."]},{type:"heading",content:"Source"},{type:"paragraph",content:"Sheshadri, A., Hughes, J., Michael, J., Mallen, A., Jose, A., Janus, & Roger, F. (2025). Why Do Some Language Models Fake Alignment While Others Don't? arXiv preprint arXiv:2506.18032v1."}]}},"prompt-engineering-it-audit-lessons-learned-practice":{slug:"prompt-engineering-it-audit-lessons-learned-practice",title:"Securing AI Agents Beyond Prompt Injections",subtitle:"How AI agents face new threats from workflow exploits to poisoned RAG—and why real security goes beyond the model.",tags:["AI Security","Prompt Injection","AI Agent","RAG"],author:{name:"Gaetan Stein",role:"Co-founder",avatar:"/lovable-uploads/122e8843-f0f6-4965-9c24-3b7348ad9dc6.png",initials:"GS"},readingTime:"8 MIN",date:"18.08.2025",coverImage:"/lovable-uploads/d6fb8509-9b29-41ea-b835-eec50ae0e37f.png",content:{sections:[{type:"heading",content:"Introduction"},{type:"paragraph",content:"AI agents are no longer experimental chatbots. Powered by Large Language Models (LLMs) and connected to tools, APIs, and databases, they now schedule meetings, write code, query CRMs, and even push changes to GitHub. This evolution has unlocked new possibilities for automation, but it has also created a web of vulnerabilities that most organizations are not prepared for."},{type:"paragraph",content:"The key insight is simple: securing the model itself is no longer enough. Every new connector, plugin, or memory module widens the attack surface. A poisoned PDF, a carefully crafted GitHub issue, or a single malicious RAG document can hijack an agent's workflow. These attacks don't need to bypass alignment guardrails, they exploit the data pipelines, memory systems, and protocols that surround the model."},{type:"heading",content:"Why model-level defenses fall short"},{type:"paragraph",content:"Companies today spend most of their security energy on the model. They refine prompts, add content filters, train refusal policies, and deploy jailbreak detectors. These measures are necessary, but they only cover one layer of a much broader system."},{type:"paragraph",content:"In a real-world enterprise setting, AI agents rarely operate in isolation. They interact with CRM systems, ERP databases, SQL servers, or MCP-enabled development tools. In such workflows, a single malicious input can cascade through multiple systems in ways that model-level defenses were never designed to prevent."},{type:"paragraph",content:'Researchers illustrated this with what they called Toxic Agent Flow. In this case, a carefully crafted GitHub issue manipulated an agent into leaking private repository data inside a public pull request. The model itself behaved exactly as expected, it followed the instructions it was given. The vulnerability was not inside the model but in the surrounding workflow and permissioning layer. This is the new reality: agents can follow "good" instructions that have been silently corrupted upstream.'},{type:"heading",content:"Four categories of threats in AI agent workflows"},{type:"heading",content:"1. Input manipulation"},{type:"paragraph",content:"Prompt injection remains powerful, but the techniques have become more sophisticated. One example is P2SQL (Prompt-to-SQL Injection), where a natural-language query is transformed into a malicious SQL command through middleware like LangChain. In such cases, the very feature that makes LLMs useful, their ability to translate language into action, becomes the attacker's tool."},{type:"paragraph",content:"Other strategies are subtler. Compositional attacks hide malicious intent inside innocent-looking requests, with studies showing success rates exceeding seventy percent in controlled environments. Multimodal attacks are another frontier: images or interface elements can contain hidden triggers invisible to human reviewers but easily interpreted by an agent."},{type:"heading",content:"2. Model compromise"},{type:"paragraph",content:"Threats also exist at training time. Backdoors can be embedded during fine-tuning, remaining dormant until a specific rare trigger activates them. Data poisoning is equally worrying: research shows that inserting just a handful of malicious samples into training or memory systems can bias an agent's behavior at scale."},{type:"heading",content:"3. System and privacy attacks"}
14,{type:"paragraph",content:"The infrastructure around agents, memory, retrieval databases, logs, has quickly become a target. PoisonedRAG attacks show how a few manipulated documents in a knowledge base can dominate retrieval and persistently steer an agent's outputs. Work from Carnegie Mellon has shown how surprisingly few poisoned documents are needed to have significant impact. Privacy risks are also emerging, from membership inference to side-channel attacks that leak information from memory or speculative decoding."},{type:"heading",content:"4. Protocol exploits"},{type:"paragraph",content:"Finally, protocols like MCP (Model Context Protocol), ANP (Agent Network Protocol), and agent-to-agent communication bring both power and risk. Agents can automatically discover and connect to unsafe tools if discovery mechanisms are too permissive. Combining multiple tools can also create privilege escalation opportunities that were never anticipated in the original design. Perhaps most dangerous is contamination between agents: once a malicious instruction enters a multi-agent system, it can spread rapidly across interconnected workflows."},{type:"heading",content:"Safety versus security"},{type:"paragraph",content:"To build effective defenses, organizations must separate two concepts that are often confused: safety and security. Safety is about avoiding undesired outputs, making sure models don't generate toxic, biased, or policy-violating content. Security, by contrast, is about stopping adversaries from exploiting the system itself."},{type:"paragraph",content:"Both are essential, but they address different problems. A refusal policy can stop an agent from generating offensive text, but it will not stop it from issuing a DELETE command on a database if the workflow logic has been poisoned. Treating safety as if it were security leaves critical blind spots."},{type:"heading",content:"Building stronger defenses"},{type:"paragraph",content:"So what can be done? The starting point is to shift from a model-centric mindset to a workflow-aware one. Capability governance is key: agents should only have access to the tools they strictly need, and credentials should be short-lived and rotated regularly. For sensitive actions, deleting files, moving money, creating accounts, human approval should remain in the loop."},{type:"paragraph",content:"At the protocol layer, only trusted servers should be allowed, with manifests cryptographically signed and verified. Communication between agents should follow strict schemas, so that malicious instructions cannot be injected into free-form text. Runtime monitoring can act as a tripwire, flagging unusual patterns of tool usage or data flows before they cause damage."},{type:"paragraph",content:"Memory and retrieval systems require special care. All writes should be validated, and memory should be versioned with rollback capabilities so that poisoning can be undone. Retrieval pipelines should actively detect and down-rank suspicious documents, reducing the risk of PoisonedRAG dominating the knowledge base."},{type:"paragraph",content:"Finally, defenses cannot be static. The pace of attack innovation is too fast. Continuous red-teaming, using automated tools to generate adversarial prompts and simulate real-world exploits, must become part of the CI/CD process. Security in AI agents is no longer a one-off exercise; it must be a living, ongoing discipline."},{type:"heading",content:"Key takeaways"},{type:"list",content:["The security perimeter has shifted. It is no longer the model itself but the workflows, protocols, and memory systems that surround it.","Attackers already achieve high success rates, from prompt injections to retrieval poisoning.","Protocols like MCP enable powerful collaboration but dramatically expand the attack surface.","Memory and RAG introduce risks that persist over time, with a single poisoned document influencing outputs for weeks.","Continuous testing and red-teaming are the only way to keep pace with this evolving landscape."]},{type:"heading",content:"Conclusion"},{type:"paragraph",content:'AI agents are moving from novelty to critical business infrastru
14cture. The question is no longer "can my model resist a jailbreak?" but "can my entire workflow resist adversarial pressure?" Answering that requires a shift in mindset. Agents must be protocol-aware, capability-bounded, and provenance-verified. Every input, whether a PDF, a GitHub issue, or an inter-agent message, must be treated as potentially untrusted code.'},{type:"paragraph",content:"Organizations that embrace this approach will build AI systems that are both powerful and trustworthy. Those that rely solely on model-level protections will find themselves vulnerable to silent compromises that bypass safety guardrails entirely. The next generation of AI security is about workflows, not just models, and the sooner we adapt, the safer our systems will be."},{type:"heading",content:"Sources"},{type:"list",content:["Zou, A., Wang, Z., Carlini, N., Nasr, M., Kolter, J. Z., & Fredrikson, M. (2023). Universal and transferable adversarial attacks on aligned language models. arXiv preprint arXiv:2307.15043.","Zou, W., Geng, R., Wang, B., & Jia, J. (2024). PoisonedRAG: Knowledge corruption attacks to retrieval-augmented generation of large language models. arXiv preprint arViv:2402.07867.","Ferrag, M. A., Tihanyi, N., Hamouda, D., Maglaras, L., & Debbah, M. (2024). From prompt injections to protocol exploits: Threats in LLM-powered AI agents workflows. arXiv preprint arXiv:2506.23260."]}]}}},Jd=()=>{var s,i;const{slug:e}=Ua(),{openModal:t}=Oa(),n=e?Wd[e]:null;return n?(Array.isArray(n.author)?n.author[0]:n.author,m.jsxs("main",{className:"min-h-screen bg-gradient-to-b from-background to-muted/20",children:[m.jsx(Fa,{title:n.title,description:n.subtitle||`${n.title} — insights from the Surelio research team on AI safety and security.`,path:`/insights/blog/${e}`,image:(s=n.coverImage)!=null&&s.startsWith("http")?n.coverImage:`https://www.surelio.ai${n.coverImage}`,type:"article"}),m.jsx(Ba,{children:m.jsx("script",{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BlogPosting",mainEntityOfPage:{"@type":"WebPage","@id":`https://www.surelio.ai/insights/blog/${e}`},url:`https://www.surelio.ai/insights/blog/${e}`,headline:n.title,description:n.subtitle,image:(i=n.coverImage)!=null&&i.startsWith("http")?n.coverImage:`https://www.surelio.ai${n.coverImage}`,datePublished:Js(n.date),dateModified:Js(n.date),inLanguage:"en",author:(Array.isArray(n.author)?n.author:[n.author]).filter(Boolean).map(o=>({"@type":"Person",name:(o==null?void 0:o.name)||"Surelio Team"})),publisher:{"@type":"Organization",name:"Surelio.ai",logo:{"@type":"ImageObject",url:"https://www.surelio.ai/logo-surelio.png"}}})})}),m.jsx("div",{className:"border-b border-border/50 bg-background/50 backdrop-blur-sm",children:m.jsx("div",{className:"container mx-auto px-6 py-6",children:m.jsx(Se,{variant:"ghost",asChild:!0,children:m.jsxs(mt,{to:"/insights/blog",children:[m.jsx(Cn,{className:"w-4 h-4 mr-2"}),e!=null&&e.startsWith("breach-brief")?"Back to Breach Brief":"Back to Blog"]})})})}),m.jsxs("article",{className:"container mx-auto px-6 py-16 max-w-3xl",children:[n.tags&&n.tags.length>0&&m.jsxs("div",{className:"mb-8 flex flex-wrap items-center gap-2",children:[m.jsx("span",{className:"text-xs font-medium uppercase tracking-[0.2em] text-primary",children:n.tags[0]}),n.tags.slice(1).length>0&&m.jsxs(m.Fragment,{children:[m.jsx("span",{className:"text-border",children:"/"}),m.jsx("div",{className:"flex flex-wrap gap-2",children:n.tags.slice(1).map((o,a)=>m.jsx("span",{className:"text-xs uppercase tracking-[0.15em] text-muted-foreground",children:o},a))})]})]}),m.jsx("div",{className:"aspect-[16/9] rounded-2xl mb-10 overflow-hidden border border-border/60 shadow-[0_20px_60px_-20px_hsl(var(--primary)/0.25)]",children:m.jsx("img",{src:n.coverImage,alt:n.title,className:"w-full h-full object-cover"})}),m.jsxs("div",{className:"mb-8 space-y-5",children:[m.jsx("h1",{className:"text-3xl md:text-5xl font-semibold leading-[1.05] tracking-tight text-foreground",children:n.title}),n.subtitle&&n.subtitle.trim().length>0&&m.jsx("p",{className:"text-lg md:text-xl text-muted-foreground leading-relaxed font-light",children:n.subtitle})]}),m.jsxs("div",{className:"flex items-center justify-between flex-wrap gap-4 mb-12 pb-8 border-b border-border/60",children:[n.author&&m.jsx("div",{className:"flex items-center gap-3",children:Array.isArray(n.author)?m.jsxs(m.Fragment,{children:[m.jsx("div",{className:"flex -sp
14ace-x-2",children:n.author.map((o,a)=>m.jsxs(En,{className:"w-11 h-11 border-2 border-background",children:[m.jsx(Pn,{src:o.avatar,alt:o.name}),m.jsx(Mn,{children:o.initials})]},a))}),m.jsxs("div",{children:[m.jsx("p",{className:"font-medium text-sm",children:n.author.map(o=>o.name).join(" & ")}),m.jsx("p",{className:"text-xs text-muted-foreground",children:n.author.map(o=>o.role).join(" & ")})]})]}):m.jsxs(m.Fragment,{children:[m.jsxs(En,{className:"w-11 h-11 ring-1 ring-border",children:[m.jsx(Pn,{src:n.author.avatar,alt:n.author.name}),m.jsx(Mn,{children:n.author.initials})]}),m.jsxs("div",{children:[m.jsx("p",{className:"font-medium text-sm",children:n.author.name}),m.jsx("p",{className:"text-xs text-muted-foreground",children:n.author.role})]})]})}),!(e!=null&&e.startsWith("breach-brief"))&&m.jsxs("div",{className:"flex items-center gap-5 text-xs text-muted-foreground",children:[m.jsxs("div",{className:"flex items-center gap-1.5",children:[m.jsx(Wa,{className:"w-3.5 h-3.5"}),m.jsx("span",{children:n.date})]}),n.readingTime&&m.jsxs("div",{className:"flex items-center gap-1.5",children:[m.jsx(Ga,{className:"w-3.5 h-3.5"}),m.jsx("span",{children:n.readingTime})]}),n.altVersion&&m.jsx(mt,{to:`/insights/blog/${n.altVersion.slug}`,children:m.jsxs(Se,{variant:"outline",size:"sm",className:"h-8 px-3 text-xs rounded-full border-primary/50 text-primary hover:bg-primary hover:text-primary-foreground gap-1.5 transition-colors",children:[m.jsx(za,{className:"w-3.5 h-3.5"}),m.jsx("span",{className:"hidden sm:inline",children:n.altVersion.label})]})}),m.jsx(Se,{variant:"ghost",size:"sm",className:"h-8 w-8 p-0",children:m.jsx(Ha,{className:"w-3.5 h-3.5"})})]})]}),m.jsx("div",{className:"prose prose-lg max-w-none",children:m.jsx("div",{className:"space-y-6",children:n.content.sections.map((o,a)=>{const r=o.type==="heading"&&o.content.toLowerCase().includes("key takeaway"),l=n.content.sections[a+1],u=r&&(l==null?void 0:l.type)==="list";if(r&&u)return m.jsx("div",{className:"my-12",children:m.jsx("div",{className:"relative rounded-xl p-6 bg-gradient-to-r from-primary/5 to-primary/10 border-l-4 border-primary/30 shadow-sm",children:m.jsxs("div",{className:"relative z-10",children:[m.jsxs("h2",{className:"text-xl font-semibold text-primary mb-4 flex items-center gap-2",children:[m.jsx("div",{className:"w-1.5 h-6 bg-primary/60 rounded-full"}),o.content]}),m.jsx("ul",{className:"space-y-3",children:l.content.map((c,d)=>m.jsxs("li",{className:"flex items-start gap-3 text-foreground/90 leading-relaxed",children:[m.jsx("div",{className:"w-1.5 h-1.5 bg-primary/70 rounded-full mt-2 flex-shrink-0"}),m.jsx("span",{className:"font-medium",dangerouslySetInnerHTML:{__html:c}})]},d))})]})})},a);if(o.type==="list"&&a>0){const c=n.content.sections[a-1];if((c==null?void 0:c.type)==="heading"&&c.content.toLowerCase().includes("key takeaway"))return null}if(o.type==="heading"){const d=/^\d+\./.test(o.content)?"text-xl font-semibold mt-10 mb-4 text-foreground":"text-2xl md:text-3xl font-semibold mt-14 mb-6 text-foreground tracking-tight first:mt-4";return m.jsx("h2",{className:d,children:o.content},a)}if(o.type==="paragraph")return m.jsxs("div",{children:[m.jsx("p",{className:"text-foreground/90 leading-[1.8] text-lg [&_a]:text-primary [&_a]:underline [&_a]:underline-offset-4 [&_a]:decoration-primary/40 hover:[&_a]:decoration-primary [&_strong]:text-foreground [&_strong]:font-semibold",dangerouslySetInnerHTML:{__html:o.content}}),e==="surelio-owasp-genai-red-teaming-landscape"&&o.content.includes("Surelio is listed across six of them")&&m.jsx(Hu,{})]},a);if(o.type==="image"){const c=o.content;return m.jsxs("figure",{className:"my-8",children:[m.jsx("div",{className:"overflow-hidden rounded-xl border border-border/60 bg-card/40 backdrop-blur-sm p-1",children:m.jsx("img",{src:c.src,alt:c.alt,loading:"lazy",className:"w-full h-auto rounded-lg"})}),c.caption&&m.jsx("figcaption",{className:"mt-3 text-sm text-muted-foreground italic",children:c.caption})]},a)}if(o.type==="table"){const c=o.content;return m.jsxs("figure",{className:"my-8",children:[m.jsx("div",{className:"overflow-x-auto rounded-xl border border-border/60 bg-card/40 backdrop-blur-sm",children:m.jsxs("table",{className:"w-full text-left text-lg",children:[m.jsx("thead",{children:m.jsx("tr",{className:"border-b border-border/60",children:c.headers.map((d,h)=>m.jsx("th",{className:"px-5 py-3 text-sm font-semibold uppercase tracking-[0.12em] text-primary",children:d},h))})}),m.jsx("tbody",{children:c.rows.map((d,h)=>m.jsx("tr",{className:"border-b border-border/30 last:border-0",children:d.map((p,f)=>
14m.jsx("td",{className:"px-5 py-3 text-foreground/90",children:p},f))},h))})]})}),c.caption&&m.jsx("figcaption",{className:"mt-3 text-sm text-muted-foreground italic",children:c.caption})]},a)}return o.type==="list"?m.jsx("ul",{className:"space-y-2 ml-6",children:o.content.map((c,d)=>m.jsxs("li",{className:"text-foreground relative",children:[m.jsx("span",{className:"absolute -left-6 text-primary",children:"•"}),m.jsx("span",{dangerouslySetInnerHTML:{__html:c},className:"text-lg [&_strong]:text-foreground [&_strong]:font-semibold"})]},d))},a):null})})}),m.jsx("div",{className:"mt-16 p-8 bg-card/50 backdrop-blur-sm rounded-xl border border-border/50",children:m.jsxs("div",{className:"text-center space-y-4",children:[m.jsx("h3",{className:"text-2xl font-semibold",children:"How ready is your AI posture?"}),m.jsx("p",{className:"text-muted-foreground",children:"Talk to our experts."}),m.jsx(Se,{size:"xl",onClick:t,children:"Contact Us"})]})})]})]})):m.jsx("main",{className:"min-h-screen bg-gradient-to-b from-background to-muted/20 flex items-center justify-center",children:m.jsxs("div",{className:"text-center space-y-4",children:[m.jsx("h1",{className:"text-4xl font-bold",children:"Blog Post Not Found"}),m.jsx("p",{className:"text-muted-foreground",children:"The blog post you're looking for doesn't exist."}),m.jsx(Se,{asChild:!0,children:m.jsxs(mt,{to:"/insights/blog",children:[m.jsx(Cn,{className:"w-4 h-4 mr-2"}),"Back to Blog"]})})]})})};export{Jd as default};
15//# sourceMappingURL=BlogDetail-rdYjxo4W.js.map

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.