di,(e,t)=>({x:0,y:0,width:e,height:t})),WB=x.createContext(null),Jt=()=>x.useContext(WB)!=null,qf=e=>e.brush,Hf=L([qf,Tt,bC],(e,t,r)=>({height:e.height,x:ce(e.x)?e.x:t.left,y:ce(e.y)?e.y:t.top+t.height+t.brushBottom-((r==null?void 0:r.bottom)||0),width:ce(e.width)?e.width:t.width})),bm={},xm={},_m={},CS;function qB(){if(CS)return _m;CS=1;function e(t,r,{signal:n,edges:i}={}){let a,s=null;const u=i!=null&&i.includes("leading"),c=i==null||i.includes("trailing"),d=()=>{s!==null&&(t.apply(a,s),a=void 0,s=null)},h=()=>{c&&d(),b()};let p=null;const m=()=>{p!=null&&clearTimeout(p),p=setTimeout(()=>{p=null,h()},r)},g=()=>{p!==null&&(clearTimeout(p),p=null)},b=()=>{g(),a=void 0,s=null},w=()=>{d()},S=function(...k){if(n!=null&&n.aborted)return;a=this,s=k;const A=p==null;m(),u&&A&&d()};return S.schedule=m,S.cancel=b,S.flush=w,n==null||n.addEventListener("abort",b,{once:!0}),S}return _m.debounce=e,_m}var jS;function HB(){if(jS)return xm;jS=1;const e=qB();function t(r,n=0,i={}){typeof i!="object"&&(i={});const{leading:a=!1,trailing:s=!0,maxWait:u}=i,c=Array(2);a&&(c[0]="leading"),s&&(c[1]="trailing");let d,h=null;const p=e.debounce(function(...b){d=r.apply(this,b),h=null},n,{edges:c}),m=function(...b){return u!=null&&(h===null&&(h=Date.now()),Date.now()-h>=u)?(d=r.apply(this,b),h=Date.now(),p.cancel(),p.schedule(),d):(p.apply(this,b),d)},g=()=>(p.flush(),d);return m.cancel=p.cancel,m.flush=g,m}return xm.debounce=t,xm}var TS;function KB(){if(TS)return bm;TS=1;const e=HB();function t(r,n=0,i={}){const{leading:a=!0,trailing:s=!0}=i;return e.debounce(r,n,{leading:a,maxWait:n,trailing:s})}return bm.throttle=t,bm}var Sm,NS;function VB(){return NS||(NS=1,Sm=KB().throttle),Sm}var GB=VB();const YB=ai(GB);var $d=function(t,r){for(var n=arguments.length,i=new Array(n>2?n-2:0),a=2;a<n;a++)i[a-2]=arguments[a];if(typeof console<"u"&&console.warn&&(r===void 0&&console.warn("LogUtils requires an error message argument"),!t))if(r===void 0)console.warn("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var s=0;console.warn(r.replace(/%s/g,()=>i[s++]))}},An={width:"100%",height:"100%",debounce:0,minWidth:0,initialDimension:{width:-1,height:-1}},xC=(e,t,r)=>{var{width:n=An.width,height:i=An.height,aspect:a,maxHeight:s}=r,u=Da(n)?e:Number(n),c=Da(i)?t:Number(i);return a&&a>0&&(u?c=u/a:c&&(u=c*a),s&&c!=null&&c>s&&(c=s)),{calculatedWidth:u,calculatedHeight:c}},XB={width:0,height:0,overflow:"visible"},JB={width:0,overflowX:"visible"},QB={height:0,overflowY:"visible"},ZB={},e5=e=>{var{width:t,height:r}=e,n=Da(t),i=Da(r);return n&&i?XB:n?JB:i?QB:ZB};function t5(e){var{width:t,height:r,aspect:n}=e,i=t,a=r;return i===void 0&&a===void 0?(i=An.width,a=An.height):i===void 0?i=n&&n>0?void 0:An.width:a===void 0&&(a=n&&n>0?void 0:An.height),{width:i,height:a}}function Bg(){return Bg=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},Bg.apply(null,arguments)}function IS(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 RS(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?IS(Object(r),!0).forEach(function(n){r5(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):IS(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function r5(e,t,r){return(t=n5(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n5(e){var t=i5(e,"string");return typeof t=="symbol"?t:t+""}function i5(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 _C=x.createContext(An.initialDimension);function a5(e){return Rn(e.width)&&Rn(e.height)}function SC(e){var{children:t,width:r,height:n}=e,i=x.useMemo(()=>({width:r,height:n}),[r,n]);return a5(i)?x.createElement(_C.Provider,{value:i},t):null}var Gy=()=>x.useContext(_C),o5=x.forwardRef((e,t)=>{var{aspect:r,initialDimension:n=An.initialDimension,width:i,height:a,minWidth:s=An.minWidth,minHeight:u,maxHeight:c,children:d,debounce:h=An.debounce,id:p,className:m,onResize:g,style:b={}}=e,w=x.useRef(null),S=x.useRef();S.current=g,x.useImperativeHandle(t,()=>w.current);var[k,A]=x.useState({containerWidth:n.width,containerHeight:n.height}),P=x.useCallback((F,W)=>{A(H=>{var Y=Math.round(F),B=Math.round(W);return H.containerWidth===Y&&H.containerHeight===B?H:{containerWidth:Y,containerHeight:B}})},[]);x.useEffect(()=>{if(w.current==null||typeof ResizeObserver>"u")return Ka;var F=B=>{var pe,ie=B[0];if(ie!=null){var{width:me,height:_e}=ie.contentRect;P(me,_e),(pe=S.current)===null||pe===void 0||pe.call(S,me,_e)}};h>0&&(F=YB(F,h,{trailing:!0,leading:!1}));var W=new ResizeObserver(F),{width:H,height:Y}=w.current.getBoundingClientRect();return P(H,Y),W.observe(w.current),()=>{W.disconnect()}},[P,h]);var{containerWidth:C,containerHeight:N}=k;$d(!r||r>0,"The aspect(%s) must be greater than zero.",r);var{calculatedWidth:j,calculatedHeight:M}=xC(C,N,{width:i,height:a,aspect:r,maxHeight:c});return $d(j!=null&&j>0||M!=null&&M>0,`The width(%s) and height(%s) of chart should be greater than 0,
       please check the style of container, or the props width(%s) and height(%s),
       or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the
       height and width.`,j,M,i,a,s,u,r),x.createElement("div",{id:p?"".concat(p):void 0,className:Fe("recharts-responsive-container",m),style:RS(RS({},b),{},{width:i,height:a,minWidth:s,minHeight:u,maxHeight:c}),ref:w},x.createElement("div",{style:e5({width:i,height:a})},x.createElement(SC,{width:j,height:M},d)))}),kC=x.forwardRef((e,t)=>{var r=Gy();if(Rn(r.width)&&Rn(r.height))return e.children;var{width:n,height:i}=t5({width:e.width,height:e.height,aspect:e.aspect}),{calculatedWidth:a,calculatedHeight:s}=xC(void 0,void 0,{width:n,height:i,aspect:e.aspect,maxHeight:e.maxHeight});return ce(a)&&ce(s)?x.createElement(SC,{width:a,height:s},e.children):x.createElement(o5,Bg({},e,{width:n,height:i,ref:t}))});function Yy(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}var Kf=()=>{var e,t=Jt(),r=ve(FB),n=ve(Hf),i=(e=ve(qf))===null||e===void 0?void 0:e.padding;return!t||!n||!i?r:{width:n.width-i.left-i.right,height:n.height-i.top-i.bottom,x:i.left,y:i.top}},s5={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},PC=()=>{var e;return(e=ve(Tt))!==null&&e!==void 0?e:s5},EC=()=>ve(ci),OC=()=>ve(di),Le=e=>e.layout.layoutType,Va=()=>ve(Le),AC=()=>{var e=Va();if(e==="horizontal"||e==="vertical")return e},CC=e=>{var t=e.layout.layoutType;if(t==="centric"||t==="radial")return t},l5=()=>{var e=Va();return e!==void 0},du=e=>{var t=at(),r=Jt(),{width:n,height:i}=e,a=Gy(),s=n,u=i;return a&&(s=a.width>0?a.width:n,u=a.height>0?a.height:i),x.useEffect(()=>{!r&&Rn(s)&&Rn(u)&&t(fB({width:s,height:u}))},[t,r,s,u]),null},jC=Symbol.for("immer-nothing"),DS=Symbol.for("immer-draftable"),Cr=Symbol.for("immer-state");function sn(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Vl=Object.getPrototypeOf;function is(e){return!!e&&!!e[Cr]}function $a(e){var t;return e?TC(e)||Array.isArray(e)||!!e[DS]||!!((t=e.constructor)!=null&&t[DS])||fu(e)||Gf(e):!1}var u5=Object.prototype.constructor.toString(),MS=new WeakMap;function TC(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);if(t===null||t===Object.prototype)return!0;const r=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(r===Object)return!0;if(typeof r!="function")return!1;let n=MS.get(r);return n===void 0&&(n=Function.toString.call(r),MS.set(r,n)),n===u5}function Ld(e,t,r=!0){Vf(e)===0?(r?Reflect.ownKeys(e):Object.keys(e)).forEach(i=>{t(i,e[i],e)}):e.forEach((n,i)=>t(i,n,e))}function Vf(e){const t=e[Cr];return t?t.type_:Array.isArray(e)?1:fu(e)?2:Gf(e)?3:0}function Fg(e,t){return Vf(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function NC(e,t,r){const n=Vf(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function c5(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function fu(e){return e instanceof Map}function Gf(e){return e instanceof Set}function _a(e){return e.copy_||e.base_}function Wg(e,t){if(fu(e))return new Map(e);if(Gf(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const r=TC(e);if(t===!0||t==="class_only"&&!r){const n=Object.getOwnPropertyDescriptors(e);delete n[Cr];let i=Reflect.ownKeys(n);for(let a=0;a<i.length;a++){const s=i[a],u=n[s];u.writable===!1&&(u.writable=!0,u.configurable=!0),(u.get||u.set)&&(n[s]={configurable:!0,writable:!0,enumerable:u.enumerable,value:e[s]})}return Object.create(Vl(e),n)}else{const n=Vl(e);if(n!==null&&r)return{...e};const i=Object.create(n);return Object.assign(i,e)}}function Xy(e,t=!1){return Yf(e)||is(e)||!$a(e)||(Vf(e)>1&&Object.defineProperties(e,{set:Xc,add:Xc,clear:Xc,delete:Xc}),Object.freeze(e),t&&Object.values(e).forEach(r=>Xy(r,!0))),e}function d5(){sn(2)}var Xc={value:d5};function Yf(e){return e===null||typeof e!="object"?!0:Object.isFrozen(e)}var f5={};function La(e){const t=f5[e];return t||sn(0,e),t}var Gl;function IC(){return Gl}function h5(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function $S(e,t){t&&(La("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function qg(e){Hg(e),e.drafts_.forEach(p5),e.drafts_=null}function Hg(e){e===Gl&&(Gl=e.parent_)}function LS(e){return Gl=h5(Gl,e)}function p5(e){const t=e[Cr];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function zS(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];return e!==void 0&&e!==r?(r[Cr].modified_&&(qg(t),sn(4)),$a(e)&&(e=zd(t,e),t.parent_||Ud(t,e)),t.patches_&&La("Patches").generateReplacementPatches_(r[Cr].base_,e,t.patches_,t.inversePatches_)):e=zd(t,r,[]),qg(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==jC?e:void 0}function zd(e,t,r){if(Yf(t))return t;const n=e.immer_.shouldUseStrictIteration(),i=t[Cr];if(!i)return Ld(t,(a,s)=>US(e,i,t,a,s,r),n),t;if(i.scope_!==e)return t;if(!i.modified_)return Ud(e,i.base_,!0),i.base_;if(!i.finalized_){i.finalized_=!0,i.scope_.unfinalizedDrafts_--;const a=i.copy_;let s=a,u=!1;i.type_===3&&(s=new Set(a),a.clear(),u=!0),Ld(s,(c,d)=>US(e,i,a,c,d,r,u),n),Ud(e,a,!1),r&&e.patches_&&La("Patches").generatePatches_(i,r,e.patches_,e.inversePatches_)}return i.copy_}function US(e,t,r,n,i,a,s){if(i==null||typeof i!="object"&&!s)return;const u=Yf(i);if(!(u&&!s)){if(is(i)){const c=a&&t&&t.type_!==3&&!Fg(t.assigned_,n)?a.concat(n):void 0,d=zd(e,i,c);if(NC(r,n,d),is(d))e.canAutoFreeze_=!1;else return}else s&&r.add(i);if($a(i)&&!u){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1||t&&t.base_&&t.base_[n]===i&&u)return;zd(e,i),(!t||!t.scope_.parent_)&&typeof n!="symbol"&&(fu(r)?r.has(n):Object.prototype.propertyIsEnumerable.call(r,n))&&Ud(e,i)}}}function Ud(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Xy(t,r)}function v5(e,t){const r=Array.isArray(e),n={type_:r?1:0,scope_:t?t.scope_:IC(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let i=n,a=Jy;r&&(i=[n],a=Yl);const{revoke:s,proxy:u}=Proxy.revocable(i,a);return n.draft_=u,n.revoke_=s,u}var Jy={get(e,t){if(t===Cr)return e;const r=_a(e);if(!Fg(r,t))return m5(e,r,t);const n=r[t];return e.finalized_||!$a(n)?n:n===km(e.base_,t)?(Pm(e),e.copy_[t]=Vg(n,e)):n},has(e,t){return t in _a(e)},ownKeys(e){return Reflect.ownKeys(_a(e))},set(e,t,r){const n=RC(_a(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const i=km(_a(e),t),a=i==null?void 0:i[Cr];if(a&&a.base_===r)return e.copy_[t]=r,e.assigned_[t]=!1,!0;if(c5(r,i)&&(r!==void 0||Fg(e.base_,t)))return!0;Pm(e),Kg(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_[t]=!0),!0},deleteProperty(e,t){return km(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,Pm(e),Kg(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=_a(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:n.enumerable,value:r[t]}},defineProperty(){sn(11)},getPrototypeOf(e){return Vl(e.base_)},setPrototypeOf(){sn(12)}},Yl={};Ld(Jy,(e,t)=>{Yl[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});Yl.deleteProperty=function(e,t){return Yl.set.call(this,e,t,void 0)};Yl.set=function(e,t,r){return Jy.set.call(this,e[0],t,r,e[0])};function km(e,t){const r=e[Cr];return(r?_a(r):e)[t]}function m5(e,t,r){var i;const n=RC(t,r);return n?"value"in n?n.value:(i=n.get)==null?void 0:i.call(e.draft_):void 0}function RC(e,t){if(!(t in e))return;let r=Vl(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Vl(r)}}function Kg(e){e.modified_||(e.modified_=!0,e.parent_&&Kg(e.parent_))}function Pm(e){e.copy_||(e.copy_=Wg(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var g5=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(t,r,n)=>{if(typeof t=="function"&&typeof r!="function"){const a=r;r=t;const s=this;return function(c=a,...d){return s.produce(c,h=>r.call(this,h,...d))}}typeof r!="function"&&sn(6),n!==void 0&&typeof n!="function"&&sn(7);let i;if($a(t)){const a=LS(this),s=Vg(t,void 0);let u=!0;try{i=r(s),u=!1}finally{u?qg(a):Hg(a)}return $S(a,n),zS(i,a)}else if(!t||typeof t!="object"){if(i=r(t),i===void 0&&(i=t),i===jC&&(i=void 0),this.autoFreeze_&&Xy(i,!0),n){const a=[],s=[];La("Patches").generateReplacementPatches_(t,i,a,s),n(a,s)}return i}else sn(1,t)},this.produceWithPatches=(t,r)=>{if(typeof t=="function")return(s,...u)=>this.produceWithPatches(s,c=>t(c,...u));let n,i;return[this.produce(t,r,(s,u)=>{n=s,i=u}),n,i]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),typeof(e==null?void 0:e.useStrictIteration)=="boolean"&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){$a(e)||sn(8),is(e)&&(e=y5(e));const t=LS(this),r=Vg(e,void 0);return r[Cr].isManual_=!0,Hg(t),r}finishDraft(e,t){const r=e&&e[Cr];(!r||!r.isManual_)&&sn(9);const{scope_:n}=r;return $S(n,t),zS(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){const i=t[r];if(i.path.length===0&&i.op==="replace"){e=i.value;break}}r>-1&&(t=t.slice(r+1));const n=La("Patches").applyPatches_;return is(e)?n(e,t):this.produce(e,i=>n(i,t))}};function Vg(e,t){const r=fu(e)?La("MapSet").proxyMap_(e,t):Gf(e)?La("MapSet").proxySet_(e,t):v5(e,t);return(t?t.scope_:IC()).drafts_.push(r),r}function y5(e){return is(e)||sn(10,e),DC(e)}function DC(e){if(!$a(e)||Yf(e))return e;const t=e[Cr];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Wg(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Wg(e,!0);return Ld(r,(i,a)=>{NC(r,i,DC(a))},n),t&&(t.finalized_=!1),r}var w5=new g5;w5.produce;var b5={settings:{layout:"horizontal",align:"center",verticalAlign:"middle",itemSorter:"value"},size:{width:0,height:0},payload:[]},MC=Xt({name:"legend",initialState:b5,reducers:{setLegendSize(e,t){e.size.width=t.payload.width,e.size.height=t.payload.height},setLegendSettings(e,t){e.settings.align=t.payload.align,e.settings.layout=t.payload.layout,e.settings.verticalAlign=t.payload.verticalAlign,e.settings.itemSorter=t.payload.itemSorter},addLegendPayload:{reducer(e,t){e.payload.push(t.payload)},prepare:Je()},replaceLegendPayload:{reducer(e,t){var{prev:r,next:n}=t.payload,i=Ur(e).payload.indexOf(r);i>-1&&(e.payload[i]=n)},prepare:Je()},removeLegendPayload:{reducer(e,t){var r=Ur(e).payload.indexOf(t.payload);r>-1&&e.payload.splice(r,1)},prepare:Je()}}}),{setLegendSize:See,setLegendSettings:kee,addLegendPayload:x5,replaceLegendPayload:_5,removeLegendPayload:S5}=MC.actions,k5=MC.reducer,Em={exports:{}},Om={};/**
 * @license React
 * use-sync-external-store-with-selector.production.js
 *
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */var BS;function P5(){if(BS)return Om;BS=1;var e=cs();function t(c,d){return c===d&&(c!==0||1/c===1/d)||c!==c&&d!==d}var r=typeof Object.is=="function"?Object.is:t,n=e.useSyncExternalStore,i=e.useRef,a=e.useEffect,s=e.useMemo,u=e.useDebugValue;return Om.useSyncExternalStoreWithSelector=function(c,d,h,p,m){var g=i(null);if(g.current===null){var b={hasValue:!1,value:null};g.current=b}else b=g.current;g=s(function(){function S(N){if(!k){if(k=!0,A=N,N=p(N),m!==void 0&&b.hasValue){var j=b.value;if(m(j,N))return P=j}return P=N}if(j=P,r(A,N))return j;var M=p(N);return m!==void 0&&m(j,M)?(A=N,j):(A=N,P=M)}var k=!1,A,P,C=h===void 0?null:h;return[function(){return S(d())},C===null?void 0:function(){return S(C())}]},[d,h,p,m]);var w=n(c,g[0],g[1]);return a(function(){b.hasValue=!0,b.value=w},[w]),u(w),w},Om}var FS;function E5(){return FS||(FS=1,Em.exports=P5()),Em.exports}E5();function O5(e){e()}function A5(){let e=null,t=null;return{clear(){e=null,t=null},notify(){O5(()=>{let r=e;for(;r;)r.callback(),r=r.next})},get(){const r=[];let n=e;for(;n;)r.push(n),n=n.next;return r},subscribe(r){let n=!0;const i=t={callback:r,next:null,prev:t};return i.prev?i.prev.next=i:e=i,function(){!n||e===null||(n=!1,i.next?i.next.prev=i.prev:t=i.prev,i.prev?i.prev.next=i.next:e=i.next)}}}}var WS={notify(){},get:()=>[]};function C5(e,t){let r,n=WS,i=0,a=!1;function s(w){h();const S=n.subscribe(w);let k=!1;return()=>{k||(k=!0,S(),p())}}function u(){n.notify()}function c(){b.onStateChange&&b.onStateChange()}function d(){return a}function h(){i++,r||(r=e.subscribe(c),n=A5())}function p(){i--,r&&i===0&&(r(),r=void 0,n.clear(),n=WS)}function m(){a||(a=!0,h())}function g(){a&&(a=!1,p())}const b={addNestedSub:s,notifyNestedSubs:u,handleChangeWrapper:c,isSubscribed:d,trySubscribe:m,tryUnsubscribe:g,getListeners:()=>n};return b}var j5=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",T5=j5(),N5=()=>typeof navigator<"u"&&navigator.product==="ReactNative",I5=N5(),R5=()=>T5||I5?x.useLayoutEffect:x.useEffect,D5=R5();function qS(e,t){return e===t?e!==0||t!==0||1/e===1/t:e!==e&&t!==t}function M5(e,t){if(qS(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(let i=0;i<r.length;i++)if(!Object.prototype.hasOwnProperty.call(t,r[i])||!qS(e[r[i]],t[r[i]]))return!1;return!0}var Am=Symbol.for("react-redux-context"),Cm=typeof globalThis<"u"?globalThis:{};function $5(){if(!x.createContext)return{};const e=Cm[Am]??(Cm[Am]=new Map);let t=e.get(x.createContext);return t||(t=x.createContext(null),e.set(x.createContext,t)),t}var L5=$5();function z5(e){const{children:t,context:r,serverState:n,store:i}=e,a=x.useMemo(()=>{const c=C5(i);return{store:i,subscription:c,getServerState:n?()=>n:void 0}},[i,n]),s=x.useMemo(()=>i.getState(),[i]);D5(()=>{const{subscription:c}=a;return c.onStateChange=c.notifyNestedSubs,c.trySubscribe(),s!==i.getState()&&c.notifyNestedSubs(),()=>{c.tryUnsubscribe(),c.onStateChange=void 0}},[a,s]);const u=r||L5;return x.createElement(u.Provider,{value:a},t)}var U5=z5,B5=new Set(["axisLine","tickLine","activeBar","activeDot","activeLabel","activeShape","allowEscapeViewBox","background","cursor","dot","label","line","margin","padding","position","shape","style","tick","wrapperStyle","radius","throttledEvents"]);function F5(e,t){return e==null&&t==null?!0:typeof e=="number"&&typeof t=="number"?e===t||e!==e&&t!==t:e===t}function hu(e,t){var r=new Set([...Object.keys(e),...Object.keys(t)]);for(var n of r)if(B5.has(n)){if(e[n]==null&&t[n]==null)continue;if(!M5(e[n],t[n]))return!1}else if(!F5(e[n],t[n]))return!1;return!0}function Gg(){return Gg=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},Gg.apply(null,arguments)}function HS(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 dl(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?HS(Object(r),!0).forEach(function(n){W5(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):HS(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function W5(e,t,r){return(t=q5(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function q5(e){var t=H5(e,"string");return typeof t=="symbol"?t:t+""}function H5(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 K5(e){return Array.isArray(e)&&In(e[0])&&In(e[1])?e.join(" ~ "):e}var jo={separator:" : ",contentStyle:{margin:0,padding:10,backgroundColor:"#fff",border:"1px solid #ccc",whiteSpace:"nowrap"},itemStyle:{display:"block",paddingTop:4,paddingBottom:4,color:"#000"},labelStyle:{},accessibilityLayer:!1};function V5(e,t){return t==null?e:Tf(e,t)}var G5=e=>{var{separator:t=jo.separator,contentStyle:r,itemStyle:n,labelStyle:i=jo.labelStyle,payload:a,formatter:s,itemSorter:u,wrapperClassName:c,labelClassName:d,label:h,labelFormatter:p,accessibilityLayer:m=jo.accessibilityLayer}=e,g=()=>{if(a&&a.length){var N={padding: