aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tomvanderlee@users.noreply.github.com>2024-08-30 15:47:20 +0200
committerGravatar GitHub <noreply@github.com>2024-08-30 15:47:20 +0200
commitfe61544bafafc8b4de78cc71cb641af2dfb7b72d (patch)
tree7edff48c1638fcc26915dc1f40982ec2563cf3bf
parentf183536067dc694f37445148c15821f1621f5034 (diff)
parent2f2048160fac06e94703bb03eea43185fc01f76c (diff)
downloadclient-2.1.0.tar.gz
client-2.1.0.tar.bz2
client-2.1.0.zip
Merge pull request #15 from tomvanderlee/feature/websocketsv2.1.0
Feature/websockets
-rw-r--r--.github/workflows/python-publish.yml6
-rw-r--r--src/components/App/App.tsx40
-rw-r--r--src/components/Frames/Frames.module.scss9
-rw-r--r--src/components/Frames/Frames.tsx75
-rw-r--r--src/components/Icons/Sliders.tsx2
-rw-r--r--src/components/Icons/Trash.tsx2
-rw-r--r--src/components/RequestDetails/RequestDetails.tsx82
-rw-r--r--src/components/RequestList/RequestList.tsx48
-rw-r--r--src/components/RequestSummary/RequestSummary.tsx2
-rw-r--r--src/contexts/Connection.tsx288
-rw-r--r--src/contexts/DarkMode.tsx7
-rw-r--r--src/hooks/useRequests.tsx253
-rw-r--r--src/index.tsx5
-rw-r--r--src/types.ts136
-rw-r--r--ttun/__main__.py11
-rw-r--r--ttun/client.py214
-rw-r--r--ttun/inspect_server.py5
-rw-r--r--ttun/pubsub.py1
-rw-r--r--ttun/types.py60
-rw-r--r--yarn.lock1006
20 files changed, 1510 insertions, 742 deletions
diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml
index 9246d7e..d90abfb 100644
--- a/.github/workflows/python-publish.yml
+++ b/.github/workflows/python-publish.yml
@@ -12,13 +12,13 @@ jobs:
12 deploy: 12 deploy:
13 runs-on: ubuntu-latest 13 runs-on: ubuntu-latest
14 steps: 14 steps:
15 - uses: actions/checkout@v2 15 - uses: actions/checkout@v4
16 - name: Set up Python 16 - name: Set up Python
17 uses: actions/setup-python@v2 17 uses: actions/setup-python@v5
18 with: 18 with:
19 python-version: '3.10' 19 python-version: '3.10'
20 - name: Set up Node 20 - name: Set up Node
21 uses: actions/setup-node@v2 21 uses: actions/setup-node@v4
22 with: 22 with:
23 node-version: '16' 23 node-version: '16'
24 - name: Install node dependencies 24 - name: Install node dependencies
diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx
index b1a4501..ad36add 100644
--- a/src/components/App/App.tsx
+++ b/src/components/App/App.tsx
@@ -1,6 +1,6 @@
1import * as React from "react"; 1import * as React from "react";
2import { ReactElement, useContext, useEffect, useMemo, useState } from "react"; 2import { ReactElement, useContext, useEffect, useMemo, useState } from "react";
3import useRequests, { ReadyState, RequestResponse } from "~/hooks/useRequests"; 3import useRequests from "~/hooks/useRequests";
4 4
5import styles from "~/components/App/App.module.scss"; 5import styles from "~/components/App/App.module.scss";
6import RequestDetails from "~/components/RequestDetails/RequestDetails"; 6import RequestDetails from "~/components/RequestDetails/RequestDetails";
@@ -13,6 +13,8 @@ import Moon from "~/components/Icons/Moon";
13import Trash from "~/components/Icons/Trash"; 13import Trash from "~/components/Icons/Trash";
14import { DarkModeContext } from "~/contexts/DarkMode"; 14import { DarkModeContext } from "~/contexts/DarkMode";
15import RequestList from "~/components/RequestList/RequestList"; 15import RequestList from "~/components/RequestList/RequestList";
16import { Call, ReadyState } from "~/types";
17import { ConnectionContext } from "~/contexts/Connection";
16 18
17interface Config { 19interface Config {
18 url: string; 20 url: string;
@@ -47,29 +49,14 @@ const statusTextMap: ReadyStateMap = {
47 49
48export default function App() { 50export default function App() {
49 const { darkMode, toggle } = useContext(DarkModeContext); 51 const { darkMode, toggle } = useContext(DarkModeContext);
50 const [config, setConfig] = useState<Config | null>(null); 52 const { config, selectedCall, setSelectedCall, readyState, clear } =
51 53 useContext(ConnectionContext);
52 const { calls, readyState, clear } = useRequests({
53 onConnect: async () => {
54 const response = await fetch(`http://${getHost()}/config/`);
55 const config = await response.json();
56 setConfig(config);
57 },
58 });
59 54
60 useEffect(() => { 55 useEffect(() => {
61 const url = new URL(config?.url ?? "https://loading..."); 56 const url = new URL(config?.url ?? "https://loading...");
62 document.title = `${statusIconMap[readyState]} ${url.host} | TTUN`; 57 document.title = `${statusIconMap[readyState]} ${url.host} | TTUN`;
63 }, [readyState, config?.url]); 58 }, [readyState, config?.url]);
64 59
65 const [selectedRequestIndex, setSelectedRequestIndex] = useState<
66 number | null
67 >(null);
68 const selectedRequest = useMemo<RequestResponse | null>(
69 () => (selectedRequestIndex === null ? null : calls[selectedRequestIndex]),
70 [selectedRequestIndex, calls]
71 );
72
73 const settingsMenu: (SettingsMenu | null)[] = [ 60 const settingsMenu: (SettingsMenu | null)[] = [
74 { 61 {
75 onClick: toggle, 62 onClick: toggle,
@@ -79,7 +66,7 @@ export default function App() {
79 null, 66 null,
80 { 67 {
81 onClick: () => { 68 onClick: () => {
82 setSelectedRequestIndex(null); 69 setSelectedCall(null);
83 clear(); 70 clear();
84 }, 71 },
85 icon: <Trash />, 72 icon: <Trash />,
@@ -105,14 +92,15 @@ export default function App() {
105 </a> 92 </a>
106 </Navbar.Text> 93 </Navbar.Text>
107 <Navbar.Toggle aria-controls="settings" /> 94 <Navbar.Toggle aria-controls="settings" />
108 <Navbar.Collapse id="settings" className="ms-2"> 95 <Navbar.Collapse id="settings" className="ms-2" role="button">
109 <Nav> 96 <Nav>
110 <NavDropdown align="end" title={<Sliders />}> 97 <NavDropdown align="end" title={<Sliders />}>
111 {settingsMenu.map((item) => { 98 {settingsMenu.map((item, index) => {
112 if (item !== null) { 99 if (item !== null) {
113 const { onClick, icon, label } = item; 100 const { onClick, icon, label } = item;
114 return ( 101 return (
115 <NavDropdown.Item 102 <NavDropdown.Item
103 key={label}
116 onClick={onClick} 104 onClick={onClick}
117 className="d-flex align-items-center" 105 className="d-flex align-items-center"
118 > 106 >
@@ -121,7 +109,7 @@ export default function App() {
121 </NavDropdown.Item> 109 </NavDropdown.Item>
122 ); 110 );
123 } else { 111 } else {
124 return <NavDropdown.Divider />; 112 return <NavDropdown.Divider key={`item-${index}`} />;
125 } 113 }
126 })} 114 })}
127 </NavDropdown> 115 </NavDropdown>
@@ -133,14 +121,10 @@ export default function App() {
133 121
134 <main className={styles.main}> 122 <main className={styles.main}>
135 <div className={classNames("border-end", styles.sidebar)}> 123 <div className={classNames("border-end", styles.sidebar)}>
136 <RequestList 124 <RequestList />
137 requests={calls}
138 selectedRequestIndex={selectedRequestIndex}
139 setSelectedRequestIndex={setSelectedRequestIndex}
140 />
141 </div> 125 </div>
142 <div className={styles.details}> 126 <div className={styles.details}>
143 <RequestDetails requestResponse={selectedRequest} /> 127 <RequestDetails />
144 </div> 128 </div>
145 </main> 129 </main>
146 </div> 130 </div>
diff --git a/src/components/Frames/Frames.module.scss b/src/components/Frames/Frames.module.scss
new file mode 100644
index 0000000..821f0b8
--- /dev/null
+++ b/src/components/Frames/Frames.module.scss
@@ -0,0 +1,9 @@
1.arrow {
2 &.outbound {
3 color: green;
4 }
5
6 &.inbound {
7 color: red;
8 }
9}
diff --git a/src/components/Frames/Frames.tsx b/src/components/Frames/Frames.tsx
new file mode 100644
index 0000000..83c4c96
--- /dev/null
+++ b/src/components/Frames/Frames.tsx
@@ -0,0 +1,75 @@
1import { Frame } from "~/types";
2import React, { PropsWithChildren, useContext } from "react";
3import { Col, ListGroup, Row } from "react-bootstrap";
4import classNames from "classnames";
5import styles from "./Frames.module.scss";
6import dayjs from "dayjs";
7import ReactJson from "react-json-view";
8import { DarkModeContext } from "~/contexts/DarkMode";
9
10function isJson(data: any): boolean {
11 try {
12 JSON.parse(data);
13 return true;
14 } catch {
15 return false;
16 }
17}
18
19interface FramesProps {
20 frames: Frame[];
21}
22
23export default function Frames({
24 frames,
25}: PropsWithChildren<FramesProps>): JSX.Element {
26 const { darkMode } = useContext(DarkModeContext);
27 return (
28 <ListGroup variant="flush" as="ul" className={"flex-grow-1"}>
29 {frames.length > 0 ? (
30 frames.map((frame) => {
31 // Inbound relative to the client
32 const inbound = frame.type !== "websocket_inbound";
33
34 const body =
35 frame.type !== "websocket_disconnect"
36 ? atob(frame.payload.body)
37 : null;
38
39 return (
40 <ListGroup.Item
41 as="li"
42 key={frame.payload.id}
43 className={classNames({
44 "border-bottom": true,
45 })}
46 >
47 <Row>
48 <Col className="flex-grow-0 d-flex align-items-center text-nowrap text-muted">
49 {dayjs(frame.payload?.timestamp).format("HH:mm:ss.SSS")}
50 </Col>
51 <Col
52 className={classNames(
53 styles.arrow,
54 "flex-grow-0 d-flex align-items-center flex-nowrap",
55 {
56 [styles.inbound]: inbound,
57 [styles.outbound]: !inbound,
58 }
59 )}
60 >
61 {inbound ? "â–¼" : "â–²"}
62 </Col>
63 <Col className="flex-grow-1">{body}</Col>
64 </Row>
65 </ListGroup.Item>
66 );
67 })
68 ) : (
69 <div className={styles.noRequest}>
70 <p>No messages</p>
71 </div>
72 )}
73 </ListGroup>
74 );
75}
diff --git a/src/components/Icons/Sliders.tsx b/src/components/Icons/Sliders.tsx
index 66d6fac..3c9b38b 100644
--- a/src/components/Icons/Sliders.tsx
+++ b/src/components/Icons/Sliders.tsx
@@ -11,7 +11,7 @@ export default function Sliders() {
11 viewBox="0 0 16 16" 11 viewBox="0 0 16 16"
12 > 12 >
13 <path 13 <path
14 fill-rule="evenodd" 14 fillRule="evenodd"
15 d="M11.5 2a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zM9.05 3a2.5 2.5 0 0 1 4.9 0H16v1h-2.05a2.5 2.5 0 0 1-4.9 0H0V3h9.05zM4.5 7a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zM2.05 8a2.5 2.5 0 0 1 4.9 0H16v1H6.95a2.5 2.5 0 0 1-4.9 0H0V8h2.05zm9.45 4a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zm-2.45 1a2.5 2.5 0 0 1 4.9 0H16v1h-2.05a2.5 2.5 0 0 1-4.9 0H0v-1h9.05z" 15 d="M11.5 2a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zM9.05 3a2.5 2.5 0 0 1 4.9 0H16v1h-2.05a2.5 2.5 0 0 1-4.9 0H0V3h9.05zM4.5 7a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zM2.05 8a2.5 2.5 0 0 1 4.9 0H16v1H6.95a2.5 2.5 0 0 1-4.9 0H0V8h2.05zm9.45 4a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zm-2.45 1a2.5 2.5 0 0 1 4.9 0H16v1h-2.05a2.5 2.5 0 0 1-4.9 0H0v-1h9.05z"
16 /> 16 />
17 </svg> 17 </svg>
diff --git a/src/components/Icons/Trash.tsx b/src/components/Icons/Trash.tsx
index 6c0039b..cf03546 100644
--- a/src/components/Icons/Trash.tsx
+++ b/src/components/Icons/Trash.tsx
@@ -12,7 +12,7 @@ export default function Trash() {
12 > 12 >
13 <path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z" /> 13 <path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z" />
14 <path 14 <path
15 fill-rule="evenodd" 15 fillRule="evenodd"
16 d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z" 16 d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z"
17 /> 17 />
18 </svg> 18 </svg>
diff --git a/src/components/RequestDetails/RequestDetails.tsx b/src/components/RequestDetails/RequestDetails.tsx
index f34ef6f..22b3fe2 100644
--- a/src/components/RequestDetails/RequestDetails.tsx
+++ b/src/components/RequestDetails/RequestDetails.tsx
@@ -1,11 +1,13 @@
1import * as React from "react"; 1import * as React from "react";
2import { useCallback, useMemo, useState } from "react"; 2import { useCallback, useContext, useMemo, useState } from "react";
3import { Headers, RequestResponse } from "~/hooks/useRequests";
4import styles from "~/components/RequestDetails/RequestDetails.module.scss"; 3import styles from "~/components/RequestDetails/RequestDetails.module.scss";
5import RequestSummary from "~/components/RequestSummary/RequestSummary"; 4import RequestSummary from "~/components/RequestSummary/RequestSummary";
6import Content from "~/components/Content/Content"; 5import Content from "~/components/Content/Content";
7import { getHost } from "~/utils"; 6import { getHost } from "~/utils";
8import { Button, Card, Col, Container, Nav, Row, Table } from "react-bootstrap"; 7import { Button, Card, Col, Container, Nav, Row, Table } from "react-bootstrap";
8import { Call, Headers, selectedCall } from "~/types";
9import { ConnectionContext } from "~/contexts/Connection";
10import Frames from "~/components/Frames/Frames";
9 11
10interface TimingProps { 12interface TimingProps {
11 timing: number; 13 timing: number;
@@ -49,37 +51,35 @@ function HeaderTable({ title, headers }: HeaderTableProps) {
49 ); 51 );
50} 52}
51 53
52interface DetailsProps { 54type Tab = "headers" | "request" | "response" | "messages";
53 requestResponse: RequestResponse | null;
54}
55 55
56type Tab = "headers" | "request" | "response"; 56export default function RequestDetails() {
57 const { selectedCall } = useContext(ConnectionContext);
57 58
58export default function RequestDetails({ requestResponse }: DetailsProps) {
59 const [tab, selectTab] = useState<Tab>("headers"); 59 const [tab, selectTab] = useState<Tab>("headers");
60 const [raw, setRaw] = useState(false); 60 const [raw, setRaw] = useState(false);
61 61
62 const resend = useCallback( 62 const resend = useCallback(
63 async () => 63 async () =>
64 requestResponse !== null && 64 selectedCall !== null &&
65 fetch(`http://${getHost()}/resend/`, { 65 fetch(`http://${getHost()}/resend/`, {
66 method: "POST", 66 method: "POST",
67 body: JSON.stringify({ 67 body: JSON.stringify({
68 ...requestResponse.request, 68 ...selectedCall.request,
69 id: undefined, 69 id: undefined,
70 }), 70 }),
71 }), 71 }),
72 [requestResponse] 72 [selectedCall]
73 ); 73 );
74 74
75 return requestResponse !== null ? ( 75 return selectedCall !== null ? (
76 <div className={styles.details}> 76 <div className={styles.details}>
77 <div className={styles.header}> 77 <div className={styles.header}>
78 <Row> 78 <Row>
79 <Col> 79 <Col>
80 <Container fluid style={{ fontSize: "1.5em" }} className="py-3"> 80 <Container fluid style={{ fontSize: "1.5em" }} className="py-3">
81 <RequestSummary 81 <RequestSummary
82 requestResponse={requestResponse} 82 requestResponse={selectedCall}
83 className={styles.summary} 83 className={styles.summary}
84 /> 84 />
85 </Container> 85 </Container>
@@ -98,18 +98,29 @@ export default function RequestDetails({ requestResponse }: DetailsProps) {
98 <Nav.Item> 98 <Nav.Item>
99 <Nav.Link eventKey="request">Request</Nav.Link> 99 <Nav.Link eventKey="request">Request</Nav.Link>
100 </Nav.Item> 100 </Nav.Item>
101 <Nav.Item> 101 {selectedCall.type === "RequestResponse" && (
102 <Nav.Link 102 <>
103 eventKey="response" 103 <Nav.Item>
104 disabled={requestResponse.response === undefined} 104 <Nav.Link
105 > 105 eventKey="response"
106 Response 106 disabled={selectedCall.response === undefined}
107 </Nav.Link> 107 >
108 </Nav.Item> 108 Response
109 </Nav.Link>
110 </Nav.Item>
111 </>
112 )}
113 {selectedCall.type === "WebsocketConnection" && (
114 <>
115 <Nav.Item>
116 <Nav.Link eventKey="response">Messages</Nav.Link>
117 </Nav.Item>
118 </>
119 )}
109 </Nav> 120 </Nav>
110 </Col> 121 </Col>
111 <Col className="border-bottom px-3 " xs="auto"> 122 <Col className="border-bottom px-3 " xs="auto">
112 <Timing timing={requestResponse.response?.timing ?? NaN} /> 123 <Timing timing={selectedCall.response?.timing ?? NaN} />
113 <Button 124 <Button
114 variant="outline-primary" 125 variant="outline-primary"
115 onClick={() => resend()} 126 onClick={() => resend()}
@@ -125,21 +136,30 @@ export default function RequestDetails({ requestResponse }: DetailsProps) {
125 <> 136 <>
126 <HeaderTable 137 <HeaderTable
127 title="request headers" 138 title="request headers"
128 headers={requestResponse.request.headers} 139 headers={selectedCall.request.headers}
129 /> 140 />
130 {requestResponse.response && ( 141
131 <HeaderTable 142 {selectedCall.type === "RequestResponse" &&
132 title="response headers" 143 selectedCall.response !== undefined && (
133 headers={requestResponse.response.headers} 144 <HeaderTable
134 /> 145 title="response headers"
135 )} 146 headers={selectedCall.response.headers}
147 />
148 )}
136 </> 149 </>
137 )} 150 )}
138 {tab === "request" && ( 151 {tab === "request" && (
139 <Content data={requestResponse.request} raw={raw} setRaw={setRaw} /> 152 <Content data={selectedCall.request} raw={raw} setRaw={setRaw} />
140 )} 153 )}
141 {tab === "response" && requestResponse.response !== undefined && ( 154 {selectedCall.type === "RequestResponse" &&
142 <Content data={requestResponse.response} raw={raw} setRaw={setRaw} /> 155 tab === "response" &&
156 selectedCall.response !== undefined && (
157 <Content data={selectedCall.response} raw={raw} setRaw={setRaw} />
158 )}
159 {selectedCall.type === "WebsocketConnection" && tab === "response" && (
160 <Frames frames={selectedCall.frames} />
161 // <Content data={selectedCall.frames} raw={false} setRaw={setRaw} />
162 // <pre>{JSON.stringify(selectedCall.frames, undefined, 2)}</pre>
143 )} 163 )}
144 </div> 164 </div>
145 </div> 165 </div>
diff --git a/src/components/RequestList/RequestList.tsx b/src/components/RequestList/RequestList.tsx
index acef47a..82a6b21 100644
--- a/src/components/RequestList/RequestList.tsx
+++ b/src/components/RequestList/RequestList.tsx
@@ -11,27 +11,24 @@ import classNames from "classnames";
11import styles from "~/components/RequestList/RequestList.module.scss"; 11import styles from "~/components/RequestList/RequestList.module.scss";
12import RequestSummary from "~/components/RequestSummary/RequestSummary"; 12import RequestSummary from "~/components/RequestSummary/RequestSummary";
13import * as React from "react"; 13import * as React from "react";
14import { useCallback, useContext, useMemo, useState } from "react"; 14import { useCallback, useContext, useEffect, useMemo, useState } from "react";
15import { Method, RequestResponse } from "~/hooks/useRequests";
16import { DarkModeContext } from "~/contexts/DarkMode"; 15import { DarkModeContext } from "~/contexts/DarkMode";
17import Filter from "~/components/Icons/Filter"; 16import Filter from "~/components/Icons/Filter";
18 17import { Call, Method } from "~/types";
19interface ListProps { 18import { ConnectionContext } from "~/contexts/Connection";
20 requests: RequestResponse[];
21 selectedRequestIndex: number | null;
22 setSelectedRequestIndex: (index: number) => void;
23}
24 19
25type EnabledMethods = { 20type EnabledMethods = {
26 [method in Method]: boolean; 21 [method in Method]: boolean;
27}; 22};
28 23
29export default function RequestList({ 24export default function RequestList() {
30 requests,
31 selectedRequestIndex,
32 setSelectedRequestIndex,
33}: ListProps) {
34 const { darkMode } = useContext(DarkModeContext); 25 const { darkMode } = useContext(DarkModeContext);
26 const {
27 calls: requests,
28 selectedCall,
29 setSelectedCall,
30 } = useContext(ConnectionContext);
31
35 const [showFilterOptions, setShowFilterOptions] = useState(false); 32 const [showFilterOptions, setShowFilterOptions] = useState(false);
36 const [search, setSearch] = useState(""); 33 const [search, setSearch] = useState("");
37 const [enableRegex, setEnableRegex] = useState(false); 34 const [enableRegex, setEnableRegex] = useState(false);
@@ -73,7 +70,7 @@ export default function RequestList({
73 () => 70 () =>
74 Object.entries(methods) 71 Object.entries(methods)
75 .filter(([method, enabled]) => enabled) 72 .filter(([method, enabled]) => enabled)
76 .map(([method]) => method), 73 .map(([method]) => method) as Method[],
77 [methods] 74 [methods]
78 ); 75 );
79 76
@@ -97,16 +94,14 @@ export default function RequestList({
97 } catch {} 94 } catch {}
98 95
99 return requests 96 return requests
100 .map<[number, RequestResponse]>((request, index) => [index, request])
101 .reverse() 97 .reverse()
102 .filter( 98 .filter(
103 ([index, request]) => 99 (request) =>
104 enabledMethods.length > 0 === null || 100 enabledMethods.length === 0 ||
105 enabledMethods.includes(request.request.method) 101 enabledMethods.includes(request.request.method)
106 ) 102 )
107 .filter( 103 .filter(
108 ([index, request]) => 104 (request) => search === "" || searchRegex.test(request.request.path)
109 search === "" || searchRegex.test(request.request.path)
110 ); 105 );
111 }, [requests, search, enabledMethods, enableRegex]); 106 }, [requests, search, enabledMethods, enableRegex]);
112 107
@@ -124,7 +119,10 @@ export default function RequestList({
124 </Dropdown.Item> 119 </Dropdown.Item>
125 <Dropdown.Divider /> 120 <Dropdown.Divider />
126 {Object.entries(methods).map(([method, enabled]) => ( 121 {Object.entries(methods).map(([method, enabled]) => (
127 <Dropdown.Item onClick={() => toggleMethods(method as Method)}> 122 <Dropdown.Item
123 onClick={() => toggleMethods(method as Method)}
124 key={method}
125 >
128 {method} 126 {method}
129 </Dropdown.Item> 127 </Dropdown.Item>
130 ))} 128 ))}
@@ -151,13 +149,14 @@ export default function RequestList({
151 className={classNames(styles.list, "flex-grow-1")} 149 className={classNames(styles.list, "flex-grow-1")}
152 > 150 >
153 {filteredRequests.length > 0 ? ( 151 {filteredRequests.length > 0 ? (
154 filteredRequests.map(([index, requestResponse]) => { 152 filteredRequests.map((requestResponse) => {
155 const selected = selectedRequestIndex === index; 153 const selected =
154 selectedCall?.request.id === requestResponse.request.id;
156 return ( 155 return (
157 <ListGroup.Item 156 <ListGroup.Item
158 as="li" 157 as="li"
159 onClick={() => setSelectedRequestIndex(index)} 158 onClick={() => setSelectedCall?.(requestResponse)}
160 key={`request-${index}`} 159 key={requestResponse.request.id}
161 className={classNames({ 160 className={classNames({
162 "bg-primary": selected, 161 "bg-primary": selected,
163 "text-light": selected, 162 "text-light": selected,
@@ -209,6 +208,7 @@ export default function RequestList({
209 <Form.Label className="fw-bold">Method</Form.Label> 208 <Form.Label className="fw-bold">Method</Form.Label>
210 {Object.entries(methods).map(([method, enabled]) => ( 209 {Object.entries(methods).map(([method, enabled]) => (
211 <Form.Check 210 <Form.Check
211 key={method}
212 type="switch" 212 type="switch"
213 label={method} 213 label={method}
214 checked={enabled} 214 checked={enabled}
diff --git a/src/components/RequestSummary/RequestSummary.tsx b/src/components/RequestSummary/RequestSummary.tsx
index 49e6086..4e97676 100644
--- a/src/components/RequestSummary/RequestSummary.tsx
+++ b/src/components/RequestSummary/RequestSummary.tsx
@@ -7,7 +7,7 @@ import dayjs from "dayjs";
7 7
8interface RequestSummaryProps { 8interface RequestSummaryProps {
9 selected?: boolean; 9 selected?: boolean;
10 requestResponse: RequestResponse; 10 requestResponse: Calls;
11 showTime?: boolean; 11 showTime?: boolean;
12} 12}
13 13
diff --git a/src/contexts/Connection.tsx b/src/contexts/Connection.tsx
new file mode 100644
index 0000000..42482e1
--- /dev/null
+++ b/src/contexts/Connection.tsx
@@ -0,0 +1,288 @@
1import * as React from "react";
2
3import {
4 Context,
5 createContext,
6 PropsWithChildren,
7 useCallback,
8 useEffect,
9 useMemo,
10 useState,
11} from "react";
12import {
13 Call,
14 Frame,
15 Frames,
16 Historic,
17 ReadyState,
18 Request,
19 RequestResponseType,
20 Requests,
21 Response,
22 ResponsePayload,
23 Responses,
24 WebsocketConnect,
25 WebsocketConnected,
26 WebsocketConnectedPayload,
27 WebsocketDisconnectPayload,
28 WebsocketInboundPayload,
29 WebsocketOutboundPayload,
30 WebsocketType,
31} from "~/types";
32import { getHost } from "~/utils";
33
34interface Config {
35 url: string;
36}
37
38interface ConnectionApi {
39 config: Config | null;
40 calls: Call[];
41 selectedCall: Call | null;
42 setSelectedCall: (call: Call | null) => void;
43 readyState: ReadyState;
44 clear: () => void;
45}
46
47export const ConnectionContext = createContext<Partial<ConnectionApi>>(
48 {}
49) as Context<ConnectionApi>;
50
51export default function ConnectionProvider({
52 children,
53}: PropsWithChildren<any>): JSX.Element {
54 const [selectedCall, setSelectedCall] = useState<Call | null>(null);
55 const [config, setConfig] = useState<Config | null>(null);
56
57 const wsHost = useMemo(getHost, []);
58
59 const [initialConnection, setInitialConnection] = useState(true);
60 const [requests, setRequests] = useState<Requests>([]);
61 const [responses, setResponses] = useState<Responses>({});
62 const [websocketFrames, setWebsocketFrames] = useState<Frames>({});
63
64 const connect = useCallback(
65 () => new WebSocket(`ws://${wsHost}/inspect/`),
66 [wsHost]
67 );
68
69 const [ws, setWs] = useState<WebSocket>(() => connect());
70 const [readyState, setReadyState] = useState<ReadyState>(ws.readyState);
71
72 useEffect(() => {
73 setReadyState(ws.readyState);
74
75 const onClose = () => {
76 setReadyState(ws.readyState);
77 setWs(connect());
78 };
79
80 const onOpen = async () => {
81 const response = await fetch(`http://${getHost()}/config/`);
82 const config = await response.json();
83 setConfig(config);
84
85 setInitialConnection(false);
86 setReadyState(ws.readyState);
87 };
88
89 const onMessage = ({ data }: { data: string }) => {
90 const { type, payload } = JSON.parse(data) as
91 | Historic
92 | RequestResponseType
93 | WebsocketType;
94
95 switch (type) {
96 case "historic":
97 if (initialConnection) {
98 const requests = (
99 payload as (RequestResponseType | WebsocketType)[]
100 )
101 .filter(
102 ({ type }) => type === "request" || type == "websocket_connect"
103 )
104 .map((payload) => {
105 if (
106 (payload as WebsocketConnect).payload.method === undefined
107 ) {
108 (payload as Request | WebsocketConnect).payload.method =
109 "GET";
110 }
111
112 return payload;
113 });
114 const responses = (
115 payload as (RequestResponseType | WebsocketType)[]
116 )
117 .filter(
118 ({ type }) =>
119 type === "response" || type == "websocket_connected"
120 )
121 .map(({ type, ...item }) => {
122 if (type == "websocket_connected") {
123 (item.payload as WebsocketConnectedPayload).status = 101;
124 }
125
126 return { type, ...item };
127 })
128 .reduce<{ [id: string]: Response | WebsocketConnected }>(
129 (out, item) => ({
130 ...out,
131 [item.payload.id]: item as Response | WebsocketConnected,
132 }),
133 {}
134 );
135 const frames = (payload as (RequestResponseType | WebsocketType)[])
136 .filter(
137 ({ type }) =>
138 type == "websocket_inbound" ||
139 type == "websocket_outbound" ||
140 type == "websocket_disconnect"
141 )
142 .reduce<Frames>((out, item) => {
143 if (!out.hasOwnProperty(item.payload.id)) {
144 out[item.payload.id] = [];
145 }
146
147 out[item.payload.id].push(item as Frame);
148 return out;
149 }, {});
150 setRequests((rqs) => [
151 ...rqs,
152 ...requests.map(
153 (payload) => payload as Request | WebsocketConnect
154 ),
155 ]);
156 setResponses((rps) => ({
157 ...rps,
158 ...responses,
159 }));
160 setWebsocketFrames((frms) => ({
161 ...frms,
162 ...frames,
163 }));
164 }
165 break;
166 case "request":
167 case "websocket_connect":
168 setRequests((rqs) => [
169 ...rqs,
170 {
171 type,
172 payload:
173 type === "request"
174 ? payload
175 : {
176 ...payload,
177 method: "GET",
178 },
179 } as Request | WebsocketConnect,
180 ]);
181 break;
182 case "response":
183 case "websocket_connected":
184 if (type == "websocket_connected") {
185 (payload as WebsocketConnectedPayload).status = 101;
186 }
187 setResponses((rps) => ({
188 ...rps,
189 [(payload as ResponsePayload | WebsocketConnectedPayload).id]: {
190 type,
191 payload,
192 } as Response | WebsocketConnected,
193 }));
194 break;
195 case "websocket_inbound":
196 case "websocket_outbound":
197 case "websocket_disconnect":
198 setWebsocketFrames((frms) => {
199 const id = (
200 payload as
201 | WebsocketInboundPayload
202 | WebsocketOutboundPayload
203 | WebsocketDisconnectPayload
204 ).id;
205
206 const newFrms = { ...frms };
207
208 if (!newFrms.hasOwnProperty(id)) {
209 newFrms[id] = [];
210 }
211
212 // @ts-ignore
213 newFrms[id].push({
214 type,
215 payload: payload as
216 | WebsocketInboundPayload
217 | WebsocketOutboundPayload
218 | WebsocketDisconnectPayload,
219 });
220
221 return newFrms;
222 });
223 break;
224 }
225 };
226
227 ws.addEventListener("message", onMessage);
228 ws.addEventListener("close", onClose);
229 ws.addEventListener("open", onOpen);
230
231 return () => {
232 ws.removeEventListener("message", onMessage);
233 ws.removeEventListener("close", onClose);
234 ws.removeEventListener("open", onOpen);
235 };
236 }, [ws]);
237
238 const calls = useMemo<Call[]>(
239 () =>
240 requests.map((request) => {
241 let call: Call;
242 if (request.type === "request") {
243 call = {
244 type: "RequestResponse",
245 request: request.payload,
246 response: responses[request.payload.id]?.payload as ResponsePayload,
247 };
248 } else {
249 call = {
250 type: "WebsocketConnection",
251 request: request.payload,
252 response: responses[request.payload.id]
253 ?.payload as WebsocketConnectedPayload,
254 frames: websocketFrames[request.payload.id] ?? [],
255 };
256 }
257
258 if (
259 selectedCall !== null &&
260 selectedCall.request.id === call.request.id
261 ) {
262 setSelectedCall(call);
263 }
264
265 return call;
266 }),
267 [requests, responses, websocketFrames]
268 );
269
270 return (
271 <ConnectionContext.Provider
272 value={{
273 config,
274 calls,
275 selectedCall,
276 setSelectedCall,
277 readyState,
278 clear: () => {
279 setRequests([]);
280 setResponses({});
281 setWebsocketFrames({});
282 },
283 }}
284 >
285 {children}
286 </ConnectionContext.Provider>
287 );
288}
diff --git a/src/contexts/DarkMode.tsx b/src/contexts/DarkMode.tsx
index 4326fe9..fd536b2 100644
--- a/src/contexts/DarkMode.tsx
+++ b/src/contexts/DarkMode.tsx
@@ -2,7 +2,7 @@ import * as React from "react";
2import { 2import {
3 Context, 3 Context,
4 createContext, 4 createContext,
5 ReactNode, 5 PropsWithChildren,
6 useEffect, 6 useEffect,
7 useMemo, 7 useMemo,
8 useState, 8 useState,
@@ -17,11 +17,8 @@ interface DarkModeApi {
17export const DarkModeContext = createContext<Partial<DarkModeApi>>( 17export const DarkModeContext = createContext<Partial<DarkModeApi>>(
18 {} 18 {}
19) as Context<DarkModeApi>; 19) as Context<DarkModeApi>;
20interface DarkModeProviderProps {
21 children: ReactNode;
22}
23 20
24export default function DarkModeProvider({ children }: DarkModeProviderProps) { 21export default function DarkModeProvider({ children }: PropsWithChildren<any>) {
25 const themeConfig = useMemo(() => new ThemeConfig(), []); 22 const themeConfig = useMemo(() => new ThemeConfig(), []);
26 const [darkMode, setDarkMode] = useState( 23 const [darkMode, setDarkMode] = useState(
27 () => themeConfig.getTheme() === "dark" 24 () => themeConfig.getTheme() === "dark"
diff --git a/src/hooks/useRequests.tsx b/src/hooks/useRequests.tsx
index 1361949..3135aa2 100644
--- a/src/hooks/useRequests.tsx
+++ b/src/hooks/useRequests.tsx
@@ -1,68 +1,32 @@
1import { useCallback, useEffect, useMemo, useState } from "react"; 1import { useCallback, useEffect, useMemo, useState } from "react";
2import { getHost } from "~/utils"; 2import { getHost } from "~/utils";
3 3import {
4export type Headers = [string, string][]; 4 Call,
5export type Method = 5 Frame,
6 | "GET" 6 Frames,
7 | "HEAD" 7 Historic,
8 | "POST" 8 ReadyState,
9 | "PUT" 9 Request,
10 | "DELETE" 10 RequestResponseType,
11 | "CONNECT" 11 Requests,
12 | "OPTIONS" 12 Response,
13 | "TRACE" 13 ResponsePayload,
14 | "PATCH"; 14 Responses,
15 15 WebsocketConnect,
16export interface RequestPayload { 16 WebsocketConnected,
17 id: string; 17 WebsocketConnectedPayload,
18 timestamp: string; 18 WebsocketDisconnectPayload,
19 body: string; 19 WebsocketInboundPayload,
20 headers: Headers; 20 WebsocketOutboundPayload,
21 method: Method; 21 WebsocketType,
22 path: string; 22} from "~/types";
23}
24
25interface Request {
26 type: "request";
27 payload: RequestPayload;
28}
29
30export interface ResponsePayload {
31 id: string;
32 timing: number;
33 body: string;
34 headers: Headers;
35 status: number;
36}
37
38interface Response {
39 type: "response";
40 payload: ResponsePayload;
41}
42
43interface Historic {
44 type: "historic";
45 payload: (Request | Response)[];
46}
47
48export interface RequestResponse {
49 request: RequestPayload;
50 response?: ResponsePayload;
51}
52
53export enum ReadyState {
54 CONNECTING = 0,
55 OPEN = 1,
56 CLOSING = 2,
57 CLOSED = 3,
58}
59 23
60export interface useRequestsProps { 24export interface useRequestsProps {
61 onConnect: () => Promise<void>; 25 onConnect: () => Promise<void>;
62} 26}
63 27
64export interface UseRequests { 28export interface UseRequests {
65 calls: RequestResponse[]; 29 calls: Call[];
66 readyState: ReadyState; 30 readyState: ReadyState;
67 clear: () => void; 31 clear: () => void;
68} 32}
@@ -73,8 +37,9 @@ export default function useRequests({
73 const wsHost = useMemo(getHost, []); 37 const wsHost = useMemo(getHost, []);
74 38
75 const [initialConnection, setInitialConnection] = useState(true); 39 const [initialConnection, setInitialConnection] = useState(true);
76 const [requests, setRequests] = useState<RequestPayload[]>([]); 40 const [requests, setRequests] = useState<Requests>([]);
77 const [responses, setResponses] = useState<ResponsePayload[]>([]); 41 const [responses, setResponses] = useState<Responses>({});
42 const [websocketFrames, setWebsocketFrames] = useState<Frames>({});
78 43
79 const connect = useCallback( 44 const connect = useCallback(
80 () => new WebSocket(`ws://${wsHost}/inspect/`), 45 () => new WebSocket(`ws://${wsHost}/inspect/`),
@@ -96,36 +61,140 @@ export default function useRequests({
96 setInitialConnection(false); 61 setInitialConnection(false);
97 setReadyState(ws.readyState); 62 setReadyState(ws.readyState);
98 }; 63 };
99 const onMessage = ({ data }) => { 64 const onMessage = ({ data }: { data: string }) => {
100 const { type, payload } = JSON.parse(data) as 65 const { type, payload } = JSON.parse(data) as
101 | Historic 66 | Historic
102 | Request 67 | RequestResponseType
103 | Response; 68 | WebsocketType;
104 69
105 switch (type) { 70 switch (type) {
106 case "historic": 71 case "historic":
107 if (initialConnection) { 72 if (initialConnection) {
108 const requests = (payload as (Request | Response)[]).filter( 73 const requests = (
109 ({ type }) => type === "request" 74 payload as (RequestResponseType | WebsocketType)[]
110 ); 75 )
111 const responses = (payload as (Request | Response)[]).filter( 76 .filter(
112 ({ type }) => type === "response" 77 ({ type }) => type === "request" || type == "websocket_connect"
113 ); 78 )
79 .map((payload) => {
80 if (
81 (payload as WebsocketConnect).payload.method === undefined
82 ) {
83 (payload as Request | WebsocketConnect).payload.method =
84 "GET";
85 }
86
87 return payload;
88 });
89 const responses = (
90 payload as (RequestResponseType | WebsocketType)[]
91 )
92 .filter(
93 ({ type }) =>
94 type === "response" || type == "websocket_connected"
95 )
96 .map(({ type, ...item }) => {
97 if (type == "websocket_connected") {
98 (item.payload as WebsocketConnectedPayload).status = 101;
99 }
100
101 return { type, ...item };
102 })
103 .reduce<{ [id: string]: Response | WebsocketConnected }>(
104 (out, item) => ({
105 ...out,
106 [item.payload.id]: item as Response | WebsocketConnected,
107 }),
108 {}
109 );
110 const frames = (payload as (RequestResponseType | WebsocketType)[])
111 .filter(
112 ({ type }) =>
113 type == "websocket_inbound" ||
114 type == "websocket_outbound" ||
115 type == "websocket_disconnect"
116 )
117 .reduce<Frames>((out, item) => {
118 if (!out.hasOwnProperty(item.payload.id)) {
119 out[item.payload.id] = [];
120 }
121
122 out[item.payload.id].push(item as Frame);
123 return out;
124 }, {});
114 setRequests((rqs) => [ 125 setRequests((rqs) => [
115 ...rqs, 126 ...rqs,
116 ...requests.map(({ payload }) => payload as RequestPayload), 127 ...requests.map(
128 (payload) => payload as Request | WebsocketConnect
129 ),
117 ]); 130 ]);
118 setResponses((rps) => [ 131 setResponses((rps) => ({
119 ...rps, 132 ...rps,
120 ...responses.map(({ payload }) => payload as ResponsePayload), 133 ...responses,
121 ]); 134 }));
135 setWebsocketFrames((frms) => ({
136 ...frms,
137 ...frames,
138 }));
122 } 139 }
123 break; 140 break;
124 case "request": 141 case "request":
125 setRequests((rqs) => [...rqs, payload as RequestPayload]); 142 case "websocket_connect":
143 setRequests((rqs) => [
144 ...rqs,
145 {
146 type,
147 payload:
148 type === "request"
149 ? payload
150 : {
151 ...payload,
152 method: "GET",
153 },
154 } as Request | WebsocketConnect,
155 ]);
126 break; 156 break;
127 case "response": 157 case "response":
128 setResponses((rps) => [...rps, payload as ResponsePayload]); 158 case "websocket_connected":
159 if (type == "websocket_connected") {
160 (payload as WebsocketConnectedPayload).status = 101;
161 }
162 setResponses((rps) => ({
163 ...rps,
164 [(payload as ResponsePayload | WebsocketConnectedPayload).id]: {
165 type,
166 payload,
167 } as Response | WebsocketConnected,
168 }));
169 break;
170 case "websocket_inbound":
171 case "websocket_outbound":
172 case "websocket_disconnect":
173 setWebsocketFrames((frms) => {
174 const id = (
175 payload as
176 | WebsocketInboundPayload
177 | WebsocketOutboundPayload
178 | WebsocketDisconnectPayload
179 ).id;
180
181 const newFrms = { ...frms };
182
183 if (!newFrms.hasOwnProperty(id)) {
184 newFrms[id] = [];
185 }
186
187 // @ts-ignore
188 newFrms[id].push({
189 type,
190 payload: payload as
191 | WebsocketInboundPayload
192 | WebsocketOutboundPayload
193 | WebsocketDisconnectPayload,
194 });
195
196 return newFrms;
197 });
129 break; 198 break;
130 } 199 }
131 }; 200 };
@@ -141,19 +210,37 @@ export default function useRequests({
141 }; 210 };
142 }, [ws]); 211 }, [ws]);
143 212
213 const calls = useMemo<Call[]>(
214 () =>
215 requests.map((request) => {
216 switch (request.type) {
217 case "request":
218 return {
219 type: "RequestResponse",
220 request: request.payload,
221 response: responses[request.payload.id]
222 ?.payload as ResponsePayload,
223 };
224 case "websocket_connect":
225 return {
226 type: "WebsocketConnection",
227 request: request.payload,
228 response: responses[request.payload.id]
229 ?.payload as WebsocketConnectedPayload,
230 frames: websocketFrames[request.payload.id] ?? [],
231 };
232 }
233 }),
234 [requests, responses, websocketFrames]
235 );
236
144 return { 237 return {
145 calls: useMemo<RequestResponse[]>( 238 calls,
146 () =>
147 requests.map((request) => ({
148 request: request,
149 response: responses.find(({ id }) => id === request.id),
150 })),
151 [requests, responses]
152 ),
153 readyState, 239 readyState,
154 clear: () => { 240 clear: () => {
155 setRequests([]); 241 setRequests([]);
156 setResponses([]); 242 setResponses({});
243 setWebsocketFrames({});
157 }, 244 },
158 }; 245 };
159} 246}
diff --git a/src/index.tsx b/src/index.tsx
index d83fd38..a2c18e3 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -7,11 +7,14 @@ import DarkModeProvider from "./contexts/DarkMode";
7 7
8import dayjs from "dayjs"; 8import dayjs from "dayjs";
9import localizedFormat from "dayjs/plugin/localizedFormat"; 9import localizedFormat from "dayjs/plugin/localizedFormat";
10import ConnectionProvider from "~/contexts/Connection";
10dayjs.extend(localizedFormat); 11dayjs.extend(localizedFormat);
11 12
12ReactDOM.render( 13ReactDOM.render(
13 <DarkModeProvider> 14 <DarkModeProvider>
14 <App /> 15 <ConnectionProvider>
16 <App />
17 </ConnectionProvider>
15 </DarkModeProvider>, 18 </DarkModeProvider>,
16 document.getElementById("root") 19 document.getElementById("root")
17); 20);
diff --git a/src/types.ts b/src/types.ts
new file mode 100644
index 0000000..0e11bee
--- /dev/null
+++ b/src/types.ts
@@ -0,0 +1,136 @@
1export type Headers = [string, string][];
2export type Method =
3 | "GET"
4 | "HEAD"
5 | "POST"
6 | "PUT"
7 | "DELETE"
8 | "CONNECT"
9 | "OPTIONS"
10 | "TRACE"
11 | "PATCH";
12
13export interface RequestPayload {
14 id: string;
15 timestamp: string;
16 body: string;
17 headers: Headers;
18 method: Method;
19 path: string;
20}
21
22export interface Request {
23 type: "request";
24 payload: RequestPayload;
25}
26
27export interface ResponsePayload {
28 id: string;
29 timing: number;
30 body: string;
31 headers: Headers;
32 status: number;
33}
34
35export interface Response {
36 type: "response";
37 payload: ResponsePayload;
38}
39
40export type RequestResponseType = Request | Response;
41
42export interface WebsocketConnectPayload {
43 method: "GET";
44 id: string;
45 headers: Headers;
46 path: string;
47 timestamp: string;
48}
49
50export interface WebsocketConnect {
51 type: "websocket_connect";
52 payload: WebsocketConnectPayload;
53}
54
55export interface WebsocketConnectedPayload {
56 id: string;
57 timing: number;
58 status: 101;
59}
60
61export interface WebsocketConnected {
62 type: "websocket_connected";
63 payload: WebsocketConnectedPayload;
64}
65
66export interface WebsocketInboundPayload {
67 id: string;
68 timestamp: string;
69 body: string;
70}
71
72interface WebsocketInbound {
73 type: "websocket_inbound";
74 payload: WebsocketInboundPayload;
75}
76
77export interface WebsocketOutboundPayload {
78 id: string;
79 timestamp: string;
80 body: string;
81}
82
83interface WebsocketOutbound {
84 type: "websocket_outbound";
85 payload: WebsocketOutboundPayload;
86}
87
88export interface WebsocketDisconnectPayload {
89 id: string;
90 timestamp: string;
91 close_code: number;
92}
93
94interface WebsocketDisconnect {
95 type: "websocket_disconnect";
96 payload: WebsocketDisconnectPayload;
97}
98
99export type WebsocketType =
100 | WebsocketConnect
101 | WebsocketConnected
102 | WebsocketInbound
103 | WebsocketOutbound
104 | WebsocketDisconnect;
105
106export interface Historic {
107 type: "historic";
108 payload: (RequestResponseType | WebsocketType)[];
109}
110
111export interface RequestResponse {
112 type: "RequestResponse";
113 request: RequestPayload;
114 response?: ResponsePayload;
115}
116
117export type Frame = WebsocketDisconnect | WebsocketInbound | WebsocketOutbound;
118export interface WebsocketConnection {
119 type: "WebsocketConnection";
120 request: WebsocketConnectPayload;
121 response?: WebsocketConnectedPayload;
122 frames?: Frame[];
123}
124
125export type Call = RequestResponse | WebsocketConnection;
126
127export type Requests = Array<Request | WebsocketConnect>;
128export type Responses = { [id: string]: Response | WebsocketConnected };
129export type Frames = { [id: string]: Frame[] };
130
131export enum ReadyState {
132 CONNECTING = 0,
133 OPEN = 1,
134 CLOSING = 2,
135 CLOSED = 3,
136}
diff --git a/ttun/__main__.py b/ttun/__main__.py
index 4e693fb..dd83e53 100644
--- a/ttun/__main__.py
+++ b/ttun/__main__.py
@@ -1,21 +1,23 @@
1import asyncio 1import asyncio
2import logging
3import os
2import re 4import re
3import time
4from argparse import ArgumentDefaultsHelpFormatter 5from argparse import ArgumentDefaultsHelpFormatter
5from argparse import ArgumentParser 6from argparse import ArgumentParser
6from asyncio import FIRST_EXCEPTION 7from asyncio import FIRST_EXCEPTION
7from asyncio.exceptions import CancelledError 8from asyncio.exceptions import CancelledError
8from asyncio.exceptions import TimeoutError 9from asyncio.exceptions import TimeoutError
9from typing import Dict
10from typing import Tuple 10from typing import Tuple
11 11
12from websockets.exceptions import ConnectionClosedError
13
14from ttun.client import Client 12from ttun.client import Client
15from ttun.inspect_server import Server 13from ttun.inspect_server import Server
16from ttun.settings import SERVER_HOSTNAME 14from ttun.settings import SERVER_HOSTNAME
17from ttun.settings import SERVER_USING_SSL 15from ttun.settings import SERVER_USING_SSL
18 16
17logging.basicConfig(encoding="utf-8")
18logging.getLogger("asyncio").setLevel(os.environ.get("LOGGING_LEVEL", "NOTSET"))
19logging.getLogger("websockets").setLevel(os.environ.get("LOGGING_LEVEL", "NOTSET"))
20
19inspect_queue = asyncio.Queue() 21inspect_queue = asyncio.Queue()
20 22
21 23
@@ -73,7 +75,6 @@ def main():
73 headers=args.header, 75 headers=args.header,
74 ) 76 )
75 77
76
77 try: 78 try:
78 loop = asyncio.get_running_loop() 79 loop = asyncio.get_running_loop()
79 except RuntimeError: 80 except RuntimeError:
diff --git a/ttun/client.py b/ttun/client.py
index a75c882..b19bb47 100644
--- a/ttun/client.py
+++ b/ttun/client.py
@@ -1,5 +1,8 @@
1import asyncio 1import asyncio
2import json 2import json
3import logging
4import os
5import sys
3from asyncio import get_running_loop 6from asyncio import get_running_loop
4from base64 import b64decode 7from base64 import b64decode
5from base64 import b64encode 8from base64 import b64encode
@@ -24,10 +27,18 @@ from websockets.exceptions import ConnectionClosed
24from ttun import __version__ 27from ttun import __version__
25from ttun.pubsub import PubSub 28from ttun.pubsub import PubSub
26from ttun.types import Config 29from ttun.types import Config
30from ttun.types import HttpMessage
31from ttun.types import HttpMessageType
32from ttun.types import HttpRequestData
33from ttun.types import HttpResponseData
27from ttun.types import Message 34from ttun.types import Message
28from ttun.types import MessageType 35from ttun.types import MessageType
29from ttun.types import RequestData 36from ttun.types import WebsocketMessage
30from ttun.types import ResponseData 37from ttun.types import WebsocketMessageData
38from ttun.types import WebsocketMessageType
39
40logger = logging.getLogger(__name__)
41logger.setLevel(os.environ.get("LOGGING_LEVEL", "NOTSET"))
31 42
32 43
33class Client: 44class Client:
@@ -48,9 +59,12 @@ class Client:
48 self.connection: WebSocketClientProtocol = None 59 self.connection: WebSocketClientProtocol = None
49 60
50 self.proxy_origin = f'{"https" if https else "http"}://{to}:{port}' 61 self.proxy_origin = f'{"https" if https else "http"}://{to}:{port}'
62 self.ws_proxy_origin = f'{"wss" if https else "ws"}://{to}:{port}'
51 63
52 self.headers = [] if headers is None else headers 64 self.headers = [] if headers is None else headers
53 65
66 self.websocket_connections = {}
67
54 async def send(self, data: dict): 68 async def send(self, data: dict):
55 await self.connection.send(json.dumps(data)) 69 await self.connection.send(json.dumps(data))
56 70
@@ -86,63 +100,181 @@ class Client:
86 def session(self): 100 def session(self):
87 return ClientSession(base_url=self.proxy_origin, cookie_jar=DummyCookieJar()) 101 return ClientSession(base_url=self.proxy_origin, cookie_jar=DummyCookieJar())
88 102
103 async def handle_request(self, message: HttpMessage, session: ClientSession = None):
104 if session is None:
105 session = self.session()
106
107 request: HttpRequestData = message["payload"]
108
109 request["headers"] = [
110 *request["headers"],
111 *self.headers,
112 ]
113
114 async def response_handler(
115 response: HttpResponseData, identifier=message["identifier"]
116 ):
117 await self.send(
118 HttpMessage(
119 type=HttpMessageType.response.value,
120 identifier=identifier,
121 payload=response,
122 )
123 )
124
125 await self.proxy_request(
126 session=session,
127 request=request,
128 on_response=response_handler,
129 )
130
131 async def receive_websocket_message(self, message: str, idenitfier: str):
132 message_data = WebsocketMessage(
133 identifier=idenitfier,
134 type=WebsocketMessageType.message.value,
135 payload=WebsocketMessageData(body=b64encode(message.encode()).decode()),
136 )
137 await self.send(message_data)
138
139 await PubSub.publish(
140 {
141 "type": "websocket_outbound",
142 "payload": {
143 "id": message_data["identifier"],
144 "timestamp": datetime.now().isoformat(),
145 **message_data["payload"],
146 },
147 }
148 )
149
150 async def connect_websocket(self, message: WebsocketMessage):
151 assert not message["identifier"] in self.websocket_connections
152
153 start = perf_counter()
154 await PubSub.publish(
155 {
156 "type": "websocket_connect",
157 "payload": {
158 "id": message["identifier"],
159 "timestamp": datetime.now().isoformat(),
160 **message["payload"],
161 },
162 }
163 )
164
165 async with websockets.connect(
166 f'{self.ws_proxy_origin}/{message["payload"]["path"]}'
167 ) as connection:
168 end = perf_counter()
169 self.websocket_connections[message["identifier"]] = connection
170
171 await self.send(
172 WebsocketMessage(
173 identifier=message["identifier"],
174 type=WebsocketMessageType.ack.value,
175 payload=None,
176 )
177 )
178
179 await PubSub.publish(
180 {
181 "type": "websocket_connected",
182 "payload": {
183 "id": message["identifier"],
184 "timing": end - start,
185 },
186 }
187 )
188
189 async for m in connection:
190 await self.receive_websocket_message(m, message["identifier"])
191
192 async def send_websocket_message(self, message: WebsocketMessage):
193 assert message["identifier"] in self.websocket_connections
194 await self.websocket_connections[message["identifier"]].send(
195 b64decode(message["payload"]["body"]).decode()
196 )
197
198 await PubSub.publish(
199 {
200 "type": "websocket_inbound",
201 "payload": {
202 "id": message["identifier"],
203 "timestamp": datetime.now().isoformat(),
204 **message["payload"],
205 },
206 }
207 )
208
209 async def disconnect_websocket(self, message: WebsocketMessage):
210 assert message["identifier"] in self.websocket_connections
211
212 await self.websocket_connections[message["identifier"]].close()
213
214 self.websocket_connections[message["identifier"]] = None
215 await PubSub.publish(
216 {
217 "type": "websocket_disconnect",
218 "payload": {
219 "id": message["identifier"],
220 "timestamp": datetime.now().isoformat(),
221 **message["payload"],
222 },
223 }
224 )
225
89 async def handle_messages(self): 226 async def handle_messages(self):
90 loop = get_running_loop() 227 loop = get_running_loop()
228 tasks = set()
229
91 async with self.session() as session: 230 async with self.session() as session:
92 while True: 231 while True:
93 try: 232 try:
94 message: Message = await self.receive() 233 message: Message = await self.receive()
234 logger.debug(message)
95 235
96 try: 236 match MessageType(message["type"]):
97 if MessageType(message["type"]) != MessageType.request: 237 case MessageType.request:
98 continue 238 task = loop.create_task(
99 except ValueError: 239 self.handle_request(message, session)
100 continue
101
102 request: RequestData = message["payload"]
103
104 request["headers"] = [
105 *request["headers"],
106 *self.headers,
107 ]
108
109 async def response_handler(
110 response: ResponseData, identifier=message["identifier"]
111 ):
112 await self.send(
113 Message(
114 type=MessageType.response.value,
115 identifier=identifier,
116 payload=response,
117 ) 240 )
118 ) 241 case MessageType.ws_connect:
242 task = loop.create_task(self.connect_websocket(message))
243 case MessageType.ws_message:
244 task = loop.create_task(
245 self.send_websocket_message(message)
246 )
247 case MessageType.ws_disconnect:
248 task = loop.create_task(self.disconnect_websocket(message))
249 case _:
250 logger.debug(message)
119 251
120 await loop.create_task( 252 tasks.add(task)
121 self.proxy_request( 253 task.add_done_callback(tasks.discard)
122 session=session, 254 except ValueError:
123 request=request, 255 continue
124 on_response=response_handler, 256 except ConnectionClosed as e:
125 ) 257 raise e
126 ) 258
127 except ConnectionClosed: 259 for task in tasks:
128 break 260 task.cancel()
129 261
130 async def resend(self, data: RequestData): 262 async def resend(self, data: HttpRequestData):
131 async with self.session() as session: 263 async with self.session() as session:
132 await self.proxy_request(session, data) 264 await self.proxy_request(session, data)
133 265
134 async def proxy_request( 266 async def proxy_request(
135 self, 267 self,
136 session: ClientSession, 268 session: ClientSession,
137 request: RequestData, 269 request: HttpRequestData,
138 on_response: Callable[[ResponseData], Awaitable] = None, 270 on_response: Callable[[HttpResponseData], Awaitable] = None,
139 ): 271 ):
140 request_id = uuid4() 272 request_id = str(uuid4())
141 await PubSub.publish( 273 await PubSub.publish(
142 { 274 {
143 "type": "request", 275 "type": "request",
144 "payload": { 276 "payload": {
145 "id": request_id.hex, 277 "id": request_id,
146 "timestamp": datetime.now().isoformat(), 278 "timestamp": datetime.now().isoformat(),
147 **request, 279 **request,
148 }, 280 },
@@ -160,7 +292,7 @@ class Client:
160 ) 292 )
161 end = perf_counter() 293 end = perf_counter()
162 294
163 response_data = ResponseData( 295 response_data = HttpResponseData(
164 status=response.status, 296 status=response.status,
165 headers=[ 297 headers=[
166 (key, value) 298 (key, value)
@@ -173,7 +305,7 @@ class Client:
173 except ClientError as e: 305 except ClientError as e:
174 end = perf_counter() 306 end = perf_counter()
175 307
176 response_data = ResponseData( 308 response_data = HttpResponseData(
177 status=(504 if isinstance(e, ClientConnectionError) else 502), 309 status=(504 if isinstance(e, ClientConnectionError) else 502),
178 headers=[("content-type", "text/plain")], 310 headers=[("content-type", "text/plain")],
179 body=b64encode(str(e).encode()).decode(), 311 body=b64encode(str(e).encode()).decode(),
@@ -186,7 +318,7 @@ class Client:
186 { 318 {
187 "type": "response", 319 "type": "response",
188 "payload": { 320 "payload": {
189 "id": request_id.hex, 321 "id": request_id,
190 "timing": end - start, 322 "timing": end - start,
191 **response_data, 323 **response_data,
192 }, 324 },
diff --git a/ttun/inspect_server.py b/ttun/inspect_server.py
index 1cd8809..df274a2 100644
--- a/ttun/inspect_server.py
+++ b/ttun/inspect_server.py
@@ -2,13 +2,12 @@ from importlib import resources
2from pathlib import Path 2from pathlib import Path
3from typing import Awaitable 3from typing import Awaitable
4from typing import Callable 4from typing import Callable
5from typing import Optional
6 5
7from aiohttp import web 6from aiohttp import web
8 7
9from ttun.pubsub import PubSub 8from ttun.pubsub import PubSub
10from ttun.types import Config 9from ttun.types import Config
11from ttun.types import RequestData 10from ttun.types import HttpRequestData
12 11
13BASE_DIR = Path(__file__).resolve().parent 12BASE_DIR = Path(__file__).resolve().parent
14 13
@@ -17,7 +16,7 @@ class Server:
17 def __init__( 16 def __init__(
18 self, 17 self,
19 config: Config, 18 config: Config,
20 on_resend: Callable[[RequestData], Awaitable], 19 on_resend: Callable[[HttpRequestData], Awaitable],
21 on_started: Callable[["Server"], None], 20 on_started: Callable[["Server"], None],
22 ): 21 ):
23 self.port = 4040 22 self.port = 4040
diff --git a/ttun/pubsub.py b/ttun/pubsub.py
index 0ba964e..85a1988 100644
--- a/ttun/pubsub.py
+++ b/ttun/pubsub.py
@@ -1,7 +1,6 @@
1import asyncio 1import asyncio
2from contextlib import contextmanager 2from contextlib import contextmanager
3from typing import Any 3from typing import Any
4from typing import Generator
5from typing import Iterator 4from typing import Iterator
6 5
7 6
diff --git a/ttun/types.py b/ttun/types.py
index 59bfa79..cdda635 100644
--- a/ttun/types.py
+++ b/ttun/types.py
@@ -1,28 +1,72 @@
1from enum import Enum 1from enum import Enum
2from itertools import chain
2from typing import Optional 3from typing import Optional
3from typing import TypedDict 4from typing import TypedDict
4 5
5class MessageType(Enum):
6 request = 'request'
7 response = 'response'
8 6
9class RequestData(TypedDict): 7class HttpMessageType(Enum):
8 request = "request"
9 response = "response"
10
11
12class HttpRequestData(TypedDict):
10 method: str 13 method: str
11 path: str 14 path: str
12 headers: list[tuple[str, str]] 15 headers: list[tuple[str, str]]
13 body: Optional[str] 16 body: Optional[str]
14 17
15 18
16class ResponseData(TypedDict): 19class HttpResponseData(TypedDict):
17 status: int 20 status: int
18 headers: list[tuple[str, str]] 21 headers: list[tuple[str, str]]
19 body: Optional[str] 22 body: Optional[str]
20 23
21 24
22class Message(TypedDict): 25class HttpMessage(TypedDict):
23 type: MessageType 26 type: HttpMessageType
24 identifier: str 27 identifier: str
25 payload: RequestData | ResponseData 28 payload: HttpRequestData | HttpResponseData
29
30
31class WebsocketMessageType(Enum):
32 connect = "connect"
33 disconnect = "disconnect"
34 message = "message"
35 ack = "ack"
36
37
38class WebsocketConnectData(TypedDict):
39 path: str
40 headers: list[tuple[str, str]]
41
42
43class WebsocketDisconnectData(TypedDict):
44 pass
45
46
47class WebsocketMessageData(TypedDict):
48 body: Optional[str]
49
50
51class WebsocketMessage(TypedDict):
52 type: WebsocketMessageType
53 identifier: str
54 payload: Optional[
55 WebsocketConnectData | WebsocketDisconnectData | WebsocketMessageData
56 ]
57
58
59class MessageType(Enum):
60 request = "request"
61 response = "response"
62
63 ws_connect = "connect"
64 ws_disconnect = "disconnect"
65 ws_message = "message"
66 ws_ack = "ack"
67
68
69Message = HttpMessage | WebsocketMessage
26 70
27 71
28class Config(TypedDict): 72class Config(TypedDict):
diff --git a/yarn.lock b/yarn.lock
index 6b85015..927e923 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,220 +2,202 @@
2# yarn lockfile v1 2# yarn lockfile v1
3 3
4 4
5"@ampproject/remapping@^2.1.0": 5"@ampproject/remapping@^2.2.0":
6 version "2.2.0" 6 version "2.3.0"
7 resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" 7 resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
8 integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== 8 integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
9 dependencies: 9 dependencies:
10 "@jridgewell/gen-mapping" "^0.1.0" 10 "@jridgewell/gen-mapping" "^0.3.5"
11 "@jridgewell/trace-mapping" "^0.3.9" 11 "@jridgewell/trace-mapping" "^0.3.24"
12 12
13"@babel/code-frame@^7.18.6": 13"@babel/code-frame@^7.24.7":
14 version "7.18.6" 14 version "7.24.7"
15 resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" 15 resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
16 integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 16 integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
17 dependencies: 17 dependencies:
18 "@babel/highlight" "^7.18.6" 18 "@babel/highlight" "^7.24.7"
19 picocolors "^1.0.0"
19 20
20"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0": 21"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2":
21 version "7.20.1" 22 version "7.25.4"
22 resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" 23 resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb"
23 integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== 24 integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==
24 25
25"@babel/core@^7.17.10", "@babel/core@^7.2.2": 26"@babel/core@^7.17.10", "@babel/core@^7.2.2":
26 version "7.20.2" 27 version "7.25.2"
27 resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" 28 resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77"
28 integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== 29 integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==
29 dependencies: 30 dependencies:
30 "@ampproject/remapping" "^2.1.0" 31 "@ampproject/remapping" "^2.2.0"
31 "@babel/code-frame" "^7.18.6" 32 "@babel/code-frame" "^7.24.7"
32 "@babel/generator" "^7.20.2" 33 "@babel/generator" "^7.25.0"
33 "@babel/helper-compilation-targets" "^7.20.0" 34 "@babel/helper-compilation-targets" "^7.25.2"
34 "@babel/helper-module-transforms" "^7.20.2" 35 "@babel/helper-module-transforms" "^7.25.2"
35 "@babel/helpers" "^7.20.1" 36 "@babel/helpers" "^7.25.0"
36 "@babel/parser" "^7.20.2" 37 "@babel/parser" "^7.25.0"
37 "@babel/template" "^7.18.10" 38 "@babel/template" "^7.25.0"
38 "@babel/traverse" "^7.20.1" 39 "@babel/traverse" "^7.25.2"
39 "@babel/types" "^7.20.2" 40 "@babel/types" "^7.25.2"
40 convert-source-map "^1.7.0" 41 convert-source-map "^2.0.0"
41 debug "^4.1.0" 42 debug "^4.1.0"
42 gensync "^1.0.0-beta.2" 43 gensync "^1.0.0-beta.2"
43 json5 "^2.2.1" 44 json5 "^2.2.3"
44 semver "^6.3.0" 45 semver "^6.3.1"
45 46
46"@babel/generator@^7.20.1", "@babel/generator@^7.20.2": 47"@babel/generator@^7.25.0", "@babel/generator@^7.25.6":
47 version "7.20.4" 48 version "7.25.6"
48 resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" 49 resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c"
49 integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== 50 integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==
50 dependencies: 51 dependencies:
51 "@babel/types" "^7.20.2" 52 "@babel/types" "^7.25.6"
52 "@jridgewell/gen-mapping" "^0.3.2" 53 "@jridgewell/gen-mapping" "^0.3.5"
54 "@jridgewell/trace-mapping" "^0.3.25"
53 jsesc "^2.5.1" 55 jsesc "^2.5.1"
54 56
55"@babel/helper-annotate-as-pure@^7.18.6": 57"@babel/helper-annotate-as-pure@^7.24.7":
56 version "7.18.6" 58 version "7.24.7"
57 resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" 59 resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab"
58 integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== 60 integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==
59 dependencies: 61 dependencies:
60 "@babel/types" "^7.18.6" 62 "@babel/types" "^7.24.7"
61 63
62"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.20.0": 64"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.2":
63 version "7.20.0" 65 version "7.25.2"
64 resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" 66 resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c"
65 integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== 67 integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==
66 dependencies: 68 dependencies:
67 "@babel/compat-data" "^7.20.0" 69 "@babel/compat-data" "^7.25.2"
68 "@babel/helper-validator-option" "^7.18.6" 70 "@babel/helper-validator-option" "^7.24.8"
69 browserslist "^4.21.3" 71 browserslist "^4.23.1"
70 semver "^6.3.0" 72 lru-cache "^5.1.1"
73 semver "^6.3.1"
71 74
72"@babel/helper-create-class-features-plugin@^7.18.6": 75"@babel/helper-create-class-features-plugin@^7.18.6":
73 version "7.20.2" 76 version "7.25.4"
74 resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz#3c08a5b5417c7f07b5cf3dfb6dc79cbec682e8c2" 77 resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14"
75 integrity sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA== 78 integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==
76 dependencies: 79 dependencies:
77 "@babel/helper-annotate-as-pure" "^7.18.6" 80 "@babel/helper-annotate-as-pure" "^7.24.7"
78 "@babel/helper-environment-visitor" "^7.18.9" 81 "@babel/helper-member-expression-to-functions" "^7.24.8"
79 "@babel/helper-function-name" "^7.19.0" 82 "@babel/helper-optimise-call-expression" "^7.24.7"
80 "@babel/helper-member-expression-to-functions" "^7.18.9" 83 "@babel/helper-replace-supers" "^7.25.0"
81 "@babel/helper-optimise-call-expression" "^7.18.6" 84 "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
82 "@babel/helper-replace-supers" "^7.19.1" 85 "@babel/traverse" "^7.25.4"
83 "@babel/helper-split-export-declaration" "^7.18.6" 86 semver "^6.3.1"
84 87
85"@babel/helper-define-polyfill-provider@^0.3.3": 88"@babel/helper-define-polyfill-provider@^0.6.2":
86 version "0.3.3" 89 version "0.6.2"
87 resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" 90 resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d"
88 integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== 91 integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==
89 dependencies: 92 dependencies:
90 "@babel/helper-compilation-targets" "^7.17.7" 93 "@babel/helper-compilation-targets" "^7.22.6"
91 "@babel/helper-plugin-utils" "^7.16.7" 94 "@babel/helper-plugin-utils" "^7.22.5"
92 debug "^4.1.1" 95 debug "^4.1.1"
93 lodash.debounce "^4.0.8" 96 lodash.debounce "^4.0.8"
94 resolve "^1.14.2" 97 resolve "^1.14.2"
95 semver "^6.1.2"
96
97"@babel/helper-environment-visitor@^7.18.9":
98 version "7.18.9"
99 resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
100 integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
101
102"@babel/helper-function-name@^7.19.0":
103 version "7.19.0"
104 resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c"
105 integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==
106 dependencies:
107 "@babel/template" "^7.18.10"
108 "@babel/types" "^7.19.0"
109
110"@babel/helper-hoist-variables@^7.18.6":
111 version "7.18.6"
112 resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
113 integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
114 dependencies:
115 "@babel/types" "^7.18.6"
116 98
117"@babel/helper-member-expression-to-functions@^7.18.9": 99"@babel/helper-member-expression-to-functions@^7.24.8":
118 version "7.18.9" 100 version "7.24.8"
119 resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" 101 resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6"
120 integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== 102 integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==
121 dependencies: 103 dependencies:
122 "@babel/types" "^7.18.9" 104 "@babel/traverse" "^7.24.8"
105 "@babel/types" "^7.24.8"
123 106
124"@babel/helper-module-imports@^7.18.6": 107"@babel/helper-module-imports@^7.24.7":
125 version "7.18.6" 108 version "7.24.7"
126 resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" 109 resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
127 integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== 110 integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
128 dependencies: 111 dependencies:
129 "@babel/types" "^7.18.6" 112 "@babel/traverse" "^7.24.7"
113 "@babel/types" "^7.24.7"
130 114
131"@babel/helper-module-transforms@^7.20.2": 115"@babel/helper-module-transforms@^7.25.2":
132 version "7.20.2" 116 version "7.25.2"
133 resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" 117 resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6"
134 integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== 118 integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==
135 dependencies: 119 dependencies:
136 "@babel/helper-environment-visitor" "^7.18.9" 120 "@babel/helper-module-imports" "^7.24.7"
137 "@babel/helper-module-imports" "^7.18.6" 121 "@babel/helper-simple-access" "^7.24.7"
138 "@babel/helper-simple-access" "^7.20.2" 122 "@babel/helper-validator-identifier" "^7.24.7"
139 "@babel/helper-split-export-declaration" "^7.18.6" 123 "@babel/traverse" "^7.25.2"
140 "@babel/helper-validator-identifier" "^7.19.1"
141 "@babel/template" "^7.18.10"
142 "@babel/traverse" "^7.20.1"
143 "@babel/types" "^7.20.2"
144 124
145"@babel/helper-optimise-call-expression@^7.18.6": 125"@babel/helper-optimise-call-expression@^7.24.7":
146 version "7.18.6" 126 version "7.24.7"
147 resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" 127 resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f"
148 integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== 128 integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==
149 dependencies: 129 dependencies:
150 "@babel/types" "^7.18.6" 130 "@babel/types" "^7.24.7"
151 131
152"@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0": 132"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8":
153 version "7.20.2" 133 version "7.24.8"
154 resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" 134 resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878"
155 integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== 135 integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==
156 136
157"@babel/helper-replace-supers@^7.19.1": 137"@babel/helper-replace-supers@^7.25.0":
158 version "7.19.1" 138 version "7.25.0"
159 resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" 139 resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9"
160 integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== 140 integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==
161 dependencies: 141 dependencies:
162 "@babel/helper-environment-visitor" "^7.18.9" 142 "@babel/helper-member-expression-to-functions" "^7.24.8"
163 "@babel/helper-member-expression-to-functions" "^7.18.9" 143 "@babel/helper-optimise-call-expression" "^7.24.7"
164 "@babel/helper-optimise-call-expression" "^7.18.6" 144 "@babel/traverse" "^7.25.0"
165 "@babel/traverse" "^7.19.1"
166 "@babel/types" "^7.19.0"
167 145
168"@babel/helper-simple-access@^7.20.2": 146"@babel/helper-simple-access@^7.24.7":
169 version "7.20.2" 147 version "7.24.7"
170 resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" 148 resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
171 integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== 149 integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
172 dependencies: 150 dependencies:
173 "@babel/types" "^7.20.2" 151 "@babel/traverse" "^7.24.7"
152 "@babel/types" "^7.24.7"
174 153
175"@babel/helper-split-export-declaration@^7.18.6": 154"@babel/helper-skip-transparent-expression-wrappers@^7.24.7":
176 version "7.18.6" 155 version "7.24.7"
177 resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" 156 resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9"
178 integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== 157 integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==
179 dependencies: 158 dependencies:
180 "@babel/types" "^7.18.6" 159 "@babel/traverse" "^7.24.7"
160 "@babel/types" "^7.24.7"
181 161
182"@babel/helper-string-parser@^7.19.4": 162"@babel/helper-string-parser@^7.24.8":
183 version "7.19.4" 163 version "7.24.8"
184 resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" 164 resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d"
185 integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== 165 integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
186 166
187"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": 167"@babel/helper-validator-identifier@^7.24.7":
188 version "7.19.1" 168 version "7.24.7"
189 resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" 169 resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
190 integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== 170 integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
191 171
192"@babel/helper-validator-option@^7.18.6": 172"@babel/helper-validator-option@^7.24.8":
193 version "7.18.6" 173 version "7.24.8"
194 resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" 174 resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d"
195 integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== 175 integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==
196 176
197"@babel/helpers@^7.20.1": 177"@babel/helpers@^7.25.0":
198 version "7.20.1" 178 version "7.25.6"
199 resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" 179 resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60"
200 integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== 180 integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==
201 dependencies: 181 dependencies:
202 "@babel/template" "^7.18.10" 182 "@babel/template" "^7.25.0"
203 "@babel/traverse" "^7.20.1" 183 "@babel/types" "^7.25.6"
204 "@babel/types" "^7.20.0"
205 184
206"@babel/highlight@^7.18.6": 185"@babel/highlight@^7.24.7":
207 version "7.18.6" 186 version "7.24.7"
208 resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 187 resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
209 integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 188 integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
210 dependencies: 189 dependencies:
211 "@babel/helper-validator-identifier" "^7.18.6" 190 "@babel/helper-validator-identifier" "^7.24.7"
212 chalk "^2.0.0" 191 chalk "^2.4.2"
213 js-tokens "^4.0.0" 192 js-tokens "^4.0.0"
193 picocolors "^1.0.0"
214 194
215"@babel/parser@^7.18.10", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": 195"@babel/parser@^7.25.0", "@babel/parser@^7.25.6":
216 version "7.20.3" 196 version "7.25.6"
217 resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" 197 resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f"
218 integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== 198 integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
199 dependencies:
200 "@babel/types" "^7.25.6"
219 201
220"@babel/plugin-proposal-class-properties@^7.3.0": 202"@babel/plugin-proposal-class-properties@^7.3.0":
221 version "7.18.6" 203 version "7.18.6"
@@ -225,96 +207,93 @@
225 "@babel/helper-create-class-features-plugin" "^7.18.6" 207 "@babel/helper-create-class-features-plugin" "^7.18.6"
226 "@babel/helper-plugin-utils" "^7.18.6" 208 "@babel/helper-plugin-utils" "^7.18.6"
227 209
228"@babel/plugin-syntax-jsx@^7.18.6": 210"@babel/plugin-syntax-jsx@^7.24.7":
229 version "7.18.6" 211 version "7.24.7"
230 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" 212 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d"
231 integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== 213 integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==
232 dependencies: 214 dependencies:
233 "@babel/helper-plugin-utils" "^7.18.6" 215 "@babel/helper-plugin-utils" "^7.24.7"
234 216
235"@babel/plugin-transform-react-jsx-development@^7.16.7": 217"@babel/plugin-transform-react-jsx-development@^7.16.7":
236 version "7.18.6" 218 version "7.24.7"
237 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" 219 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b"
238 integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== 220 integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==
239 dependencies: 221 dependencies:
240 "@babel/plugin-transform-react-jsx" "^7.18.6" 222 "@babel/plugin-transform-react-jsx" "^7.24.7"
241 223
242"@babel/plugin-transform-react-jsx-self@^7.16.7": 224"@babel/plugin-transform-react-jsx-self@^7.16.7":
243 version "7.18.6" 225 version "7.24.7"
244 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" 226 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab"
245 integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== 227 integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==
246 dependencies: 228 dependencies:
247 "@babel/helper-plugin-utils" "^7.18.6" 229 "@babel/helper-plugin-utils" "^7.24.7"
248 230
249"@babel/plugin-transform-react-jsx-source@^7.16.7": 231"@babel/plugin-transform-react-jsx-source@^7.16.7":
250 version "7.19.6" 232 version "7.24.7"
251 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86" 233 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3"
252 integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== 234 integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==
253 dependencies: 235 dependencies:
254 "@babel/helper-plugin-utils" "^7.19.0" 236 "@babel/helper-plugin-utils" "^7.24.7"
255 237
256"@babel/plugin-transform-react-jsx@^7.17.3", "@babel/plugin-transform-react-jsx@^7.18.6": 238"@babel/plugin-transform-react-jsx@^7.17.3", "@babel/plugin-transform-react-jsx@^7.24.7":
257 version "7.19.0" 239 version "7.25.2"
258 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" 240 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a"
259 integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== 241 integrity sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==
260 dependencies: 242 dependencies:
261 "@babel/helper-annotate-as-pure" "^7.18.6" 243 "@babel/helper-annotate-as-pure" "^7.24.7"
262 "@babel/helper-module-imports" "^7.18.6" 244 "@babel/helper-module-imports" "^7.24.7"
263 "@babel/helper-plugin-utils" "^7.19.0" 245 "@babel/helper-plugin-utils" "^7.24.8"
264 "@babel/plugin-syntax-jsx" "^7.18.6" 246 "@babel/plugin-syntax-jsx" "^7.24.7"
265 "@babel/types" "^7.19.0" 247 "@babel/types" "^7.25.2"
266 248
267"@babel/plugin-transform-runtime@^7.2.0": 249"@babel/plugin-transform-runtime@^7.2.0":
268 version "7.19.6" 250 version "7.25.4"
269 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" 251 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz#96e4ad7bfbbe0b4a7b7e6f2a533ca326cf204963"
270 integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== 252 integrity sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ==
271 dependencies: 253 dependencies:
272 "@babel/helper-module-imports" "^7.18.6" 254 "@babel/helper-module-imports" "^7.24.7"
273 "@babel/helper-plugin-utils" "^7.19.0" 255 "@babel/helper-plugin-utils" "^7.24.8"
274 babel-plugin-polyfill-corejs2 "^0.3.3" 256 babel-plugin-polyfill-corejs2 "^0.4.10"
275 babel-plugin-polyfill-corejs3 "^0.6.0" 257 babel-plugin-polyfill-corejs3 "^0.10.6"
276 babel-plugin-polyfill-regenerator "^0.4.1" 258 babel-plugin-polyfill-regenerator "^0.6.1"
277 semver "^6.3.0" 259 semver "^6.3.1"
278 260
279"@babel/runtime@^7.10.2", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": 261"@babel/runtime@^7.20.13", "@babel/runtime@^7.21.0", "@babel/runtime@^7.24.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7":
280 version "7.20.1" 262 version "7.25.6"
281 resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" 263 resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2"
282 integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== 264 integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==
283 dependencies: 265 dependencies:
284 regenerator-runtime "^0.13.10" 266 regenerator-runtime "^0.14.0"
285 267
286"@babel/template@^7.18.10": 268"@babel/template@^7.25.0":
287 version "7.18.10" 269 version "7.25.0"
288 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" 270 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a"
289 integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== 271 integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==
290 dependencies: 272 dependencies:
291 "@babel/code-frame" "^7.18.6" 273 "@babel/code-frame" "^7.24.7"
292 "@babel/parser" "^7.18.10" 274 "@babel/parser" "^7.25.0"
293 "@babel/types" "^7.18.10" 275 "@babel/types" "^7.25.0"
294 276
295"@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1": 277"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.4":
296 version "7.20.1" 278 version "7.25.6"
297 resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" 279 resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41"
298 integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== 280 integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==
299 dependencies: 281 dependencies:
300 "@babel/code-frame" "^7.18.6" 282 "@babel/code-frame" "^7.24.7"
301 "@babel/generator" "^7.20.1" 283 "@babel/generator" "^7.25.6"
302 "@babel/helper-environment-visitor" "^7.18.9" 284 "@babel/parser" "^7.25.6"
303 "@babel/helper-function-name" "^7.19.0" 285 "@babel/template" "^7.25.0"
304 "@babel/helper-hoist-variables" "^7.18.6" 286 "@babel/types" "^7.25.6"
305 "@babel/helper-split-export-declaration" "^7.18.6" 287 debug "^4.3.1"
306 "@babel/parser" "^7.20.1"
307 "@babel/types" "^7.20.0"
308 debug "^4.1.0"
309 globals "^11.1.0" 288 globals "^11.1.0"
310 289
311"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2": 290"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6":
312 version "7.20.2" 291 version "7.25.6"
313 resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" 292 resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6"
314 integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== 293 integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==
315 dependencies: 294 dependencies:
316 "@babel/helper-string-parser" "^7.19.4" 295 "@babel/helper-string-parser" "^7.24.8"
317 "@babel/helper-validator-identifier" "^7.19.1" 296 "@babel/helper-validator-identifier" "^7.24.7"
318 to-fast-properties "^2.0.0" 297 to-fast-properties "^2.0.0"
319 298
320"@esbuild/linux-loong64@0.14.54": 299"@esbuild/linux-loong64@0.14.54":
@@ -322,78 +301,70 @@
322 resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" 301 resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
323 integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== 302 integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
324 303
325"@jridgewell/gen-mapping@^0.1.0": 304"@jridgewell/gen-mapping@^0.3.5":
326 version "0.1.1" 305 version "0.3.5"
327 resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" 306 resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
328 integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== 307 integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
329 dependencies:
330 "@jridgewell/set-array" "^1.0.0"
331 "@jridgewell/sourcemap-codec" "^1.4.10"
332
333"@jridgewell/gen-mapping@^0.3.2":
334 version "0.3.2"
335 resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
336 integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
337 dependencies: 308 dependencies:
338 "@jridgewell/set-array" "^1.0.1" 309 "@jridgewell/set-array" "^1.2.1"
339 "@jridgewell/sourcemap-codec" "^1.4.10" 310 "@jridgewell/sourcemap-codec" "^1.4.10"
340 "@jridgewell/trace-mapping" "^0.3.9" 311 "@jridgewell/trace-mapping" "^0.3.24"
341 312
342"@jridgewell/resolve-uri@3.1.0": 313"@jridgewell/resolve-uri@^3.1.0":
343 version "3.1.0" 314 version "3.1.2"
344 resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 315 resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
345 integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 316 integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
346 317
347"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": 318"@jridgewell/set-array@^1.2.1":
348 version "1.1.2" 319 version "1.2.1"
349 resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 320 resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
350 integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 321 integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
351 322
352"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": 323"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
353 version "1.4.14" 324 version "1.5.0"
354 resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 325 resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
355 integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 326 integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
356 327
357"@jridgewell/trace-mapping@^0.3.9": 328"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
358 version "0.3.17" 329 version "0.3.25"
359 resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" 330 resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
360 integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== 331 integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
361 dependencies: 332 dependencies:
362 "@jridgewell/resolve-uri" "3.1.0" 333 "@jridgewell/resolve-uri" "^3.1.0"
363 "@jridgewell/sourcemap-codec" "1.4.14" 334 "@jridgewell/sourcemap-codec" "^1.4.14"
364 335
365"@popperjs/core@^2.11.5": 336"@popperjs/core@^2.11.6":
366 version "2.11.6" 337 version "2.11.8"
367 resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" 338 resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
368 integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== 339 integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
369 340
370"@react-aria/ssr@^3.2.0": 341"@react-aria/ssr@^3.5.0":
371 version "3.4.0" 342 version "3.9.5"
372 resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.4.0.tgz#a2b9a170214f56e41d3c4c933d0d8fcffa07a12a" 343 resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.5.tgz#775d84f51f90934ff51ae74eeba3728daac1a381"
373 integrity sha512-qzuGk14/fUyUAoW/EBwgFcuMkVNXJVGlezTgZ1HovpCZ+p9844E7MUFHE7CuzFzPEIkVeqhBNIoIu+VJJ8YCOA== 344 integrity sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==
374 dependencies: 345 dependencies:
375 "@babel/runtime" "^7.6.2" 346 "@swc/helpers" "^0.5.0"
376 347
377"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": 348"@restart/hooks@^0.4.9":
378 version "0.4.7" 349 version "0.4.16"
379 resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39" 350 resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb"
380 integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== 351 integrity sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==
381 dependencies: 352 dependencies:
382 dequal "^2.0.2" 353 dequal "^2.0.3"
383 354
384"@restart/ui@^1.4.1": 355"@restart/ui@^1.6.9":
385 version "1.4.1" 356 version "1.8.0"
386 resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.4.1.tgz#c9057915f0708c411824eeb16c03d0108c0208d2" 357 resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.8.0.tgz#3e8d80822b5fbef0576f94acda51d7da9e79e005"
387 integrity sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A== 358 integrity sha512-xJEOXUOTmT4FngTmhdjKFRrVVF0hwCLNPdatLCHkyS4dkiSK12cEu1Y0fjxktjJrdst9jJIc5J6ihMJCoWEN/g==
388 dependencies: 359 dependencies:
389 "@babel/runtime" "^7.18.3" 360 "@babel/runtime" "^7.21.0"
390 "@popperjs/core" "^2.11.5" 361 "@popperjs/core" "^2.11.6"
391 "@react-aria/ssr" "^3.2.0" 362 "@react-aria/ssr" "^3.5.0"
392 "@restart/hooks" "^0.4.7" 363 "@restart/hooks" "^0.4.9"
393 "@types/warning" "^3.0.0" 364 "@types/warning" "^3.0.0"
394 dequal "^2.0.2" 365 dequal "^2.0.3"
395 dom-helpers "^5.2.0" 366 dom-helpers "^5.2.0"
396 uncontrollable "^7.2.1" 367 uncontrollable "^8.0.1"
397 warning "^4.0.3" 368 warning "^4.0.3"
398 369
399"@rollup/pluginutils@^4.2.1": 370"@rollup/pluginutils@^4.2.1":
@@ -404,52 +375,58 @@
404 estree-walker "^2.0.1" 375 estree-walker "^2.0.1"
405 picomatch "^2.2.2" 376 picomatch "^2.2.2"
406 377
378"@swc/helpers@^0.5.0":
379 version "0.5.12"
380 resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b"
381 integrity sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==
382 dependencies:
383 tslib "^2.4.0"
384
407"@types/prop-types@*": 385"@types/prop-types@*":
408 version "15.7.5" 386 version "15.7.12"
409 resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 387 resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
410 integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 388 integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
411 389
412"@types/react-dom@^16.9.7": 390"@types/react-dom@^16.9.7":
413 version "16.9.17" 391 version "16.9.24"
414 resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.17.tgz#29100cbcc422d7b7dba7de24bb906de56680dd34" 392 resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.24.tgz#4d193d7d011267fca842e8a10a2d738f92ec5c30"
415 integrity sha512-qSRyxEsrm5btPXnowDOs5jSkgT8ldAA0j6Qp+otHUh+xHzy3sXmgNfyhucZjAjkgpdAUw9rJe0QRtX/l+yaS4g== 393 integrity sha512-Gcmq2JTDheyWn/1eteqyzzWKSqDjYU6KYsIvH7thb7CR5OYInAWOX+7WnKf6PaU/cbdOc4szJItcDEJO7UGmfA==
416 dependencies: 394 dependencies:
417 "@types/react" "^16" 395 "@types/react" "^16"
418 396
419"@types/react-transition-group@^4.4.4": 397"@types/react-transition-group@^4.4.6":
420 version "4.4.5" 398 version "4.4.11"
421 resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" 399 resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.11.tgz#d963253a611d757de01ebb241143b1017d5d63d5"
422 integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== 400 integrity sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==
423 dependencies: 401 dependencies:
424 "@types/react" "*" 402 "@types/react" "*"
425 403
426"@types/react@*", "@types/react@>=16.9.11": 404"@types/react@*", "@types/react@>=16.9.11":
427 version "18.0.25" 405 version "18.3.5"
428 resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" 406 resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.5.tgz#5f524c2ad2089c0ff372bbdabc77ca2c4dbadf8f"
429 integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== 407 integrity sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==
430 dependencies: 408 dependencies:
431 "@types/prop-types" "*" 409 "@types/prop-types" "*"
432 "@types/scheduler" "*"
433 csstype "^3.0.2" 410 csstype "^3.0.2"
434 411
435"@types/react@^16", "@types/react@^16.9.34": 412"@types/react@^16", "@types/react@^16.9.34":
436 version "16.14.34" 413 version "16.14.60"
437 resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.34.tgz#d129324ffda312044e1c47aab18696e4ed493282" 414 resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.60.tgz#f7ab62a329b82826f12d02bc8031d4ef4b5e0d81"
438 integrity sha512-b99nWeGGReLh6aKBppghVqp93dFJtgtDOzc8NXM6hewD8PQ2zZG5kBLgbx+VJr7Q7WBMjHxaIl3dwpwwPIUgyA== 415 integrity sha512-wIFmnczGsTcgwCBeIYOuy2mdXEiKZ5znU/jNOnMZPQyCcIxauMGWlX0TNG4lZ7NxRKj7YUIZRneJQSSdB2jKgg==
439 dependencies: 416 dependencies:
440 "@types/prop-types" "*" 417 "@types/prop-types" "*"
441 "@types/scheduler" "*" 418 "@types/scheduler" "^0.16"
442 csstype "^3.0.2" 419 csstype "^3.0.2"
443 420
444"@types/scheduler@*": 421"@types/scheduler@^0.16":
445 version "0.16.2" 422 version "0.16.8"
446 resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" 423 resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff"
447 integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 424 integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==
448 425
449"@types/warning@^3.0.0": 426"@types/warning@^3.0.0":
450 version "3.0.0" 427 version "3.0.3"
451 resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" 428 resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798"
452 integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA== 429 integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==
453 430
454"@vitejs/plugin-react@^1.2.0": 431"@vitejs/plugin-react@^1.2.0":
455 version "1.3.2" 432 version "1.3.2"
@@ -473,9 +450,9 @@ ansi-styles@^3.2.1:
473 color-convert "^1.9.0" 450 color-convert "^1.9.0"
474 451
475anymatch@~3.1.2: 452anymatch@~3.1.2:
476 version "3.1.2" 453 version "3.1.3"
477 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 454 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
478 integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 455 integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
479 dependencies: 456 dependencies:
480 normalize-path "^3.0.0" 457 normalize-path "^3.0.0"
481 picomatch "^2.0.4" 458 picomatch "^2.0.4"
@@ -485,29 +462,29 @@ asap@~2.0.3:
485 resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 462 resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
486 integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== 463 integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
487 464
488babel-plugin-polyfill-corejs2@^0.3.3: 465babel-plugin-polyfill-corejs2@^0.4.10:
489 version "0.3.3" 466 version "0.4.11"
490 resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" 467 resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33"
491 integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== 468 integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==
492 dependencies: 469 dependencies:
493 "@babel/compat-data" "^7.17.7" 470 "@babel/compat-data" "^7.22.6"
494 "@babel/helper-define-polyfill-provider" "^0.3.3" 471 "@babel/helper-define-polyfill-provider" "^0.6.2"
495 semver "^6.1.1" 472 semver "^6.3.1"
496 473
497babel-plugin-polyfill-corejs3@^0.6.0: 474babel-plugin-polyfill-corejs3@^0.10.6:
498 version "0.6.0" 475 version "0.10.6"
499 resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" 476 resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7"
500 integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== 477 integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==
501 dependencies: 478 dependencies:
502 "@babel/helper-define-polyfill-provider" "^0.3.3" 479 "@babel/helper-define-polyfill-provider" "^0.6.2"
503 core-js-compat "^3.25.1" 480 core-js-compat "^3.38.0"
504 481
505babel-plugin-polyfill-regenerator@^0.4.1: 482babel-plugin-polyfill-regenerator@^0.6.1:
506 version "0.4.1" 483 version "0.6.2"
507 resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" 484 resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e"
508 integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== 485 integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==
509 dependencies: 486 dependencies:
510 "@babel/helper-define-polyfill-provider" "^0.3.3" 487 "@babel/helper-define-polyfill-provider" "^0.6.2"
511 488
512babel-preset-nano-react-app@^0.1.0: 489babel-preset-nano-react-app@^0.1.0:
513 version "0.1.0" 490 version "0.1.0"
@@ -524,9 +501,9 @@ base16@^1.0.0:
524 integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== 501 integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==
525 502
526binary-extensions@^2.0.0: 503binary-extensions@^2.0.0:
527 version "2.2.0" 504 version "2.3.0"
528 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 505 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
529 integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 506 integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
530 507
531bootstrap-darkmode@5.0.0-beta.1: 508bootstrap-darkmode@5.0.0-beta.1:
532 version "5.0.0-beta.1" 509 version "5.0.0-beta.1"
@@ -536,38 +513,38 @@ bootstrap-darkmode@5.0.0-beta.1:
536 tslib "^2.3.1" 513 tslib "^2.3.1"
537 514
538bootstrap-icons@^1.7.2: 515bootstrap-icons@^1.7.2:
539 version "1.10.2" 516 version "1.11.3"
540 resolved "https://registry.yarnpkg.com/bootstrap-icons/-/bootstrap-icons-1.10.2.tgz#6a5729e0475e007ed82d752225645e4e6fec48d7" 517 resolved "https://registry.yarnpkg.com/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz#03f9cb754ec005c52f9ee616e2e84a82cab3084b"
541 integrity sha512-PTPYadRn1AMGr+QTSxe4ZCc+Wzv9DGZxbi3lNse/dajqV31n2/wl/7NX78ZpkvFgRNmH4ogdIQPQmxAfhEV6nA== 518 integrity sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==
542 519
543bootstrap@^5.1.3: 520bootstrap@^5.1.3:
544 version "5.2.2" 521 version "5.3.3"
545 resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.2.2.tgz#834e053eed584a65e244d8aa112a6959f56e27a0" 522 resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38"
546 integrity sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ== 523 integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==
547 524
548braces@~3.0.2: 525braces@~3.0.2:
549 version "3.0.2" 526 version "3.0.3"
550 resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 527 resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
551 integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 528 integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
552 dependencies: 529 dependencies:
553 fill-range "^7.0.1" 530 fill-range "^7.1.1"
554 531
555browserslist@^4.21.3, browserslist@^4.21.4: 532browserslist@^4.23.1, browserslist@^4.23.3:
556 version "4.21.4" 533 version "4.23.3"
557 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" 534 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800"
558 integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== 535 integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==
559 dependencies: 536 dependencies:
560 caniuse-lite "^1.0.30001400" 537 caniuse-lite "^1.0.30001646"
561 electron-to-chromium "^1.4.251" 538 electron-to-chromium "^1.5.4"
562 node-releases "^2.0.6" 539 node-releases "^2.0.18"
563 update-browserslist-db "^1.0.9" 540 update-browserslist-db "^1.1.0"
564 541
565caniuse-lite@^1.0.30001400: 542caniuse-lite@^1.0.30001646:
566 version "1.0.30001431" 543 version "1.0.30001655"
567 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" 544 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f"
568 integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== 545 integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==
569 546
570chalk@^2.0.0: 547chalk@^2.4.2:
571 version "2.4.2" 548 version "2.4.2"
572 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 549 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
573 integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 550 integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -577,9 +554,9 @@ chalk@^2.0.0:
577 supports-color "^5.3.0" 554 supports-color "^5.3.0"
578 555
579"chokidar@>=3.0.0 <4.0.0": 556"chokidar@>=3.0.0 <4.0.0":
580 version "3.5.3" 557 version "3.6.0"
581 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 558 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
582 integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 559 integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
583 dependencies: 560 dependencies:
584 anymatch "~3.1.2" 561 anymatch "~3.1.2"
585 braces "~3.0.2" 562 braces "~3.0.2"
@@ -591,10 +568,10 @@ chalk@^2.0.0:
591 optionalDependencies: 568 optionalDependencies:
592 fsevents "~2.3.2" 569 fsevents "~2.3.2"
593 570
594classnames@^2.3.1: 571classnames@^2.3.1, classnames@^2.3.2:
595 version "2.3.2" 572 version "2.5.1"
596 resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" 573 resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
597 integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== 574 integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
598 575
599color-convert@^1.9.0: 576color-convert@^1.9.0:
600 version "1.9.3" 577 version "1.9.3"
@@ -608,43 +585,43 @@ color-name@1.1.3:
608 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 585 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
609 integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 586 integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
610 587
611convert-source-map@^1.7.0: 588convert-source-map@^2.0.0:
612 version "1.9.0" 589 version "2.0.0"
613 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" 590 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
614 integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== 591 integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
615 592
616core-js-compat@^3.25.1: 593core-js-compat@^3.38.0:
617 version "3.26.1" 594 version "3.38.1"
618 resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" 595 resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09"
619 integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== 596 integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==
620 dependencies: 597 dependencies:
621 browserslist "^4.21.4" 598 browserslist "^4.23.3"
622 599
623cross-fetch@^3.1.5: 600cross-fetch@^3.1.5:
624 version "3.1.5" 601 version "3.1.8"
625 resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" 602 resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82"
626 integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== 603 integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==
627 dependencies: 604 dependencies:
628 node-fetch "2.6.7" 605 node-fetch "^2.6.12"
629 606
630csstype@^3.0.2: 607csstype@^3.0.2:
631 version "3.1.1" 608 version "3.1.3"
632 resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" 609 resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
633 integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== 610 integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
634 611
635dayjs@^1.10.7: 612dayjs@^1.10.7:
636 version "1.11.6" 613 version "1.11.13"
637 resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.6.tgz#2e79a226314ec3ec904e3ee1dd5a4f5e5b1c7afb" 614 resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
638 integrity sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ== 615 integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
639 616
640debug@^4.1.0, debug@^4.1.1: 617debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
641 version "4.3.4" 618 version "4.3.6"
642 resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 619 resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b"
643 integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 620 integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
644 dependencies: 621 dependencies:
645 ms "2.1.2" 622 ms "2.1.2"
646 623
647dequal@^2.0.2: 624dequal@^2.0.3:
648 version "2.0.3" 625 version "2.0.3"
649 resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" 626 resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
650 integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== 627 integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
@@ -657,10 +634,10 @@ dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1:
657 "@babel/runtime" "^7.8.7" 634 "@babel/runtime" "^7.8.7"
658 csstype "^3.0.2" 635 csstype "^3.0.2"
659 636
660electron-to-chromium@^1.4.251: 637electron-to-chromium@^1.5.4:
661 version "1.4.284" 638 version "1.5.13"
662 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" 639 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6"
663 integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== 640 integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==
664 641
665esbuild-android-64@0.14.54: 642esbuild-android-64@0.14.54:
666 version "0.14.54" 643 version "0.14.54"
@@ -789,10 +766,10 @@ esbuild@^0.14.27:
789 esbuild-windows-64 "0.14.54" 766 esbuild-windows-64 "0.14.54"
790 esbuild-windows-arm64 "0.14.54" 767 esbuild-windows-arm64 "0.14.54"
791 768
792escalade@^3.1.1: 769escalade@^3.1.2:
793 version "3.1.1" 770 version "3.2.0"
794 resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 771 resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
795 integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 772 integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
796 773
797escape-string-regexp@^1.0.5: 774escape-string-regexp@^1.0.5:
798 version "1.0.5" 775 version "1.0.5"
@@ -817,9 +794,9 @@ fbjs-css-vars@^1.0.0:
817 integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== 794 integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==
818 795
819fbjs@^3.0.0, fbjs@^3.0.1: 796fbjs@^3.0.0, fbjs@^3.0.1:
820 version "3.0.4" 797 version "3.0.5"
821 resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" 798 resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d"
822 integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== 799 integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==
823 dependencies: 800 dependencies:
824 cross-fetch "^3.1.5" 801 cross-fetch "^3.1.5"
825 fbjs-css-vars "^1.0.0" 802 fbjs-css-vars "^1.0.0"
@@ -827,32 +804,32 @@ fbjs@^3.0.0, fbjs@^3.0.1:
827 object-assign "^4.1.0" 804 object-assign "^4.1.0"
828 promise "^7.1.1" 805 promise "^7.1.1"
829 setimmediate "^1.0.5" 806 setimmediate "^1.0.5"
830 ua-parser-js "^0.7.30" 807 ua-parser-js "^1.0.35"
831 808
832fill-range@^7.0.1: 809fill-range@^7.1.1:
833 version "7.0.1" 810 version "7.1.1"
834 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 811 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
835 integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 812 integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
836 dependencies: 813 dependencies:
837 to-regex-range "^5.0.1" 814 to-regex-range "^5.0.1"
838 815
839flux@^4.0.1: 816flux@^4.0.1:
840 version "4.0.3" 817 version "4.0.4"
841 resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" 818 resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.4.tgz#9661182ea81d161ee1a6a6af10d20485ef2ac572"
842 integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== 819 integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==
843 dependencies: 820 dependencies:
844 fbemitter "^3.0.0" 821 fbemitter "^3.0.0"
845 fbjs "^3.0.1" 822 fbjs "^3.0.1"
846 823
847fsevents@~2.3.2: 824fsevents@~2.3.2:
848 version "2.3.2" 825 version "2.3.3"
849 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 826 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
850 integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 827 integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
851 828
852function-bind@^1.1.1: 829function-bind@^1.1.2:
853 version "1.1.1" 830 version "1.1.2"
854 resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 831 resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
855 integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 832 integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
856 833
857gensync@^1.0.0-beta.2: 834gensync@^1.0.0-beta.2:
858 version "1.0.0-beta.2" 835 version "1.0.0-beta.2"
@@ -876,17 +853,17 @@ has-flag@^3.0.0:
876 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 853 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
877 integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 854 integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
878 855
879has@^1.0.3: 856hasown@^2.0.2:
880 version "1.0.3" 857 version "2.0.2"
881 resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 858 resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
882 integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 859 integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
883 dependencies: 860 dependencies:
884 function-bind "^1.1.1" 861 function-bind "^1.1.2"
885 862
886immutable@^4.0.0: 863immutable@^4.0.0:
887 version "4.1.0" 864 version "4.3.7"
888 resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" 865 resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381"
889 integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== 866 integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==
890 867
891invariant@^2.2.4: 868invariant@^2.2.4:
892 version "2.2.4" 869 version "2.2.4"
@@ -902,12 +879,12 @@ is-binary-path@~2.1.0:
902 dependencies: 879 dependencies:
903 binary-extensions "^2.0.0" 880 binary-extensions "^2.0.0"
904 881
905is-core-module@^2.9.0: 882is-core-module@^2.13.0:
906 version "2.11.0" 883 version "2.15.1"
907 resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" 884 resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
908 integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== 885 integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
909 dependencies: 886 dependencies:
910 has "^1.0.3" 887 hasown "^2.0.2"
911 888
912is-extglob@^2.1.1: 889is-extglob@^2.1.1:
913 version "2.1.1" 890 version "2.1.1"
@@ -936,10 +913,10 @@ jsesc@^2.5.1:
936 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 913 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
937 integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 914 integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
938 915
939json5@^2.2.1: 916json5@^2.2.3:
940 version "2.2.1" 917 version "2.2.3"
941 resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" 918 resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
942 integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== 919 integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
943 920
944lodash.curry@^4.0.1: 921lodash.curry@^4.0.1:
945 version "4.1.1" 922 version "4.1.1"
@@ -963,27 +940,34 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
963 dependencies: 940 dependencies:
964 js-tokens "^3.0.0 || ^4.0.0" 941 js-tokens "^3.0.0 || ^4.0.0"
965 942
943lru-cache@^5.1.1:
944 version "5.1.1"
945 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
946 integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
947 dependencies:
948 yallist "^3.0.2"
949
966ms@2.1.2: 950ms@2.1.2:
967 version "2.1.2" 951 version "2.1.2"
968 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 952 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
969 integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 953 integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
970 954
971nanoid@^3.3.4: 955nanoid@^3.3.7:
972 version "3.3.4" 956 version "3.3.7"
973 resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 957 resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
974 integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 958 integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
975 959
976node-fetch@2.6.7: 960node-fetch@^2.6.12:
977 version "2.6.7" 961 version "2.7.0"
978 resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" 962 resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
979 integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== 963 integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
980 dependencies: 964 dependencies:
981 whatwg-url "^5.0.0" 965 whatwg-url "^5.0.0"
982 966
983node-releases@^2.0.6: 967node-releases@^2.0.18:
984 version "2.0.6" 968 version "2.0.18"
985 resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" 969 resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
986 integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== 970 integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
987 971
988normalize-path@^3.0.0, normalize-path@~3.0.0: 972normalize-path@^3.0.0, normalize-path@~3.0.0:
989 version "3.0.0" 973 version "3.0.0"
@@ -1000,10 +984,10 @@ path-parse@^1.0.7:
1000 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 984 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
1001 integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 985 integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
1002 986
1003picocolors@^1.0.0: 987picocolors@^1.0.0, picocolors@^1.0.1:
1004 version "1.0.0" 988 version "1.0.1"
1005 resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 989 resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
1006 integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 990 integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
1007 991
1008picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: 992picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2:
1009 version "2.3.1" 993 version "2.3.1"
@@ -1011,13 +995,13 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2:
1011 integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 995 integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
1012 996
1013postcss@^8.4.13: 997postcss@^8.4.13:
1014 version "8.4.19" 998 version "8.4.41"
1015 resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" 999 resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681"
1016 integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== 1000 integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==
1017 dependencies: 1001 dependencies:
1018 nanoid "^3.3.4" 1002 nanoid "^3.3.7"
1019 picocolors "^1.0.0" 1003 picocolors "^1.0.1"
1020 source-map-js "^1.0.2" 1004 source-map-js "^1.2.0"
1021 1005
1022promise@^7.1.1: 1006promise@^7.1.1:
1023 version "7.3.1" 1007 version "7.3.1"
@@ -1059,20 +1043,20 @@ react-base16-styling@^0.6.0:
1059 pure-color "^1.2.0" 1043 pure-color "^1.2.0"
1060 1044
1061react-bootstrap@^2.1.1: 1045react-bootstrap@^2.1.1:
1062 version "2.6.0" 1046 version "2.10.4"
1063 resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.6.0.tgz#bd125889cc9d2bbd7c89334a7c54980ff0a65b94" 1047 resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.4.tgz#ed92f5f8225a44919a7707829bac879558b71b70"
1064 integrity sha512-WnDgN6PR8WZKo2Og5J8EafFi4BsABjc96lNuMNfksrgiPDCw18/woWQCNhAeHFZQWTQ/PijkOrQ9ncTWwO//AA== 1048 integrity sha512-W3398nBM2CBfmGP2evneEO3ZZwEMPtHs72q++eNw60uDGDAdiGn0f9yNys91eo7/y8CTF5Ke1C0QO8JFVPU40Q==
1065 dependencies: 1049 dependencies:
1066 "@babel/runtime" "^7.17.2" 1050 "@babel/runtime" "^7.24.7"
1067 "@restart/hooks" "^0.4.6" 1051 "@restart/hooks" "^0.4.9"
1068 "@restart/ui" "^1.4.1" 1052 "@restart/ui" "^1.6.9"
1069 "@types/react-transition-group" "^4.4.4" 1053 "@types/react-transition-group" "^4.4.6"
1070 classnames "^2.3.1" 1054 classnames "^2.3.2"
1071 dom-helpers "^5.2.1" 1055 dom-helpers "^5.2.1"
1072 invariant "^2.2.4" 1056 invariant "^2.2.4"
1073 prop-types "^15.8.1" 1057 prop-types "^15.8.1"
1074 prop-types-extra "^1.1.0" 1058 prop-types-extra "^1.1.0"
1075 react-transition-group "^4.4.2" 1059 react-transition-group "^4.4.5"
1076 uncontrollable "^7.2.1" 1060 uncontrollable "^7.2.1"
1077 warning "^4.0.3" 1061 warning "^4.0.3"
1078 1062
@@ -1111,15 +1095,15 @@ react-refresh@^0.13.0:
1111 integrity sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg== 1095 integrity sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==
1112 1096
1113react-textarea-autosize@^8.3.2: 1097react-textarea-autosize@^8.3.2:
1114 version "8.4.0" 1098 version "8.5.3"
1115 resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.4.0.tgz#4d0244d6a50caa897806b8c44abc0540a69bfc8c" 1099 resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409"
1116 integrity sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ== 1100 integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==
1117 dependencies: 1101 dependencies:
1118 "@babel/runtime" "^7.10.2" 1102 "@babel/runtime" "^7.20.13"
1119 use-composed-ref "^1.3.0" 1103 use-composed-ref "^1.3.0"
1120 use-latest "^1.2.1" 1104 use-latest "^1.2.1"
1121 1105
1122react-transition-group@^4.4.2: 1106react-transition-group@^4.4.5:
1123 version "4.4.5" 1107 version "4.4.5"
1124 resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" 1108 resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
1125 integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== 1109 integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
@@ -1144,17 +1128,17 @@ readdirp@~3.6.0:
1144 dependencies: 1128 dependencies:
1145 picomatch "^2.2.1" 1129 picomatch "^2.2.1"
1146 1130
1147regenerator-runtime@^0.13.10: 1131regenerator-runtime@^0.14.0:
1148 version "0.13.11" 1132 version "0.14.1"
1149 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" 1133 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
1150 integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== 1134 integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
1151 1135
1152resolve@^1.14.2, resolve@^1.22.0: 1136resolve@^1.14.2, resolve@^1.22.0:
1153 version "1.22.1" 1137 version "1.22.8"
1154 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 1138 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
1155 integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 1139 integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
1156 dependencies: 1140 dependencies:
1157 is-core-module "^2.9.0" 1141 is-core-module "^2.13.0"
1158 path-parse "^1.0.7" 1142 path-parse "^1.0.7"
1159 supports-preserve-symlinks-flag "^1.0.0" 1143 supports-preserve-symlinks-flag "^1.0.0"
1160 1144
@@ -1166,9 +1150,9 @@ resolve@^1.14.2, resolve@^1.22.0:
1166 fsevents "~2.3.2" 1150 fsevents "~2.3.2"
1167 1151
1168sass@^1.45.2: 1152sass@^1.45.2:
1169 version "1.56.1" 1153 version "1.77.8"
1170 resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7" 1154 resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.8.tgz#9f18b449ea401759ef7ec1752a16373e296b52bd"
1171 integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ== 1155 integrity sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==
1172 dependencies: 1156 dependencies:
1173 chokidar ">=3.0.0 <4.0.0" 1157 chokidar ">=3.0.0 <4.0.0"
1174 immutable "^4.0.0" 1158 immutable "^4.0.0"
@@ -1182,20 +1166,20 @@ scheduler@^0.20.2:
1182 loose-envify "^1.1.0" 1166 loose-envify "^1.1.0"
1183 object-assign "^4.1.1" 1167 object-assign "^4.1.1"
1184 1168
1185semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: 1169semver@^6.3.1:
1186 version "6.3.0" 1170 version "6.3.1"
1187 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1171 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
1188 integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1172 integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
1189 1173
1190setimmediate@^1.0.5: 1174setimmediate@^1.0.5:
1191 version "1.0.5" 1175 version "1.0.5"
1192 resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1176 resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
1193 integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 1177 integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
1194 1178
1195"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: 1179"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0:
1196 version "1.0.2" 1180 version "1.2.0"
1197 resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1181 resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
1198 integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1182 integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
1199 1183
1200supports-color@^5.3.0: 1184supports-color@^5.3.0:
1201 version "5.5.0" 1185 version "5.5.0"
@@ -1226,20 +1210,20 @@ tr46@~0.0.3:
1226 resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1210 resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
1227 integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 1211 integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
1228 1212
1229tslib@^2.3.1: 1213tslib@^2.3.1, tslib@^2.4.0:
1230 version "2.4.1" 1214 version "2.7.0"
1231 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" 1215 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
1232 integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== 1216 integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
1233 1217
1234typescript@^3.8.3: 1218typescript@^3.8.3:
1235 version "3.9.10" 1219 version "3.9.10"
1236 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" 1220 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8"
1237 integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== 1221 integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==
1238 1222
1239ua-parser-js@^0.7.30: 1223ua-parser-js@^1.0.35:
1240 version "0.7.32" 1224 version "1.0.38"
1241 resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.32.tgz#cd8c639cdca949e30fa68c44b7813ef13e36d211" 1225 resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.38.tgz#66bb0c4c0e322fe48edfe6d446df6042e62f25e2"
1242 integrity sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw== 1226 integrity sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==
1243 1227
1244uncontrollable@^7.2.1: 1228uncontrollable@^7.2.1:
1245 version "7.2.1" 1229 version "7.2.1"
@@ -1251,13 +1235,18 @@ uncontrollable@^7.2.1:
1251 invariant "^2.2.4" 1235 invariant "^2.2.4"
1252 react-lifecycles-compat "^3.0.4" 1236 react-lifecycles-compat "^3.0.4"
1253 1237
1254update-browserslist-db@^1.0.9: 1238uncontrollable@^8.0.1:
1255 version "1.0.10" 1239 version "8.0.4"
1256 resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" 1240 resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6"
1257 integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== 1241 integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==
1242
1243update-browserslist-db@^1.1.0:
1244 version "1.1.0"
1245 resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
1246 integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
1258 dependencies: 1247 dependencies:
1259 escalade "^3.1.1" 1248 escalade "^3.1.2"
1260 picocolors "^1.0.0" 1249 picocolors "^1.0.1"
1261 1250
1262use-composed-ref@^1.3.0: 1251use-composed-ref@^1.3.0:
1263 version "1.3.0" 1252 version "1.3.0"
@@ -1277,9 +1266,9 @@ use-latest@^1.2.1:
1277 use-isomorphic-layout-effect "^1.1.1" 1266 use-isomorphic-layout-effect "^1.1.1"
1278 1267
1279vite@^2.6.7: 1268vite@^2.6.7:
1280 version "2.9.15" 1269 version "2.9.18"
1281 resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.15.tgz#2858dd5b2be26aa394a283e62324281892546f0b" 1270 resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.18.tgz#74e2a83b29da81e602dac4c293312cc575f091c7"
1282 integrity sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ== 1271 integrity sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==
1283 dependencies: 1272 dependencies:
1284 esbuild "^0.14.27" 1273 esbuild "^0.14.27"
1285 postcss "^8.4.13" 1274 postcss "^8.4.13"
@@ -1307,3 +1296,8 @@ whatwg-url@^5.0.0:
1307 dependencies: 1296 dependencies:
1308 tr46 "~0.0.3" 1297 tr46 "~0.0.3"
1309 webidl-conversions "^3.0.0" 1298 webidl-conversions "^3.0.0"
1299
1300yallist@^3.0.2:
1301 version "3.1.1"
1302 resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
1303 integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==