taStartIndex:b})}}),QY=["index"];function py(){return py=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},py.apply(null,arguments)}function ZY(e,t){if(e==null)return{};var r,n,i=eX(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 eX(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}var aI=x.createContext(void 0),tX=e=>{var t=x.useContext(aI);if(t!=null)return t.stackId;if(e!=null)return kB(e)},rX=(e,t)=>"recharts-bar-stack-clip-path-".concat(e,"-").concat(t),nX=e=>{var t=x.useContext(aI);if(t!=null){var{stackId:r}=t;return"url(#".concat(rX(r,e),")")}},oI=e=>{var{index:t}=e,r=ZY(e,QY),n=nX(t);return x.createElement(Or,py({className:"recharts-bar-stack-layer",clipPath:n},r))},iX=["onMouseEnter","onMouseLeave","onClick"],aX=["value","background","tooltipPosition"],oX=["id"],sX=["onMouseEnter","onClick","onMouseLeave"];function Xi(){return Xi=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},Xi.apply(null,arguments)}function DE(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 er(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?DE(Object(r),!0).forEach(function(n){lX(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):DE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function lX(e,t,r){return(t=uX(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function uX(e){var t=cX(e,"string");return typeof t=="symbol"?t:t+""}function cX(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 pf(e,t){if(e==null)return{};var r,n,i=dX(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 dX(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}var fX=e=>{var{dataKey:t,name:r,fill:n,legendType:i,hide:a}=e;return[{inactive:a,dataKey:t,type:i,color:n,value:Bf(r,t),payload:e}]},hX=x.memo(e=>{var{dataKey:t,stroke:r,strokeWidth:n,fill:i,name:a,hide:s,unit:u,tooltipType:c,id:d}=e,h={dataDefinedOnItem:void 0,getPosition:Ka,settings:{stroke:r,strokeWidth:n,fill:i,dataKey:t,nameKey:void 0,name:Bf(a,t),hide:s,type:c,color:i,unit:u,graphicalItemId:d}};return x.createElement($N,{tooltipEntrySettings:h})});function pX(e){var t=ve(Ba),{data:r,dataKey:n,background:i,allOtherBarProps:a}=e,{onMouseEnter:s,onMouseLeave:u,onClick:c}=a,d=pf(a,iX),h=RN(s,n,a.id),p=DN(u),m=MN(c,n,a.id);if(!i||r==null)return null;var g=ou(i);return x.createElement(Hr,{zIndex:Q7(i,jt.barBackground)},r.map((b,w)=>{var{value:S,background:k,tooltipPosition:A}=b,P=pf(b,aX);if(!k)return null;var C=h(b,w),N=p(b,w),j=m(b,w),M=er(er(er(er(er({option:i,isActive:String(w)===t},P),{},{fill:"#eee"},k),g),Ly(d,b,w)),{},{onMouseEnter:C,onMouseLeave:N,onClick:j,dataKey:n,index:w,className:"recharts-bar-background-rectangle"});return x.createElement(aw,Xi({key:"background-bar-".concat(w)},M))}))}function vX(e){var{showLabels:t,children:r,rects:n}=e,i=n==null?void 0:n.map(a=>{var s={x:a.x,y:a.y,width:a.width,lowerWidth:a.width,upperWidth:a.width,height:a.height};return er(er({},s),{},{value:a.value,payload:a.payload,parentViewBox:a.parentViewBox,viewBox:s,fill:a.fill})});return x.createElement(EN,{value:t?i:void 0},r)}function mX(e){var{shape:t,activeBar:r,baseProps:n,entry:i,index:a,dataKey:s}=e,u=ve(Ba),c=ve(tN),d=r&&String(i.originalDataIndex)===u&&(c==null||s===c),[h,p]=x.useState(!1),[m,g]=x.useState(!1);x.useEffect(()=>{var P;return d?(p(!0),P=requestAnimationFrame(()=>{g(!0)})):g(!1),()=>{cancelAnimationFrame(P)}},[d]);var b=x.useCallback(()=>{d||p(!1)},[d]),w=d&&m,S=d||h,k;d?r===!0?k=t:k=r:k=t;var A=x.createElement(aw,Xi({},n,{name:String(n.name)},i,{isActive:w,option:k,index:a,dataKey:s,onTransitionEnd:b}));return S?x.createElement(Hr,{zIndex:jt.activeBar},x.createElement(oI,{index:i.originalDataIndex},A)):A}function gX(e){var{shape:t,baseProps:r,entry:n,index:i,dataKey:a}=e;return x.createElement(aw,Xi({},r,{name:String(r.name)},n,{isActive:!1,option:t,index:i,dataKey:a}))}function yX(e){var t,{data:r,props:n}=e,i=(t=un(n))!==null&&t!==void 0?t:{},{id:a}=i,s=pf(i,oX),{shape:u,dataKey:c,activeBar:d}=n,{onMouseEnter:h,onClick:p,onMouseLeave:m}=n,g=pf(n,sX),b=RN(h,c,a),w=DN(m),S=MN(p,c,a);return r?x.createElement(x.Fragment,null,r.map((k,A)=>x.createElement(oI,Xi({index:k.originalDataIndex,key:"rectangle-".concat(k==null?void 0:k.x,"-").concat(k==null?void 0:k.y,"-").concat(k==null?void 0:k.value,"-").concat(A),className:"recharts-bar-rectangle"},Ly(g,k,A),{onMouseEnter:b(k,A),onMouseLeave:w(k,A),onClick:S(k,A)}),d?x.createElement(mX,{shape:u,activeBar:d,baseProps:s,entry:k,index:A,dataKey:c}):x.createElement(gX,{shape:u,baseProps:s,entry:k,index:A,dataKey:c})))):null}function wX(e){var{props:t,previousRectanglesRef:r}=e,{data:n,layout:i,isAnimationActive:a,animationBegin:s,animationDuration:u,animationEasing:c,onAnimationEnd:d,onAnimationStart:h}=t,p=r.current,m=Jf(t,"recharts-bar-"),[g,b]=x.useState(!1),w=!g,S=x.useCallback(()=>{typeof d=="function"&&d(),b(!1)},[d]),k=x.useCallback(()=>{typeof h=="function"&&h(),b(!0)},[h]);return x.createElement(vX,{showLabels:w,rects:n},x.createElement(Xf,{animationId:m,begin:s,duration:u,isActive:a,easing:c,onAnimationEnd:S,onAnimationStart:k,key:m},A=>{var P=A===1?n:n==null?void 0:n.map((C,N)=>{var j=p&&p[N];if(j)return er(er({},C),{},{x:ct(j.x,C.x,A),y:ct(j.y,C.y,A),width:ct(j.width,C.width,A),height:ct(j.height,C.height,A)});if(i==="horizontal"){var M=ct(0,C.height,A),F=ct(C.stackedBarStart,C.y,A);return er(er({},C),{},{y:F,height:M})}var W=ct(0,C.width,A),H=ct(C.stackedBarStart,C.x,A);return er(er({},C),{},{width:W,x:H})});return A>0&&(r.current=P??null),P==null?null:x.createElement(Or,null,x.createElement(yX,{props:t,data:P}))}),x.createElement(AN,{label:t.label}),t.children)}function bX(e){var t=x.useRef(null);return x.createElement(wX,{previousRectanglesRef:t,props:e})}var sI=0,xX=(e,t)=>{var r=Array.isArray(e.value)?e.value[1]:e.value;return{x:e.x,y:e.y,value:r,errorVal:ht(e,t)}};class _X extends x.PureComponent{render(){var{hide:t,data:r,dataKey:n,className:i,xAxisId:a,yAxisId:s,needClip:u,background:c,id:d}=this.props;if(t||r==null)return null;var h=Fe("recharts-bar",i),p=d;return x.createElement(Or,{className:h,id:d},u&&x.createElement("defs",null,x.createElement(JN,{clipPathId:p,xAxisId:a,yAxisId:s})),x.createElement(Or,{className:"recharts-bar-rectangles",clipPath:u?"url(#clipPath-".concat(p,")"):void 0},x.createElement(pX,{data:r,dataKey:n,background:c,allOtherBarProps:this.props}),x.createElement(bX,this.props)))}}var SX={activeBar:!1,animationBegin:0,animationDuration:400,animationEasing:"ease",background:!1,hide:!1,isAnimationActive:"auto",label:!1,legendType:"rect",minPointSize:sI,xAxisId:0,yAxisId:0,zIndex:jt.bar};function kX(e){var{xAxisId:t,yAxisId:r,hide:n,legendType:i,minPointSize:a,activeBar:s,animationBegin:u,animationDuration:c,animationEasing:d,isAnimationActive:h}=e,{needClip:p}=nw(t,r),m=Va(),g=Jt(),b=UV(e.children,hN),w=ve(A=>JY(A,e.id,g,b));if(m!=="vertical"&&m!=="horizontal")return null;var S,k=w==null?void 0:w[0];return k==null||k.height==null||k.width==null?S=0:S=m==="vertical"?k.height/2:k.width/2,x.createElement(XN,{xAxisId:t,yAxisId:r,data:w,dataPointFormatter:xX,errorBarOffset:S},x.createElement(_X,Xi({},e,{layout:m,needClip:p,data:w,xAxisId:t,yAxisId:r,hide:n,legendType:i,minPointSize:a,activeBar:s,animationBegin:u,animationDuration:c,animationEasing:d,isAnimationActive:h})))}function PX(e){var{layout:t,barSettings:{dataKey:r,minPointSize:n,hasCustomShape:i},pos:a,bandSize:s,xAxis:u,yAxis:c,xAxisTicks:d,yAxisTicks:h,stackedData:p,displayedData:m,offset:g,cells:b,parentViewBox:w,dataStartIndex:S}=e,k=t==="horizontal"?c:u,A=p?k.scale.domain():null,P=PB({numericAxis:k}),C=k.scale.map(P);return m.map((N,j)=>{var M,F,W,H,Y,B;if(p){var pe=p[j+S];if(pe==null)return null;M=wB(pe,A)}else M=ht(N,r),Array.isArray(M)||(M=[P,M]);var ie=RY(n,sI)(M[1],j);if(t==="horizontal"){var me,_e=c.scale.map(M[0]),he=c.scale.map(M[1]);if(_e==null||he==null)return null;F=kS({axis:u,ticks:d,bandSize:s,offset:a.offset,entry:N,index:j}),W=(me=he??_e)!==null&&me!==void 0?me:void 0,H=a.size;var K=_e-he;if(Y=Nn(K)?0:K,B={x:F,y:g.top,width:H,height:g.height},Math.abs(ie)>0&&Math.abs(Y)<Math.abs(ie)){var Q=vr(Y||ie)*(Math.abs(ie)-Math.abs(Y));W-=Q,Y+=Q}}else{var X=u.scale.map(M[0]),D=u.scale.map(M[1]);if(X==null||D==null)return null;if(F=X,W=kS({axis:c,ticks:h,bandSize:s,offset:a.offset,entry:N,index:j}),H=D-X,Y=a.size,B={x:g.left,y:W,width:g.width,height:Y},Math.abs(ie)>0&&Math.abs(H)<Math.abs(ie)){var q=vr(H||ie)*(Math.abs(ie)-Math.abs(H));H+=q}}if(F==null||W==null||H==null||Y==null||!i&&(H===0||Y===0))return null;var ge=er(er({},N),{},{stackedBarStart:C,x:F,y:W,width:H,height:Y,value:p?M:M[1],payload:N,background:B,tooltipPosition:{x:F+H/2,y:W+Y/2},parentViewBox:w,originalDataIndex:j},b&&b[j]&&b[j].props);return ge}).filter(Boolean)}function EX(e){var t=or(e,SX),r=tX(t.stackId),n=Jt();return x.createElement(zN,{id:t.id,type:"bar"},i=>x.createElement(x.Fragment,null,x.createElement(LN,{legendPayload:fX(t)}),x.createElement(hX,{dataKey:t.dataKey,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,tooltipType:t.tooltipType,id:i}),x.createElement(BN,{type:"bar",id:i,data:void 0,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,dataKey:t.dataKey,stackId:r,hide:t.hide,barSize:t.barSize,minPointSize:t.minPointSize,maxBarSize:t.maxBarSize,isPanorama:n,hasCustomShape:t.shape!=null}),x.createElement(Hr,{zIndex:t.zIndex},x.createElement(kX,Xi({},t,{id:i})))))}var vy=x.memo(EX,hu);vy.displayName="Bar";var OX=["domain","range"],AX=["domain","range"];function ME(e,t){if(e==null)return{};var r,n,i=CX(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 CX(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 $E(e,t){return e===t?!0:Array.isArray(e)&&e.length===2&&Array.isArray(t)&&t.length===2?e[0]===t[0]&&e[1]===t[1]:!1}function lI(e,t){if(e===t)return!0;var{domain:r,range:n}=e,i=ME(e,OX),{domain:a,range:s}=t,u=ME(t,AX);return!$E(r,a)||!$E(n,s)?!1:hu(i,u)}var jX=["type"],TX=["dangerouslySetInnerHTML","ticks","scale"],NX=["id","scale"];function my(){return my=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},my.apply(null,arguments)}function LE(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 zE(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?LE(Object(r),!0).forEach(function(n){IX(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):LE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function IX(e,t,r){return(t=RX(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function RX(e){var t=DX(e,"string");return typeof t=="symbol"?t:t+""}function DX(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 gy(e,t){if(e==null)return{};var r,n,i=MX(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 MX(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 $X(e){var t=at(),r=x.useRef(null),n=AC(),{type:i}=e,a=gy(e,jX),s=eh(n,"xAxis",i),u=x.useMemo(()=>{if(s!=null)return zE(zE({},a),{},{type:s})},[a,s]);return x.useLayoutEffect(()=>{u!=null&&(r.current===null?t(A7(u)):r.current!==u&&t(C7({prev:r.current,next:u})),r.current=u)},[u,t]),x.useLayoutEffect(()=>()=>{r.current&&(t(j7(r.current)),r.current=null)},[t]),null}var LX=e=>{var{xAxisId:t,className:r}=e,n=ve(Vy),i=Jt(),a="xAxis",s=ve(k=>IT(k,a,t,i)),u=ve(k=>jT(k,t)),c=ve(k=>aH(k,t)),d=ve(k=>Qj(k,t));if(u==null||c==null||d==null)return null;var{dangerouslySetInnerHTML:h,ticks:p,scale:m}=e,g=gy(e,TX),{id:b,scale:w}=d,S=gy(d,NX);return x.createElement(tw,my({},g,S,{x:c.x,y:c.y,width:u.width,height:u.height,className:Fe("recharts-".concat(a," ").concat(a),r),viewBox:n,ticks:s,axisType:a,axisId:t}))},zX={allowDataOverflow:bt.allowDataOverflow,allowDecimals:bt.allowDecimals,allowDuplicatedCategory:bt.allowDuplicatedCategory,angle:bt.angle,axisLine:ei.axisLine,height:bt.height,hide:!1,includeHidden:bt.includeHidden,interval:bt.interval,label:!1,minTickGap:bt.minTickGap,mirror:bt.mirror,orientation:bt.orientation,padding:bt.padding,reversed:bt.reversed,scale:bt.scale,tick:bt.tick,tickCount:bt.tickCount,tickLine:ei.tickLine,tickSize:ei.tickSize,type:bt.type,niceTicks:bt.niceTicks,xAxisId:0},UX=e=>{var t=or(e,zX);return x.createElement(x.Fragment,null,x.createElement($X,{allowDataOverflow:t.allowDataOverflow,allowDecimals:t.allowDecimals,allowDuplicatedCategory:t.allowDuplicatedCategory,angle:t.angle,dataKey:t.dataKey,domain:t.domain,height:t.height,hide:t.hide,id:t.xAxisId,includeHidden:t.includeHidden,interval:t.interval,minTickGap:t.minTickGap,mirror:t.mirror,name:t.name,orientation:t.orientation,padding:t.padding,reversed:t.reversed,scale:t.scale,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,niceTicks:t.niceTicks}),x.createElement(LX,t))},ow=x.memo(UX,lI);ow.displayName="XAxis";var BX=["type"],FX=["dangerouslySetInnerHTML","ticks","scale"],WX=["id","scale"];function yy(){return yy=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},yy.apply(null,arguments)}function UE(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 BE(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?UE(Object(r),!0).forEach(function(n){qX(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):UE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function qX(e,t,r){return(t=HX(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function HX(e){var t=KX(e,"string");return typeof t=="symbol"?t:t+""}function KX(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 wy(e,t){if(e==null)return{};var r,n,i=VX(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 VX(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 GX(e){var t=at(),r=x.useRef(null),n=AC(),{type:i}=e,a=wy(e,BX),s=eh(n,"yAxis",i),u=x.useMemo(()=>{if(s!=null)return BE(BE({},a),{},{type:s})},[s,a]);return x.useLayoutEffect(()=>{u!=null&&(r.current===null?t(T7(u)):r.current!==u&&t(N7({prev:r.current,next:u})),r.current=u)},[u,t]),x.useLayoutEffect(()=>()=>{r.current&&(t(I7(r.current)),r.current=null)},[t]),null}function YX(e){var{yAxisId:t,className:r,width:n,label:i}=e,a=x.useRef(null),s=x.useRef(null),u=ve(Vy),c=Jt(),d=at(),h="yAxis",p=ve(j=>TT(j,t)),m=ve(j=>sH(j,t)),g=ve(j=>IT(j,h,t,c)),b=ve(j=>Zj(j,t));if(x.useLayoutEffect(()=>{if(!(n!=="auto"||!p||Q0(i)||x.isValidElement(i)||b==null)){var j=a.current;if(j){var M=j.getCalculatedWidth();Math.round(p.width)!==Math.round(M)&&d(R7({id:t,width:M}))}}},[g,p,d,i,t,n,b]),p==null||m==null||b==null)return null;var{dangerouslySetInnerHTML:w,ticks:S,scale:k}=e,A=wy(e,FX),{id:P,scale:C}=b,N=wy(b,WX);return x.createElement(tw,yy({},A,N,{ref:a,labelRef:s,x:m.x,y:m.y,tickTextProps:n==="auto"?{width:void 0}:{width:n},width:p.width,height:p.height,className:Fe("recharts-".concat(h," ").concat(h),r),viewBox:u,ticks:g,axisType:h,axisId:t}))}var XX={allowDataOverflow:xt.allowDataOverflow,allowDecimals:xt.allowDecimals,allowDuplicatedCategory:xt.allowDuplicatedCategory,angle:xt.angle,axisLine:ei.axisLine,hide:!1,includeHidden:xt.includeHidden,interval:xt.interval,label:!1,minTickGap:xt.minTickGap,mirror:xt.mirror,orientation:xt.orientation,padding:xt.padding,reversed:xt.reversed,scale:xt.scale,tick:xt.tick,tickCount:xt.tickCount,tickLine:ei.tickLine,tickSize:ei.tickSize,type:xt.type,niceTicks:xt.niceTicks,width:xt.width,yAxisId:0},JX=e=>{var t=or(e,XX);return x.createElement(x.Fragment,null,x.createElement(GX,{interval:t.interval,id:t.yAxisId,scale:t.scale,type:t.type,domain:t.domain,allowDataOverflow:t.allowDataOverflow,dataKey:t.dataKey,allowDuplicatedCategory:t.allowDuplicatedCategory,allowDecimals:t.allowDecimals,tickCount:t.tickCount,padding:t.padding,includeHidden:t.includeHidden,reversed:t.reversed,ticks:t.ticks,width:t.width,orientation:t.orientation,mirror:t.mirror,hide:t.hide,unit:t.unit,name:t.name,angle:t.angle,minTickGap:t.minTickGap,tick:t.tick,tickFormatter:t.tickFormatter,niceTicks:t.niceTicks}),x.createElement(YX,t))},sw=x.memo(JX,lI);sw.displayName="YAxis";var QX=(e,t)=>t,lw=L([QX,Le,pj,It,JT,vi,jK,Tt],$K);function ZX(e){return"getBBox"in e.currentTarget&&typeof e.currentTarget.getBBox=="function"}function uw(e){var t=e.currentTarget.getBoundingClientRect(),r,n;if(ZX(e)){var i=e.currentTarget.getBBox();r=i.width>0?t.width/i.width:1,n=i.height>0?t.height/i.height:1}else{var a=e.currentTarget;r=a.offsetWidth>0?t.width/a.offsetWidth:1,n=a.offsetHeight>0?t.height/a.offsetHeight:1}var s=(u,c)=>({relativeX:Math.round((u-t.left)/r),relativeY:Math.round((c-t.top)/n)});return"touches"in e?Array.from(e.touches).map(u=>s(u.clientX,u.clientY)):s(e.clientX,e.clientY)}var uI=Ar("mouseClick"),cI=uu();cI.startListening({actionCreator:uI,effect:(e,t)=>{var r=e.payload,n=lw(t.getState(),uw(r));(n==null?void 0:n.activeIndex)!=null&&t.dispatch(SH({activeIndex:n.activeIndex,activeDataKey:void 0,activeCoordinate:n.activeCoordinate}))}});var by=Ar("mouseMove"),dI=uu(),Do=null,ga=null,Zm=null;dI.startListening({actionCreator:by,effect:(e,t)=>{var r=e.payload,n=t.getState(),{throttleDelay:i,throttledEvents:a}=n.eventSettings,s=a==="all"||(a==null?void 0:a.includes("mousemove"));Do!==null&&(cancelAnimationFrame(Do),Do=null),ga!==null&&(typeof i!="number"||!s)&&(clearTimeout(ga),ga=null),Zm=uw(r);var u=()=>{var c=t.getState(),d=Su(c,c.tooltip.settings.shared);if(!Zm){Do=null,ga=null;return}if(d==="axis"){var h=lw(c,Zm);(h==null?void 0:h.activeIndex)!=null?t.dispatch(BT({activeIndex:h.activeIndex,activeDataKey:void 0,activeCoordinate:h.activeCoordinate})):t.dispatch(UT())}Do=null,ga=null};if(!s){u();return}i==="raf"?Do=requestAnimationFrame(u):typeof i=="number"&&ga===null&&(ga=setTimeout(u,i))}});function eJ(e,t){return t instanceof HTMLElement?"HTMLElement <".concat(t.tagName,' class="').concat(t.className,'">'):t===window?"global.window":e==="children"&&typeof t=="object"&&t!==null?"<<CHILDREN>>":t}var FE={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0,reverseStackOrder:!1},fI=Xt({name:"rootProps",initialState:FE,reducers:{updateOptions:(e,t)=>{var r;e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=(r=t.payload.barGap)!==null&&r!==void 0?r:FE.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue,e.reverseStackOrder=t.payload.reverseStackOrder}}}),tJ=fI.reducer,{updateOptions:rJ}=fI.actions,nJ=null,iJ={updatePolarOptions:(e,t)=>e===null?t.payload:(e.startAngle=t.payload.startAngle,e.endAngle=t.payload.endAngle,e.cx=t.payload.cx,e.cy=t.payload.cy,e.innerRadius=t.payload.innerRadius,e.outerRadius=t.payload.outerRadius,e)},hI=Xt({name:"polarOptions",initialState:nJ,reducers:iJ}),{updatePolarOptions:Kee}=hI.actions,aJ=hI.reducer,pI=Ar("keyDown"),vI=Ar("focus"),mI=Ar("blur"),mh=uu(),Mo=null,ya=null,id=null;mh.startListening({actionCreator:pI,effect:(e,t)=>{id=e.payload,Mo!==null&&(cancelAnimationFrame(Mo),Mo=null);var r=t.getState(),{throttleDelay:n,throttledEvents:i}=r.eventSettings,a=i==="all"||i.includes("keydown");ya!==null&&(typeof n!="number"||!a)&&(clearTimeout(ya),ya=null);var s=()=>{try{var u=t.getState(),c=u.rootProps.accessibilityLayer!==!1;if(!c)return;var{keyboardInteraction:d}=u.tooltip,h=id;if(h!=="ArrowRight"&&h!=="ArrowLeft"&&h!=="Enter")return;var p=Nl(d,Ua(u),ls(u),us(u)),m=p==null?-1:Number(p),g=!Number