summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTheodore Aptekarev <aptekarev@gmail.com>2024-05-21 14:51:00 +0200
committerGitHub <noreply@github.com>2024-05-21 14:51:00 +0200
commitc4de0a8f3656798d4884e4b92ae97639c1ce5bee (patch)
treee551d391fa9f7d277082ce12f1cbec9b41bc96e7
parent1994b34866eb621d92d6a88f75bcf9845d3dbce4 (diff)
Remove xlsx export from CLI's interactive tables (#6439)
* Remove excel export from cli interactive tables code * Remove vulnerable dependency * Remove posthog from interactive table html template * Incorporate additional styles to the index.css * Update the deploy command * Update the built static file and deploy script --------- Co-authored-by: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com>
-rw-r--r--frontend-components/plotly/package.json2
-rw-r--r--frontend-components/tables/index.html47
-rw-r--r--frontend-components/tables/package-lock.json95
-rw-r--r--frontend-components/tables/package.json3
-rw-r--r--frontend-components/tables/src/components/Table/Export.tsx3
-rw-r--r--frontend-components/tables/src/components/Table/index.tsx2
-rw-r--r--frontend-components/tables/src/index.css24
-rw-r--r--frontend-components/tables/src/utils/utils.ts17
-rw-r--r--openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html260
9 files changed, 69 insertions, 384 deletions
diff --git a/frontend-components/plotly/package.json b/frontend-components/plotly/package.json
index e53b657b8c5..88da60690fd 100644
--- a/frontend-components/plotly/package.json
+++ b/frontend-components/plotly/package.json
@@ -6,7 +6,7 @@
"dev": "vite",
"build": "vite build",
"build_tsc": "tsc && vite build",
- "deploy": "npm run build && mv dist/index.html ../../cli/openbb_cli/assets/interactive/plotly.html",
+ "deploy": "npm run build && mv dist/index.html ../../openbb_platform/obbject_extensions/charting/openbb_charting/core/plotly.html",
"preview": "vite preview"
},
"dependencies": {
diff --git a/frontend-components/tables/index.html b/frontend-components/tables/index.html
index 0649b65fc0b..a0d02f39ceb 100644
--- a/frontend-components/tables/index.html
+++ b/frontend-components/tables/index.html
@@ -5,53 +5,6 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>OpenBB Interactive Tables</title>
<script>
- if (window.json_data && JSON.parse(window.json_data)?.posthog?.collect_logs) {
- !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
- posthog.init("phc_vhssDAMod5qIplznQ75Kdgz4aB1qPFmeVmfEOZ4hkRw", {
- api_host: "https://app.posthog.com",
- autocapture: {
- css_selector_allowlist: [".ph-capture"],
- },
- capture_pageview: false,
- loaded: function (posthog) {
- if (window.json_data) {
- const data = JSON.parse(window.json_data);
-
- const log_id = data?.log_id || "";
- if (log_id != "" && log_id != "REPLACE_ME") {
- posthog.identify(log_id);
- }
-
- posthog.capture("table", {
- INFO: {
- command: data.command_location,
- title: data.title,
- python_version: data.python_version,
- pywry_version: data.pywry_version,
- terminal_version: data.terminal_version,
- },
- });
- }
- posthog.onFeatureFlags(function () {
- if (
- !posthog.isFeatureEnabled("record-pywry", { send_event: false })
- ) {
- posthog.stopSessionRecording();
- }
- if (
- !posthog.isFeatureEnabled("collect-logs-pywry", {
- send_event: false,
- })
- ) {
- posthog.opt_out_capturing();
- } else if (posthog.has_opted_out_capturing()) {
- posthog.opt_in_capturing();
- }
- });
- },
- });
- }
-
if (
// check if user had saved dark as their
// theme when accessing page before
diff --git a/frontend-components/tables/package-lock.json b/frontend-components/tables/package-lock.json
index 09ab7da95de..2eb53da6ca2 100644
--- a/frontend-components/tables/package-lock.json
+++ b/frontend-components/tables/package-lock.json
@@ -27,7 +27,6 @@
"react-plotly.js": "^2.6.0",
"react-table": "^7.8.0",
"react-virtual": "^2.10.4",
- "xlsx": "^0.18.5",
"xss": "^1.0.14"
},
"devDependencies": {
@@ -2020,14 +2019,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/adler-32": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
- "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/almost-equal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz",
@@ -2288,18 +2279,6 @@
"element-size": "^1.1.1"
}
},
- "node_modules/cfb": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
- "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
- "dependencies": {
- "adler-32": "~1.3.0",
- "crc-32": "~1.2.0"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -2367,14 +2346,6 @@
"node": ">=6"
}
},
- "node_modules/codepage": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
- "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/color-alpha": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz",
@@ -2485,17 +2456,6 @@
"resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz",
"integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA=="
},
- "node_modules/crc-32": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
- "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
- "bin": {
- "crc32": "bin/crc32.njs"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/css-font": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz",
@@ -3125,14 +3085,6 @@
"css-font": "^1.2.0"
}
},
- "node_modules/frac": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
- "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/fraction.js": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
@@ -4971,17 +4923,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/ssf": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
- "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
- "dependencies": {
- "frac": "~1.1.2"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/stack-trace": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz",
@@ -5511,22 +5452,6 @@
"get-canvas-context": "^1.0.1"
}
},
- "node_modules/wmf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
- "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/word": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
- "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
@@ -5548,26 +5473,6 @@
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
},
- "node_modules/xlsx": {
- "version": "0.18.5",
- "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz",
- "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
- "dependencies": {
- "adler-32": "~1.3.0",
- "cfb": "~1.2.1",
- "codepage": "~1.15.0",
- "crc-32": "~1.2.1",
- "ssf": "~0.11.2",
- "wmf": "~1.0.1",
- "word": "~0.3.0"
- },
- "bin": {
- "xlsx": "bin/xlsx.njs"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/xss": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz",
diff --git a/frontend-components/tables/package.json b/frontend-components/tables/package.json
index 7a00febd33d..96d0c9f7597 100644
--- a/frontend-components/tables/package.json
+++ b/frontend-components/tables/package.json
@@ -7,7 +7,7 @@
"dev": "vite",
"build": "vite build",
"build_tsc": "tsc && vite build",
- "deploy": "npm run build && mv dist/index.html ../../cli/openbb_cli/assets/interactive/table.html",
+ "deploy": "npm run build && mv dist/index.html ../../openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html",
"preview": "vite preview"
},
"dependencies": {
@@ -30,7 +30,6 @@
"react-plotly.js": "^2.6.0",
"react-table": "^7.8.0",
"react-virtual": "^2.10.4",
- "xlsx": "^0.18.5",
"xss": "^1.0.14"
},
"devDependencies": {
diff --git a/frontend-components/tables/src/components/Table/Export.tsx b/frontend-components/tables/src/components/Table/Export.tsx
index 5fbe97dca3e..c3084f0d84c 100644
--- a/frontend-components/tables/src/components/Table/Export.tsx
+++ b/frontend-components/tables/src/components/Table/Export.tsx
@@ -23,9 +23,6 @@ export default function Export({
case "csv":
downloadData("csv", columns, data, downloadFinished);
break;
- case "xlsx":
- downloadData("xlsx", columns, data, downloadFinished);
- break;
case "png":
downloadImage("table", downloadFinished);
break;
diff --git a/frontend-components/tables/src/components/Table/index.tsx b/frontend-components/tables/src/components/Table/index.tsx
index 8446893f1c8..e26b2361e09 100644
--- a/frontend-components/tables/src/components/Table/index.tsx
+++ b/frontend-components/tables/src/components/Table/index.tsx
@@ -112,7 +112,7 @@ function getCellWidth(row, column) {
}
}
-export const EXPORT_TYPES = ["csv", "xlsx", "png"];
+export const EXPORT_TYPES = ["csv", "png"];
export default function Table({
data,
columns,
diff --git a/frontend-components/tables/src/index.css b/frontend-components/tables/src/index.css
index 5c60db88159..eabb256040f 100644
--- a/frontend-components/tables/src/index.css
+++ b/frontend-components/tables/src/index.css
@@ -57,11 +57,10 @@ body {
font-family: "Fira Code", monospace;
}
-/*table tbody {
- display: block;
- max-height: 300px;
- overflow-y: scroll;
-}*/
+table {
+ width: 100%;
+ table-layout: auto;
+}
table thead,
table tfoot,
@@ -69,16 +68,22 @@ table tbody tr {
display: table;
width: 100%;
table-layout: fixed;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+th, td {
+ word-wrap: break-word;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
.resizer {
cursor: col-resize;
user-select: none;
touch-action: none;
-}
-
-tr {
- width: fit-content;
+ transition: opacity 0.2s ease-in-out;
}
.resizer.isResizing {
@@ -162,7 +167,6 @@ table thead th {
opacity: 1;
}
-
@keyframes spin {
0% {
transform: rotate(0deg);
diff --git a/frontend-components/tables/src/utils/utils.ts b/frontend-components/tables/src/utils/utils.ts
index 9ecc76d1bf4..42f8171e197 100644
--- a/frontend-components/tables/src/utils/utils.ts
+++ b/frontend-components/tables/src/utils/utils.ts
@@ -1,6 +1,6 @@
import { rankItem } from "@tanstack/match-sorter-utils";
import domtoimage from "dom-to-image";
-import { utils, writeFile } from "xlsx";
+
export function formatNumberNoMagnitude(value: number | string) {
if (typeof value === "string") {
@@ -224,7 +224,7 @@ export const saveToFile = (
};
export async function downloadData(
- type: "csv" | "xlsx",
+ type: "csv",
columns: any,
data: any,
downloadFinished: (changed: boolean) => void,
@@ -270,19 +270,6 @@ export async function downloadData(
return;
}
-
- const wb = utils.book_new();
- const ws = utils.aoa_to_sheet(csvData);
- utils.book_append_sheet(wb, ws, "Sheet1");
- await loadingOverlay("Saving XLSX");
- non_blocking(async function () {
- // @ts-ignore
- // timeout to allow loading overlay to show
- await new Promise((resolve) => setTimeout(resolve, 1500));
- writeFile(wb, `${window.title}.xlsx`);
- await loadingOverlay("", true);
- downloadFinished?.(true);
- }, 2)();
}
export async function downloadImage(
diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html b/openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html
index 3f1b2b40200..f7c7d048567 100644
--- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html
+++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/table.html
@@ -4,73 +4,7 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>OpenBB Interactive Tables</title>
- <style>
- table {
- width: 100%;
- table-layout: auto;
- }
-
- th {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- }
-
- td {
- word-break: break-all;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- </style>
-
<script>
- if (window.json_data && JSON.parse(window.json_data)?.posthog?.collect_logs) {
- !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
- posthog.init("posthog-key-placeholder", {
- api_host: "https://app.posthog.com",
- autocapture: {
- css_selector_allowlist: [".ph-capture"],
- },
- capture_pageview: false,
- loaded: function (posthog) {
- if (window.json_data) {
- const data = JSON.parse(window.json_data);
-
- const log_id = data?.log_id || "";
- if (log_id != "" && log_id != "REPLACE_ME") {
- posthog.identify(log_id);
- }
-
- posthog.capture("table", {
- INFO: {
- command: data.command_location,
- title: data.title,
- python_version: data.python_version,
- pywry_version: data.pywry_version,
- platform_version: data.platform_version,
- },
- });
- }
- posthog.onFeatureFlags(function () {
- if (
- !posthog.isFeatureEnabled("record-pywry", { send_event: false })
- ) {
- posthog.stopSessionRecording();
- }
- if (
- !posthog.isFeatureEnabled("collect-logs-pywry", {
- send_event: false,
- })
- ) {
- posthog.opt_out_capturing();
- } else if (posthog.has_opted_out_capturing()) {
- posthog.opt_in_capturing();
- }
- });
- },
- });
- }
-
if (
// check if user had saved dark as their
// theme when accessing page before
@@ -98,87 +32,87 @@
}
</script>
<script type="module" crossorigin>
-function $y(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 qa(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var I1={exports:{}},Qa={};/*
+function Zm(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!="string"&&!Array.isArray(r)){for(const o in r)if(o!=="default"&&!(o in e)){const i=Object.getOwnPropertyDescriptor(r,o);i&&Object.defineProperty(e,o,i.get?i:{enumerable:!0,get:()=>r[o]})}}}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 o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();function xo(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var jf={exports:{}},Eo={};/*
object-assign
(c) Sindre Sorhus
@license MIT
-*/var Ch=Object.getOwnPropertySymbols,Ny=Object.prototype.hasOwnProperty,My=Object.prototype.propertyIsEnumerable;function Ly(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function By(){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 b1=By()?Object.assign:function(e,t){for(var r,n=Ly(e),i,o=1;o<arguments.length;o++){r=Object(arguments[o]);for(var a in r)Ny.call(r,a)&&(n[a]=r[a]);if(Ch){i=Ch(r);for(var s=0;s<i.length;s++)My.call(r,i[s])&&(n[i[s]]=r[i[s]])}}return n},k1={exports:{}},be={};/** @license React v17.0.2
+*/var xc=Object.getOwnPropertySymbols,Jm=Object.prototype.hasOwnProperty,ev=Object.prototype.propertyIsEnumerable;function tv(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function nv(){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={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;var r=Object.getOwnPropertyNames(t).map(function(i){return t[i]});if(r.join("")!=="0123456789")return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach(function(i){o[i]=i}),Object.keys(Object.assign({},o)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}var Bf=nv()?Object.assign:function(e,t){for(var n,r=tv(e),o,i=1;i<arguments.length;i++){n=Object(arguments[i]);for(var l in n)Jm.call(n,l)&&(r[l]=n[l]);if(xc){o=xc(n);for(var s=0;s<o.length;s++)ev.call(n,o[s])&&(r[o[s]]=n[o[s]])}}return r},Wf={exports:{}},ae={};/** @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 E0=b1,Eo=60103,$1=60106;be.Fragment=60107;be.StrictMode=60108;be.Profiler=60114;var N1=60109,M1=60110,L1=60112;be.Suspense=60113;var B1=60115,U1=60116;if(typeof Symbol=="function"&&Symbol.for){var mr=Symbol.for;Eo=mr("react.element"),$1=mr("react.portal"),be.Fragment=mr("react.fragment"),be.StrictMode=mr("react.strict_mode"),be.Profiler=mr("react.profiler"),N1=mr("react.provider"),M1=mr("react.context"),L1=mr("react.forward_ref"),be.Suspense=mr("react.suspense"),B1=mr("react.memo"),U1=mr("react.lazy")}var Ah=typeof Symbol=="function"&&Symbol.iterator;function Uy(e){return e===null||typeof e!="object"?null:(e=Ah&&e[Ah]||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 H1={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},V1={};function _o(e,t,r){this.props=e,this.context=t,this.refs=V1,this.updater=r||H1}_o.prototype.isReactComponent={};_o.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")};_o.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function W1(){}W1.prototype=_o.prototype;function _0(e,t,r){this.props=e,this.context=t,this.refs=V1,this.updater=r||H1}var S0=_0.prototype=new W1;S0.constructor=_0;E0(S0,_o.prototype);S0.isPureReactComponent=!0;var T0={current:null},z1=Object.prototype.hasOwnProperty,G1={key:!0,ref:!0,__self:!0,__source:!0};function j1(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)z1.call(t,n)&&!G1.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:Eo,type:e,key:o,ref:a,props:i,_owner:T0.current}}function Hy(e,t){return{$$typeof:Eo,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function C0(e){return typeof e=="object"&&e!==null&&e.$$typeof===Eo}function Vy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(r){return t[r]})}var Rh=/\/+/g;function qu(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Vy(""+e.key):t.toString(36)}function Ks(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 Eo:case $1:a=!0}}if(a)return a=e,i=i(a),e=n===""?"."+qu(a,0):n,Array.isArray(i)?(r="",e!=null&&(r=e.replace(Rh,"$&/")+"/"),Ks(i,t,r,"",function(u){return u})):i!=null&&(C0(i)&&(i=Hy(i,r+(!i.key||a&&a.key===i.key?"":(""+i.key).replace(Rh,"$&/")+"/")+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+qu(o,s);a+=Ks(o,t,r,l,i)}else if(l=Uy(e),typeof l=="function")for(e=l.call(e),s=0;!(o=e.next()).done;)o=o.value,l=n+qu(o,s++),a+=Ks(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 ds(e,t,r){if(e==null)return e;var n=[],i=0;return Ks(e,n,"","",function(o){return t.call(r,o,i++)}),n}function Wy(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 X1={current:null};function sn(){var e=X1.current;if(e===null)throw Error(Za(321));return e}var zy={ReactCurrentDispatcher:X1,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:T0,IsSomeRendererActing:{current:!1},assign:E0};be.Children={map:ds,forEach:function(e,t,r){ds(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return ds(e,function(){t++}),t},toArray:function(e){return ds(e,function(t){return t})||[]},only:function(e){if(!C0(e))throw Error(Za(143));return e}};be.Component=_o;be.PureComponent=_0;be.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=zy;be.cloneElement=function(e,t,r){if(e==null)throw Error(Za(267,e));var n=E0({},e.props),i=e.key,o=e.ref,a=e._owner;if(t!=null){if(t.ref!==void 0&&(o=t.ref,a=T0.current),t.key!==void 0&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(l in t)z1.call(t,l)&&!G1.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:Eo,type:e.type,key:i,ref:o,props:n,_owner:a}};be.createContext=function(e,t){return t===void 0&&(t=null),e={$$typeof:M1,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider={$$typeof:N1,_context:e},e.Consumer=e};be.createElement=j1;be.createFactory=function(e){var t=j1.bind(null,e);return t.type=e,t};be.createRef=function(){return{current:null}};be.forwardRef=function(e){return{$$typeof:L1,render:e}};be.isValidElement=C0;be.lazy=function(e){return{$$typeof:U1,_payload:{_status:-1,_result:e},_init:Wy}};be.memo=function(e,t){return{$$typeof:B1,type:e,compare:t===void 0?null:t}};be.useCallback=function(e,t){return sn().useCallback(e,t)};be.useContext=function(e,t){return sn().useContext(e,t)};be.useDebugValue=function(){};be.useEffect=function(e,t){return sn().useEffect(e,t)};be.useImperativeHandle=function(e,t,r){return sn().useImperativeHandle(e,t,r)};be.useLayoutEffect=function(e,t){return sn().useLayoutEffect(e,t)};be.useMemo=function(e,t){return sn().useMemo(e,t)};be.useReducer=function(e,t,r){return sn().useReducer(e,t,r)};be.useRef=function(e){return sn().useRef(e)};be.useState=function(e){return sn().useState(e)};be.version="17.0.2";k1.exports=be;var x=k1.exports;const or=qa(x),Gy=$y({__proto__:null,default:or},[x]);/** @license React v17.0.2
+ */var Ga=Bf,pr=60103,Gf=60106;ae.Fragment=60107;ae.StrictMode=60108;ae.Profiler=60114;var Kf=60109,Xf=60110,Yf=60112;ae.Suspense=60113;var qf=60115,Qf=60116;if(typeof Symbol=="function"&&Symbol.for){var nt=Symbol.for;pr=nt("react.element"),Gf=nt("react.portal"),ae.Fragment=nt("react.fragment"),ae.StrictMode=nt("react.strict_mode"),ae.Profiler=nt("react.profiler"),Kf=nt("react.provider"),Xf=nt("react.context"),Yf=nt("react.forward_ref"),ae.Suspense=nt("react.suspense"),qf=nt("react.memo"),Qf=nt("react.lazy")}var Ec=typeof Symbol=="function"&&Symbol.iterator;function rv(e){return e===null||typeof e!="object"?null:(e=Ec&&e[Ec]||e["@@iterator"],typeof e=="function"?e:null)}function $o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);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 Zf={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Jf={};function gr(e,t,n){this.props=e,this.context=t,this.refs=Jf,this.updater=n||Zf}gr.prototype.isReactComponent={};gr.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error($o(85));this.updater.enqueueSetState(this,e,t,"setState")};gr.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function ep(){}ep.prototype=gr.prototype;function Ka(e,t,n){this.props=e,this.context=t,this.refs=Jf,this.updater=n||Zf}var Xa=Ka.prototype=new ep;Xa.constructor=Ka;Ga(Xa,gr.prototype);Xa.isPureReactComponent=!0;var Ya={current:null},tp=Object.prototype.hasOwnProperty,np={key:!0,ref:!0,__self:!0,__source:!0};function rp(e,t,n){var r,o={},i=null,l=null;if(t!=null)for(r in t.ref!==void 0&&(l=t.ref),t.key!==void 0&&(i=""+t.key),t)tp.call(t,r)&&!np.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(s===1)o.children=n;else if(1<s){for(var a=Array(s),u=0;u<s;u++)a[u]=arguments[u+2];o.children=a}if(e&&e.defaultProps)for(r in s=e.defaultProps,s)o[r]===void 0&&(o[r]=s[r]);return{$$typeof:pr,type:e,key:i,ref:l,props:o,_owner:Ya.current}}function ov(e,t){return{$$typeof:pr,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function qa(e){return typeof e=="object"&&e!==null&&e.$$typeof===pr}function iv(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(n){return t[n]})}var $c=/\/+/g;function Nl(e,t){return typeof e=="object"&&e!==null&&e.key!=