diff options
author | teh_coderer <me@tehcoderer.com> | 2023-05-04 15:29:52 -0400 |
---|---|---|
committer | teh_coderer <me@tehcoderer.com> | 2023-05-04 15:29:52 -0400 |
commit | c252a9e87af8eddd5e5fca4ca7ad7308285b2cd7 (patch) | |
tree | becfc52b9d136c6c15e0b45c3409cf8c750fb4a4 | |
parent | 2b7793857b66e1f34ba346c1b3c423686f1980f8 (diff) |
update tables
-rw-r--r-- | frontend-components/tables/src/components/Table/ColumnHeader.tsx | 26 | ||||
-rw-r--r-- | frontend-components/tables/src/components/Table/index.tsx | 49 | ||||
-rw-r--r-- | frontend-components/tables/src/utils/utils.ts | 42 | ||||
-rw-r--r-- | openbb_terminal/core/plots/table.html | 100 |
4 files changed, 142 insertions, 75 deletions
diff --git a/frontend-components/tables/src/components/Table/ColumnHeader.tsx b/frontend-components/tables/src/components/Table/ColumnHeader.tsx index 511dcec7e9a..f0126efbf69 100644 --- a/frontend-components/tables/src/components/Table/ColumnHeader.tsx +++ b/frontend-components/tables/src/components/Table/ColumnHeader.tsx @@ -1,7 +1,7 @@ import { flexRender } from "@tanstack/react-table"; import clsx from "clsx"; import { FC } from "react"; -import { includesDateNames } from "../../utils/utils"; +import { formatNumberMagnitude, includesDateNames } from "../../utils/utils"; import { useDrag, useDrop } from "react-dnd"; import * as ContextMenuPrimitive from "@radix-ui/react-context-menu"; @@ -16,24 +16,34 @@ function Filter({ }) { const values = table .getPreFilteredRowModel() - .flatRows.map((row) => row.getValue(column.id)); + .flatRows.map((row: { getValue: (arg0: any) => any }) => + row.getValue(column.id) + ); const areAllValuesString = values.every( - (value) => typeof value === "string" || value === null + (value: null) => typeof value === "string" || value === null ); const areAllValuesNumber = values.every( - (value) => typeof value === "number" || value === null + (value: null | number | string) => + typeof value === "number" || + value === null || + ((value.toString().replace(/[^0-9]/g, "") ?? "").trim().length !== 0 && + value + .toString() + .replace(/[^a-zA-Z]/g, "" ?? "") + .trim().length === 1) ); const valuesContainStringWithSpaces = values.some( - (value) => typeof value === "string" && value.includes(" ") + (value: string | string[]) => + typeof value === "string" && value.includes(" ") ); const columnFilterValue = column.getFilterValue(); - const isProbablyDate = values.every((value) => { + const isProbablyDate = values.every((value: string) => { if (typeof value !== "string") return false; - const only_numbers = value.replace(/[^0-9]/g, ""); + const only_numbers = value.replace(/[^0-9]/g, "").trim(); return ( only_numbers.length >= 4 && (includesDateNames(column.id) || @@ -42,7 +52,7 @@ function Filter({ }); if (isProbablyDate) { - function getTime(value) { + function getTime(value: string | number | Date) { if (!value) return null; const date = new Date(value); const year = date.getFullYear(); diff --git a/frontend-components/tables/src/components/Table/index.tsx b/frontend-components/tables/src/components/Table/index.tsx index dfa7e8e6dac..abfe9759499 100644 --- a/frontend-components/tables/src/components/Table/index.tsx +++ b/frontend-components/tables/src/components/Table/index.tsx @@ -16,6 +16,8 @@ import { fuzzyFilter, isEqual, includesDateNames, + formatNumberNoMagnitude, + includesPriceNames, } from "../../utils/utils"; import DraggableColumnHeader from "./ColumnHeader"; import Pagination, { validatePageSize } from "./Pagination"; @@ -180,7 +182,7 @@ export default function Table({ const indexValue = indexLabel ? row.original[indexLabel] : null; const value = row.original[column]; const valueType = typeof value; - const only_numbers = value?.toString().replace(/[^0-9]/g, ""); + const only_numbers = value?.toString().replace(/[^0-9]/g, "") ?? ""; const probablyDate = only_numbers.length >= 4 && (includesDateNames(column) || @@ -207,7 +209,7 @@ export default function Table({ </a> ); } - if (probablyDate) { + if (probablyDate && typeof value !== "number") { if (typeof value === "string") { const date = value.split("T")[0]; const time = value.split("T")[1]?.split(".")[0]; @@ -221,12 +223,6 @@ export default function Table({ ); } - if (typeof value === "number") { - if (value < 1000000000000) { - return <p>{value}</p>; - } - } - try { const date = new Date(value); let dateFormatted = ""; @@ -250,19 +246,42 @@ export default function Table({ return <p>{value}</p>; } } - if (valueType === "number") { - const valueFormatted = formatNumberMagnitude(value); + if ( + valueType === "number" || + value + ?.toString() + .replace(/[^a-zA-Z]/g, "") + .trim().length === 1 + ) { + let valueFormatted = formatNumberMagnitude(value, column); + const valueFormattedNoMagnitude = Number( + formatNumberNoMagnitude(value) + ); + + if ( + typeof indexValue === "string" && + includesPriceNames(indexValue) + ) { + valueFormatted = Number(formatNumberNoMagnitude(value)); + if (valueFormatted > 1000) { + valueFormatted = valueFormatted.toLocaleString("en-US", { + maximumFractionDigits: 2, + minimumFractionDigits: 2, + }); + } + } + return ( <p className={clsx("whitespace-nowrap", { "text-black dark:text-white": !colors, - "text-[#16A34A]": value > 0 && colors, - "text-[#F87171]": value < 0 && colors, - "text-[#404040]": value === 0 && colors, + "text-[#16A34A]": valueFormattedNoMagnitude > 0 && colors, + "text-[#F87171]": valueFormattedNoMagnitude < 0 && colors, + "text-[#404040]": valueFormattedNoMagnitude === 0 && colors, })} > - {value !== 0 - ? value > 0 + {valueFormattedNoMagnitude !== 0 + ? valueFormattedNoMagnitude > 0 ? `${valueFormatted}` : `${valueFormatted}` : valueFormatted} diff --git a/frontend-components/tables/src/utils/utils.ts b/frontend-components/tables/src/utils/utils.ts index 68e6db700a5..72248a166f8 100644 --- a/frontend-components/tables/src/utils/utils.ts +++ b/frontend-components/tables/src/utils/utils.ts @@ -2,7 +2,28 @@ import { rankItem } from "@tanstack/match-sorter-utils"; import domtoimage from "dom-to-image"; import { utils, writeFile } from "xlsx"; -export function formatNumberMagnitude(number: number) { +export function formatNumberNoMagnitude(number: number | string) { + if (typeof number === "string") { + const suffix = number.replace(/[^a-zA-Z]/g, "").trim(); + const magnitude = ["", "K", "M", "B", "T"].indexOf( + suffix.replace(/\s/g, "") + ); + number = + Number(number.replace(/[^0-9.]/g, "").trim()) * + Math.pow(10, magnitude * 3); + } + + return number; +} + +export function formatNumberMagnitude( + number: number | string, + column?: string +) { + if (typeof number === "string") { + number = Number(formatNumberNoMagnitude(number)); + } + if (number % 1 !== 0) { const decimalPlaces = Math.max(2, number.toString().split(".")[1].length); const toFixed = Math.min(4, decimalPlaces); @@ -11,13 +32,17 @@ export function formatNumberMagnitude(number: number) { } } - if (number > 10_000) { + if (number > 1000 && !includesPriceNames(column || "")) { const magnitude = Math.min(4, Math.floor(Math.log10(Math.abs(number)) / 3)); const suffix = ["", "K", "M", "B", "T"][magnitude]; const formatted = (number / 10 ** (magnitude * 3)).toFixed(2); return `${formatted} ${suffix}`; } + if (number > 1000) { + return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + } + return number; } @@ -27,6 +52,19 @@ export function includesDateNames(column: string) { ); } +export function includesPriceNames(column: string) { + return [ + "price", + "value", + "cost", + "amount", + "open", + "close", + "high", + "low", + ].some((priceName) => column.toLowerCase().includes(priceName)); +} + function loadingOverlay(message?: string, is_close?: boolean) { const loading = window.document.getElementById("loading") as HTMLElement; const loading_text = window.document.getElementById( diff --git a/openbb_terminal/core/plots/table.html b/openbb_terminal/core/plots/table.html index c608901c048..2fb789c2c33 100644 --- a/openbb_terminal/core/plots/table.html +++ b/openbb_terminal/core/plots/table.html @@ -79,47 +79,47 @@ } </script> <script type="module" crossorigin> -function py(e,t){for(var r=0;r<t.length;r++){const n=t[r];if(typeof n!="string"&&!Array.isArray(n)){for(const i in n)if(i!=="default"&&!(i in e)){const o=Object.getOwnPropertyDescriptor(n,i);o&&Object.defineProperty(e,i,o.get?o:{enumerable:!0,get:()=>n[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();function _1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ya={},gy={get exports(){return ya},set exports(e){ya=e}},Wa={};/* +function my(e,t){for(var r=0;r<t.length;r++){const n=t[r];if(typeof n!="string"&&!Array.isArray(n)){for(const i in n)if(i!=="default"&&!(i in e)){const o=Object.getOwnPropertyDescriptor(n,i);o&&Object.defineProperty(e,i,o.get?o:{enumerable:!0,get:()=>n[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();function S1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ya={},vy={get exports(){return ya},set exports(e){ya=e}},Wa={};/* object-assign (c) Sindre Sorhus @license MIT -*/var ph=Object.getOwnPropertySymbols,my=Object.prototype.hasOwnProperty,vy=Object.prototype.propertyIsEnumerable;function xy(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function wy(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de",Object.getOwnPropertyNames(e)[0]==="5")return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;var n=Object.getOwnPropertyNames(t).map(function(o){return t[o]});if(n.join("")!=="0123456789")return!1;var i={};return"abcdefghijklmnopqrst".split("").forEach(function(o){i[o]=o}),Object.keys(Object.assign({},i)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}var S1=wy()?Object.assign:function(e,t){for(var r,n=xy(e),i,o=1;o<arguments.length;o++){r=Object(arguments[o]);for(var a in r)my.call(r,a)&&(n[a]=r[a]);if(ph){i=ph(r);for(var s=0;s<i.length;s++)vy.call(r,i[s])&&(n[i[s]]=r[i[s]])}}return n},v={},yy={get exports(){return v},set exports(e){v=e}},Ie={};/** @license React v17.0.2 +*/var gh=Object.getOwnPropertySymbols,xy=Object.prototype.hasOwnProperty,wy=Object.prototype.propertyIsEnumerable;function yy(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function Ey(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de",Object.getOwnPropertyNames(e)[0]==="5")return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;var n=Object.getOwnPropertyNames(t).map(function(o){return t[o]});if(n.join("")!=="0123456789")return!1;var i={};return"abcdefghijklmnopqrst".split("").forEach(function(o){i[o]=o}),Object.keys(Object.assign({},i)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}var T1=Ey()?Object.assign:function(e,t){for(var r,n=yy(e),i,o=1;o<arguments.length;o++){r=Object(arguments[o]);for(var a in r)xy.call(r,a)&&(n[a]=r[a]);if(gh){i=gh(r);for(var s=0;s<i.length;s++)wy.call(r,i[s])&&(n[i[s]]=r[i[s]])}}return n},v={},_y={get exports(){return v},set exports(e){v=e}},Ie={};/** @license React v17.0.2 * react.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var f0=S1,po=60103,T1=60106;Ie.Fragment=60107;Ie.StrictMode=60108;Ie.Profiler=60114;var C1=60109,A1=60110,R1=60112;Ie.Suspense=60113;var O1=60115,F1=60116;if(typeof Symbol=="function"&&Symbol.for){var gr=Symbol.for;po=gr("react.element"),T1=gr("react.portal"),Ie.Fragment=gr("react.fragment"),Ie.StrictMode=gr("react.strict_mode"),Ie.Profiler=gr("react.profiler"),C1=gr("react.provider"),A1=gr("react.context"),R1=gr("react.forward_ref"),Ie.Suspense=gr("react.suspense"),O1=gr("react.memo"),F1=gr("react.lazy")}var gh=typeof Symbol=="function"&&Symbol.iterator;function Ey(e){return e===null||typeof e!="object"?null:(e=gh&&e[gh]||e["@@iterator"],typeof e=="function"?e:null)}function za(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r<arguments.length;r++)t+="&args[]="+encodeURIComponent(arguments[r]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var D1={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},P1={};function go(e,t,r){this.props=e,this.context=t,this.refs=P1,this.updater=r||D1}go.prototype.isReactComponent={};go.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error(za(85));this.updater.enqueueSetState(this,e,t,"setState")};go.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function I1(){}I1.prototype=go.prototype;function d0(e,t,r){this.props=e,this.context=t,this.refs=P1,this.updater=r||D1}var h0=d0.prototype=new I1;h0.constructor=d0;f0(h0,go.prototype);h0.isPureReactComponent=!0;var p0={current:null},b1=Object.prototype.hasOwnProperty,k1={key:!0,ref:!0,__self:!0,__source:!0};function $1(e,t,r){var n,i={},o=null,a=null;if(t!=null)for(n in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(o=""+t.key),t)b1.call(t,n)&&!k1.hasOwnProperty(n)&&(i[n]=t[n]);var s=arguments.length-2;if(s===1)i.children=r;else if(1<s){for(var l=Array(s),u=0;u<s;u++)l[u]=arguments[u+2];i.children=l}if(e&&e.defaultProps)for(n in s=e.defaultProps,s)i[n]===void 0&&(i[n]=s[n]);return{$$typeof:po,type:e,key:o,ref:a,props:i,_owner:p0.current}}function _y(e,t){return{$$typeof:po,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function g0(e){return typeof e=="object"&&e!==null&&e.$$typeof===po}function Sy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(r){return t[r]})}var mh=/\/+/g;function Vu(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Sy(""+e.key):t.toString(36)}function Vs(e,t,r,n,i){var o=typeof e;(o==="undefined"||o==="boolean")&&(e=null);var a=!1;if(e===null)a=!0;else switch(o){case"string":case"number":a=!0;break;case"object":switch(e.$$typeof){case po:case T1:a=!0}}if(a)return a=e,i=i(a),e=n===""?"."+Vu(a,0):n,Array.isArray(i)?(r="",e!=null&&(r=e.replace(mh,"$&/")+"/"),Vs(i,t,r,"",function(u){return u})):i!=null&&(g0(i)&&(i=_y(i,r+(!i.key||a&&a.key===i.key?"":(""+i.key).replace(mh,"$&/")+"/")+e)),t.push(i)),1;if(a=0,n=n===""?".":n+":",Array.isArray(e))for(var s=0;s<e.length;s++){o=e[s];var l=n+Vu(o,s);a+=Vs(o,t,r,l,i)}else if(l=Ey(e),typeof l=="function")for(e=l.call(e),s=0;!(o=e.next()).done;)o=o.value,l=n+Vu(o,s++),a+=Vs(o,t,r,l,i);else if(o==="object")throw t=""+e,Error(za(31,t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t));return a}function ss(e,t,r){if(e==null)return e;var n=[],i=0;return Vs(e,n,"","",function(o){return t.call(r,o,i++)}),n}function Ty(e){if(e._status===-1){var t=e._result;t=t(),e._status=0,e._result=t,t.then(function(r){e._status===0&&(r=r.default,e._status=1,e._result=r)},function(r){e._status===0&&(e._status=2,e._result=r)})}if(e._status===1)return e._result;throw e._result}var N1={current:null};function nn(){var e=N1.current;if(e===null)throw Error(za(321));return e}var Cy={ReactCurrentDispatcher:N1,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:p0,IsSomeRendererActing:{current:!1},assign:f0};Ie.Children={map:ss,forEach:function(e,t,r){ss(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return ss(e,function(){t++}),t},toArray:function(e){return ss(e,function(t){return t})||[]},only:function(e){if(!g0(e))throw Error(za(143));return e}};Ie.Component=go;Ie.PureComponent=d0;Ie.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Cy;Ie.cloneElement=function(e,t,r){if(e==null)throw Error(za(267,e));var n=f0({},e.props),i=e.key,o=e.ref,a=e._owner;if(t!=null){if(t.ref!==void 0&&(o=t.ref,a=p0.current),t.key!==void 0&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(l in t)b1.call(t,l)&&!k1.hasOwnProperty(l)&&(n[l]=t[l]===void 0&&s!==void 0?s[l]:t[l])}var l=arguments.length-2;if(l===1)n.children=r;else if(1<l){s=Array(l);for(var u=0;u<l;u++)s[u]=arguments[u+2];n.children=s}return{$$typeof:po,type:e.type,key:i,ref:o,props:n,_owner:a}};Ie.createContext=function(e,t){return t===void 0&&(t=null),e={$$typeof:A1,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider={$$typeof:C1,_context:e},e.Consumer=e};Ie.createElement=$1;Ie.createFactory=function(e){var t=$1.bind(null,e);return t.type=e,t};Ie.createRef=function(){return{current:null}};Ie.forwardRef=function(e){return{$$typeof:R1,render:e}};Ie.isValidElement=g0;Ie.lazy=function(e){return{$$typeof:F1,_payload:{_status:-1,_result:e},_init:Ty}};Ie.memo=function(e,t){return{$$typeof:O1,type:e,compare:t===void 0?null:t}};Ie.useCallback=function(e,t){return nn().useCallback(e,t)};Ie.useContext=function(e,t){return nn().useContext(e,t)};Ie.useDebugValue=function(){};Ie.useEffect=function(e,t){return nn().useEffect(e,t)};Ie.useImperativeHandle=function(e,t,r){return nn().useImperativeHandle(e,t,r)};Ie.useLayoutEffect=function(e,t){return nn().useLayoutEffect(e,t)};Ie.useMemo=function(e,t){return nn().useMemo(e,t)};Ie.useReducer=function(e,t,r){return nn().useReducer(e,t,r)};Ie.useRef=function(e){return nn().useRef(e)};Ie.useState=function(e){return nn().useState(e)};Ie.version="17.0.2";(function(e){e.exports=Ie})(yy);const ir=_1(v),Ay=py({__proto__:null,default:ir},[v]);/** @license React v17.0.2 + */var d0=T1,po=60103,C1=60106;Ie.Fragment=60107;Ie.StrictMode=60108;Ie.Profiler=60114;var A1=60109,R1=60110,O1=60112;Ie.Suspense=60113;var F1=60115,D1=60116;if(typeof Symbol=="function"&&Symbol.for){var gr=Symbol.for;po=gr("react.element"),C1=gr("react.portal"),Ie.Fragment=gr("react.fragment"),Ie.StrictMode=gr("react.strict_mode"),Ie.Profiler=gr("react.profiler"),A1=gr("react.provider"),R1=gr("react.context"),O1=gr("react.forward_ref"),Ie.Suspense=gr("react.suspense"),F1=gr("react.memo"),D1=gr("react.lazy")}var mh=typeof Symbol=="function"&&Symbol.iterator;function Sy(e){return e===null||typeof e!="object"?null:(e=mh&&e[mh]||e["@@iterator"],typeof e=="function"?e:null)}function za(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r<arguments.length;r++)t+="&args[]="+encodeURIComponent(arguments[r]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var P1={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},I1={};function go(e,t,r){this.props=e,this.context=t,this.refs=I1,this.updater=r||P1}go.prototype.isReactComponent={};go.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error(za(85));this.updater.enqueueSetState(this,e,t,"setState")};go.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function b1(){}b1.prototype=go.prototype;function h0(e,t,r){this.props=e,this.context=t,this.refs=I1,this.updater=r||P1}var p0=h0.prototype=new b1;p0.constructor=h0;d0(p0,go.prototype);p0.isPureReactComponent=!0;var g0={current:null},k1=Object.prototype.hasOwnProperty,$1={key:!0,ref:!0,__self:!0,__source:!0};function N1(e,t,r){var n,i={},o=null,a=null;if(t!=null)for(n in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(o=""+t.key),t)k1.call(t,n)&&!$1.hasOwnProperty(n)&&(i[n]=t[n]);var s=arguments.length-2;if(s===1)i.children=r;else if(1<s){for(var l=Array(s),u=0;u<s;u++)l[u]=arguments[u+2];i.children=l}if(e&&e.defaultProps)for(n in s=e.defaultProps,s)i[n]===void 0&&(i[n]=s[n]);return{$$typeof:po,type:e,key:o,ref:a,props:i,_owner:g0.current}}function Ty(e,t){return{$$typeof:po,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function m0(e){return typeof e=="object"&&e!==null&&e.$$typeof===po}function Cy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(r){return t[r]})}var vh=/\/+/g;function Vu(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Cy(""+e.key):t.toString(36)}function Vs(e,t,r,n,i){var o=typeof e;(o==="undefined"||o==="boolean")&&(e=null);var a=!1;if(e===null)a=!0;else switch(o){case"string":case"number":a=!0;break;case"object":switch(e.$$typeof){case po:case C1:a=!0}}if(a)return a=e,i=i(a),e=n===""?"."+Vu(a,0):n,Array.isArray(i)?(r="",e!=null&&(r=e.replace(vh,"$&/")+"/"),Vs(i,t,r,"",function(u){return u})):i!=null&&(m0(i)&&(i=Ty(i,r+(!i.key||a&&a.key===i.key?"":(""+i.key).replace(vh,"$&/")+"/")+e)),t.push(i)),1;if(a=0,n=n===""?".":n+":",Array.isArray(e))for(var s=0;s<e.length;s++){o=e[s];var l=n+Vu(o,s);a+=Vs(o,t,r,l,i)}else if(l=Sy(e),typeof l=="function")for(e=l.call(e),s=0;!(o=e.next()).done;)o=o.value,l=n+Vu(o,s++),a+=Vs(o,t,r,l,i);else if(o==="object")throw t=""+e,Error(za(31,t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t));return a}function ss(e,t,r){if(e==null)return e;var n=[],i=0;return Vs(e,n,"","",function(o){return t.call(r,o,i++)}),n}function Ay(e){if(e._status===-1){var t=e._result;t=t(),e._status=0,e._result=t,t.then(function(r){e._status===0&&(r=r.default,e._status=1,e._result=r)},function(r){e._status===0&&(e._status=2,e._result=r)})}if(e._status===1)return e._result;throw e._result}var M1={current:null};function nn(){var e=M1.current;if(e===null)throw Error(za(321));return e}var Ry={ReactCurrentDispatcher:M1,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:g0,IsSomeRendererActing:{current:!1},assign:d0};Ie.Children={map:ss,forEach:function(e,t,r){ss(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return ss(e,function(){t++}),t},toArray:function(e){return ss(e,function(t){return t})||[]},only:function(e){if(!m0(e))throw Error(za(143));return e}};Ie.Component=go;Ie.PureComponent=h0;Ie.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Ry;Ie.cloneElement=function(e,t,r){if(e==null)throw Error(za(267,e));var n=d0({},e.props),i=e.key,o=e.ref,a=e._owner;if(t!=null){if(t.ref!==void 0&&(o=t.ref,a=g0.current),t.key!==void 0&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(l in t)k1.call(t,l)&&!$1.hasOwnProperty(l)&&(n[l]=t[l]===void 0&&s!==void 0?s[l]:t[l])}var l=arguments.length-2;if(l===1)n.children=r;else if(1<l){s=Array(l);for(var u=0;u<l;u++)s[u]=arguments[u+2];n.children=s}return{$$typeof:po,type:e.type,key:i,ref:o,props:n,_owner:a}};Ie.createContext=function(e,t){return t===void 0&&(t=null),e={$$typeof:R1,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider={$$typeof:A1,_context:e},e.Consumer=e};Ie.createElement=N1;Ie.createFactory=function(e){var t=N1.bind(null,e);return t.type=e,t};Ie.createRef=function(){return{current:null}};Ie.forwardRef=function(e){return{$$typeof:O1,render:e}};Ie.isValidElement=m0;Ie.lazy=function(e){return{$$typeof:D1,_payload:{_status:-1,_result:e},_init:Ay}};Ie.memo=function(e,t){return{$$typeof:F1,type:e,compare:t===void 0?null:t}};Ie.useCallback=function(e,t){return nn().useCallback(e,t)};Ie.useContext=function(e,t){return nn().useContext(e,t)};Ie.useDebugValue=function(){};Ie.useEffect=function(e,t){return nn().useEffect(e,t)};Ie.useImperativeHandle=function(e,t,r){return nn().useImperativeHandle(e,t,r)};Ie.useLayoutEffect=function(e,t){return nn().useLayoutEffect(e,t)};Ie.useMemo=function(e,t){return nn().useMemo(e,t)};Ie.useReducer=function(e,t,r){return nn().useReducer(e,t,r)};Ie.useRef=function(e){return nn().useRef(e)};Ie.useState=function(e){return nn().useState(e)};Ie.version="17.0.2";(function(e){e.exports=Ie})(_y);const ir=S1(v),Oy=my({__proto__:null,default:ir},[v]);/** @license React v17.0.2 * react-jsx-runtime.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Ry=v,M1=60103;Wa.Fragment=60107;if(typeof Symbol=="function"&&Symbol.for){var vh=Symbol.for;M1=vh("react.element"),Wa.Fragment=vh("react.fragment")}var Oy=Ry.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Fy=Object.prototype.hasOwnProperty,Dy={key:!0,ref:!0,__self:!0,__source:!0};function L1(e,t,r){var n,i={},o=null,a=null;r!==void 0&&(o=""+r),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(a=t.ref);for(n in t)Fy.call(t,n)&&!Dy.hasOwnProperty(n)&&(i[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)i[n]===void 0&&(i[n]=t[n]);return{$$typeof:M1,type:e,key:o,ref:a,props:i,_owner:Oy.current}}Wa.jsx=L1;Wa.jsxs=L1;(function(e){e.exports=Wa})(gy);const B1=ya.Fragment,K=ya.jsx,Se=ya.jsxs;var Jr={},Py={get exports(){return Jr},set exports(e){Jr=e}},hr={},Vc={},Iy={get exports(){return Vc},set exports(e){Vc=e}},U1={};/** @license React v0.20.2 + */var Fy=v,L1=60103;Wa.Fragment=60107;if(typeof Symbol=="function"&&Symbol.for){var xh=Symbol.for;L1=xh("react.element"),Wa.Fragment=xh("react.fragment")}var Dy=Fy.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Py=Object.prototype.hasOwnProperty,Iy={key:!0,ref:!0,__self:!0,__source:!0};function B1(e,t,r){var n,i={},o=null,a=null;r!==void 0&&(o=""+r),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(a=t.ref);for(n in t)Py.call(t,n)&&!Iy.hasOwnProperty(n)&&(i[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)i[n]===void 0&&(i[n]=t[n]);return{$$typeof:L1,type:e,key:o,ref:a,props:i,_owner:Dy.current}}Wa.jsx=B1;Wa.jsxs=B1;(function(e){e.exports=Wa})(vy);const U1=ya.Fragment,K=ya.jsx,Se=ya.jsxs;var Jr={},by={get exports(){return Jr},set exports(e){Jr=e}},hr={},Vc={},ky={get exports(){return Vc},set exports(e){Vc=e}},H1={};/** @license React v0.20.2 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */(function(e){var t,r,n,i;if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var a=Date,s=a.now();e.unstable_now=function(){return a.now()-s}}if(typeof window>"u"||typeof MessageChannel!="function"){var l=null,u=null,c=function(){if(l!==null)try{var ee=e.unstable_now();l(!0,ee),l=null}catch(O){throw setTimeout(c,0),O}};t=function(ee){l!==null?setTimeout(t,0,ee):(l=ee,setTimeout(c,0))},r=function(ee,O){u=setTimeout(ee,O)},n=function(){clearTimeout(u)},e.unstable_shouldYield=function(){return!1},i=e.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,d=window.clearTimeout;if(typeof console<"u"){var h=window.cancelAnimationFrame;typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),typeof h!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var m=!1,p=null,g=-1,x=5,w=0;e.unstable_shouldYield=function(){return e.unstable_now()>=w},i=function(){},e.unstable_forceFrameRate=function(ee){0>ee||125<ee?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):x=0<ee?Math.floor(1e3/ee):5};var y=new MessageChannel,_=y.port2;y.port1.onmessage=function(){if(p!==null){var ee=e.unstable_now();w=ee+x;try{p(!0,ee)?_.postMessage(null):(m=!1,p=null)}catch(O){throw _.postMessage(null),O}}else m=!1},t=function(ee){p=ee,m||(m=!0,_.postMessage(null))},r=function(ee,O){g=f(function(){ee(e.unstable_now())},O)},n=function(){d(g),g=-1}}function N(ee,O){var k=ee.length;ee.push(O);e:for(;;){var b=k-1>>>1,D=ee[b];if(D!==void 0&&0<C(D,O))ee[b]=O,ee[k]=D,k=b;else break e}}function M(ee){return ee=ee[0],ee===void 0?null:ee}function S(ee){var O=ee[0];if(O!==void 0){var k=ee.pop();if(k!==O){ee[0]=k;e:for(var b=0,D=ee.length;b<D;){var H=2*(b+1)-1,G=ee[H],J=H+1,W=ee[J];if(G!==void 0&&0>C(G,k))W!==void 0&&0>C(W,G)?(ee[b]=W,ee[J]=k,b=J):(ee[b]=G,ee[H]=k,b=H);else if(W!==void 0&&0>C(W,k))ee[b]=W,ee[J]=k,b=J;else break e}}return O}return null}function C(ee,O){var k=ee.sortIndex-O.sortIndex;return k!==0?k:ee.id-O.id}var A=[],L=[],U=1,B=null,V=3,Q=!1,ne=!1,ye=!1;function ve(ee){for(var O=M(L);O!==null;){if(O.callback===null)S(L);else if(O.startTime<=ee)S(L),O.sortIndex=O.expirationTime,N(A,O);else break;O=M(L)}}function Te(ee){if(ye=!1,ve(ee),!ne)if(M(A)!==null)ne=!0,t(ie);else{var O=M(L);O!==null&&r(Te,O.startTime-ee)}}function ie(ee,O){ne=!1,ye&&(ye=!1,n()),Q=!0;var k=V;try{for(ve(O),B=M(A);B!==null&&(!(B.expirationTime>O)||ee&&!e.unstable_shouldYield());){var b=B.callback;if(typeof b=="function"){B.callback=null,V=B.priorityLevel;var D=b(B.expirationTime<=O);O=e.unstable_now(),typeof D=="function"?B.callback=D:B===M(A)&&S(A),ve(O)}else S(A);B=M(A)}if(B!==null)var H=!0;else{var G=M(L);G!==null&&r(Te,G.startTime-O),H=!1}return H}finally{B=null,V=k,Q=!1}}var Ee=i;e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(ee){ee.callback=null},e.unstable_continueExecution=function(){ne||Q||(ne=!0,t(ie))},e.unstable_getCurrentPriorityLevel=function(){return V},e.unstable_getFirstCallbackNode=function(){return M(A)},e.unstable_next=function(ee){switch(V){case 1:case 2:case 3:var O=3;break;default:O=V}var k=V;V=O;try{return ee()}finally{V=k}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=Ee,e.unstable_runWithPriority=function(ee,O){switch(ee){case 1:case 2:case 3:case 4:case 5:break;default:ee=3}var k=V;V=ee;try{return O()}finally{V=k}},e.unstable_scheduleCallback=function(ee,O,k){var b=e.unstable_now();switch(typeof k=="object"&&k!==null?(k=k.delay,k=typeof k=="number"&&0<k?b+k:b):k=b,ee){case 1:var D=-1;break;case 2:D=250;break;case 5:D=1073741823;break;case 4:D=1e4;break;default:D=5e3}return D=k+D,ee={id:U++,callback:O,priorityLevel:ee,startTime:k,expirationTime:D,sortIndex:-1},k>b?(ee.sortIndex=k,N(L,ee),M(A)===null&&ee===M(L)&&(ye?n():ye=!0,r(Te,k-b))):(ee.sortIndex=D,N(A,ee),ne||Q||(ne=!0,t(ie))),ee},e.unstable_wrapCallback=function(ee){var O=V;return function(){var k=V;V=O;try{return ee.apply(this,arguments)}finally{V=k}}}})(U1);(function(e){e.exports=U1})(Iy);/** @license React v17.0.2 + */(function(e){var t,r,n,i;if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var a=Date,s=a.now();e.unstable_now=function(){return a.now()-s}}if(typeof window>"u"||typeof MessageChannel!="function"){var l=null,u=null,c=function(){if(l!==null)try{var ee=e.unstable_now();l(!0,ee),l=null}catch(O){throw setTimeout(c,0),O}};t=function(ee){l!==null?setTimeout(t,0,ee):(l=ee,setTimeout(c,0))},r=function(ee,O){u=setTimeout(ee,O)},n=function(){clearTimeout(u)},e.unstable_shouldYield=function(){return!1},i=e.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,d=window.clearTimeout;if(typeof console<"u"){var h=window.cancelAnimationFrame;typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),typeof h!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var m=!1,p=null,g=-1,x=5,w=0;e.unstable_shouldYield=function(){return e.unstable_now()>=w},i=function(){},e.unstable_forceFrameRate=function(ee){0>ee||125<ee?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):x=0<ee?Math.floor(1e3/ee):5};var y=new MessageChannel,_=y.port2;y.port1.onmessage=function(){if(p!==null){var ee=e.unstable_now();w=ee+x;try{p(!0,ee)?_.postMessage(null):(m=!1,p=null)}catch(O){throw _.postMessage(null),O}}else m=!1},t=function(ee){p=ee,m||(m=!0,_.postMessage(null))},r=function(ee,O){g=f(function(){ee(e.unstable_now())},O)},n=function(){d(g),g=-1}}function N(ee,O){var k=ee.length;ee.push(O);e:for(;;){var b=k-1>>>1,D=ee[b];if(D!==void 0&&0<C(D,O))ee[b]=O,ee[k]=D,k=b;else break e}}function M(ee){return ee=ee[0],ee===void 0?null:ee}function S(ee){var O=ee[0];if(O!==void 0){var k=ee.pop();if(k!==O){ee[0]=k;e:for(var b=0,D=ee.length;b<D;){var H=2*(b+1)-1,G=ee[H],J=H+1,W=ee[J];if(G!==void 0&&0>C(G,k))W!==void 0&&0>C(W,G)?(ee[b]=W,ee[J]=k,b=J):(ee[b]=G,ee[H]=k,b=H);else if(W!==void 0&&0>C(W,k))ee[b]=W,ee[J]=k,b=J;else break e}}return O}return null}function C(ee,O){var k=ee.sortIndex-O.sortIndex;return k!==0?k:ee.id-O.id}var A=[],L=[],U=1,B=null,V=3,Q=!1,ne=!1,ye=!1;function ve(ee){for(var O=M(L);O!==null;){if(O.callback===null)S(L);else if(O.startTime<=ee)S(L),O.sortIndex=O.expirationTime,N(A,O);else break;O=M(L)}}function Ce(ee){if(ye=!1,ve(ee),!ne)if(M(A)!==null)ne=!0,t(ie);else{var O=M(L);O!==null&&r(Ce,O.startTime-ee)}}function ie(ee,O){ne=!1,ye&&(ye=!1,n()),Q=!0;var k=V;try{for(ve(O),B=M(A);B!==null&&(!(B.expirationTime>O)||ee&&!e.unstable_shouldYield());){var b=B.callback;if(typeof b=="function"){B.callback=null,V=B.priorityLevel;var D=b(B.expirationTime<=O);O=e.unstable_now(),typeof D=="function"?B.callback=D:B===M(A)&&S(A),ve(O)}else S(A);B=M(A)}if(B!==null)var H=!0;else{var G=M(L);G!==null&&r(Ce,G.startTime-O),H=!1}return H}finally{B=null,V=k,Q=!1}}var Ee=i;e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(ee){ee.callback=null},e.unstable_continueExecution=function(){ne||Q||(ne=!0,t(ie))},e.unstable_getCurrentPriorityLevel=function(){return V},e.unstable_getFirstCallbackNode=function(){return M(A)},e.unstable_next=function(ee){switch(V){case 1:case 2:case 3:var O=3;break;default:O=V}var k=V;V=O;try{return ee()}finally{V=k}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=Ee,e.unstable_runWithPriority=function(ee,O){switch(ee){case 1:case 2:case 3:case 4:case 5:break;default:ee=3}var k=V;V=ee;try{return O()}finally{V=k}},e.unstable_scheduleCallback=function(ee,O,k){var b=e.unstable_now();switch(typeof k=="object"&&k!==null?(k=k.delay,k=typeof k=="number"&&0<k?b+k:b):k=b,ee){case 1:var D=-1;break;case 2:D=250;break;case 5:D=1073741823;break;case 4:D=1e4;break;default:D=5e3}return D=k+D,ee={id:U++,callback:O,priorityLevel:ee,startTime:k,expirationTime:D,sortIndex:-1},k>b?(ee.sortIndex=k,N(L,ee),M(A)===null&&ee===M(L)&&(ye?n():ye=!0,r(Ce,k-b))):(ee.sortIndex=D,N(A,ee),ne||Q||(ne=!0,t(ie))),ee},e.unstable_wrapCallback=function(ee){var O=V;return function(){var k=V;V=O;try{return ee.apply(this,arguments)}finally{V=k}}}})(H1);(function(e){e.exports=H1})(ky);/** @license React v17.0.2 * react-dom.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Yl=v,Ke=S1,pt=Vc;function se(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r<arguments.length;r++)t+="&args[]="+encodeURIComponent(arguments[r]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!Yl)throw Error(se(227));var H1=new Set,Ea={};function ui(e,t){oo(e,t),oo(e+"Capture",t)}function oo(e,t){for(Ea[e]=t,e=0;e<t.length;e++)H1.add(t[e])}var en=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),by=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF |