epare:Je()},replaceCartesianGraphicalItem:{reducer(e,t){var{prev:r,next:n}=t.payload,i=Ur(e).cartesianItems.indexOf(r);i>-1&&(e.cartesianItems[i]=n)},prepare:Je()},removeCartesianGraphicalItem:{reducer(e,t){var r=Ur(e).cartesianItems.indexOf(t.payload);r>-1&&e.cartesianItems.splice(r,1)},prepare:Je()},addPolarGraphicalItem:{reducer(e,t){e.polarItems.push(t.payload)},prepare:Je()},removePolarGraphicalItem:{reducer(e,t){var r=Ur(e).polarItems.indexOf(t.payload);r>-1&&e.polarItems.splice(r,1)},prepare:Je()},replacePolarGraphicalItem:{reducer(e,t){var{prev:r,next:n}=t.payload,i=Ur(e).polarItems.indexOf(r);i>-1&&(e.polarItems[i]=n)},prepare:Je()}}}),{addCartesianGraphicalItem:c7,replaceCartesianGraphicalItem:d7,removeCartesianGraphicalItem:f7,addPolarGraphicalItem:jee,removePolarGraphicalItem:Tee,replacePolarGraphicalItem:Nee}=UN.actions,h7=UN.reducer,p7=e=>{var t=at(),r=x.useRef(null);return x.useLayoutEffect(()=>{r.current===null?t(c7(e)):r.current!==e&&t(d7({prev:r.current,next:e})),r.current=e},[t,e]),x.useLayoutEffect(()=>()=>{r.current&&(t(f7(r.current)),r.current=null)},[t]),null},BN=x.memo(p7),v7=["points"];function SE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Jm(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?SE(Object(r),!0).forEach(function(n){m7(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):SE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function m7(e,t,r){return(t=g7(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function g7(e){var t=y7(e,"string");return typeof t=="symbol"?t:t+""}function y7(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function ff(){return ff=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},ff.apply(null,arguments)}function w7(e,t){if(e==null)return{};var r,n,i=b7(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function b7(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}function x7(e){var{option:t,dotProps:r,className:n}=e;if(x.isValidElement(t))return x.cloneElement(t,r);if(typeof t=="function")return t(r);var i=Fe(n,typeof t!="boolean"?t.className:""),a=r??{},{points:s}=a,u=w7(a,v7);return x.createElement(CN,ff({},u,{className:i}))}function _7(e,t){return e==null?!1:t?!0:e.length===1}function S7(e){var{points:t,dot:r,className:n,dotClassName:i,dataKey:a,baseProps:s,needClip:u,clipPathId:c,zIndex:d=jt.scatter}=e;if(!_7(t,r))return null;var h=NN(r),p=u3(r),m=t.map((b,w)=>{var S,k,A=Jm(Jm(Jm({r:3},s),p),{},{index:w,cx:(S=b.x)!==null&&S!==void 0?S:void 0,cy:(k=b.y)!==null&&k!==void 0?k:void 0,dataKey:a,value:b.value,payload:b.payload,points:t});return x.createElement(x7,{key:"dot-".concat(w),option:r,dotProps:A,className:i})}),g={};return u&&c!=null&&(g.clipPath="url(#clipPath-".concat(h?"":"dots-").concat(c,")")),x.createElement(Hr,{zIndex:d},x.createElement(Or,ff({className:n},g),m))}function kE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function PE(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?kE(Object(r),!0).forEach(function(n){k7(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):kE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function k7(e,t,r){return(t=P7(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function P7(e){var t=E7(e,"string");return typeof t=="symbol"?t:t+""}function E7(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var FN=0,O7={xAxis:{},yAxis:{},zAxis:{}},WN=Xt({name:"cartesianAxis",initialState:O7,reducers:{addXAxis:{reducer(e,t){e.xAxis[t.payload.id]=t.payload},prepare:Je()},replaceXAxis:{reducer(e,t){var{prev:r,next:n}=t.payload;e.xAxis[r.id]!==void 0&&(r.id!==n.id&&delete e.xAxis[r.id],e.xAxis[n.id]=n)},prepare:Je()},removeXAxis:{reducer(e,t){delete e.xAxis[t.payload.id]},prepare:Je()},addYAxis:{reducer(e,t){e.yAxis[t.payload.id]=t.payload},prepare:Je()},replaceYAxis:{reducer(e,t){var{prev:r,next:n}=t.payload;e.yAxis[r.id]!==void 0&&(r.id!==n.id&&delete e.yAxis[r.id],e.yAxis[n.id]=n)},prepare:Je()},removeYAxis:{reducer(e,t){delete e.yAxis[t.payload.id]},prepare:Je()},addZAxis:{reducer(e,t){e.zAxis[t.payload.id]=t.payload},prepare:Je()},replaceZAxis:{reducer(e,t){var{prev:r,next:n}=t.payload;e.zAxis[r.id]!==void 0&&(r.id!==n.id&&delete e.zAxis[r.id],e.zAxis[n.id]=n)},prepare:Je()},removeZAxis:{reducer(e,t){delete e.zAxis[t.payload.id]},prepare:Je()},updateYAxisWidth(e,t){var{id:r,width:n}=t.payload,i=e.yAxis[r];if(i){var a,s=i.widthHistory||[];if(s.length===3&&s[0]===s[2]&&n===s[1]&&n!==i.width&&Math.abs(n-((a=s[0])!==null&&a!==void 0?a:0))<=1)return;var u=[...s,n].slice(-3);e.yAxis[r]=PE(PE({},i),{},{width:n,widthHistory:u})}}}}),{addXAxis:A7,replaceXAxis:C7,removeXAxis:j7,addYAxis:T7,replaceYAxis:N7,removeYAxis:I7,addZAxis:Iee,replaceZAxis:Ree,removeZAxis:Dee,updateYAxisWidth:R7}=WN.actions,D7=WN.reducer,M7=L([Tt],e=>({top:e.top,bottom:e.bottom,left:e.left,right:e.right})),$7=L([M7,ci,di],(e,t,r)=>{if(!(!e||t==null||r==null))return{x:e.left,y:e.top,width:Math.max(0,t-e.left-e.right),height:Math.max(0,r-e.top-e.bottom)}}),Z0=()=>ve($7),L7=()=>ve(gK);function EE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Qm(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?EE(Object(r),!0).forEach(function(n){z7(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):EE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function z7(e,t,r){return(t=U7(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function U7(e){var t=B7(e,"string");return typeof t=="symbol"?t:t+""}function B7(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var F7=e=>{var{point:t,childIndex:r,mainColor:n,activeDot:i,dataKey:a,clipPath:s}=e;if(i===!1||t.x==null||t.y==null)return null;var u={index:r,dataKey:a,cx:t.x,cy:t.y,r:4,fill:n??"none",strokeWidth:2,stroke:"#fff",payload:t.payload,value:t.value},c=Qm(Qm(Qm({},u),ou(i)),$y(i)),d;return x.isValidElement(i)?d=x.cloneElement(i,c):typeof i=="function"?d=i(c):d=x.createElement(CN,c),x.createElement(Or,{className:"recharts-active-dot",clipPath:s},d)};function W7(e){var{points:t,mainColor:r,activeDot:n,itemDataKey:i,clipPath:a,zIndex:s=jt.activeDot}=e,u=ve(Ba),c=L7();if(t==null||c==null)return null;var d=t.find(h=>c.includes(h.payload));return tt(d)?null:x.createElement(Hr,{zIndex:s},x.createElement(F7,{point:d,childIndex:Number(u),mainColor:r,dataKey:i,activeDot:n,clipPath:a}))}var OE=(e,t,r)=>{var n=r??e;if(!tt(n))return cn(n,t,0)},q7=(e,t,r)=>{var n={},i=e.filter(nh),a=e.filter(d=>d.stackId==null),s=i.reduce((d,h)=>{var p=d[h.stackId];return p==null&&(p=[]),p.push(h),d[h.stackId]=p,d},n),u=Object.entries(s).map(d=>{var h,[p,m]=d,g=m.map(w=>w.dataKey),b=OE(t,r,(h=m[0])===null||h===void 0?void 0:h.barSize);return{stackId:p,dataKeys:g,barSize:b}}),c=a.map(d=>{var h=[d.dataKey].filter(m=>m!=null),p=OE(t,r,d.barSize);return{stackId:void 0,dataKeys:h,barSize:p}});return[...u,...c]};function AE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function nd(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?AE(Object(r),!0).forEach(function(n){H7(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):AE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function H7(e,t,r){return(t=K7(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function K7(e){var t=V7(e,"string");return typeof t=="symbol"?t:t+""}function V7(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function G7(e,t,r,n,i){var a,s=n.length;if(!(s<1)){var u=cn(e,r,0,!0),c,d=[];if(je((a=n[0])===null||a===void 0?void 0:a.barSize)){var h=!1,p=r/s,m=n.reduce((A,P)=>A+(P.barSize||0),0);m+=(s-1)*u,m>=r&&(m-=(s-1)*u,u=0),m>=r&&p>0&&(h=!0,p*=.9,m=s*p);var g=(r-m)/2>>0,b={offset:g-u,size:0};c=n.reduce((A,P)=>{var C,N={stackId:P.stackId,dataKeys:P.dataKeys,position:{offset:b.offset+b.size+u,size:h?p:(C=P.barSize)!==null&&C!==void 0?C:0}},j=[...A,N];return b=N.position,j},d)}else{var w=cn(t,r,0,!0);r-2*w-(s-1)*u<=0&&(u=0);var S=(r-2*w-(s-1)*u)/s;S>1&&(S>>=0);var k=je(i)?Math.min(S,i):S;c=n.reduce((A,P,C)=>[...A,{stackId:P.stackId,dataKeys:P.dataKeys,position:{offset:w+(S+u)*C+(S-k)/2,size:k}}],d)}return c}}var Y7=(e,t,r,n,i,a,s)=>{var u=tt(s)?t:s,c=G7(r,n,i!==a?i:a,e,u);return i!==a&&c!=null&&(c=c.map(d=>nd(nd({},d),{},{position:nd(nd({},d.position),{},{offset:d.position.offset-i/2})}))),c},X7=(e,t)=>{var r=l0(t);if(!(!e||r==null||t==null)){var{stackId:n}=t;if(n!=null){var i=e[n];if(i){var{stackedData:a}=i;if(a)return a.find(s=>s.key===r)}}}},J7=(e,t)=>{if(!(e==null||t==null)){var r=e.find(n=>n.stackId===t.stackId&&t.dataKey!=null&&n.dataKeys.includes(t.dataKey));if(r!=null)return r.position}};function Q7(e,t){return e&&typeof e=="object"&&"zIndex"in e&&typeof e.zIndex=="number"&&je(e.zIndex)?e.zIndex:t}var Z7=e=>{var{chartData:t}=e,r=at(),n=Jt();return x.useEffect(()=>n?()=>{}:(r(FP(t)),()=>{r(FP(void 0))}),[t,r,n]),null},CE={x:0,y:0,width:0,height:0,padding:{top:0,right:0,bottom:0,left:0}},qN=Xt({name:"brush",initialState:CE,reducers:{setBrushSettings(e,t){return t.payload==null?CE:t.payload}}}),{setBrushSettings:Mee}=qN.actions,eG=qN.reducer;function tG(e){return(e%180+180)%180}var rG=function(t){var{width:r,height:n}=t,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,a=tG(i),s=a*Math.PI/180,u=Math.atan(n/r),c=s>u&&s<Math.PI-u?n/Math.sin(s):r/Math.cos(s);return Math.abs(c)},nG={dots:[],areas:[],lines:[]},HN=Xt({name:"referenceElements",initialState:nG,reducers:{addDot:(e,t)=>{e.dots.push(t.payload)},removeDot:(e,t)=>{var r=Ur(e).dots.findIndex(n=>n===t.payload);r!==-1&&e.dots.splice(r,1)},addArea:(e,t)=>{e.areas.push(t.payload)},removeArea:(e,t)=>{var r=Ur(e).areas.findIndex(n=>n===t.payload);r!==-1&&e.areas.splice(r,1)},addLine:(e,t)=>{e.lines.push(t.payload)},removeLine:(e,t)=>{var r=Ur(e).lines.findIndex(n=>n===t.payload);r!==-1&&e.lines.splice(r,1)}}}),{addDot:$ee,removeDot:Lee,addArea:zee,removeArea:Uee,addLine:Bee,removeLine:Fee}=HN.actions,iG=HN.reducer,aG=x.createContext(void 0),oG=e=>{var{children:t}=e,[r]=x.useState("".concat(Wl("recharts"),"-clip")),n=Z0();if(n==null)return null;var{x:i,y:a,width:s,height:u}=n;return x.createElement(aG.Provider,{value:r},x.createElement("defs",null,x.createElement("clipPath",{id:r},x.createElement("rect",{x:i,y:a,height:u,width:s}))),t)};function KN(e,t){if(t<1)return[];if(t===1)return e;for(var r=[],n=0;n<e.length;n+=t){var i=e[n];i!==void 0&&r.push(i)}return r}function sG(e,t,r){var n={width:e.width+t.width,height:e.height+t.height};return rG(n,r)}function lG(e,t,r){var n=r==="width",{x:i,y:a,width:s,height:u}=e;return t===1?{start:n?i:a,end:n?i+s:a+u}:{start:n?i+s:a+u,end:n?i:a}}function nu(e,t,r,n,i){if(e*t<e*n||e*t>e*i)return!1;var a=r();return e*(t-e*a/2-n)>=0&&e*(t+e*a/2-i)<=0}function uG(e,t){return KN(e,t+1)}function cG(e,t,r,n,i){for(var a=(n||[]).slice(),{start:s,end:u}=t,c=0,d=1,h=s,p=function(){var b=n==null?void 0:n[c];if(b===void 0)return{v:KN(n,d)};var w=c,S,k=()=>(S===void 0&&(S=r(b,w)),S),A=b.coordinate,P=c===0||nu(e,A,k,h,u);P||(c=0,h=s,d+=1),P&&(h=A+e*(k()/2+i),c+=d)},m;d<=a.length;)if(m=p(),m)return m.v;return[]}function dG(e,t,r,n,i){var a=(n||[]).slice(),s=a.length;if(s===0)return[];for(var{start:u,end:c}=t,d=1;d<=s;d++){for(var h=(s-1)%d,p=u,m=!0,g=function(){var C=n[w];if(C==null)return 0;var N=w,j,M=()=>(j===void 0&&(j=r(C,N)),j),F=C.coordinate,W=w===h||nu(e,F,M,p,c);if(!W)return m=!1,1;W&&(p=F+e*(M()/2+i))},b,w=h;w<s&&(b=g(),!(b!==0&&b===1));w+=d);if(m){for(var S=[],k=h;k<s;k+=d){var A=n[k];A!=null&&S.push(A)}return S}}return[]}function jE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Gt(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?jE(Object(r),!0).forEach(function(n){fG(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):jE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function fG(e,t,r){return(t=hG(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function hG(e){var t=pG(e,"string");return typeof t=="symbol"?t:t+""}function pG(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function vG(e,t,r,n,i){for(var a=(n||[]).slice(),s=a.length,{start:u}=t,{end:c}=t,d=function(m){var g=a[m];if(g==null)return 1;var b=g,w,S=()=>(w===void 0&&(w=r(g,m)),w);if(m===s-1){var k=e*(b.coordinate+e*S()/2-c);a[m]=b=Gt(Gt({},b),{},{tickCoord:k>0?b.coordinate-k*e:b.coordinate})}else a[m]=b=Gt(Gt({},b),{},{tickCoord:b.coordinate});if(b.tickCoord!=null){var A=nu(e,b.tickCoord,S,u,c);A&&(c=b.tickCoord-e*(S()/2+i),a[m]=Gt(Gt({},b),{},{isShow:!0}))}},h=s-1;h>=0;h--)d(h);return a}function mG(e,t,r,n,i,a){var s=(n||[]).slice(),u=s.length,{start:c,end:d}=t;if(a){var h=n[u-1];if(h!=null){var p=r(h,u-1),m=e*(h.coordinate+e*p/2-d);if(s[u-1]=h=Gt(Gt({},h),{},{tickCoord:m>0?h.coordinate-m*e:h.coordinate}),h.tickCoord!=null){var g=nu(e,h.tickCoord,()=>p,c,d);g&&(d=h.tickCoord-e*(p/2+i),s[u-1]=Gt(Gt({},h),{},{isShow:!0}))}}}for(var b=a?u-1:u,w=function(A){var P=s[A];if(P==null)return 1;var C=P,N,j=()=>(N===void 0&&(N=r(P,A)),N);if(A===0){var M=e*(C.coordinate-e*j()/2-c);s[A]=C=Gt(Gt({},C),{},{tickCoord:M<0?C.coordinate-M*e:C.coordinate})}else s[A]=C=Gt(Gt({},C),{},{tickCoord:C.coordinate});if(C.tickCoord!=null){var F=nu(e,C.tickCoord,j,c,d);F&&(c=C.tickCoord+e*(j()/2+i),s[A]=Gt(Gt({},C),{},{isShow:!0}))}},S=0;S<b;S++)w(S);return s}function ew(e,t,r){var{tick:n,ticks:i,viewBox:a,minTickGap:s,orientation:u,interval:c,tickFormatter:d,unit:h,angle:p}=e;if(!i||!i.length||!n)return[];if(ce(c)||pu.isSsr){var m;return(m=uG(i,ce(c)?c:0))!==null&&m!==void 0?m:[]}var g=[],b=u==="top"||u==="bottom"?"width":"height",w=h&&b==="width"?Il(h,{fontSize:t,letterSpacing:r}):{width:0,height:0},S=(N,j)=>{var M=typeof d=="function"?d(N.value,j):N.value;return b==="width"?sG(Il(M,{fontSize:t,letterSpacing:r}),w,p):Il(M,{fontSize:t,letterSpacing:r})[b]},k=i[0],A=i[1],P=i.length>=2&&k!=null&&A!=null?vr(A.coordinate-k.coordinate):1,C=lG(a,P,b);return c==="equidistantPreserveStart"?cG(P,C,S,i,s):c==="equidistantPreserveEnd"?dG(P,C,S,i,s):(c==="preserveStart"||c==="preserveStartEnd"?g=mG(P,C,S,i,s,c==="preserveStartEnd"):g=vG(P,C,S,i,s),g.filter(N=>N.isShow))}var gG=e=>{var{ticks:t,label:r,labelGapWithTick:n=5,tickSize:i=0,tickMargin:a=0}=e,s=0;if(t){Array.from(t).forEach(h=>{if(h){var p=h.getBoundingClientRect();p.width>s&&(s=p.width)}});var u=r?r.getBoundingClientRect().width:0,c=i+a,d=s+c+u+(r?n:0);return Math.round(d)}return 0},yG={xAxis:{},yAxis:{}},VN=Xt({name:"renderedTicks",initialState:yG,reducers:{setRenderedTicks:(e,t)=>{var{axisType:r,axisId:n,ticks:i}=t.payload;e[r][n]=i},removeRenderedTicks:(e,t)=>{var{axisType:r,axisId:n}=t.payload;delete e[r][n]}}}),{setRenderedTicks:wG,removeRenderedTicks:bG}=VN.actions,xG=VN.reducer,_G=["axisLine","width","height","className","hide","ticks","axisType","axisId"];function SG(e,t){if(e==null)return{};var r,n,i=kG(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function kG(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}function Fa(){return Fa=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Fa.apply(null,arguments)}function TE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function lt(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?TE(Object(r),!0).forEach(function(n){PG(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):TE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function PG(e,t,r){return(t=EG(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function EG(e){var t=OG(e,"string");return typeof t=="symbol"?t:t+""}function OG(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var ei={x:0,y:0,width:0,height:0,viewBox:{x:0,y:0,width:0,height:0},orientation:"bottom",ticks:[],stroke:"#666",tickLine:!0,axisLine:!0,tick:!0,mirror:!1,minTickGap:5,tickSize:6,tickMargin:2,interval:"preserveEnd",zIndex:jt.axis};function AG(e){var{x:t,y:r,width:n,height:i,orientation:a,mirror:s,axisLine:u,otherSvgProps:c}=e;if(!u)return null;var d=lt(lt(lt({},c),un(u)),{},{fill:"none"});if(a==="top"||a==="bottom"){var h=+(a==="top"&&!s||a==="bottom"&&s);d=lt(lt({},d),{},{x1:t,y1:r+h*i,x2:t+n,y2:r+h*i})}else{var p=+(a==="left"&&!s||a==="right"&&s);d=lt(lt({},d),{},{x1:t+p*n,y1:r,x2:t+p*n,y2:r+i})}return x.createElement("line",Fa({},d,{className:Fe("recharts-cartesian-axis-line",ts(u,"className"))}))}function CG(e,t,r,n,i,a,s,u,c){var d,h,p,m,g,b,w=u?-1:1,S=e.tickSize||s,k=ce(e.tickCoord)?e.tickCoord:e.coordinate;switch(a){case"top":d=h=e.coordinate,m=r+ +!u*i,p=m-w*S,b=p-w*c,g=k;break;case"left":p=m=e.coordinate,h=t+ +!u*n,d=h-w*S,g=d-w*c,b=k;break;case"right":p=m=e.coordinate,h=t+ +u*n,d=h+w*S,g=d+w*c,b=k;break;default:d=h=e.coordinate,m=r+ +u*i,p=m+w*S,b=p+w*c,g=k;break}return{line:{x1:d,y1:p,x2:h,y2:m},tick:{x:g,y:b}}}function jG(e,t){switch(e){case"left":return t?"start":"end";case"right":return t?"end":"start";default:return"middle"}}function TG(e,t){switch(e){case"left":case"right":return"middle";case"top":return t?"start":"end";default:return t?"end":"start"}}function NG(e){var{option:t,tickProps:r,value:n}=e,i,a=Fe(r.className,"recharts-cartesian-axis-tick-value");if(x.isValidElement(t))i=x.cloneElement(t,lt(lt({},r),{},{className:a}));else if(typeof t=="function")i=t(lt(lt({},r),{},{className:a}));else{var s="recharts-cartesian-axis-tick-value";typeof t!="boolean"&&(s=Fe(s,MV(t))),i=x.createElement(J0,Fa({},r,{className:s}),n)}return i}function IG(e){var{ticks:t,axisType:r,axisId:n}=e,i=at();return x.useEffect(()=>{if(n==null||r==null)return Ka;var a=t.map(s=>({value:s.value,coordinate:s.coordinate,offset:s.offset,index:s.index}));return i(wG({ticks:a,axisId:n,axisType:r})),()=>{i(bG({axisId:n,axisType:r}))}},[i,t,n,r]),null}var RG=x.forwardRef((e,t)=>{var{ticks:r=[],tick:n,tickLine:i,stroke:a,tickFormatter:s,unit:u,padding:c,tickTextProps:d,orientation:h,mirror:p,x:m,y:g,width:b,height:w,tickSize:S,tickMargin:k,fontSize:A,letterSpacing:P,getTicksConfig:C,events:N,axisType:j,axisId:M}=e,F=ew(lt(lt({},C),{},{ticks:r}),A,P),W=un(C),H=ou(n),Y=wN(W.textAnchor)?W.textAnchor:jG(h,p),B=TG(h,p),pe={};typeof i=="object"&&(pe=i);var ie=lt(lt({},W),{},{fill:"none"},pe),me=F.map(K=>lt({entry:K},CG(K,m,g,b,w,h,S,p,k))),_e=me.map(K=>{var{entry:Q,line:X}=K;return x.createElement(Or,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(Q.value,"-").concat(Q.coordinate,"-").concat(Q.tickCoord)},i&&x.createElement("line",Fa({},ie,X,{className:Fe("recharts-cartesian-axis-tick-line",ts(i,"className"))})))}),he=me.map((K,Q)=>{var X,D,{entry:q,tick:ge}=K,ye=lt(lt(lt(lt({verticalAnchor:B},W),{},{textAnchor:Y,stroke:"none",fill:a},ge),{},{index:Q,payload:q,visibleTicksCount:F.length,tickFormatter:s,padding:c},d),{},{angle:(X=(D=d==null?void 0:d.angle)!==null&&D!==void 0?D:W.angle)!==null&&X!==void 0?X:0}),Pe=lt(lt({},ye),H);return x.createElement(Or,Fa({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(q.value,"-").concat(q.coordinate,"-").concat(q.tickCoord)},Ly(N,q,Q)),n&&x.createElement(NG,{o