From 39784e909c68f139bb537151294d8db56d021158 Mon Sep 17 00:00:00 2001
From: alyssaf16 <alyssa_feinberg@brown.edu>
Date: Wed, 12 Jun 2024 12:31:50 -0400
Subject: flashcard

---
 src/client/views/pdf/PDFViewer.tsx | 1 +
 1 file changed, 1 insertion(+)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 6c1617c38..92f890e70 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -425,6 +425,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         const sel = window.getSelection();
         if (sel) {
             AnchorMenu.Instance.setSelectedText(sel.toString());
+            AnchorMenu.Instance.setLocation(NumCast(this._props.layoutDoc['x']), NumCast(this._props.layoutDoc['y']));
         }
 
         if (sel?.type === 'Range') {
-- 
cgit v1.2.3-70-g09d2


From 91e465c9ba542b637e66c7091c444a44fdbe4f0c Mon Sep 17 00:00:00 2001
From: alyssaf16 <alyssa_feinberg@brown.edu>
Date: Thu, 13 Jun 2024 14:37:37 -0400
Subject: create flashcard stack and ui fixes

---
 .../views/collections/CollectionCarouselView.tsx   | 51 +++++++++---
 src/client/views/nodes/ComparisonBox.scss          |  8 +-
 src/client/views/nodes/ComparisonBox.tsx           | 90 +++++++++++++++-------
 src/client/views/pdf/AnchorMenu.tsx                | 13 +++-
 src/client/views/pdf/Annotation.scss               | 19 ++++-
 src/client/views/pdf/PDFViewer.tsx                 |  1 +
 6 files changed, 136 insertions(+), 46 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/collections/CollectionCarouselView.tsx b/src/client/views/collections/CollectionCarouselView.tsx
index b5b6e1f4b..f2d634eaa 100644
--- a/src/client/views/collections/CollectionCarouselView.tsx
+++ b/src/client/views/collections/CollectionCarouselView.tsx
@@ -21,6 +21,8 @@ import { FormattedTextBox } from '../nodes/formattedText/FormattedTextBox';
 import './CollectionCarouselView.scss';
 import { CollectionSubView } from './CollectionSubView';
 import { Tooltip } from '@mui/material';
+import { DocUtils } from '../../documents/DocUtils';
+import { Any } from '@react-spring/web';
 
 enum cardMode {
     // PRACTICE = 'practice',
@@ -49,7 +51,8 @@ export class CollectionCarouselView extends CollectionSubView() {
     constructor(props: any) {
         super(props);
         makeObservable(this);
-        // this.layoutDoc.filterOp = cardMode.ALL;
+        // this.setModes();
+        this.layoutDoc.filterOp = cardMode.ALL;
         Doc.setDocFilter(this.Document, 'data_star', undefined, 'match');
         this.layoutDoc.practiceMode = practiceMode.NORMAL;
         this.layoutDoc._carousel_index = 0;
@@ -67,6 +70,9 @@ export class CollectionCarouselView extends CollectionSubView() {
     };
 
     @computed get carouselItems() {
+        this.childLayoutPairs.map(pair => {
+            pair.layout.embedContainer = this.Document;
+        });
         return this.childLayoutPairs.filter(pair => pair.layout.type !== DocumentType.LINK);
     }
     @computed get marginX() {
@@ -80,6 +86,13 @@ export class CollectionCarouselView extends CollectionSubView() {
         this._filterMessage = mes;
     };
 
+    setModes = () => {
+        this.layoutDoc.filterOp = cardMode.ALL;
+        Doc.setDocFilter(this.Document, 'data_star', undefined, 'match');
+        this.layoutDoc.practiceMode = practiceMode.NORMAL;
+        this.layoutDoc._carousel_index = 0;
+    };
+
     move = (dir: number) => {
         const moveToCardWithField = (match: (doc: Doc) => boolean): boolean => {
             let startInd = (NumCast(this.layoutDoc._carousel_index) + dir) % this.carouselItems.length;
@@ -107,8 +120,8 @@ export class CollectionCarouselView extends CollectionSubView() {
                 break;
             case practiceMode.PRACTICE && cardMode.STAR:
                 if (!moveToCardWithField((doc: Doc) => doc[this.practiceField] !== practiceVal.CORRECT && doc[this.starField] === true)) {
-                    this._filterMessage = 'No flashcards to show! Unselect star mode to view all flashcards.';
-                    this._practiceMessage = 'Unselect practice mode to view all flashcards.';
+                    this._filterMessage = 'No flashcards to show! Unselect mode to view all flashcards.';
+                    this._practiceMessage = undefined;
                 }
                 break;
             default:
@@ -179,20 +192,24 @@ export class CollectionCarouselView extends CollectionSubView() {
         this.layoutDoc.filterOp = mode;
         switch (mode) {
             case cardMode.STAR:
-                Doc.setDocFilter(this.Document, 'data_star', true, 'match');
+                // Doc.setDocFilter(this.Document, 'data_star', true, 'match');
                 this.move(1);
                 break;
             default:
                 this.setFilterMessage(undefined); // prettier-ignore
-                Doc.setDocFilter(this.Document, 'data_star', true, 'remove');
+            // Doc.setDocFilter(this.Document, 'data_star', true, 'remove');
         }
     };
 
     @computed get content() {
+        if (this.layoutDoc._carousel_index === this.carouselItems.length && this.layoutDoc._carousel_index !== 0) {
+            this.move(1);
+        }
         const index = NumCast(this.layoutDoc._carousel_index);
         const curDoc = this.carouselItems?.[index];
         const captionProps = { ...this._props, NativeScaling: returnOne, PanelWidth: this.captionWidth, fieldKey: 'caption', setHeight: undefined, setContentView: undefined };
         const carouselShowsCaptions = StrCast(this.layoutDoc._layout_showCaption);
+
         return !(curDoc?.layout instanceof Doc) ? null : (
             <>
                 <div className="collectionCarouselView-image" key="image">
@@ -207,6 +224,7 @@ export class CollectionCarouselView extends CollectionSubView() {
                         onClickScript={this.onContentClick}
                         isDocumentActive={this._props.childDocumentsActive?.() ? this._props.isDocumentActive : this._props.isContentActive}
                         isContentActive={this._props.childContentsActive ?? this._props.isContentActive() === false ? returnFalse : emptyFunction}
+                        addDocument={this._props.addDocument}
                         hideCaptions={!!carouselShowsCaptions} // hide captions if the carousel is configured to show the captions
                         renderDepth={this._props.renderDepth + 1}
                         LayoutTemplate={this._props.childLayoutTemplate}
@@ -235,12 +253,21 @@ export class CollectionCarouselView extends CollectionSubView() {
     }
 
     containsDifTypes = (): boolean => {
-        return this.carouselItems.filter(doc => !doc.layout.isFlashcard).length === 0;
+        return this.carouselItems.filter(doc => !doc.layout._layout_isFlashcard).length !== 0;
     };
 
     addFlashcard() {
         const newDoc = Docs.Create.ComparisonDocument('', { _layout_isFlashcard: true, _width: 300, _height: 300 });
         this.addDocument?.(newDoc);
+        // DocUtils.copyDragFactory(newDoc);
+        // this._props.addDocument?.();
+        // newDoc.layout = this.layoutDoc;
+        // newDoc.data = this.dataDoc;
+        // Doc.AddDocToList()
+        // this._props.parent._props.addDocument();
+        // this.childLayoutPairs.push({ newDoc.layout, newDoc.data});
+        // this._props.addDocument?.(newDoc);
+        // console.log('HERE');
     }
 
     @computed get buttons() {
@@ -260,11 +287,11 @@ export class CollectionCarouselView extends CollectionSubView() {
                                 <FontAwesomeIcon icon="star" color={this.carouselItems?.[NumCast(this.layoutDoc._carousel_index)].layout[this.starField] ? 'yellow' : 'gray'} size="1x" />
                             </div>
                         </Tooltip>
-                        <Tooltip title="add new flashcard to pile">
+                        {/* <Tooltip title="add new flashcard to pile">
                             <div key="add" className="carouselView-add" onClick={this.addFlashcard}>
                                 <FontAwesomeIcon icon="plus" color={this.carouselItems?.[NumCast(this.layoutDoc._carousel_index)].layout[this.starField] ? 'yellow' : 'gray'} size="1x" />
                             </div>
-                        </Tooltip>
+                        </Tooltip> */}
                     </div>
                 ) : null}
                 {this.layoutDoc.practiceMode === practiceMode.PRACTICE ? (
@@ -286,8 +313,10 @@ export class CollectionCarouselView extends CollectionSubView() {
     }
 
     togglePracticeMode = (mode: practiceMode) => {
-        if (mode === this.layoutDoc.practiceMode) this.setPracticeMode(practiceMode.NORMAL);
-        else this.setPracticeMode(mode);
+        if (mode === this.layoutDoc.practiceMode) {
+            this.setPracticeMode(practiceMode.NORMAL);
+            // this.setPracticeMessage("undefined");
+        } else this.setPracticeMode(mode);
     };
     toggleFilterMode = () => { this.layoutDoc.filterOp === cardMode.STAR ? this.setFilterMode(cardMode.ALL) : this.setFilterMode(cardMode.STAR)}; //prettier-ignore
     setColor = (mode: practiceMode | cardMode, which: string) => { return which === mode ? 'white' : 'light gray'}; //prettier-ignore
@@ -351,7 +380,7 @@ export class CollectionCarouselView extends CollectionSubView() {
                     }}>
                     Recently missed!
                 </p>
-                {!this.containsDifTypes() ? this.menu : null}
+                {!this.containsDifTypes() && this.carouselItems.length !== 0 ? this.menu : null}
                 {this.Document._chromeHidden || (!this._filterMessage && !this._practiceMessage) ? this.buttons : null}
             </div>
         );
diff --git a/src/client/views/nodes/ComparisonBox.scss b/src/client/views/nodes/ComparisonBox.scss
index 0b2c356e5..f7389e39b 100644
--- a/src/client/views/nodes/ComparisonBox.scss
+++ b/src/client/views/nodes/ComparisonBox.scss
@@ -16,14 +16,15 @@
     }
     .input-box {
         position: absolute;
+        top: 50;
         padding: 10px;
         width: 100%;
-        height: 100%;
+        height: 70%;
         display: flex;
     }
 
     .submit-button {
-        position: relative;
+        position: absolute;
         padding-bottom: 10px;
         padding-left: 5px;
         padding-right: 5px;
@@ -31,6 +32,7 @@
         border-radius: 2px;
         height: 15%;
         display: flex;
+        bottom: 0;
 
         button {
             flex: 1;
@@ -149,7 +151,7 @@
     top: 10px;
     left: 10px;
     z-index: 200;
-    padding: 5px;
+    // padding: 5px;
     background: #dfdfdf;
 }
 
diff --git a/src/client/views/nodes/ComparisonBox.tsx b/src/client/views/nodes/ComparisonBox.tsx
index 9eb5f6ca2..2fc297bec 100644
--- a/src/client/views/nodes/ComparisonBox.tsx
+++ b/src/client/views/nodes/ComparisonBox.tsx
@@ -28,6 +28,7 @@ import ReactLoading from 'react-loading';
 import { ContextMenu } from '../ContextMenu';
 import { ContextMenuProps } from '../ContextMenuItem';
 import { tickStep } from 'd3';
+import { CollectionCarouselView } from '../collections/CollectionCarouselView';
 
 @observer
 export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
@@ -46,8 +47,6 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
     @observable private _isEmpty = false;
     @observable _yRelativeToTop: boolean = true;
 
-    public addToCollection: ((doc: Doc | Doc[], annotationKey?: string | undefined) => boolean) | undefined;
-
     @action handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
         this._inputValue = e.target.value;
         console.log(this._inputValue);
@@ -248,6 +247,41 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
 
     _closeRef = React.createRef<HTMLDivElement>();
 
+    createFlashcardPile(collectionArr: Doc[], gpt: boolean) {
+        const newCol = Docs.Create.CarouselDocument(collectionArr, {
+            _width: NumCast(this.layoutDoc['_' + this._props.fieldKey + '_width'], 250) + 50,
+            _height: NumCast(this.layoutDoc['_' + this._props.fieldKey + '_width'], 200) + 50,
+            _layout_fitWidth: false,
+            _layout_autoHeight: true,
+        });
+        newCol['x'] = this.layoutDoc['x'];
+        newCol['y'] = NumCast(this.layoutDoc['y']) + 50;
+        newCol.type_collection = 'carousel';
+        console.log(newCol.data);
+
+        if (gpt) {
+            this._props.DocumentView?.()._props.addDocument?.(newCol);
+            this._props.removeDocument?.(this.Document);
+        } else {
+            this._props.addDocument?.(newCol);
+            this._props.removeDocument?.(this.Document);
+            this.Document.embedContainer = newCol;
+        }
+    }
+
+    gptFlashcardPile = async () => {
+        var text = (await this.askGPT(GPTCallType.FLASHCARD)) || '';
+
+        var senArr = text.trim().split('Question: ');
+        var collectionArr: Doc[] = [];
+        for (let i = 1; i < senArr.length; i++) {
+            const newDoc = Docs.Create.ComparisonDocument(senArr[i].trim(), { _layout_isFlashcard: true, _width: 300, _height: 300 });
+            newDoc.text = senArr[i].trim();
+            collectionArr.push(newDoc);
+        }
+        this.createFlashcardPile(collectionArr, true);
+    };
+
     /**
      * Flips a flashcard to the alternate side for the user to view.
      */
@@ -305,35 +339,27 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
                             <div className="dash-tooltip">Ask GPT to create an answer on the back side of the flashcard based on your question on the front</div>
                         )
                     }>
-                    <div style={{ position: 'absolute', bottom: '3px', right: '56px', cursor: 'pointer' }} onPointerDown={e => (!this.layoutDoc[`_${this._props.fieldKey}_usePath`] ? this.askGPT(GPTCallType.CHATCARD) : null)}>
+                    <div style={{ position: 'absolute', bottom: '3px', right: '50px', cursor: 'pointer' }} onPointerDown={e => (!this.layoutDoc[`_${this._props.fieldKey}_usePath`] ? this.askGPT(GPTCallType.CHATCARD) : null)}>
                         <FontAwesomeIcon icon="lightbulb" size="xl" />
                     </div>
                 </Tooltip>
-                <Tooltip title={<div>Create a flashcard pile</div>}>
-                    <div
-                        style={{ position: 'absolute', bottom: '3px', right: '80px', cursor: 'pointer' }}
-                        onPointerDown={e => {
-                            // this.displayLabelHandler(e.target.value, e.clientY);
-                            const collectionArr: Doc[] = [];
-                            collectionArr.push(this.Document);
-                            const newCol = Docs.Create.CarouselDocument(collectionArr, {
-                                _width: NumCast(this.layoutDoc['_' + this._props.fieldKey + '_width'], 250) + 50,
-                                _height: NumCast(this.layoutDoc['_' + this._props.fieldKey + '_width'], 200) + 50,
-                                _layout_fitWidth: false,
-                                _layout_autoHeight: true,
-                            });
-                            newCol['x'] = this.layoutDoc['x'];
-                            newCol['y'] = NumCast(this.layoutDoc['y']) + 50;
-                            this._props.addDocument?.(newCol);
-                            this._props.removeDocument?.(this.Document);
-                            this.Document.embedContainer = newCol;
-                        }}>
-                        <FontAwesomeIcon icon="folder-plus" size="xl" />
+                {DocCast(this.Document.embedContainer).type_collection === 'carousel' ? null : (
+                    <div>
+                        <Tooltip title={<div>Create a flashcard pile</div>}>
+                            <div style={{ position: 'absolute', bottom: '3px', right: '74px', cursor: 'pointer' }} onPointerDown={e => this.createFlashcardPile([this.Document], false)}>
+                                <FontAwesomeIcon icon="folder-plus" size="xl" />
+                            </div>
+                        </Tooltip>
+                        <Tooltip title={<div className="dash-tooltip">Create new flashcard stack based on text</div>}>
+                            <div style={{ position: 'absolute', bottom: '3px', right: '104px', cursor: 'pointer' }} onClick={e => this.gptFlashcardPile()}>
+                                <FontAwesomeIcon icon="layer-group" size="xl" />
+                            </div>
+                        </Tooltip>
                     </div>
-                </Tooltip>
+                )}
                 <Tooltip title={<div className="dash-tooltip">Hover to reveal</div>}>
                     <div style={{ position: 'absolute', bottom: '3px', right: '25px', cursor: 'pointer' }} onClick={e => this.handleHover()}>
-                        <FontAwesomeIcon color={this.revealOp === 'hover' ? 'blue' : 'black'} icon="layer-group" size="xl" />
+                        <FontAwesomeIcon color={this.revealOp === 'hover' ? 'blue' : 'black'} icon="hand-point-up" size="xl" />
                     </div>
                 </Tooltip>
                 {/* <Tooltip title={<div className="dash-tooltip">Remove this side of the flashcard</div>}>
@@ -425,6 +451,12 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
             if (callType == GPTCallType.QUIZ) this._outputValue = res;
             // DocCast(this.dataDoc[this.props.fieldKey + '_0'])[DocData].text = res;
             // this._outputValue = res;
+
+            if (callType === GPTCallType.FLASHCARD) {
+                // console.log(res);
+                this._loading = false;
+                return res;
+            }
             console.log(res);
         } catch (err) {
             console.error('GPT call failed');
@@ -520,7 +552,7 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
                 // DocCast(this.dataDoc[this.fieldKey + '_0'])[DocData].text = dataSplit[1];
                 // DocCast(this.dataDoc[this.fieldKey + '_0']).text = dataSplit[1];
                 // console.log('HI' + DocCast(this.dataDoc[this.fieldKey + '_0']).text);
-                console.log('HEREEE' + StrCast(RTFCast(DocCast(this.dataDoc[this.fieldKey + '_0']).text)?.Text));
+                //console.log('HEREEE' + StrCast(RTFCast(DocCast(this.dataDoc[this.fieldKey + '_0']).text)?.Text));
             }
 
             if (!this.dataDoc[this.fieldKey + '_1'] && !this._isEmpty) {
@@ -545,7 +577,7 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
                 return (
                     <div className={`comparisonBox${this._props.isContentActive() ? '-interactive' : ''}`} style={{ display: 'flex', flexDirection: 'column' }}>
                         <p style={{ color: 'white', padding: 10 }}>{text}</p>
-                        <p style={{ display: text === '' ? 'flex' : 'none', color: 'white', padding: 10 }}>Return to all flashcards and add text to both sides. </p>
+                        <p style={{ display: text === '' ? 'flex' : 'none', color: 'white', marginLeft: '10px' }}>Return to all flashcards and add text to both sides. </p>
                         <div className="input-box">
                             <textarea
                                 value={this.layoutDoc[`_${this._props.fieldKey}_usePath`] === 'alternate' ? this._outputValue : this._inputValue}
@@ -574,7 +606,7 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
                 );
             }
 
-            console.log('HEREEE2' + StrCast(RTFCast(DocCast(this.dataDoc[this.fieldKey + '_1']).text)?.Text));
+            //console.log('HEREEE2' + StrCast(RTFCast(DocCast(this.dataDoc[this.fieldKey + '_1']).text)?.Text));
             // render a normal flashcard when not a QuizCard
             return (
                 <div
@@ -589,7 +621,7 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
                     }}
                     // onPointerUp={() => (this._isAnyChildContentActive = true)}
                 >
-                    {StrCast(RTFCast(DocCast(this.dataDoc[this.fieldKey + '_1']).text)?.Text) === '' && !this.childActive ? <p className="explain">Enter text in the flashcard. </p> : null}
+                    {!this.layoutDoc[`_${this._props.fieldKey}_usePath`] && StrCast(RTFCast(DocCast(this.dataDoc[this.fieldKey + '_1']).text)?.Text) === '' && !this.childActive ? <p className="explain">Enter text in the flashcard. </p> : null}
                     {displayBox(`${this.fieldKey}_${side === 0 ? 1 : 0}`, side, this._props.PanelWidth() - 3)}
                     {this._loading ? (
                         <div className="loading-spinner" style={{ position: 'absolute' }}>
diff --git a/src/client/views/pdf/AnchorMenu.tsx b/src/client/views/pdf/AnchorMenu.tsx
index cedd3c7c3..c1198b4f7 100644
--- a/src/client/views/pdf/AnchorMenu.tsx
+++ b/src/client/views/pdf/AnchorMenu.tsx
@@ -15,6 +15,7 @@ import { LinkPopup } from '../linking/LinkPopup';
 import { DocumentView } from '../nodes/DocumentView';
 import './AnchorMenu.scss';
 import { GPTPopup, GPTPopupMode } from './GPTPopup/GPTPopup';
+import ReactLoading from 'react-loading';
 
 @observer
 export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
@@ -24,6 +25,7 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
     private _disposer: IReactionDisposer | undefined;
     private _commentRef = React.createRef<HTMLDivElement>();
     private _cropRef = React.createRef<HTMLDivElement>();
+    @observable private _loading = false;
     // @observable protected _top: number = -300;
     // @observable protected _left: number = -300;
 
@@ -110,15 +112,16 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
      */
     gptFlashcards = async (e: React.PointerEvent) => {
         const queryText = this._selectedText;
+        this._loading = true;
         try {
             const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
             console.log(res);
-            GPTPopup.Instance.setText(res || 'Something went wrong.');
+            // GPTPopup.Instance.setText(res || 'Something went wrong.');
             this.transferToFlashcard(res || 'Something went wrong');
         } catch (err) {
             console.error(err);
         }
-        GPTPopup.Instance.setLoading(false);
+        // GPTPopup.Instance.setLoading(false);
     };
 
     /*
@@ -147,6 +150,7 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
         newCol.zIndex = 100;
 
         this.addToCollection?.(newCol);
+        this._loading = false;
     };
 
     pointerDown = (e: React.PointerEvent) => {
@@ -263,6 +267,11 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
                             />
                         </div>
                     )}
+                    {this._loading ? (
+                        <div className="loading-spinner" style={{ position: 'absolute' }}>
+                            <ReactLoading type="spin" height={30} width={30} color={'white'} />
+                        </div>
+                    ) : null}
                 </>
             ) : (
                 <>
diff --git a/src/client/views/pdf/Annotation.scss b/src/client/views/pdf/Annotation.scss
index 1de60ffed..329819ea2 100644
--- a/src/client/views/pdf/Annotation.scss
+++ b/src/client/views/pdf/Annotation.scss
@@ -7,4 +7,21 @@
     &:hover {
         cursor: pointer;
     }
-}
\ No newline at end of file
+}
+.loading-spinner {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 90%;
+    width: 93%;
+    left: 10;
+    font-size: 20px;
+    font-weight: bold;
+    color: #0b0a0a;
+}
+
+@keyframes spin {
+    to {
+        transform: rotate(360deg);
+    }
+}
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 92f890e70..af7a5774d 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -464,6 +464,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
             this._mainCont.current!.style.transform = '';
         }
         this._selectionContent = selRange.cloneContents();
+
         this._selectionText = this._selectionContent?.textContent || '';
 
         // clear selection
-- 
cgit v1.2.3-70-g09d2


From ad32c1606395cdc71ba50eb9b51d3a9d3b707ca0 Mon Sep 17 00:00:00 2001
From: alyssaf16 <alyssa_feinberg@brown.edu>
Date: Tue, 18 Jun 2024 15:23:12 -0400
Subject: working on various image flashcard ideas

---
 src/client/apis/gpt/GPT.ts                         |   7 +-
 src/client/views/MarqueeAnnotator.tsx              |   1 +
 .../views/collections/CollectionCardDeckView.tsx   |   2 +-
 .../views/collections/CollectionCarouselView.tsx   |   4 +-
 .../collections/collectionFreeForm/MarqueeView.tsx |   2 +-
 src/client/views/nodes/ComparisonBox.tsx           |  18 +-
 src/client/views/nodes/ImageBox.scss               |  21 ++
 src/client/views/nodes/ImageBox.tsx                | 232 +++++++++++++++++++++
 src/client/views/pdf/AnchorMenu.tsx                |  47 ++---
 src/client/views/pdf/Annotation.scss               |  32 +--
 src/client/views/pdf/PDFViewer.scss                |  21 ++
 src/client/views/pdf/PDFViewer.tsx                 |  52 +++++
 12 files changed, 383 insertions(+), 56 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/apis/gpt/GPT.ts b/src/client/apis/gpt/GPT.ts
index b036349dc..7bcd541c7 100644
--- a/src/client/apis/gpt/GPT.ts
+++ b/src/client/apis/gpt/GPT.ts
@@ -25,7 +25,7 @@ const callTypeMap: { [type: string]: GPTCallOpts } = {
     // newest model: gpt-4
     summary: { model: 'gpt-4-turbo', maxTokens: 256, temp: 0.5, prompt: 'Summarize the text given in simpler terms.' },
     edit: { model: 'gpt-4-turbo', maxTokens: 256, temp: 0.5, prompt: 'Reword the text.' },
-    flashcard: { model: 'gpt-4-turbo', maxTokens: 512, temp: 0.5, prompt: 'Make flashcards out of this text with each question and answer labeled. Do not label each flashcard and do not include asterisks: ' },
+    flashcard: { model: 'gpt-4-turbo', maxTokens: 512, temp: 0.5, prompt: 'Make flashcards out of this text with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ' },
     completion: { model: 'gpt-4-turbo', maxTokens: 256, temp: 0.5, prompt: "You are a helpful assistant. Answer the user's prompt." },
     mermaid: {
         model: 'gpt-4-turbo',
@@ -120,7 +120,7 @@ const gptGetEmbedding = async (src: string): Promise<number[]> => {
         return [];
     }
 };
-const gptImageLabel = async (src: string): Promise<string> => {
+const gptImageLabel = async (src: string, prompt: string): Promise<string> => {
     try {
         const response = await openai.chat.completions.create({
             model: 'gpt-4o',
@@ -128,7 +128,7 @@ const gptImageLabel = async (src: string): Promise<string> => {
                 {
                     role: 'user',
                     content: [
-                        { type: 'text', text: 'Give three to five labels to describe this image.' },
+                        { type: 'text', text: prompt },
                         {
                             type: 'image_url',
                             image_url: {
@@ -141,6 +141,7 @@ const gptImageLabel = async (src: string): Promise<string> => {
             ],
         });
         if (response.choices[0].message.content) {
+            console.log(response.choices[0].message.content);
             return response.choices[0].message.content;
         }
         return 'Missing labels';
diff --git a/src/client/views/MarqueeAnnotator.tsx b/src/client/views/MarqueeAnnotator.tsx
index c18ac6738..c7ffce2b4 100644
--- a/src/client/views/MarqueeAnnotator.tsx
+++ b/src/client/views/MarqueeAnnotator.tsx
@@ -34,6 +34,7 @@ export interface MarqueeAnnotatorProps {
     getPageFromScroll?: (top: number) => number;
     finishMarquee: (x?: number, y?: number) => void;
     anchorMenuClick?: () => undefined | ((anchor: Doc) => void);
+    anchorMenuFlashcard?: () => Promise<String>;
     anchorMenuCrop?: (anchor: Doc | undefined, addCrop: boolean) => Doc | undefined;
     highlightDragSrcColor?: string;
 }
diff --git a/src/client/views/collections/CollectionCardDeckView.tsx b/src/client/views/collections/CollectionCardDeckView.tsx
index de46180e6..50af9df9e 100644
--- a/src/client/views/collections/CollectionCardDeckView.tsx
+++ b/src/client/views/collections/CollectionCardDeckView.tsx
@@ -373,7 +373,7 @@ export class CollectionCardView extends CollectionSubView() {
         const hrefComplete = `${hrefParts[0]}_o.${hrefParts[1]}`;
         try {
             const hrefBase64 = await CollectionCardView.imageUrlToBase64(hrefComplete);
-            const response = await gptImageLabel(hrefBase64);
+            const response = await gptImageLabel(hrefBase64, 'Give three to five labels to describe this image.');
             image[DocData].description = response.trim();
             return response; // Return the response from gptImageLabel
         } catch (error) {
diff --git a/src/client/views/collections/CollectionCarouselView.tsx b/src/client/views/collections/CollectionCarouselView.tsx
index f2d634eaa..6976deea5 100644
--- a/src/client/views/collections/CollectionCarouselView.tsx
+++ b/src/client/views/collections/CollectionCarouselView.tsx
@@ -46,14 +46,14 @@ export class CollectionCarouselView extends CollectionSubView() {
     @observable private _filterMessage: string | undefined;
     get practiceField() { return this.fieldKey + "_practice"; } // prettier-ignore
     get sideField() { return "_" + this.fieldKey + "_usePath"; } // prettier-ignore
-    get starField()     { return this.fieldKey + "_star"; } // prettier-ignore
+    get starField()     { return "star"; } // prettier-ignore
 
     constructor(props: any) {
         super(props);
         makeObservable(this);
         // this.setModes();
         this.layoutDoc.filterOp = cardMode.ALL;
-        Doc.setDocFilter(this.Document, 'data_star', undefined, 'match');
+        Doc.setDocFilter(this.Document, 'star', undefined, 'match');
         this.layoutDoc.practiceMode = practiceMode.NORMAL;
         this.layoutDoc._carousel_index = 0;
     }
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index dc15c83c5..0afda3e64 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -440,7 +440,7 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
             const [name, type] = ImageCast(doc[Doc.LayoutFieldKey(doc)]).url.href.split('.');
             return CollectionCardView.imageUrlToBase64(`${name}_o.${type}`).then(hrefBase64 =>
                 !hrefBase64 ? undefined : 
-                    gptImageLabel(hrefBase64).then(labels => 
+                    gptImageLabel(hrefBase64, 'Give three to five labels to describe this image.').then(labels => 
                         Promise.all(labels.split('\n').map(label => gptGetEmbedding(label))).then(embeddings => 
                             ({ doc, embeddings, labels }))) ); // prettier-ignore
         });
diff --git a/src/client/views/nodes/ComparisonBox.tsx b/src/client/views/nodes/ComparisonBox.tsx
index 2fc297bec..3d33ff862 100644
--- a/src/client/views/nodes/ComparisonBox.tsx
+++ b/src/client/views/nodes/ComparisonBox.tsx
@@ -92,6 +92,7 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
             Doc.SetContainer(droppedDocuments.lastElement(), this.dataDoc);
             !added && e.preventDefault();
             e.stopPropagation(); // prevent parent Doc from registering new position so that it snaps back into place
+            // this.childActive = false;
             return added;
         }
         return undefined;
@@ -257,7 +258,7 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
         newCol['x'] = this.layoutDoc['x'];
         newCol['y'] = NumCast(this.layoutDoc['y']) + 50;
         newCol.type_collection = 'carousel';
-        console.log(newCol.data);
+        // console.log(newCol.data);
 
         if (gpt) {
             this._props.DocumentView?.()._props.addDocument?.(newCol);
@@ -270,13 +271,13 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
     }
 
     gptFlashcardPile = async () => {
-        var text = (await this.askGPT(GPTCallType.FLASHCARD)) || '';
+        var text = await this.askGPT(GPTCallType.FLASHCARD);
 
-        var senArr = text.trim().split('Question: ');
+        var senArr = text?.split('Question: ');
         var collectionArr: Doc[] = [];
-        for (let i = 1; i < senArr.length; i++) {
-            const newDoc = Docs.Create.ComparisonDocument(senArr[i].trim(), { _layout_isFlashcard: true, _width: 300, _height: 300 });
-            newDoc.text = senArr[i].trim();
+        for (let i = 1; i < senArr?.length!; i++) {
+            const newDoc = Docs.Create.ComparisonDocument(senArr![i], { _layout_isFlashcard: true, _width: 300, _height: 300 });
+            newDoc.text = senArr![i];
             collectionArr.push(newDoc);
         }
         this.createFlashcardPile(collectionArr, true);
@@ -451,13 +452,12 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
             if (callType == GPTCallType.QUIZ) this._outputValue = res;
             // DocCast(this.dataDoc[this.props.fieldKey + '_0'])[DocData].text = res;
             // this._outputValue = res;
-
-            if (callType === GPTCallType.FLASHCARD) {
+            else if (callType === GPTCallType.FLASHCARD) {
                 // console.log(res);
                 this._loading = false;
                 return res;
             }
-            console.log(res);
+            // console.log(res);
         } catch (err) {
             console.error('GPT call failed');
         }
diff --git a/src/client/views/nodes/ImageBox.scss b/src/client/views/nodes/ImageBox.scss
index 3ffda5a35..be68ac8cd 100644
--- a/src/client/views/nodes/ImageBox.scss
+++ b/src/client/views/nodes/ImageBox.scss
@@ -139,3 +139,24 @@
 .imageBox-fadeBlocker-hover {
     opacity: 0;
 }
+
+.loading-spinner {
+    position: absolute;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 100%;
+    width: 100%;
+    // left: 50%;
+    // top: 50%;
+    z-index: 200;
+    font-size: 20px;
+    font-weight: bold;
+    color: #17175e;
+}
+
+@keyframes spin {
+    to {
+        transform: rotate(360deg);
+    }
+}
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index e4b3a1b9b..ff938df78 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -35,6 +35,15 @@ import { FieldView, FieldViewProps } from './FieldView';
 import { FocusViewOptions } from './FocusViewOptions';
 import './ImageBox.scss';
 import { OpenWhere } from './OpenWhere';
+import { URLField } from '../../../fields/URLField';
+import { gptImageLabel } from '../../apis/gpt/GPT';
+import ReactLoading from 'react-loading';
+import { FollowLinkScript } from '../../documents/DocUtils';
+import { basename } from 'path';
+import { ImageUtility } from './generativeFill/generativeFillUtils/ImageHandler';
+import { dropActionType } from '../../util/DropActionTypes';
+import { canvasSize } from './generativeFill/generativeFillUtils/generativeFillConstants';
+import axios from 'axios';
 
 export class ImageEditorData {
     // eslint-disable-next-line no-use-before-define
@@ -59,6 +68,8 @@ export class ImageEditorData {
     public static get AddDoc()                   { return ImageEditorData.imageData.addDoc; } // prettier-ignore
     public static set AddDoc(addDoc: Opt<(doc: Doc | Doc[], annotationKey?: string) => boolean>) { ImageEditorData.set(this.imageData.open, this.imageData.rootDoc, this.imageData.source, addDoc); } // prettier-ignore
 }
+
+const API_URL = 'https://api.unsplash.com/search/photos';
 @observer
 export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     public static LayoutString(fieldKey: string) {
@@ -73,9 +84,14 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     private _marqueeref = React.createRef<MarqueeAnnotator>();
     private _mainCont: React.RefObject<HTMLDivElement> = React.createRef();
     private _annotationLayer: React.RefObject<HTMLDivElement> = React.createRef();
+    private _imageRef: HTMLImageElement | null = null; // <video> ref
+    @observable private _width: number = 0;
+    @observable private _height: number = 0;
+    @observable private searchInput = '';
     @observable _savedAnnotations = new ObservableMap<number, HTMLDivElement[]>();
     @observable _curSuffix = '';
     @observable _error = '';
+    @observable private _loading = false;
     @observable _isHovering = false; // flag to switch between primary and alternate images on hover
     _ffref = React.createRef<CollectionFreeFormView>();
 
@@ -148,6 +164,32 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         Object.values(this._disposers).forEach(disposer => disposer?.());
     }
 
+    fetchImages = async () => {
+        try {
+            const { data } = await axios.get(`${API_URL}?query=${this.searchInput}&page=1&per_page=${1}&client_id=${process.env.VITE_API_KEY}`);
+            console.log('data', data);
+            console.log(data.results);
+            const imageSnapshot = Docs.Create.ImageDocument(data.results[0].urls.small, {
+                _nativeWidth: Doc.NativeWidth(this.layoutDoc),
+                _nativeHeight: Doc.NativeHeight(this.layoutDoc),
+                x: NumCast(this.layoutDoc.x),
+                y: NumCast(this.layoutDoc.y),
+                onClick: FollowLinkScript(),
+                _width: 150,
+                _height: 150,
+                title: '--snapshot' + NumCast(this.layoutDoc._layout_currentTimecode) + ' image-',
+            });
+            this._props.addDocument?.(imageSnapshot);
+        } catch (error) {
+            console.log(error);
+        }
+    };
+
+    handleSelection = async (selection: string) => {
+        this.searchInput = selection;
+        const images = await this.fetchImages();
+    };
+
     @undoBatch
     drop = (e: Event, de: DragManager.DropEvent) => {
         if (de.complete.docDragData) {
@@ -259,10 +301,189 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         return cropping;
     };
 
+    createCanvas = async (downX?: number, downY?: number, cb?: (filename: string, x: number | undefined, y: number | undefined) => void) => {
+        const width = NumCast(this.layoutDoc._width);
+        const canvas = document.createElement('canvas');
+        // canvas.width = 640;
+        // canvas.height = (640 * Doc.NativeHeight(this.layoutDoc)) / (Doc.NativeWidth(this.layoutDoc) || 1);
+        canvas.width = NumCast(this.layoutDoc._width);
+        canvas.height = NumCast(this.layoutDoc._height);
+        const ctx = canvas.getContext('2d'); // draw image to canvas. scale to target dimensions
+        if (ctx) {
+            // this._imageRef && ctx.drawImage(this._imageRef, 0, 0, canvas.width, canvas.height);
+            this._imageRef && ctx.drawImage(this._imageRef, NumCast(this._marqueeref.current?.left), NumCast(this._marqueeref.current?.top), this._width, this._height, 0, 0, 1000, 1000);
+            //this._imageRef && ctx.drawImage(this._imageRef, 0, 0, 2000, 1000, 0, 0, canvas.width, canvas.height);
+            // console.log(NumCast(this._marqueeref.current?.left) + 100);
+        }
+        const blob = await ImageUtility.canvasToBlob(canvas);
+        return ImageBox.selectUrlToBase64(blob);
+
+        // if (this._imageRef) {
+        //     const canv = ImageUtility.getCroppedImg(this._imageRef, this._imageRef.width, this._imageRef.height);
+        //     console.log(this._imageRef.width);
+        //     if (canv) {
+        //         const blob = await ImageUtility.canvasToBlob(canv);
+        //         return ImageBox.selectUrlToBase64(blob);
+        //     }
+        // }
+        if (!this._imageRef) {
+            const b = Docs.Create.LabelDocument({
+                x: NumCast(this.layoutDoc.x) + width,
+                y: NumCast(this.layoutDoc.y, 1),
+                _width: 150,
+                _height: 50,
+                // title: (this.layoutDoc._layout_currentTimecode || 0).toString(),
+                onClick: FollowLinkScript(),
+            });
+            this._props.addDocument?.(b);
+            DocUtils.MakeLink(b, this.Document, { link_relationship: 'image snapshot' });
+        } else {
+            // convert to desired file format
+            // const dataUrl = canvas.toDataURL('image/png'); // can also use 'image/png'
+            // // if you want to preview the captured image,
+            // const retitled = StrCast(this.Document.title).replace(/[ -.:]/g, '');
+            // const encodedFilename = encodeURIComponent(('snapshot' + retitled + '_' + (this.layoutDoc._layout_currentTimecode || 0).toString()).replace(/[./?=]/g, '_'));
+            // const filename = basename(encodedFilename);
+            // ClientUtils.convertDataUri(dataUrl, filename).then((returnedFilename: string) => returnedFilename && (cb ?? this.createSnapshotLink)(returnedFilename, downX, downY));
+        }
+        // convert to desired file format
+
+        // const dataUrl = canvas.toDataURL('image/png'); // can also use 'image/png'
+        // // if you want to preview the captured image,
+        // const retitled = StrCast(this.Document.title).replace(/[ -.:]/g, '');
+        // const encodedFilename = encodeURIComponent(('snapshot' + retitled + '_' + (this.layoutDoc._layout_currentTimecode || 0).toString()).replace(/[./?=]/g, '_'));
+        // const filename = basename(encodedFilename);
+        //ClientUtils.convertDataUri(dataUrl, filename).then((returnedFilename: string) => returnedFilename && (cb ?? this.createSnapshotLink)(returnedFilename, downX, downY));
+        // }
+        // const docViewContent = this.DocumentView?.().ContentDiv!;
+        // if (docViewContent instanceof HTMLCanvasElement) {
+        //     const canvas = docViewContent;
+        //     const img = document.createElement('img'); // create a Image Element
+        //     img.src = canvas.toDataURL(); // image sourcez
+        //     img.style.width = canvas.style.width;
+        //     img.style.height = canvas.style.height;
+        //     const parEle = newCan.parentElement as HTMLElement;
+        //     parEle.removeChild(newCan);
+        //     parEle.appendChild(img);
+        // }
+    };
+
+    createSnapshotLink = (imagePath: string, downX?: number, downY?: number) => {
+        const url = !imagePath.startsWith('/') ? ClientUtils.CorsProxy(imagePath) : imagePath;
+        const width = NumCast(this.layoutDoc._width) || 1;
+        const height = NumCast(this.layoutDoc._height);
+        const imageSnapshot = Docs.Create.ImageDocument(url, {
+            _nativeWidth: Doc.NativeWidth(this.layoutDoc),
+            _nativeHeight: Doc.NativeHeight(this.layoutDoc),
+            x: NumCast(this.layoutDoc.x) + width,
+            y: NumCast(this.layoutDoc.y),
+            onClick: FollowLinkScript(),
+            _width: 150,
+            _height: (height / width) * 150,
+            title: '--snapshot' + NumCast(this.layoutDoc._layout_currentTimecode) + ' image-',
+        });
+        Doc.SetNativeWidth(imageSnapshot[DocData], Doc.NativeWidth(this.layoutDoc));
+        Doc.SetNativeHeight(imageSnapshot[DocData], Doc.NativeHeight(this.layoutDoc));
+        this._props.addDocument?.(imageSnapshot);
+        DocUtils.MakeLink(imageSnapshot, this.getAnchor(true), { link_relationship: 'video snapshot' });
+        // link && (DocCast(link.link_anchor_2)[DocData].timecodeToHide = NumCast(DocCast(link.link_anchor_2).timecodeToShow) + 3);  // do we need to set an end time? should default to +0.1
+        setTimeout(() => downX !== undefined && downY !== undefined && DocumentView.getFirstDocumentView(imageSnapshot)?.startDragging(downX, downY, dropActionType.move, true));
+    };
+
+    /**
+     * 
+        if (oldDiv instanceof HTMLCanvasElement) {
+            const canvas = oldDiv;
+            const img = document.createElement('img'); // create a Image Element
+            img.src = canvas.toDataURL(); // image sourcez
+            img.style.width = canvas.style.width;
+            img.style.height = canvas.style.height;
+            const newCan = newDiv as HTMLCanvasElement;
+            const parEle = newCan.parentElement as HTMLElement;
+            parEle.removeChild(newCan);
+            parEle.appendChild(img);
+        }
+     */
+
+    static selectUrlToBase64 = async (blob: Blob): Promise<string> => {
+        try {
+            return new Promise((resolve, reject) => {
+                const reader = new FileReader();
+                reader.readAsDataURL(blob);
+                reader.onloadend = () => resolve(reader.result as string);
+                reader.onerror = error => reject(error);
+            });
+        } catch (error) {
+            console.error('Error:', error);
+            throw error;
+        }
+    };
+
+    static imageUrlToBase64 = async (imageUrl: string): Promise<string> => {
+        try {
+            const response = await fetch(imageUrl);
+            const blob = await response.blob();
+
+            return new Promise((resolve, reject) => {
+                const reader = new FileReader();
+                reader.readAsDataURL(blob);
+                reader.onloadend = () => resolve(reader.result as string);
+                reader.onerror = error => reject(error);
+            });
+        } catch (error) {
+            console.error('Error:', error);
+            throw error;
+        }
+    };
+
+    getImageDesc = async () => {
+        // if (StrCast(this.dataDoc.description)) return StrCast(this.dataDoc.description); // Return existing description
+        const { href } = (this.dataDoc.data as URLField).url;
+        const hrefParts = href.split('.');
+        const hrefComplete = `${hrefParts[0]}_o.${hrefParts[1]}`;
+        this._loading = true;
+        try {
+            // const hrefBase64 = await ImageBox.imageUrlToBase64(hrefComplete);
+            const hrefBase64 = await this.createCanvas();
+            const response = await gptImageLabel(hrefBase64, 'Tell me what words you see on this image.');
+            //const response = await gptImageLabel(hrefBase64, 'Make flashcards out of this text with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ');
+            console.log(response);
+            // AnchorMenu.Instance.transferToFlashcard(response);
+            // this.Document[DocData].description = response.trim();
+            // return response; // Return the response
+        } catch (error) {
+            console.log('Error');
+        }
+        this._loading = false;
+        // return '';
+    };
+
+    @action
+    setRef = (iref: HTMLImageElement | null) => {
+        this._imageRef = iref;
+        // if (iref) {
+        //     this._videoRef!.ontimeupdate = this.updateTimecode;
+        //     // @ts-ignore
+        //     // vref.onfullscreenchange = action((e) => this._fullScreen = vref.webkitDisplayingFullscreen);
+        //     this._disposers.reactionDisposer?.();
+        //     this._disposers.reactionDisposer = reaction(
+        //         () => NumCast(this.layoutDoc._layout_currentTimecode),
+        //         time => {
+        //             !this._playing && (vref.currentTime = time);
+        //         },
+        //         { fireImmediately: true }
+        //     );
+
+        //     (!this.dataDoc[this.fieldKey + '_thumbnails'] || StrListCast(this.dataDoc[this.fieldKey + '_thumbnails']).length !== VideoThumbnails.DENSE) && this.getVideoThumbnails();
+        // }
+    };
+
     specificContextMenu = (): void => {
         const field = Cast(this.dataDoc[this.fieldKey], ImageField);
         if (field) {
             const funcs: ContextMenuProps[] = [];
+            // funcs.push({ description: 'Create ai flashcards', event: () => this.getImageDesc(), icon: 'id-card' });
+            funcs.push({ description: 'Get Images', event: () => this.handleSelection('Cats'), icon: 'redo-alt' });
             funcs.push({ description: 'Rotate Clockwise 90', event: this.rotate, icon: 'redo-alt' });
             funcs.push({ description: `Show ${this.layoutDoc._showFullRes ? 'Dynamic Res' : 'Full Res'}`, event: this.resolution, icon: 'expand' });
             funcs.push({ description: 'Set Native Pixel Size', event: this.setNativeSize, icon: 'expand-arrows-alt' });
@@ -391,6 +612,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 <div className="imageBox-fader" style={{ opacity: backAlpha }}>
                     <img
                         alt=""
+                        ref={this.setRef}
                         key="paths"
                         src={srcpath}
                         style={{ transform, transformOrigin }}
@@ -432,6 +654,8 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 action(moveEv => {
                     MarqueeAnnotator.clearAnnotations(this._savedAnnotations);
                     this._marqueeref.current?.onInitiateSelection([moveEv.clientX, moveEv.clientY]);
+                    this._width = moveEv.clientX;
+                    this._height = moveEv.clientY;
                     return true;
                 }),
                 returnFalse,
@@ -443,6 +667,8 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     @action
     finishMarquee = () => {
         this._getAnchor = AnchorMenu.Instance?.GetAnchor;
+        AnchorMenu.Instance.gptFlashcards = this.getImageDesc;
+        AnchorMenu.Instance.addToCollection = this._props.DocumentView?.()._props.addDocument;
         this._marqueeref.current?.onTerminateSelection();
         this._props.select(false);
     };
@@ -500,6 +726,11 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                     addDocument={this.addDocument}>
                     {this.content}
                 </CollectionFreeFormView>
+                {this._loading ? (
+                    <div className="loading-spinner" style={{ position: 'absolute' }}>
+                        <ReactLoading type="spin" height={50} width={50} color={'blue'} />
+                    </div>
+                ) : null}
                 {this.annotationLayer}
                 {!this._mainCont.current || !this.DocumentView || !this._annotationLayer.current ? null : (
                     <MarqueeAnnotator
@@ -518,6 +749,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                         marqueeContainer={this._mainCont.current}
                         highlightDragSrcColor=""
                         anchorMenuCrop={this.crop}
+                        // anchorMenuFlashcard={() => this.getImageDesc()}
                     />
                 )}
             </div>
diff --git a/src/client/views/pdf/AnchorMenu.tsx b/src/client/views/pdf/AnchorMenu.tsx
index c1198b4f7..777117f26 100644
--- a/src/client/views/pdf/AnchorMenu.tsx
+++ b/src/client/views/pdf/AnchorMenu.tsx
@@ -54,6 +54,9 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
         this._y = y;
     };
 
+    @computed public get selectedText() {
+        return this._selectedText;
+    }
     public onMakeAnchor: () => Opt<Doc> = () => undefined; // Method to get anchor from text search
 
     public OnCrop: (e: PointerEvent) => void = unimplementedFunction;
@@ -68,6 +71,7 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
     public MakeTargetToggle: () => void = unimplementedFunction;
     public ShowTargetTrail: () => void = unimplementedFunction;
     public IsTargetToggler: () => boolean = returnFalse;
+    public gptFlashcards: () => void = unimplementedFunction;
     public get Active() {
         return this._left > 0;
     }
@@ -110,23 +114,23 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
      * Invokes the API with the selected text and stores it in the selected text.
      * @param e pointer down event
      */
-    gptFlashcards = async (e: React.PointerEvent) => {
-        const queryText = this._selectedText;
-        this._loading = true;
-        try {
-            const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
-            console.log(res);
-            // GPTPopup.Instance.setText(res || 'Something went wrong.');
-            this.transferToFlashcard(res || 'Something went wrong');
-        } catch (err) {
-            console.error(err);
-        }
-        // GPTPopup.Instance.setLoading(false);
-    };
+    // gptPDFFlashcards = async () => {
+    //     const queryText = this._selectedText;
+    //     this._loading = true;
+    //     try {
+    //         const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
+    //         console.log(res);
+    //         // GPTPopup.Instance.setText(res || 'Something went wrong.');
+    //         this.transferToFlashcard(res || 'Something went wrong');
+    //     } catch (err) {
+    //         console.error(err);
+    //     }
+    //     // GPTPopup.Instance.setLoading(false);
+    // };
 
-    /*
-     * Transfers the flashcard text generated by GPT on flashcards and creates a collection out them.
-     */
+    // /*
+    //  * Transfers the flashcard text generated by GPT on flashcards and creates a collection out them.
+    //  */
     transferToFlashcard = (text: string) => {
         // put each question generated by GPT on the front of the flashcard
         var senArr = text.trim().split('Question: ');
@@ -236,12 +240,7 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
                         />
                     )}
                     {/* Adds a create flashcards option to the anchor menu, which calls the gptFlashcard method. */}
-                    <IconButton
-                        tooltip="Create flashcards" //
-                        onPointerDown={e => this.gptFlashcards(e)}
-                        icon={<FontAwesomeIcon icon="id-card" size="lg" />}
-                        color={SettingsManager.userColor}
-                    />
+                    <IconButton tooltip="Create flashcards" onPointerDown={this.gptFlashcards} icon={<FontAwesomeIcon icon="id-card" size="lg" />} color={SettingsManager.userColor} />
                     {AnchorMenu.Instance.OnAudio === unimplementedFunction ? null : (
                         <IconButton
                             tooltip="Click to Record Annotation" //
@@ -267,11 +266,11 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
                             />
                         </div>
                     )}
-                    {this._loading ? (
+                    {/* {this._loading ? (
                         <div className="loading-spinner" style={{ position: 'absolute' }}>
                             <ReactLoading type="spin" height={30} width={30} color={'white'} />
                         </div>
-                    ) : null}
+                    ) : null} */}
                 </>
             ) : (
                 <>
diff --git a/src/client/views/pdf/Annotation.scss b/src/client/views/pdf/Annotation.scss
index 329819ea2..26856b74e 100644
--- a/src/client/views/pdf/Annotation.scss
+++ b/src/client/views/pdf/Annotation.scss
@@ -8,20 +8,20 @@
         cursor: pointer;
     }
 }
-.loading-spinner {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    height: 90%;
-    width: 93%;
-    left: 10;
-    font-size: 20px;
-    font-weight: bold;
-    color: #0b0a0a;
-}
+// .loading-spinner {
+//     display: flex;
+//     justify-content: center;
+//     align-items: center;
+//     height: 90%;
+//     width: 93%;
+//     left: 10;
+//     font-size: 20px;
+//     font-weight: bold;
+//     color: #0b0a0a;
+// }
 
-@keyframes spin {
-    to {
-        transform: rotate(360deg);
-    }
-}
+// @keyframes spin {
+//     to {
+//         transform: rotate(360deg);
+//     }
+// }
diff --git a/src/client/views/pdf/PDFViewer.scss b/src/client/views/pdf/PDFViewer.scss
index d3dd9f727..e70102ce9 100644
--- a/src/client/views/pdf/PDFViewer.scss
+++ b/src/client/views/pdf/PDFViewer.scss
@@ -107,3 +107,24 @@
 .pdfViewerDash-interactive {
     pointer-events: all;
 }
+
+.loading-spinner {
+    position: absolute;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 100%;
+    width: 100%;
+    // left: 50%;
+    // top: 50%;
+    z-index: 200;
+    font-size: 20px;
+    font-weight: bold;
+    color: #17175e;
+}
+
+@keyframes spin {
+    to {
+        transform: rotate(360deg);
+    }
+}
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index af7a5774d..befbee48b 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -32,6 +32,8 @@ import { Annotation } from './Annotation';
 import { GPTPopup } from './GPTPopup/GPTPopup';
 import { Docs } from '../../documents/Documents';
 import './PDFViewer.scss';
+import { GPTCallType, gptAPICall } from '../../apis/gpt/GPT';
+import ReactLoading from 'react-loading';
 
 // pdfjsLib.GlobalWorkerOptions.workerSrc = `/assets/pdf.worker.js`;
 // The workerSrc property shall be specified.
@@ -70,6 +72,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
     @observable _textSelecting = true;
     @observable _showWaiting = true;
     @observable Index: number = -1;
+    @observable private _loading = false;
 
     private _pdfViewer: any;
     private _styleRule: any; // stylesheet rule for making hyperlinks clickable
@@ -406,6 +409,49 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         }
     };
 
+    gptPDFFlashcards = async () => {
+        const queryText = this._selectionText;
+        this._loading = true;
+        try {
+            const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
+            console.log(res);
+            // GPTPopup.Instance.setText(res || 'Something went wrong.');
+            AnchorMenu.Instance.transferToFlashcard(res || 'Something went wrong');
+            // this.transferToFlashcard(res || 'Something went wrong');
+        } catch (err) {
+            console.error(err);
+        }
+        this._loading = false;
+        // GPTPopup.Instance.setLoading(false);
+    };
+
+    // transferToFlashcard = (text: string) => {
+    //     // put each question generated by GPT on the front of the flashcard
+    //     var senArr = text.trim().split('Question: ');
+    //     var collectionArr: Doc[] = [];
+    //     for (let i = 1; i < senArr.length; i++) {
+    //         console.log('Arr ' + i + ': ' + senArr[i]);
+    //         const newDoc = Docs.Create.ComparisonDocument(senArr[i], { _layout_isFlashcard: true, _width: 300, _height: 300 });
+    //         newDoc.text = senArr[i];
+    //         collectionArr.push(newDoc);
+    //     }
+    //     // create a new carousel collection of these flashcards
+    //     const newCol = Docs.Create.CarouselDocument(collectionArr, {
+    //         _width: 250,
+    //         _height: 200,
+    //         _layout_fitWidth: false,
+    //         _layout_autoHeight: true,
+    //     });
+
+    //     newCol.x = this._props.layoutDoc['x'];
+    //     newCol.y = this._props.layoutDoc['y'];
+    //     newCol.zIndex = 100;
+
+    //     this._props.DocumentView?.()._props.addDocument?.(newCol);
+    //     console.log('HERE');
+    //     this._loading = false;
+    // };
+
     @action
     finishMarquee = (/* x?: number, y?: number */) => {
         this._getAnchor = AnchorMenu.Instance?.GetAnchor;
@@ -437,6 +483,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         GPTPopup.Instance.addDoc = this._props.sidebarAddDoc;
         // allows for creating collection
         AnchorMenu.Instance.addToCollection = this._props.DocumentView?.()._props.addDocument;
+        AnchorMenu.Instance.gptFlashcards = this.gptPDFFlashcards;
     };
 
     @action
@@ -625,6 +672,11 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
                         />
                     )}
                 </div>
+                {this._loading ? (
+                    <div className="loading-spinner" style={{ position: 'absolute' }}>
+                        <ReactLoading type="spin" height={80} width={80} color={'blue'} />
+                    </div>
+                ) : null}
             </div>
         );
     }
-- 
cgit v1.2.3-70-g09d2


From 3ae9af9228a050fbe7f48c800701ae4399850f35 Mon Sep 17 00:00:00 2001
From: alyssaf16 <alyssa_feinberg@brown.edu>
Date: Thu, 20 Jun 2024 15:44:53 -0400
Subject: Chatcards with images

---
 src/client/views/nodes/ImageBox.tsx                | 56 +++++++---------------
 .../views/nodes/formattedText/FormattedTextBox.tsx | 18 ++++---
 src/client/views/pdf/AnchorMenu.tsx                |  7 +--
 src/client/views/pdf/PDFViewer.tsx                 | 35 ++------------
 4 files changed, 36 insertions(+), 80 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index a794e213e..fde9fe582 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -354,63 +354,39 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         }
     };
 
-    static imageUrlToBase64 = async (imageUrl: string): Promise<string> => {
-        try {
-            const response = await fetch(imageUrl);
-            const blob = await response.blob();
-
-            return new Promise((resolve, reject) => {
-                const reader = new FileReader();
-                reader.readAsDataURL(blob);
-                reader.onloadend = () => resolve(reader.result as string);
-                reader.onerror = error => reject(error);
-            });
-        } catch (error) {
-            console.error('Error:', error);
-            throw error;
-        }
-    };
+    // static imageUrlToBase64 = async (imageUrl: string): Promise<string> => {
+    //     try {
+    //         const response = await fetch(imageUrl);
+    //         const blob = await response.blob();
+
+    //         return new Promise((resolve, reject) => {
+    //             const reader = new FileReader();
+    //             reader.readAsDataURL(blob);
+    //             reader.onloadend = () => resolve(reader.result as string);
+    //             reader.onerror = error => reject(error);
+    //         });
+    //     } catch (error) {
+    //         console.error('Error:', error);
+    //         throw error;
+    //     }
+    // };
 
     getImageDesc = async () => {
-        // if (StrCast(this.dataDoc.description)) return StrCast(this.dataDoc.description); // Return existing description
-        const { href } = (this.dataDoc.data as URLField).url;
-        const hrefParts = href.split('.');
-        const hrefComplete = `${hrefParts[0]}_o.${hrefParts[1]}`;
         this._loading = true;
         try {
-            // const hrefBase64 = await ImageBox.imageUrlToBase64(hrefComplete);
             const hrefBase64 = await this.createCanvas();
-            //const response = await gptImageLabel(hrefBase64, 'Tell me what words you see on this image.');
             const response = await gptImageLabel(hrefBase64, 'Make flashcards out of this text with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ');
             console.log(response);
             AnchorMenu.Instance.transferToFlashcard(response);
-            // this.Document[DocData].description = response.trim();
-            // return response; // Return the response
         } catch (error) {
             console.log('Error');
         }
         this._loading = false;
-        // return '';
     };
 
     @action
     setRef = (iref: HTMLImageElement | null) => {
         this._imageRef = iref;
-        // if (iref) {
-        //     this._videoRef!.ontimeupdate = this.updateTimecode;
-        //     // @ts-ignore
-        //     // vref.onfullscreenchange = action((e) => this._fullScreen = vref.webkitDisplayingFullscreen);
-        //     this._disposers.reactionDisposer?.();
-        //     this._disposers.reactionDisposer = reaction(
-        //         () => NumCast(this.layoutDoc._layout_currentTimecode),
-        //         time => {
-        //             !this._playing && (vref.currentTime = time);
-        //         },
-        //         { fireImmediately: true }
-        //     );
-
-        //     (!this.dataDoc[this.fieldKey + '_thumbnails'] || StrListCast(this.dataDoc[this.fieldKey + '_thumbnails']).length !== VideoThumbnails.DENSE) && this.getVideoThumbnails();
-        // }
     };
 
     specificContextMenu = (): void => {
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index aee885688..2091ee89a 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -1001,12 +1001,16 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
         !help && cm.addItem({ description: 'Help...', subitems: helpItems, icon: 'eye' });
     };
 
-    findImageTags = () => {
+    findImageTags = async () => {
         const c = this.ProseRef?.getElementsByTagName('img');
         if (c) {
             for (let i of c) {
-                this.getImageDesc(i.src);
                 console.log(i);
+
+                // console.log(canvas.toDataURL());
+                // canvas.style.zIndex = '2000000';
+                // document.body.appendChild(canvas);
+                if (i.className !== 'ProseMirror-separator') this.getImageDesc(i.src);
             }
         }
         // console.log('HI' + this.ProseRef?.getElementsByTagName('img'));
@@ -1031,13 +1035,13 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
 
     getImageDesc = async (u: string) => {
         // if (StrCast(this.dataDoc.description)) return StrCast(this.dataDoc.description); // Return existing description
-        const { href } = (u as URLField).url;
-        const hrefParts = href.split('.');
+        // const { href } = (u as URLField).url;
+        const hrefParts = u.split('.');
         const hrefComplete = `${hrefParts[0]}_o.${hrefParts[1]}`;
         try {
-            const hrefBase64 = await FormattedTextBox.imageUrlToBase64(hrefComplete);
-            //const response = await gptImageLabel(hrefBase64, 'Tell me what words you see on this image.');
-            const response = await gptImageLabel(hrefBase64, 'Make flashcards out of this text with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ');
+            const hrefBase64 = await FormattedTextBox.imageUrlToBase64(u);
+            const response = await gptImageLabel(hrefBase64, 'Tell me what you see in this image');
+            //const response = await gptImageLabel(u, 'Make flashcards out of this text with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ');
             console.log(response);
             // AnchorMenu.Instance.transferToFlashcard(response);
             // this.Document[DocData].description = response.trim();
diff --git a/src/client/views/pdf/AnchorMenu.tsx b/src/client/views/pdf/AnchorMenu.tsx
index 6dc41ead2..87031487f 100644
--- a/src/client/views/pdf/AnchorMenu.tsx
+++ b/src/client/views/pdf/AnchorMenu.tsx
@@ -130,9 +130,10 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
     //     // GPTPopup.Instance.setLoading(false);
     // };
 
-    // /*
-    //  * Transfers the flashcard text generated by GPT on flashcards and creates a collection out them.
-    //  */
+    /*
+     * Transfers the flashcard text generated by GPT on flashcards and creates a collection out them.
+     */
+
     transferToFlashcard = (text: string) => {
         // put each question generated by GPT on the front of the flashcard
         var senArr = text.trim().split('Question: ');
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index befbee48b..27a523465 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -413,45 +413,19 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         const queryText = this._selectionText;
         this._loading = true;
         try {
+            if (this._selectionText === '') {
+            }
             const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
+
             console.log(res);
-            // GPTPopup.Instance.setText(res || 'Something went wrong.');
             AnchorMenu.Instance.transferToFlashcard(res || 'Something went wrong');
-            // this.transferToFlashcard(res || 'Something went wrong');
+            this._selectionText = '';
         } catch (err) {
             console.error(err);
         }
         this._loading = false;
-        // GPTPopup.Instance.setLoading(false);
     };
 
-    // transferToFlashcard = (text: string) => {
-    //     // put each question generated by GPT on the front of the flashcard
-    //     var senArr = text.trim().split('Question: ');
-    //     var collectionArr: Doc[] = [];
-    //     for (let i = 1; i < senArr.length; i++) {
-    //         console.log('Arr ' + i + ': ' + senArr[i]);
-    //         const newDoc = Docs.Create.ComparisonDocument(senArr[i], { _layout_isFlashcard: true, _width: 300, _height: 300 });
-    //         newDoc.text = senArr[i];
-    //         collectionArr.push(newDoc);
-    //     }
-    //     // create a new carousel collection of these flashcards
-    //     const newCol = Docs.Create.CarouselDocument(collectionArr, {
-    //         _width: 250,
-    //         _height: 200,
-    //         _layout_fitWidth: false,
-    //         _layout_autoHeight: true,
-    //     });
-
-    //     newCol.x = this._props.layoutDoc['x'];
-    //     newCol.y = this._props.layoutDoc['y'];
-    //     newCol.zIndex = 100;
-
-    //     this._props.DocumentView?.()._props.addDocument?.(newCol);
-    //     console.log('HERE');
-    //     this._loading = false;
-    // };
-
     @action
     finishMarquee = (/* x?: number, y?: number */) => {
         this._getAnchor = AnchorMenu.Instance?.GetAnchor;
@@ -469,6 +443,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         document.removeEventListener('pointerup', this.onSelectEnd);
 
         const sel = window.getSelection();
+
         if (sel) {
             AnchorMenu.Instance.setSelectedText(sel.toString());
             AnchorMenu.Instance.setLocation(NumCast(this._props.layoutDoc['x']), NumCast(this._props.layoutDoc['y']));
-- 
cgit v1.2.3-70-g09d2


From 6920c387edc480341771edb02f0ac1097c85ae25 Mon Sep 17 00:00:00 2001
From: alyssaf16 <alyssa_feinberg@brown.edu>
Date: Sun, 23 Jun 2024 19:58:19 -0400
Subject: audio quiz cards

---
 package-lock.json                                  | 10158 ++++++++++---------
 package.json                                       |     3 +
 src/client/apis/gpt/GPT.ts                         |     9 +-
 src/client/views/nodes/ComparisonBox.tsx           |   505 +-
 src/client/views/nodes/ImageBox.tsx                |     2 +-
 .../views/nodes/formattedText/FormattedTextBox.tsx |    48 +-
 src/client/views/pdf/AnchorMenu.tsx                |     2 +
 src/client/views/pdf/PDFViewer.tsx                 |   138 +
 8 files changed, 5765 insertions(+), 5100 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/package-lock.json b/package-lock.json
index 3a4ca6668..1a8e04611 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -122,6 +122,7 @@
                 "html-to-image": "^1.11.11",
                 "html-to-text": "^9.0.5",
                 "html-webpack-plugin": "^5.5.3",
+                "html2canvas": "^1.4.1",
                 "http-browserify": "^1.7.0",
                 "https": "^1.0.0",
                 "https-browserify": "^1.0.0",
@@ -196,6 +197,7 @@
                 "react-measure": "^2.5.2",
                 "react-resizable": "^3.0.5",
                 "react-select": "^5.8.0",
+                "react-speech-recognition": "^3.10.0",
                 "react-textarea-autosize": "^8.5.3",
                 "react-type-animation": "^3.2.0",
                 "react-xarrows": "^2.0.2",
@@ -280,6 +282,7 @@
                 "@types/react-grid-layout": "^1.3.5",
                 "@types/react-measure": "^2.0.12",
                 "@types/react-reconciler": "^0.28.8",
+                "@types/react-speech-recognition": "^3.9.5",
                 "@types/request": "^2.48.12",
                 "@types/request-promise": "^4.1.51",
                 "@types/shelljs": "^0.8.15",
@@ -317,68 +320,67 @@
             }
         },
         "node_modules/@adobe/react-spectrum": {
-            "version": "3.35.0",
-            "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.35.0.tgz",
-            "integrity": "sha512-dhCKWKDS/xF02EpWluicH7Va6KAANbrUx4rb1UeeFT3czhwz44oCQ74ZYviVedNv6Bq7O22/kbMa20rDdyt/4A==",
-            "dependencies": {
-                "@internationalized/string": "^3.2.2",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/ssr": "^3.9.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-spectrum/actionbar": "^3.4.4",
-                "@react-spectrum/actiongroup": "^3.10.4",
-                "@react-spectrum/avatar": "^3.0.11",
-                "@react-spectrum/badge": "^3.1.12",
-                "@react-spectrum/breadcrumbs": "^3.9.6",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/buttongroup": "^3.6.12",
-                "@react-spectrum/calendar": "^3.4.8",
-                "@react-spectrum/checkbox": "^3.9.5",
-                "@react-spectrum/combobox": "^3.12.4",
-                "@react-spectrum/contextualhelp": "^3.6.10",
-                "@react-spectrum/datepicker": "^3.9.5",
-                "@react-spectrum/dialog": "^3.8.10",
-                "@react-spectrum/divider": "^3.5.12",
-                "@react-spectrum/dnd": "^3.3.9",
-                "@react-spectrum/dropzone": "^3.0.0",
-                "@react-spectrum/filetrigger": "^3.0.0",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/icon": "^3.7.12",
-                "@react-spectrum/illustratedmessage": "^3.5.0",
-                "@react-spectrum/image": "^3.5.0",
-                "@react-spectrum/inlinealert": "^3.2.4",
-                "@react-spectrum/labeledvalue": "^3.1.13",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/link": "^3.6.6",
-                "@react-spectrum/list": "^3.7.9",
-                "@react-spectrum/listbox": "^3.12.8",
-                "@react-spectrum/menu": "^3.19.0",
-                "@react-spectrum/meter": "^3.5.0",
-                "@react-spectrum/numberfield": "^3.9.2",
-                "@react-spectrum/overlays": "^5.6.0",
-                "@react-spectrum/picker": "^3.14.4",
-                "@react-spectrum/progress": "^3.7.6",
-                "@react-spectrum/provider": "^3.9.6",
-                "@react-spectrum/radio": "^3.7.5",
-                "@react-spectrum/searchfield": "^3.8.5",
-                "@react-spectrum/slider": "^3.6.8",
-                "@react-spectrum/statuslight": "^3.5.12",
-                "@react-spectrum/switch": "^3.5.4",
-                "@react-spectrum/table": "^3.12.9",
-                "@react-spectrum/tabs": "^3.8.9",
-                "@react-spectrum/tag": "^3.2.5",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/textfield": "^3.12.0",
-                "@react-spectrum/theme-dark": "^3.5.9",
-                "@react-spectrum/theme-default": "^3.5.9",
-                "@react-spectrum/theme-light": "^3.4.9",
-                "@react-spectrum/tooltip": "^3.6.6",
-                "@react-spectrum/view": "^3.6.9",
-                "@react-spectrum/well": "^3.4.12",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/data": "^3.11.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.35.1",
+            "integrity": "sha512-QNhsaEHv5S5Vqsk7b8aCV9F7qAnWw8VJ/Nep/SOjeiJ7vK993jEOetEhSsUIQ8VHsMKs6qkTtZr0/DKoV+Z/9w==",
+            "dependencies": {
+                "@internationalized/string": "^3.2.3",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/ssr": "^3.9.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-spectrum/actionbar": "^3.4.5",
+                "@react-spectrum/actiongroup": "^3.10.5",
+                "@react-spectrum/avatar": "^3.0.12",
+                "@react-spectrum/badge": "^3.1.13",
+                "@react-spectrum/breadcrumbs": "^3.9.7",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/buttongroup": "^3.6.13",
+                "@react-spectrum/calendar": "^3.4.9",
+                "@react-spectrum/checkbox": "^3.9.6",
+                "@react-spectrum/combobox": "^3.12.5",
+                "@react-spectrum/contextualhelp": "^3.6.11",
+                "@react-spectrum/datepicker": "^3.9.6",
+                "@react-spectrum/dialog": "^3.8.11",
+                "@react-spectrum/divider": "^3.5.13",
+                "@react-spectrum/dnd": "^3.3.10",
+                "@react-spectrum/dropzone": "^3.0.1",
+                "@react-spectrum/filetrigger": "^3.0.1",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/icon": "^3.7.13",
+                "@react-spectrum/illustratedmessage": "^3.5.1",
+                "@react-spectrum/image": "^3.5.1",
+                "@react-spectrum/inlinealert": "^3.2.5",
+                "@react-spectrum/labeledvalue": "^3.1.14",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/link": "^3.6.7",
+                "@react-spectrum/list": "^3.7.10",
+                "@react-spectrum/listbox": "^3.12.9",
+                "@react-spectrum/menu": "^3.19.1",
+                "@react-spectrum/meter": "^3.5.1",
+                "@react-spectrum/numberfield": "^3.9.3",
+                "@react-spectrum/overlays": "^5.6.1",
+                "@react-spectrum/picker": "^3.14.5",
+                "@react-spectrum/progress": "^3.7.7",
+                "@react-spectrum/provider": "^3.9.7",
+                "@react-spectrum/radio": "^3.7.6",
+                "@react-spectrum/searchfield": "^3.8.6",
+                "@react-spectrum/slider": "^3.6.9",
+                "@react-spectrum/statuslight": "^3.5.13",
+                "@react-spectrum/switch": "^3.5.5",
+                "@react-spectrum/table": "^3.12.10",
+                "@react-spectrum/tabs": "^3.8.10",
+                "@react-spectrum/tag": "^3.2.6",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/textfield": "^3.12.1",
+                "@react-spectrum/theme-dark": "^3.5.10",
+                "@react-spectrum/theme-default": "^3.5.10",
+                "@react-spectrum/theme-light": "^3.4.10",
+                "@react-spectrum/tooltip": "^3.6.7",
+                "@react-spectrum/view": "^3.6.10",
+                "@react-spectrum/well": "^3.4.13",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/data": "^3.11.4",
+                "@react-types/shared": "^3.23.1",
                 "client-only": "^0.0.1"
             },
             "peerDependencies": {
@@ -568,7 +570,6 @@
         },
         "node_modules/@azure/storage-blob": {
             "version": "12.18.0",
-            "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.18.0.tgz",
             "integrity": "sha512-BzBZJobMoDyjJsPRMLNHvqHycTGrT8R/dtcTx9qUFcqwSRfGVK9A/cZ7Nx38UQydT9usZGbaDCN75QRNjezSAA==",
             "dependencies": {
                 "@azure/abort-controller": "^1.0.0",
@@ -585,11 +586,11 @@
             }
         },
         "node_modules/@babel/code-frame": {
-            "version": "7.24.2",
-            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz",
-            "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+            "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
             "dependencies": {
-                "@babel/highlight": "^7.24.2",
+                "@babel/highlight": "^7.24.7",
                 "picocolors": "^1.0.0"
             },
             "engines": {
@@ -597,29 +598,29 @@
             }
         },
         "node_modules/@babel/compat-data": {
-            "version": "7.24.4",
-            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz",
-            "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz",
+            "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==",
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/core": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz",
-            "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz",
+            "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==",
             "peer": true,
             "dependencies": {
                 "@ampproject/remapping": "^2.2.0",
-                "@babel/code-frame": "^7.24.2",
-                "@babel/generator": "^7.24.5",
-                "@babel/helper-compilation-targets": "^7.23.6",
-                "@babel/helper-module-transforms": "^7.24.5",
-                "@babel/helpers": "^7.24.5",
-                "@babel/parser": "^7.24.5",
-                "@babel/template": "^7.24.0",
-                "@babel/traverse": "^7.24.5",
-                "@babel/types": "^7.24.5",
+                "@babel/code-frame": "^7.24.7",
+                "@babel/generator": "^7.24.7",
+                "@babel/helper-compilation-targets": "^7.24.7",
+                "@babel/helper-module-transforms": "^7.24.7",
+                "@babel/helpers": "^7.24.7",
+                "@babel/parser": "^7.24.7",
+                "@babel/template": "^7.24.7",
+                "@babel/traverse": "^7.24.7",
+                "@babel/types": "^7.24.7",
                 "convert-source-map": "^2.0.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -635,11 +636,11 @@
             }
         },
         "node_modules/@babel/generator": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz",
-            "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz",
+            "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==",
             "dependencies": {
-                "@babel/types": "^7.24.5",
+                "@babel/types": "^7.24.7",
                 "@jridgewell/gen-mapping": "^0.3.5",
                 "@jridgewell/trace-mapping": "^0.3.25",
                 "jsesc": "^2.5.1"
@@ -649,34 +650,35 @@
             }
         },
         "node_modules/@babel/helper-annotate-as-pure": {
-            "version": "7.22.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
-            "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz",
+            "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==",
             "dependencies": {
-                "@babel/types": "^7.22.5"
+                "@babel/types": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-            "version": "7.22.15",
-            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz",
-            "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
+            "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
             "dependencies": {
-                "@babel/types": "^7.22.15"
+                "@babel/traverse": "^7.24.7",
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-compilation-targets": {
-            "version": "7.23.6",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
-            "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz",
+            "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==",
             "dependencies": {
-                "@babel/compat-data": "^7.23.5",
-                "@babel/helper-validator-option": "^7.23.5",
+                "@babel/compat-data": "^7.24.7",
+                "@babel/helper-validator-option": "^7.24.7",
                 "browserslist": "^4.22.2",
                 "lru-cache": "^5.1.1",
                 "semver": "^6.3.1"
@@ -686,18 +688,18 @@
             }
         },
         "node_modules/@babel/helper-create-class-features-plugin": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz",
-            "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==",
-            "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.22.5",
-                "@babel/helper-environment-visitor": "^7.22.20",
-                "@babel/helper-function-name": "^7.23.0",
-                "@babel/helper-member-expression-to-functions": "^7.24.5",
-                "@babel/helper-optimise-call-expression": "^7.22.5",
-                "@babel/helper-replace-supers": "^7.24.1",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-                "@babel/helper-split-export-declaration": "^7.24.5",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz",
+            "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==",
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.24.7",
+                "@babel/helper-environment-visitor": "^7.24.7",
+                "@babel/helper-function-name": "^7.24.7",
+                "@babel/helper-member-expression-to-functions": "^7.24.7",
+                "@babel/helper-optimise-call-expression": "^7.24.7",
+                "@babel/helper-replace-supers": "^7.24.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+                "@babel/helper-split-export-declaration": "^7.24.7",
                 "semver": "^6.3.1"
             },
             "engines": {
@@ -707,12 +709,23 @@
                 "@babel/core": "^7.0.0"
             }
         },
+        "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": {
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+            "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
+            "dependencies": {
+                "@babel/types": "^7.24.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/@babel/helper-create-regexp-features-plugin": {
-            "version": "7.22.15",
-            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz",
-            "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz",
+            "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==",
             "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.22.5",
+                "@babel/helper-annotate-as-pure": "^7.24.6",
                 "regexpu-core": "^5.3.1",
                 "semver": "^6.3.1"
             },
@@ -739,68 +752,72 @@
             }
         },
         "node_modules/@babel/helper-environment-visitor": {
-            "version": "7.22.20",
-            "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
-            "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
+            "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==",
+            "dependencies": {
+                "@babel/types": "^7.24.7"
+            },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-function-name": {
-            "version": "7.23.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
-            "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
+            "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
             "dependencies": {
-                "@babel/template": "^7.22.15",
-                "@babel/types": "^7.23.0"
+                "@babel/template": "^7.24.7",
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-hoist-variables": {
-            "version": "7.22.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
-            "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
+            "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
             "dependencies": {
-                "@babel/types": "^7.22.5"
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-member-expression-to-functions": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz",
-            "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz",
+            "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==",
             "dependencies": {
-                "@babel/types": "^7.24.5"
+                "@babel/traverse": "^7.24.7",
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-module-imports": {
-            "version": "7.24.3",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz",
-            "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz",
+            "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==",
             "dependencies": {
-                "@babel/types": "^7.24.0"
+                "@babel/types": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-module-transforms": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz",
-            "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz",
+            "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==",
             "dependencies": {
-                "@babel/helper-environment-visitor": "^7.22.20",
-                "@babel/helper-module-imports": "^7.24.3",
-                "@babel/helper-simple-access": "^7.24.5",
-                "@babel/helper-split-export-declaration": "^7.24.5",
-                "@babel/helper-validator-identifier": "^7.24.5"
+                "@babel/helper-environment-visitor": "^7.24.7",
+                "@babel/helper-module-imports": "^7.24.7",
+                "@babel/helper-simple-access": "^7.24.7",
+                "@babel/helper-split-export-declaration": "^7.24.7",
+                "@babel/helper-validator-identifier": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -809,33 +826,45 @@
                 "@babel/core": "^7.0.0"
             }
         },
+        "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-module-imports": {
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+            "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
+            "dependencies": {
+                "@babel/traverse": "^7.24.7",
+                "@babel/types": "^7.24.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/@babel/helper-optimise-call-expression": {
-            "version": "7.22.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
-            "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
+            "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
             "dependencies": {
-                "@babel/types": "^7.22.5"
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-plugin-utils": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz",
-            "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz",
+            "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==",
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-remap-async-to-generator": {
-            "version": "7.22.20",
-            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
-            "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz",
+            "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==",
             "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.22.5",
-                "@babel/helper-environment-visitor": "^7.22.20",
-                "@babel/helper-wrap-function": "^7.22.20"
+                "@babel/helper-annotate-as-pure": "^7.24.7",
+                "@babel/helper-environment-visitor": "^7.24.7",
+                "@babel/helper-wrap-function": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -844,14 +873,25 @@
                 "@babel/core": "^7.0.0"
             }
         },
+        "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": {
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+            "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
+            "dependencies": {
+                "@babel/types": "^7.24.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/@babel/helper-replace-supers": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz",
-            "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz",
+            "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==",
             "dependencies": {
-                "@babel/helper-environment-visitor": "^7.22.20",
-                "@babel/helper-member-expression-to-functions": "^7.23.0",
-                "@babel/helper-optimise-call-expression": "^7.22.5"
+                "@babel/helper-environment-visitor": "^7.24.7",
+                "@babel/helper-member-expression-to-functions": "^7.24.7",
+                "@babel/helper-optimise-call-expression": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -861,95 +901,97 @@
             }
         },
         "node_modules/@babel/helper-simple-access": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz",
-            "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+            "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
             "dependencies": {
-                "@babel/types": "^7.24.5"
+                "@babel/traverse": "^7.24.7",
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-            "version": "7.22.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
-            "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
+            "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
             "dependencies": {
-                "@babel/types": "^7.22.5"
+                "@babel/traverse": "^7.24.7",
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-split-export-declaration": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz",
-            "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
+            "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
             "dependencies": {
-                "@babel/types": "^7.24.5"
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-string-parser": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz",
-            "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz",
+            "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==",
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-validator-identifier": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz",
-            "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+            "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-validator-option": {
-            "version": "7.23.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
-            "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz",
+            "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==",
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-wrap-function": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz",
-            "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz",
+            "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==",
             "dependencies": {
-                "@babel/helper-function-name": "^7.23.0",
-                "@babel/template": "^7.24.0",
-                "@babel/types": "^7.24.5"
+                "@babel/helper-function-name": "^7.24.7",
+                "@babel/template": "^7.24.7",
+                "@babel/traverse": "^7.24.7",
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helpers": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz",
-            "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz",
+            "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==",
             "peer": true,
             "dependencies": {
-                "@babel/template": "^7.24.0",
-                "@babel/traverse": "^7.24.5",
-                "@babel/types": "^7.24.5"
+                "@babel/template": "^7.24.7",
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/highlight": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz",
-            "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+            "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
             "dependencies": {
-                "@babel/helper-validator-identifier": "^7.24.5",
+                "@babel/helper-validator-identifier": "^7.24.7",
                 "chalk": "^2.4.2",
                 "js-tokens": "^4.0.0",
                 "picocolors": "^1.0.0"
@@ -959,9 +1001,9 @@
             }
         },
         "node_modules/@babel/parser": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz",
-            "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz",
+            "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==",
             "bin": {
                 "parser": "bin/babel-parser.js"
             },
@@ -970,12 +1012,12 @@
             }
         },
         "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz",
-            "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz",
+            "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==",
             "dependencies": {
-                "@babel/helper-environment-visitor": "^7.22.20",
-                "@babel/helper-plugin-utils": "^7.24.5"
+                "@babel/helper-environment-visitor": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -985,11 +1027,11 @@
             }
         },
         "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz",
-            "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz",
+            "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -999,13 +1041,13 @@
             }
         },
         "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz",
-            "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz",
+            "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-                "@babel/plugin-transform-optional-chaining": "^7.24.1"
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6",
+                "@babel/plugin-transform-optional-chaining": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1015,12 +1057,12 @@
             }
         },
         "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz",
-            "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz",
+            "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==",
             "dependencies": {
-                "@babel/helper-environment-visitor": "^7.22.20",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-environment-visitor": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1099,11 +1141,11 @@
             }
         },
         "node_modules/@babel/plugin-syntax-import-assertions": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz",
-            "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz",
+            "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1113,11 +1155,11 @@
             }
         },
         "node_modules/@babel/plugin-syntax-import-attributes": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz",
-            "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz",
+            "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1149,11 +1191,11 @@
             }
         },
         "node_modules/@babel/plugin-syntax-jsx": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz",
-            "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
+            "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1162,6 +1204,14 @@
                 "@babel/core": "^7.0.0-0"
             }
         },
+        "node_modules/@babel/plugin-syntax-jsx/node_modules/@babel/helper-plugin-utils": {
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
+            "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
             "version": "7.10.4",
             "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
@@ -1272,11 +1322,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-arrow-functions": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz",
-            "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz",
+            "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1286,13 +1336,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-async-generator-functions": {
-            "version": "7.24.3",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz",
-            "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz",
+            "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==",
             "dependencies": {
-                "@babel/helper-environment-visitor": "^7.22.20",
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/helper-remap-async-to-generator": "^7.22.20",
+                "@babel/helper-environment-visitor": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-remap-async-to-generator": "^7.24.6",
                 "@babel/plugin-syntax-async-generators": "^7.8.4"
             },
             "engines": {
@@ -1303,13 +1353,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-async-to-generator": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz",
-            "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz",
+            "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==",
             "dependencies": {
-                "@babel/helper-module-imports": "^7.24.1",
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/helper-remap-async-to-generator": "^7.22.20"
+                "@babel/helper-module-imports": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-remap-async-to-generator": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1319,11 +1369,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-block-scoped-functions": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz",
-            "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz",
+            "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1333,11 +1383,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-block-scoping": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz",
-            "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz",
+            "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.5"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1347,12 +1397,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-class-properties": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz",
-            "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz",
+            "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==",
             "dependencies": {
-                "@babel/helper-create-class-features-plugin": "^7.24.1",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-create-class-features-plugin": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1362,12 +1412,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-class-static-block": {
-            "version": "7.24.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz",
-            "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz",
+            "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==",
             "dependencies": {
-                "@babel/helper-create-class-features-plugin": "^7.24.4",
-                "@babel/helper-plugin-utils": "^7.24.0",
+                "@babel/helper-create-class-features-plugin": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-class-static-block": "^7.14.5"
             },
             "engines": {
@@ -1378,17 +1428,17 @@
             }
         },
         "node_modules/@babel/plugin-transform-classes": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz",
-            "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==",
-            "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.22.5",
-                "@babel/helper-compilation-targets": "^7.23.6",
-                "@babel/helper-environment-visitor": "^7.22.20",
-                "@babel/helper-function-name": "^7.23.0",
-                "@babel/helper-plugin-utils": "^7.24.5",
-                "@babel/helper-replace-supers": "^7.24.1",
-                "@babel/helper-split-export-declaration": "^7.24.5",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz",
+            "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==",
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.24.6",
+                "@babel/helper-compilation-targets": "^7.24.6",
+                "@babel/helper-environment-visitor": "^7.24.6",
+                "@babel/helper-function-name": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-replace-supers": "^7.24.6",
+                "@babel/helper-split-export-declaration": "^7.24.6",
                 "globals": "^11.1.0"
             },
             "engines": {
@@ -1407,12 +1457,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-computed-properties": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz",
-            "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz",
+            "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/template": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/template": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1422,11 +1472,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-destructuring": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz",
-            "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz",
+            "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.5"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1436,12 +1486,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-dotall-regex": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz",
-            "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz",
+            "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==",
             "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1451,11 +1501,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-duplicate-keys": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz",
-            "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz",
+            "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1465,11 +1515,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-dynamic-import": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz",
-            "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz",
+            "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-dynamic-import": "^7.8.3"
             },
             "engines": {
@@ -1480,12 +1530,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-exponentiation-operator": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz",
-            "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz",
+            "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==",
             "dependencies": {
-                "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1495,11 +1545,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-export-namespace-from": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz",
-            "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz",
+            "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
             },
             "engines": {
@@ -1510,12 +1560,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-for-of": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz",
-            "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz",
+            "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1525,13 +1575,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-function-name": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz",
-            "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz",
+            "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==",
             "dependencies": {
-                "@babel/helper-compilation-targets": "^7.23.6",
-                "@babel/helper-function-name": "^7.23.0",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-compilation-targets": "^7.24.6",
+                "@babel/helper-function-name": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1541,11 +1591,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-json-strings": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz",
-            "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz",
+            "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-json-strings": "^7.8.3"
             },
             "engines": {
@@ -1556,11 +1606,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-literals": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz",
-            "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz",
+            "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1570,11 +1620,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-logical-assignment-operators": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz",
-            "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz",
+            "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
             },
             "engines": {
@@ -1585,11 +1635,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-member-expression-literals": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz",
-            "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz",
+            "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1599,12 +1649,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-amd": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz",
-            "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz",
+            "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==",
             "dependencies": {
-                "@babel/helper-module-transforms": "^7.23.3",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-module-transforms": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1614,13 +1664,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-commonjs": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz",
-            "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz",
+            "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==",
             "dependencies": {
-                "@babel/helper-module-transforms": "^7.23.3",
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/helper-simple-access": "^7.22.5"
+                "@babel/helper-module-transforms": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-simple-access": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1630,14 +1680,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-systemjs": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz",
-            "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz",
+            "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==",
             "dependencies": {
-                "@babel/helper-hoist-variables": "^7.22.5",
-                "@babel/helper-module-transforms": "^7.23.3",
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/helper-validator-identifier": "^7.22.20"
+                "@babel/helper-hoist-variables": "^7.24.6",
+                "@babel/helper-module-transforms": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-validator-identifier": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1647,12 +1697,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-modules-umd": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz",
-            "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz",
+            "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==",
             "dependencies": {
-                "@babel/helper-module-transforms": "^7.23.3",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-module-transforms": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1662,12 +1712,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-            "version": "7.22.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
-            "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz",
+            "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==",
             "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-                "@babel/helper-plugin-utils": "^7.22.5"
+                "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1677,11 +1727,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-new-target": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz",
-            "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz",
+            "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1691,11 +1741,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz",
-            "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz",
+            "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
             },
             "engines": {
@@ -1706,11 +1756,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-numeric-separator": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz",
-            "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz",
+            "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-numeric-separator": "^7.10.4"
             },
             "engines": {
@@ -1721,14 +1771,14 @@
             }
         },
         "node_modules/@babel/plugin-transform-object-rest-spread": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz",
-            "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz",
+            "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==",
             "dependencies": {
-                "@babel/helper-compilation-targets": "^7.23.6",
-                "@babel/helper-plugin-utils": "^7.24.5",
+                "@babel/helper-compilation-targets": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-                "@babel/plugin-transform-parameters": "^7.24.5"
+                "@babel/plugin-transform-parameters": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1738,12 +1788,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-object-super": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz",
-            "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz",
+            "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/helper-replace-supers": "^7.24.1"
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-replace-supers": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1753,11 +1803,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-optional-catch-binding": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz",
-            "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz",
+            "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
             },
             "engines": {
@@ -1768,12 +1818,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-optional-chaining": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz",
-            "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz",
+            "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.5",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+                "@babel/helper-plugin-utils": "^7.24.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
                 "@babel/plugin-syntax-optional-chaining": "^7.8.3"
             },
             "engines": {
@@ -1783,12 +1833,20 @@
                 "@babel/core": "^7.0.0-0"
             }
         },
+        "node_modules/@babel/plugin-transform-optional-chaining/node_modules/@babel/helper-plugin-utils": {
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
+            "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/@babel/plugin-transform-parameters": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz",
-            "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
+            "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.5"
+                "@babel/helper-plugin-utils": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1797,13 +1855,21 @@
                 "@babel/core": "^7.0.0-0"
             }
         },
+        "node_modules/@babel/plugin-transform-parameters/node_modules/@babel/helper-plugin-utils": {
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
+            "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
         "node_modules/@babel/plugin-transform-private-methods": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz",
-            "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz",
+            "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==",
             "dependencies": {
-                "@babel/helper-create-class-features-plugin": "^7.24.1",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-create-class-features-plugin": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1813,13 +1879,13 @@
             }
         },
         "node_modules/@babel/plugin-transform-private-property-in-object": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz",
-            "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz",
+            "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==",
             "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.22.5",
-                "@babel/helper-create-class-features-plugin": "^7.24.5",
-                "@babel/helper-plugin-utils": "^7.24.5",
+                "@babel/helper-annotate-as-pure": "^7.24.6",
+                "@babel/helper-create-class-features-plugin": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
             },
             "engines": {
@@ -1830,11 +1896,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-property-literals": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz",
-            "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz",
+            "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1844,11 +1910,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-react-display-name": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz",
-            "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.6.tgz",
+            "integrity": "sha512-/3iiEEHDsJuj9QU09gbyWGSUxDboFcD7Nj6dnHIlboWSodxXAoaY/zlNMHeYAC0WsERMqgO9a7UaM77CsYgWcg==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1858,15 +1924,15 @@
             }
         },
         "node_modules/@babel/plugin-transform-react-jsx": {
-            "version": "7.23.4",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz",
-            "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.6.tgz",
+            "integrity": "sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==",
             "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.22.5",
-                "@babel/helper-module-imports": "^7.22.15",
-                "@babel/helper-plugin-utils": "^7.22.5",
-                "@babel/plugin-syntax-jsx": "^7.23.3",
-                "@babel/types": "^7.23.4"
+                "@babel/helper-annotate-as-pure": "^7.24.6",
+                "@babel/helper-module-imports": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/plugin-syntax-jsx": "^7.24.6",
+                "@babel/types": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1876,11 +1942,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-react-jsx-development": {
-            "version": "7.22.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz",
-            "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.6.tgz",
+            "integrity": "sha512-F7EsNp5StNDouSSdYyDSxh4J+xvj/JqG+Cb6s2fA+jCyHOzigG5vTwgH8tU2U8Voyiu5zCG9bAK49wTr/wPH0w==",
             "dependencies": {
-                "@babel/plugin-transform-react-jsx": "^7.22.5"
+                "@babel/plugin-transform-react-jsx": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1890,12 +1956,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-react-pure-annotations": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz",
-            "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.6.tgz",
+            "integrity": "sha512-0HoDQlFJJkXRyV2N+xOpUETbKHcouSwijRQbKWVtxsPoq5bbB30qZag9/pSc5xcWVYjTHlLsBsY+hZDnzQTPNw==",
             "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.22.5",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-annotate-as-pure": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1905,11 +1971,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-regenerator": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz",
-            "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz",
+            "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
+                "@babel/helper-plugin-utils": "^7.24.6",
                 "regenerator-transform": "^0.15.2"
             },
             "engines": {
@@ -1920,11 +1986,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-reserved-words": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz",
-            "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz",
+            "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1934,11 +2000,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-shorthand-properties": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz",
-            "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz",
+            "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1948,12 +2014,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-spread": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz",
-            "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz",
+            "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1963,11 +2029,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-sticky-regex": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz",
-            "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz",
+            "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1977,11 +2043,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-template-literals": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz",
-            "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz",
+            "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -1991,11 +2057,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-typeof-symbol": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz",
-            "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz",
+            "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.5"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -2005,11 +2071,11 @@
             }
         },
         "node_modules/@babel/plugin-transform-unicode-escapes": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz",
-            "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz",
+            "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -2019,12 +2085,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-unicode-property-regex": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz",
-            "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz",
+            "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==",
             "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -2034,12 +2100,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-unicode-regex": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz",
-            "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz",
+            "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==",
             "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -2049,12 +2115,12 @@
             }
         },
         "node_modules/@babel/plugin-transform-unicode-sets-regex": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz",
-            "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz",
+            "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==",
             "dependencies": {
-                "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-                "@babel/helper-plugin-utils": "^7.24.0"
+                "@babel/helper-create-regexp-features-plugin": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -2064,26 +2130,25 @@
             }
         },
         "node_modules/@babel/preset-env": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz",
-            "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==",
-            "dependencies": {
-                "@babel/compat-data": "^7.24.4",
-                "@babel/helper-compilation-targets": "^7.23.6",
-                "@babel/helper-plugin-utils": "^7.24.5",
-                "@babel/helper-validator-option": "^7.23.5",
-                "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5",
-                "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1",
-                "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1",
-                "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1",
+            "version": "7.24.6",
+            "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==",
+            "dependencies": {
+                "@babel/compat-data": "^7.24.6",
+                "@babel/helper-compilation-targets": "^7.24.6",
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-validator-option": "^7.24.6",
+                "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6",
+                "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6",
+                "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6",
+                "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6",
                 "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
                 "@babel/plugin-syntax-async-generators": "^7.8.4",
                 "@babel/plugin-syntax-class-properties": "^7.12.13",
                 "@babel/plugin-syntax-class-static-block": "^7.14.5",
                 "@babel/plugin-syntax-dynamic-import": "^7.8.3",
                 "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-                "@babel/plugin-syntax-import-assertions": "^7.24.1",
-                "@babel/plugin-syntax-import-attributes": "^7.24.1",
+                "@babel/plugin-syntax-import-assertions": "^7.24.6",
+                "@babel/plugin-syntax-import-attributes": "^7.24.6",
                 "@babel/plugin-syntax-import-meta": "^7.10.4",
                 "@babel/plugin-syntax-json-strings": "^7.8.3",
                 "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
@@ -2095,54 +2160,54 @@
                 "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
                 "@babel/plugin-syntax-top-level-await": "^7.14.5",
                 "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
-                "@babel/plugin-transform-arrow-functions": "^7.24.1",
-                "@babel/plugin-transform-async-generator-functions": "^7.24.3",
-                "@babel/plugin-transform-async-to-generator": "^7.24.1",
-                "@babel/plugin-transform-block-scoped-functions": "^7.24.1",
-                "@babel/plugin-transform-block-scoping": "^7.24.5",
-                "@babel/plugin-transform-class-properties": "^7.24.1",
-                "@babel/plugin-transform-class-static-block": "^7.24.4",
-                "@babel/plugin-transform-classes": "^7.24.5",
-                "@babel/plugin-transform-computed-properties": "^7.24.1",
-                "@babel/plugin-transform-destructuring": "^7.24.5",
-                "@babel/plugin-transform-dotall-regex": "^7.24.1",
-                "@babel/plugin-transform-duplicate-keys": "^7.24.1",
-                "@babel/plugin-transform-dynamic-import": "^7.24.1",
-                "@babel/plugin-transform-exponentiation-operator": "^7.24.1",
-                "@babel/plugin-transform-export-namespace-from": "^7.24.1",
-                "@babel/plugin-transform-for-of": "^7.24.1",
-                "@babel/plugin-transform-function-name": "^7.24.1",
-                "@babel/plugin-transform-json-strings": "^7.24.1",
-                "@babel/plugin-transform-literals": "^7.24.1",
-                "@babel/plugin-transform-logical-assignment-operators": "^7.24.1",
-                "@babel/plugin-transform-member-expression-literals": "^7.24.1",
-                "@babel/plugin-transform-modules-amd": "^7.24.1",
-                "@babel/plugin-transform-modules-commonjs": "^7.24.1",
-                "@babel/plugin-transform-modules-systemjs": "^7.24.1",
-                "@babel/plugin-transform-modules-umd": "^7.24.1",
-                "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
-                "@babel/plugin-transform-new-target": "^7.24.1",
-                "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1",
-                "@babel/plugin-transform-numeric-separator": "^7.24.1",
-                "@babel/plugin-transform-object-rest-spread": "^7.24.5",
-                "@babel/plugin-transform-object-super": "^7.24.1",
-                "@babel/plugin-transform-optional-catch-binding": "^7.24.1",
-                "@babel/plugin-transform-optional-chaining": "^7.24.5",
-                "@babel/plugin-transform-parameters": "^7.24.5",
-                "@babel/plugin-transform-private-methods": "^7.24.1",
-                "@babel/plugin-transform-private-property-in-object": "^7.24.5",
-                "@babel/plugin-transform-property-literals": "^7.24.1",
-                "@babel/plugin-transform-regenerator": "^7.24.1",
-                "@babel/plugin-transform-reserved-words": "^7.24.1",
-                "@babel/plugin-transform-shorthand-properties": "^7.24.1",
-                "@babel/plugin-transform-spread": "^7.24.1",
-                "@babel/plugin-transform-sticky-regex": "^7.24.1",
-                "@babel/plugin-transform-template-literals": "^7.24.1",
-                "@babel/plugin-transform-typeof-symbol": "^7.24.5",
-                "@babel/plugin-transform-unicode-escapes": "^7.24.1",
-                "@babel/plugin-transform-unicode-property-regex": "^7.24.1",
-                "@babel/plugin-transform-unicode-regex": "^7.24.1",
-                "@babel/plugin-transform-unicode-sets-regex": "^7.24.1",
+                "@babel/plugin-transform-arrow-functions": "^7.24.6",
+                "@babel/plugin-transform-async-generator-functions": "^7.24.6",
+                "@babel/plugin-transform-async-to-generator": "^7.24.6",
+                "@babel/plugin-transform-block-scoped-functions": "^7.24.6",
+                "@babel/plugin-transform-block-scoping": "^7.24.6",
+                "@babel/plugin-transform-class-properties": "^7.24.6",
+                "@babel/plugin-transform-class-static-block": "^7.24.6",
+                "@babel/plugin-transform-classes": "^7.24.6",
+                "@babel/plugin-transform-computed-properties": "^7.24.6",
+                "@babel/plugin-transform-destructuring": "^7.24.6",
+                "@babel/plugin-transform-dotall-regex": "^7.24.6",
+                "@babel/plugin-transform-duplicate-keys": "^7.24.6",
+                "@babel/plugin-transform-dynamic-import": "^7.24.6",
+                "@babel/plugin-transform-exponentiation-operator": "^7.24.6",
+                "@babel/plugin-transform-export-namespace-from": "^7.24.6",
+                "@babel/plugin-transform-for-of": "^7.24.6",
+                "@babel/plugin-transform-function-name": "^7.24.6",
+                "@babel/plugin-transform-json-strings": "^7.24.6",
+                "@babel/plugin-transform-literals": "^7.24.6",
+                "@babel/plugin-transform-logical-assignment-operators": "^7.24.6",
+                "@babel/plugin-transform-member-expression-literals": "^7.24.6",
+                "@babel/plugin-transform-modules-amd": "^7.24.6",
+                "@babel/plugin-transform-modules-commonjs": "^7.24.6",
+                "@babel/plugin-transform-modules-systemjs": "^7.24.6",
+                "@babel/plugin-transform-modules-umd": "^7.24.6",
+                "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6",
+                "@babel/plugin-transform-new-target": "^7.24.6",
+                "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6",
+                "@babel/plugin-transform-numeric-separator": "^7.24.6",
+                "@babel/plugin-transform-object-rest-spread": "^7.24.6",
+                "@babel/plugin-transform-object-super": "^7.24.6",
+                "@babel/plugin-transform-optional-catch-binding": "^7.24.6",
+                "@babel/plugin-transform-optional-chaining": "^7.24.6",
+                "@babel/plugin-transform-parameters": "^7.24.6",
+                "@babel/plugin-transform-private-methods": "^7.24.6",
+                "@babel/plugin-transform-private-property-in-object": "^7.24.6",
+                "@babel/plugin-transform-property-literals": "^7.24.6",
+                "@babel/plugin-transform-regenerator": "^7.24.6",
+                "@babel/plugin-transform-reserved-words": "^7.24.6",
+                "@babel/plugin-transform-shorthand-properties": "^7.24.6",
+                "@babel/plugin-transform-spread": "^7.24.6",
+                "@babel/plugin-transform-sticky-regex": "^7.24.6",
+                "@babel/plugin-transform-template-literals": "^7.24.6",
+                "@babel/plugin-transform-typeof-symbol": "^7.24.6",
+                "@babel/plugin-transform-unicode-escapes": "^7.24.6",
+                "@babel/plugin-transform-unicode-property-regex": "^7.24.6",
+                "@babel/plugin-transform-unicode-regex": "^7.24.6",
+                "@babel/plugin-transform-unicode-sets-regex": "^7.24.6",
                 "@babel/preset-modules": "0.1.6-no-external-plugins",
                 "babel-plugin-polyfill-corejs2": "^0.4.10",
                 "babel-plugin-polyfill-corejs3": "^0.10.4",
@@ -2171,16 +2236,15 @@
             }
         },
         "node_modules/@babel/preset-react": {
-            "version": "7.24.1",
-            "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz",
-            "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==",
+            "version": "7.24.6",
+            "integrity": "sha512-8mpzh1bWvmINmwM3xpz6ahu57mNaWavMm+wBNjQ4AFu1nghKBiIRET7l/Wmj4drXany/BBGjJZngICcD98F1iw==",
             "dependencies": {
-                "@babel/helper-plugin-utils": "^7.24.0",
-                "@babel/helper-validator-option": "^7.23.5",
-                "@babel/plugin-transform-react-display-name": "^7.24.1",
-                "@babel/plugin-transform-react-jsx": "^7.23.4",
-                "@babel/plugin-transform-react-jsx-development": "^7.22.5",
-                "@babel/plugin-transform-react-pure-annotations": "^7.24.1"
+                "@babel/helper-plugin-utils": "^7.24.6",
+                "@babel/helper-validator-option": "^7.24.6",
+                "@babel/plugin-transform-react-display-name": "^7.24.6",
+                "@babel/plugin-transform-react-jsx": "^7.24.6",
+                "@babel/plugin-transform-react-jsx-development": "^7.24.6",
+                "@babel/plugin-transform-react-pure-annotations": "^7.24.6"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -2195,9 +2259,9 @@
             "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
         },
         "node_modules/@babel/runtime": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
-            "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz",
+            "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==",
             "dependencies": {
                 "regenerator-runtime": "^0.14.0"
             },
@@ -2206,9 +2270,9 @@
             }
         },
         "node_modules/@babel/runtime-corejs3": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.5.tgz",
-            "integrity": "sha512-GWO0mgzNMLWaSYM4z4NVIuY0Cd1fl8cPnuetuddu5w/qGuvt5Y7oUi/kvvQGK9xgOkFJDQX2heIvTRn/OQ1XTg==",
+            "version": "7.24.6",
+            "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.6.tgz",
+            "integrity": "sha512-tbC3o8uHK9xMgMsvUm9qGqxVpbv6yborMBLbDteHIc7JDNHsTV0vDMQ5j1O1NXvO+BDELtL9KgoWYaUVIVGt8w==",
             "dependencies": {
                 "core-js-pure": "^3.30.2",
                 "regenerator-runtime": "^0.14.0"
@@ -2218,31 +2282,31 @@
             }
         },
         "node_modules/@babel/template": {
-            "version": "7.24.0",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz",
-            "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
+            "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
             "dependencies": {
-                "@babel/code-frame": "^7.23.5",
-                "@babel/parser": "^7.24.0",
-                "@babel/types": "^7.24.0"
+                "@babel/code-frame": "^7.24.7",
+                "@babel/parser": "^7.24.7",
+                "@babel/types": "^7.24.7"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/traverse": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz",
-            "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==",
-            "dependencies": {
-                "@babel/code-frame": "^7.24.2",
-                "@babel/generator": "^7.24.5",
-                "@babel/helper-environment-visitor": "^7.22.20",
-                "@babel/helper-function-name": "^7.23.0",
-                "@babel/helper-hoist-variables": "^7.22.5",
-                "@babel/helper-split-export-declaration": "^7.24.5",
-                "@babel/parser": "^7.24.5",
-                "@babel/types": "^7.24.5",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz",
+            "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==",
+            "dependencies": {
+                "@babel/code-frame": "^7.24.7",
+                "@babel/generator": "^7.24.7",
+                "@babel/helper-environment-visitor": "^7.24.7",
+                "@babel/helper-function-name": "^7.24.7",
+                "@babel/helper-hoist-variables": "^7.24.7",
+                "@babel/helper-split-export-declaration": "^7.24.7",
+                "@babel/parser": "^7.24.7",
+                "@babel/types": "^7.24.7",
                 "debug": "^4.3.1",
                 "globals": "^11.1.0"
             },
@@ -2259,12 +2323,12 @@
             }
         },
         "node_modules/@babel/types": {
-            "version": "7.24.5",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz",
-            "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==",
+            "version": "7.24.7",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz",
+            "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==",
             "dependencies": {
-                "@babel/helper-string-parser": "^7.24.1",
-                "@babel/helper-validator-identifier": "^7.24.5",
+                "@babel/helper-string-parser": "^7.24.7",
+                "@babel/helper-validator-identifier": "^7.24.7",
                 "to-fast-properties": "^2.0.0"
             },
             "engines": {
@@ -2426,12 +2490,6 @@
                 }
             }
         },
-        "node_modules/@emotion/stylis": {
-            "version": "0.8.5",
-            "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
-            "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==",
-            "peer": true
-        },
         "node_modules/@emotion/unitless": {
             "version": "0.8.1",
             "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
@@ -2551,7 +2609,6 @@
         },
         "node_modules/@eslint/js": {
             "version": "9.3.0",
-            "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz",
             "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==",
             "dev": true,
             "engines": {
@@ -2735,9 +2792,8 @@
             }
         },
         "node_modules/@fortawesome/react-fontawesome": {
-            "version": "0.2.1",
-            "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.1.tgz",
-            "integrity": "sha512-ldr5QO2MneAX5W5WBCYB2pZp/PiHDD1hy9YEBLcXUyJb0qnO86oP8RU+CgmYVSH/R4Dbe2ernhcWOrcgaKD9NQ==",
+            "version": "0.2.2",
+            "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==",
             "dependencies": {
                 "prop-types": "^15.8.1"
             },
@@ -2747,30 +2803,28 @@
             }
         },
         "node_modules/@fullcalendar/core": {
-            "version": "6.1.11",
-            "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.11.tgz",
-            "integrity": "sha512-TjG7c8sUz+Vkui2FyCNJ+xqyu0nq653Ibe99A66LoW95oBo6tVhhKIaG1Wh0GVKymYiqAQN/OEdYTuj4ay27kA==",
+            "version": "6.1.14",
+            "integrity": "sha512-hIPRBevm0aMc2aHy1hRIJgXmI1QTvQM1neQa9oxtuqUmF1+ApYC3oAdwcQMTuI7lHHw3pKJDyJFkKLPPnL6HXA==",
             "dependencies": {
                 "preact": "~10.12.1"
             }
         },
         "node_modules/@fullcalendar/daygrid": {
-            "version": "6.1.11",
-            "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.11.tgz",
-            "integrity": "sha512-hF5jJB7cgUIxWD5MVjj8IU407HISyLu7BWXcEIuTytkfr8oolOXeCazqnnjmRbnFOncoJQVstTtq6SIhaT32Xg==",
+            "version": "6.1.14",
+            "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.14.tgz",
+            "integrity": "sha512-DSyjiA1dEM8k3bOCrZpZOmAOZu71KGtH02ze+4QKuhxkmn/zQghmmLRdfzpOrcyJg6xGKkoB4pBcO+2lXar8XQ==",
             "peerDependencies": {
-                "@fullcalendar/core": "~6.1.11"
+                "@fullcalendar/core": "~6.1.14"
             }
         },
         "node_modules/@fullcalendar/multimonth": {
-            "version": "6.1.11",
-            "resolved": "https://registry.npmjs.org/@fullcalendar/multimonth/-/multimonth-6.1.11.tgz",
-            "integrity": "sha512-7DbPC+AAlaKnquGVdw1Z85Q3nSZ4GZ1NcVIk4k7bLnqDlntwHPPsrDlSIzUWKcN0q5/u7jQHm4PU1m3LAl70Sg==",
+            "version": "6.1.13",
+            "integrity": "sha512-fn0BaLaMNkLmFzxijGZXYcO/fHQkuCcQV1R44mnu/01V4uSnFM1KPt2+V+6SgNiW1+ZNkUBHkkSLST1XdZjodw==",
             "dependencies": {
-                "@fullcalendar/daygrid": "~6.1.11"
+                "@fullcalendar/daygrid": "~6.1.13"
             },
             "peerDependencies": {
-                "@fullcalendar/core": "~6.1.11"
+                "@fullcalendar/core": "~6.1.13"
             }
         },
         "node_modules/@googlemaps/js-api-loader": {
@@ -2794,6 +2848,7 @@
             "version": "0.11.14",
             "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
             "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+            "deprecated": "Use @eslint/config-array instead",
             "dependencies": {
                 "@humanwhocodes/object-schema": "^2.0.2",
                 "debug": "^4.3.1",
@@ -2838,7 +2893,8 @@
         "node_modules/@humanwhocodes/object-schema": {
             "version": "2.0.3",
             "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
-            "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="
+            "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+            "deprecated": "Use @eslint/object-schema instead"
         },
         "node_modules/@icons/material": {
             "version": "0.2.4",
@@ -2849,34 +2905,34 @@
             }
         },
         "node_modules/@internationalized/date": {
-            "version": "3.5.3",
-            "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.3.tgz",
-            "integrity": "sha512-X9bi8NAEHAjD8yzmPYT2pdJsbe+tYSEBAfowtlxJVJdZR3aK8Vg7ZUT1Fm5M47KLzp/M1p1VwAaeSma3RT7biw==",
+            "version": "3.5.4",
+            "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.4.tgz",
+            "integrity": "sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==",
             "dependencies": {
                 "@swc/helpers": "^0.5.0"
             }
         },
         "node_modules/@internationalized/message": {
-            "version": "3.1.3",
-            "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.3.tgz",
-            "integrity": "sha512-jba3kGxnh4hN4zoeJZuMft99Ly1zbmon4fyDz3VAmO39Kb5Aw+usGub7oU/sGoBIcVQ7REEwsvjIWtIO1nitbw==",
+            "version": "3.1.4",
+            "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.4.tgz",
+            "integrity": "sha512-Dygi9hH1s7V9nha07pggCkvmRfDd3q2lWnMGvrJyrOwYMe1yj4D2T9BoH9I6MGR7xz0biQrtLPsqUkqXzIrBOw==",
             "dependencies": {
                 "@swc/helpers": "^0.5.0",
                 "intl-messageformat": "^10.1.0"
             }
         },
         "node_modules/@internationalized/number": {
-            "version": "3.5.2",
-            "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.2.tgz",
-            "integrity": "sha512-4FGHTi0rOEX1giSkt5MH4/te0eHBq3cvAYsfLlpguV6pzJAReXymiYpE5wPCqKqjkUO3PIsyvk+tBiIV1pZtbA==",
+            "version": "3.5.3",
+            "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.3.tgz",
+            "integrity": "sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==",
             "dependencies": {
                 "@swc/helpers": "^0.5.0"
             }
         },
         "node_modules/@internationalized/string": {
-            "version": "3.2.2",
-            "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.2.tgz",
-            "integrity": "sha512-5xy2JfSQyGqL9FDIdJXVjoKSBBDJR4lvwoCbqKhc5hQZ/qSLU/OlONCmrJPcSH0zxh88lXJMzbOAk8gJ48JBFw==",
+            "version": "3.2.3",
+            "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.3.tgz",
+            "integrity": "sha512-9kpfLoA8HegiWTeCbR2livhdVeKobCnVv8tlJ6M2jF+4tcMqDo94ezwlnrUANBWPgd8U7OXIHCk2Ov2qhk4KXw==",
             "dependencies": {
                 "@swc/helpers": "^0.5.0"
             }
@@ -2922,6 +2978,11 @@
                 "url": "https://github.com/chalk/strip-ansi?sponsor=1"
             }
         },
+        "node_modules/@isaacs/string-locale-compare": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz",
+            "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ=="
+        },
         "node_modules/@jest/schemas": {
             "version": "29.6.3",
             "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
@@ -3473,42 +3534,6 @@
                 "tslib": "2"
             }
         },
-        "node_modules/@jsonjoy.com/json-pack": {
-            "version": "1.0.4",
-            "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz",
-            "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==",
-            "dependencies": {
-                "@jsonjoy.com/base64": "^1.1.1",
-                "@jsonjoy.com/util": "^1.1.2",
-                "hyperdyperid": "^1.2.0",
-                "thingies": "^1.20.0"
-            },
-            "engines": {
-                "node": ">=10.0"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/streamich"
-            },
-            "peerDependencies": {
-                "tslib": "2"
-            }
-        },
-        "node_modules/@jsonjoy.com/util": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.1.3.tgz",
-            "integrity": "sha512-g//kkF4kOwUjemValCtOc/xiYzmwMRmWq3Bn+YnzOzuZLHq2PpMOxxIayN3cKbo7Ko2Np65t6D9H81IvXbXhqg==",
-            "engines": {
-                "node": ">=10.0"
-            },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/streamich"
-            },
-            "peerDependencies": {
-                "tslib": "2"
-            }
-        },
         "node_modules/@kurkle/color": {
             "version": "0.3.2",
             "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz",
@@ -3520,29 +3545,6 @@
             "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
             "dev": true
         },
-        "node_modules/@mapbox/geojson-rewind": {
-            "version": "0.5.2",
-            "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz",
-            "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==",
-            "dependencies": {
-                "get-stream": "^6.0.1",
-                "minimist": "^1.2.6"
-            },
-            "bin": {
-                "geojson-rewind": "geojson-rewind"
-            }
-        },
-        "node_modules/@mapbox/geojson-rewind/node_modules/get-stream": {
-            "version": "6.0.1",
-            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-            "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
         "node_modules/@mapbox/jsonlint-lines-primitives": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz",
@@ -3588,6 +3590,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dependencies": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -3618,6 +3621,7 @@
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
             "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+            "deprecated": "Rimraf versions prior to v4 are no longer supported",
             "dependencies": {
                 "glob": "^7.1.3"
             },
@@ -3728,9 +3732,9 @@
             }
         },
         "node_modules/@mui/core-downloads-tracker": {
-            "version": "5.15.18",
-            "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.18.tgz",
-            "integrity": "sha512-/9pVk+Al8qxAjwFUADv4BRZgMpZM4m5E+2Q/20qhVPuIJWqKp4Ie4tGExac6zu93rgPTYVQGgu+1vjiT0E+cEw==",
+            "version": "5.15.20",
+            "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.20.tgz",
+            "integrity": "sha512-DoL2ppgldL16utL8nNyj/P12f8mCNdx/Hb/AJnX9rLY4b52hCMIx1kH83pbXQ6uMy6n54M3StmEbvSGoj2OFuA==",
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/mui-org"
@@ -3738,7 +3742,6 @@
         },
         "node_modules/@mui/icons-material": {
             "version": "5.15.18",
-            "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.18.tgz",
             "integrity": "sha512-jGhyw02TSLM0NgW+MDQRLLRUD/K4eN9rlK2pTBTL1OtzyZmQ8nB060zK1wA0b7cVrIiG+zyrRmNAvGWXwm2N9Q==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9"
@@ -3762,16 +3765,16 @@
             }
         },
         "node_modules/@mui/material": {
-            "version": "5.15.18",
-            "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.18.tgz",
-            "integrity": "sha512-n+/dsiqux74fFfcRUJjok+ieNQ7+BEk6/OwX9cLcLvriZrZb+/7Y8+Fd2HlUUbn5N0CDurgAHm0VH1DqyJ9HAw==",
+            "version": "5.15.20",
+            "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.20.tgz",
+            "integrity": "sha512-tVq3l4qoXx/NxUgIx/x3lZiPn/5xDbdTE8VrLczNpfblLYZzlrbxA7kb9mI8NoBF6+w9WE9IrxWnKK5KlPI2bg==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9",
                 "@mui/base": "5.0.0-beta.40",
-                "@mui/core-downloads-tracker": "^5.15.18",
-                "@mui/system": "^5.15.15",
+                "@mui/core-downloads-tracker": "^5.15.20",
+                "@mui/system": "^5.15.20",
                 "@mui/types": "^7.2.14",
-                "@mui/utils": "^5.15.14",
+                "@mui/utils": "^5.15.20",
                 "@types/react-transition-group": "^4.4.10",
                 "clsx": "^2.1.0",
                 "csstype": "^3.1.3",
@@ -3806,12 +3809,12 @@
             }
         },
         "node_modules/@mui/private-theming": {
-            "version": "5.15.14",
-            "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz",
-            "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==",
+            "version": "5.15.20",
+            "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.20.tgz",
+            "integrity": "sha512-BK8F94AIqSrnaPYXf2KAOjGZJgWfvqAVQ2gVR3EryvQFtuBnG6RwodxrCvd3B48VuMy6Wsk897+lQMUxJyk+6g==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9",
-                "@mui/utils": "^5.15.14",
+                "@mui/utils": "^5.15.20",
                 "prop-types": "^15.8.1"
             },
             "engines": {
@@ -3862,16 +3865,42 @@
                 }
             }
         },
+        "node_modules/@mui/styled-engine-sc": {
+            "version": "5.14.12",
+            "resolved": "https://registry.npmjs.org/@mui/styled-engine-sc/-/styled-engine-sc-5.14.12.tgz",
+            "integrity": "sha512-FQ5KDd17OkRurE0ljR4Pddekv1uPSoJxcBqXa9tdoOETGULVCefM5Gd9CRGzT+alNPDyHBoUeEYKulIkDN9ytA==",
+            "dependencies": {
+                "@babel/runtime": "^7.23.1",
+                "csstype": "^3.1.2",
+                "prop-types": "^15.8.1"
+            },
+            "engines": {
+                "node": ">=12.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/mui"
+            },
+            "peerDependencies": {
+                "@types/styled-components": "^5.1.14",
+                "styled-components": "^5.3.1"
+            },
+            "peerDependenciesMeta": {
+                "@types/styled-components": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/@mui/system": {
-            "version": "5.15.15",
-            "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz",
-            "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==",
+            "version": "5.15.20",
+            "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.20.tgz",
+            "integrity": "sha512-LoMq4IlAAhxzL2VNUDBTQxAb4chnBe8JvRINVNDiMtHE2PiPOoHlhOPutSxEbaL5mkECPVWSv6p8JEV+uykwIA==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9",
-                "@mui/private-theming": "^5.15.14",
+                "@mui/private-theming": "^5.15.20",
                 "@mui/styled-engine": "^5.15.14",
                 "@mui/types": "^7.2.14",
-                "@mui/utils": "^5.15.14",
+                "@mui/utils": "^5.15.20",
                 "clsx": "^2.1.0",
                 "csstype": "^3.1.3",
                 "prop-types": "^15.8.1"
@@ -3915,9 +3944,9 @@
             }
         },
         "node_modules/@mui/utils": {
-            "version": "5.15.14",
-            "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz",
-            "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==",
+            "version": "5.15.20",
+            "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.20.tgz",
+            "integrity": "sha512-mAbYx0sovrnpAu1zHc3MDIhPqL8RPVC5W5xcO1b7PiSCJPtckIZmBkp8hefamAvUiAV8gpfMOM6Zb+eSisbI2A==",
             "dependencies": {
                 "@babel/runtime": "^7.23.9",
                 "@types/prop-types": "^15.7.11",
@@ -3973,494 +4002,996 @@
                 "node": ">= 8"
             }
         },
-        "node_modules/@octokit/auth-token": {
-            "version": "5.1.1",
-            "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz",
-            "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==",
-            "engines": {
-                "node": ">= 18"
-            }
-        },
-        "node_modules/@octokit/core": {
-            "version": "6.1.2",
-            "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz",
-            "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==",
+        "node_modules/@npmcli/agent": {
+            "version": "2.2.2",
+            "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz",
+            "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==",
             "dependencies": {
-                "@octokit/auth-token": "^5.0.0",
-                "@octokit/graphql": "^8.0.0",
-                "@octokit/request": "^9.0.0",
-                "@octokit/request-error": "^6.0.1",
-                "@octokit/types": "^13.0.0",
-                "before-after-hook": "^3.0.2",
-                "universal-user-agent": "^7.0.0"
+                "agent-base": "^7.1.0",
+                "http-proxy-agent": "^7.0.0",
+                "https-proxy-agent": "^7.0.1",
+                "lru-cache": "^10.0.1",
+                "socks-proxy-agent": "^8.0.3"
             },
             "engines": {
-                "node": ">= 18"
+                "node": "^16.14.0 || >=18.0.0"
             }
         },
-        "node_modules/@octokit/endpoint": {
-            "version": "10.1.1",
-            "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz",
-            "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==",
+        "node_modules/@npmcli/agent/node_modules/agent-base": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+            "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
             "dependencies": {
-                "@octokit/types": "^13.0.0",
-                "universal-user-agent": "^7.0.2"
+                "debug": "^4.3.4"
             },
             "engines": {
-                "node": ">= 18"
+                "node": ">= 14"
             }
         },
-        "node_modules/@octokit/graphql": {
-            "version": "8.1.1",
-            "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz",
-            "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==",
+        "node_modules/@npmcli/agent/node_modules/https-proxy-agent": {
+            "version": "7.0.4",
+            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
+            "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
             "dependencies": {
-                "@octokit/request": "^9.0.0",
-                "@octokit/types": "^13.0.0",
-                "universal-user-agent": "^7.0.0"
+                "agent-base": "^7.0.2",
+                "debug": "4"
             },
             "engines": {
-                "node": ">= 18"
+                "node": ">= 14"
             }
         },
-        "node_modules/@octokit/openapi-types": {
-            "version": "22.2.0",
-            "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz",
-            "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg=="
-        },
-        "node_modules/@octokit/request": {
-            "version": "9.1.1",
-            "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.1.tgz",
-            "integrity": "sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==",
-            "dependencies": {
-                "@octokit/endpoint": "^10.0.0",
-                "@octokit/request-error": "^6.0.1",
-                "@octokit/types": "^13.1.0",
-                "universal-user-agent": "^7.0.2"
-            },
+        "node_modules/@npmcli/agent/node_modules/lru-cache": {
+            "version": "10.2.2",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+            "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
             "engines": {
-                "node": ">= 18"
+                "node": "14 || >=16.14"
             }
         },
-        "node_modules/@octokit/request-error": {
-            "version": "6.1.1",
-            "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.1.tgz",
-            "integrity": "sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==",
+        "node_modules/@npmcli/arborist": {
+            "version": "7.5.2",
+            "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.2.tgz",
+            "integrity": "sha512-V0zqhdnK9Av3qSIbhYs2O+7HAJPSGhqBkNP6624iSVke2J2JKY306V5Czwul+tc2Xnq6SDEKe8v+frLeKJ4aeA==",
             "dependencies": {
-                "@octokit/types": "^13.0.0"
+                "@isaacs/string-locale-compare": "^1.1.0",
+                "@npmcli/fs": "^3.1.1",
+                "@npmcli/installed-package-contents": "^2.1.0",
+                "@npmcli/map-workspaces": "^3.0.2",
+                "@npmcli/metavuln-calculator": "^7.1.1",
+                "@npmcli/name-from-folder": "^2.0.0",
+                "@npmcli/node-gyp": "^3.0.0",
+                "@npmcli/package-json": "^5.1.0",
+                "@npmcli/query": "^3.1.0",
+                "@npmcli/redact": "^2.0.0",
+                "@npmcli/run-script": "^8.1.0",
+                "bin-links": "^4.0.4",
+                "cacache": "^18.0.3",
+                "common-ancestor-path": "^1.0.1",
+                "hosted-git-info": "^7.0.2",
+                "json-parse-even-better-errors": "^3.0.2",
+                "json-stringify-nice": "^1.1.4",
+                "lru-cache": "^10.2.2",
+                "minimatch": "^9.0.4",
+                "nopt": "^7.2.1",
+                "npm-install-checks": "^6.2.0",
+                "npm-package-arg": "^11.0.2",
+                "npm-pick-manifest": "^9.0.1",
+                "npm-registry-fetch": "^17.0.1",
+                "pacote": "^18.0.6",
+                "parse-conflict-json": "^3.0.0",
+                "proc-log": "^4.2.0",
+                "proggy": "^2.0.0",
+                "promise-all-reject-late": "^1.0.0",
+                "promise-call-limit": "^3.0.1",
+                "read-package-json-fast": "^3.0.2",
+                "semver": "^7.3.7",
+                "ssri": "^10.0.6",
+                "treeverse": "^3.0.0",
+                "walk-up-path": "^3.0.1"
+            },
+            "bin": {
+                "arborist": "bin/index.js"
             },
             "engines": {
-                "node": ">= 18"
-            }
-        },
-        "node_modules/@octokit/types": {
-            "version": "13.5.0",
-            "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz",
-            "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==",
-            "dependencies": {
-                "@octokit/openapi-types": "^22.2.0"
+                "node": "^16.14.0 || >=18.0.0"
             }
         },
-        "node_modules/@opentelemetry/api": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz",
-            "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==",
+        "node_modules/@npmcli/arborist/node_modules/abbrev": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+            "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
             "engines": {
-                "node": ">=8.0.0"
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/@pkgjs/parseargs": {
-            "version": "0.11.0",
-            "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
-            "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
-            "optional": true,
+        "node_modules/@npmcli/arborist/node_modules/json-parse-even-better-errors": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+            "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
             "engines": {
-                "node": ">=14"
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/@pkgr/core": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
-            "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
-            "dev": true,
+        "node_modules/@npmcli/arborist/node_modules/lru-cache": {
+            "version": "10.2.2",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+            "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
             "engines": {
-                "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
-            },
-            "funding": {
-                "url": "https://opencollective.com/unts"
-            }
-        },
-        "node_modules/@popperjs/core": {
-            "version": "2.11.8",
-            "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
-            "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/popperjs"
+                "node": "14 || >=16.14"
             }
         },
-        "node_modules/@react-aria/actiongroup": {
-            "version": "3.7.4",
-            "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.7.4.tgz",
-            "integrity": "sha512-HQ4D6jCW/EfotRPUI57qXPvZyKlqRr1pRYL/yTxFEE9nvHb/JHxvvQgo9tyIW1YHPO0k/cwkXhDOXLKT1q6d1A==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/list": "^3.10.4",
-                "@react-types/actiongroup": "^3.4.8",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+        "node_modules/@npmcli/arborist/node_modules/nopt": {
+            "version": "7.2.1",
+            "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+            "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+            "dependencies": {
+                "abbrev": "^2.0.0"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
-                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
-            }
-        },
-        "node_modules/@react-aria/breadcrumbs": {
-            "version": "3.5.12",
-            "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.12.tgz",
-            "integrity": "sha512-UHTVe6kA73xbE1J6LLVjUooEQvTJ4vWPRyOxu4t3dZ/4dMttvHxpKylvj4z606wioSGVhCDEKC4Vn+RtQLypeA==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/link": "^3.7.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/breadcrumbs": "^3.7.4",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+            "bin": {
+                "nopt": "bin/nopt.js"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/@react-aria/button": {
-            "version": "3.9.4",
-            "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.9.4.tgz",
-            "integrity": "sha512-YOt4XWtC+0m7LwLQnU1Gl0ENETLEhtM8SyDbwsFR/fIQYX0T0H9D6jMlnKxXDjKgRvHzom9NZ8caTfsEPbgW/g==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/toggle": "^3.7.3",
-                "@react-types/button": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+        "node_modules/@npmcli/arborist/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "engines": {
+                "node": ">=10"
             }
         },
-        "node_modules/@react-aria/calendar": {
-            "version": "3.5.7",
-            "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.7.tgz",
-            "integrity": "sha512-HbOxoslIpak1/RKHQ/p4A5roI+RpM6geK68s72D+9n3NMPDw/X95yesc6JD1Sti2KsGl9GHI6Myf9xcNjuAMnw==",
-            "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/live-announcer": "^3.3.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/calendar": "^3.5.0",
-                "@react-types/button": "^3.9.3",
-                "@react-types/calendar": "^3.4.5",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+        "node_modules/@npmcli/config": {
+            "version": "8.3.2",
+            "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.3.2.tgz",
+            "integrity": "sha512-IMzf+fhRXibqh9mBwXK/QFIr97SAlZjfwsWPEz/2pST1cE9k9LcwznO7aDNXJoMrDjxPHZmb2bAAKASsa6EedA==",
+            "dependencies": {
+                "@npmcli/map-workspaces": "^3.0.2",
+                "ci-info": "^4.0.0",
+                "ini": "^4.1.2",
+                "nopt": "^7.2.1",
+                "proc-log": "^4.2.0",
+                "read-package-json-fast": "^3.0.2",
+                "semver": "^7.3.5",
+                "walk-up-path": "^3.0.1"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
-                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
             }
         },
-        "node_modules/@react-aria/checkbox": {
-            "version": "3.14.2",
-            "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.14.2.tgz",
-            "integrity": "sha512-PeXTEfURrZZBN80YJUyVPAvkT7gwpPtwBgtKxg1ars+D1iDV4Yp48yh5pKaNSf0/rlLNOgKJSCpcFzY7V3ipFw==",
-            "dependencies": {
-                "@react-aria/form": "^3.0.4",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/toggle": "^3.10.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/checkbox": "^3.6.4",
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/toggle": "^3.7.3",
-                "@react-types/checkbox": "^3.8.0",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
-            },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+        "node_modules/@npmcli/config/node_modules/abbrev": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+            "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/@react-aria/color": {
-            "version": "3.0.0-beta.32",
-            "resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.0.0-beta.32.tgz",
-            "integrity": "sha512-FKy5jb+31SIaLrjQR7oMq23CCBgoPdlYN06mwb16EdN024D1ZkQ2ULUvI84vBJxCul8cMOmoIK1DBOnhDslbrQ==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/numberfield": "^3.11.2",
-                "@react-aria/slider": "^3.7.7",
-                "@react-aria/spinbutton": "^3.6.4",
-                "@react-aria/textfield": "^3.14.4",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-stately/color": "^3.6.0",
-                "@react-stately/form": "^3.0.2",
-                "@react-types/color": "3.0.0-beta.24",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
-            },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
-                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+        "node_modules/@npmcli/config/node_modules/ci-info": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+            "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/sibiraj-s"
+                }
+            ],
+            "engines": {
+                "node": ">=8"
             }
         },
-        "node_modules/@react-aria/combobox": {
-            "version": "3.9.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.9.0.tgz",
-            "integrity": "sha512-JRiCoARx95Lu1hENmf4ndHzpJrMeP/2bV96jZbMn4StFUzhACKnUw0rNFpFdONfeoD/MkWO7tsvhxaPGLhpgtQ==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/listbox": "^3.12.0",
-                "@react-aria/live-announcer": "^3.3.3",
-                "@react-aria/menu": "^3.14.0",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/textfield": "^3.14.4",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/combobox": "^3.8.3",
-                "@react-stately/form": "^3.0.2",
-                "@react-types/button": "^3.9.3",
-                "@react-types/combobox": "^3.11.0",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
-            },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
-                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+        "node_modules/@npmcli/config/node_modules/ini": {
+            "version": "4.1.3",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz",
+            "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/@react-aria/datepicker": {
-            "version": "3.10.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.10.0.tgz",
-            "integrity": "sha512-YiIxY+mRxc2rPN8j9ypdiGspRHSIrsK6TShBgKEk5UoG5EBKEJfNe/FfoXDR2d5xcpWLAHVuRjERi9WkiJNDBw==",
-            "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@internationalized/number": "^3.5.2",
-                "@internationalized/string": "^3.2.2",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/form": "^3.0.4",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/spinbutton": "^3.6.4",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/datepicker": "^3.9.3",
-                "@react-stately/form": "^3.0.2",
-                "@react-types/button": "^3.9.3",
-                "@react-types/calendar": "^3.4.5",
-                "@react-types/datepicker": "^3.7.3",
-                "@react-types/dialog": "^3.5.9",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+        "node_modules/@npmcli/config/node_modules/nopt": {
+            "version": "7.2.1",
+            "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+            "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+            "dependencies": {
+                "abbrev": "^2.0.0"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
-                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "bin": {
+                "nopt": "bin/nopt.js"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/@react-aria/dialog": {
-            "version": "3.5.13",
-            "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.13.tgz",
-            "integrity": "sha512-GUwY7sQtPMtO6LFHyoIGFMEv8tEBrNCrSNwEKilFLxvNUCo/1sY3N+7L2TcoeyDkcRWBJ9Uz9iR0iJ6EsCBWng==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/dialog": "^3.5.9",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+        "node_modules/@npmcli/config/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
-                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "engines": {
+                "node": ">=10"
             }
         },
-        "node_modules/@react-aria/dnd": {
-            "version": "3.6.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.6.0.tgz",
-            "integrity": "sha512-uIM54sUr4NpSdvxWozNKGqSNSTe9ir/sO+QFGtGAF5dbjMX7FN/7sVVrtmB8UHKC+fwfs+Ml3kjJgHbm10/Qmg==",
-            "dependencies": {
-                "@internationalized/string": "^3.2.2",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/live-announcer": "^3.3.3",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/dnd": "^3.3.0",
-                "@react-types/button": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+        "node_modules/@npmcli/fs": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz",
+            "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==",
+            "dependencies": {
+                "semver": "^7.3.5"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
-                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/@react-aria/focus": {
-            "version": "3.17.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.17.0.tgz",
-            "integrity": "sha512-aRzBw1WTUkcIV3xFrqPA6aB8ZVt3XyGpTaSHAypU0Pgoy2wRq9YeJYpbunsKj9CJmskuffvTqXwAjTcaQish1Q==",
-            "dependencies": {
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0",
-                "clsx": "^2.0.0"
+        "node_modules/@npmcli/fs/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "engines": {
+                "node": ">=10"
             }
         },
-        "node_modules/@react-aria/form": {
-            "version": "3.0.4",
-            "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.4.tgz",
-            "integrity": "sha512-wWfW9Hv+OWIUbJ0QYzJ4EO5Yt7xZD1i+XNZG9pKGBiREi7dYBo7Y7lbqlWc3pJASSE+6aP9HzhK18dMPtGluVA==",
+        "node_modules/@npmcli/git": {
+            "version": "5.0.7",
+            "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz",
+            "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==",
             "dependencies": {
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/form": "^3.0.2",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+                "@npmcli/promise-spawn": "^7.0.0",
+                "lru-cache": "^10.0.1",
+                "npm-pick-manifest": "^9.0.0",
+                "proc-log": "^4.0.0",
+                "promise-inflight": "^1.0.1",
+                "promise-retry": "^2.0.1",
+                "semver": "^7.3.5",
+                "which": "^4.0.0"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
             }
         },
-        "node_modules/@react-aria/grid": {
-            "version": "3.9.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.9.0.tgz",
-            "integrity": "sha512-jNg7haMptmeTKR7/ZomIjWZMLB6jWalBkl5in2JdU9Hc4pY5EKqD/7PSprr9SjOzCr5O+4MSiRDvw+Tu7xHevQ==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/live-announcer": "^3.3.3",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/grid": "^3.8.6",
-                "@react-stately/selection": "^3.15.0",
-                "@react-stately/virtualizer": "^3.7.0",
-                "@react-types/checkbox": "^3.8.0",
-                "@react-types/grid": "^3.2.5",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
-            },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
-                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+        "node_modules/@npmcli/git/node_modules/isexe": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+            "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+            "engines": {
+                "node": ">=16"
             }
         },
-        "node_modules/@react-aria/gridlist": {
-            "version": "3.8.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.8.0.tgz",
-            "integrity": "sha512-2iPBtpYZdTVij6XcqFsRsjzItjgg7FhFRPUEgD62mCyYd6NJIDkCxLuL97hkZ5BbXNxsr2jgVEns5Z4UzW//IQ==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/grid": "^3.9.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/list": "^3.10.4",
-                "@react-stately/tree": "^3.8.0",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
-            },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
-                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+        "node_modules/@npmcli/git/node_modules/lru-cache": {
+            "version": "10.2.2",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+            "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+            "engines": {
+                "node": "14 || >=16.14"
             }
         },
-        "node_modules/@react-aria/i18n": {
-            "version": "3.11.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.11.0.tgz",
-            "integrity": "sha512-dnopopsYKy2cd2dB2LdnmdJ58evKKcNCtiscWl624XFSbq2laDrYIQ4umrMhBxaKD7nDQkqydVBe6HoQKPzvJw==",
-            "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@internationalized/message": "^3.1.3",
-                "@internationalized/number": "^3.5.2",
-                "@internationalized/string": "^3.2.2",
-                "@react-aria/ssr": "^3.9.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+        "node_modules/@npmcli/git/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "engines": {
+                "node": ">=10"
             }
         },
-        "node_modules/@react-aria/interactions": {
-            "version": "3.21.2",
-            "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.2.tgz",
-            "integrity": "sha512-Ju706DtoEmI/2vsfu9DCEIjDqsRBVLm/wmt2fr0xKbBca7PtmK8daajxFWz+eTq+EJakvYfLr7gWgLau9HyWXg==",
+        "node_modules/@npmcli/git/node_modules/which": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+            "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
             "dependencies": {
-                "@react-aria/ssr": "^3.9.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+                "isexe": "^3.1.1"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "bin": {
+                "node-which": "bin/which.js"
+            },
+            "engines": {
+                "node": "^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/@react-aria/label": {
-            "version": "3.7.7",
-            "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.7.tgz",
-            "integrity": "sha512-0MDIu4SbagwsYzkprcCzi1Z0V/t2K/5Dd30eSTL2zanXMa+/85MVGSQjXI0vPrXMOXSNqp0R/aMxcqcgJ59yRA==",
+        "node_modules/@npmcli/installed-package-contents": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz",
+            "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==",
             "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+                "npm-bundled": "^3.0.0",
+                "npm-normalize-package-bin": "^3.0.0"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "bin": {
+                "installed-package-contents": "bin/index.js"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/@react-aria/link": {
-            "version": "3.7.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.7.0.tgz",
-            "integrity": "sha512-gkF7KpDR+ApcMY5HS3xVKHrxRcwSP9TRPoySWEMBE4GPWvEK1Bk/On9EM1vRzeEibCZ5L6gKuLEEKLVSGbBMWg==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/link": "^3.5.4",
-                "@react-types/shared": "^3.23.0",
-                "@swc/helpers": "^0.5.0"
+        "node_modules/@npmcli/map-workspaces": {
+            "version": "3.0.6",
+            "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz",
+            "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==",
+            "dependencies": {
+                "@npmcli/name-from-folder": "^2.0.0",
+                "glob": "^10.2.2",
+                "minimatch": "^9.0.0",
+                "read-package-json-fast": "^3.0.0"
             },
-            "peerDependencies": {
-                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/metavuln-calculator": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz",
+            "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==",
+            "dependencies": {
+                "cacache": "^18.0.0",
+                "json-parse-even-better-errors": "^3.0.0",
+                "pacote": "^18.0.0",
+                "proc-log": "^4.1.0",
+                "semver": "^7.3.5"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/metavuln-calculator/node_modules/json-parse-even-better-errors": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+            "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/metavuln-calculator/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@npmcli/name-from-folder": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz",
+            "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/node-gyp": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz",
+            "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/package-json": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.1.0.tgz",
+            "integrity": "sha512-1aL4TuVrLS9sf8quCLerU3H9J4vtCtgu8VauYozrmEyU57i/EdKleCnsQ7vpnABIH6c9mnTxcH5sFkO3BlV8wQ==",
+            "dependencies": {
+                "@npmcli/git": "^5.0.0",
+                "glob": "^10.2.2",
+                "hosted-git-info": "^7.0.0",
+                "json-parse-even-better-errors": "^3.0.0",
+                "normalize-package-data": "^6.0.0",
+                "proc-log": "^4.0.0",
+                "semver": "^7.5.3"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+            "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/package-json/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@npmcli/promise-spawn": {
+            "version": "7.0.2",
+            "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz",
+            "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==",
+            "dependencies": {
+                "which": "^4.0.0"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/promise-spawn/node_modules/isexe": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+            "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+            "engines": {
+                "node": ">=16"
+            }
+        },
+        "node_modules/@npmcli/promise-spawn/node_modules/which": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+            "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+            "dependencies": {
+                "isexe": "^3.1.1"
+            },
+            "bin": {
+                "node-which": "bin/which.js"
+            },
+            "engines": {
+                "node": "^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/query": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz",
+            "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==",
+            "dependencies": {
+                "postcss-selector-parser": "^6.0.10"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/redact": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.0.tgz",
+            "integrity": "sha512-SEjCPAVHWYUIQR+Yn03kJmrJjZDtJLYpj300m3HV9OTRZNpC5YpbMsM3eTkECyT4aWj8lDr9WeY6TWefpubtYQ==",
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/run-script": {
+            "version": "8.1.0",
+            "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz",
+            "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==",
+            "dependencies": {
+                "@npmcli/node-gyp": "^3.0.0",
+                "@npmcli/package-json": "^5.0.0",
+                "@npmcli/promise-spawn": "^7.0.0",
+                "node-gyp": "^10.0.0",
+                "proc-log": "^4.0.0",
+                "which": "^4.0.0"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@npmcli/run-script/node_modules/isexe": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+            "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+            "engines": {
+                "node": ">=16"
+            }
+        },
+        "node_modules/@npmcli/run-script/node_modules/which": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+            "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+            "dependencies": {
+                "isexe": "^3.1.1"
+            },
+            "bin": {
+                "node-which": "bin/which.js"
+            },
+            "engines": {
+                "node": "^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@octokit/auth-token": {
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz",
+            "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==",
+            "engines": {
+                "node": ">= 18"
+            }
+        },
+        "node_modules/@octokit/core": {
+            "version": "6.1.2",
+            "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz",
+            "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==",
+            "dependencies": {
+                "@octokit/auth-token": "^5.0.0",
+                "@octokit/graphql": "^8.0.0",
+                "@octokit/request": "^9.0.0",
+                "@octokit/request-error": "^6.0.1",
+                "@octokit/types": "^13.0.0",
+                "before-after-hook": "^3.0.2",
+                "universal-user-agent": "^7.0.0"
+            },
+            "engines": {
+                "node": ">= 18"
+            }
+        },
+        "node_modules/@octokit/endpoint": {
+            "version": "10.1.1",
+            "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz",
+            "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==",
+            "dependencies": {
+                "@octokit/types": "^13.0.0",
+                "universal-user-agent": "^7.0.2"
+            },
+            "engines": {
+                "node": ">= 18"
+            }
+        },
+        "node_modules/@octokit/graphql": {
+            "version": "8.1.1",
+            "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz",
+            "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==",
+            "dependencies": {
+                "@octokit/request": "^9.0.0",
+                "@octokit/types": "^13.0.0",
+                "universal-user-agent": "^7.0.0"
+            },
+            "engines": {
+                "node": ">= 18"
+            }
+        },
+        "node_modules/@octokit/openapi-types": {
+            "version": "22.2.0",
+            "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz",
+            "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg=="
+        },
+        "node_modules/@octokit/request": {
+            "version": "9.1.1",
+            "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.1.tgz",
+            "integrity": "sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==",
+            "dependencies": {
+                "@octokit/endpoint": "^10.0.0",
+                "@octokit/request-error": "^6.0.1",
+                "@octokit/types": "^13.1.0",
+                "universal-user-agent": "^7.0.2"
+            },
+            "engines": {
+                "node": ">= 18"
+            }
+        },
+        "node_modules/@octokit/request-error": {
+            "version": "6.1.1",
+            "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.1.tgz",
+            "integrity": "sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==",
+            "dependencies": {
+                "@octokit/types": "^13.0.0"
+            },
+            "engines": {
+                "node": ">= 18"
+            }
+        },
+        "node_modules/@octokit/types": {
+            "version": "13.5.0",
+            "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz",
+            "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==",
+            "dependencies": {
+                "@octokit/openapi-types": "^22.2.0"
+            }
+        },
+        "node_modules/@opentelemetry/api": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz",
+            "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==",
+            "engines": {
+                "node": ">=8.0.0"
+            }
+        },
+        "node_modules/@pkgjs/parseargs": {
+            "version": "0.11.0",
+            "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+            "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+            "optional": true,
+            "engines": {
+                "node": ">=14"
+            }
+        },
+        "node_modules/@pkgr/core": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
+            "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
+            "dev": true,
+            "engines": {
+                "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/unts"
+            }
+        },
+        "node_modules/@popperjs/core": {
+            "version": "2.11.8",
+            "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+            "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/popperjs"
+            }
+        },
+        "node_modules/@react-aria/actiongroup": {
+            "version": "3.7.5",
+            "resolved": "https://registry.npmjs.org/@react-aria/actiongroup/-/actiongroup-3.7.5.tgz",
+            "integrity": "sha512-asJk6WN6MhtwqWzVx7zkakhTbrpk1XhJbxF2piGlk2pTCh8zUCnMjvFAmMdQN+voj5lEW4/CZNfrblNDwzCimQ==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/list": "^3.10.5",
+                "@react-types/actiongroup": "^3.4.9",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/breadcrumbs": {
+            "version": "3.5.13",
+            "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.13.tgz",
+            "integrity": "sha512-G1Gqf/P6kVdfs94ovwP18fTWuIxadIQgHsXS08JEVcFVYMjb9YjqnEBaohUxD1tq2WldMbYw53ahQblT4NTG+g==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/link": "^3.7.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/breadcrumbs": "^3.7.5",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/button": {
+            "version": "3.9.5",
+            "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.9.5.tgz",
+            "integrity": "sha512-dgcYR6j8WDOMLKuVrtxzx4jIC05cVKDzc+HnPO8lNkBAOfjcuN5tkGRtIjLtqjMvpZHhQT5aDbgFpIaZzxgFIg==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/toggle": "^3.7.4",
+                "@react-types/button": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/calendar": {
+            "version": "3.5.8",
+            "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.8.tgz",
+            "integrity": "sha512-Whlp4CeAA5/ZkzrAHUv73kgIRYjw088eYGSc+cvSOCxfrc/2XkBm9rNrnSBv0DvhJ8AG0Fjz3vYakTmF3BgZBw==",
+            "dependencies": {
+                "@internationalized/date": "^3.5.4",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/live-announcer": "^3.3.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/calendar": "^3.5.1",
+                "@react-types/button": "^3.9.4",
+                "@react-types/calendar": "^3.4.6",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/checkbox": {
+            "version": "3.14.3",
+            "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.14.3.tgz",
+            "integrity": "sha512-EtBJL6iu0gvrw3A4R7UeVLR6diaVk/mh4kFBc7c8hQjpEJweRr4hmJT3hrNg3MBcTWLxFiMEXPGgWEwXDBygtA==",
+            "dependencies": {
+                "@react-aria/form": "^3.0.5",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/toggle": "^3.10.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/checkbox": "^3.6.5",
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/toggle": "^3.7.4",
+                "@react-types/checkbox": "^3.8.1",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/color": {
+            "version": "3.0.0-beta.33",
+            "resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.0.0-beta.33.tgz",
+            "integrity": "sha512-nhqnIHYm5p6MbuF3cC6lnqzG7MjwBsBd0DtpO+ByFYO+zxpMMbeC5R+1SFxvapR4uqmAzTotbtiUCGsG+SUaIg==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/numberfield": "^3.11.3",
+                "@react-aria/slider": "^3.7.8",
+                "@react-aria/spinbutton": "^3.6.5",
+                "@react-aria/textfield": "^3.14.5",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-stately/color": "^3.6.1",
+                "@react-stately/form": "^3.0.3",
+                "@react-types/color": "3.0.0-beta.25",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/combobox": {
+            "version": "3.9.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.9.1.tgz",
+            "integrity": "sha512-SpK92dCmT8qn8aEcUAihRQrBb5LZUhwIbDExFII8PvUvEFy/PoQHXIo3j1V29WkutDBDpMvBv/6XRCHGXPqrhQ==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/listbox": "^3.12.1",
+                "@react-aria/live-announcer": "^3.3.4",
+                "@react-aria/menu": "^3.14.1",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/textfield": "^3.14.5",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/combobox": "^3.8.4",
+                "@react-stately/form": "^3.0.3",
+                "@react-types/button": "^3.9.4",
+                "@react-types/combobox": "^3.11.1",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/datepicker": {
+            "version": "3.10.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.10.1.tgz",
+            "integrity": "sha512-4HZL593nrNMa1GjBmWEN/OTvNS6d3/16G1YJWlqiUlv11ADulSbqBIjMmkgwrJVFcjrgqtXFy+yyrTA/oq94Zw==",
+            "dependencies": {
+                "@internationalized/date": "^3.5.4",
+                "@internationalized/number": "^3.5.3",
+                "@internationalized/string": "^3.2.3",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/form": "^3.0.5",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/spinbutton": "^3.6.5",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/datepicker": "^3.9.4",
+                "@react-stately/form": "^3.0.3",
+                "@react-types/button": "^3.9.4",
+                "@react-types/calendar": "^3.4.6",
+                "@react-types/datepicker": "^3.7.4",
+                "@react-types/dialog": "^3.5.10",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/dialog": {
+            "version": "3.5.14",
+            "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.14.tgz",
+            "integrity": "sha512-oqDCjQ8hxe3GStf48XWBf2CliEnxlR9GgSYPHJPUc69WBj68D9rVcCW3kogJnLAnwIyf3FnzbX4wSjvUa88sAQ==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/dialog": "^3.5.10",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/dnd": {
+            "version": "3.6.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.6.1.tgz",
+            "integrity": "sha512-6WnujUTD+cIYZVF/B+uXdHyJ+WSpbYa8jH282epvY4FUAq1qLmen12/HHcoj/5dswKQe8X6EM3OhkQM89d9vFw==",
+            "dependencies": {
+                "@internationalized/string": "^3.2.3",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/live-announcer": "^3.3.4",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/dnd": "^3.3.1",
+                "@react-types/button": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/focus": {
+            "version": "3.17.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.17.1.tgz",
+            "integrity": "sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==",
+            "dependencies": {
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0",
+                "clsx": "^2.0.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/form": {
+            "version": "3.0.5",
+            "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.5.tgz",
+            "integrity": "sha512-n290jRwrrRXO3fS82MyWR+OKN7yznVesy5Q10IclSTVYHHI3VI53xtAPr/WzNjJR1um8aLhOcDNFKwnNIUUCsQ==",
+            "dependencies": {
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/form": "^3.0.3",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/grid": {
+            "version": "3.9.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.9.1.tgz",
+            "integrity": "sha512-fGEZqAEaS8mqzV/II3N4ndoNWegIcbh+L3PmKbXdpKKUP8VgMs/WY5rYl5WAF0f5RoFwXqx3ibDLeR9tKj/bOg==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/live-announcer": "^3.3.4",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/grid": "^3.8.7",
+                "@react-stately/selection": "^3.15.1",
+                "@react-stately/virtualizer": "^3.7.1",
+                "@react-types/checkbox": "^3.8.1",
+                "@react-types/grid": "^3.2.6",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/gridlist": {
+            "version": "3.8.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.8.1.tgz",
+            "integrity": "sha512-vVPkkA+Ct0NDcpnNm/tnYaBumg0fP9pXxsPLqL1rxvsTyj1PaIpFTZ4corabPTbTDExZwUSTS3LG1n+o1OvBtQ==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/grid": "^3.9.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/list": "^3.10.5",
+                "@react-stately/tree": "^3.8.1",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
+                "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/i18n": {
+            "version": "3.11.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.11.1.tgz",
+            "integrity": "sha512-vuiBHw1kZruNMYeKkTGGnmPyMnM5T+gT8bz97H1FqIq1hQ6OPzmtBZ6W6l6OIMjeHI5oJo4utTwfZl495GALFQ==",
+            "dependencies": {
+                "@internationalized/date": "^3.5.4",
+                "@internationalized/message": "^3.1.4",
+                "@internationalized/number": "^3.5.3",
+                "@internationalized/string": "^3.2.3",
+                "@react-aria/ssr": "^3.9.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/interactions": {
+            "version": "3.21.3",
+            "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.3.tgz",
+            "integrity": "sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==",
+            "dependencies": {
+                "@react-aria/ssr": "^3.9.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/label": {
+            "version": "3.7.8",
+            "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.8.tgz",
+            "integrity": "sha512-MzgTm5+suPA3KX7Ug6ZBK2NX9cin/RFLsv1BdafJ6CZpmUSpWnGE/yQfYUB7csN7j31OsZrD3/P56eShYWAQfg==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+            }
+        },
+        "node_modules/@react-aria/link": {
+            "version": "3.7.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.7.1.tgz",
+            "integrity": "sha512-a4IaV50P3fXc7DQvEIPYkJJv26JknFbRzFT5MJOMgtzuhyJoQdILEUK6XHYjcSSNCA7uLgzpojArVk5Hz3lCpw==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/link": "^3.5.5",
+                "@react-types/shared": "^3.23.1",
+                "@swc/helpers": "^0.5.0"
+            },
+            "peerDependencies": {
+                "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-aria/listbox": {
-            "version": "3.12.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.12.0.tgz",
-            "integrity": "sha512-Cy+UcfXU4MrOBMBnaB+kqG8bajeS3T1ZN8L7PXSTpmFS9jShFMhYkNz5gXpI+0SS4dgbHtkq/YDFJvu+bxFvdg==",
-            "dependencies": {
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/list": "^3.10.4",
-                "@react-types/listbox": "^3.4.8",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.12.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.12.1.tgz",
+            "integrity": "sha512-7JiUp0NGykbv/HgSpmTY1wqhuf/RmjFxs1HZcNaTv8A+DlzgJYc7yQqFjP3ZA/z5RvJFuuIxggIYmgIFjaRYdA==",
+            "dependencies": {
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/list": "^3.10.5",
+                "@react-types/listbox": "^3.4.9",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4469,30 +5000,30 @@
             }
         },
         "node_modules/@react-aria/live-announcer": {
-            "version": "3.3.3",
-            "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.3.tgz",
-            "integrity": "sha512-sMaBzzIgDPBDCeZ/UFbuXR/UnXikcE7t4OJ4cESzmUq6r6LvxzmZnG9ocwpH75n7udmUbINycKD082fneryHlg==",
+            "version": "3.3.4",
+            "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.4.tgz",
+            "integrity": "sha512-w8lxs35QrRrn6pBNzVfyGOeqWdxeVKf9U6bXIVwhq7rrTqRULL8jqy8RJIMfIs1s8G5FpwWYjyBOjl2g5Cu1iA==",
             "dependencies": {
                 "@swc/helpers": "^0.5.0"
             }
         },
         "node_modules/@react-aria/menu": {
-            "version": "3.14.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.14.0.tgz",
-            "integrity": "sha512-veZIpwKPKDIX1xpUzvGnxSVTmMfpRjPQUi1v+hMgqgdjBKedKI2LkprLABo9grggjqV9c2xT4XUXDk6xH3r8eA==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/menu": "^3.7.0",
-                "@react-stately/tree": "^3.8.0",
-                "@react-types/button": "^3.9.3",
-                "@react-types/menu": "^3.9.8",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.14.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.14.1.tgz",
+            "integrity": "sha512-BYliRb38uAzq05UOFcD5XkjA5foQoXRbcH3ZufBsc4kvh79BcP1PMW6KsXKGJ7dC/PJWUwCui6QL1kUg8PqMHA==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/menu": "^3.7.1",
+                "@react-stately/tree": "^3.8.1",
+                "@react-types/button": "^3.9.4",
+                "@react-types/menu": "^3.9.9",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4501,13 +5032,13 @@
             }
         },
         "node_modules/@react-aria/meter": {
-            "version": "3.4.12",
-            "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.12.tgz",
-            "integrity": "sha512-Ofgy3SHBjNLrc0mzuEKfn5ozOyrLudzcpw1cP5BFgtYs8BDdUx2/e33+2sm1+Pm3M/AhBrV/9LGyOE2JCtb8pg==",
+            "version": "3.4.13",
+            "resolved": "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.13.tgz",
+            "integrity": "sha512-oG6KvHQM3ri93XkYQkgEaMKSMO9KNDVpcW1MUqFfqyUXHFBRZRrJB4BTXMZ4nyjheFVQjVboU51fRwoLjOzThg==",
             "dependencies": {
-                "@react-aria/progress": "^3.4.12",
-                "@react-types/meter": "^3.4.0",
-                "@react-types/shared": "^3.23.0",
+                "@react-aria/progress": "^3.4.13",
+                "@react-types/meter": "^3.4.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4515,20 +5046,20 @@
             }
         },
         "node_modules/@react-aria/numberfield": {
-            "version": "3.11.2",
-            "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.11.2.tgz",
-            "integrity": "sha512-PPCRLhAnCz3/mbv/EXoG3mY8lUvaOnZdGZf0ufb1VS4K/wKtb8z3sCTDiu1hi7nFo1YYqynb8mKue4Es5jUwSw==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/spinbutton": "^3.6.4",
-                "@react-aria/textfield": "^3.14.4",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/numberfield": "^3.9.2",
-                "@react-types/button": "^3.9.3",
-                "@react-types/numberfield": "^3.8.2",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.11.3",
+            "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.11.3.tgz",
+            "integrity": "sha512-QQ9ZTzBbRI8d9ksaBWm6YVXbgv+5zzUsdxVxwzJVXLznvivoORB8rpdFJzUEWVCo25lzoBxluCEPYtLOxP1B0w==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/spinbutton": "^3.6.5",
+                "@react-aria/textfield": "^3.14.5",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/numberfield": "^3.9.3",
+                "@react-types/button": "^3.9.4",
+                "@react-types/numberfield": "^3.8.3",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4537,20 +5068,20 @@
             }
         },
         "node_modules/@react-aria/overlays": {
-            "version": "3.22.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.22.0.tgz",
-            "integrity": "sha512-M3Iayc2Hf9vJ4JJ8K/zh+Ct6aymDLmBbo686ChV3AtGOc254RyyzqnVSNuMs3j5QVBsDUKihHZQfl4E9RCwd+w==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/ssr": "^3.9.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-stately/overlays": "^3.6.6",
-                "@react-types/button": "^3.9.3",
-                "@react-types/overlays": "^3.8.6",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.22.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.22.1.tgz",
+            "integrity": "sha512-GHiFMWO4EQ6+j6b5QCnNoOYiyx1Gk8ZiwLzzglCI4q1NY5AG2EAmfU4Z1+Gtrf2S5Y0zHbumC7rs9GnPoGLUYg==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/ssr": "^3.9.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-types/button": "^3.9.4",
+                "@react-types/overlays": "^3.8.7",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4559,15 +5090,15 @@
             }
         },
         "node_modules/@react-aria/progress": {
-            "version": "3.4.12",
-            "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.12.tgz",
-            "integrity": "sha512-Wlz7VNFEzcLSawhZwWTKgJPM/IUKFiKJJG7KGcsT2biIlu6Yp60xj08hDZkCrLq3XsLLCRmweHlVfLFjG3AK9w==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/progress": "^3.5.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.4.13",
+            "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.13.tgz",
+            "integrity": "sha512-YBV9bOO5JzKvG8QCI0IAA00o6FczMgIDiK8Q9p5gKorFMatFUdRayxlbIPoYHMi+PguLil0jHgC7eOyaUcrZ0g==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/progress": "^3.5.4",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4575,19 +5106,19 @@
             }
         },
         "node_modules/@react-aria/radio": {
-            "version": "3.10.3",
-            "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.3.tgz",
-            "integrity": "sha512-9noof5jyHE8iiFEUE7xCAHvCjG7EkZ/bZHh2+ZtrLlTFZmjpEbRbpZMw6QMKC8uzREPsmERBXjbd/6NyXH6mEQ==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/form": "^3.0.4",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/radio": "^3.10.3",
-                "@react-types/radio": "^3.8.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.10.4",
+            "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.4.tgz",
+            "integrity": "sha512-3fmoMcQtCpgjTwJReFjnvIE/C7zOZeCeWUn4JKDqz9s1ILYsC3Rk5zZ4q66tFn6v+IQnecrKT52wH6+hlVLwTA==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/form": "^3.0.5",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/radio": "^3.10.4",
+                "@react-types/radio": "^3.8.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4595,17 +5126,17 @@
             }
         },
         "node_modules/@react-aria/searchfield": {
-            "version": "3.7.4",
-            "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.7.4.tgz",
-            "integrity": "sha512-92TR4M6/lBKkIp6l3Fl/Sqjjo++bDceIZEOKC62/cuYjLm9RRWl4tLlKIR1GN3IH1vJJStKj+TB/SjlWbPuwiA==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/textfield": "^3.14.4",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/searchfield": "^3.5.2",
-                "@react-types/button": "^3.9.3",
-                "@react-types/searchfield": "^3.5.4",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.7.5",
+            "resolved": "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.7.5.tgz",
+            "integrity": "sha512-h1sMUOWjhevaKKUHab/luHbM6yiyeN57L4RxZU0IIc9Ww0h5Rp2GUuKZA3pcdPiExHje0aijcImL3wBHEbKAzw==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/textfield": "^3.14.5",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/searchfield": "^3.5.3",
+                "@react-types/button": "^3.9.4",
+                "@react-types/searchfield": "^3.5.5",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4613,23 +5144,23 @@
             }
         },
         "node_modules/@react-aria/select": {
-            "version": "3.14.4",
-            "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.14.4.tgz",
-            "integrity": "sha512-MeFN8pw9liXwejkJS+hg0fDqGa3oW/mIwZYx8CrZZLbPnEcjZ9NI4ZXSxJaMOHEIQj/RXQ3Fpu0Sunu9FVpYXQ==",
-            "dependencies": {
-                "@react-aria/form": "^3.0.4",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/listbox": "^3.12.0",
-                "@react-aria/menu": "^3.14.0",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-stately/select": "^3.6.3",
-                "@react-types/button": "^3.9.3",
-                "@react-types/select": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.14.5",
+            "resolved": "https://registry.npmjs.org/@react-aria/select/-/select-3.14.5.tgz",
+            "integrity": "sha512-s8jixBuTUNdKWRHe2tIJqp55ORHeUObGMw1s7PQRRVrrHPdNSYseAOI9B2W7qpl3hKhvjJg40UW+45mcb1WKbw==",
+            "dependencies": {
+                "@react-aria/form": "^3.0.5",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/listbox": "^3.12.1",
+                "@react-aria/menu": "^3.14.1",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-stately/select": "^3.6.4",
+                "@react-types/button": "^3.9.4",
+                "@react-types/select": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4638,16 +5169,16 @@
             }
         },
         "node_modules/@react-aria/selection": {
-            "version": "3.18.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.18.0.tgz",
-            "integrity": "sha512-6ZvRuS9OHe56UVTb/qnsZ1TOxpZH9gRlX6eGG3Pt4LZK12wcvs13Uz2OvB2aYQHu0KPAua9ACnPh94xvXzQIlQ==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/selection": "^3.15.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.18.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.18.1.tgz",
+            "integrity": "sha512-GSqN2jX6lh7v+ldqhVjAXDcrWS3N4IsKXxO6L6Ygsye86Q9q9Mq9twWDWWu5IjHD6LoVZLUBCMO+ENGbOkyqeQ==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/selection": "^3.15.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4656,12 +5187,12 @@
             }
         },
         "node_modules/@react-aria/separator": {
-            "version": "3.3.12",
-            "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.12.tgz",
-            "integrity": "sha512-KXeHynxek/DlAmjmry+M2KVRq+j75LqWFysX4x7t+OSbGR4t3bu5HRDd9bvDe9lsW8OKxlX3+hWTY7vsOL/HDA==",
+            "version": "3.3.13",
+            "resolved": "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.13.tgz",
+            "integrity": "sha512-hofA6JCPnAOqSE9vxnq7Dkazr7Kb2A0I5sR16fOG7ddjYRc/YEY5Nv7MWfKUGU0kNFHkgNjsDAILERtLechzeA==",
             "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/shared": "^3.23.0",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4669,18 +5200,18 @@
             }
         },
         "node_modules/@react-aria/slider": {
-            "version": "3.7.7",
-            "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.7.tgz",
-            "integrity": "sha512-7tOJyR4ZZoSMKcVomC6DZxyYuXQqQopi9mPW2J1fViD1R5iO8YVmoX/ALXnokzi8GPuMA0c38i2Cmnecm30ZXA==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/slider": "^3.5.3",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/slider": "^3.7.2",
+            "version": "3.7.8",
+            "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.8.tgz",
+            "integrity": "sha512-MYvPcM0K8jxEJJicUK2+WxUkBIM/mquBxOTOSSIL3CszA80nXIGVnLlCUnQV3LOUzpWtabbWaZokSPtGgOgQOw==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/slider": "^3.5.4",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/slider": "^3.7.3",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4688,15 +5219,15 @@
             }
         },
         "node_modules/@react-aria/spinbutton": {
-            "version": "3.6.4",
-            "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.4.tgz",
-            "integrity": "sha512-KMnwm3bEM83g8MILGt6irbvAG7DNphkq6O0ePt7L1m6QZhWK3hbI2RNlxYMF1OKIDTAOhnEjR6IdMCWt9TuXvQ==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/live-announcer": "^3.3.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/button": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.6.5",
+            "resolved": "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.5.tgz",
+            "integrity": "sha512-0aACBarF/Xr/7ixzjVBTQ0NBwwwsoGkf5v6AVFVMTC0uYMXHTALvRs+ULHjHMa5e/cX/aPlEvaVT7jfSs+Xy9Q==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/live-announcer": "^3.3.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/button": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4705,9 +5236,9 @@
             }
         },
         "node_modules/@react-aria/ssr": {
-            "version": "3.9.3",
-            "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.3.tgz",
-            "integrity": "sha512-5bUZ93dmvHFcmfUcEN7qzYe8yQQ8JY+nHN6m9/iSDCQ/QmCiE0kWXYwhurjw5ch6I8WokQzx66xKIMHBAa4NNA==",
+            "version": "3.9.4",
+            "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz",
+            "integrity": "sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==",
             "dependencies": {
                 "@swc/helpers": "^0.5.0"
             },
@@ -4719,13 +5250,13 @@
             }
         },
         "node_modules/@react-aria/switch": {
-            "version": "3.6.3",
-            "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.3.tgz",
-            "integrity": "sha512-UBWbTEnnlTDT/dFOEpGKfX5ngPTIOVDLX1ltUhDHHk6SrgSnvYxTPTZAo+ujHIUSBFHOuxmvVYG7y54rk168mg==",
+            "version": "3.6.4",
+            "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.4.tgz",
+            "integrity": "sha512-2nVqz4ZuJyof47IpGSt3oZRmp+EdS8wzeDYgf42WHQXrx4uEOk1mdLJ20+NnsYhj/2NHZsvXVrjBeKMjlMs+0w==",
             "dependencies": {
-                "@react-aria/toggle": "^3.10.3",
-                "@react-stately/toggle": "^3.7.3",
-                "@react-types/switch": "^3.5.2",
+                "@react-aria/toggle": "^3.10.4",
+                "@react-stately/toggle": "^3.7.4",
+                "@react-types/switch": "^3.5.3",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4733,25 +5264,25 @@
             }
         },
         "node_modules/@react-aria/table": {
-            "version": "3.14.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.14.0.tgz",
-            "integrity": "sha512-IwBmzeIxeZjWlOlmMXVj/L64FbYm3qUh7v3VRgU98BVOdvgUyEKBDIwi6SuOV4FwbXKrCPZbXPU/k+KQU4tUoQ==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/grid": "^3.9.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/live-announcer": "^3.3.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/flags": "^3.0.2",
-                "@react-stately/table": "^3.11.7",
-                "@react-stately/virtualizer": "^3.7.0",
-                "@react-types/checkbox": "^3.8.0",
-                "@react-types/grid": "^3.2.5",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/table": "^3.9.4",
+            "version": "3.14.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.14.1.tgz",
+            "integrity": "sha512-WaPgQe4zQF5OaluO5rm+Y2nEoFR63vsLd4BT4yjK1uaFhKhDY2Zk+1SCVQvBLLKS4WK9dhP05nrNzT0vp/ZPOw==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/grid": "^3.9.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/live-announcer": "^3.3.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/flags": "^3.0.3",
+                "@react-stately/table": "^3.11.8",
+                "@react-stately/virtualizer": "^3.7.1",
+                "@react-types/checkbox": "^3.8.1",
+                "@react-types/grid": "^3.2.6",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/table": "^3.9.5",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4760,17 +5291,17 @@
             }
         },
         "node_modules/@react-aria/tabs": {
-            "version": "3.9.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.9.0.tgz",
-            "integrity": "sha512-E4IHOO9ejEXNeSnpeThu79pDpNySHHYz3txr9ngtH6tp097k/I1auSqbGJPy/kwLj6MCPEt86dNJDXE2X0AcFw==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/tabs": "^3.6.5",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/tabs": "^3.3.6",
+            "version": "3.9.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.9.1.tgz",
+            "integrity": "sha512-S5v/0sRcOaSXaJYZuuy1ZVzYc7JD4sDyseG1133GjyuNjJOFHgoWMb+b4uxNIJbZxnLgynn/ZDBZSO+qU+fIxw==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/tabs": "^3.6.6",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/tabs": "^3.3.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4779,19 +5310,19 @@
             }
         },
         "node_modules/@react-aria/tag": {
-            "version": "3.4.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.4.0.tgz",
-            "integrity": "sha512-kTrj0zEIyABgdASZMM7qxe0LAEePAxlg4OmfjZfkiAYYV32liY4EPER7ocE0OhOXo6TeOYYIvpEcr0z/4PjCpw==",
-            "dependencies": {
-                "@react-aria/gridlist": "^3.8.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/list": "^3.10.4",
-                "@react-types/button": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.4.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/tag/-/tag-3.4.1.tgz",
+            "integrity": "sha512-gcIGPYZ2OBwMT4IHnlczEezKlxr0KRPL/mSfm2Q91GE027ZGOJnqusH9az6DX1qxrQx8x3vRdqYT2KmuefkrBQ==",
+            "dependencies": {
+                "@react-aria/gridlist": "^3.8.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/list": "^3.10.5",
+                "@react-types/button": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4800,18 +5331,18 @@
             }
         },
         "node_modules/@react-aria/textfield": {
-            "version": "3.14.4",
-            "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.4.tgz",
-            "integrity": "sha512-fdZChDyTRA4BPqbyDeD9gSw6rVeIAl7eG38osRwr0mzcKTiS/AyV3jiRwnHsBO9brU8RdViJFri4emVDuxSjag==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/form": "^3.0.4",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/textfield": "^3.9.2",
+            "version": "3.14.5",
+            "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.5.tgz",
+            "integrity": "sha512-hj7H+66BjB1iTKKaFXwSZBZg88YT+wZboEXZ0DNdQB2ytzoz/g045wBItUuNi4ZjXI3P+0AOZznVMYadWBAmiA==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/form": "^3.0.5",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/textfield": "^3.9.3",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4819,15 +5350,15 @@
             }
         },
         "node_modules/@react-aria/toggle": {
-            "version": "3.10.3",
-            "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.3.tgz",
-            "integrity": "sha512-QtufHlWczMcTGmRxF7RCEgfMKpUPivyXJWZsQ1HSlknjRJPzf4uc3mSR62hq2sZ0VN9zXEpUsoixbEDB87TnGg==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/toggle": "^3.7.3",
-                "@react-types/checkbox": "^3.8.0",
+            "version": "3.10.4",
+            "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.4.tgz",
+            "integrity": "sha512-bRk+CdB8QzrSyGNjENXiTWxfzYKRw753iwQXsEAU7agPCUdB8cZJyrhbaUoD0rwczzTp2zDbZ9rRbUPdsBE2YQ==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/toggle": "^3.7.4",
+                "@react-types/checkbox": "^3.8.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4835,14 +5366,14 @@
             }
         },
         "node_modules/@react-aria/toolbar": {
-            "version": "3.0.0-beta.4",
-            "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.4.tgz",
-            "integrity": "sha512-nerKAoHwHFTvf25DDtj8d/zlDaZHaTPWvL4gweTm3hu9ztisE58CoVUqzqH+VNiYjcrWr2PYgLbNLsuOzk0q1Q==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.0.0-beta.5",
+            "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.5.tgz",
+            "integrity": "sha512-c8spY7aeLI6L+ygdXvEbAzaT41vExsxZ1Ld0t7BB+6iEF3nyBNJHshjkgdR7nv8FLgNk0no4tj0GTq4Jj4UqHQ==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4850,16 +5381,16 @@
             }
         },
         "node_modules/@react-aria/tooltip": {
-            "version": "3.7.3",
-            "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.3.tgz",
-            "integrity": "sha512-uF2J/GRKTHSeEYMwvXTu7oK710nov/NRbY7db2Hh7yXluGmjJORXb5wxsy+lqHaWqPKBbkhmxBJYeJJpAqlZ5g==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/tooltip": "^3.4.8",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/tooltip": "^3.4.8",
+            "version": "3.7.4",
+            "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.4.tgz",
+            "integrity": "sha512-+XRx4HlLYqWY3fB8Z60bQi/rbWDIGlFUtXYbtoa1J+EyRWfhpvsYImP8qeeNO/vgjUtDy1j9oKa8p6App9mBMQ==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/tooltip": "^3.4.9",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/tooltip": "^3.4.9",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4867,17 +5398,17 @@
             }
         },
         "node_modules/@react-aria/tree": {
-            "version": "3.0.0-alpha.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/tree/-/tree-3.0.0-alpha.0.tgz",
-            "integrity": "sha512-/5dqWjSHEMlrvoJTsQuGHrtKRoxYco5OKrdIf5UQq5wHB/quUD6ZexEfn9/NzflyoHVz2zPIm7RU8J9WuZugNw==",
-            "dependencies": {
-                "@react-aria/gridlist": "^3.8.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/tree": "^3.8.0",
-                "@react-types/button": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.0.0-alpha.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/tree/-/tree-3.0.0-alpha.1.tgz",
+            "integrity": "sha512-CucyeJ4VeAvWO5UJHt/l9JO65CVtsOVUctMOVNCQS77Isqp3olX9pvfD3LXt8fD5Ph2g0Q/b7siVpX5ieVB32g==",
+            "dependencies": {
+                "@react-aria/gridlist": "^3.8.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/tree": "^3.8.1",
+                "@react-types/button": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4886,13 +5417,13 @@
             }
         },
         "node_modules/@react-aria/utils": {
-            "version": "3.24.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.24.0.tgz",
-            "integrity": "sha512-JAxkPhK5fCvFVNY2YG3TW3m1nTzwRcbz7iyTSkUzLFat4N4LZ7Kzh7NMHsgeE/oMOxd8zLY+XsUxMu/E/2GujA==",
+            "version": "3.24.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.24.1.tgz",
+            "integrity": "sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==",
             "dependencies": {
-                "@react-aria/ssr": "^3.9.3",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/shared": "^3.23.0",
+                "@react-aria/ssr": "^3.9.4",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0",
                 "clsx": "^2.0.0"
             },
@@ -4901,15 +5432,15 @@
             }
         },
         "node_modules/@react-aria/virtualizer": {
-            "version": "3.10.0",
-            "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-3.10.0.tgz",
-            "integrity": "sha512-bxpWicfmsipPnzXp6pSv6Xmo2yLZI5Np4sPDRVTNrsi41ecm295AjPTRLgf/A7Rni0xgyWhUS0FkS7JXTQEv+A==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/virtualizer": "^3.7.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.10.1",
+            "resolved": "https://registry.npmjs.org/@react-aria/virtualizer/-/virtualizer-3.10.1.tgz",
+            "integrity": "sha512-y34w+n/B3nwwj18QHIZlkNj5Fn2rt5CbQE4BBWAM8jYZ5ypwF77i2toxhGTuk1Oo1/hgTX7JYIgDIAQbNraBcg==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/virtualizer": "^3.7.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4918,13 +5449,13 @@
             }
         },
         "node_modules/@react-aria/visually-hidden": {
-            "version": "3.8.11",
-            "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.11.tgz",
-            "integrity": "sha512-1JFruyAatoKnC18qrix8Q1gyUNlizWZvYdPADgB5btakMy0PEGTWPmFRK5gFsO+N0CZLCFTCip0dkUv6rrp31w==",
+            "version": "3.8.12",
+            "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.12.tgz",
+            "integrity": "sha512-Bawm+2Cmw3Xrlr7ARzl2RLtKh0lNUdJ0eNqzWcyx4c0VHUAWtThmH5l+HRqFUGzzutFZVo89SAy40BAbd0gjVw==",
             "dependencies": {
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/shared": "^3.23.0",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4959,24 +5490,24 @@
             "integrity": "sha512-x9ibmsP0ZVqzyCo1Pitbw+4b6iEXRw/r1TCy3vOUR3eKrzWLnHYZMR325BkZW2r8fnuWE/V3Fp4QZOP9qYORCw=="
         },
         "node_modules/@react-spectrum/actionbar": {
-            "version": "3.4.4",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/actionbar/-/actionbar-3.4.4.tgz",
-            "integrity": "sha512-Kao7LhiYcRjMRIdhRiYUDTdwALAMdHCEIVTbKYJ+OBbEy3Tzw382p+cogiBtwlcEI6/hVK+JdVyxgfsfZsalPg==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/live-announcer": "^3.3.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/actiongroup": "^3.10.4",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/overlays": "^5.6.0",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-types/actionbar": "^3.1.6",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.4.5",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/actionbar/-/actionbar-3.4.5.tgz",
+            "integrity": "sha512-9+b3B5he/zwyk+1pHc5l8/q6mBy+zKkphha2kBScbj/2XRHTwwlcamBJMANMYfVirQT9UP5FHGhHV6OiRgZLrA==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/live-announcer": "^3.3.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/actiongroup": "^3.10.5",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/overlays": "^5.6.1",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-types/actionbar": "^3.1.7",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -4986,25 +5517,25 @@
             }
         },
         "node_modules/@react-spectrum/actiongroup": {
-            "version": "3.10.4",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.10.4.tgz",
-            "integrity": "sha512-TY9DA+YFBqq+QnzJV1jnJ9vW3xDje5ZdU/WTlU8VBvxZrg9V0Qco1rWA2YSqAsTBOZQJ0iP5V7IvDjAoPrt5Kw==",
-            "dependencies": {
-                "@react-aria/actiongroup": "^3.7.4",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/menu": "^3.19.0",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/tooltip": "^3.6.6",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/list": "^3.10.4",
-                "@react-types/actiongroup": "^3.4.8",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
-                "@spectrum-icons/workflow": "^4.2.11",
+            "version": "3.10.5",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/actiongroup/-/actiongroup-3.10.5.tgz",
+            "integrity": "sha512-KHSuZvCD5XyOA4wz2iu85JQem2Y01pniWTfhzGLPfJG+1OdOCt+C0mO/jU0DL4NM6UwzdLy4JfvUij/xBsLrRw==",
+            "dependencies": {
+                "@react-aria/actiongroup": "^3.7.5",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/menu": "^3.19.1",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/tooltip": "^3.6.7",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/list": "^3.10.5",
+                "@react-types/actiongroup": "^3.4.9",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
+                "@spectrum-icons/workflow": "^4.2.12",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5014,14 +5545,14 @@
             }
         },
         "node_modules/@react-spectrum/avatar": {
-            "version": "3.0.11",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/avatar/-/avatar-3.0.11.tgz",
-            "integrity": "sha512-DwLXGiJHDB6XA0KpFD70gU4y3PyaYctCo8GqKbpgerMQJTeE3xZbzlZvt9XvBYx+BrOPA6T0/xpBmxGDaYDDBA==",
-            "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/avatar": "^3.0.6",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.0.12",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/avatar/-/avatar-3.0.12.tgz",
+            "integrity": "sha512-H5dZG+mPiSHlST2TBMfMR7mOf+g5C0i9Q2+aMMQ8khphXLFL4fj5GqxgEE7Mi5efS+raofwXJ/dM+AedsSl6WQ==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/avatar": "^3.0.7",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5030,15 +5561,15 @@
             }
         },
         "node_modules/@react-spectrum/badge": {
-            "version": "3.1.12",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.1.12.tgz",
-            "integrity": "sha512-iWj5mqj3MQ+UOksTuy9JMA+MTvOD33uzcsCKKhJPZZEHqfHMNE1shqaZCUuFCQ7Gmw/KbSDC2B2de1CL6fxjmw==",
-            "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/badge": "^3.1.8",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.1.13",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/badge/-/badge-3.1.13.tgz",
+            "integrity": "sha512-zfsmbw3hxYWxuySQZTMNkxI5vD1XktHNIBqDUYNaDu8A+GVaORI9pcrua4T2YXyQrw1hYXbqVAmeISJYURajjA==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/badge": "^3.1.9",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5047,22 +5578,22 @@
             }
         },
         "node_modules/@react-spectrum/breadcrumbs": {
-            "version": "3.9.6",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.9.6.tgz",
-            "integrity": "sha512-7bxRj3DlUC/TBTOtNY0rVktNTPlmWPD1AonPA0Ot+Hgm0S+eTdqPqvqJGTz6sFZx1vPgGTnp+RIg6sf5b/liGA==",
-            "dependencies": {
-                "@react-aria/breadcrumbs": "^3.5.12",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/menu": "^3.19.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-types/breadcrumbs": "^3.7.4",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.9.7",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/breadcrumbs/-/breadcrumbs-3.9.7.tgz",
+            "integrity": "sha512-1wA9cgSugaplYmT4z/WiUAZsOcXPWN+8sx43Wc5foS3qUSOLpW4+43sjDTVmzVlbXYuZ4byxf1nrXZNEqCWZXA==",
+            "dependencies": {
+                "@react-aria/breadcrumbs": "^3.5.13",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/menu": "^3.19.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-types/breadcrumbs": "^3.7.5",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5072,22 +5603,22 @@
             }
         },
         "node_modules/@react-spectrum/button": {
-            "version": "3.16.3",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.16.3.tgz",
-            "integrity": "sha512-cywlxV2N9cyffu9oGU45wVaOm9U0WNPGE+8978W2tmQMIFUBkQHRM2m7o9qr1C6T7D9hQhzXL0X5LQpTUj9PEQ==",
-            "dependencies": {
-                "@react-aria/button": "^3.9.4",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/progress": "^3.7.6",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/toggle": "^3.7.3",
-                "@react-types/button": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.16.4",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/button/-/button-3.16.4.tgz",
+            "integrity": "sha512-ksPZkmhkz8fJuu+cC9GM5e1pJ0d2sWmkU9sqKn5SNfWh9ngemgvShtkqkuQoz6ThH+MI3n/n4JhFd+UhJ/lILA==",
+            "dependencies": {
+                "@react-aria/button": "^3.9.5",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/progress": "^3.7.7",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/toggle": "^3.7.4",
+                "@react-types/button": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5096,14 +5627,14 @@
             }
         },
         "node_modules/@react-spectrum/buttongroup": {
-            "version": "3.6.12",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.6.12.tgz",
-            "integrity": "sha512-eCK+8DzzVO137IjNtdDX9UUMfKWDq4JYMMsGNHO7U146OYC8VnPHb1cdnfR0Pg7I9jefvwOeT0KKxwGenuuXfw==",
-            "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/buttongroup": "^3.3.8",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.6.13",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/buttongroup/-/buttongroup-3.6.13.tgz",
+            "integrity": "sha512-QUNTtDMiY/ydrpUYq8fO0kkssdnTEJsIxlfhbQa3ZEpEObjgt9XbAehNKPelWATwLNQ/gY8o21m9GT1m7J/8zg==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/buttongroup": "^3.3.9",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5112,25 +5643,25 @@
             }
         },
         "node_modules/@react-spectrum/calendar": {
-            "version": "3.4.8",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.4.8.tgz",
-            "integrity": "sha512-Ge8FryNtBvPhQch2678s5j6BuTipK4VdrSstZvG+Zq8QcHP3ksRwF2q1DifNS8iukZSEAS3lgl3Q2RhWXZKanw==",
-            "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@react-aria/calendar": "^3.5.7",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/calendar": "^3.5.0",
-                "@react-types/button": "^3.9.3",
-                "@react-types/calendar": "^3.4.5",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.4.9",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/calendar/-/calendar-3.4.9.tgz",
+            "integrity": "sha512-5546bmMQ/v3dscTDFx0llEQ3jA23vkcjbiY7hIad5a9bpXHPQSuIeREelFPtsVUzsD3f3v2BL2nDAt6SPLVqCA==",
+            "dependencies": {
+                "@internationalized/date": "^3.5.4",
+                "@react-aria/calendar": "^3.5.8",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/calendar": "^3.5.1",
+                "@react-types/button": "^3.9.4",
+                "@react-types/calendar": "^3.4.6",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5140,23 +5671,23 @@
             }
         },
         "node_modules/@react-spectrum/checkbox": {
-            "version": "3.9.5",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.9.5.tgz",
-            "integrity": "sha512-M8ZwVohk9986IVVfnhjC++WzXNfeUTj8we5Ud1DnetA3vqpmCoBA5/ym0Ey5LCTizDnTu/9i9NwdxPr2vIDpsw==",
-            "dependencies": {
-                "@react-aria/checkbox": "^3.14.2",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/checkbox": "^3.6.4",
-                "@react-stately/toggle": "^3.7.3",
-                "@react-types/checkbox": "^3.8.0",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.9.6",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/checkbox/-/checkbox-3.9.6.tgz",
+            "integrity": "sha512-aU4bDFwaiC2hpqOFv9vbUw20V6VlMO7pn1P8Q/qUfNxWVzPY03rJC0Gqcq8NQy2zofmm4tDBJKKOF1F4amGTyw==",
+            "dependencies": {
+                "@react-aria/checkbox": "^3.14.3",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/checkbox": "^3.6.5",
+                "@react-stately/toggle": "^3.7.4",
+                "@react-types/checkbox": "^3.8.1",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0",
-                "react-aria-components": "^1.2.0"
+                "react-aria-components": "^1.2.1"
             },
             "peerDependencies": {
                 "@react-spectrum/provider": "^3.0.0",
@@ -5164,34 +5695,34 @@
             }
         },
         "node_modules/@react-spectrum/combobox": {
-            "version": "3.12.4",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.12.4.tgz",
-            "integrity": "sha512-Xw/QiT3DPaJiGvUkLTYmYRBqNcjpAWS2A40GuMCeDm2idJM6GBWy1k8xwzb0L08HInDCkIV6amqqwV6Et65Pnw==",
-            "dependencies": {
-                "@react-aria/button": "^3.9.4",
-                "@react-aria/combobox": "^3.9.0",
-                "@react-aria/dialog": "^3.5.13",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/form": "^3.0.4",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/listbox": "^3.12.8",
-                "@react-spectrum/overlays": "^5.6.0",
-                "@react-spectrum/progress": "^3.7.6",
-                "@react-spectrum/textfield": "^3.12.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/combobox": "^3.8.3",
-                "@react-types/button": "^3.9.3",
-                "@react-types/combobox": "^3.11.0",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.12.5",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/combobox/-/combobox-3.12.5.tgz",
+            "integrity": "sha512-S6TA8FrPm0ibLkeulki2S0DsUqy/hEcTVTvvic7qIRyURN/J+DQMQDWmy+Zzz9mxJr8qdJAoWSArBVWtxKhMKg==",
+            "dependencies": {
+                "@react-aria/button": "^3.9.5",
+                "@react-aria/combobox": "^3.9.1",
+                "@react-aria/dialog": "^3.5.14",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/form": "^3.0.5",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/listbox": "^3.12.9",
+                "@react-spectrum/overlays": "^5.6.1",
+                "@react-spectrum/progress": "^3.7.7",
+                "@react-spectrum/textfield": "^3.12.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/combobox": "^3.8.4",
+                "@react-types/button": "^3.9.4",
+                "@react-types/combobox": "^3.11.1",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5201,18 +5732,18 @@
             }
         },
         "node_modules/@react-spectrum/contextualhelp": {
-            "version": "3.6.10",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.6.10.tgz",
-            "integrity": "sha512-wj3HSNBaFY77hs2MvFDDNw6W9J6XEttS2G/ISC7d4ZjCTuBapj+0PwVM1rGjf5k95FlorSj8jwRZQog8/hXCpw==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/dialog": "^3.8.10",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/contextualhelp": "^3.2.9",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/workflow": "^4.2.11",
+            "version": "3.6.11",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/contextualhelp/-/contextualhelp-3.6.11.tgz",
+            "integrity": "sha512-mQimyXdwXyZWFWO/7BdHZ46YzCQThjnHGGMmlv2y+YfqaOqoP3UTQb4D6noSbV1M6zKJgMq5timhVo81Sujk9Q==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/dialog": "^3.8.11",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/contextualhelp": "^3.2.10",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/workflow": "^4.2.12",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5222,29 +5753,29 @@
             }
         },
         "node_modules/@react-spectrum/datepicker": {
-            "version": "3.9.5",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.9.5.tgz",
-            "integrity": "sha512-MTOhAuhjX9PKioqGPWksPZgeGiVZesRi26WNUefu1hCrVbmfGXJcL17MNnJbq4bGtMfvaYPOze05OOpka30V8g==",
-            "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@react-aria/datepicker": "^3.10.0",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/calendar": "^3.4.8",
-                "@react-spectrum/dialog": "^3.8.10",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-spectrum/view": "^3.6.9",
-                "@react-stately/datepicker": "^3.9.3",
-                "@react-types/datepicker": "^3.7.3",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
-                "@spectrum-icons/workflow": "^4.2.11",
+            "version": "3.9.6",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/datepicker/-/datepicker-3.9.6.tgz",
+            "integrity": "sha512-MeLle/V2t3dBe7wq/qkc39hJyV6NTZncCZnBfPHnTcLXeZl8sfTf4rt11JS3Y4JOOtM3jiuw1oMpZ7wv+h6hOA==",
+            "dependencies": {
+                "@internationalized/date": "^3.5.4",
+                "@react-aria/datepicker": "^3.10.1",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/calendar": "^3.4.9",
+                "@react-spectrum/dialog": "^3.8.11",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-spectrum/view": "^3.6.10",
+                "@react-stately/datepicker": "^3.9.4",
+                "@react-types/datepicker": "^3.7.4",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
+                "@spectrum-icons/workflow": "^4.2.12",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5254,28 +5785,28 @@
             }
         },
         "node_modules/@react-spectrum/dialog": {
-            "version": "3.8.10",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.8.10.tgz",
-            "integrity": "sha512-IcgLn7/ULwwBT41m4QOxqVXu58UG0N9Gm6jo7iAeOnYZHLdp31MEAxmvCUvd3xa4B5wTCG1AxMIQUZnuAac15g==",
-            "dependencies": {
-                "@react-aria/dialog": "^3.5.13",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/buttongroup": "^3.6.12",
-                "@react-spectrum/divider": "^3.5.12",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/overlays": "^5.6.0",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-spectrum/view": "^3.6.9",
-                "@react-stately/overlays": "^3.6.6",
-                "@react-types/button": "^3.9.3",
-                "@react-types/dialog": "^3.5.9",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.8.11",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/dialog/-/dialog-3.8.11.tgz",
+            "integrity": "sha512-/ng49paipA3MHC5nVbfDlZL6QXFJWCrSDgQ4fXon5q6gB+94d2DvkZ+CvnLZ5oo0Bpkws/vT3jxcG0hsBz1f6g==",
+            "dependencies": {
+                "@react-aria/dialog": "^3.5.14",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/buttongroup": "^3.6.13",
+                "@react-spectrum/divider": "^3.5.13",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/overlays": "^5.6.1",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-spectrum/view": "^3.6.10",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-types/button": "^3.9.4",
+                "@react-types/dialog": "^3.5.10",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5285,14 +5816,14 @@
             }
         },
         "node_modules/@react-spectrum/divider": {
-            "version": "3.5.12",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.5.12.tgz",
-            "integrity": "sha512-EVd/0chomjZni+5OZMrlG6Rqd0VLO3aTyNvvckS28A62hIk/zCGJzJZdPCsK0RZu5P6M61SdW3epUScX7nqO1A==",
-            "dependencies": {
-                "@react-aria/separator": "^3.3.12",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/divider": "^3.3.8",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.5.13",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/divider/-/divider-3.5.13.tgz",
+            "integrity": "sha512-7LoOTj+qs3yTBZiWudgU5TpzLREApMt0rwzalyq9ORRQrE8C0YXUxlSLPizyUmQeP4Rj8p3lCdUNWAe1cAn1tQ==",
+            "dependencies": {
+                "@react-aria/separator": "^3.3.13",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/divider": "^3.3.9",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5300,13 +5831,13 @@
             }
         },
         "node_modules/@react-spectrum/dnd": {
-            "version": "3.3.9",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.3.9.tgz",
-            "integrity": "sha512-o2SE26LgZ2+FRAY8mXbKyyf5BCawx7sSq/9oeZhi9wb9T+SSgGq7Ab0bYcq5MEn5Q1QIB1MaGczIM8nZfd+Wtw==",
+            "version": "3.3.10",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/dnd/-/dnd-3.3.10.tgz",
+            "integrity": "sha512-Qp+Fp6BnMgrp5G18IAcbEUetf2YWelRugYJr8TH8h236n8lariyUpri1Mj604DV/UqNoK6f6k6ocY8JBmvOd9Q==",
             "dependencies": {
-                "@react-aria/dnd": "^3.6.0",
-                "@react-stately/dnd": "^3.3.0",
-                "@react-types/shared": "^3.23.0",
+                "@react-aria/dnd": "^3.6.1",
+                "@react-stately/dnd": "^3.3.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5316,16 +5847,16 @@
             }
         },
         "node_modules/@react-spectrum/dropzone": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/dropzone/-/dropzone-3.0.0.tgz",
-            "integrity": "sha512-ptMmfMwMx0LLTg6QzXCyqv4ffuYh+Y13srqnPZKDiHK5LP+lYRUNT250bFVEqxO6F4LYQrmet6dUaRrMOILn2w==",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/dropzone/-/dropzone-3.0.1.tgz",
+            "integrity": "sha512-8hEu6mF1ExJMc+Pv5lk3YHz3yZcRy4FkjKgBMXWWn8kxT2DEIK5hONspECBmlsNtUHuk1QQFFSISMGgsMZFQVw==",
             "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/shared": "^3.23.0",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0",
-                "react-aria-components": "^1.2.0"
+                "react-aria-components": "^1.2.1"
             },
             "peerDependencies": {
                 "@react-spectrum/provider": "^3.0.0",
@@ -5333,12 +5864,12 @@
             }
         },
         "node_modules/@react-spectrum/filetrigger": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/filetrigger/-/filetrigger-3.0.0.tgz",
-            "integrity": "sha512-PH5gX+KYTRKO2R3XZB0KUvQssoQLifdvJV3hAeNCl8XgAioPkyVJsxO7SLNmIqShI/lyv9jgqPne3gI5m7pDYg==",
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/filetrigger/-/filetrigger-3.0.1.tgz",
+            "integrity": "sha512-9PfhjeGdHjyumlzdvrFNumKnGeaK41kYragnDMSD3KNH0XWu2kVUTB7eUbA9d6FLL/+g8tyPx+wDo0ZJW79Fpg==",
             "dependencies": {
                 "@swc/helpers": "^0.5.0",
-                "react-aria-components": "^1.2.0"
+                "react-aria-components": "^1.2.1"
             },
             "peerDependencies": {
                 "@react-spectrum/provider": "^3.0.0",
@@ -5346,15 +5877,15 @@
             }
         },
         "node_modules/@react-spectrum/form": {
-            "version": "3.7.5",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.7.5.tgz",
-            "integrity": "sha512-lVqtZCgGNyw75MvDO6Okh0lK1bXWvm0+V03rMWiBcXDABHWxSVKfgY31qXGXhptukc1DDRIcNLuXJR9joLMKpg==",
-            "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/form": "^3.0.2",
-                "@react-types/form": "^3.7.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.7.6",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/form/-/form-3.7.6.tgz",
+            "integrity": "sha512-uh/r3d3haWGjdxh++HCCbezWRiw7PGDStvOHEVLCVz/cN0lrUb77dwx5E4jMvY+oLkaBv05R3UtdMxNdXV1DZQ==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/form": "^3.0.3",
+                "@react-types/form": "^3.7.4",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5363,13 +5894,13 @@
             }
         },
         "node_modules/@react-spectrum/icon": {
-            "version": "3.7.12",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.7.12.tgz",
-            "integrity": "sha512-fdDiAFdiES02mDl2NgJuWjbYfwSxQQQo0zNlfzvqwa6gs0OKDf+0Oi+h764Z0prDEUGHLy/cGe1L1olhuQprVw==",
+            "version": "3.7.13",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/icon/-/icon-3.7.13.tgz",
+            "integrity": "sha512-hbd1OZ2UOOZ807zkU/ay8TWQOSnB56cj9HHm3FzUBjpTwpt849Pvk4TBO5K2SAmuQi4gslmvFGmd8BoOEoEcjg==",
             "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/shared": "^3.23.0",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5378,15 +5909,15 @@
             }
         },
         "node_modules/@react-spectrum/illustratedmessage": {
-            "version": "3.5.0",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.5.0.tgz",
-            "integrity": "sha512-L994E940uDdXu0gcRlwZ8IMIVSjP3sfdRLH98RD1pPT+MYbzT7NN/Xj+YistaEG9D9J43liGY5R3fY39Njep0g==",
-            "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/illustratedmessage": "^3.3.8",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.5.1",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/illustratedmessage/-/illustratedmessage-3.5.1.tgz",
+            "integrity": "sha512-HpTueLW3duV1TE3sYw5WeBaGECqS0RVEXr2UaXDXSLteY238Oc7prli2qPk2xaGeRKgh97jsfySDBOvedCuZJQ==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/illustratedmessage": "^3.3.9",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5395,14 +5926,14 @@
             }
         },
         "node_modules/@react-spectrum/image": {
-            "version": "3.5.0",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.5.0.tgz",
-            "integrity": "sha512-r+vPqssEqRtrwi9gC1KhCN0wQCODGwrx9luVlxhXyBJzhQLVyb4vcDbtcVZ8HwZ8iOObjblX96ITmk6QGGDVaw==",
-            "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/image": "^3.4.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.5.1",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/image/-/image-3.5.1.tgz",
+            "integrity": "sha512-MFl2WkMT224L4v1M9n4ZGkkXhBqecQ6uWZfxHBURrTXFMgPq5sxWY7qw42pc3mAX339kNiLZXTCTA5mKyiqxnQ==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/image": "^3.4.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5411,17 +5942,17 @@
             }
         },
         "node_modules/@react-spectrum/inlinealert": {
-            "version": "3.2.4",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/inlinealert/-/inlinealert-3.2.4.tgz",
-            "integrity": "sha512-dTfCQMtv+mfdtixHDRBFwhtk7K0fLIoArGaYJOcifxRBmRWVB8np6rizpe/e89AECW4eyGeAJbvKgl8CcrFxwg==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.2.5",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/inlinealert/-/inlinealert-3.2.5.tgz",
+            "integrity": "sha512-D9EF8pIQME6GHpvk7HR8/Qr3g79l78EsvczL0wGOzdcMt+LoV9F6RNJSobrI+dgzX0RcbqRyWsdCixboFrfefg==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5430,18 +5961,18 @@
             }
         },
         "node_modules/@react-spectrum/label": {
-            "version": "3.16.5",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.16.5.tgz",
-            "integrity": "sha512-357dr3Yjkxs8oKVWwiVyoVyvsLeDre64/N5Td8KKV0vcI8DCfEXMCh8bFvEkD/NUoiNdgBjyGBwbNmG7eneWow==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/label": "^3.9.2",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.16.6",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/label/-/label-3.16.6.tgz",
+            "integrity": "sha512-RF1YqQOKpDYqnSxM+TK/4gZGBsoKjfaZYsOvjya90LvUO8/2Va8Ux0bwHlqtOxu46yjxPLflpt0u9rl9ce+Ubg==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/label": "^3.9.3",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5450,16 +5981,16 @@
             }
         },
         "node_modules/@react-spectrum/labeledvalue": {
-            "version": "3.1.13",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.1.13.tgz",
-            "integrity": "sha512-gokBp4CkV1Btn86w/yrKiqwfwiGND2CnIzx1dEXZLBdBCFCt9bE09YfGvQXeYO2GDj+q/WEBuCfWMKhcOdIQDw==",
-            "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.1.14",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/labeledvalue/-/labeledvalue-3.1.14.tgz",
+            "integrity": "sha512-JeZHCRRmSPShgOozHs31+e0NnN4S3+SP0NpPGFUo0itPHvOcJSV9aoRCefdMTdXbUupIi5h1EM5Ty0owdy8y0w==",
+            "dependencies": {
+                "@internationalized/date": "^3.5.4",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5468,14 +5999,14 @@
             }
         },
         "node_modules/@react-spectrum/layout": {
-            "version": "3.6.4",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.6.4.tgz",
-            "integrity": "sha512-GY2O4IDbeEJHjxs6kp6WKnrFDTV/74HkCWjqwlYdYauSOIwldg1Kz2NBeJ3NpcM6zrXTdtoXXJcmv0+wu4sF4Q==",
+            "version": "3.6.5",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/layout/-/layout-3.6.5.tgz",
+            "integrity": "sha512-kl/vZue7ZQZtkypPeOPZ3WENk4Mn9aYsjSBFZP+3GVRGPi0GBlhVOSicraio7UD3oGz1Xkhy5WZg01s3zQC0zg==",
             "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/layout": "^3.3.14",
-                "@react-types/shared": "^3.23.0",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/layout": "^3.3.15",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5484,16 +6015,16 @@
             }
         },
         "node_modules/@react-spectrum/link": {
-            "version": "3.6.6",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.6.6.tgz",
-            "integrity": "sha512-zTMd2EgMbFom8mi/kwGxD7c39MP2bYuYX3agAuT3YiC2Mr6YVh2w6HWMn+jMc4HX9gzQvF69CDX4DnRi284xgQ==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/link": "^3.7.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/link": "^3.5.4",
+            "version": "3.6.7",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/link/-/link-3.6.7.tgz",
+            "integrity": "sha512-g9yWHXO8OdoOnUH0xAIek5wDHDi0gYmEL3hqqKwzfMvkmQQCQjVS+D/9IlkxKT5LaumUiHdHDiA2PL1voPUh0g==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/link": "^3.7.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/link": "^3.5.5",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5502,30 +6033,30 @@
             }
         },
         "node_modules/@react-spectrum/list": {
-            "version": "3.7.9",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.7.9.tgz",
-            "integrity": "sha512-dlmaeH4/64URHOrNBh8LrUAjyUMvHpPAwGnmLQ1oPGIUHJ8rwpc68K+RdpyZ/riuIHqWe/HqcLmnIlHSoSJEAw==",
-            "dependencies": {
-                "@react-aria/button": "^3.9.4",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/gridlist": "^3.8.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/virtualizer": "^3.10.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-spectrum/checkbox": "^3.9.5",
-                "@react-spectrum/dnd": "^3.3.9",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/progress": "^3.7.6",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/layout": "^3.13.8",
-                "@react-stately/list": "^3.10.4",
-                "@react-types/grid": "^3.2.5",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.7.10",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/list/-/list-3.7.10.tgz",
+            "integrity": "sha512-UxS+pXgJGaTeLP+KQdq7IQsaJN1tq6tpqFXFKXdrXGnLZPd9GtBT3zYP2Rnb9r/6Vm67D+pewF6tVKLzctE1sw==",
+            "dependencies": {
+                "@react-aria/button": "^3.9.5",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/gridlist": "^3.8.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/virtualizer": "^3.10.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-spectrum/checkbox": "^3.9.6",
+                "@react-spectrum/dnd": "^3.3.10",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/progress": "^3.7.7",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/layout": "^3.13.9",
+                "@react-stately/list": "^3.10.5",
+                "@react-types/grid": "^3.2.6",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0",
                 "react-transition-group": "^4.4.5"
             },
@@ -5536,27 +6067,27 @@
             }
         },
         "node_modules/@react-spectrum/listbox": {
-            "version": "3.12.8",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.12.8.tgz",
-            "integrity": "sha512-ZfUZRxzbXkmRRsC90dQsVYCqYxVjBb/8QHqFMKzSSARHmJCv57abCdqAS2eRPrfvoZVzIa1DsIVe1jq5mP5s0g==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/listbox": "^3.12.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/virtualizer": "^3.10.0",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/progress": "^3.7.6",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/layout": "^3.13.8",
-                "@react-stately/list": "^3.10.4",
-                "@react-stately/virtualizer": "^3.7.0",
-                "@react-types/listbox": "^3.4.8",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.12.9",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/listbox/-/listbox-3.12.9.tgz",
+            "integrity": "sha512-9adZJtEtAVwNtJEU70edZOlx+LfBOeVpWCOXoAJ+5iU+rNrQER7bEpFj15GlJOL+vcwFuCPoIsDBKSxygJANLw==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/listbox": "^3.12.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/virtualizer": "^3.10.1",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/progress": "^3.7.7",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/layout": "^3.13.9",
+                "@react-stately/list": "^3.10.5",
+                "@react-stately/virtualizer": "^3.7.1",
+                "@react-types/listbox": "^3.4.9",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5566,31 +6097,31 @@
             }
         },
         "node_modules/@react-spectrum/menu": {
-            "version": "3.19.0",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.19.0.tgz",
-            "integrity": "sha512-4UCxuX2t/qJFoCV430lSIZC1PUh1hgcULfTMv0u2S5Lz8DJfFH5tYfI2ChN/XeYqb8AwmjCWov6muH922ADwhw==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/menu": "^3.14.0",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/separator": "^3.3.12",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/overlays": "^5.6.0",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/menu": "^3.7.0",
-                "@react-stately/overlays": "^3.6.6",
-                "@react-stately/tree": "^3.8.0",
-                "@react-types/menu": "^3.9.8",
-                "@react-types/overlays": "^3.8.6",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
-                "@spectrum-icons/workflow": "^4.2.11",
+            "version": "3.19.1",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/menu/-/menu-3.19.1.tgz",
+            "integrity": "sha512-/bpqSPef1UvoaIwd5GVrqMt8LiByi5rV9yh0K+SSzZ5uY/w4zRQN9y14XnLf4P53R67DpSqAqk3JoWOLFj0Zcg==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/menu": "^3.14.1",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/separator": "^3.3.13",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/overlays": "^5.6.1",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/menu": "^3.7.1",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-stately/tree": "^3.8.1",
+                "@react-types/menu": "^3.9.9",
+                "@react-types/overlays": "^3.8.7",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
+                "@spectrum-icons/workflow": "^4.2.12",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5600,15 +6131,15 @@
             }
         },
         "node_modules/@react-spectrum/meter": {
-            "version": "3.5.0",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.5.0.tgz",
-            "integrity": "sha512-AsBXu6+ZwVj8/pwXRiI8qkOl8KDUE6dLvhjfkuX5POh7T2yjHrZbrHtKplzcU6Bb2OrgW+EZEbCWqs6uHDIqHg==",
-            "dependencies": {
-                "@react-aria/meter": "^3.4.12",
-                "@react-spectrum/progress": "^3.7.6",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/meter": "^3.4.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.5.1",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/meter/-/meter-3.5.1.tgz",
+            "integrity": "sha512-xmQwPDmT8hfkEuyUrijpe2xXyzWlFErrnKpQIf49Lql/GudeGHIvtekx3Qj2kvhwLpHKeOOECk35PufCJmwF2A==",
+            "dependencies": {
+                "@react-aria/meter": "^3.4.13",
+                "@react-spectrum/progress": "^3.7.7",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/meter": "^3.4.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5617,26 +6148,26 @@
             }
         },
         "node_modules/@react-spectrum/numberfield": {
-            "version": "3.9.2",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.9.2.tgz",
-            "integrity": "sha512-eLHxVYYc2JqcImIr4vj/HzWRFTe1R2O+v7rJpStCUGWu4pSgElSCY6tHmn1woCF4AxSxsLviemwZ+oaz+42iWQ==",
-            "dependencies": {
-                "@react-aria/button": "^3.9.4",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/numberfield": "^3.11.2",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/textfield": "^3.12.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/numberfield": "^3.9.2",
-                "@react-types/button": "^3.9.3",
-                "@react-types/numberfield": "^3.8.2",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
-                "@spectrum-icons/workflow": "^4.2.11",
+            "version": "3.9.3",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/numberfield/-/numberfield-3.9.3.tgz",
+            "integrity": "sha512-t3LllH5NkaqlwkvfFVizmzp4+MhMCqooLlUsBIbDgqyNCWEbxiC16ZqPOPkZkBDFio1aKX0zzSb9SiuUFw2ZwA==",
+            "dependencies": {
+                "@react-aria/button": "^3.9.5",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/numberfield": "^3.11.3",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/textfield": "^3.12.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/numberfield": "^3.9.3",
+                "@react-types/button": "^3.9.4",
+                "@react-types/numberfield": "^3.8.3",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
+                "@spectrum-icons/workflow": "^4.2.12",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5646,17 +6177,17 @@
             }
         },
         "node_modules/@react-spectrum/overlays": {
-            "version": "5.6.0",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-5.6.0.tgz",
-            "integrity": "sha512-cP2SWSZ8US3+NtiFtkKn6yVNrra4wX59hliSrBijfFRHs1OFGSx3yLJfZtjibfEcdCj/0OPHyJvXRlxgG+vu4A==",
-            "dependencies": {
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/overlays": "^3.6.6",
-                "@react-types/overlays": "^3.8.6",
-                "@react-types/shared": "^3.23.0",
+            "version": "5.6.1",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/overlays/-/overlays-5.6.1.tgz",
+            "integrity": "sha512-ABacMG1V6gHCHHHtD01xt9RjTCu51Kytr/oHdUPEFd5Zvh8m/O7j3IQI4nSj5a5kDoj73NAkENq9Cq12gjwL4g==",
+            "dependencies": {
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-types/overlays": "^3.8.7",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0",
                 "react-transition-group": "^4.4.5"
             },
@@ -5667,27 +6198,27 @@
             }
         },
         "node_modules/@react-spectrum/picker": {
-            "version": "3.14.4",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.14.4.tgz",
-            "integrity": "sha512-JM0cYnq0mGsOUwnbhRNWQ9jzi73Ub3S6+v5bzjyKps+96BYdW8Wr+KY/tQg49UCAcwcY0g30tbyEzqXzTpPkdA==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/select": "^3.14.4",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/listbox": "^3.12.8",
-                "@react-spectrum/overlays": "^5.6.0",
-                "@react-spectrum/progress": "^3.7.6",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/select": "^3.6.3",
-                "@react-types/select": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.14.5",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/picker/-/picker-3.14.5.tgz",
+            "integrity": "sha512-FBCMibgStP62XKS2yJWHtn+XOLsxuzs0pl0jHkozuBaqC42H6fkDcINgQ08wbS2PlEEJSOYIkeL3LXFcxuewEA==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/select": "^3.14.5",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/listbox": "^3.12.9",
+                "@react-spectrum/overlays": "^5.6.1",
+                "@react-spectrum/progress": "^3.7.7",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/select": "^3.6.4",
+                "@react-types/select": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5697,15 +6228,15 @@
             }
         },
         "node_modules/@react-spectrum/progress": {
-            "version": "3.7.6",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.7.6.tgz",
-            "integrity": "sha512-LlU8F43jWCse+3FgWPJNMb5wGQmk643ppbl2frxPHMiTb2YpaZYd+9vr2EndOrZpenjO2oTvDidgeprbm53LLA==",
-            "dependencies": {
-                "@react-aria/progress": "^3.4.12",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/progress": "^3.5.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.7.7",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/progress/-/progress-3.7.7.tgz",
+            "integrity": "sha512-FI/oc9hEQqbv00VJbaxqFTncBDDbxWN9cbvNNrPoROBQWL3NgB3tvEqY/fm5IXtDeFEV/U+tSm8BnZTGn6Mdxg==",
+            "dependencies": {
+                "@react-aria/progress": "^3.4.13",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/progress": "^3.5.4",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5714,16 +6245,16 @@
             }
         },
         "node_modules/@react-spectrum/provider": {
-            "version": "3.9.6",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.9.6.tgz",
-            "integrity": "sha512-BSjO2CeUognPEzyLhFu25aVsBbpeoRlinCdQ/oMzvQwGxlcf/OKR6fkZMKJrpMuhh155ilDZXe0UFzl1RcziYA==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/provider": "^3.8.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.9.7",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.9.7.tgz",
+            "integrity": "sha512-VRu8cOWrLJU/Krulo8njfPCMeJT+uu1k9GjFZ9Cw88mHGW7a3MK54IzI5p2evLPab7pgplPIoJcv3bC2XB+DAA==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/provider": "^3.8.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0",
                 "clsx": "^2.0.0"
             },
@@ -5733,19 +6264,19 @@
             }
         },
         "node_modules/@react-spectrum/radio": {
-            "version": "3.7.5",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.7.5.tgz",
-            "integrity": "sha512-g2Neh30G4UwOVBGVxvYxE+Bx+bVNFNOtK/MHCw+0tYZ0ysVYKVqqoNvQBmKNcqrDJaulnLwB9Igcm6SDjesGFA==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/radio": "^3.10.3",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/radio": "^3.10.3",
-                "@react-types/radio": "^3.8.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.7.6",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/radio/-/radio-3.7.6.tgz",
+            "integrity": "sha512-KRtipJfIkRWbnvhS/zZ7j3ltEQXrQeVNhmIWChuP+sC5hdA3N8llMgf30Xa9PqtFhGH4CvUlXC9NA/rhLWnm4w==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/radio": "^3.10.4",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/radio": "^3.10.4",
+                "@react-types/radio": "^3.8.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5754,19 +6285,19 @@
             }
         },
         "node_modules/@react-spectrum/searchfield": {
-            "version": "3.8.5",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.8.5.tgz",
-            "integrity": "sha512-yhV5DBcI0gztcXamW1EYgr0SjVNjytUoEeR620IBb0Ta0g3XJOufVdmgJsW6114WMqQIXpiUq/Em8+Dy+iGqCg==",
-            "dependencies": {
-                "@react-aria/searchfield": "^3.7.4",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/textfield": "^3.12.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/searchfield": "^3.5.2",
-                "@react-types/searchfield": "^3.5.4",
-                "@react-types/textfield": "^3.9.2",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.8.6",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/searchfield/-/searchfield-3.8.6.tgz",
+            "integrity": "sha512-RU928ZeQsqPGMsNVtoLvahHmuRC3OAW9im5W0/CVgglINn2IapF2U0oxHVw6ymzx1NyCYrYR8pO9skMF0E68/Q==",
+            "dependencies": {
+                "@react-aria/searchfield": "^3.7.5",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/textfield": "^3.12.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/searchfield": "^3.5.3",
+                "@react-types/searchfield": "^3.5.5",
+                "@react-types/textfield": "^3.9.3",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5775,20 +6306,20 @@
             }
         },
         "node_modules/@react-spectrum/slider": {
-            "version": "3.6.8",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.6.8.tgz",
-            "integrity": "sha512-P+0wtr4WePMU1CSW2AEGgm7l07EoC0lJGOrvQ4bif2Q56yE+QDQClXk6RAFY9eckK9dgMCXmYd5+pT8p4pZ24w==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/slider": "^3.7.7",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/slider": "^3.5.3",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/slider": "^3.7.2",
+            "version": "3.6.9",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/slider/-/slider-3.6.9.tgz",
+            "integrity": "sha512-2X6qxlyObfowb8uZQ8UXEozozcfGLzhQI9BS9DS9Kste/REXMTcRDzFygP1D1HdkvRaWmYRNoYhi/Jl2Kkw7Eg==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/slider": "^3.7.8",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/slider": "^3.5.4",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/slider": "^3.7.3",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5797,14 +6328,14 @@
             }
         },
         "node_modules/@react-spectrum/statuslight": {
-            "version": "3.5.12",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.5.12.tgz",
-            "integrity": "sha512-1I5RaE1dCtmxCzUisE2xtQiD++8C2fzgyb0ayP554HSzsP+ZCE0mUxpW7DtoujASyR8h7E7M7wxP1SFEKgI3bA==",
-            "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/statuslight": "^3.3.8",
+            "version": "3.5.13",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/statuslight/-/statuslight-3.5.13.tgz",
+            "integrity": "sha512-FvvsDVs9lapRf5zmOq3g8ZRpAxOTVRfhG9WyehIqgaRPtqqNpQhAGSXWz0ErXF3zV8AwVvjD70g0atcDCoDeBQ==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/statuslight": "^3.3.9",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5813,17 +6344,17 @@
             }
         },
         "node_modules/@react-spectrum/switch": {
-            "version": "3.5.4",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.5.4.tgz",
-            "integrity": "sha512-8efBXAL2AR2+Vicazyc3z/Us4/dkm2Gi/CpCBhAEDZne2fnNM6X7zFXHEDhMgPn4oDZeUj76VwmBM4MEr+3m3g==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/switch": "^3.6.3",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/toggle": "^3.7.3",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/switch": "^3.5.2",
+            "version": "3.5.5",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/switch/-/switch-3.5.5.tgz",
+            "integrity": "sha512-IIVctsGXnChqMlvf2/pMRkI84vyjf0gMsBXEgky8h8s4i91wxQvl6800/4I9rCSQdAAnQYb+Nd3St8Ik7BupQg==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/switch": "^3.6.4",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/toggle": "^3.7.4",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/switch": "^3.5.3",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5832,34 +6363,34 @@
             }
         },
         "node_modules/@react-spectrum/table": {
-            "version": "3.12.9",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.12.9.tgz",
-            "integrity": "sha512-lFEkHLuMd5owB9vQjeGDOiBah/xOn4zUBtieMKHP6xLh7vUG27zr6vcQzpizNsHT3273Rktr34IjRf/U26Mu4w==",
-            "dependencies": {
-                "@react-aria/button": "^3.9.4",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/table": "^3.14.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/virtualizer": "^3.10.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-spectrum/checkbox": "^3.9.5",
-                "@react-spectrum/dnd": "^3.3.9",
-                "@react-spectrum/layout": "^3.6.4",
-                "@react-spectrum/menu": "^3.19.0",
-                "@react-spectrum/progress": "^3.7.6",
-                "@react-spectrum/tooltip": "^3.6.6",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/flags": "^3.0.2",
-                "@react-stately/layout": "^3.13.8",
-                "@react-stately/table": "^3.11.7",
-                "@react-stately/virtualizer": "^3.7.0",
-                "@react-types/grid": "^3.2.5",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/table": "^3.9.4",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.12.10",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/table/-/table-3.12.10.tgz",
+            "integrity": "sha512-a9Qa/1uuoChRez6GncmYdkDgSS4MDXzV4Cl/BrO44Dnph1ygXiJGmBgAvmtevcbndfuERGHoIYqzklIr6veArg==",
+            "dependencies": {
+                "@react-aria/button": "^3.9.5",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/table": "^3.14.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/virtualizer": "^3.10.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-spectrum/checkbox": "^3.9.6",
+                "@react-spectrum/dnd": "^3.3.10",
+                "@react-spectrum/layout": "^3.6.5",
+                "@react-spectrum/menu": "^3.19.1",
+                "@react-spectrum/progress": "^3.7.7",
+                "@react-spectrum/tooltip": "^3.6.7",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/flags": "^3.0.3",
+                "@react-stately/layout": "^3.13.9",
+                "@react-stately/table": "^3.11.8",
+                "@react-stately/virtualizer": "^3.7.1",
+                "@react-types/grid": "^3.2.6",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/table": "^3.9.5",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5869,24 +6400,24 @@
             }
         },
         "node_modules/@react-spectrum/tabs": {
-            "version": "3.8.9",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.8.9.tgz",
-            "integrity": "sha512-7lgM47iEVNrz6c4XLU6IOivWyh22lmuq0AGCKIel8tJgWM137qEnHkqKmHg9VWAueaKbxW6iWEYuQX6InEeFwA==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/tabs": "^3.9.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/picker": "^3.14.4",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/list": "^3.10.4",
-                "@react-stately/tabs": "^3.6.5",
-                "@react-types/select": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/tabs": "^3.3.6",
+            "version": "3.8.10",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/tabs/-/tabs-3.8.10.tgz",
+            "integrity": "sha512-LoNkxalAbOjKgbF/x3NU5zhvhUgAEqJvEwzKLVSr+KDQlMAFe9LZ+HOH2NRiWR8ak9BkW3RR6C8cGo7G7fdrfA==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/tabs": "^3.9.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/picker": "^3.14.5",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/list": "^3.10.5",
+                "@react-stately/tabs": "^3.6.6",
+                "@react-types/select": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/tabs": "^3.3.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5896,24 +6427,24 @@
             }
         },
         "node_modules/@react-spectrum/tag": {
-            "version": "3.2.5",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/tag/-/tag-3.2.5.tgz",
-            "integrity": "sha512-/DbGrTX0OovTrxYjUM3L+2RXIGJMO0srI5jGd0dA6uzs8t7fA1GUySarpSpttiZqQDyrasNA3+mnG5xVfcRoPw==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/tag": "^3.4.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/button": "^3.16.3",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/text": "^3.5.4",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/list": "^3.10.4",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.2.6",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/tag/-/tag-3.2.6.tgz",
+            "integrity": "sha512-OSGIL2fYLMmiPRCEGvdrQVazS6/S0nhzf/FO52pAAjDZHkd4RDlHHY00Yv/2GPJKroa4e5jdyd5NHCxlW5Vbaw==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/tag": "^3.4.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/button": "^3.16.4",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/text": "^3.5.5",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/list": "^3.10.5",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5923,16 +6454,16 @@
             }
         },
         "node_modules/@react-spectrum/text": {
-            "version": "3.5.4",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.5.4.tgz",
-            "integrity": "sha512-VsCsuHxpycvKWUkwZKBIg0Seu3ylaGtgkDDKgw5uyIKENdhz/W9h6FXnKm4O3VgI8snIySnnHGSa00Z4b6hMig==",
-            "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/text": "^3.3.8",
+            "version": "3.5.5",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/text/-/text-3.5.5.tgz",
+            "integrity": "sha512-MSRMUNWjuqjAH0eRjSw0fOCvM7haqgfy3HgwHpB5czpeUtR1p22e+UWA9gHior7S57zrQN1WotpeWZ1AmnzvWg==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/text": "^3.3.9",
                 "@swc/helpers": "^0.5.0",
-                "react-aria-components": "^1.2.0"
+                "react-aria-components": "^1.2.1"
             },
             "peerDependencies": {
                 "@react-spectrum/provider": "^3.0.0",
@@ -5940,21 +6471,21 @@
             }
         },
         "node_modules/@react-spectrum/textfield": {
-            "version": "3.12.0",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.12.0.tgz",
-            "integrity": "sha512-ZupbZ/cyIFMyxb2rCcy+4FQ8lsh/I3AXrsZ9VNE1KjEklR5s8In7cIjFtlfJlk8CX8B5KL69crhyLoe2hUxX5g==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/textfield": "^3.14.4",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/form": "^3.7.5",
-                "@react-spectrum/label": "^3.16.5",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/textfield": "^3.9.2",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.12.1",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/textfield/-/textfield-3.12.1.tgz",
+            "integrity": "sha512-ehvStKrduGo71SfEieodw6NHBDvyE5wYYZh1uLwbde9hjfyOf2q56lfMdSQiBSJ5pDnpS0ToLpoomoPz315u+Q==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/textfield": "^3.14.5",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/form": "^3.7.6",
+                "@react-spectrum/label": "^3.16.6",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/textfield": "^3.9.3",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5963,11 +6494,11 @@
             }
         },
         "node_modules/@react-spectrum/theme-dark": {
-            "version": "3.5.9",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.5.9.tgz",
-            "integrity": "sha512-9aHHosP1X+qGIgQLXCg4tb/8g+UA5YDhAXSoa7T2fem+V/SZtTv0TqUPZZpyUlMXM0DoDlGmN7BFpG5S7vm6+A==",
+            "version": "3.5.10",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/theme-dark/-/theme-dark-3.5.10.tgz",
+            "integrity": "sha512-xDzuWY9Vtd0X7Ww5fBvhbTq7oM0PiNtKlT+cPVnKm4YmJB5RvVG/m6jYF4/9GN36NAyiRnNRdBCs7SUuKEfTkA==",
             "dependencies": {
-                "@react-types/provider": "^3.8.0",
+                "@react-types/provider": "^3.8.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5975,11 +6506,11 @@
             }
         },
         "node_modules/@react-spectrum/theme-default": {
-            "version": "3.5.9",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.5.9.tgz",
-            "integrity": "sha512-+Ebngv8waP3sGsGUFtr1py61T0Iv79YJz6YB2geJbPeFbrtiTxaTxFoJLsaHCRFcgcJFxAu4hrNT+brR/UMt4w==",
+            "version": "3.5.10",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/theme-default/-/theme-default-3.5.10.tgz",
+            "integrity": "sha512-qCGce11d5p0Ce4nSz25vRYoMZycb8oxbgMUM9YXXHgUBDbRRB/s0JNUXxlyikENtaNWiCyeWzVm80bJKmmIijw==",
             "dependencies": {
-                "@react-types/provider": "^3.8.0",
+                "@react-types/provider": "^3.8.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5987,11 +6518,11 @@
             }
         },
         "node_modules/@react-spectrum/theme-light": {
-            "version": "3.4.9",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.4.9.tgz",
-            "integrity": "sha512-ZlImejzK+yAEWjxV2hqo8cdqHQc/y+ZOexF30lR6fez6O59nrNC0ETJqBTYEMWqrCHiqJk+2MD+uZf5RNHeyxg==",
+            "version": "3.4.10",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/theme-light/-/theme-light-3.4.10.tgz",
+            "integrity": "sha512-MKHxBlfawja16hBlcBTFD72B+luPwhCG/pTY35WMy+gCVWUeYEwJU8ijOhG7A7a7KkrLpHgebpHojxEXYkmFIA==",
             "dependencies": {
-                "@react-types/provider": "^3.8.0",
+                "@react-types/provider": "^3.8.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -5999,21 +6530,21 @@
             }
         },
         "node_modules/@react-spectrum/tooltip": {
-            "version": "3.6.6",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.6.6.tgz",
-            "integrity": "sha512-xqqu8dNoSHOXrjczH3IzplDy+mB8hZb0/vk0IB61xJr+O8hjfN4jlgBrKqbuzxeZyFLKV5GY7b9D8jkLE/9v3w==",
-            "dependencies": {
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/tooltip": "^3.7.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/overlays": "^5.6.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-stately/tooltip": "^3.4.8",
-                "@react-types/overlays": "^3.8.6",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/tooltip": "^3.4.8",
-                "@spectrum-icons/ui": "^3.6.6",
+            "version": "3.6.7",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/tooltip/-/tooltip-3.6.7.tgz",
+            "integrity": "sha512-kJDFY7G5MGuKc5e4K24ftYbzFLt9ugO5zbGMAg6Zbz79+ER8jTsbGNVupK3E7m9uSimF/aPRRwf2p8UdoksH6Q==",
+            "dependencies": {
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/tooltip": "^3.7.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/overlays": "^5.6.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-stately/tooltip": "^3.4.9",
+                "@react-types/overlays": "^3.8.7",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/tooltip": "^3.4.9",
+                "@spectrum-icons/ui": "^3.6.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6023,14 +6554,14 @@
             }
         },
         "node_modules/@react-spectrum/utils": {
-            "version": "3.11.6",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.11.6.tgz",
-            "integrity": "sha512-CAjPqeP9haHmU60WE3lAWNMSx9B80LT/umNETC7YWkryT1cxMi4nn+jPXhYzozvDrrbGSTjdcuMo203Ywmj+tw==",
-            "dependencies": {
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/ssr": "^3.9.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.11.7",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/utils/-/utils-3.11.7.tgz",
+            "integrity": "sha512-o/9zTvUor0EaRwKZWVlgOcyvH+/JIBsNxuvhDgCP5lD868KoZePmx1L64TejUqK/swwH8jr35gyULpYU2kQXRw==",
+            "dependencies": {
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/ssr": "^3.9.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0",
                 "clsx": "^2.0.0"
             },
@@ -6039,14 +6570,14 @@
             }
         },
         "node_modules/@react-spectrum/view": {
-            "version": "3.6.9",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.6.9.tgz",
-            "integrity": "sha512-auIXiyfMK+BjqCvGTPb9uENPed26byr4mL8MW89NW2x39jaRejLyLUNKuElIE4PkGCJQA5CHNOmObAHZR/XA8Q==",
+            "version": "3.6.10",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/view/-/view-3.6.10.tgz",
+            "integrity": "sha512-AbvwyORDzntt9XiP9Soc5mCuYsYOJKj+4mwX0ugZZi9I18g1JVeSPnGG/myYdHr2xXNC00pgVILOLA/B0JWMXw==",
             "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/view": "^3.4.8",
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/view": "^3.4.9",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6055,14 +6586,14 @@
             }
         },
         "node_modules/@react-spectrum/well": {
-            "version": "3.4.12",
-            "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.4.12.tgz",
-            "integrity": "sha512-/3msBtaiKge9K0nAua4K2YFYXZiYHCcnY2dWzlLrov75uQPaRiTyzxXYqRT+OQ62vPHtu1FQ5BsJDecoM8jedw==",
-            "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-spectrum/utils": "^3.11.6",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/well": "^3.3.8",
+            "version": "3.4.13",
+            "resolved": "https://registry.npmjs.org/@react-spectrum/well/-/well-3.4.13.tgz",
+            "integrity": "sha512-zKJsaWnndRvCK4crkZ/Jt5uUk5Jwkx+pRaVu40BEK41aOfavQ44GR90uLogrvDuw2LDZ9mdTj/H7bCVNjkLkgA==",
+            "dependencies": {
+                "@react-aria/utils": "^3.24.1",
+                "@react-spectrum/utils": "^3.11.7",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/well": "^3.3.9",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6116,7 +6647,6 @@
         },
         "node_modules/@react-spring/web": {
             "version": "9.7.3",
-            "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.3.tgz",
             "integrity": "sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==",
             "dependencies": {
                 "@react-spring/animated": "~9.7.3",
@@ -6130,14 +6660,14 @@
             }
         },
         "node_modules/@react-stately/calendar": {
-            "version": "3.5.0",
-            "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.5.0.tgz",
-            "integrity": "sha512-tINxgGAeZ9KsYNomuR50PljG2mN9C9FWQ8zyvATfFq44EFcjjdXCMNWV+qgIRKGKLwrSJhu3boPaiHVIpUxrXA==",
-            "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/calendar": "^3.4.5",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.5.1",
+            "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.5.1.tgz",
+            "integrity": "sha512-7l7QhqGUJ5AzWHfvZzbTe3J4t72Ht5BmhW4hlVI7flQXtfrmYkVtl3ZdytEZkkHmWGYZRW9b4IQTQGZxhtlElA==",
+            "dependencies": {
+                "@internationalized/date": "^3.5.4",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/calendar": "^3.4.6",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6145,14 +6675,14 @@
             }
         },
         "node_modules/@react-stately/checkbox": {
-            "version": "3.6.4",
-            "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.4.tgz",
-            "integrity": "sha512-gecaRtWeQNoJuSl3AtfV6z6LjaUV578Kzbag8d3pTPbGXl8komTtTj/26nIEPsmf/L8jZ3kCscDGxGTKr+7sqg==",
+            "version": "3.6.5",
+            "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.5.tgz",
+            "integrity": "sha512-IXV3f9k+LtmfQLE+DKIN41Q5QB/YBLDCB1YVx5PEdRp52S9+EACD5683rjVm8NVRDwjMi2SP6RnFRk7fVb5Azg==",
             "dependencies": {
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/checkbox": "^3.8.0",
-                "@react-types/shared": "^3.23.0",
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/checkbox": "^3.8.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6160,11 +6690,11 @@
             }
         },
         "node_modules/@react-stately/collections": {
-            "version": "3.10.6",
-            "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.6.tgz",
-            "integrity": "sha512-hb/yzxQnZaSRu43iR6ftkCJIqD4Qu5WUjl4ASBn2EGb9TmipA7bFnYVqSH4xFPCCTZ68Qxh95dOcxYBHlHeWZQ==",
+            "version": "3.10.7",
+            "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.7.tgz",
+            "integrity": "sha512-KRo5O2MWVL8n3aiqb+XR3vP6akmHLhLWYZEmPKjIv0ghQaEebBTrN3wiEjtd6dzllv0QqcWvDLM1LntNfJ2TsA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6172,19 +6702,19 @@
             }
         },
         "node_modules/@react-stately/color": {
-            "version": "3.6.0",
-            "resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.6.0.tgz",
-            "integrity": "sha512-sjQDjE1zBAnaJaqssP4Ep63Pd32xvLOwcfUmXAOua6s+8CKVlKQqr5BoBiBnqvGGmy7oTlEJd1dkfZA+bvh/zw==",
-            "dependencies": {
-                "@internationalized/number": "^3.5.2",
-                "@internationalized/string": "^3.2.2",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/numberfield": "^3.9.2",
-                "@react-stately/slider": "^3.5.3",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/color": "3.0.0-beta.24",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.6.1",
+            "resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.6.1.tgz",
+            "integrity": "sha512-iW0nAhl3+fUBegHMw5EcAbFVDpgwHBrivfC85pVoTM3pyzp66hqNN6R6xWxW6ETyljS8UOer59+/w4GDVGdPig==",
+            "dependencies": {
+                "@internationalized/number": "^3.5.3",
+                "@internationalized/string": "^3.2.3",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/numberfield": "^3.9.3",
+                "@react-stately/slider": "^3.5.4",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/color": "3.0.0-beta.25",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6192,18 +6722,18 @@
             }
         },
         "node_modules/@react-stately/combobox": {
-            "version": "3.8.3",
-            "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.3.tgz",
-            "integrity": "sha512-lmwt2M39jHQUA9CWKhTc9MVoUBKuJM1Y+9GYPElON8P/guQL6G3bM1u8I4Hxf0zzGzAIW3ymV57bF9mcaA/nzA==",
-            "dependencies": {
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/list": "^3.10.4",
-                "@react-stately/overlays": "^3.6.6",
-                "@react-stately/select": "^3.6.3",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/combobox": "^3.11.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.8.4",
+            "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.4.tgz",
+            "integrity": "sha512-iLVGvKRRz0TeJXZhZyK783hveHpYA6xovOSdzSD+WGYpiPXo1QrcrNoH3AE0Z2sHtorU+8nc0j58vh5PB+m2AA==",
+            "dependencies": {
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/list": "^3.10.5",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-stately/select": "^3.6.4",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/combobox": "^3.11.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6211,11 +6741,11 @@
             }
         },
         "node_modules/@react-stately/data": {
-            "version": "3.11.3",
-            "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.11.3.tgz",
-            "integrity": "sha512-iyg27s3uUquxvX5AXckAgOPszG6uX7fCOIg0D/GJXxdFxLv1gFSupIeIJhM+kXufPgpaLiugaQxoYlO5y65shA==",
+            "version": "3.11.4",
+            "resolved": "https://registry.npmjs.org/@react-stately/data/-/data-3.11.4.tgz",
+            "integrity": "sha512-PbnUQxeE6AznSuEWYnRmrYQ9t5z1Asx98Jtrl96EeA6Iapt9kOjTN9ySqCxtPxMKleb1NIqG3+uHU3veIqmLsg==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6223,17 +6753,17 @@
             }
         },
         "node_modules/@react-stately/datepicker": {
-            "version": "3.9.3",
-            "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.3.tgz",
-            "integrity": "sha512-NjZ8uqxmKf7mGLNWSZsvm22xX46k+yo0QkPspONuorHFTf8qqCnp4i+bBpEpaVCwX5KVSRdjxJOk7XhvJF8q4w==",
-            "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@internationalized/string": "^3.2.2",
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/overlays": "^3.6.6",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/datepicker": "^3.7.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.9.4",
+            "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.4.tgz",
+            "integrity": "sha512-yBdX01jn6gq4NIVvHIqdjBUPo+WN8Bujc4OnPw+ZnfA4jI0eIgq04pfZ84cp1LVXW0IB0VaCu1AlQ/kvtZjfGA==",
+            "dependencies": {
+                "@internationalized/date": "^3.5.4",
+                "@internationalized/string": "^3.2.3",
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/datepicker": "^3.7.4",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6241,12 +6771,12 @@
             }
         },
         "node_modules/@react-stately/dnd": {
-            "version": "3.3.0",
-            "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.3.0.tgz",
-            "integrity": "sha512-bHH3B4wFqfATpyxpP5Wdv/5uQdci4WvStJgeExj7Yy2UwYSsZEnS6Ky0MhLLFdIyUpragjiSCzYcYwwli6oHUQ==",
+            "version": "3.3.1",
+            "resolved": "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.3.1.tgz",
+            "integrity": "sha512-I/Ci5xB8hSgAXzoWYWScfMM9UK1MX/eTlARBhiSlfudewweOtNJAI+cXJgU7uiUnGjh4B4v3qDBtlAH1dWDCsw==",
             "dependencies": {
-                "@react-stately/selection": "^3.15.0",
-                "@react-types/shared": "^3.23.0",
+                "@react-stately/selection": "^3.15.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6254,28 +6784,19 @@
             }
         },
         "node_modules/@react-stately/flags": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.2.tgz",
-            "integrity": "sha512-/KyVJMND2WdkgoHpt+m+ash7h5q9pq91DLgyizQWcbf2xphicH9D1HKAB8co3Cfvq6T/QqjQEP8aBkheiPyfEg==",
-            "dependencies": {
-                "@swc/helpers": "^0.4.14"
-            }
-        },
-        "node_modules/@react-stately/flags/node_modules/@swc/helpers": {
-            "version": "0.4.36",
-            "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz",
-            "integrity": "sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==",
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.3.tgz",
+            "integrity": "sha512-/ha7XFA0RZTQsbzSPwu3KkbNMgbvuM0GuMTYLTBWpgBrovBNTM+QqI/PfZTdHg8PwCYF4H5Y8gjdSpdulCvJFw==",
             "dependencies": {
-                "legacy-swc-helpers": "npm:@swc/helpers@=0.4.14",
-                "tslib": "^2.4.0"
+                "@swc/helpers": "^0.5.0"
             }
         },
         "node_modules/@react-stately/form": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.0.2.tgz",
-            "integrity": "sha512-MA4P9lHv770I3DJpJTQlkh5POVuklmeQuixwlbyKzlWT+KqFSOXvqaliszqU7gyDdVGAFksMa6E3mXbGbk1wuA==",
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.0.3.tgz",
+            "integrity": "sha512-92YYBvlHEWUGUpXgIaQ48J50jU9XrxfjYIN8BTvvhBHdD63oWgm8DzQnyT/NIAMzdLnhkg7vP+fjG8LjHeyIAg==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6283,14 +6804,14 @@
             }
         },
         "node_modules/@react-stately/grid": {
-            "version": "3.8.6",
-            "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.8.6.tgz",
-            "integrity": "sha512-XkxDfaIAWzbsb5pnL2IE4FqQbqegVzPnU+R2ZvDrJT7514I2usSMoJ2ZUUoy8DIYQomJHB5QKZeyQkGIelHMcg==",
-            "dependencies": {
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/selection": "^3.15.0",
-                "@react-types/grid": "^3.2.5",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.8.7",
+            "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.8.7.tgz",
+            "integrity": "sha512-he3TXCLAhF5C5z1/G4ySzcwyt7PEiWcVIupxebJQqRyFrNWemSuv+7tolnStmG8maMVIyV3P/3j4eRBbdSlOIg==",
+            "dependencies": {
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/selection": "^3.15.1",
+                "@react-types/grid": "^3.2.6",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6298,16 +6819,16 @@
             }
         },
         "node_modules/@react-stately/layout": {
-            "version": "3.13.8",
-            "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.13.8.tgz",
-            "integrity": "sha512-WDusSjT8w6vgzgMS7Hwl5zx7rhivMIjFo0a0UqQahgF4kXYPqeEYMOgoczbFqCGgS/vQKOmMy5Rk6fzBb73bdA==",
-            "dependencies": {
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/table": "^3.11.7",
-                "@react-stately/virtualizer": "^3.7.0",
-                "@react-types/grid": "^3.2.5",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/table": "^3.9.4",
+            "version": "3.13.9",
+            "resolved": "https://registry.npmjs.org/@react-stately/layout/-/layout-3.13.9.tgz",
+            "integrity": "sha512-JCj2cnvRbBjah9LFZbBXMdKkoKuEpzn6hvYBw7h0fNIhNGISpiI1TW4ya1X34kD2vcv/3dc31KV/UqmI4hJCQw==",
+            "dependencies": {
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/table": "^3.11.8",
+                "@react-stately/virtualizer": "^3.7.1",
+                "@react-types/grid": "^3.2.6",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/table": "^3.9.5",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6315,14 +6836,14 @@
             }
         },
         "node_modules/@react-stately/list": {
-            "version": "3.10.4",
-            "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.10.4.tgz",
-            "integrity": "sha512-sj501OKcQr+1Zdo0m6NuvpZDHLE0tUdReSKcWqt35odzC6ic/qr7C7ozZ/5ay+nuHTryUUTC/mDQ0zlBmQX0dA==",
-            "dependencies": {
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/selection": "^3.15.0",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.10.5",
+            "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.10.5.tgz",
+            "integrity": "sha512-fV9plO+6QDHiewsYIhboxcDhF17GO95xepC5ki0bKXo44gr14g/LSo/BMmsaMnV+1BuGdBunB05bO4QOIaigXA==",
+            "dependencies": {
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/selection": "^3.15.1",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6330,13 +6851,13 @@
             }
         },
         "node_modules/@react-stately/menu": {
-            "version": "3.7.0",
-            "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.7.0.tgz",
-            "integrity": "sha512-8UJhvKEF+zaHXrwv0YhFr73OSEprzIs6xRNoV6F/omd4twy1ngPZrL1X8HNzaXsf5BrHuib2tbh81e/Z95D3nA==",
+            "version": "3.7.1",
+            "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.7.1.tgz",
+            "integrity": "sha512-mX1w9HHzt+xal1WIT2xGrTQsoLvDwuB2R1Er1MBABs//MsJzccycatcgV/J/28m6tO5M9iuFQQvLV+i1dCtodg==",
             "dependencies": {
-                "@react-stately/overlays": "^3.6.6",
-                "@react-types/menu": "^3.9.8",
-                "@react-types/shared": "^3.23.0",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-types/menu": "^3.9.9",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6344,14 +6865,14 @@
             }
         },
         "node_modules/@react-stately/numberfield": {
-            "version": "3.9.2",
-            "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.9.2.tgz",
-            "integrity": "sha512-Sp+0MnqaqZ/Tu8qalZXbMIXyvZ7aXIny2PxNIxmnqxVHfxIzQCLJW5Y4bJr1yJIHH3QDZic5OyqS72MBWBXnIA==",
-            "dependencies": {
-                "@internationalized/number": "^3.5.2",
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/numberfield": "^3.8.2",
+            "version": "3.9.3",
+            "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.9.3.tgz",
+            "integrity": "sha512-UlPTLSabhLEuHtgzM0PgfhtEaHy3yttbzcRb8yHNvGo4KbCHeHpTHd3QghKfTFm024Mug7+mVlWCmMtW0f5ttg==",
+            "dependencies": {
+                "@internationalized/number": "^3.5.3",
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/numberfield": "^3.8.3",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6359,12 +6880,12 @@
             }
         },
         "node_modules/@react-stately/overlays": {
-            "version": "3.6.6",
-            "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.6.tgz",
-            "integrity": "sha512-NvzQXh4zYGZuUmZH5d3NmEDNr8r1hfub2s5w7WOeIG35xqIzoKGdFZ7LLWrie+4nxPmM+ckdfqOQ9pBZFNJypQ==",
+            "version": "3.6.7",
+            "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.7.tgz",
+            "integrity": "sha512-6zp8v/iNUm6YQap0loaFx6PlvN8C0DgWHNlrlzMtMmNuvjhjR0wYXVaTfNoUZBWj25tlDM81ukXOjpRXg9rLrw==",
             "dependencies": {
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/overlays": "^3.8.6",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/overlays": "^3.8.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6372,14 +6893,14 @@
             }
         },
         "node_modules/@react-stately/radio": {
-            "version": "3.10.3",
-            "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.3.tgz",
-            "integrity": "sha512-EWLLRgLQ9orI7G9uPuJv1bdZPu3OoRWy1TGSn+6G8b8rleNx3haI4eZUR+JGB0YNgemotMz/gbNTNG/wEIsRgw==",
-            "dependencies": {
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/radio": "^3.8.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.10.4",
+            "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.4.tgz",
+            "integrity": "sha512-kCIc7tAl4L7Hu4Wt9l2jaa+MzYmAJm0qmC8G8yPMbExpWbLRu6J8Un80GZu+JxvzgDlqDyrVvyv9zFifwH/NkQ==",
+            "dependencies": {
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/radio": "^3.8.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6387,12 +6908,12 @@
             }
         },
         "node_modules/@react-stately/searchfield": {
-            "version": "3.5.2",
-            "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.2.tgz",
-            "integrity": "sha512-M73mhUCbY5aJAtVH8BF9TeBwOtEMC7G1N/W6j71V8f3MlN0ppN0n4pZWW3CMd2x0BKuYum8KPvcL1DgiXzoo5A==",
+            "version": "3.5.3",
+            "resolved": "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.3.tgz",
+            "integrity": "sha512-H0OvlgwPIFdc471ypw79MDjz3WXaVq9+THaY6JM4DIohEJNN5Dwei7O9g6r6m/GqPXJIn5TT3b74kJ2Osc00YQ==",
             "dependencies": {
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/searchfield": "^3.5.4",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/searchfield": "^3.5.5",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6400,15 +6921,15 @@
             }
         },
         "node_modules/@react-stately/select": {
-            "version": "3.6.3",
-            "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.3.tgz",
-            "integrity": "sha512-d/ha6j0oiEaw/F5hgPgCZg1e8LObNmvsocEebxXPToVdwHd9H55r2Fogi5nLoiX8geHKiYm0KPfSxs/oXbW/5Q==",
-            "dependencies": {
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/list": "^3.10.4",
-                "@react-stately/overlays": "^3.6.6",
-                "@react-types/select": "^3.9.3",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.6.4",
+            "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.4.tgz",
+            "integrity": "sha512-whZgF1N53D0/dS8tOFdrswB0alsk5Q5620HC3z+5f2Hpi8gwgAZ8TYa+2IcmMYRiT+bxVuvEc/NirU9yPmqGbA==",
+            "dependencies": {
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/list": "^3.10.5",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-types/select": "^3.9.4",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6416,13 +6937,13 @@
             }
         },
         "node_modules/@react-stately/selection": {
-            "version": "3.15.0",
-            "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.15.0.tgz",
-            "integrity": "sha512-OtypXNtvRWLmpkaktluzCYEXKXAON16WIJv2mZ4cae3H0UVfWaFL9sD+ST9nj7UqYNTDXECug5ziIY+YKd7zvA==",
+            "version": "3.15.1",
+            "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.15.1.tgz",
+            "integrity": "sha512-6TQnN9L0UY9w19B7xzb1P6mbUVBtW840Cw1SjgNXCB3NPaCf59SwqClYzoj8O2ZFzMe8F/nUJtfU1NS65/OLlw==",
             "dependencies": {
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/shared": "^3.23.0",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6430,13 +6951,13 @@
             }
         },
         "node_modules/@react-stately/slider": {
-            "version": "3.5.3",
-            "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.3.tgz",
-            "integrity": "sha512-jA0XR7GjtwoucLw8kx/KB50pSGNUbR7xNfM9t5H8D7k3wd+j4yqfarWyNFyPX/X5MJez+/bd+BIDJUl3XGOWkA==",
+            "version": "3.5.4",
+            "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.4.tgz",
+            "integrity": "sha512-Jsf7K17dr93lkNKL9ij8HUcoM1sPbq8TvmibD6DhrK9If2lje+OOL8y4n4qreUnfMT56HCAeS9wCO3fg3eMyrw==",
             "dependencies": {
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/slider": "^3.7.2",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/slider": "^3.7.3",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6444,18 +6965,18 @@
             }
         },
         "node_modules/@react-stately/table": {
-            "version": "3.11.7",
-            "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.11.7.tgz",
-            "integrity": "sha512-VvazamtoXLENeWJAYF1fJzfIAXO2qbiXCfosRLgkEMtoU2kGqV8DHYQhIXuqwMRn8nO8GVw9hgAiQQcKghgCXA==",
-            "dependencies": {
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/flags": "^3.0.2",
-                "@react-stately/grid": "^3.8.6",
-                "@react-stately/selection": "^3.15.0",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/grid": "^3.2.5",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/table": "^3.9.4",
+            "version": "3.11.8",
+            "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.11.8.tgz",
+            "integrity": "sha512-EdyRW3lT1/kAVDp5FkEIi1BQ7tvmD2YgniGdLuW/l9LADo0T+oxZqruv60qpUS6sQap+59Riaxl91ClDxrJnpg==",
+            "dependencies": {
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/flags": "^3.0.3",
+                "@react-stately/grid": "^3.8.7",
+                "@react-stately/selection": "^3.15.1",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/grid": "^3.2.6",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/table": "^3.9.5",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6463,13 +6984,13 @@
             }
         },
         "node_modules/@react-stately/tabs": {
-            "version": "3.6.5",
-            "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.5.tgz",
-            "integrity": "sha512-z1saZgGRqb0AsoRi19iE4JOJaIRV73GjRnzUX9QSl3gpK75XsH31vbmtUYiXOXAd6Dt+1KFLgbyeCzMUlZEnMw==",
+            "version": "3.6.6",
+            "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.6.tgz",
+            "integrity": "sha512-sOLxorH2uqjAA+v1ppkMCc2YyjgqvSGeBDgtR/lyPSDd4CVMoTExszROX2dqG0c8il9RQvzFuufUtQWMY6PgSA==",
             "dependencies": {
-                "@react-stately/list": "^3.10.4",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/tabs": "^3.3.6",
+                "@react-stately/list": "^3.10.5",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/tabs": "^3.3.7",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6477,12 +6998,12 @@
             }
         },
         "node_modules/@react-stately/toggle": {
-            "version": "3.7.3",
-            "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.3.tgz",
-            "integrity": "sha512-4jW6wxTu7Gkq6/2mZWqtJoQ6ff27Cl6lnVMEXXM+M8HwK/3zHoMZhVz8EApwgOsRByxDQ76PNSGm3xKZAcqZNw==",
+            "version": "3.7.4",
+            "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.4.tgz",
+            "integrity": "sha512-CoYFe9WrhLkDP4HGDpJYQKwfiYCRBAeoBQHv+JWl5eyK61S8xSwoHsveYuEZ3bowx71zyCnNAqWRrmNOxJ4CKA==",
             "dependencies": {
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/checkbox": "^3.8.0",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/checkbox": "^3.8.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6490,12 +7011,12 @@
             }
         },
         "node_modules/@react-stately/tooltip": {
-            "version": "3.4.8",
-            "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.8.tgz",
-            "integrity": "sha512-0D3cCeQhX5DjDpeuzFJwfX8SxIOxdL2iWPPjpC3hIxkUKuItavSq2A7G2tO39vpiip3RBOaaQMUpnSmjRK5DAQ==",
+            "version": "3.4.9",
+            "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.9.tgz",
+            "integrity": "sha512-P7CDJsdoKarz32qFwf3VNS01lyC+63gXpDZG31pUu+EO5BeQd4WKN/AH1Beuswpr4GWzxzFc1aXQgERFGVzraA==",
             "dependencies": {
-                "@react-stately/overlays": "^3.6.6",
-                "@react-types/tooltip": "^3.4.8",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-types/tooltip": "^3.4.9",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6503,14 +7024,14 @@
             }
         },
         "node_modules/@react-stately/tree": {
-            "version": "3.8.0",
-            "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.8.0.tgz",
-            "integrity": "sha512-7bfbCLjG8BTiWuo9GBE1A375PPI4S9r/rMtKQGLQvYAObgJb7C8P3svA9WKfryvl7M5iqaYrOVA0uzNSmeCNQQ==",
-            "dependencies": {
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/selection": "^3.15.0",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/shared": "^3.23.0",
+            "version": "3.8.1",
+            "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.8.1.tgz",
+            "integrity": "sha512-LOdkkruJWch3W89h4B/bXhfr0t0t1aRfEp+IMrrwdRAl23NaPqwl5ILHs4Xu5XDHqqhg8co73pHrJwUyiTWEjw==",
+            "dependencies": {
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/selection": "^3.15.1",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6518,9 +7039,9 @@
             }
         },
         "node_modules/@react-stately/utils": {
-            "version": "3.10.0",
-            "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.0.tgz",
-            "integrity": "sha512-nji2i9fTYg65ZWx/3r11zR1F2tGya+mBubRCbMTwHyRnsSLFZaeq/W6lmrOyIy1uMJKBNKLJpqfmpT4x7rw6pg==",
+            "version": "3.10.1",
+            "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.1.tgz",
+            "integrity": "sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==",
             "dependencies": {
                 "@swc/helpers": "^0.5.0"
             },
@@ -6529,12 +7050,12 @@
             }
         },
         "node_modules/@react-stately/virtualizer": {
-            "version": "3.7.0",
-            "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.7.0.tgz",
-            "integrity": "sha512-Wkh502y6mzUvjJJr30p5FLRwBaphnfmnoSnGwidamwo3HuyrDICBSlwFGPl0AmUHo1afSaLXl6j8smU48VcClA==",
+            "version": "3.7.1",
+            "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.7.1.tgz",
+            "integrity": "sha512-voHgE6EQ+oZaLv6u2umKxakvIKNkCQuUihqKACTjdslp7SJh4Mvs3oLBI0hf0JOh+rCcFIKDvQtFwy1fXFRYBA==",
             "dependencies": {
-                "@react-aria/utils": "^3.24.0",
-                "@react-types/shared": "^3.23.0",
+                "@react-aria/utils": "^3.24.1",
+                "@react-types/shared": "^3.23.1",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -6542,482 +7063,482 @@
             }
         },
         "node_modules/@react-types/actionbar": {
-            "version": "3.1.6",
-            "resolved": "https://registry.npmjs.org/@react-types/actionbar/-/actionbar-3.1.6.tgz",
-            "integrity": "sha512-P2yp2eM/x7Vjc/wFu+DGsKLTfIYIlUSKGN4Ao+xk6v0fleOHkcHOep1Y3fwOtc1WGHk7HSeoxScFiw5d3e73eg==",
+            "version": "3.1.7",
+            "resolved": "https://registry.npmjs.org/@react-types/actionbar/-/actionbar-3.1.7.tgz",
+            "integrity": "sha512-yohxM+R9o/HGADL7NdTH9tC9BnWrVYKsutobjWzVQZHGoaHEqBbz03dk3m9UvFMnw7g6kjtGxhOJQpztz7nk3Q==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/actiongroup": {
-            "version": "3.4.8",
-            "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.4.8.tgz",
-            "integrity": "sha512-IT3eSs1Lu9jN+EeoJL70f4VOXLeK5JlhtWjioPKz6JCmr/coUSHtFTLEgfUSzvCo98XJa4w8oC49ds7CkZBUGg==",
+            "version": "3.4.9",
+            "resolved": "https://registry.npmjs.org/@react-types/actiongroup/-/actiongroup-3.4.9.tgz",
+            "integrity": "sha512-n6lGBLm8HxLguG4om5ysMCexSdMWNhM5L0yGjA4pZxdoKZborPALDN/Ao57svnTwaSJmeExvTwHIFds1yr4AXQ==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/avatar": {
-            "version": "3.0.6",
-            "resolved": "https://registry.npmjs.org/@react-types/avatar/-/avatar-3.0.6.tgz",
-            "integrity": "sha512-hDCbtP0zU4H50psNiyhmyboT5UkwEK9EY0lxqKuBkF62kfP57d5dyS6TeD3XkdPbeCEOR06ttGjFQDwjFPrdvg==",
+            "version": "3.0.7",
+            "resolved": "https://registry.npmjs.org/@react-types/avatar/-/avatar-3.0.7.tgz",
+            "integrity": "sha512-FXws1/o0Vy3yJcBDdKYPElNzpcVjdkck6KHGQyxAkKe7vvtFUcHpzz9fxEO5kRLwTv6j7EahXsJeqsH9TpFWuA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/badge": {
-            "version": "3.1.8",
-            "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.1.8.tgz",
-            "integrity": "sha512-rL/Qa3GpxYn6cFiI+oLWVuNQ45qOufCRejimWNMws+ieY4+lvxNEvZfbOPTEOT+2sdQG4i9QpV2eHuFL1mVK9w==",
+            "version": "3.1.9",
+            "resolved": "https://registry.npmjs.org/@react-types/badge/-/badge-3.1.9.tgz",
+            "integrity": "sha512-GNvg3cULRiUxXZYmOOIaua0KSL72jnLwv/2LLbQeYQystLaEmsibmdoRvfQN80mEQ1f3WFfhZogiG31+4MS/xg==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/breadcrumbs": {
-            "version": "3.7.4",
-            "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.4.tgz",
-            "integrity": "sha512-gQPLi71i+4zE6m5S74v7bpZ/yBERtlUt5qBcvB4C7gJu8aR4cFrv1YFZ//9f8uwlAHjau7XBpVlbBDlhfb2aOQ==",
+            "version": "3.7.5",
+            "resolved": "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.5.tgz",
+            "integrity": "sha512-lV9IDYsMiu2TgdMIjEmsOE0YWwjb3jhUNK1DCZZfq6uWuiHLgyx2EncazJBUWSjHJ4ta32j7xTuXch+8Ai6u/A==",
             "dependencies": {
-                "@react-types/link": "^3.5.4",
-                "@react-types/shared": "^3.23.0"
+                "@react-types/link": "^3.5.5",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/button": {
-            "version": "3.9.3",
-            "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.3.tgz",
-            "integrity": "sha512-YHlSeH85FhasJXOmkY4x+6If74ZpUh88C2fMlw0HUA/Bq/KGckUoriV8cnMqSnB1OwPqi8dpBZGfFVj6f6lh9A==",
+            "version": "3.9.4",
+            "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.4.tgz",
+            "integrity": "sha512-raeQBJUxBp0axNF74TXB8/H50GY8Q3eV6cEKMbZFP1+Dzr09Ngv0tJBeW0ewAxAguNH5DRoMUAUGIXtSXskVdA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/buttongroup": {
-            "version": "3.3.8",
-            "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.3.8.tgz",
-            "integrity": "sha512-BlpLX8Qd2hlN9zWFqDEb3STR6gJF3ukDiLg/JjqTgWLPg7BK1t2MIk2zVr+Y2Wq5+jIq281+BvLP5NhYIcWJhA==",
+            "version": "3.3.9",
+            "resolved": "https://registry.npmjs.org/@react-types/buttongroup/-/buttongroup-3.3.9.tgz",
+            "integrity": "sha512-3hEWI/GOsY8Z3db8gjEXbxl+6E0ioBNMxfN8jIeiNnSWSDG56MLNArJLowylPrwlrp5SnxLh1WBj44OHqEE3Tg==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/calendar": {
-            "version": "3.4.5",
-            "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.5.tgz",
-            "integrity": "sha512-FAAUbqe8iPiNf/OtdxnpOuAEJzyeRgfK2QCzfb4BIVnNNaTDkbxGCI5wrqHfBQ4FASECJeNlkjYXtbvijaooyw==",
+            "version": "3.4.6",
+            "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.6.tgz",
+            "integrity": "sha512-WSntZPwtvsIYWvBQRAPvuCn55UTJBZroTvX0vQvWykJRQnPAI20G1hMQ3dNsnAL+gLZUYxBXn66vphmjUuSYew==",
             "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@react-types/shared": "^3.23.0"
+                "@internationalized/date": "^3.5.4",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/checkbox": {
-            "version": "3.8.0",
-            "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.8.0.tgz",
-            "integrity": "sha512-IBJ2bAsb3xoXaL+f0pwfRLDvRkhxfcX/q4NRJ2oT9jeHLU+j6svgK1Dqk8IGmY+vw1ltKbbMlIVeVonKQ3fgHw==",
+            "version": "3.8.1",
+            "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.8.1.tgz",
+            "integrity": "sha512-5/oVByPw4MbR/8QSdHCaalmyWC71H/QGgd4aduTJSaNi825o+v/hsN2/CH7Fq9atkLKsC8fvKD00Bj2VGaKriQ==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/color": {
-            "version": "3.0.0-beta.24",
-            "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.0.0-beta.24.tgz",
-            "integrity": "sha512-YSb/9ERmFp7JxC+vjhqpcYI8HUt92SSv6aDEB+e//4RzBnCxvy+YQAGei9tI6PYIgzGgMLwEMkgpgH/7UcFblA==",
+            "version": "3.0.0-beta.25",
+            "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.0.0-beta.25.tgz",
+            "integrity": "sha512-D24ASvLeSWouBwOBi4ftUe4/BhrZj5AiHV7tXwrVeMGOy9Z9jyeK65Xysq+R3ecaSONLXsgai5CQMvj13cOacA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0",
-                "@react-types/slider": "^3.7.2"
+                "@react-types/shared": "^3.23.1",
+                "@react-types/slider": "^3.7.3"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/combobox": {
-            "version": "3.11.0",
-            "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.11.0.tgz",
-            "integrity": "sha512-L6EEcIUIk7lsVvhO1Z1bklgH5bM84fBht03TC+es9YvS2T1Z9hdtyjBFcH6b3lVW9RwAArdUTL82/RNtvgD0Eg==",
+            "version": "3.11.1",
+            "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.11.1.tgz",
+            "integrity": "sha512-UNc3OHt5cUt5gCTHqhQIqhaWwKCpaNciD8R7eQazmHiA9fq8ROlV+7l3gdNgdhJbTf5Bu/V5ISnN7Y1xwL3zqQ==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/contextualhelp": {
-            "version": "3.2.9",
-            "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.2.9.tgz",
-            "integrity": "sha512-/YN8e1ujYSY99dnF2x/+vDErx/LcuXJmoKhvQL0wWrQAOIiGCP4j/ifVLWSt6sKhLdkPPbCNHxAd6Jq2SbC8ng==",
+            "version": "3.2.10",
+            "resolved": "https://registry.npmjs.org/@react-types/contextualhelp/-/contextualhelp-3.2.10.tgz",
+            "integrity": "sha512-x4rODNQfAO2YeVumkztTsUieOt4z7OXolZY7BLJgT1qonfPwJGLqf+KUayqXuX9l2CHakcGYDGaUxTUvwINQdw==",
             "dependencies": {
-                "@react-types/overlays": "^3.8.6",
-                "@react-types/shared": "^3.23.0"
+                "@react-types/overlays": "^3.8.7",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/datepicker": {
-            "version": "3.7.3",
-            "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.3.tgz",
-            "integrity": "sha512-SpA91itY03QaBvTAGP4X62SEAOoKJr91Av/U5DgH8gP7Ev4Ui+I3Aqh+w8Qw6nxKX4aAvDUx6wEHwLQLbvJUPA==",
+            "version": "3.7.4",
+            "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.4.tgz",
+            "integrity": "sha512-ZfvgscvNzBJpYyVWg3nstJtA/VlWLwErwSkd1ivZYam859N30w8yH+4qoYLa6FzWLCFlrsRHyvtxlEM7lUAt5A==",
             "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@react-types/calendar": "^3.4.5",
-                "@react-types/overlays": "^3.8.6",
-                "@react-types/shared": "^3.23.0"
+                "@internationalized/date": "^3.5.4",
+                "@react-types/calendar": "^3.4.6",
+                "@react-types/overlays": "^3.8.7",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/dialog": {
-            "version": "3.5.9",
-            "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.9.tgz",
-            "integrity": "sha512-8r9P1b1gq/cUv2bTPPNL3IFVEj9R5sIPACoSXznXkpXxh5FLU6yUPHDeQjvmM50q7KlEOgrPYhGl5pW525kLww==",
+            "version": "3.5.10",
+            "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.10.tgz",
+            "integrity": "sha512-S9ga+edOLNLZw7/zVOnZdT5T40etpzUYBXEKdFPbxyPYnERvRxJAsC1/ASuBU9fQAXMRgLZzADWV+wJoGS/X9g==",
             "dependencies": {
-                "@react-types/overlays": "^3.8.6",
-                "@react-types/shared": "^3.23.0"
+                "@react-types/overlays": "^3.8.7",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/divider": {
-            "version": "3.3.8",
-            "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.3.8.tgz",
-            "integrity": "sha512-klWNt9vaSwNnIZo0D44Flk4oGWsHXdgpUwdCU94VPeJEm9DY20areIOuSPQXRcEazinEPGo+C+d6Ytxzy2pyfA==",
+            "version": "3.3.9",
+            "resolved": "https://registry.npmjs.org/@react-types/divider/-/divider-3.3.9.tgz",
+            "integrity": "sha512-SQ3XWS16j3VZg3MGByJ1CjWDfARn+viBDay6SibAFzMqlqVbSol2nw1hQ1JPaT3zeW8C/354q+OhBsIFDOaE7w==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/form": {
-            "version": "3.7.3",
-            "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.7.3.tgz",
-            "integrity": "sha512-RwVxgbuKuByIXTF9HnvIhc/KijzT10R8rnI2Hr/51nTH+QDkunmLtmzW279m4YJRT3Dlj94DRy/7SS/WNCT2FA==",
+            "version": "3.7.4",
+            "resolved": "https://registry.npmjs.org/@react-types/form/-/form-3.7.4.tgz",
+            "integrity": "sha512-HZojAWrb6feYnhDEOy3vBamDVAHDl0l2JQZ7aIDLHmeTAGQC3JNZcm2fLTxqLye46zz8w8l8OHgI+NdD4PHdOw==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/grid": {
-            "version": "3.2.5",
-            "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.5.tgz",
-            "integrity": "sha512-kvE3Y+i0/RGLrf8qn/uVK1nVxXygNf5Jm6h9S6UdZkEVsclcqHKIX8UzqQgEUTd99jMHZk7fbKPm/La8uJ9yFQ==",
+            "version": "3.2.6",
+            "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.6.tgz",
+            "integrity": "sha512-XfHenL2jEBUYrhKiPdeM24mbLRXUn79wVzzMhrNYh24nBwhsPPpxF+gjFddT3Cy8dt6tRInfT6pMEu9nsXwaHw==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/illustratedmessage": {
-            "version": "3.3.8",
-            "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.3.8.tgz",
-            "integrity": "sha512-AIQdkfMYPvhUp2rko5E/UXaKz+9cfsZAHpk0ff+7x3mYWxUTCDXk8LVN/f8avZVzfa4w1UyOtzzNo/BssdLpuA==",
+            "version": "3.3.9",
+            "resolved": "https://registry.npmjs.org/@react-types/illustratedmessage/-/illustratedmessage-3.3.9.tgz",
+            "integrity": "sha512-a/X+sGzUA+pkLkKDZzy/QpUtOY6qtFpsPs6lfY37TLwCEQmS8a1VKrc1ItlQVRgIvwuqJXKvrJpGOAw+RjVwHw==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/image": {
-            "version": "3.4.0",
-            "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.4.0.tgz",
-            "integrity": "sha512-0zwHdfnbW5DjBaQ7s+SAiLJr0vPm+rzGEJUb+iXbgarPYYIHQpaJ/bPgvUU8BY1T95SQczB+AYownDJ+XESdsg==",
+            "version": "3.4.1",
+            "resolved": "https://registry.npmjs.org/@react-types/image/-/image-3.4.1.tgz",
+            "integrity": "sha512-6vA3vEzjXrr701i1J43DkyPziRN7jfKSdarGDP+61dOcvbiLnuTY9t+r/zXo1SdewbjF5RVliB2ys9Bb654YTg==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/label": {
-            "version": "3.9.2",
-            "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.9.2.tgz",
-            "integrity": "sha512-N7Sj4M9LHcMOTrq7DW4KcVl2DgcBIADTY6Ni50g5tN6o+TjVj3KDkX3ivsCNUHu/AJnJ8q7E+J74R4pDnQOAoQ==",
+            "version": "3.9.3",
+            "resolved": "https://registry.npmjs.org/@react-types/label/-/label-3.9.3.tgz",
+            "integrity": "sha512-PGVg/pBYNx3Ft59VNCvG5oqk4pXfS2Gs7t3TGnlBB1d+EXB9BbixJbOAO1PvRqt8SPCNvEAAAVfG6Vf+nOhSWw==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/layout": {
-            "version": "3.3.14",
-            "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.14.tgz",
-            "integrity": "sha512-PUxGdXXvRt8dQ5MOnxh8UkZjO3c89eWceLv4gtBizZKv+LRYfHof/eYH+9FtQkxGziWUJ6G7bzFt93Q9ydqH5Q==",
+            "version": "3.3.15",
+            "resolved": "https://registry.npmjs.org/@react-types/layout/-/layout-3.3.15.tgz",
+            "integrity": "sha512-Rj3M0TWmsag83gvFDY6UnfUkNPrA/FLuJ0kEiOryjjffoI0wTxmTAPpIgG4h7YSxpQJD6g6xQ8bkIWEMCXWyag==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/link": {
-            "version": "3.5.4",
-            "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.4.tgz",
-            "integrity": "sha512-5hVAlKE4wiEVHmkqQG9/G4sdar257CISmLzWh9xf8heq14a93MBIHm7S9mhHULk2a84EC9bNoTi8Hh6P6nnMEw==",
+            "version": "3.5.5",
+            "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.5.tgz",
+            "integrity": "sha512-G6P5WagHDR87npN7sEuC5IIgL1GsoY4WFWKO4734i2CXRYx24G9P0Su3AX4GA3qpspz8sK1AWkaCzBMmvnunfw==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/listbox": {
-            "version": "3.4.8",
-            "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.8.tgz",
-            "integrity": "sha512-HNLBvyhR02p8GaZsW8hAu4YwkDjaG/rcuCT/l4Sdxzsm7szPlFMEVBZ9Ji3Ffzj+9P20OgFJ+VylWs7EkUwJAA==",
+            "version": "3.4.9",
+            "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.9.tgz",
+            "integrity": "sha512-S5G+WmNKUIOPZxZ4svWwWQupP3C6LmVfnf8QQmPDvwYXGzVc0WovkqUWyhhjJirFDswTXRCO9p0yaTHHIlkdwQ==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/menu": {
-            "version": "3.9.8",
-            "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.8.tgz",
-            "integrity": "sha512-nkRCsfD3NXsJOv6mAnXCFyH2eGOFsmOOJOBQeOl9dj7BcdX9dcqp2PzUWPl33GrY9rYcXiRx4wsbUoqO1KVU4g==",
+            "version": "3.9.9",
+            "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.9.tgz",
+            "integrity": "sha512-FamUaPVs1Fxr4KOMI0YcR2rYZHoN7ypGtgiEiJ11v/tEPjPPGgeKDxii0McCrdOkjheatLN1yd2jmMwYj6hTDg==",
             "dependencies": {
-                "@react-types/overlays": "^3.8.6",
-                "@react-types/shared": "^3.23.0"
+                "@react-types/overlays": "^3.8.7",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/meter": {
-            "version": "3.4.0",
-            "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.4.0.tgz",
-            "integrity": "sha512-1czayiwMcg3QxRxQQSm9hvPbzPk1lyNmP68mDsWdVuY7fUTsUvItF05IkeJCkEB8tIqfBKnJHYAJN1XLY+5bfg==",
+            "version": "3.4.1",
+            "resolved": "https://registry.npmjs.org/@react-types/meter/-/meter-3.4.1.tgz",
+            "integrity": "sha512-AIJV4NDFAqKH94s02c5Da4TH2qgJjfrw978zuFM0KUBFD85WRPKh7MvgWpomvUgmzqE6lMCzIdi1KPKqrRabdw==",
             "dependencies": {
-                "@react-types/progress": "^3.5.3"
+                "@react-types/progress": "^3.5.4"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/numberfield": {
-            "version": "3.8.2",
-            "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.2.tgz",
-            "integrity": "sha512-2i7Je7fEYA4ousL9WhKZg+6Hejwgiq1AmoJpan6JfeIMQkvQ92q+klq02cih/lLXY/jvjd/KI3fa1fl3dfnaFw==",
+            "version": "3.8.3",
+            "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.3.tgz",
+            "integrity": "sha512-z5fGfVj3oh5bmkw9zDvClA1nDBSFL9affOuyk2qZ/M2SRUmykDAPCksbfcMndft0XULWKbF4s2CYbVI+E/yrUA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/overlays": {
-            "version": "3.8.6",
-            "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.6.tgz",
-            "integrity": "sha512-7xBuroYqwADppt7IRGfM8lbxVwlZrhMtTzeIdUot595cqFdRlpd/XAo2sRnEeIjYW9OSI8I5v4kt3AG7bdCQlg==",
+            "version": "3.8.7",
+            "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.7.tgz",
+            "integrity": "sha512-zCOYvI4at2DkhVpviIClJ7bRrLXYhSg3Z3v9xymuPH3mkiuuP/dm8mUCtkyY4UhVeUTHmrQh1bzaOP00A+SSQA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/progress": {
-            "version": "3.5.3",
-            "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.3.tgz",
-            "integrity": "sha512-IcICNYRPFHQxl6iXi5jDgSZ3I9k2UQ2rIFcnoGo43K0hekv6fRdbbXWJU9ndShs3OfCHTPHEV5ooYB3UujNOAQ==",
+            "version": "3.5.4",
+            "resolved": "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.4.tgz",
+            "integrity": "sha512-JNc246sTjasPyx5Dp7/s0rp3Bz4qlu4LrZTulZlxWyb53WgBNL7axc26CCi+I20rWL9+c7JjhrRxnLl/1cLN5g==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/provider": {
-            "version": "3.8.0",
-            "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.8.0.tgz",
-            "integrity": "sha512-7iexxkfJtYBvpiv+fpuh7s62uQ5nzFbVNvgOHU1sBgXiyVGoA6QfTsybf6uQJ/S7yUgqoO5CrVqHKFa4MUxYIg==",
+            "version": "3.8.1",
+            "resolved": "https://registry.npmjs.org/@react-types/provider/-/provider-3.8.1.tgz",
+            "integrity": "sha512-Sm59ufxdHh6fGfeUbviNQhRvtI0FMEX1gn9Okc8nL7iTVbAAitT746x0itM+xwhFLDI6gSY8FILDWc5/kIxzxA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/radio": {
-            "version": "3.8.0",
-            "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.0.tgz",
-            "integrity": "sha512-0gvG74lgiaRo0DO46hoB5NxGFXhq5DsHaPZcCcb9VZ8cCzZMrO7U/B3JhF82TI2DndSx/AoiAMOQsc0v4ZwiGg==",
+            "version": "3.8.1",
+            "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.1.tgz",
+            "integrity": "sha512-bK0gio/qj1+0Ldu/3k/s9BaOZvnnRgvFtL3u5ky479+aLG5qf1CmYed3SKz8ErZ70JkpuCSrSwSCFf0t1IHovw==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/searchfield": {
-            "version": "3.5.4",
-            "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.4.tgz",
-            "integrity": "sha512-D7tUwlbUxyTzxhMYWNMdY9lp/a/kdr9mIGB7K3j/QSQhTI2T9H3VPxEKXmYt33cE3T7Q1DDsII1SrChI/KEdxA==",
+            "version": "3.5.5",
+            "resolved": "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.5.tgz",
+            "integrity": "sha512-T/NHg12+w23TxlXMdetogLDUldk1z5dDavzbnjKrLkajLb221bp8brlR/+O6C1CtFpuJGALqYHgTasU1qkQFSA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0",
-                "@react-types/textfield": "^3.9.2"
+                "@react-types/shared": "^3.23.1",
+                "@react-types/textfield": "^3.9.3"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/select": {
-            "version": "3.9.3",
-            "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.3.tgz",
-            "integrity": "sha512-hK5RvA6frMbLdynRkegNW1lMOD0l9aFsW9X8WuTAg0zV6iZouU0hhSCT6JRDefJrv+m0X3fRdohMuVNZOhlA1g==",
+            "version": "3.9.4",
+            "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.4.tgz",
+            "integrity": "sha512-xI7dnOW2st91fPPcv6hdtrTdcfetYiqZuuVPZ5TRobY7Q10/Zqqe/KqtOw1zFKUj9xqNJe4Ov3xP5GSdcO60Eg==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/shared": {
-            "version": "3.23.0",
-            "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.23.0.tgz",
-            "integrity": "sha512-GQm/iPiii3ikcaMNR4WdVkJ4w0mKtV3mLqeSfSqzdqbPr6vONkqXbh3RhPlPmAJs1b4QHnexd/wZQP3U9DHOwQ==",
+            "version": "3.23.1",
+            "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.23.1.tgz",
+            "integrity": "sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==",
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/slider": {
-            "version": "3.7.2",
-            "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.2.tgz",
-            "integrity": "sha512-HvC/Mdt/z741xcU0ymeNxslnowQ5EAHOSzyf2JMgXmle+pEIbbepz5QUVaOmEveQHS3bjxE/+n2yBTKbxP8CJg==",
+            "version": "3.7.3",
+            "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.3.tgz",
+            "integrity": "sha512-F8qFQaD2mqug2D0XeWMmjGBikiwbdERFlhFzdvNGbypPLz3AZICBKp1ZLPWdl0DMuy03G/jy6Gl4mDobl7RT2g==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/statuslight": {
-            "version": "3.3.8",
-            "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.3.8.tgz",
-            "integrity": "sha512-6ByVj2LJBctiXU5UeEgoKoIhDkOkJu5pb2GYJR8Rd5hxj5keYTdfmY5d4zYlEA4hR2itm+8//3f9NgYdZqlFhw==",
+            "version": "3.3.9",
+            "resolved": "https://registry.npmjs.org/@react-types/statuslight/-/statuslight-3.3.9.tgz",
+            "integrity": "sha512-6nC17gluvrMCJkb0mihzqAaz8wn0ghfgk1ILkL8CUobsqJU6pW4eGJXNoZCd5wHT/YjwnupzfhHcbMj93AHzWQ==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/switch": {
-            "version": "3.5.2",
-            "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.2.tgz",
-            "integrity": "sha512-4i35eZ5GtVDgu9KFhlyLyXanspcQp5WEnPyaBKn3pDRDcpzAL7yNP/Rwqc/JDdcJWngV080o7loJCgEfJ6UFaQ==",
+            "version": "3.5.3",
+            "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.3.tgz",
+            "integrity": "sha512-Nb6+J5MrPaFa8ZNFKGMzAsen/NNzl5UG/BbC65SLGPy7O0VDa/sUpn7dcu8V2xRpRwwIN/Oso4v63bt2sgdkgA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/table": {
-            "version": "3.9.4",
-            "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.9.4.tgz",
-            "integrity": "sha512-31EI0KAHwX7TbgERLBLVuD3nvpZUo0Wie7S7FEARmirIRfzm1fIkdDk5hfIHry2Lp4mq2/aqXLCY+oDR+lC2pw==",
+            "version": "3.9.5",
+            "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.9.5.tgz",
+            "integrity": "sha512-fgM2j9F/UR4Anmd28CueghCgBwOZoCVyN8fjaIFPd2MN4gCwUUfANwxLav65gZk4BpwUXGoQdsW+X50L3555mg==",
             "dependencies": {
-                "@react-types/grid": "^3.2.5",
-                "@react-types/shared": "^3.23.0"
+                "@react-types/grid": "^3.2.6",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/tabs": {
-            "version": "3.3.6",
-            "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.6.tgz",
-            "integrity": "sha512-ubvB7pB4+e5OpIuYR1CYip53iW9rJRIWvioHTYfcX0DnMabEcVP6Ymdqr5bDh/VsBEhiddsNgMduQwJm6bUTew==",
+            "version": "3.3.7",
+            "resolved": "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.7.tgz",
+            "integrity": "sha512-ZdLe5xOcFX6+/ni45Dl2jO0jFATpTnoSqj6kLIS/BYv8oh0n817OjJkLf+DS3CLfNjApJWrHqAk34xNh6nRnEg==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/text": {
-            "version": "3.3.8",
-            "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.3.8.tgz",
-            "integrity": "sha512-EXTXNdZWg8ggeaOV6isEmNxTzyb1/94BSyUQOSDbazl9OJRnMrC3LAmKDn/ck/LLI2rLpYJ+XfM84zI5ohVzKw==",
+            "version": "3.3.9",
+            "resolved": "https://registry.npmjs.org/@react-types/text/-/text-3.3.9.tgz",
+            "integrity": "sha512-JJTmUstFXikZHQhf+0VELODGz1jUcSgXOTYJxTMiMtSjLOSCW5G+pRhT80MRgxOeuD0Z7p0XghUXo3ruD694HA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/textfield": {
-            "version": "3.9.2",
-            "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.2.tgz",
-            "integrity": "sha512-8UcabahYhKm3KTu9CQBhz745FioUWO6CWgYusBpxMDJ+HnlhCC2JWyQvqg5tT98sr5AeSek4Jt/XS3ovzrhCDg==",
+            "version": "3.9.3",
+            "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.3.tgz",
+            "integrity": "sha512-DoAY6cYOL0pJhgNGI1Rosni7g72GAt4OVr2ltEx2S9ARmFZ0DBvdhA9lL2nywcnKMf27PEJcKMXzXc10qaHsJw==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/tooltip": {
-            "version": "3.4.8",
-            "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.8.tgz",
-            "integrity": "sha512-6XVQ3cMaXVMif+F5PQCaVwxbgAL8HVRqVjt6DkHs8Xbae43hpEIwPrBYlWWMVpuZAcjXZLTGmmyPjYeORZZJ4A==",
+            "version": "3.4.9",
+            "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.9.tgz",
+            "integrity": "sha512-wZ+uF1+Zc43qG+cOJzioBmLUNjRa7ApdcT0LI1VvaYvH5GdfjzUJOorLX9V/vAci0XMJ50UZ+qsh79aUlw2yqg==",
             "dependencies": {
-                "@react-types/overlays": "^3.8.6",
-                "@react-types/shared": "^3.23.0"
+                "@react-types/overlays": "^3.8.7",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/view": {
-            "version": "3.4.8",
-            "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.4.8.tgz",
-            "integrity": "sha512-MlaSm/lDuR8Q60RNWAi7Ygg9T7gPOgZJH/zgs6i7Z8kYZHjGEmU2zpHZLoTIMkyLAdbjNvv2Te4Od0MWNKWdYA==",
+            "version": "3.4.9",
+            "resolved": "https://registry.npmjs.org/@react-types/view/-/view-3.4.9.tgz",
+            "integrity": "sha512-HY969whOXKg10ZqIrXOF12wm3rDwNaKaK9fzqhhrUc94+JR4OPKQctps+HeonAXscxy2yMy8V1/2yjiEwluvAA==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
             }
         },
         "node_modules/@react-types/well": {
-            "version": "3.3.8",
-            "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.3.8.tgz",
-            "integrity": "sha512-0IDdmwrb9CMwTii/yJm45ctBwdjCuvA8Gp36idhaM3tD+MuMapHjy48frHhZAFhjSeljDeJTdG1aaHMfnmMW9Q==",
+            "version": "3.3.9",
+            "resolved": "https://registry.npmjs.org/@react-types/well/-/well-3.3.9.tgz",
+            "integrity": "sha512-3ZlxjkWXupxx0PaxpDc4Pqxxgnzp8iJkilbJ3LY5F+RJwqDm0gkKnWcFjlVJw9LkM7Emjrvm1R8naSGzJ7wJ2A==",
             "dependencies": {
-                "@react-types/shared": "^3.23.0"
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
@@ -7048,6 +7569,74 @@
                 "url": "https://ko-fi.com/killymxi"
             }
         },
+        "node_modules/@sigstore/bundle": {
+            "version": "2.3.2",
+            "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz",
+            "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==",
+            "dependencies": {
+                "@sigstore/protobuf-specs": "^0.3.2"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@sigstore/core": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz",
+            "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==",
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@sigstore/protobuf-specs": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz",
+            "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==",
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@sigstore/sign": {
+            "version": "2.3.2",
+            "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz",
+            "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==",
+            "dependencies": {
+                "@sigstore/bundle": "^2.3.2",
+                "@sigstore/core": "^1.0.0",
+                "@sigstore/protobuf-specs": "^0.3.2",
+                "make-fetch-happen": "^13.0.1",
+                "proc-log": "^4.2.0",
+                "promise-retry": "^2.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@sigstore/tuf": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.3.tgz",
+            "integrity": "sha512-agQhHNkIddXFslkudjV88vTXiAMEyUtso3at6ZHUNJ1agZb7Ze6VW/PddHipdWBu1t+8OWLW5X5yZOPiOnaWJQ==",
+            "dependencies": {
+                "@sigstore/protobuf-specs": "^0.3.0",
+                "tuf-js": "^2.2.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@sigstore/verify": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz",
+            "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==",
+            "dependencies": {
+                "@sigstore/bundle": "^2.3.2",
+                "@sigstore/core": "^1.1.0",
+                "@sigstore/protobuf-specs": "^0.3.2"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
         "node_modules/@sinclair/typebox": {
             "version": "0.27.8",
             "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
@@ -7070,12 +7659,12 @@
             "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="
         },
         "node_modules/@spectrum-icons/ui": {
-            "version": "3.6.6",
-            "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.6.6.tgz",
-            "integrity": "sha512-LQnrjGm1xUeeBJFv0Bxa4ZvqU9dtvyA5KMUHGQUXEgNXoBw4f9eE9kj9apZt6KdVuru1R7+iqNOFTUPlQHIybw==",
+            "version": "3.6.7",
+            "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.6.7.tgz",
+            "integrity": "sha512-l08Juk6w8UUpM+xXNVq9LBJ0pxMC1tynXBurTZ135twdtMwofrZmtSHUYdzaRJtm31S9E/+C1Toci1I8aw7Wlw==",
             "dependencies": {
                 "@adobe/react-spectrum-ui": "1.2.0",
-                "@react-spectrum/icon": "^3.7.12",
+                "@react-spectrum/icon": "^3.7.13",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -7084,12 +7673,12 @@
             }
         },
         "node_modules/@spectrum-icons/workflow": {
-            "version": "4.2.11",
-            "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.2.11.tgz",
-            "integrity": "sha512-ALKjJH1AGaUMNZOasnXw2A8SucB6w2wzCxp7j+ZUcX0Pg1PsAY+JFK+uR7hwr3iu4T1l0WkZsKxR/FTjhsPWLg==",
+            "version": "4.2.12",
+            "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.2.12.tgz",
+            "integrity": "sha512-xuyytdlM09DEZO7/vSp5z8Y2RYNXL4OOYSmOaWXeYgIa3iPNKz0HW+iVR2P+Ht0iBtKjPvRobbEFb0k280U4yQ==",
             "dependencies": {
                 "@adobe/react-spectrum-workflow": "2.3.4",
-                "@react-spectrum/icon": "^3.7.12",
+                "@react-spectrum/icon": "^3.7.13",
                 "@swc/helpers": "^0.5.0"
             },
             "peerDependencies": {
@@ -7145,6 +7734,26 @@
             "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
             "dev": true
         },
+        "node_modules/@tufjs/canonical-json": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz",
+            "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==",
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/@tufjs/models": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz",
+            "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==",
+            "dependencies": {
+                "@tufjs/canonical-json": "2.0.0",
+                "minimatch": "^9.0.4"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
         "node_modules/@turf/along": {
             "version": "6.5.0",
             "resolved": "https://registry.npmjs.org/@turf/along/-/along-6.5.0.tgz",
@@ -8791,7 +9400,6 @@
         },
         "node_modules/@types/chai": {
             "version": "4.3.16",
-            "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz",
             "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==",
             "dev": true
         },
@@ -8853,7 +9461,6 @@
         },
         "node_modules/@types/cookie-session": {
             "version": "2.0.49",
-            "resolved": "https://registry.npmjs.org/@types/cookie-session/-/cookie-session-2.0.49.tgz",
             "integrity": "sha512-4E/bBjlqLhU5l4iGPR+NkVJH593hpNsT4dC3DJDr+ODm6Qpe13kZQVkezRIb+TYDXaBMemS3yLQ+0leba3jlkQ==",
             "dev": true,
             "dependencies": {
@@ -9176,9 +9783,9 @@
             }
         },
         "node_modules/@types/express-serve-static-core": {
-            "version": "4.19.0",
-            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz",
-            "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==",
+            "version": "4.19.1",
+            "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.1.tgz",
+            "integrity": "sha512-ej0phymbFLoCB26dbbq5PGScsf2JAJ4IJHjG10LalgUV36XKTmA4GdA+PVllKvRk0sEKt64X8975qFnkSi0hqA==",
             "dev": true,
             "dependencies": {
                 "@types/node": "*",
@@ -9319,7 +9926,6 @@
         },
         "node_modules/@types/jquery": {
             "version": "3.5.30",
-            "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz",
             "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==",
             "dev": true,
             "dependencies": {
@@ -9359,9 +9965,8 @@
             "dev": true
         },
         "node_modules/@types/libxmljs": {
-            "version": "0.18.12",
-            "resolved": "https://registry.npmjs.org/@types/libxmljs/-/libxmljs-0.18.12.tgz",
-            "integrity": "sha512-X4jjDalP9dc8MK+rZA4utk0H0NgtiFrAmUeR+qHdNkkLWEqzTm25Y/M9CKPiVQM3d7sxcPYYRL/S6gaaDd3jcQ==",
+            "version": "0.18.13",
+            "integrity": "sha512-0hBHqUYsKdEe15ZKDF/iihdhCLpaYYJ8jhEZMQoivGMkYUfUOXlKStjzs1NyV8kOyFCWZtFcddmjR07dM9FYug==",
             "dev": true,
             "dependencies": {
                 "@types/node": "*"
@@ -9369,7 +9974,6 @@
         },
         "node_modules/@types/lodash": {
             "version": "4.17.4",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz",
             "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==",
             "dev": true
         },
@@ -9440,7 +10044,6 @@
         },
         "node_modules/@types/nodemailer": {
             "version": "6.4.15",
-            "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.15.tgz",
             "integrity": "sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==",
             "dev": true,
             "dependencies": {
@@ -9448,9 +10051,9 @@
             }
         },
         "node_modules/@types/oauth": {
-            "version": "0.9.4",
-            "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.4.tgz",
-            "integrity": "sha512-qk9orhti499fq5XxKCCEbd0OzdPZuancneyse3KtR+vgMiHRbh+mn8M4G6t64ob/Fg+GZGpa565MF/2dKWY32A==",
+            "version": "0.9.5",
+            "resolved": "https://registry.npmjs.org/@types/oauth/-/oauth-0.9.5.tgz",
+            "integrity": "sha512-+oQ3C2Zx6ambINOcdIARF5Z3Tu3x//HipE889/fqo3sgpQZbe9c6ExdQFtN6qlhpR7p83lTZfPJt0tCAW29dog==",
             "dev": true,
             "dependencies": {
                 "@types/node": "*"
@@ -9477,7 +10080,6 @@
         },
         "node_modules/@types/passport-google-oauth20": {
             "version": "2.0.16",
-            "resolved": "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.16.tgz",
             "integrity": "sha512-ayXK2CJ7uVieqhYOc6k/pIr5pcQxOLB6kBev+QUGS7oEZeTgIs1odDobXRqgfBPvXzl0wXCQHftV5220czZCPA==",
             "dev": true,
             "dependencies": {
@@ -9550,9 +10152,9 @@
             }
         },
         "node_modules/@types/react": {
-            "version": "18.3.2",
-            "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz",
-            "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==",
+            "version": "18.3.3",
+            "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
+            "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
             "dependencies": {
                 "@types/prop-types": "*",
                 "csstype": "^3.0.2"
@@ -9590,7 +10192,6 @@
         },
         "node_modules/@types/react-dom": {
             "version": "18.3.0",
-            "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
             "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
             "dev": true,
             "dependencies": {
@@ -9624,6 +10225,15 @@
                 "@types/react": "*"
             }
         },
+        "node_modules/@types/react-speech-recognition": {
+            "version": "3.9.5",
+            "resolved": "https://registry.npmjs.org/@types/react-speech-recognition/-/react-speech-recognition-3.9.5.tgz",
+            "integrity": "sha512-m3Sg3Xtj/YcEUu+nLPGwI6oq1wcSblsuyAmXgBfW6Nprfmtl+A+kH4ruPzzFKnFkq6WmmRxdsLvt0nLRAAJtBw==",
+            "dev": true,
+            "dependencies": {
+                "@types/dom-speech-recognition": "*"
+            }
+        },
         "node_modules/@types/react-transition-group": {
             "version": "4.4.10",
             "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
@@ -9697,12 +10307,6 @@
             "resolved": "https://registry.npmjs.org/@types/reveal/-/reveal-4.2.0.tgz",
             "integrity": "sha512-lhTCUrk8pU/9SWcqbLwCy/AFjCp9S2hcDGoKAIycWGcHujUrDKMXWVkOvbSWk/gohZwwfuxQxucBaqvYAM5DTQ=="
         },
-        "node_modules/@types/scheduler": {
-            "version": "0.16.8",
-            "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
-            "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
-            "optional": true
-        },
         "node_modules/@types/send": {
             "version": "0.17.4",
             "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
@@ -9815,7 +10419,6 @@
         },
         "node_modules/@types/web": {
             "version": "0.0.143",
-            "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.143.tgz",
             "integrity": "sha512-TazK16/OqeeqfQRB/Tv/NwzJagHbLi/w5g26FLbiFte/8LpPq6BuTyXHO/cpgwJpE6KGgFSNYb6Ap05Tz9XvCA=="
         },
         "node_modules/@types/webidl-conversions": {
@@ -9881,16 +10484,16 @@
             "dev": true
         },
         "node_modules/@typescript-eslint/eslint-plugin": {
-            "version": "7.9.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz",
-            "integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==",
+            "version": "7.10.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz",
+            "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==",
             "dev": true,
             "dependencies": {
                 "@eslint-community/regexpp": "^4.10.0",
-                "@typescript-eslint/scope-manager": "7.9.0",
-                "@typescript-eslint/type-utils": "7.9.0",
-                "@typescript-eslint/utils": "7.9.0",
-                "@typescript-eslint/visitor-keys": "7.9.0",
+                "@typescript-eslint/scope-manager": "7.10.0",
+                "@typescript-eslint/type-utils": "7.10.0",
+                "@typescript-eslint/utils": "7.10.0",
+                "@typescript-eslint/visitor-keys": "7.10.0",
                 "graphemer": "^1.4.0",
                 "ignore": "^5.3.1",
                 "natural-compare": "^1.4.0",
@@ -9914,14 +10517,13 @@
             }
         },
         "node_modules/@typescript-eslint/parser": {
-            "version": "7.9.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.9.0.tgz",
-            "integrity": "sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==",
+            "version": "7.13.1",
+            "integrity": "sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==",
             "dependencies": {
-                "@typescript-eslint/scope-manager": "7.9.0",
-                "@typescript-eslint/types": "7.9.0",
-                "@typescript-eslint/typescript-estree": "7.9.0",
-                "@typescript-eslint/visitor-keys": "7.9.0",
+                "@typescript-eslint/scope-manager": "7.13.1",
+                "@typescript-eslint/types": "7.13.1",
+                "@typescript-eslint/typescript-estree": "7.13.1",
+                "@typescript-eslint/visitor-keys": "7.13.1",
                 "debug": "^4.3.4"
             },
             "engines": {
@@ -9940,13 +10542,96 @@
                 }
             }
         },
+        "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
+            "version": "7.13.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz",
+            "integrity": "sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==",
+            "dependencies": {
+                "@typescript-eslint/types": "7.13.1",
+                "@typescript-eslint/visitor-keys": "7.13.1"
+            },
+            "engines": {
+                "node": "^18.18.0 || >=20.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            }
+        },
+        "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
+            "version": "7.13.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.1.tgz",
+            "integrity": "sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==",
+            "engines": {
+                "node": "^18.18.0 || >=20.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            }
+        },
+        "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
+            "version": "7.13.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz",
+            "integrity": "sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==",
+            "dependencies": {
+                "@typescript-eslint/types": "7.13.1",
+                "@typescript-eslint/visitor-keys": "7.13.1",
+                "debug": "^4.3.4",
+                "globby": "^11.1.0",
+                "is-glob": "^4.0.3",
+                "minimatch": "^9.0.4",
+                "semver": "^7.6.0",
+                "ts-api-utils": "^1.3.0"
+            },
+            "engines": {
+                "node": "^18.18.0 || >=20.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
+            "version": "7.13.1",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz",
+            "integrity": "sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==",
+            "dependencies": {
+                "@typescript-eslint/types": "7.13.1",
+                "eslint-visitor-keys": "^3.4.3"
+            },
+            "engines": {
+                "node": "^18.18.0 || >=20.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            }
+        },
+        "node_modules/@typescript-eslint/parser/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/@typescript-eslint/scope-manager": {
-            "version": "7.9.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz",
-            "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==",
+            "version": "7.10.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz",
+            "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==",
+            "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "7.9.0",
-                "@typescript-eslint/visitor-keys": "7.9.0"
+                "@typescript-eslint/types": "7.10.0",
+                "@typescript-eslint/visitor-keys": "7.10.0"
             },
             "engines": {
                 "node": "^18.18.0 || >=20.0.0"
@@ -9957,13 +10642,13 @@
             }
         },
         "node_modules/@typescript-eslint/type-utils": {
-            "version": "7.9.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz",
-            "integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==",
+            "version": "7.10.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz",
+            "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/typescript-estree": "7.9.0",
-                "@typescript-eslint/utils": "7.9.0",
+                "@typescript-eslint/typescript-estree": "7.10.0",
+                "@typescript-eslint/utils": "7.10.0",
                 "debug": "^4.3.4",
                 "ts-api-utils": "^1.3.0"
             },
@@ -9984,9 +10669,10 @@
             }
         },
         "node_modules/@typescript-eslint/types": {
-            "version": "7.9.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz",
-            "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==",
+            "version": "7.10.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz",
+            "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==",
+            "dev": true,
             "engines": {
                 "node": "^18.18.0 || >=20.0.0"
             },
@@ -9996,12 +10682,13 @@
             }
         },
         "node_modules/@typescript-eslint/typescript-estree": {
-            "version": "7.9.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz",
-            "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==",
+            "version": "7.10.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz",
+            "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==",
+            "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "7.9.0",
-                "@typescript-eslint/visitor-keys": "7.9.0",
+                "@typescript-eslint/types": "7.10.0",
+                "@typescript-eslint/visitor-keys": "7.10.0",
                 "debug": "^4.3.4",
                 "globby": "^11.1.0",
                 "is-glob": "^4.0.3",
@@ -10026,6 +10713,7 @@
             "version": "7.6.2",
             "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
             "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "dev": true,
             "bin": {
                 "semver": "bin/semver.js"
             },
@@ -10034,15 +10722,15 @@
             }
         },
         "node_modules/@typescript-eslint/utils": {
-            "version": "7.9.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz",
-            "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==",
+            "version": "7.10.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz",
+            "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==",
             "dev": true,
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.4.0",
-                "@typescript-eslint/scope-manager": "7.9.0",
-                "@typescript-eslint/types": "7.9.0",
-                "@typescript-eslint/typescript-estree": "7.9.0"
+                "@typescript-eslint/scope-manager": "7.10.0",
+                "@typescript-eslint/types": "7.10.0",
+                "@typescript-eslint/typescript-estree": "7.10.0"
             },
             "engines": {
                 "node": "^18.18.0 || >=20.0.0"
@@ -10056,11 +10744,12 @@
             }
         },
         "node_modules/@typescript-eslint/visitor-keys": {
-            "version": "7.9.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz",
-            "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==",
+            "version": "7.10.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz",
+            "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==",
+            "dev": true,
             "dependencies": {
-                "@typescript-eslint/types": "7.9.0",
+                "@typescript-eslint/types": "7.10.0",
                 "eslint-visitor-keys": "^3.4.3"
             },
             "engines": {
@@ -10394,7 +11083,6 @@
         },
         "node_modules/adm-zip": {
             "version": "0.5.12",
-            "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz",
             "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==",
             "engines": {
                 "node": ">=6.0"
@@ -10422,6 +11110,18 @@
                 "node": ">= 8.0.0"
             }
         },
+        "node_modules/aggregate-error": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+            "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+            "dependencies": {
+                "clean-stack": "^2.0.0",
+                "indent-string": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/ajv": {
             "version": "6.12.6",
             "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -10454,9 +11154,9 @@
             }
         },
         "node_modules/ajv-formats/node_modules/ajv": {
-            "version": "8.13.0",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz",
-            "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==",
+            "version": "8.16.0",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
+            "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
             "dependencies": {
                 "fast-deep-equal": "^3.1.3",
                 "json-schema-traverse": "^1.0.0",
@@ -10622,10 +11322,16 @@
                 "node": ">= 14"
             }
         },
+        "node_modules/archy": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+            "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw=="
+        },
         "node_modules/are-we-there-yet": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
             "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+            "deprecated": "This package is no longer supported.",
             "dependencies": {
                 "delegates": "^1.0.0",
                 "readable-stream": "^3.6.0"
@@ -10647,6 +11353,14 @@
                 "node": ">= 6"
             }
         },
+        "node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "dependencies": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
         "node_modules/arg": {
             "version": "4.1.3",
             "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -10979,9 +11693,9 @@
             }
         },
         "node_modules/aws4": {
-            "version": "1.12.0",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
-            "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
+            "version": "1.13.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz",
+            "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g=="
         },
         "node_modules/axe-core": {
             "version": "4.7.0",
@@ -10993,9 +11707,8 @@
             }
         },
         "node_modules/axios": {
-            "version": "1.7.1",
-            "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz",
-            "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==",
+            "version": "1.7.2",
+            "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==",
             "dependencies": {
                 "follow-redirects": "^1.15.6",
                 "form-data": "^4.0.0",
@@ -11123,22 +11836,6 @@
                 "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
             }
         },
-        "node_modules/babel-plugin-styled-components": {
-            "version": "2.1.4",
-            "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz",
-            "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==",
-            "peer": true,
-            "dependencies": {
-                "@babel/helper-annotate-as-pure": "^7.22.5",
-                "@babel/helper-module-imports": "^7.22.5",
-                "@babel/plugin-syntax-jsx": "^7.22.5",
-                "lodash": "^4.17.21",
-                "picomatch": "^2.3.1"
-            },
-            "peerDependencies": {
-                "styled-components": ">= 2"
-            }
-        },
         "node_modules/babel-runtime": {
             "version": "6.26.0",
             "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
@@ -11186,9 +11883,9 @@
             "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
         },
         "node_modules/bare-events": {
-            "version": "2.2.2",
-            "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz",
-            "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==",
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz",
+            "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==",
             "optional": true
         },
         "node_modules/Base64": {
@@ -11196,6 +11893,14 @@
             "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz",
             "integrity": "sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw=="
         },
+        "node_modules/base64-arraybuffer": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+            "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
+            "engines": {
+                "node": ">= 0.6.0"
+            }
+        },
         "node_modules/base64-js": {
             "version": "1.5.1",
             "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -11258,7 +11963,6 @@
         },
         "node_modules/better-react-mathjax": {
             "version": "2.0.3",
-            "resolved": "https://registry.npmjs.org/better-react-mathjax/-/better-react-mathjax-2.0.3.tgz",
             "integrity": "sha512-wfifT8GFOKb1TWm2+E50I6DJpLZ5kLbch283Lu043EJtwSv0XvZDjr4YfR4d2MjAhqP6SH4VjjrKgbX8R00oCQ==",
             "dependencies": {
                 "mathjax-full": "^3.2.2"
@@ -11297,6 +12001,20 @@
                 "node": "*"
             }
         },
+        "node_modules/bin-links": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz",
+            "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==",
+            "dependencies": {
+                "cmd-shim": "^6.0.0",
+                "npm-normalize-package-bin": "^3.0.0",
+                "read-cmd-shim": "^4.0.0",
+                "write-file-atomic": "^5.0.0"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/binary-extensions": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -11409,11 +12127,11 @@
             }
         },
         "node_modules/braces": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+            "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
             "dependencies": {
-                "fill-range": "^7.0.1"
+                "fill-range": "^7.1.1"
             },
             "engines": {
                 "node": ">=8"
@@ -11429,7 +12147,6 @@
         },
         "node_modules/browndash-components": {
             "version": "0.1.44",
-            "resolved": "https://registry.npmjs.org/browndash-components/-/browndash-components-0.1.44.tgz",
             "integrity": "sha512-+QYEHDqd3iauijdKiVA0jXGFkOMEKn+qb7Y2iG+VK0xAh8Fho3rAUoSMv6snfg+kMc1oMGhACzJa5XauTtvguQ==",
             "dependencies": {
                 "@emotion/react": "^11.11.1",
@@ -11443,38 +12160,6 @@
                 "react-measure": "^2.5.2"
             }
         },
-        "node_modules/browndash-components/node_modules/@emotion/unitless": {
-            "version": "0.7.5",
-            "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
-            "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==",
-            "peer": true
-        },
-        "node_modules/browndash-components/node_modules/@mui/styled-engine-sc": {
-            "version": "5.14.12",
-            "resolved": "https://registry.npmjs.org/@mui/styled-engine-sc/-/styled-engine-sc-5.14.12.tgz",
-            "integrity": "sha512-FQ5KDd17OkRurE0ljR4Pddekv1uPSoJxcBqXa9tdoOETGULVCefM5Gd9CRGzT+alNPDyHBoUeEYKulIkDN9ytA==",
-            "dependencies": {
-                "@babel/runtime": "^7.23.1",
-                "csstype": "^3.1.2",
-                "prop-types": "^15.8.1"
-            },
-            "engines": {
-                "node": ">=12.0.0"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/mui"
-            },
-            "peerDependencies": {
-                "@types/styled-components": "^5.1.14",
-                "styled-components": "^5.3.1"
-            },
-            "peerDependenciesMeta": {
-                "@types/styled-components": {
-                    "optional": true
-                }
-            }
-        },
         "node_modules/browndash-components/node_modules/npm": {
             "version": "9.9.3",
             "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.3.tgz",
@@ -14504,36 +15189,6 @@
                 "react": "*"
             }
         },
-        "node_modules/browndash-components/node_modules/styled-components": {
-            "version": "5.3.11",
-            "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz",
-            "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==",
-            "peer": true,
-            "dependencies": {
-                "@babel/helper-module-imports": "^7.0.0",
-                "@babel/traverse": "^7.4.5",
-                "@emotion/is-prop-valid": "^1.1.0",
-                "@emotion/stylis": "^0.8.4",
-                "@emotion/unitless": "^0.7.4",
-                "babel-plugin-styled-components": ">= 1.12.0",
-                "css-to-react-native": "^3.0.0",
-                "hoist-non-react-statics": "^3.0.0",
-                "shallowequal": "^1.1.0",
-                "supports-color": "^5.5.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "type": "opencollective",
-                "url": "https://opencollective.com/styled-components"
-            },
-            "peerDependencies": {
-                "react": ">= 16.8.0",
-                "react-dom": ">= 16.8.0",
-                "react-is": ">= 16.8.0"
-            }
-        },
         "node_modules/browser-assert": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz",
@@ -14689,6 +15344,47 @@
                 "typewise-core": "^1.2"
             }
         },
+        "node_modules/cacache": {
+            "version": "18.0.3",
+            "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz",
+            "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==",
+            "dependencies": {
+                "@npmcli/fs": "^3.1.0",
+                "fs-minipass": "^3.0.0",
+                "glob": "^10.2.2",
+                "lru-cache": "^10.0.1",
+                "minipass": "^7.0.3",
+                "minipass-collect": "^2.0.1",
+                "minipass-flush": "^1.0.5",
+                "minipass-pipeline": "^1.2.4",
+                "p-map": "^4.0.0",
+                "ssri": "^10.0.0",
+                "tar": "^6.1.11",
+                "unique-filename": "^3.0.0"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/cacache/node_modules/fs-minipass": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+            "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+            "dependencies": {
+                "minipass": "^7.0.3"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/cacache/node_modules/lru-cache": {
+            "version": "10.2.2",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+            "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+            "engines": {
+                "node": "14 || >=16.14"
+            }
+        },
         "node_modules/cacheable-lookup": {
             "version": "7.0.0",
             "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
@@ -14803,9 +15499,9 @@
             }
         },
         "node_modules/caniuse-lite": {
-            "version": "1.0.30001620",
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz",
-            "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==",
+            "version": "1.0.30001621",
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz",
+            "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==",
             "funding": [
                 {
                     "type": "opencollective",
@@ -14851,7 +15547,6 @@
         },
         "node_modules/chai": {
             "version": "5.1.1",
-            "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz",
             "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==",
             "dev": true,
             "dependencies": {
@@ -14938,7 +15633,6 @@
         },
         "node_modules/chart.js": {
             "version": "4.4.3",
-            "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz",
             "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==",
             "dependencies": {
                 "@kurkle/color": "^0.3.0"
@@ -15030,6 +15724,17 @@
                 "node": ">=8"
             }
         },
+        "node_modules/cidr-regex": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-4.1.1.tgz",
+            "integrity": "sha512-ekKcVp+iRB9zlKFXyx7io7nINgb0oRjgRdXNEodp1OuxRui8FXr/CA40Tz1voWUp9DPPrMyQKy01vJhDo4N1lw==",
+            "dependencies": {
+                "ip-regex": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=14"
+            }
+        },
         "node_modules/class-transformer": {
             "version": "0.5.1",
             "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz",
@@ -15059,6 +15764,44 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/clean-stack": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+            "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/cli-columns": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-4.0.0.tgz",
+            "integrity": "sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==",
+            "dependencies": {
+                "string-width": "^4.2.3",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/cli-columns/node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "node_modules/cli-columns/node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/cli-cursor": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -15244,6 +15987,14 @@
                 "node": ">=6"
             }
         },
+        "node_modules/cmd-shim": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz",
+            "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/color": {
             "version": "4.2.3",
             "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -15357,6 +16108,11 @@
                 "node": ">= 10"
             }
         },
+        "node_modules/common-ancestor-path": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz",
+            "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="
+        },
         "node_modules/common-path-prefix": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
@@ -15439,7 +16195,6 @@
         },
         "node_modules/compute-cosine-similarity": {
             "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz",
             "integrity": "sha512-FXhNx0ILLjGi9Z9+lglLzM12+0uoTnYkHm7GiadXDAr0HGVLm25OivUS1B/LPkbzzvlcXz/1EvWg9ZYyJSdhTw==",
             "dependencies": {
                 "compute-dot": "^1.1.0",
@@ -15775,10 +16530,17 @@
                 "node": ">=4"
             }
         },
+        "node_modules/css-line-break": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
+            "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
+            "dependencies": {
+                "utrie": "^1.0.2"
+            }
+        },
         "node_modules/css-loader": {
-            "version": "7.1.1",
-            "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.1.tgz",
-            "integrity": "sha512-OxIR5P2mjO1PSXk44bWuQ8XtMK4dpEqpIyERCx3ewOo3I8EmbcxMPUc5ScLtQfgXtOojoMv57So4V/C02HQLsw==",
+            "version": "7.1.2",
+            "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==",
             "dependencies": {
                 "icss-utils": "^5.1.0",
                 "postcss": "^8.4.33",
@@ -15953,12 +16715,10 @@
         },
         "node_modules/csv-stringify": {
             "version": "6.5.0",
-            "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.5.0.tgz",
             "integrity": "sha512-edlXFVKcUx7r8Vx5zQucsuMg4wb/xT6qyz+Sr1vnLrdXqlLD1+UKyWNyZ9zn6mUW1ewmGxrpVwAcChGF0HQ/2Q=="
         },
         "node_modules/csvtojson": {
             "version": "2.0.10",
-            "resolved": "https://registry.npmjs.org/csvtojson/-/csvtojson-2.0.10.tgz",
             "integrity": "sha512-lUWFxGKyhraKCW8Qghz6Z0f2l/PqB1W3AO0HKJzGIQ5JRSlR651ekJDiGJbBT4sRNNv5ddnSGVEnsxP9XRCVpQ==",
             "dependencies": {
                 "bluebird": "^3.5.1",
@@ -16425,6 +17185,17 @@
                 "node": ">=12"
             }
         },
+        "node_modules/d3/node_modules/d3-array": {
+            "version": "3.2.4",
+            "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+            "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+            "dependencies": {
+                "internmap": "1 - 2"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/d3/node_modules/d3-geo": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
@@ -16939,9 +17710,9 @@
             }
         },
         "node_modules/diff": {
-            "version": "5.0.0",
-            "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
-            "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+            "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
             "engines": {
                 "node": ">=0.3.1"
             }
@@ -17130,9 +17901,9 @@
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
         },
         "node_modules/electron-to-chromium": {
-            "version": "1.4.774",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.774.tgz",
-            "integrity": "sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg=="
+            "version": "1.4.782",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.782.tgz",
+            "integrity": "sha512-JUfU61e8tr+i5Y1FKXcKs+Xe+rJ+CEqm4cgv1kMihPE2EvYHmYyVr3Im/+1+Z5B29Be2EEGCZCwAc6Tazdl1Yg=="
         },
         "node_modules/elkjs": {
             "version": "0.9.3",
@@ -17160,6 +17931,27 @@
                 "node": ">= 0.8"
             }
         },
+        "node_modules/encoding": {
+            "version": "0.1.13",
+            "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+            "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+            "optional": true,
+            "dependencies": {
+                "iconv-lite": "^0.6.2"
+            }
+        },
+        "node_modules/encoding/node_modules/iconv-lite": {
+            "version": "0.6.3",
+            "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+            "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+            "optional": true,
+            "dependencies": {
+                "safer-buffer": ">= 2.1.2 < 3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
         "node_modules/engine.io": {
             "version": "6.5.4",
             "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz",
@@ -17263,6 +18055,14 @@
                 "url": "https://github.com/fb55/entities?sponsor=1"
             }
         },
+        "node_modules/env-paths": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+            "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/envinfo": {
             "version": "7.13.0",
             "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz",
@@ -17274,6 +18074,11 @@
                 "node": ">=4"
             }
         },
+        "node_modules/err-code": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+            "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="
+        },
         "node_modules/error-ex": {
             "version": "1.3.2",
             "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -17784,6 +18589,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dev": true,
             "dependencies": {
                 "fs.realpath": "^1.0.0",
@@ -17921,6 +18727,7 @@
             "version": "2.6.3",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
             "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+            "deprecated": "Rimraf versions prior to v4 are no longer supported",
             "dev": true,
             "dependencies": {
                 "glob": "^7.1.3"
@@ -18211,6 +19018,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dev": true,
             "dependencies": {
                 "fs.realpath": "^1.0.0",
@@ -18348,6 +19156,7 @@
             "version": "2.6.3",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
             "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+            "deprecated": "Rimraf versions prior to v4 are no longer supported",
             "dev": true,
             "dependencies": {
                 "glob": "^7.1.3"
@@ -18456,7 +19265,6 @@
         },
         "node_modules/eslint-import-resolver-typescript": {
             "version": "3.6.1",
-            "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz",
             "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==",
             "dev": true,
             "dependencies": {
@@ -18739,7 +19547,6 @@
         },
         "node_modules/eslint-plugin-react": {
             "version": "7.34.1",
-            "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz",
             "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==",
             "dev": true,
             "dependencies": {
@@ -18771,7 +19578,6 @@
         },
         "node_modules/eslint-plugin-react-hooks": {
             "version": "4.6.2",
-            "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
             "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
             "dev": true,
             "engines": {
@@ -18893,7 +19699,6 @@
         },
         "node_modules/eslint-webpack-plugin": {
             "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.1.0.tgz",
             "integrity": "sha512-C3wAG2jyockIhN0YRLuKieKj2nx/gnE/VHmoHemD5ifnAtY6ZU+jNPfzPoX4Zd6RIbUyWTiZUh/ofUlBhoAX7w==",
             "dependencies": {
                 "@types/eslint": "^8.56.5",
@@ -19236,6 +20041,11 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/exponential-backoff": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
+            "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw=="
+        },
         "node_modules/express": {
             "version": "4.19.2",
             "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
@@ -19334,7 +20144,6 @@
         },
         "node_modules/express-validator": {
             "version": "7.1.0",
-            "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.1.0.tgz",
             "integrity": "sha512-ePn6NXjHRZiZkwTiU1Rl2hy6aUqmi6Cb4/s8sfUsKH7j2yYl9azSpl8xEHcOj1grzzQ+UBEoLWtE1s6FDxW++g==",
             "dependencies": {
                 "lodash": "^4.17.21",
@@ -19397,7 +20206,6 @@
         },
         "node_modules/extract-colors": {
             "version": "4.0.6",
-            "resolved": "https://registry.npmjs.org/extract-colors/-/extract-colors-4.0.6.tgz",
             "integrity": "sha512-U+pYyQKXCSHOmtZPIEJBGLJjLDiqS+oOub2ILA3a7UGt9+IvZvwAN3hOPFjUgT+gX/apSBwP5vBgnKMlV0fy8Q=="
         },
         "node_modules/extsprintf": {
@@ -19612,9 +20420,9 @@
             }
         },
         "node_modules/fill-range": {
-            "version": "7.0.1",
-            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+            "version": "7.1.1",
+            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+            "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
             "dependencies": {
                 "to-regex-range": "^5.0.1"
             },
@@ -19765,6 +20573,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dependencies": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -19795,6 +20604,7 @@
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
             "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+            "deprecated": "Rimraf versions prior to v4 are no longer supported",
             "dependencies": {
                 "glob": "^7.1.3"
             },
@@ -19821,7 +20631,6 @@
         },
         "node_modules/fluent-ffmpeg": {
             "version": "2.1.3",
-            "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz",
             "integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==",
             "dependencies": {
                 "async": "^0.2.9",
@@ -19891,9 +20700,9 @@
             }
         },
         "node_modules/foreground-child": {
-            "version": "3.1.1",
-            "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
-            "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
+            "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
             "dependencies": {
                 "cross-spawn": "^7.0.0",
                 "signal-exit": "^4.0.1"
@@ -20288,6 +21097,7 @@
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
             "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+            "deprecated": "This package is no longer supported.",
             "dependencies": {
                 "aproba": "^1.0.3 || ^2.0.0",
                 "color-support": "^1.1.2",
@@ -20568,15 +21378,15 @@
             "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
         },
         "node_modules/glob": {
-            "version": "10.3.15",
-            "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz",
-            "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==",
+            "version": "10.4.1",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz",
+            "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==",
             "dependencies": {
                 "foreground-child": "^3.1.0",
-                "jackspeak": "^2.3.6",
-                "minimatch": "^9.0.1",
-                "minipass": "^7.0.4",
-                "path-scurry": "^1.11.0"
+                "jackspeak": "^3.1.2",
+                "minimatch": "^9.0.4",
+                "minipass": "^7.1.2",
+                "path-scurry": "^1.11.1"
             },
             "bin": {
                 "glob": "dist/esm/bin.mjs"
@@ -20654,7 +21464,6 @@
         },
         "node_modules/globals": {
             "version": "15.3.0",
-            "resolved": "https://registry.npmjs.org/globals/-/globals-15.3.0.tgz",
             "integrity": "sha512-cCdyVjIUVTtX8ZsPkq1oCsOsLmGIswqnjZYMJJTGaNApj1yHtLSymKhwH51ttirREn75z3p4k051clwg7rvNKA==",
             "dev": true,
             "engines": {
@@ -20705,9 +21514,9 @@
             "integrity": "sha512-sIVQCiRWOymHbVD1Aw/T9/ijbPYAVGBlgGYd1N9MRKfcyBNSpjr87Vg9nSHm+RCT8ELrvK8IJYJV0QRJuVUkCQ=="
         },
         "node_modules/google-auth-library": {
-            "version": "9.10.0",
-            "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.10.0.tgz",
-            "integrity": "sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==",
+            "version": "9.11.0",
+            "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.11.0.tgz",
+            "integrity": "sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw==",
             "dependencies": {
                 "base64-js": "^1.3.0",
                 "ecdsa-sig-formatter": "^1.0.11",
@@ -20786,7 +21595,6 @@
         },
         "node_modules/got": {
             "version": "14.3.0",
-            "resolved": "https://registry.npmjs.org/got/-/got-14.3.0.tgz",
             "integrity": "sha512-vZkrXdq5BtPWTXqvjXSpl6zky3zpHaOVfSug/RfFHu3YrtSsvYzopVMDqrh2do77WnGoCSSRCHW25zXOSAQ9zw==",
             "dependencies": {
                 "@sindresorhus/is": "^6.3.1",
@@ -21202,6 +22010,25 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/hosted-git-info": {
+            "version": "7.0.2",
+            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+            "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
+            "dependencies": {
+                "lru-cache": "^10.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/hosted-git-info/node_modules/lru-cache": {
+            "version": "10.2.2",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+            "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+            "engines": {
+                "node": "14 || >=16.14"
+            }
+        },
         "node_modules/howler": {
             "version": "2.2.4",
             "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz",
@@ -21240,6 +22067,12 @@
                 "util-deprecate": "~1.0.1"
             }
         },
+        "node_modules/hpack.js/node_modules/readable-stream/node_modules/core-util-is": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+            "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+            "dev": true
+        },
         "node_modules/hpack.js/node_modules/safe-buffer": {
             "version": "5.1.2",
             "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -21379,6 +22212,18 @@
                 }
             }
         },
+        "node_modules/html2canvas": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
+            "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
+            "dependencies": {
+                "css-line-break": "^2.1.0",
+                "text-segmentation": "^1.0.3"
+            },
+            "engines": {
+                "node": ">=8.0.0"
+            }
+        },
         "node_modules/htmlparser2": {
             "version": "8.0.2",
             "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
@@ -21456,7 +22301,6 @@
             "version": "7.0.2",
             "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
             "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
-            "dev": true,
             "dependencies": {
                 "agent-base": "^7.1.0",
                 "debug": "^4.3.4"
@@ -21469,7 +22313,6 @@
             "version": "7.1.1",
             "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
             "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
-            "dev": true,
             "dependencies": {
                 "debug": "^4.3.4"
             },
@@ -21657,6 +22500,17 @@
             "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
             "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
         },
+        "node_modules/ignore-walk": {
+            "version": "6.0.5",
+            "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz",
+            "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==",
+            "dependencies": {
+                "minimatch": "^9.0.0"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/image-data-uri": {
             "version": "2.0.1",
             "resolved": "https://registry.npmjs.org/image-data-uri/-/image-data-uri-2.0.1.tgz",
@@ -21696,6 +22550,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dependencies": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -21734,6 +22589,7 @@
             "version": "2.7.1",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
             "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+            "deprecated": "Rimraf versions prior to v4 are no longer supported",
             "dependencies": {
                 "glob": "^7.1.3"
             },
@@ -21899,6 +22755,14 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/import-local/node_modules/p-limit/node_modules/p-try": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/import-local/node_modules/p-locate": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
@@ -21929,10 +22793,19 @@
                 "node": ">=0.8.19"
             }
         },
+        "node_modules/indent-string": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+            "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/inflight": {
             "version": "1.0.6",
             "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
             "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+            "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
             "dependencies": {
                 "once": "^1.3.0",
                 "wrappy": "1"
@@ -21968,6 +22841,34 @@
             "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
             "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
         },
+        "node_modules/init-package-json": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.3.tgz",
+            "integrity": "sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==",
+            "dependencies": {
+                "@npmcli/package-json": "^5.0.0",
+                "npm-package-arg": "^11.0.0",
+                "promzard": "^1.0.0",
+                "read": "^3.0.1",
+                "semver": "^7.3.5",
+                "validate-npm-package-license": "^3.0.4",
+                "validate-npm-package-name": "^5.0.0"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/init-package-json/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/inline-style-parser": {
             "version": "0.2.3",
             "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz",
@@ -22107,15 +23008,6 @@
             "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
             "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
         },
-        "node_modules/inspect-function/node_modules/inspect-function": {
-            "version": "0.2.2",
-            "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz",
-            "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==",
-            "dependencies": {
-                "split-skip": "0.0.1",
-                "unpack-string": "0.0.2"
-            }
-        },
         "node_modules/inspect-function/node_modules/inspect-parameters-declaration": {
             "version": "0.0.8",
             "resolved": "https://registry.npmjs.org/inspect-parameters-declaration/-/inspect-parameters-declaration-0.0.8.tgz",
@@ -22130,6 +23022,20 @@
                 "inspect-parameters-declaration": "bin/cli.js"
             }
         },
+        "node_modules/inspect-function/node_modules/inspect-parameters-declaration/node_modules/inspect-function": {
+            "version": "0.2.2",
+            "resolved": "https://registry.npmjs.org/inspect-function/-/inspect-function-0.2.2.tgz",
+            "integrity": "sha512-becs5gzcHwPrlHawscYkyQ/ShiOiosrXPhA5RVZ3qyWH4aWdD52RnMfXq/dwQXciHwiieD8aIPwdIWYv6eL+sQ==",
+            "dependencies": {
+                "split-skip": "0.0.1",
+                "unpack-string": "0.0.2"
+            }
+        },
+        "node_modules/inspect-function/node_modules/inspect-parameters-declaration/node_modules/inspect-function/node_modules/split-skip": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/split-skip/-/split-skip-0.0.1.tgz",
+            "integrity": "sha512-7dkvq+gofI4M8zx4iZnEZ3O1s7FP4Y/iaIDHJh5RyWrs8idcPauFi2OZe3TBi36fLvR2j5z3kSzVtz6IhPdncQ=="
+        },
         "node_modules/inspect-function/node_modules/inspect-parameters-declaration/node_modules/magicli": {
             "version": "0.0.5",
             "resolved": "https://registry.npmjs.org/magicli/-/magicli-0.0.5.tgz",
@@ -22280,6 +23186,39 @@
                 "loose-envify": "^1.0.0"
             }
         },
+        "node_modules/ip-address": {
+            "version": "9.0.5",
+            "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+            "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+            "dependencies": {
+                "jsbn": "1.1.0",
+                "sprintf-js": "^1.1.3"
+            },
+            "engines": {
+                "node": ">= 12"
+            }
+        },
+        "node_modules/ip-address/node_modules/jsbn": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+            "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
+        },
+        "node_modules/ip-address/node_modules/sprintf-js": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+            "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
+        },
+        "node_modules/ip-regex": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz",
+            "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==",
+            "engines": {
+                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/ipaddr.js": {
             "version": "1.9.1",
             "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -22411,6 +23350,17 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/is-cidr": {
+            "version": "5.0.5",
+            "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-5.0.5.tgz",
+            "integrity": "sha512-zDlCvz2v8dBpumuGD4/fc7wzFKY6UYOvFW29JWSstdJoByGN3TKwS0tFA9VWc7DM01VOVOn/DaR84D8Mihp9Rg==",
+            "dependencies": {
+                "cidr-regex": "^4.0.4"
+            },
+            "engines": {
+                "node": ">=14"
+            }
+        },
         "node_modules/is-core-module": {
             "version": "2.13.1",
             "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
@@ -22588,6 +23538,11 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/is-lambda": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+            "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="
+        },
         "node_modules/is-map": {
             "version": "2.0.3",
             "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
@@ -22926,9 +23881,9 @@
             }
         },
         "node_modules/jackspeak": {
-            "version": "2.3.6",
-            "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
-            "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+            "version": "3.4.0",
+            "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz",
+            "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==",
             "dependencies": {
                 "@isaacs/cliui": "^8.0.2"
             },
@@ -23104,6 +24059,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dependencies": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -23174,7 +24130,6 @@
         },
         "node_modules/jsdom": {
             "version": "24.0.0",
-            "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz",
             "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==",
             "dev": true,
             "dependencies": {
@@ -23281,6 +24236,14 @@
             "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
             "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
         },
+        "node_modules/json-stringify-nice": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz",
+            "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==",
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
         "node_modules/json-stringify-pretty-compact": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz",
@@ -23313,6 +24276,14 @@
                 "graceful-fs": "^4.1.6"
             }
         },
+        "node_modules/jsonparse": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+            "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+            "engines": [
+                "node >= 0.2.0"
+            ]
+        },
         "node_modules/jsonschema": {
             "version": "1.4.1",
             "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz",
@@ -23402,6 +24373,16 @@
                 "safe-buffer": "~5.1.0"
             }
         },
+        "node_modules/just-diff": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz",
+            "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="
+        },
+        "node_modules/just-diff-apply": {
+            "version": "5.5.0",
+            "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz",
+            "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="
+        },
         "node_modules/jwa": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
@@ -23568,9 +24549,9 @@
             }
         },
         "node_modules/language-subtag-registry": {
-            "version": "0.3.22",
-            "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
-            "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+            "version": "0.3.23",
+            "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+            "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
             "dev": true
         },
         "node_modules/language-tags": {
@@ -23630,19 +24611,16 @@
                 "util-deprecate": "~1.0.1"
             }
         },
+        "node_modules/lazystream/node_modules/readable-stream/node_modules/core-util-is": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+            "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+        },
         "node_modules/lazystream/node_modules/safe-buffer": {
             "version": "5.1.2",
             "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
             "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
         },
-        "node_modules/lazystream/node_modules/string_decoder": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-            "dependencies": {
-                "safe-buffer": "~5.1.0"
-            }
-        },
         "node_modules/leac": {
             "version": "0.6.0",
             "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz",
@@ -23651,15 +24629,6 @@
                 "url": "https://ko-fi.com/killymxi"
             }
         },
-        "node_modules/legacy-swc-helpers": {
-            "name": "@swc/helpers",
-            "version": "0.4.14",
-            "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz",
-            "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==",
-            "dependencies": {
-                "tslib": "^2.4.0"
-            }
-        },
         "node_modules/levn": {
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -23672,6 +24641,230 @@
                 "node": ">= 0.8.0"
             }
         },
+        "node_modules/libnpmaccess": {
+            "version": "8.0.6",
+            "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.6.tgz",
+            "integrity": "sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==",
+            "dependencies": {
+                "npm-package-arg": "^11.0.2",
+                "npm-registry-fetch": "^17.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmdiff": {
+            "version": "6.1.2",
+            "resolved": "https://registry.npmjs.org/libnpmdiff/-/libnpmdiff-6.1.2.tgz",
+            "integrity": "sha512-cyGmfI9RsAugdbWWSE9eH7tj5/igcRJHFNksIevwXn6mobu+Kna2uX8uWgmlpu90Bg23nPW2rtSJIbGi7IPhyg==",
+            "dependencies": {
+                "@npmcli/arborist": "^7.5.2",
+                "@npmcli/installed-package-contents": "^2.1.0",
+                "binary-extensions": "^2.3.0",
+                "diff": "^5.1.0",
+                "minimatch": "^9.0.4",
+                "npm-package-arg": "^11.0.2",
+                "pacote": "^18.0.6",
+                "tar": "^6.2.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmexec": {
+            "version": "8.1.1",
+            "resolved": "https://registry.npmjs.org/libnpmexec/-/libnpmexec-8.1.1.tgz",
+            "integrity": "sha512-KGXr+4WvaMNqU27z0qICbFz2EKzYWrcxWoHKWmSX3A1UyEeuLFc86Pie6cbCs5JeKN8TMVyLBJ9z25PHh458eg==",
+            "dependencies": {
+                "@npmcli/arborist": "^7.5.2",
+                "@npmcli/run-script": "^8.1.0",
+                "ci-info": "^4.0.0",
+                "npm-package-arg": "^11.0.2",
+                "pacote": "^18.0.6",
+                "proc-log": "^4.2.0",
+                "read": "^3.0.1",
+                "read-package-json-fast": "^3.0.2",
+                "semver": "^7.3.7",
+                "walk-up-path": "^3.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmexec/node_modules/ci-info": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+            "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/sibiraj-s"
+                }
+            ],
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/libnpmexec/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/libnpmfund": {
+            "version": "5.0.10",
+            "resolved": "https://registry.npmjs.org/libnpmfund/-/libnpmfund-5.0.10.tgz",
+            "integrity": "sha512-WkjxfGC7sdGD7lXYsVNKi3NogROJMTeIFRgFicd0UxEk2eI0CKSC8Tcn5zuazmZse1/Jg0AWHoSgJWpy+0ZXvg==",
+            "dependencies": {
+                "@npmcli/arborist": "^7.5.2"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmhook": {
+            "version": "10.0.5",
+            "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-10.0.5.tgz",
+            "integrity": "sha512-XulT+N/s3o9oFlIq6pGRv3OG2qR1NVRbVQOKLchycDwyf16RZA3oXbeEgs2H3oE7hRZPUMBZqsalQXMMPal3cQ==",
+            "dependencies": {
+                "aproba": "^2.0.0",
+                "npm-registry-fetch": "^17.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmorg": {
+            "version": "6.0.6",
+            "resolved": "https://registry.npmjs.org/libnpmorg/-/libnpmorg-6.0.6.tgz",
+            "integrity": "sha512-4MVxsAS4H2z7su/sU0GsrirfBm4ssfqPRSDvoZ8qmRw58kEWJ0qE0cQ2VilRlFgCWKzKPhfoPeyNPyxBTnOusA==",
+            "dependencies": {
+                "aproba": "^2.0.0",
+                "npm-registry-fetch": "^17.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmpack": {
+            "version": "7.0.2",
+            "resolved": "https://registry.npmjs.org/libnpmpack/-/libnpmpack-7.0.2.tgz",
+            "integrity": "sha512-hVtWu8P7JIl6SHGoVvECRp2Y+5qHeaUhTLzHpMAPi4iG9dFnY9YgitrAAMfUA/qZhLEvuD+KoYJ04mM7chXt+Q==",
+            "dependencies": {
+                "@npmcli/arborist": "^7.5.2",
+                "@npmcli/run-script": "^8.1.0",
+                "npm-package-arg": "^11.0.2",
+                "pacote": "^18.0.6"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmpublish": {
+            "version": "9.0.8",
+            "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.8.tgz",
+            "integrity": "sha512-sIsWBSAT7ugDPrV72/Js1vYpZBZuOqlMOOZmpXh2Mn5Tjh4Ycv3qYQGHX19g5wdOuQw4wgluSzF/z7EFSO084g==",
+            "dependencies": {
+                "ci-info": "^4.0.0",
+                "normalize-package-data": "^6.0.1",
+                "npm-package-arg": "^11.0.2",
+                "npm-registry-fetch": "^17.0.1",
+                "proc-log": "^4.2.0",
+                "semver": "^7.3.7",
+                "sigstore": "^2.2.0",
+                "ssri": "^10.0.6"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmpublish/node_modules/ci-info": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+            "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/sibiraj-s"
+                }
+            ],
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/libnpmpublish/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/libnpmsearch": {
+            "version": "7.0.5",
+            "resolved": "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-7.0.5.tgz",
+            "integrity": "sha512-GSwFPsPfHsOgWM1bTArG+zSmax5ghqCKh81296/rWLw9nBgBWwHj1MJSZ68SfkjAXgMcr34dHzlKJZjRDIjSNQ==",
+            "dependencies": {
+                "npm-registry-fetch": "^17.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmteam": {
+            "version": "6.0.5",
+            "resolved": "https://registry.npmjs.org/libnpmteam/-/libnpmteam-6.0.5.tgz",
+            "integrity": "sha512-iJW4Cq42GMqMwZEV+Mx8ZLj0Np5kGXQ9P/BAekHjIpYC1v3/vJqbmfJkzkwFvGxEhUotmx+xpLChZCDJ7c3rxA==",
+            "dependencies": {
+                "aproba": "^2.0.0",
+                "npm-registry-fetch": "^17.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmversion": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/libnpmversion/-/libnpmversion-6.0.2.tgz",
+            "integrity": "sha512-rbc4saGNaXeLMvby8Ta5sOgOXQTrYIXxg+MaA7Uy2wMhESb5ugIfkXJPfgMwLOxQ3o+xDFzNhul6KLjsCyV4tA==",
+            "dependencies": {
+                "@npmcli/git": "^5.0.7",
+                "@npmcli/run-script": "^8.1.0",
+                "json-parse-even-better-errors": "^3.0.2",
+                "proc-log": "^4.2.0",
+                "semver": "^7.3.7"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmversion/node_modules/json-parse-even-better-errors": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+            "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/libnpmversion/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/lie": {
             "version": "3.3.0",
             "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
@@ -24025,12 +25218,32 @@
             "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
             "dev": true
         },
+        "node_modules/make-fetch-happen": {
+            "version": "13.0.1",
+            "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz",
+            "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==",
+            "dependencies": {
+                "@npmcli/agent": "^2.0.0",
+                "cacache": "^18.0.0",
+                "http-cache-semantics": "^4.1.1",
+                "is-lambda": "^1.0.1",
+                "minipass": "^7.0.2",
+                "minipass-fetch": "^3.0.0",
+                "minipass-flush": "^1.0.5",
+                "minipass-pipeline": "^1.2.4",
+                "negotiator": "^0.6.3",
+                "proc-log": "^4.2.0",
+                "promise-retry": "^2.0.1",
+                "ssri": "^10.0.0"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
         "node_modules/mapbox-gl": {
-            "version": "3.3.0",
-            "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.3.0.tgz",
-            "integrity": "sha512-cVeAu9PxPTx113AnJAzcSKbBtL5F5EpJ6/NuYgNib9zNduNSoDG2oVX6xK0bAP/VwwVwRh9SEhcyM7nh4GThvQ==",
+            "version": "3.4.0",
+            "integrity": "sha512-QWgL28zg/zuIOHeF8DXPvHy1UHTgO5p4Oy6ifCAHwI9/hoI9/Fruya0yI4HkDtX1OgzTLO6SHO13A781BGJvyw==",
             "dependencies": {
-                "@mapbox/geojson-rewind": "^0.5.2",
                 "@mapbox/jsonlint-lines-primitives": "^2.0.2",
                 "@mapbox/mapbox-gl-supported": "^3.0.0",
                 "@mapbox/point-geometry": "^0.1.0",
@@ -24054,7 +25267,7 @@
                 "rw": "^1.3.3",
                 "serialize-to-js": "^3.1.2",
                 "supercluster": "^8.0.0",
-                "tiny-lru": "^11.2.5",
+                "tiny-lru": "^11.2.6",
                 "tinyqueue": "^2.0.3",
                 "tweakpane": "^4.0.3",
                 "vt-pbf": "^3.1.3"
@@ -24062,7 +25275,6 @@
         },
         "node_modules/markdown-it": {
             "version": "14.1.0",
-            "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
             "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
             "dependencies": {
                 "argparse": "^2.0.1",
@@ -24311,11 +25523,6 @@
                 "@types/unist": "*"
             }
         },
-        "node_modules/mdast-util-gfm-footnote/node_modules/@types/unist": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
-            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
-        },
         "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-from-markdown": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
@@ -24339,6 +25546,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-to-string": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
@@ -24784,6 +25996,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-gfm-footnote/node_modules/unist-util-stringify-position/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-gfm-strikethrough": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
@@ -24806,11 +26023,6 @@
                 "@types/unist": "*"
             }
         },
-        "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/unist": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
-            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
-        },
         "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-from-markdown": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
@@ -24834,6 +26046,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-to-string": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
@@ -25279,6 +26496,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-gfm-strikethrough/node_modules/unist-util-stringify-position/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-gfm-table": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
@@ -25303,11 +26525,6 @@
                 "@types/unist": "*"
             }
         },
-        "node_modules/mdast-util-gfm-table/node_modules/@types/unist": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
-            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
-        },
         "node_modules/mdast-util-gfm-table/node_modules/mdast-util-from-markdown": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
@@ -25331,6 +26548,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-gfm-table/node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-gfm-table/node_modules/mdast-util-to-string": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
@@ -25776,6 +26998,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-gfm-table/node_modules/unist-util-stringify-position/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-gfm-task-list-item": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
@@ -25799,11 +27026,6 @@
                 "@types/unist": "*"
             }
         },
-        "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/unist": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
-            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
-        },
         "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-from-markdown": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
@@ -25827,6 +27049,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-to-string": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
@@ -26272,6 +27499,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-gfm-task-list-item/node_modules/unist-util-stringify-position/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-gfm/node_modules/@types/mdast": {
             "version": "4.0.4",
             "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
@@ -26779,15 +28011,10 @@
                 "@types/unist": "*"
             }
         },
-        "node_modules/mdast-util-math/node_modules/@types/unist": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
-            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
-        },
         "node_modules/mdast-util-math/node_modules/mdast-util-from-markdown": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
-            "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz",
+            "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==",
             "dependencies": {
                 "@types/mdast": "^4.0.0",
                 "@types/unist": "^3.0.0",
@@ -26807,6 +28034,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-math/node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-math/node_modules/mdast-util-to-string": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
@@ -27252,6 +28484,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-math/node_modules/unist-util-stringify-position/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-mdx-expression": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz",
@@ -27277,11 +28514,6 @@
                 "@types/unist": "*"
             }
         },
-        "node_modules/mdast-util-mdx-expression/node_modules/@types/unist": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
-            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
-        },
         "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-from-markdown": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
@@ -27305,6 +28537,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-to-string": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
@@ -27750,6 +28987,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-mdx-expression/node_modules/unist-util-stringify-position/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-mdx-jsx": {
             "version": "3.1.2",
             "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz",
@@ -28280,11 +29522,6 @@
                 "@types/unist": "*"
             }
         },
-        "node_modules/mdast-util-mdxjs-esm/node_modules/@types/unist": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
-            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
-        },
         "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-from-markdown": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
@@ -28308,6 +29545,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-to-string": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
@@ -28753,6 +29995,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/mdast-util-mdxjs-esm/node_modules/unist-util-stringify-position/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/mdast-util-phrasing": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
@@ -29092,7 +30339,6 @@
         },
         "node_modules/mermaid": {
             "version": "10.9.1",
-            "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.1.tgz",
             "integrity": "sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA==",
             "dependencies": {
                 "@braintree/sanitize-url": "^6.0.1",
@@ -30488,11 +31734,11 @@
             ]
         },
         "node_modules/micromatch": {
-            "version": "4.0.5",
-            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-            "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+            "version": "4.0.7",
+            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+            "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
             "dependencies": {
-                "braces": "^3.0.2",
+                "braces": "^3.0.3",
                 "picomatch": "^2.3.1"
             },
             "engines": {
@@ -30585,13 +31831,146 @@
             }
         },
         "node_modules/minipass": {
-            "version": "7.1.1",
-            "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz",
-            "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==",
+            "version": "7.1.2",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+            "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            }
+        },
+        "node_modules/minipass-collect": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
+            "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
+            "dependencies": {
+                "minipass": "^7.0.3"
+            },
             "engines": {
                 "node": ">=16 || 14 >=14.17"
             }
         },
+        "node_modules/minipass-fetch": {
+            "version": "3.0.5",
+            "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+            "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
+            "dependencies": {
+                "minipass": "^7.0.3",
+                "minipass-sized": "^1.0.3",
+                "minizlib": "^2.1.2"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            },
+            "optionalDependencies": {
+                "encoding": "^0.1.13"
+            }
+        },
+        "node_modules/minipass-flush": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+            "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/minipass-flush/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-flush/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "node_modules/minipass-json-stream": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
+            "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
+            "dependencies": {
+                "jsonparse": "^1.3.1",
+                "minipass": "^3.0.0"
+            }
+        },
+        "node_modules/minipass-json-stream/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-json-stream/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "node_modules/minipass-pipeline": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+            "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-pipeline/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-pipeline/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "node_modules/minipass-sized": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+            "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-sized/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minipass-sized/node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
         "node_modules/minizlib": {
             "version": "2.1.2",
             "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
@@ -30774,10 +32153,20 @@
                 "fsevents": "~2.3.2"
             }
         },
+        "node_modules/mocha/node_modules/diff": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+            "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.3.1"
+            }
+        },
         "node_modules/mocha/node_modules/glob": {
             "version": "8.1.0",
             "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
             "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dev": true,
             "dependencies": {
                 "fs.realpath": "^1.0.0",
@@ -30869,9 +32258,8 @@
             }
         },
         "node_modules/mongodb": {
-            "version": "6.6.2",
-            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz",
-            "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==",
+            "version": "6.7.0",
+            "integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==",
             "dependencies": {
                 "@mongodb-js/saslprep": "^1.1.5",
                 "bson": "^6.7.0",
@@ -30947,7 +32335,6 @@
         },
         "node_modules/mongoose": {
             "version": "8.4.0",
-            "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.0.tgz",
             "integrity": "sha512-fgqRMwVEP1qgRYfh+tUe2YBBFnPO35FIg2lfFH+w9IhRGg1/ataWGIqvf/MjwM29cZ60D5vSnqtN2b8Qp0sOZA==",
             "dependencies": {
                 "bson": "^6.7.0",
@@ -30966,6 +32353,51 @@
                 "url": "https://opencollective.com/mongoose"
             }
         },
+        "node_modules/mongoose/node_modules/mongodb": {
+            "version": "6.6.2",
+            "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz",
+            "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==",
+            "dependencies": {
+                "@mongodb-js/saslprep": "^1.1.5",
+                "bson": "^6.7.0",
+                "mongodb-connection-string-url": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=16.20.1"
+            },
+            "peerDependencies": {
+                "@aws-sdk/credential-providers": "^3.188.0",
+                "@mongodb-js/zstd": "^1.1.0",
+                "gcp-metadata": "^5.2.0",
+                "kerberos": "^2.0.1",
+                "mongodb-client-encryption": ">=6.0.0 <7",
+                "snappy": "^7.2.2",
+                "socks": "^2.7.1"
+            },
+            "peerDependenciesMeta": {
+                "@aws-sdk/credential-providers": {
+                    "optional": true
+                },
+                "@mongodb-js/zstd": {
+                    "optional": true
+                },
+                "gcp-metadata": {
+                    "optional": true
+                },
+                "kerberos": {
+                    "optional": true
+                },
+                "mongodb-client-encryption": {
+                    "optional": true
+                },
+                "snappy": {
+                    "optional": true
+                },
+                "socks": {
+                    "optional": true
+                }
+            }
+        },
         "node_modules/mongoose/node_modules/ms": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -31237,6 +32669,92 @@
                 "node": ">= 6.13.0"
             }
         },
+        "node_modules/node-gyp": {
+            "version": "10.1.0",
+            "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz",
+            "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==",
+            "dependencies": {
+                "env-paths": "^2.2.0",
+                "exponential-backoff": "^3.1.1",
+                "glob": "^10.3.10",
+                "graceful-fs": "^4.2.6",
+                "make-fetch-happen": "^13.0.0",
+                "nopt": "^7.0.0",
+                "proc-log": "^3.0.0",
+                "semver": "^7.3.5",
+                "tar": "^6.1.2",
+                "which": "^4.0.0"
+            },
+            "bin": {
+                "node-gyp": "bin/node-gyp.js"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/abbrev": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+            "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/isexe": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+            "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+            "engines": {
+                "node": ">=16"
+            }
+        },
+        "node_modules/node-gyp/node_modules/nopt": {
+            "version": "7.2.1",
+            "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+            "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+            "dependencies": {
+                "abbrev": "^2.0.0"
+            },
+            "bin": {
+                "nopt": "bin/nopt.js"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/proc-log": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+            "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/node-gyp/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/node-gyp/node_modules/which": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+            "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+            "dependencies": {
+                "isexe": "^3.1.1"
+            },
+            "bin": {
+                "node-which": "bin/which.js"
+            },
+            "engines": {
+                "node": "^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/node-releases": {
             "version": "2.0.14",
             "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
@@ -31264,7 +32782,6 @@
         },
         "node_modules/nodemon": {
             "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz",
             "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==",
             "dependencies": {
                 "chokidar": "^3.5.2",
@@ -31339,6 +32856,31 @@
                 "node": ">=6"
             }
         },
+        "node_modules/normalize-package-data": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz",
+            "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==",
+            "dependencies": {
+                "hosted-git-info": "^7.0.0",
+                "is-core-module": "^2.8.1",
+                "semver": "^7.3.5",
+                "validate-npm-package-license": "^3.0.4"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/normalize-package-data/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/normalize-path": {
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -31360,7 +32902,6 @@
         },
         "node_modules/npm": {
             "version": "10.8.0",
-            "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.0.tgz",
             "integrity": "sha512-wh93uRczgp7HDnPMiLXcCkv2hagdJS0zJ9KT/31d0FoXP02+qgN2AOwpaW85fxRWkinl2rELfPw+CjBXW48/jQ==",
             "bundleDependencies": [
                 "@isaacs/string-locale-compare",
@@ -31510,2257 +33051,463 @@
                 "node": "^18.17.0 || >=20.5.0"
             }
         },
-        "node_modules/npm-run-path": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-            "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-            "dev": true,
-            "dependencies": {
-                "path-key": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/@isaacs/cliui": {
-            "version": "8.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "string-width": "^5.1.2",
-                "string-width-cjs": "npm:string-width@^4.2.0",
-                "strip-ansi": "^7.0.1",
-                "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
-                "wrap-ansi": "^8.1.0",
-                "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
-            },
-            "engines": {
-                "node": ">=12"
-            }
-        },
-        "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": {
-            "version": "6.0.1",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-            }
-        },
-        "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": {
-            "version": "9.2.2",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": {
-            "version": "5.1.2",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "eastasianwidth": "^0.2.0",
-                "emoji-regex": "^9.2.2",
-                "strip-ansi": "^7.0.1"
-            },
-            "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": {
-            "version": "7.1.0",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "ansi-regex": "^6.0.1"
-            },
-            "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-            }
-        },
-        "node_modules/npm/node_modules/@isaacs/string-locale-compare": {
-            "version": "1.1.0",
-            "inBundle": true,
-            "license": "ISC"
-        },
-        "node_modules/npm/node_modules/@npmcli/agent": {
-            "version": "2.2.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "agent-base": "^7.1.0",
-                "http-proxy-agent": "^7.0.0",
-                "https-proxy-agent": "^7.0.1",
-                "lru-cache": "^10.0.1",
-                "socks-proxy-agent": "^8.0.3"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@npmcli/arborist": {
-            "version": "7.5.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@isaacs/string-locale-compare": "^1.1.0",
-                "@npmcli/fs": "^3.1.1",
-                "@npmcli/installed-package-contents": "^2.1.0",
-                "@npmcli/map-workspaces": "^3.0.2",
-                "@npmcli/metavuln-calculator": "^7.1.1",
-                "@npmcli/name-from-folder": "^2.0.0",
-                "@npmcli/node-gyp": "^3.0.0",
-                "@npmcli/package-json": "^5.1.0",
-                "@npmcli/query": "^3.1.0",
-                "@npmcli/redact": "^2.0.0",
-                "@npmcli/run-script": "^8.1.0",
-                "bin-links": "^4.0.4",
-                "cacache": "^18.0.3",
-                "common-ancestor-path": "^1.0.1",
-                "hosted-git-info": "^7.0.2",
-                "json-parse-even-better-errors": "^3.0.2",
-                "json-stringify-nice": "^1.1.4",
-                "lru-cache": "^10.2.2",
-                "minimatch": "^9.0.4",
-                "nopt": "^7.2.1",
-                "npm-install-checks": "^6.2.0",
-                "npm-package-arg": "^11.0.2",
-                "npm-pick-manifest": "^9.0.1",
-                "npm-registry-fetch": "^17.0.1",
-                "pacote": "^18.0.6",
-                "parse-conflict-json": "^3.0.0",
-                "proc-log": "^4.2.0",
-                "proggy": "^2.0.0",
-                "promise-all-reject-late": "^1.0.0",
-                "promise-call-limit": "^3.0.1",
-                "read-package-json-fast": "^3.0.2",
-                "semver": "^7.3.7",
-                "ssri": "^10.0.6",
-                "treeverse": "^3.0.0",
-                "walk-up-path": "^3.0.1"
-            },
-            "bin": {
-                "arborist": "bin/index.js"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@npmcli/config": {
-            "version": "8.3.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/map-workspaces": "^3.0.2",
-                "ci-info": "^4.0.0",
-                "ini": "^4.1.2",
-                "nopt": "^7.2.1",
-                "proc-log": "^4.2.0",
-                "read-package-json-fast": "^3.0.2",
-                "semver": "^7.3.5",
-                "walk-up-path": "^3.0.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@npmcli/fs": {
-            "version": "3.1.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "semver": "^7.3.5"
-            },
+        "node_modules/npm-audit-report": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-5.0.0.tgz",
+            "integrity": "sha512-EkXrzat7zERmUhHaoren1YhTxFwsOu5jypE84k6632SXTHcQE1z8V51GC6GVZt8LxkC+tbBcKMUBZAgk8SUSbw==",
             "engines": {
                 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/@npmcli/git": {
-            "version": "5.0.7",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/promise-spawn": "^7.0.0",
-                "lru-cache": "^10.0.1",
-                "npm-pick-manifest": "^9.0.0",
-                "proc-log": "^4.0.0",
-                "promise-inflight": "^1.0.1",
-                "promise-retry": "^2.0.1",
-                "semver": "^7.3.5",
-                "which": "^4.0.0"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@npmcli/installed-package-contents": {
-            "version": "2.1.0",
-            "inBundle": true,
-            "license": "ISC",
+        "node_modules/npm-bundled": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz",
+            "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==",
             "dependencies": {
-                "npm-bundled": "^3.0.0",
                 "npm-normalize-package-bin": "^3.0.0"
             },
-            "bin": {
-                "installed-package-contents": "bin/index.js"
-            },
             "engines": {
                 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/@npmcli/map-workspaces": {
-            "version": "3.0.6",
-            "inBundle": true,
-            "license": "ISC",
+        "node_modules/npm-install-checks": {
+            "version": "6.3.0",
+            "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz",
+            "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==",
             "dependencies": {
-                "@npmcli/name-from-folder": "^2.0.0",
-                "glob": "^10.2.2",
-                "minimatch": "^9.0.0",
-                "read-package-json-fast": "^3.0.0"
+                "semver": "^7.1.1"
             },
             "engines": {
                 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
-            "version": "7.1.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "cacache": "^18.0.0",
-                "json-parse-even-better-errors": "^3.0.0",
-                "pacote": "^18.0.0",
-                "proc-log": "^4.1.0",
-                "semver": "^7.3.5"
+        "node_modules/npm-install-checks/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
             },
             "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@npmcli/name-from-folder": {
-            "version": "2.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                "node": ">=10"
             }
         },
-        "node_modules/npm/node_modules/@npmcli/node-gyp": {
-            "version": "3.0.0",
-            "inBundle": true,
-            "license": "ISC",
+        "node_modules/npm-normalize-package-bin": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
+            "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
             "engines": {
                 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/@npmcli/package-json": {
-            "version": "5.1.0",
-            "inBundle": true,
-            "license": "ISC",
+        "node_modules/npm-package-arg": {
+            "version": "11.0.2",
+            "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz",
+            "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==",
             "dependencies": {
-                "@npmcli/git": "^5.0.0",
-                "glob": "^10.2.2",
                 "hosted-git-info": "^7.0.0",
-                "json-parse-even-better-errors": "^3.0.0",
-                "normalize-package-data": "^6.0.0",
                 "proc-log": "^4.0.0",
-                "semver": "^7.5.3"
+                "semver": "^7.3.5",
+                "validate-npm-package-name": "^5.0.0"
             },
             "engines": {
                 "node": "^16.14.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/@npmcli/promise-spawn": {
-            "version": "7.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "which": "^4.0.0"
+        "node_modules/npm-package-arg/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
             },
             "engines": {
-                "node": "^16.14.0 || >=18.0.0"
+                "node": ">=10"
             }
         },
-        "node_modules/npm/node_modules/@npmcli/query": {
-            "version": "3.1.0",
-            "inBundle": true,
-            "license": "ISC",
+        "node_modules/npm-packlist": {
+            "version": "8.0.2",
+            "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz",
+            "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==",
             "dependencies": {
-                "postcss-selector-parser": "^6.0.10"
+                "ignore-walk": "^6.0.4"
             },
             "engines": {
                 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/@npmcli/redact": {
-            "version": "2.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@npmcli/run-script": {
-            "version": "8.1.0",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/node-gyp": "^3.0.0",
-                "@npmcli/package-json": "^5.0.0",
-                "@npmcli/promise-spawn": "^7.0.0",
-                "node-gyp": "^10.0.0",
-                "proc-log": "^4.0.0",
-                "which": "^4.0.0"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@pkgjs/parseargs": {
-            "version": "0.11.0",
-            "inBundle": true,
-            "license": "MIT",
-            "optional": true,
-            "engines": {
-                "node": ">=14"
-            }
-        },
-        "node_modules/npm/node_modules/@sigstore/bundle": {
-            "version": "2.3.1",
-            "inBundle": true,
-            "license": "Apache-2.0",
-            "dependencies": {
-                "@sigstore/protobuf-specs": "^0.3.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@sigstore/core": {
-            "version": "1.1.0",
-            "inBundle": true,
-            "license": "Apache-2.0",
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@sigstore/protobuf-specs": {
-            "version": "0.3.2",
-            "inBundle": true,
-            "license": "Apache-2.0",
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@sigstore/sign": {
-            "version": "2.3.1",
-            "inBundle": true,
-            "license": "Apache-2.0",
-            "dependencies": {
-                "@sigstore/bundle": "^2.3.0",
-                "@sigstore/core": "^1.0.0",
-                "@sigstore/protobuf-specs": "^0.3.1",
-                "make-fetch-happen": "^13.0.1",
-                "proc-log": "^4.2.0",
-                "promise-retry": "^2.0.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@sigstore/tuf": {
-            "version": "2.3.3",
-            "inBundle": true,
-            "license": "Apache-2.0",
-            "dependencies": {
-                "@sigstore/protobuf-specs": "^0.3.0",
-                "tuf-js": "^2.2.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@sigstore/verify": {
-            "version": "1.2.0",
-            "inBundle": true,
-            "license": "Apache-2.0",
-            "dependencies": {
-                "@sigstore/bundle": "^2.3.1",
-                "@sigstore/core": "^1.1.0",
-                "@sigstore/protobuf-specs": "^0.3.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@tufjs/canonical-json": {
-            "version": "2.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/@tufjs/models": {
-            "version": "2.0.1",
-            "inBundle": true,
-            "license": "MIT",
+        "node_modules/npm-pick-manifest": {
+            "version": "9.0.1",
+            "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.1.tgz",
+            "integrity": "sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==",
             "dependencies": {
-                "@tufjs/canonical-json": "2.0.0",
-                "minimatch": "^9.0.4"
+                "npm-install-checks": "^6.0.0",
+                "npm-normalize-package-bin": "^3.0.0",
+                "npm-package-arg": "^11.0.0",
+                "semver": "^7.3.5"
             },
             "engines": {
                 "node": "^16.14.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/abbrev": {
-            "version": "2.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/agent-base": {
-            "version": "7.1.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "debug": "^4.3.4"
+        "node_modules/npm-pick-manifest/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+            "bin": {
+                "semver": "bin/semver.js"
             },
             "engines": {
-                "node": ">= 14"
+                "node": ">=10"
             }
         },
-        "node_modules/npm/node_modules/aggregate-error": {
-            "version": "3.1.0",
-            "inBundle": true,
-            "license": "MIT",
+        "node_modules/npm-profile": {
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-10.0.0.tgz",
+            "integrity": "sha512-DXnge3nHYnEnPxmVd/kPmgcXKXwVUqFihGnU+EJUiu5mIOs3awq6zEm0rRp3kSQNhFsoqdLu8L1TIfRyeBOCog==",
             "dependencies": {
-                "clean-stack": "^2.0.0",
-                "indent-string": "^4.0.0"
+                "npm-registry-fetch": "^17.0.1",
+                "proc-log": "^4.0.0"
             },
             "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/ansi-regex": {
-            "version": "5.0.1",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/ansi-styles": {
-            "version": "6.2.1",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+                "node": ">=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/aproba": {
-            "version": "2.0.0",
-            "inBundle": true,
-            "license": "ISC"
-        },
-        "node_modules/npm/node_modules/archy": {
-            "version": "1.0.0",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/balanced-match": {
-            "version": "1.0.2",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/bin-links": {
-            "version": "4.0.4",
-            "inBundle": true,
-            "license": "ISC",
+        "node_modules/npm-registry-fetch": {
+            "version": "17.0.1",
+            "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.0.1.tgz",
+            "integrity": "sha512-fLu9MTdZTlJAHUek/VLklE6EpIiP3VZpTiuN7OOMCt2Sd67NCpSEetMaxHHEZiZxllp8ZLsUpvbEszqTFEc+wA==",
             "dependencies": {
-                "cmd-shim": "^6.0.0",
-                "npm-normalize-package-bin": "^3.0.0",
-                "read-cmd-shim": "^4.0.0",
-                "write-file-atomic": "^5.0.0"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/binary-extensions": {
-            "version": "2.3.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/npm/node_modules/brace-expansion": {
-            "version": "2.0.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "balanced-match": "^1.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/cacache": {
-            "version": "18.0.3",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/fs": "^3.1.0",
-                "fs-minipass": "^3.0.0",
-                "glob": "^10.2.2",
-                "lru-cache": "^10.0.1",
-                "minipass": "^7.0.3",
-                "minipass-collect": "^2.0.1",
-                "minipass-flush": "^1.0.5",
-                "minipass-pipeline": "^1.2.4",
-                "p-map": "^4.0.0",
-                "ssri": "^10.0.0",
-                "tar": "^6.1.11",
-                "unique-filename": "^3.0.0"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/chalk": {
-            "version": "5.3.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": "^12.17.0 || ^14.13 || >=16.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/chalk?sponsor=1"
-            }
-        },
-        "node_modules/npm/node_modules/chownr": {
-            "version": "2.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/npm/node_modules/ci-info": {
-            "version": "4.0.0",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/sibiraj-s"
-                }
-            ],
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/cidr-regex": {
-            "version": "4.0.5",
-            "inBundle": true,
-            "license": "BSD-2-Clause",
-            "dependencies": {
-                "ip-regex": "^5.0.0"
-            },
-            "engines": {
-                "node": ">=14"
-            }
-        },
-        "node_modules/npm/node_modules/clean-stack": {
-            "version": "2.2.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/npm/node_modules/cli-columns": {
-            "version": "4.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "string-width": "^4.2.3",
-                "strip-ansi": "^6.0.1"
-            },
-            "engines": {
-                "node": ">= 10"
-            }
-        },
-        "node_modules/npm/node_modules/cmd-shim": {
-            "version": "6.0.3",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/color-convert": {
-            "version": "2.0.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "color-name": "~1.1.4"
-            },
-            "engines": {
-                "node": ">=7.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/color-name": {
-            "version": "1.1.4",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/common-ancestor-path": {
-            "version": "1.0.1",
-            "inBundle": true,
-            "license": "ISC"
-        },
-        "node_modules/npm/node_modules/cross-spawn": {
-            "version": "7.0.3",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "path-key": "^3.1.0",
-                "shebang-command": "^2.0.0",
-                "which": "^2.0.1"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/npm/node_modules/cross-spawn/node_modules/which": {
-            "version": "2.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "isexe": "^2.0.0"
-            },
-            "bin": {
-                "node-which": "bin/node-which"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/npm/node_modules/cssesc": {
-            "version": "3.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "bin": {
-                "cssesc": "bin/cssesc"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/npm/node_modules/debug": {
-            "version": "4.3.4",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "ms": "2.1.2"
-            },
-            "engines": {
-                "node": ">=6.0"
-            },
-            "peerDependenciesMeta": {
-                "supports-color": {
-                    "optional": true
-                }
-            }
-        },
-        "node_modules/npm/node_modules/debug/node_modules/ms": {
-            "version": "2.1.2",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/diff": {
-            "version": "5.2.0",
-            "inBundle": true,
-            "license": "BSD-3-Clause",
-            "engines": {
-                "node": ">=0.3.1"
-            }
-        },
-        "node_modules/npm/node_modules/eastasianwidth": {
-            "version": "0.2.0",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/emoji-regex": {
-            "version": "8.0.0",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/encoding": {
-            "version": "0.1.13",
-            "inBundle": true,
-            "license": "MIT",
-            "optional": true,
-            "dependencies": {
-                "iconv-lite": "^0.6.2"
-            }
-        },
-        "node_modules/npm/node_modules/env-paths": {
-            "version": "2.2.1",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=6"
-            }
-        },
-        "node_modules/npm/node_modules/err-code": {
-            "version": "2.0.3",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/exponential-backoff": {
-            "version": "3.1.1",
-            "inBundle": true,
-            "license": "Apache-2.0"
-        },
-        "node_modules/npm/node_modules/fastest-levenshtein": {
-            "version": "1.0.16",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">= 4.9.1"
-            }
-        },
-        "node_modules/npm/node_modules/foreground-child": {
-            "version": "3.1.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "cross-spawn": "^7.0.0",
-                "signal-exit": "^4.0.1"
-            },
-            "engines": {
-                "node": ">=14"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/npm/node_modules/fs-minipass": {
-            "version": "3.0.3",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "minipass": "^7.0.3"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/function-bind": {
-            "version": "1.1.2",
-            "inBundle": true,
-            "license": "MIT",
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/npm/node_modules/glob": {
-            "version": "10.3.15",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "foreground-child": "^3.1.0",
-                "jackspeak": "^2.3.6",
-                "minimatch": "^9.0.1",
-                "minipass": "^7.0.4",
-                "path-scurry": "^1.11.0"
-            },
-            "bin": {
-                "glob": "dist/esm/bin.mjs"
-            },
-            "engines": {
-                "node": ">=16 || 14 >=14.18"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/npm/node_modules/graceful-fs": {
-            "version": "4.2.11",
-            "inBundle": true,
-            "license": "ISC"
-        },
-        "node_modules/npm/node_modules/hasown": {
-            "version": "2.0.2",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "function-bind": "^1.1.2"
-            },
-            "engines": {
-                "node": ">= 0.4"
-            }
-        },
-        "node_modules/npm/node_modules/hosted-git-info": {
-            "version": "7.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "lru-cache": "^10.0.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/http-cache-semantics": {
-            "version": "4.1.1",
-            "inBundle": true,
-            "license": "BSD-2-Clause"
-        },
-        "node_modules/npm/node_modules/http-proxy-agent": {
-            "version": "7.0.2",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "agent-base": "^7.1.0",
-                "debug": "^4.3.4"
-            },
-            "engines": {
-                "node": ">= 14"
-            }
-        },
-        "node_modules/npm/node_modules/https-proxy-agent": {
-            "version": "7.0.4",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "agent-base": "^7.0.2",
-                "debug": "4"
-            },
-            "engines": {
-                "node": ">= 14"
-            }
-        },
-        "node_modules/npm/node_modules/iconv-lite": {
-            "version": "0.6.3",
-            "inBundle": true,
-            "license": "MIT",
-            "optional": true,
-            "dependencies": {
-                "safer-buffer": ">= 2.1.2 < 3.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/npm/node_modules/ignore-walk": {
-            "version": "6.0.5",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "minimatch": "^9.0.0"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/imurmurhash": {
-            "version": "0.1.4",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=0.8.19"
-            }
-        },
-        "node_modules/npm/node_modules/indent-string": {
-            "version": "4.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/ini": {
-            "version": "4.1.2",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/init-package-json": {
-            "version": "6.0.3",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/package-json": "^5.0.0",
-                "npm-package-arg": "^11.0.0",
-                "promzard": "^1.0.0",
-                "read": "^3.0.1",
-                "semver": "^7.3.5",
-                "validate-npm-package-license": "^3.0.4",
-                "validate-npm-package-name": "^5.0.0"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/ip-address": {
-            "version": "9.0.5",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "jsbn": "1.1.0",
-                "sprintf-js": "^1.1.3"
-            },
-            "engines": {
-                "node": ">= 12"
-            }
-        },
-        "node_modules/npm/node_modules/ip-regex": {
-            "version": "5.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/npm/node_modules/is-cidr": {
-            "version": "5.0.5",
-            "inBundle": true,
-            "license": "BSD-2-Clause",
-            "dependencies": {
-                "cidr-regex": "^4.0.4"
-            },
-            "engines": {
-                "node": ">=14"
-            }
-        },
-        "node_modules/npm/node_modules/is-core-module": {
-            "version": "2.13.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "hasown": "^2.0.0"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/ljharb"
-            }
-        },
-        "node_modules/npm/node_modules/is-fullwidth-code-point": {
-            "version": "3.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/is-lambda": {
-            "version": "1.0.1",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/isexe": {
-            "version": "2.0.0",
-            "inBundle": true,
-            "license": "ISC"
-        },
-        "node_modules/npm/node_modules/jackspeak": {
-            "version": "2.3.6",
-            "inBundle": true,
-            "license": "BlueOak-1.0.0",
-            "dependencies": {
-                "@isaacs/cliui": "^8.0.2"
-            },
-            "engines": {
-                "node": ">=14"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            },
-            "optionalDependencies": {
-                "@pkgjs/parseargs": "^0.11.0"
-            }
-        },
-        "node_modules/npm/node_modules/jsbn": {
-            "version": "1.1.0",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/json-parse-even-better-errors": {
-            "version": "3.0.2",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/json-stringify-nice": {
-            "version": "1.1.4",
-            "inBundle": true,
-            "license": "ISC",
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/npm/node_modules/jsonparse": {
-            "version": "1.3.1",
-            "engines": [
-                "node >= 0.2.0"
-            ],
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/just-diff": {
-            "version": "6.0.2",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/just-diff-apply": {
-            "version": "5.5.0",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/libnpmaccess": {
-            "version": "8.0.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "npm-package-arg": "^11.0.2",
-                "npm-registry-fetch": "^17.0.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmdiff": {
-            "version": "6.1.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/arborist": "^7.5.2",
-                "@npmcli/installed-package-contents": "^2.1.0",
-                "binary-extensions": "^2.3.0",
-                "diff": "^5.1.0",
-                "minimatch": "^9.0.4",
-                "npm-package-arg": "^11.0.2",
-                "pacote": "^18.0.6",
-                "tar": "^6.2.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmexec": {
-            "version": "8.1.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/arborist": "^7.5.2",
-                "@npmcli/run-script": "^8.1.0",
-                "ci-info": "^4.0.0",
-                "npm-package-arg": "^11.0.2",
-                "pacote": "^18.0.6",
-                "proc-log": "^4.2.0",
-                "read": "^3.0.1",
-                "read-package-json-fast": "^3.0.2",
-                "semver": "^7.3.7",
-                "walk-up-path": "^3.0.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmfund": {
-            "version": "5.0.10",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/arborist": "^7.5.2"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmhook": {
-            "version": "10.0.5",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "aproba": "^2.0.0",
-                "npm-registry-fetch": "^17.0.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmorg": {
-            "version": "6.0.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "aproba": "^2.0.0",
-                "npm-registry-fetch": "^17.0.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmpack": {
-            "version": "7.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/arborist": "^7.5.2",
-                "@npmcli/run-script": "^8.1.0",
-                "npm-package-arg": "^11.0.2",
-                "pacote": "^18.0.6"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmpublish": {
-            "version": "9.0.8",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "ci-info": "^4.0.0",
-                "normalize-package-data": "^6.0.1",
-                "npm-package-arg": "^11.0.2",
-                "npm-registry-fetch": "^17.0.1",
-                "proc-log": "^4.2.0",
-                "semver": "^7.3.7",
-                "sigstore": "^2.2.0",
-                "ssri": "^10.0.6"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmsearch": {
-            "version": "7.0.5",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "npm-registry-fetch": "^17.0.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmteam": {
-            "version": "6.0.5",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "aproba": "^2.0.0",
-                "npm-registry-fetch": "^17.0.1"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/libnpmversion": {
-            "version": "6.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/git": "^5.0.7",
-                "@npmcli/run-script": "^8.1.0",
-                "json-parse-even-better-errors": "^3.0.2",
-                "proc-log": "^4.2.0",
-                "semver": "^7.3.7"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/lru-cache": {
-            "version": "10.2.2",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "14 || >=16.14"
-            }
-        },
-        "node_modules/npm/node_modules/make-fetch-happen": {
-            "version": "13.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/agent": "^2.0.0",
-                "cacache": "^18.0.0",
-                "http-cache-semantics": "^4.1.1",
-                "is-lambda": "^1.0.1",
-                "minipass": "^7.0.2",
-                "minipass-fetch": "^3.0.0",
-                "minipass-flush": "^1.0.5",
-                "minipass-pipeline": "^1.2.4",
-                "negotiator": "^0.6.3",
-                "proc-log": "^4.2.0",
-                "promise-retry": "^2.0.1",
-                "ssri": "^10.0.0"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/minimatch": {
-            "version": "9.0.4",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "brace-expansion": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=16 || 14 >=14.17"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/npm/node_modules/minipass": {
-            "version": "7.1.1",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": ">=16 || 14 >=14.17"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-collect": {
-            "version": "2.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "minipass": "^7.0.3"
-            },
-            "engines": {
-                "node": ">=16 || 14 >=14.17"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-fetch": {
-            "version": "3.0.5",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "minipass": "^7.0.3",
-                "minipass-sized": "^1.0.3",
-                "minizlib": "^2.1.2"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            },
-            "optionalDependencies": {
-                "encoding": "^0.1.13"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-flush": {
-            "version": "1.0.5",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "minipass": "^3.0.0"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": {
-            "version": "3.3.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-json-stream": {
-            "version": "1.0.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "jsonparse": "^1.3.1",
-                "minipass": "^3.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": {
-            "version": "3.3.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-pipeline": {
-            "version": "1.2.4",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "minipass": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": {
-            "version": "3.3.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-sized": {
-            "version": "1.0.3",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "minipass": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": {
-            "version": "3.3.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/minizlib": {
-            "version": "2.1.2",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "minipass": "^3.0.0",
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">= 8"
-            }
-        },
-        "node_modules/npm/node_modules/minizlib/node_modules/minipass": {
-            "version": "3.3.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/mkdirp": {
-            "version": "1.0.4",
-            "inBundle": true,
-            "license": "MIT",
-            "bin": {
-                "mkdirp": "bin/cmd.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/npm/node_modules/ms": {
-            "version": "2.1.3",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/mute-stream": {
-            "version": "1.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/negotiator": {
-            "version": "0.6.3",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">= 0.6"
-            }
-        },
-        "node_modules/npm/node_modules/node-gyp": {
-            "version": "10.1.0",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "env-paths": "^2.2.0",
-                "exponential-backoff": "^3.1.1",
-                "glob": "^10.3.10",
-                "graceful-fs": "^4.2.6",
-                "make-fetch-happen": "^13.0.0",
-                "nopt": "^7.0.0",
-                "proc-log": "^3.0.0",
-                "semver": "^7.3.5",
-                "tar": "^6.1.2",
-                "which": "^4.0.0"
-            },
-            "bin": {
-                "node-gyp": "bin/node-gyp.js"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": {
-            "version": "3.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/nopt": {
-            "version": "7.2.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "abbrev": "^2.0.0"
-            },
-            "bin": {
-                "nopt": "bin/nopt.js"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/normalize-package-data": {
-            "version": "6.0.1",
-            "inBundle": true,
-            "license": "BSD-2-Clause",
-            "dependencies": {
-                "hosted-git-info": "^7.0.0",
-                "is-core-module": "^2.8.1",
-                "semver": "^7.3.5",
-                "validate-npm-package-license": "^3.0.4"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-audit-report": {
-            "version": "5.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-bundled": {
-            "version": "3.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "npm-normalize-package-bin": "^3.0.0"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-install-checks": {
-            "version": "6.3.0",
-            "inBundle": true,
-            "license": "BSD-2-Clause",
-            "dependencies": {
-                "semver": "^7.1.1"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-normalize-package-bin": {
-            "version": "3.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-package-arg": {
-            "version": "11.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "hosted-git-info": "^7.0.0",
-                "proc-log": "^4.0.0",
-                "semver": "^7.3.5",
-                "validate-npm-package-name": "^5.0.0"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-packlist": {
-            "version": "8.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "ignore-walk": "^6.0.4"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-pick-manifest": {
-            "version": "9.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "npm-install-checks": "^6.0.0",
-                "npm-normalize-package-bin": "^3.0.0",
-                "npm-package-arg": "^11.0.0",
-                "semver": "^7.3.5"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-profile": {
-            "version": "10.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "npm-registry-fetch": "^17.0.1",
-                "proc-log": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-registry-fetch": {
-            "version": "17.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/redact": "^2.0.0",
-                "make-fetch-happen": "^13.0.0",
-                "minipass": "^7.0.2",
-                "minipass-fetch": "^3.0.0",
-                "minipass-json-stream": "^1.0.1",
-                "minizlib": "^2.1.2",
-                "npm-package-arg": "^11.0.0",
-                "proc-log": "^4.0.0"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/npm-user-validate": {
-            "version": "2.0.1",
-            "inBundle": true,
-            "license": "BSD-2-Clause",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/p-map": {
-            "version": "4.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "aggregate-error": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
-        "node_modules/npm/node_modules/pacote": {
-            "version": "18.0.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "@npmcli/git": "^5.0.0",
-                "@npmcli/installed-package-contents": "^2.0.1",
-                "@npmcli/package-json": "^5.1.0",
-                "@npmcli/promise-spawn": "^7.0.0",
-                "@npmcli/run-script": "^8.0.0",
-                "cacache": "^18.0.0",
-                "fs-minipass": "^3.0.0",
-                "minipass": "^7.0.2",
-                "npm-package-arg": "^11.0.0",
-                "npm-packlist": "^8.0.0",
-                "npm-pick-manifest": "^9.0.0",
-                "npm-registry-fetch": "^17.0.0",
-                "proc-log": "^4.0.0",
-                "promise-retry": "^2.0.1",
-                "sigstore": "^2.2.0",
-                "ssri": "^10.0.0",
-                "tar": "^6.1.11"
-            },
-            "bin": {
-                "pacote": "bin/index.js"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/parse-conflict-json": {
-            "version": "3.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "json-parse-even-better-errors": "^3.0.0",
-                "just-diff": "^6.0.0",
-                "just-diff-apply": "^5.2.0"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/path-key": {
-            "version": "3.1.1",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/path-scurry": {
-            "version": "1.11.1",
-            "inBundle": true,
-            "license": "BlueOak-1.0.0",
-            "dependencies": {
-                "lru-cache": "^10.2.0",
-                "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
-            },
-            "engines": {
-                "node": ">=16 || 14 >=14.18"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/npm/node_modules/postcss-selector-parser": {
-            "version": "6.0.16",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "cssesc": "^3.0.0",
-                "util-deprecate": "^1.0.2"
-            },
-            "engines": {
-                "node": ">=4"
-            }
-        },
-        "node_modules/npm/node_modules/proc-log": {
-            "version": "4.2.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/proggy": {
-            "version": "2.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/promise-all-reject-late": {
-            "version": "1.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/npm/node_modules/promise-call-limit": {
-            "version": "3.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/npm/node_modules/promise-inflight": {
-            "version": "1.0.1",
-            "inBundle": true,
-            "license": "ISC"
-        },
-        "node_modules/npm/node_modules/promise-retry": {
-            "version": "2.0.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "err-code": "^2.0.2",
-                "retry": "^0.12.0"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/npm/node_modules/promzard": {
-            "version": "1.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "read": "^3.0.1"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/qrcode-terminal": {
-            "version": "0.12.0",
-            "inBundle": true,
-            "bin": {
-                "qrcode-terminal": "bin/qrcode-terminal.js"
-            }
-        },
-        "node_modules/npm/node_modules/read": {
-            "version": "3.0.1",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "mute-stream": "^1.0.0"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/read-cmd-shim": {
-            "version": "4.0.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/read-package-json-fast": {
-            "version": "3.0.2",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "json-parse-even-better-errors": "^3.0.0",
-                "npm-normalize-package-bin": "^3.0.0"
-            },
-            "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/retry": {
-            "version": "0.12.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">= 4"
-            }
-        },
-        "node_modules/npm/node_modules/safer-buffer": {
-            "version": "2.1.2",
-            "inBundle": true,
-            "license": "MIT",
-            "optional": true
-        },
-        "node_modules/npm/node_modules/semver": {
-            "version": "7.6.2",
-            "inBundle": true,
-            "license": "ISC",
-            "bin": {
-                "semver": "bin/semver.js"
-            },
-            "engines": {
-                "node": ">=10"
-            }
-        },
-        "node_modules/npm/node_modules/shebang-command": {
-            "version": "2.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "shebang-regex": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/shebang-regex": {
-            "version": "3.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">=8"
-            }
-        },
-        "node_modules/npm/node_modules/signal-exit": {
-            "version": "4.1.0",
-            "inBundle": true,
-            "license": "ISC",
-            "engines": {
-                "node": ">=14"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/isaacs"
-            }
-        },
-        "node_modules/npm/node_modules/sigstore": {
-            "version": "2.3.0",
-            "inBundle": true,
-            "license": "Apache-2.0",
-            "dependencies": {
-                "@sigstore/bundle": "^2.3.1",
-                "@sigstore/core": "^1.0.0",
-                "@sigstore/protobuf-specs": "^0.3.1",
-                "@sigstore/sign": "^2.3.0",
-                "@sigstore/tuf": "^2.3.1",
-                "@sigstore/verify": "^1.2.0"
-            },
-            "engines": {
-                "node": "^16.14.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/smart-buffer": {
-            "version": "4.2.0",
-            "inBundle": true,
-            "license": "MIT",
-            "engines": {
-                "node": ">= 6.0.0",
-                "npm": ">= 3.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/socks": {
-            "version": "2.8.3",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "ip-address": "^9.0.5",
-                "smart-buffer": "^4.2.0"
-            },
-            "engines": {
-                "node": ">= 10.0.0",
-                "npm": ">= 3.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/socks-proxy-agent": {
-            "version": "8.0.3",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "agent-base": "^7.1.1",
-                "debug": "^4.3.4",
-                "socks": "^2.7.1"
-            },
-            "engines": {
-                "node": ">= 14"
-            }
-        },
-        "node_modules/npm/node_modules/spdx-correct": {
-            "version": "3.2.0",
-            "inBundle": true,
-            "license": "Apache-2.0",
-            "dependencies": {
-                "spdx-expression-parse": "^3.0.0",
-                "spdx-license-ids": "^3.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": {
-            "version": "3.0.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "spdx-exceptions": "^2.1.0",
-                "spdx-license-ids": "^3.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/spdx-exceptions": {
-            "version": "2.5.0",
-            "inBundle": true,
-            "license": "CC-BY-3.0"
-        },
-        "node_modules/npm/node_modules/spdx-expression-parse": {
-            "version": "4.0.0",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "spdx-exceptions": "^2.1.0",
-                "spdx-license-ids": "^3.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/spdx-license-ids": {
-            "version": "3.0.17",
-            "inBundle": true,
-            "license": "CC0-1.0"
-        },
-        "node_modules/npm/node_modules/sprintf-js": {
-            "version": "1.1.3",
-            "inBundle": true,
-            "license": "BSD-3-Clause"
-        },
-        "node_modules/npm/node_modules/ssri": {
-            "version": "10.0.6",
-            "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "minipass": "^7.0.3"
+                "@npmcli/redact": "^2.0.0",
+                "make-fetch-happen": "^13.0.0",
+                "minipass": "^7.0.2",
+                "minipass-fetch": "^3.0.0",
+                "minipass-json-stream": "^1.0.1",
+                "minizlib": "^2.1.2",
+                "npm-package-arg": "^11.0.0",
+                "proc-log": "^4.0.0"
             },
             "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                "node": "^16.14.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/string-width": {
-            "version": "4.2.3",
-            "inBundle": true,
-            "license": "MIT",
+        "node_modules/npm-run-path": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+            "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+            "dev": true,
             "dependencies": {
-                "emoji-regex": "^8.0.0",
-                "is-fullwidth-code-point": "^3.0.0",
-                "strip-ansi": "^6.0.1"
+                "path-key": "^3.0.0"
             },
             "engines": {
                 "node": ">=8"
             }
         },
-        "node_modules/npm/node_modules/string-width-cjs": {
-            "name": "string-width",
-            "version": "4.2.3",
+        "node_modules/npm-user-validate": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-2.0.1.tgz",
+            "integrity": "sha512-d17PKaF2h8LSGFl5j4b1gHOJt1fgH7YUcCm1kNSJvaLWWKXlBsuUvx0bBEkr0qhsVA9XP5LtRZ83hdlhm2QkgA==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/npm/node_modules/abbrev": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+            "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
             "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "emoji-regex": "^8.0.0",
-                "is-fullwidth-code-point": "^3.0.0",
-                "strip-ansi": "^6.0.1"
-            },
+            "license": "ISC",
             "engines": {
-                "node": ">=8"
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/strip-ansi": {
-            "version": "6.0.1",
+        "node_modules/npm/node_modules/chalk": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+            "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
             "inBundle": true,
             "license": "MIT",
-            "dependencies": {
-                "ansi-regex": "^5.0.1"
-            },
             "engines": {
-                "node": ">=8"
+                "node": "^12.17.0 || ^14.13 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
             }
         },
-        "node_modules/npm/node_modules/strip-ansi-cjs": {
-            "name": "strip-ansi",
-            "version": "6.0.1",
+        "node_modules/npm/node_modules/ci-info": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+            "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/sibiraj-s"
+                }
+            ],
             "inBundle": true,
             "license": "MIT",
-            "dependencies": {
-                "ansi-regex": "^5.0.1"
-            },
             "engines": {
                 "node": ">=8"
             }
         },
-        "node_modules/npm/node_modules/supports-color": {
-            "version": "9.4.0",
+        "node_modules/npm/node_modules/fastest-levenshtein": {
+            "version": "1.0.16",
+            "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+            "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
             "inBundle": true,
             "license": "MIT",
             "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/supports-color?sponsor=1"
+                "node": ">= 4.9.1"
             }
         },
-        "node_modules/npm/node_modules/tar": {
-            "version": "6.2.1",
+        "node_modules/npm/node_modules/fs-minipass": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+            "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
-                "chownr": "^2.0.0",
-                "fs-minipass": "^2.0.0",
-                "minipass": "^5.0.0",
-                "minizlib": "^2.1.1",
-                "mkdirp": "^1.0.3",
-                "yallist": "^4.0.0"
+                "minipass": "^7.0.3"
             },
             "engines": {
-                "node": ">=10"
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/tar/node_modules/fs-minipass": {
-            "version": "2.1.0",
+        "node_modules/npm/node_modules/glob": {
+            "version": "10.3.15",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz",
+            "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
-                "minipass": "^3.0.0"
+                "foreground-child": "^3.1.0",
+                "jackspeak": "^2.3.6",
+                "minimatch": "^9.0.1",
+                "minipass": "^7.0.4",
+                "path-scurry": "^1.11.0"
+            },
+            "bin": {
+                "glob": "dist/esm/bin.mjs"
             },
             "engines": {
-                "node": ">= 8"
+                "node": ">=16 || 14 >=14.18"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
             }
         },
-        "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
-            "version": "3.3.6",
+        "node_modules/npm/node_modules/graceful-fs": {
+            "version": "4.2.11",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+            "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
             "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "yallist": "^4.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
+            "license": "ISC"
         },
-        "node_modules/npm/node_modules/tar/node_modules/minipass": {
-            "version": "5.0.0",
+        "node_modules/npm/node_modules/ini": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz",
+            "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==",
             "inBundle": true,
             "license": "ISC",
             "engines": {
-                "node": ">=8"
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/text-table": {
-            "version": "0.2.0",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/tiny-relative-date": {
-            "version": "1.3.0",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/treeverse": {
-            "version": "3.0.0",
+        "node_modules/npm/node_modules/isexe": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+            "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
             "inBundle": true,
             "license": "ISC",
             "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                "node": ">=16"
             }
         },
-        "node_modules/npm/node_modules/tuf-js": {
-            "version": "2.2.1",
+        "node_modules/npm/node_modules/jackspeak": {
+            "version": "2.3.6",
+            "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+            "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
             "inBundle": true,
-            "license": "MIT",
+            "license": "BlueOak-1.0.0",
             "dependencies": {
-                "@tufjs/models": "2.0.1",
-                "debug": "^4.3.4",
-                "make-fetch-happen": "^13.0.1"
+                "@isaacs/cliui": "^8.0.2"
             },
             "engines": {
-                "node": "^16.14.0 || >=18.0.0"
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            },
+            "optionalDependencies": {
+                "@pkgjs/parseargs": "^0.11.0"
             }
         },
-        "node_modules/npm/node_modules/unique-filename": {
-            "version": "3.0.0",
+        "node_modules/npm/node_modules/json-parse-even-better-errors": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+            "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
             "inBundle": true,
-            "license": "ISC",
-            "dependencies": {
-                "unique-slug": "^4.0.0"
-            },
+            "license": "MIT",
             "engines": {
                 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/unique-slug": {
-            "version": "4.0.0",
+        "node_modules/npm/node_modules/minimatch": {
+            "version": "9.0.4",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+            "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
-                "imurmurhash": "^0.1.4"
+                "brace-expansion": "^2.0.1"
             },
             "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/util-deprecate": {
-            "version": "1.0.2",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/validate-npm-package-license": {
-            "version": "3.0.4",
-            "inBundle": true,
-            "license": "Apache-2.0",
-            "dependencies": {
-                "spdx-correct": "^3.0.0",
-                "spdx-expression-parse": "^3.0.0"
-            }
-        },
-        "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
-            "version": "3.0.1",
-            "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "spdx-exceptions": "^2.1.0",
-                "spdx-license-ids": "^3.0.0"
+                "node": ">=16 || 14 >=14.17"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
             }
         },
-        "node_modules/npm/node_modules/validate-npm-package-name": {
-            "version": "5.0.1",
+        "node_modules/npm/node_modules/minipass": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz",
+            "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==",
             "inBundle": true,
             "license": "ISC",
             "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                "node": ">=16 || 14 >=14.17"
             }
         },
-        "node_modules/npm/node_modules/walk-up-path": {
-            "version": "3.0.1",
+        "node_modules/npm/node_modules/ms": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+            "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
             "inBundle": true,
-            "license": "ISC"
+            "license": "MIT"
         },
-        "node_modules/npm/node_modules/which": {
-            "version": "4.0.0",
+        "node_modules/npm/node_modules/nopt": {
+            "version": "7.2.1",
+            "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+            "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
-                "isexe": "^3.1.1"
+                "abbrev": "^2.0.0"
             },
             "bin": {
-                "node-which": "bin/which.js"
+                "nopt": "bin/nopt.js"
             },
             "engines": {
-                "node": "^16.13.0 || >=18.0.0"
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
-        "node_modules/npm/node_modules/which/node_modules/isexe": {
-            "version": "3.1.1",
+        "node_modules/npm/node_modules/semver": {
+            "version": "7.6.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+            "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
             "inBundle": true,
             "license": "ISC",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
             "engines": {
-                "node": ">=16"
+                "node": ">=10"
             }
         },
-        "node_modules/npm/node_modules/wrap-ansi": {
-            "version": "8.1.0",
+        "node_modules/npm/node_modules/supports-color": {
+            "version": "9.4.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz",
+            "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==",
             "inBundle": true,
             "license": "MIT",
-            "dependencies": {
-                "ansi-styles": "^6.1.0",
-                "string-width": "^5.0.1",
-                "strip-ansi": "^7.0.1"
-            },
             "engines": {
                 "node": ">=12"
             },
             "funding": {
-                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+                "url": "https://github.com/chalk/supports-color?sponsor=1"
             }
         },
-        "node_modules/npm/node_modules/wrap-ansi-cjs": {
-            "name": "wrap-ansi",
-            "version": "7.0.0",
+        "node_modules/npm/node_modules/tar": {
+            "version": "6.2.1",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+            "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
             "inBundle": true,
-            "license": "MIT",
+            "license": "ISC",
             "dependencies": {
-                "ansi-styles": "^4.0.0",
-                "string-width": "^4.1.0",
-                "strip-ansi": "^6.0.0"
+                "chownr": "^2.0.0",
+                "fs-minipass": "^2.0.0",
+                "minipass": "^5.0.0",
+                "minizlib": "^2.1.1",
+                "mkdirp": "^1.0.3",
+                "yallist": "^4.0.0"
             },
             "engines": {
                 "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
             }
         },
-        "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
-            "version": "4.3.0",
+        "node_modules/npm/node_modules/tar/node_modules/fs-minipass": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+            "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
             "inBundle": true,
-            "license": "MIT",
+            "license": "ISC",
             "dependencies": {
-                "color-convert": "^2.0.1"
-            },
-            "engines": {
-                "node": ">=8"
+                "minipass": "^3.0.0"
             },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-            }
-        },
-        "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": {
-            "version": "6.0.1",
-            "inBundle": true,
-            "license": "MIT",
             "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+                "node": ">= 8"
             }
         },
-        "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": {
-            "version": "9.2.2",
-            "inBundle": true,
-            "license": "MIT"
-        },
-        "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": {
-            "version": "5.1.2",
+        "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
             "inBundle": true,
-            "license": "MIT",
+            "license": "ISC",
             "dependencies": {
-                "eastasianwidth": "^0.2.0",
-                "emoji-regex": "^9.2.2",
-                "strip-ansi": "^7.0.1"
+                "yallist": "^4.0.0"
             },
             "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
+                "node": ">=8"
             }
         },
-        "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": {
-            "version": "7.1.0",
+        "node_modules/npm/node_modules/tar/node_modules/minipass": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+            "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
             "inBundle": true,
-            "license": "MIT",
-            "dependencies": {
-                "ansi-regex": "^6.0.1"
-            },
+            "license": "ISC",
             "engines": {
-                "node": ">=12"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+                "node": ">=8"
             }
         },
-        "node_modules/npm/node_modules/write-file-atomic": {
-            "version": "5.0.1",
+        "node_modules/npm/node_modules/text-table": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+            "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+            "inBundle": true,
+            "license": "MIT"
+        },
+        "node_modules/npm/node_modules/which": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+            "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
             "inBundle": true,
             "license": "ISC",
             "dependencies": {
-                "imurmurhash": "^0.1.4",
-                "signal-exit": "^4.0.1"
+                "isexe": "^3.1.1"
+            },
+            "bin": {
+                "node-which": "bin/which.js"
             },
             "engines": {
-                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                "node": "^16.13.0 || >=18.0.0"
             }
         },
         "node_modules/npm/node_modules/yallist": {
             "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
             "inBundle": true,
             "license": "ISC"
         },
@@ -33768,6 +33515,7 @@
             "version": "5.0.1",
             "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
             "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+            "deprecated": "This package is no longer supported.",
             "dependencies": {
                 "are-we-there-yet": "^2.0.0",
                 "console-control-strings": "^1.1.0",
@@ -34074,7 +33822,6 @@
         },
         "node_modules/openai": {
             "version": "4.47.1",
-            "resolved": "https://registry.npmjs.org/openai/-/openai-4.47.1.tgz",
             "integrity": "sha512-WWSxhC/69ZhYWxH/OBsLEirIjUcfpQ5+ihkXKp06hmeYXgBBIUCa9IptMzYx6NdkiOCsSGYCnTIsxaic3AjRCQ==",
             "dependencies": {
                 "@types/node": "^18.11.18",
@@ -34209,6 +33956,20 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/p-map": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+            "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+            "dependencies": {
+                "aggregate-error": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
         "node_modules/p-retry": {
             "version": "6.2.0",
             "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz",
@@ -34226,12 +33987,45 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
-        "node_modules/p-try": {
-            "version": "2.2.0",
-            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+        "node_modules/pacote": {
+            "version": "18.0.6",
+            "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz",
+            "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==",
+            "dependencies": {
+                "@npmcli/git": "^5.0.0",
+                "@npmcli/installed-package-contents": "^2.0.1",
+                "@npmcli/package-json": "^5.1.0",
+                "@npmcli/promise-spawn": "^7.0.0",
+                "@npmcli/run-script": "^8.0.0",
+                "cacache": "^18.0.0",
+                "fs-minipass": "^3.0.0",
+                "minipass": "^7.0.2",
+                "npm-package-arg": "^11.0.0",
+                "npm-packlist": "^8.0.0",
+                "npm-pick-manifest": "^9.0.0",
+                "npm-registry-fetch": "^17.0.0",
+                "proc-log": "^4.0.0",
+                "promise-retry": "^2.0.1",
+                "sigstore": "^2.2.0",
+                "ssri": "^10.0.0",
+                "tar": "^6.1.11"
+            },
+            "bin": {
+                "pacote": "bin/index.js"
+            },
             "engines": {
-                "node": ">=6"
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/pacote/node_modules/fs-minipass": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+            "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+            "dependencies": {
+                "minipass": "^7.0.3"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
             }
         },
         "node_modules/pako": {
@@ -34278,6 +34072,27 @@
                 "xml2js": "^0.5.0"
             }
         },
+        "node_modules/parse-conflict-json": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz",
+            "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==",
+            "dependencies": {
+                "json-parse-even-better-errors": "^3.0.0",
+                "just-diff": "^6.0.0",
+                "just-diff-apply": "^5.2.0"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+            "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/parse-entities": {
             "version": "4.0.1",
             "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz",
@@ -34576,7 +34391,6 @@
         },
         "node_modules/pdfjs-dist": {
             "version": "4.2.67",
-            "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.2.67.tgz",
             "integrity": "sha512-rJmuBDFpD7cqC8WIkQUEClyB4UAH05K4AsyewToMTp2gSy3Rrx8c1ydAVqlJlGv3yZSOrhEERQU/4ScQQFlLHA==",
             "engines": {
                 "node": ">=18"
@@ -34893,9 +34707,9 @@
             }
         },
         "node_modules/postcss-selector-parser": {
-            "version": "6.0.16",
-            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
-            "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
+            "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
             "dependencies": {
                 "cssesc": "^3.0.0",
                 "util-deprecate": "^1.0.2"
@@ -34933,7 +34747,6 @@
         },
         "node_modules/prettier": {
             "version": "3.2.5",
-            "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
             "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
             "dev": true,
             "bin": {
@@ -34977,6 +34790,14 @@
                 "stream-parser": "~0.3.1"
             }
         },
+        "node_modules/proc-log": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
+            "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/process": {
             "version": "0.11.10",
             "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -34990,6 +34811,14 @@
             "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
             "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
         },
+        "node_modules/proggy": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz",
+            "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/progress": {
             "version": "2.0.3",
             "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -35007,6 +34836,58 @@
                 "asap": "~2.0.3"
             }
         },
+        "node_modules/promise-all-reject-late": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz",
+            "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==",
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/promise-call-limit": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.1.tgz",
+            "integrity": "sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg==",
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/promise-inflight": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+            "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="
+        },
+        "node_modules/promise-retry": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+            "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+            "dependencies": {
+                "err-code": "^2.0.2",
+                "retry": "^0.12.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/promise-retry/node_modules/retry": {
+            "version": "0.12.0",
+            "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+            "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+            "engines": {
+                "node": ">= 4"
+            }
+        },
+        "node_modules/promzard": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz",
+            "integrity": "sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==",
+            "dependencies": {
+                "read": "^3.0.1"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/prop-types": {
             "version": "15.8.1",
             "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -35086,9 +34967,9 @@
             }
         },
         "node_modules/prosemirror-model": {
-            "version": "1.21.0",
-            "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.0.tgz",
-            "integrity": "sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA==",
+            "version": "1.21.1",
+            "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.1.tgz",
+            "integrity": "sha512-IVBAuMqOfltTr7yPypwpfdGT+6rGAteVOw2FO6GEvCGGa1ZwxLseqC1Eax/EChDvG/xGquB2d/hLdgh3THpsYg==",
             "dependencies": {
                 "orderedmap": "^2.0.0"
             }
@@ -35122,9 +35003,9 @@
             }
         },
         "node_modules/prosemirror-view": {
-            "version": "1.33.6",
-            "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.6.tgz",
-            "integrity": "sha512-zRLUNgLIQfd8IfGprsXxWTjdA8xEAFJe8cDNrOptj6Mop9sj+BMeVbJvceyAYCm5G2dOdT2prctH7K9dfnpIMw==",
+            "version": "1.33.8",
+            "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.8.tgz",
+            "integrity": "sha512-4PhMr/ufz2cdvFgpUAnZfs+0xij3RsFysreeG9V/utpwX7AJtYCDVyuRxzWoMJIEf4C7wVihuBNMPpFLPCiLQw==",
             "dependencies": {
                 "prosemirror-model": "^1.20.0",
                 "prosemirror-state": "^1.0.0",
@@ -35165,7 +35046,6 @@
         },
         "node_modules/pug": {
             "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz",
             "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==",
             "dependencies": {
                 "pug-code-gen": "^3.0.2",
@@ -35295,11 +35175,20 @@
             "version": "1.5.1",
             "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
             "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+            "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
             "engines": {
                 "node": ">=0.6.0",
                 "teleport": ">=0.2.0"
             }
         },
+        "node_modules/qrcode-terminal": {
+            "version": "0.12.0",
+            "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
+            "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
+            "bin": {
+                "qrcode-terminal": "bin/qrcode-terminal.js"
+            }
+        },
         "node_modules/qs": {
             "version": "6.11.0",
             "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
@@ -35508,7 +35397,6 @@
         },
         "node_modules/react": {
             "version": "18.3.1",
-            "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
             "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
             "dependencies": {
                 "loose-envify": "^1.1.0"
@@ -35518,47 +35406,47 @@
             }
         },
         "node_modules/react-aria": {
-            "version": "3.33.0",
-            "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.33.0.tgz",
-            "integrity": "sha512-aKn9SQn5TMlmpUsIjfRMtse2v3okGcSo+gWLGrj9JVjxs4PL4FSU4mclj4Bg2JUXZTGgfLSq6PWUBzQ4gIP2zg==",
-            "dependencies": {
-                "@internationalized/string": "^3.2.2",
-                "@react-aria/breadcrumbs": "^3.5.12",
-                "@react-aria/button": "^3.9.4",
-                "@react-aria/calendar": "^3.5.7",
-                "@react-aria/checkbox": "^3.14.2",
-                "@react-aria/combobox": "^3.9.0",
-                "@react-aria/datepicker": "^3.10.0",
-                "@react-aria/dialog": "^3.5.13",
-                "@react-aria/dnd": "^3.6.0",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/gridlist": "^3.8.0",
-                "@react-aria/i18n": "^3.11.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/label": "^3.7.7",
-                "@react-aria/link": "^3.7.0",
-                "@react-aria/listbox": "^3.12.0",
-                "@react-aria/menu": "^3.14.0",
-                "@react-aria/meter": "^3.4.12",
-                "@react-aria/numberfield": "^3.11.2",
-                "@react-aria/overlays": "^3.22.0",
-                "@react-aria/progress": "^3.4.12",
-                "@react-aria/radio": "^3.10.3",
-                "@react-aria/searchfield": "^3.7.4",
-                "@react-aria/select": "^3.14.4",
-                "@react-aria/selection": "^3.18.0",
-                "@react-aria/separator": "^3.3.12",
-                "@react-aria/slider": "^3.7.7",
-                "@react-aria/ssr": "^3.9.3",
-                "@react-aria/switch": "^3.6.3",
-                "@react-aria/table": "^3.14.0",
-                "@react-aria/tabs": "^3.9.0",
-                "@react-aria/tag": "^3.4.0",
-                "@react-aria/textfield": "^3.14.4",
-                "@react-aria/tooltip": "^3.7.3",
-                "@react-aria/utils": "^3.24.0",
-                "@react-aria/visually-hidden": "^3.8.11",
-                "@react-types/shared": "^3.23.0"
+            "version": "3.33.1",
+            "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.33.1.tgz",
+            "integrity": "sha512-hFC3K/UA+90Krlx2IgRTgzFbC6FSPi4pUwHT+STperPLK+cTEHkI+3Lu0YYwQSBatkgxnIv9+GtFuVbps2kROw==",
+            "dependencies": {
+                "@internationalized/string": "^3.2.3",
+                "@react-aria/breadcrumbs": "^3.5.13",
+                "@react-aria/button": "^3.9.5",
+                "@react-aria/calendar": "^3.5.8",
+                "@react-aria/checkbox": "^3.14.3",
+                "@react-aria/combobox": "^3.9.1",
+                "@react-aria/datepicker": "^3.10.1",
+                "@react-aria/dialog": "^3.5.14",
+                "@react-aria/dnd": "^3.6.1",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/gridlist": "^3.8.1",
+                "@react-aria/i18n": "^3.11.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/label": "^3.7.8",
+                "@react-aria/link": "^3.7.1",
+                "@react-aria/listbox": "^3.12.1",
+                "@react-aria/menu": "^3.14.1",
+                "@react-aria/meter": "^3.4.13",
+                "@react-aria/numberfield": "^3.11.3",
+                "@react-aria/overlays": "^3.22.1",
+                "@react-aria/progress": "^3.4.13",
+                "@react-aria/radio": "^3.10.4",
+                "@react-aria/searchfield": "^3.7.5",
+                "@react-aria/select": "^3.14.5",
+                "@react-aria/selection": "^3.18.1",
+                "@react-aria/separator": "^3.3.13",
+                "@react-aria/slider": "^3.7.8",
+                "@react-aria/ssr": "^3.9.4",
+                "@react-aria/switch": "^3.6.4",
+                "@react-aria/table": "^3.14.1",
+                "@react-aria/tabs": "^3.9.1",
+                "@react-aria/tag": "^3.4.1",
+                "@react-aria/textfield": "^3.14.5",
+                "@react-aria/tooltip": "^3.7.4",
+                "@react-aria/utils": "^3.24.1",
+                "@react-aria/visually-hidden": "^3.8.12",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0",
@@ -35566,32 +35454,32 @@
             }
         },
         "node_modules/react-aria-components": {
-            "version": "1.2.0",
-            "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.2.0.tgz",
-            "integrity": "sha512-Cqr1tewYe/SgNcVOptqYdm0PPAV0Xsvd2uzWX7EqJsPGHvKStl/mh2a3Ebe6dYuoOddLsqqj36DdiLC5Pb5okw==",
-            "dependencies": {
-                "@internationalized/date": "^3.5.3",
-                "@internationalized/string": "^3.2.2",
-                "@react-aria/color": "3.0.0-beta.32",
-                "@react-aria/focus": "^3.17.0",
-                "@react-aria/interactions": "^3.21.2",
-                "@react-aria/menu": "^3.14.0",
-                "@react-aria/toolbar": "3.0.0-beta.4",
-                "@react-aria/tree": "3.0.0-alpha.0",
-                "@react-aria/utils": "^3.24.0",
-                "@react-stately/color": "^3.6.0",
-                "@react-stately/menu": "^3.7.0",
-                "@react-stately/table": "^3.11.7",
-                "@react-stately/utils": "^3.10.0",
-                "@react-types/color": "3.0.0-beta.24",
-                "@react-types/form": "^3.7.3",
-                "@react-types/grid": "^3.2.5",
-                "@react-types/shared": "^3.23.0",
-                "@react-types/table": "^3.9.4",
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.2.1.tgz",
+            "integrity": "sha512-iGIdDjbTyLLn0/tGUyBQxxu+E1bw4/H4AU89d0cRcu8yIdw6MXG29YElmRHn0ugiyrERrk/YQALihstnns5kRQ==",
+            "dependencies": {
+                "@internationalized/date": "^3.5.4",
+                "@internationalized/string": "^3.2.3",
+                "@react-aria/color": "3.0.0-beta.33",
+                "@react-aria/focus": "^3.17.1",
+                "@react-aria/interactions": "^3.21.3",
+                "@react-aria/menu": "^3.14.1",
+                "@react-aria/toolbar": "3.0.0-beta.5",
+                "@react-aria/tree": "3.0.0-alpha.1",
+                "@react-aria/utils": "^3.24.1",
+                "@react-stately/color": "^3.6.1",
+                "@react-stately/menu": "^3.7.1",
+                "@react-stately/table": "^3.11.8",
+                "@react-stately/utils": "^3.10.1",
+                "@react-types/color": "3.0.0-beta.25",
+                "@react-types/form": "^3.7.4",
+                "@react-types/grid": "^3.2.6",
+                "@react-types/shared": "^3.23.1",
+                "@react-types/table": "^3.9.5",
                 "@swc/helpers": "^0.5.0",
                 "client-only": "^0.0.1",
-                "react-aria": "^3.33.0",
-                "react-stately": "^3.31.0",
+                "react-aria": "^3.33.1",
+                "react-stately": "^3.31.1",
                 "use-sync-external-store": "^1.2.0"
             },
             "peerDependencies": {
@@ -35616,7 +35504,6 @@
         },
         "node_modules/react-awesome-reveal": {
             "version": "4.2.11",
-            "resolved": "https://registry.npmjs.org/react-awesome-reveal/-/react-awesome-reveal-4.2.11.tgz",
             "integrity": "sha512-BXdU3nzZkRYf6h2lIx4SCMEERhIQd7wKheHKRH8U9601m1U2W4LrwEpKbpUxIPWSjcUwci4w7EotdfF+9ZQHhQ==",
             "funding": [
                 {
@@ -35682,7 +35569,6 @@
         },
         "node_modules/react-datepicker": {
             "version": "6.9.0",
-            "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-6.9.0.tgz",
             "integrity": "sha512-QTxuzeem7BUfVFWv+g5WuvzT0c5BPo+XTCNbMTZKSZQLU+cMMwSUHwspaxuIcDlwNcOH0tiJ+bh1fJ2yxOGYWA==",
             "dependencies": {
                 "@floating-ui/react": "^0.26.2",
@@ -35698,7 +35584,6 @@
         },
         "node_modules/react-dom": {
             "version": "18.3.1",
-            "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
             "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
             "dependencies": {
                 "loose-envify": "^1.1.0",
@@ -35748,7 +35633,6 @@
         },
         "node_modules/react-icons": {
             "version": "5.2.1",
-            "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz",
             "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==",
             "peerDependencies": {
                 "react": "*"
@@ -35775,7 +35659,6 @@
         },
         "node_modules/react-jsx-parser": {
             "version": "1.29.0",
-            "resolved": "https://registry.npmjs.org/react-jsx-parser/-/react-jsx-parser-1.29.0.tgz",
             "integrity": "sha512-u0svZd0UsPffRrIK0sTbox54jhEbTmg6ED9ob5FQahp1DeOpd2Rq+KiSTIFNYkZUL+WZi4Ntia/Oj5T4lDJafQ==",
             "hasInstallScript": true,
             "dependencies": {
@@ -35814,9 +35697,14 @@
                 "@types/react": "^17"
             }
         },
+        "node_modules/react-jsx-parser/node_modules/@types/react/node_modules/@types/scheduler": {
+            "version": "0.16.8",
+            "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+            "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
+            "optional": true
+        },
         "node_modules/react-latex-next": {
             "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/react-latex-next/-/react-latex-next-3.0.0.tgz",
             "integrity": "sha512-x70f1b1G7TronVigsRgKHKYYVUNfZk/3bciFyYX1lYLQH2y3/TXku3+5Vap8MDbJhtopePSYBsYWS6jhzIdz+g==",
             "dependencies": {
                 "katex": "^0.16.0"
@@ -35969,34 +35857,42 @@
                 "node": ">=6.0.0"
             }
         },
+        "node_modules/react-speech-recognition": {
+            "version": "3.10.0",
+            "resolved": "https://registry.npmjs.org/react-speech-recognition/-/react-speech-recognition-3.10.0.tgz",
+            "integrity": "sha512-EVSr4Ik8l9urwdPiK2r0+ADrLyDDrjB0qBRdUWO+w2MfwEBrj6NuRmy1GD3x7BU/V6/hab0pl8Lupen0zwlJyw==",
+            "peerDependencies": {
+                "react": ">=16.8.0"
+            }
+        },
         "node_modules/react-stately": {
-            "version": "3.31.0",
-            "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.31.0.tgz",
-            "integrity": "sha512-G6y7t6qpP3LU4mLM2RlRTgdW5eiZrR2yB0XZbLo8qVplazxyRzlDJRBdE8OBTpw2SO1q5Auub3NOTH3vH0qCHg==",
-            "dependencies": {
-                "@react-stately/calendar": "^3.5.0",
-                "@react-stately/checkbox": "^3.6.4",
-                "@react-stately/collections": "^3.10.6",
-                "@react-stately/combobox": "^3.8.3",
-                "@react-stately/data": "^3.11.3",
-                "@react-stately/datepicker": "^3.9.3",
-                "@react-stately/dnd": "^3.3.0",
-                "@react-stately/form": "^3.0.2",
-                "@react-stately/list": "^3.10.4",
-                "@react-stately/menu": "^3.7.0",
-                "@react-stately/numberfield": "^3.9.2",
-                "@react-stately/overlays": "^3.6.6",
-                "@react-stately/radio": "^3.10.3",
-                "@react-stately/searchfield": "^3.5.2",
-                "@react-stately/select": "^3.6.3",
-                "@react-stately/selection": "^3.15.0",
-                "@react-stately/slider": "^3.5.3",
-                "@react-stately/table": "^3.11.7",
-                "@react-stately/tabs": "^3.6.5",
-                "@react-stately/toggle": "^3.7.3",
-                "@react-stately/tooltip": "^3.4.8",
-                "@react-stately/tree": "^3.8.0",
-                "@react-types/shared": "^3.23.0"
+            "version": "3.31.1",
+            "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.31.1.tgz",
+            "integrity": "sha512-wuq673NHkYSdoceGryjtMJJvB9iQgyDkQDsnTN0t2v91pXjGDsN/EcOvnUrxXSBtY9eLdIw74R54z9GX5cJNEg==",
+            "dependencies": {
+                "@react-stately/calendar": "^3.5.1",
+                "@react-stately/checkbox": "^3.6.5",
+                "@react-stately/collections": "^3.10.7",
+                "@react-stately/combobox": "^3.8.4",
+                "@react-stately/data": "^3.11.4",
+                "@react-stately/datepicker": "^3.9.4",
+                "@react-stately/dnd": "^3.3.1",
+                "@react-stately/form": "^3.0.3",
+                "@react-stately/list": "^3.10.5",
+                "@react-stately/menu": "^3.7.1",
+                "@react-stately/numberfield": "^3.9.3",
+                "@react-stately/overlays": "^3.6.7",
+                "@react-stately/radio": "^3.10.4",
+                "@react-stately/searchfield": "^3.5.3",
+                "@react-stately/select": "^3.6.4",
+                "@react-stately/selection": "^3.15.1",
+                "@react-stately/slider": "^3.5.4",
+                "@react-stately/table": "^3.11.8",
+                "@react-stately/tabs": "^3.6.6",
+                "@react-stately/toggle": "^3.7.4",
+                "@react-stately/tooltip": "^3.4.9",
+                "@react-stately/tree": "^3.8.1",
+                "@react-types/shared": "^3.23.1"
             },
             "peerDependencies": {
                 "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
@@ -36004,7 +35900,6 @@
         },
         "node_modules/react-textarea-autosize": {
             "version": "8.5.3",
-            "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz",
             "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==",
             "dependencies": {
                 "@babel/runtime": "^7.20.13",
@@ -36084,6 +35979,53 @@
                 "lodash": "^4.0.1"
             }
         },
+        "node_modules/read": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz",
+            "integrity": "sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==",
+            "dependencies": {
+                "mute-stream": "^1.0.0"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/read-cmd-shim": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz",
+            "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/read-package-json-fast": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
+            "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
+            "dependencies": {
+                "json-parse-even-better-errors": "^3.0.0",
+                "npm-normalize-package-bin": "^3.0.0"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
+            "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/read/node_modules/mute-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
+            "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/readable-stream": {
             "version": "4.5.2",
             "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
@@ -36122,6 +36064,14 @@
                 "ieee754": "^1.2.1"
             }
         },
+        "node_modules/readable-stream/node_modules/string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "dependencies": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
         "node_modules/readable-web-to-node-stream": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz",
@@ -36150,6 +36100,14 @@
                 "node": ">= 6"
             }
         },
+        "node_modules/readable-web-to-node-stream/node_modules/readable-stream/node_modules/string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "dependencies": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
         "node_modules/readdir-glob": {
             "version": "1.1.3",
             "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
@@ -36187,7 +36145,6 @@
         },
         "node_modules/recharts": {
             "version": "2.12.7",
-            "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.7.tgz",
             "integrity": "sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==",
             "dependencies": {
                 "clsx": "^2.0.0",
@@ -36355,7 +36312,6 @@
         },
         "node_modules/rehype-katex": {
             "version": "7.0.0",
-            "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.0.tgz",
             "integrity": "sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==",
             "dependencies": {
                 "@types/hast": "^3.0.0",
@@ -36420,7 +36376,6 @@
         },
         "node_modules/remark-math": {
             "version": "6.0.0",
-            "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz",
             "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==",
             "dependencies": {
                 "@types/mdast": "^4.0.0",
@@ -36464,11 +36419,6 @@
                 "@types/unist": "*"
             }
         },
-        "node_modules/remark-parse/node_modules/@types/unist": {
-            "version": "3.0.2",
-            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
-            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
-        },
         "node_modules/remark-parse/node_modules/mdast-util-from-markdown": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
@@ -36492,6 +36442,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/remark-parse/node_modules/mdast-util-from-markdown/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/remark-parse/node_modules/mdast-util-to-string": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
@@ -36937,6 +36892,11 @@
                 "url": "https://opencollective.com/unified"
             }
         },
+        "node_modules/remark-parse/node_modules/unist-util-stringify-position/node_modules/@types/unist": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+            "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+        },
         "node_modules/remark-rehype": {
             "version": "11.1.0",
             "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz",
@@ -37508,7 +37468,6 @@
         },
         "node_modules/sass": {
             "version": "1.77.2",
-            "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz",
             "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==",
             "dependencies": {
                 "chokidar": ">=3.0.0 <4.0.0",
@@ -37524,7 +37483,6 @@
         },
         "node_modules/sass-loader": {
             "version": "14.2.1",
-            "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz",
             "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==",
             "dependencies": {
                 "neo-async": "^2.6.2"
@@ -37605,9 +37563,9 @@
             }
         },
         "node_modules/schema-utils/node_modules/ajv": {
-            "version": "8.13.0",
-            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz",
-            "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==",
+            "version": "8.16.0",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
+            "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
             "dependencies": {
                 "fast-deep-equal": "^3.1.3",
                 "json-schema-traverse": "^1.0.0",
@@ -37981,6 +37939,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dependencies": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -38040,6 +37999,34 @@
                 "url": "https://github.com/sponsors/isaacs"
             }
         },
+        "node_modules/sigstore": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz",
+            "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==",
+            "dependencies": {
+                "@sigstore/bundle": "^2.3.2",
+                "@sigstore/core": "^1.0.0",
+                "@sigstore/protobuf-specs": "^0.3.2",
+                "@sigstore/sign": "^2.3.2",
+                "@sigstore/tuf": "^2.3.4",
+                "@sigstore/verify": "^1.2.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
+        "node_modules/sigstore/node_modules/@sigstore/tuf": {
+            "version": "2.3.4",
+            "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz",
+            "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==",
+            "dependencies": {
+                "@sigstore/protobuf-specs": "^0.3.2",
+                "tuf-js": "^2.2.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
         "node_modules/simple-concat": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
@@ -38162,6 +38149,15 @@
                 "node": ">=4"
             }
         },
+        "node_modules/smart-buffer": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+            "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+            "engines": {
+                "node": ">= 6.0.0",
+                "npm": ">= 3.0.0"
+            }
+        },
         "node_modules/socket.io": {
             "version": "4.7.5",
             "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz",
@@ -38254,22 +38250,41 @@
                 "uuid": "dist/bin/uuid"
             }
         },
-        "node_modules/sonic-forest": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/sonic-forest/-/sonic-forest-1.0.3.tgz",
-            "integrity": "sha512-dtwajos6IWMEWXdEbW1IkEkyL2gztCAgDplRIX+OT5aRKnEd5e7r7YCxRgXZdhRP1FBdOBf8axeTPhzDv8T4wQ==",
+        "node_modules/socks": {
+            "version": "2.8.3",
+            "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
+            "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
             "dependencies": {
-                "tree-dump": "^1.0.0"
+                "ip-address": "^9.0.5",
+                "smart-buffer": "^4.2.0"
             },
             "engines": {
-                "node": ">=10.0"
+                "node": ">= 10.0.0",
+                "npm": ">= 3.0.0"
+            }
+        },
+        "node_modules/socks-proxy-agent": {
+            "version": "8.0.3",
+            "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz",
+            "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==",
+            "dependencies": {
+                "agent-base": "^7.1.1",
+                "debug": "^4.3.4",
+                "socks": "^2.7.1"
             },
-            "funding": {
-                "type": "github",
-                "url": "https://github.com/sponsors/streamich"
+            "engines": {
+                "node": ">= 14"
+            }
+        },
+        "node_modules/socks-proxy-agent/node_modules/agent-base": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+            "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+            "dependencies": {
+                "debug": "^4.3.4"
             },
-            "peerDependencies": {
-                "tslib": "2"
+            "engines": {
+                "node": ">= 14"
             }
         },
         "node_modules/sort-asc": {
@@ -38354,6 +38369,43 @@
                 "memory-pager": "^1.0.2"
             }
         },
+        "node_modules/spdx-correct": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+            "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+            "dependencies": {
+                "spdx-expression-parse": "^3.0.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+            "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+            "dependencies": {
+                "spdx-exceptions": "^2.1.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/spdx-exceptions": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+            "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="
+        },
+        "node_modules/spdx-expression-parse": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+            "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+            "dependencies": {
+                "spdx-exceptions": "^2.1.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/spdx-license-ids": {
+            "version": "3.0.18",
+            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
+            "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ=="
+        },
         "node_modules/spdy": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
@@ -38500,6 +38552,17 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/ssri": {
+            "version": "10.0.6",
+            "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+            "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+            "dependencies": {
+                "minipass": "^7.0.3"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/standard-error": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/standard-error/-/standard-error-1.1.0.tgz",
@@ -38593,13 +38656,18 @@
             }
         },
         "node_modules/string_decoder": {
-            "version": "1.3.0",
-            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+            "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
             "dependencies": {
-                "safe-buffer": "~5.2.0"
+                "safe-buffer": "~5.1.0"
             }
         },
+        "node_modules/string_decoder/node_modules/safe-buffer": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+            "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
         "node_modules/string-width": {
             "version": "5.1.2",
             "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
@@ -38625,9 +38693,6 @@
                 "emoji-regex": "^8.0.0",
                 "is-fullwidth-code-point": "^3.0.0",
                 "strip-ansi": "^6.0.1"
-            },
-            "engines": {
-                "node": ">=8"
             }
         },
         "node_modules/string-width-cjs/node_modules/emoji-regex": {
@@ -38813,9 +38878,6 @@
             "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
             "dependencies": {
                 "ansi-regex": "^5.0.1"
-            },
-            "engines": {
-                "node": ">=8"
             }
         },
         "node_modules/strip-bom": {
@@ -38891,7 +38953,6 @@
         },
         "node_modules/styled-components": {
             "version": "6.1.11",
-            "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.11.tgz",
             "integrity": "sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==",
             "dependencies": {
                 "@emotion/is-prop-valid": "1.2.2",
@@ -39225,6 +39286,14 @@
             "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
             "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
         },
+        "node_modules/text-segmentation": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
+            "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
+            "dependencies": {
+                "utrie": "^1.0.2"
+            }
+        },
         "node_modules/text-table": {
             "version": "0.2.0",
             "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -39281,6 +39350,11 @@
                 "node": ">=12"
             }
         },
+        "node_modules/tiny-relative-date": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz",
+            "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A=="
+        },
         "node_modules/tinycolor2": {
             "version": "1.6.0",
             "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
@@ -39456,6 +39530,14 @@
                 "tree-kill": "cli.js"
             }
         },
+        "node_modules/treeverse": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz",
+            "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/trim-lines": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
@@ -39700,6 +39782,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dev": true,
             "dependencies": {
                 "fs.realpath": "^1.0.0",
@@ -39732,6 +39815,7 @@
             "version": "2.7.1",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
             "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+            "deprecated": "Rimraf versions prior to v4 are no longer supported",
             "dev": true,
             "dependencies": {
                 "glob": "^7.1.3"
@@ -39875,6 +39959,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dependencies": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -39940,6 +40025,7 @@
             "version": "2.7.1",
             "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
             "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+            "deprecated": "Rimraf versions prior to v4 are no longer supported",
             "dependencies": {
                 "glob": "^7.1.3"
             },
@@ -39981,6 +40067,7 @@
             "version": "7.2.3",
             "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
             "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
             "dependencies": {
                 "fs.realpath": "^1.0.0",
                 "inflight": "^1.0.4",
@@ -40055,6 +40142,19 @@
             "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
             "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
         },
+        "node_modules/tuf-js": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz",
+            "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==",
+            "dependencies": {
+                "@tufjs/models": "2.0.1",
+                "debug": "^4.3.4",
+                "make-fetch-happen": "^13.0.1"
+            },
+            "engines": {
+                "node": "^16.14.0 || >=18.0.0"
+            }
+        },
         "node_modules/tunnel": {
             "version": "0.0.6",
             "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
@@ -40217,14 +40317,41 @@
             "integrity": "sha512-7sI4e/bZijOzyURng88oOFZCISQPTHozfE2sUu5AviFYk5QV7fYGb6YiDl+vKjF/pICA354JImBImL9XJWUvdQ=="
         },
         "node_modules/typescript-eslint": {
-            "version": "7.9.0",
-            "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.9.0.tgz",
-            "integrity": "sha512-7iTn9c10teHHCys5Ud/yaJntXZrjt3h2mrx3feJGBOLgQkF3TB1X89Xs3aVQ/GgdXRAXpk2bPTdpRwHP4YkUow==",
+            "version": "7.10.0",
+            "integrity": "sha512-thO8nyqptXdfWHQrMJJiJyftpW8aLmwRNs11xA8pSrXneoclFPstQZqXvDWuH1WNL4CHffqHvYUeCHTit6yfhQ==",
             "dev": true,
             "dependencies": {
-                "@typescript-eslint/eslint-plugin": "7.9.0",
-                "@typescript-eslint/parser": "7.9.0",
-                "@typescript-eslint/utils": "7.9.0"
+                "@typescript-eslint/eslint-plugin": "7.10.0",
+                "@typescript-eslint/parser": "7.10.0",
+                "@typescript-eslint/utils": "7.10.0"
+            },
+            "engines": {
+                "node": "^18.18.0 || >=20.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependencies": {
+                "eslint": "^8.56.0"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": {
+            "version": "7.10.0",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz",
+            "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==",
+            "dev": true,
+            "dependencies": {
+                "@typescript-eslint/scope-manager": "7.10.0",
+                "@typescript-eslint/types": "7.10.0",
+                "@typescript-eslint/typescript-estree": "7.10.0",
+                "@typescript-eslint/visitor-keys": "7.10.0",
+                "debug": "^4.3.4"
             },
             "engines": {
                 "node": "^18.18.0 || >=20.0.0"
@@ -40409,6 +40536,28 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/unique-filename": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+            "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
+            "dependencies": {
+                "unique-slug": "^4.0.0"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/unique-slug": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+            "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
+            "dependencies": {
+                "imurmurhash": "^0.1.4"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/unist-util-find-after": {
             "version": "5.0.0",
             "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
@@ -40767,6 +40916,14 @@
                 "node": ">= 0.4.0"
             }
         },
+        "node_modules/utrie": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
+            "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
+            "dependencies": {
+                "base64-arraybuffer": "^1.0.2"
+            }
+        },
         "node_modules/uuid": {
             "version": "9.0.1",
             "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
@@ -40813,6 +40970,32 @@
             "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz",
             "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA=="
         },
+        "node_modules/validate-npm-package-license": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+            "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+            "dependencies": {
+                "spdx-correct": "^3.0.0",
+                "spdx-expression-parse": "^3.0.0"
+            }
+        },
+        "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+            "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+            "dependencies": {
+                "spdx-exceptions": "^2.1.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/validate-npm-package-name": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
+            "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==",
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/validate.io-array": {
             "version": "1.0.6",
             "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz",
@@ -40987,6 +41170,11 @@
                 "node": ">=18"
             }
         },
+        "node_modules/walk-up-path": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz",
+            "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA=="
+        },
         "node_modules/warning": {
             "version": "4.0.3",
             "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
@@ -41217,6 +41405,60 @@
                 "url": "https://github.com/sponsors/streamich"
             }
         },
+        "node_modules/webpack-dev-middleware/node_modules/memfs/node_modules/@jsonjoy.com/json-pack": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz",
+            "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==",
+            "dependencies": {
+                "@jsonjoy.com/base64": "^1.1.1",
+                "@jsonjoy.com/util": "^1.1.2",
+                "hyperdyperid": "^1.2.0",
+                "thingies": "^1.20.0"
+            },
+            "engines": {
+                "node": ">=10.0"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/streamich"
+            },
+            "peerDependencies": {
+                "tslib": "2"
+            }
+        },
+        "node_modules/webpack-dev-middleware/node_modules/memfs/node_modules/@jsonjoy.com/util": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz",
+            "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==",
+            "engines": {
+                "node": ">=10.0"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/streamich"
+            },
+            "peerDependencies": {
+                "tslib": "2"
+            }
+        },
+        "node_modules/webpack-dev-middleware/node_modules/memfs/node_modules/sonic-forest": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/sonic-forest/-/sonic-forest-1.0.3.tgz",
+            "integrity": "sha512-dtwajos6IWMEWXdEbW1IkEkyL2gztCAgDplRIX+OT5aRKnEd5e7r7YCxRgXZdhRP1FBdOBf8axeTPhzDv8T4wQ==",
+            "dependencies": {
+                "tree-dump": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=10.0"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/streamich"
+            },
+            "peerDependencies": {
+                "tslib": "2"
+            }
+        },
         "node_modules/webpack-dev-server": {
             "version": "5.0.4",
             "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz",
@@ -41652,12 +41894,6 @@
                 "ansi-styles": "^4.0.0",
                 "string-width": "^4.1.0",
                 "strip-ansi": "^6.0.0"
-            },
-            "engines": {
-                "node": ">=10"
-            },
-            "funding": {
-                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
             }
         },
         "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
@@ -41761,6 +41997,18 @@
                 "node": ">=4"
             }
         },
+        "node_modules/write-file-atomic": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+            "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+            "dependencies": {
+                "imurmurhash": "^0.1.4",
+                "signal-exit": "^4.0.1"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
         "node_modules/write/node_modules/mkdirp": {
             "version": "0.5.6",
             "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
diff --git a/package.json b/package.json
index 03d1c1423..ad4058d5a 100644
--- a/package.json
+++ b/package.json
@@ -60,6 +60,7 @@
         "@types/react-grid-layout": "^1.3.5",
         "@types/react-measure": "^2.0.12",
         "@types/react-reconciler": "^0.28.8",
+        "@types/react-speech-recognition": "^3.9.5",
         "@types/request": "^2.48.12",
         "@types/request-promise": "^4.1.51",
         "@types/shelljs": "^0.8.15",
@@ -207,6 +208,7 @@
         "html-to-image": "^1.11.11",
         "html-to-text": "^9.0.5",
         "html-webpack-plugin": "^5.5.3",
+        "html2canvas": "^1.4.1",
         "http-browserify": "^1.7.0",
         "https": "^1.0.0",
         "https-browserify": "^1.0.0",
@@ -281,6 +283,7 @@
         "react-measure": "^2.5.2",
         "react-resizable": "^3.0.5",
         "react-select": "^5.8.0",
+        "react-speech-recognition": "^3.10.0",
         "react-textarea-autosize": "^8.5.3",
         "react-type-animation": "^3.2.0",
         "react-xarrows": "^2.0.2",
diff --git a/src/client/apis/gpt/GPT.ts b/src/client/apis/gpt/GPT.ts
index 7bcd541c7..caddc41a2 100644
--- a/src/client/apis/gpt/GPT.ts
+++ b/src/client/apis/gpt/GPT.ts
@@ -12,6 +12,7 @@ enum GPTCallType {
     DESCRIBE = 'describe',
     MERMAID = 'mermaid',
     DATA = 'data',
+    STACK = 'stack',
 }
 
 type GPTCallOpts = {
@@ -26,6 +27,12 @@ const callTypeMap: { [type: string]: GPTCallOpts } = {
     summary: { model: 'gpt-4-turbo', maxTokens: 256, temp: 0.5, prompt: 'Summarize the text given in simpler terms.' },
     edit: { model: 'gpt-4-turbo', maxTokens: 256, temp: 0.5, prompt: 'Reword the text.' },
     flashcard: { model: 'gpt-4-turbo', maxTokens: 512, temp: 0.5, prompt: 'Make flashcards out of this text with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ' },
+    stack: {
+        model: 'gpt-4o',
+        maxTokens: 2048,
+        temp: 0.7,
+        prompt: 'Create a stack of flashcards out of this text with each question and answer labeled as question and answer. For some questions, ask "what is this image of" and write a keyword that represents the image and label it "keyword". Otherwise, write none. Do not label each flashcard and do not include asterisks.',
+    },
     completion: { model: 'gpt-4-turbo', maxTokens: 256, temp: 0.5, prompt: "You are a helpful assistant. Answer the user's prompt." },
     mermaid: {
         model: 'gpt-4-turbo',
@@ -64,7 +71,7 @@ let lastResp = '';
  * @returns AI Output
  */
 const gptAPICall = async (inputTextIn: string, callType: GPTCallType, prompt?: any) => {
-    const inputText = [GPTCallType.SUMMARY, GPTCallType.FLASHCARD, GPTCallType.QUIZ].includes(callType) ? inputTextIn + '.' : inputTextIn;
+    const inputText = [GPTCallType.SUMMARY, GPTCallType.FLASHCARD, GPTCallType.QUIZ, GPTCallType.STACK].includes(callType) ? inputTextIn + '.' : inputTextIn;
     const opts: GPTCallOpts = callTypeMap[callType];
     if (lastCall === inputText) return lastResp;
     try {
diff --git a/src/client/views/nodes/ComparisonBox.tsx b/src/client/views/nodes/ComparisonBox.tsx
index 3d33ff862..06ecf8893 100644
--- a/src/client/views/nodes/ComparisonBox.tsx
+++ b/src/client/views/nodes/ComparisonBox.tsx
@@ -9,7 +9,7 @@ import { Doc, Opt } from '../../../fields/Doc';
 import { DocData } from '../../../fields/DocSymbols';
 import { RichTextField } from '../../../fields/RichTextField';
 import { DocCast, NumCast, RTFCast, StrCast, toList } from '../../../fields/Types';
-import { GPTCallType, gptAPICall } from '../../apis/gpt/GPT';
+import { GPTCallType, gptAPICall, gptImageLabel } from '../../apis/gpt/GPT';
 import '../pdf/GPTPopup/GPTPopup.scss';
 import { DocUtils } from '../../documents/DocUtils';
 import { DocumentType } from '../../documents/DocumentTypes';
@@ -29,7 +29,12 @@ import { ContextMenu } from '../ContextMenu';
 import { ContextMenuProps } from '../ContextMenuItem';
 import { tickStep } from 'd3';
 import { CollectionCarouselView } from '../collections/CollectionCarouselView';
+import { FollowLinkScript } from '../../documents/DocUtils';
+import { schema } from '../nodes/formattedText/schema_rts';
+import { Id } from '../../../fields/FieldSymbols';
+import axios from 'axios';
 
+const API_URL = 'https://api.unsplash.com/search/photos';
 @observer
 export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     public static LayoutString(fieldKey: string) {
@@ -39,36 +44,110 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
     constructor(props: FieldViewProps) {
         super(props);
         makeObservable(this);
+        this.setListening();
     }
 
     @observable private _inputValue = '';
     @observable private _outputValue = '';
     @observable private _loading = false;
     @observable private _isEmpty = false;
+    @observable childActive = false;
     @observable _yRelativeToTop: boolean = true;
-
-    @action handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
-        this._inputValue = e.target.value;
-        console.log(this._inputValue);
-    };
-
     @observable _animating = '';
+    private _ref = React.createRef<HTMLDivElement>();
 
-    @computed get clipWidth() {
-        return NumCast(this.layoutDoc[this.clipWidthKey], 50);
+    get revealOp() {
+        return this.layoutDoc[`_${this._props.fieldKey}_revealOp`];
+    }
+    get clipHeightKey() {
+        return '_' + this._props.fieldKey + '_clipHeight';
     }
+
     get clipWidthKey() {
         return '_' + this._props.fieldKey + '_clipWidth';
     }
 
+    @computed get clipWidth() {
+        return NumCast(this.layoutDoc[this.clipWidthKey], 50);
+    }
+
     @computed get clipHeight() {
         return NumCast(this.layoutDoc[this.clipHeightKey], 200);
     }
-    get revealOp() {
-        return this.layoutDoc[`_${this._props.fieldKey}_revealOp`];
+
+    @computed get overlayAlternateIcon() {
+        const usepath = this.layoutDoc[`_${this._props.fieldKey}_usePath`];
+        return (
+            <Tooltip title={<div className="dash-tooltip">flip</div>}>
+                <div
+                    className="formattedTextBox-alternateButton"
+                    onPointerDown={e =>
+                        setupMoveUpEvents(e.target, e, returnFalse, emptyFunction, () => {
+                            if (!this.layoutDoc[`_${this._props.fieldKey}_revealOp`] || this.layoutDoc[`_${this._props.fieldKey}_revealOp`] === 'flip') {
+                                this.flipFlashcard();
+
+                                // console.log('Print Front of cards: ' + (RTFCast(DocCast(this.dataDoc[this.fieldKey + '_0']).text)?.Text ?? ''));
+                                // console.log('Print Back of cards: ' + (RTFCast(DocCast(this.dataDoc[this.fieldKey + '_1']).text)?.Text ?? ''));
+                            }
+                        })
+                    }
+                    style={{
+                        background: this.revealOp === 'hover' ? 'gray' : usepath === 'alternate' ? 'white' : 'black',
+                        color: this.revealOp === 'hover' ? 'black' : usepath === 'alternate' ? 'black' : 'white',
+                        display: 'inline-block',
+                    }}>
+                    <div key="alternate" className="formattedTextBox-flip">
+                        <FontAwesomeIcon icon="turn-up" size="1x" />
+                    </div>
+                </div>
+            </Tooltip>
+        );
     }
-    get clipHeightKey() {
-        return '_' + this._props.fieldKey + '_clipHeight';
+
+    @computed get flashcardMenu() {
+        return (
+            <div>
+                <Tooltip
+                    title={
+                        this.layoutDoc[`_${this._props.fieldKey}_usePath`] === 'alternate' ? (
+                            <div className="dash-tooltip">Flip to front side to use GPT</div>
+                        ) : (
+                            <div className="dash-tooltip">Ask GPT to create an answer on the back side of the flashcard based on your question on the front</div>
+                        )
+                    }>
+                    <div style={{ position: 'absolute', bottom: '3px', right: '50px', cursor: 'pointer' }} onPointerDown={e => (!this.layoutDoc[`_${this._props.fieldKey}_usePath`] ? this.findImageTags() : null)}>
+                        <FontAwesomeIcon icon="lightbulb" size="xl" />
+                    </div>
+                </Tooltip>
+                {DocCast(this.Document.embedContainer).type_collection === 'carousel' ? null : (
+                    <div>
+                        <Tooltip title={<div>Create a flashcard pile</div>}>
+                            <div style={{ position: 'absolute', bottom: '3px', right: '74px', cursor: 'pointer' }} onPointerDown={e => this.createFlashcardPile([this.Document], false)}>
+                                <FontAwesomeIcon icon="folder-plus" size="xl" />
+                            </div>
+                        </Tooltip>
+                        <Tooltip title={<div className="dash-tooltip">Create new flashcard stack based on text</div>}>
+                            <div style={{ position: 'absolute', bottom: '3px', right: '104px', cursor: 'pointer' }} onClick={e => this.gptFlashcardPile()}>
+                                <FontAwesomeIcon icon="layer-group" size="xl" />
+                            </div>
+                        </Tooltip>
+                    </div>
+                )}
+                <Tooltip title={<div className="dash-tooltip">Hover to reveal</div>}>
+                    <div style={{ position: 'absolute', bottom: '3px', right: '25px', cursor: 'pointer' }} onClick={e => this.handleHover()}>
+                        <FontAwesomeIcon color={this.revealOp === 'hover' ? 'blue' : 'black'} icon="hand-point-up" size="xl" />
+                    </div>
+                </Tooltip>
+                {/* <Tooltip title={<div className="dash-tooltip">Remove this side of the flashcard</div>}>
+                    <div
+                        style={{ position: 'absolute', bottom: '3px', right: '80px', cursor: 'pointer' }}
+                        onPointerDown={e => this.closeDown(e, this.layoutDoc[`_${this._props.fieldKey}_usePath`] === 'alternate' ? this._props.fieldKey + '_1' : this._props.fieldKey + '_0')}>
+                        <FontAwesomeIcon color={this.revealOp === 'hover' ? 'blue' : 'black'} icon="trash-can" size="xl" />
+                    </div>
+                </Tooltip> */}
+                {/* {this.overlayAlternateIcon} */}
+            </div>
+        );
     }
 
     componentDidMount() {
@@ -80,6 +159,7 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
     }
     protected createDropTarget = (ele: HTMLDivElement | null, fieldKey: string, disposerId: number) => {
         this._disposers[disposerId]?.();
+        // this.childActive = true;
         if (ele) {
             this._disposers[disposerId] = DragManager.MakeDropTarget(ele, (e, dropEvent) => this.internalDrop(e, dropEvent, fieldKey), this.layoutDoc);
         }
@@ -147,6 +227,39 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
         return false;
     };
 
+    @action handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
+        this._inputValue = e.target.value;
+        console.log(this._inputValue);
+    };
+
+    // this.closeDown(e, this.layoutDoc[`_${this._props.fieldKey}_usePath`] === 'alternate' ? this.fieldKey + '_0' : this.fieldKey + '_1')}
+    @action activateContent = () => {
+        this.childActive = true;
+    };
+
+    @action handleRenderGPTClick = () => {
+        // Call the GPT model and get the output
+        this.layoutDoc[`_${this._props.fieldKey}_usePath`] = 'alternate';
+        this._outputValue = '';
+        if (this._inputValue) this.askGPT(GPTCallType.QUIZ);
+    };
+
+    @action handleHover = () => {
+        if (this.revealOp === 'hover') {
+            this.layoutDoc[`_${this._props.fieldKey}_revealOp`] = 'flip';
+            this.Document.forceActive = false;
+        } else {
+            this.layoutDoc[`_${this._props.fieldKey}_revealOp`] = 'hover';
+            this.Document.forceActive = true;
+        }
+        //this.revealOp === 'hover' ? (this.layoutDoc[`_${this._props.fieldKey}_revealOp`] = 'flip') : (this.layoutDoc[`_${this._props.fieldKey}_revealOp`] = 'hover');
+    };
+
+    @action handleRenderClick = () => {
+        // Call the GPT model and get the output
+        this.layoutDoc[`_${this._props.fieldKey}_usePath`] = undefined;
+    };
+
     getAnchor = (addAsAnnotation: boolean, pinProps?: PinProps) => {
         const anchor = Docs.Create.ConfigDocument({
             title: 'CompareAnchor:' + this.Document.title,
@@ -271,13 +384,29 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
     }
 
     gptFlashcardPile = async () => {
-        var text = await this.askGPT(GPTCallType.FLASHCARD);
+        var text = await this.askGPT(GPTCallType.STACK);
+        console.log(text);
 
         var senArr = text?.split('Question: ');
         var collectionArr: Doc[] = [];
         for (let i = 1; i < senArr?.length!; i++) {
             const newDoc = Docs.Create.ComparisonDocument(senArr![i], { _layout_isFlashcard: true, _width: 300, _height: 300 });
-            newDoc.text = senArr![i];
+            // newDoc.text = senArr![i];
+            // const dataSplit = StrCast(this.dataDoc.data).includes('Keyword: ') ? StrCast(this.dataDoc.data).split('Keyword: ') : StrCast(this.dataDoc.data).split('Answer: ');
+            // newDoc[this.fieldKey + '_0'] = Docs.Create.TextDocument(dataSplit[1]);
+            // newDoc[this.fieldKey + '_1'] = Docs.Create.TextDocument(dataSplit[0]);
+            // newDoc['backgroundColor'] = 'lightgray';
+            // newDoc.image =
+            if (StrCast(senArr![i]).includes('Keyword: ')) {
+                console.log('Here');
+                const img = await this.fetchImages(StrCast(senArr![i]).split('Keyword: ')[1]);
+                console.log(img);
+                DocCast(newDoc).image = img;
+                // DocCast(DocCast(newDoc).dataDoc)['image'] = img;
+                Doc.AddToMyOverlay(img);
+            }
+
+            console.log('ARR' + i + senArr![i]);
             collectionArr.push(newDoc);
         }
         this.createFlashcardPile(collectionArr, true);
@@ -297,110 +426,6 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
     hoverFlip = (side: string | undefined) => {
         if (this.layoutDoc[`_${this._props.fieldKey}_revealOp`] === 'hover') this.layoutDoc[`_${this._props.fieldKey}_usePath`] = side;
     };
-    /**
-     * Creates the button used to flip the flashcards.
-     */
-    @computed get overlayAlternateIcon() {
-        const usepath = this.layoutDoc[`_${this._props.fieldKey}_usePath`];
-        return (
-            <Tooltip title={<div className="dash-tooltip">flip</div>}>
-                <div
-                    className="formattedTextBox-alternateButton"
-                    onPointerDown={e =>
-                        setupMoveUpEvents(e.target, e, returnFalse, emptyFunction, () => {
-                            if (!this.layoutDoc[`_${this._props.fieldKey}_revealOp`] || this.layoutDoc[`_${this._props.fieldKey}_revealOp`] === 'flip') {
-                                this.flipFlashcard();
-
-                                // console.log('Print Front of cards: ' + (RTFCast(DocCast(this.dataDoc[this.fieldKey + '_0']).text)?.Text ?? ''));
-                                // console.log('Print Back of cards: ' + (RTFCast(DocCast(this.dataDoc[this.fieldKey + '_1']).text)?.Text ?? ''));
-                            }
-                        })
-                    }
-                    style={{
-                        background: this.revealOp === 'hover' ? 'gray' : usepath === 'alternate' ? 'white' : 'black',
-                        color: this.revealOp === 'hover' ? 'black' : usepath === 'alternate' ? 'black' : 'white',
-                        display: 'inline-block',
-                    }}>
-                    <div key="alternate" className="formattedTextBox-flip">
-                        <FontAwesomeIcon icon="turn-up" size="1x" />
-                    </div>
-                </div>
-            </Tooltip>
-        );
-    }
-
-    @computed get flashcardMenu() {
-        return (
-            <div>
-                <Tooltip
-                    title={
-                        this.layoutDoc[`_${this._props.fieldKey}_usePath`] === 'alternate' ? (
-                            <div className="dash-tooltip">Flip to front side to use GPT</div>
-                        ) : (
-                            <div className="dash-tooltip">Ask GPT to create an answer on the back side of the flashcard based on your question on the front</div>
-                        )
-                    }>
-                    <div style={{ position: 'absolute', bottom: '3px', right: '50px', cursor: 'pointer' }} onPointerDown={e => (!this.layoutDoc[`_${this._props.fieldKey}_usePath`] ? this.askGPT(GPTCallType.CHATCARD) : null)}>
-                        <FontAwesomeIcon icon="lightbulb" size="xl" />
-                    </div>
-                </Tooltip>
-                {DocCast(this.Document.embedContainer).type_collection === 'carousel' ? null : (
-                    <div>
-                        <Tooltip title={<div>Create a flashcard pile</div>}>
-                            <div style={{ position: 'absolute', bottom: '3px', right: '74px', cursor: 'pointer' }} onPointerDown={e => this.createFlashcardPile([this.Document], false)}>
-                                <FontAwesomeIcon icon="folder-plus" size="xl" />
-                            </div>
-                        </Tooltip>
-                        <Tooltip title={<div className="dash-tooltip">Create new flashcard stack based on text</div>}>
-                            <div style={{ position: 'absolute', bottom: '3px', right: '104px', cursor: 'pointer' }} onClick={e => this.gptFlashcardPile()}>
-                                <FontAwesomeIcon icon="layer-group" size="xl" />
-                            </div>
-                        </Tooltip>
-                    </div>
-                )}
-                <Tooltip title={<div className="dash-tooltip">Hover to reveal</div>}>
-                    <div style={{ position: 'absolute', bottom: '3px', right: '25px', cursor: 'pointer' }} onClick={e => this.handleHover()}>
-                        <FontAwesomeIcon color={this.revealOp === 'hover' ? 'blue' : 'black'} icon="hand-point-up" size="xl" />
-                    </div>
-                </Tooltip>
-                {/* <Tooltip title={<div className="dash-tooltip">Remove this side of the flashcard</div>}>
-                    <div
-                        style={{ position: 'absolute', bottom: '3px', right: '80px', cursor: 'pointer' }}
-                        onPointerDown={e => this.closeDown(e, this.layoutDoc[`_${this._props.fieldKey}_usePath`] === 'alternate' ? this._props.fieldKey + '_1' : this._props.fieldKey + '_0')}>
-                        <FontAwesomeIcon color={this.revealOp === 'hover' ? 'blue' : 'black'} icon="trash-can" size="xl" />
-                    </div>
-                </Tooltip> */}
-                {/* {this.overlayAlternateIcon} */}
-            </div>
-        );
-    }
-    // this.closeDown(e, this.layoutDoc[`_${this._props.fieldKey}_usePath`] === 'alternate' ? this.fieldKey + '_0' : this.fieldKey + '_1')}
-    @action activateContent = () => {
-        this.childActive = true;
-    };
-
-    @action handleRenderGPTClick = () => {
-        // Call the GPT model and get the output
-        this.layoutDoc[`_${this._props.fieldKey}_usePath`] = 'alternate';
-        this._outputValue = '';
-        if (this._inputValue) this.askGPT(GPTCallType.QUIZ);
-    };
-
-    @action handleHover = () => {
-        if (this.revealOp === 'hover') {
-            this.layoutDoc[`_${this._props.fieldKey}_revealOp`] = 'flip';
-            this.Document.forceActive = false;
-        } else {
-            this.layoutDoc[`_${this._props.fieldKey}_revealOp`] = 'hover';
-            this.Document.forceActive = true;
-        }
-        //this.revealOp === 'hover' ? (this.layoutDoc[`_${this._props.fieldKey}_revealOp`] = 'flip') : (this.layoutDoc[`_${this._props.fieldKey}_revealOp`] = 'hover');
-    };
-
-    @action handleRenderClick = () => {
-        // Call the GPT model and get the output
-        this.layoutDoc[`_${this._props.fieldKey}_usePath`] = undefined;
-    };
 
     animateRes = (resIndex: number, newText: string, callType: GPTCallType) => {
         if (resIndex < newText.length) {
@@ -448,15 +473,17 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
             if (callType == GPTCallType.CHATCARD) {
                 DocCast(this.dataDoc[this.props.fieldKey + '_0'])[DocData].text = res;
                 // this.flipFlashcard();
-            }
-            if (callType == GPTCallType.QUIZ) this._outputValue = res;
+            } else if (callType == GPTCallType.QUIZ) this._outputValue = res;
             // DocCast(this.dataDoc[this.props.fieldKey + '_0'])[DocData].text = res;
             // this._outputValue = res;
             else if (callType === GPTCallType.FLASHCARD) {
                 // console.log(res);
                 this._loading = false;
                 return res;
+            } else if (callType === GPTCallType.STACK) {
             }
+            this._loading = false;
+            return res;
             // console.log(res);
         } catch (err) {
             console.error('GPT call failed');
@@ -470,7 +497,160 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
     //     const cm = ContextMenu.Instance;
     //     cm.addItem({ description: 'Create an Answer on the Back', event: () => this.askGPT(GPTCallType.CHATCARD), icon: 'pencil' });
     // };
-    @observable childActive = false;
+
+    findImageTags = async () => {
+        // const d = DocCast(this.dataDoc[this.props.fieldKey + '_0']);
+        // const copy = Doc.MakeCopy(this.Document, true);
+        const c = this.DocumentView?.().ContentDiv!.getElementsByTagName('img');
+        // this.ProseRef?.getElementsByTagName('img');
+        if (c?.length === 0) await this.askGPT(GPTCallType.CHATCARD);
+        if (c) {
+            this._loading = true;
+            for (let i of c) {
+                console.log(i);
+                if (i.className !== 'ProseMirror-separator') await this.getImageDesc(i.src);
+            }
+            this._loading = false;
+            this.flipFlashcard();
+        }
+        // console.log('HI' + this.ProseRef?.getElementsByTagName('img'));
+    };
+
+    static imageUrlToBase64 = async (imageUrl: string): Promise<string> => {
+        try {
+            const response = await fetch(imageUrl);
+            const blob = await response.blob();
+
+            return new Promise((resolve, reject) => {
+                const reader = new FileReader();
+                reader.readAsDataURL(blob);
+                reader.onloadend = () => resolve(reader.result as string);
+                reader.onerror = error => reject(error);
+            });
+        } catch (error) {
+            console.error('Error:', error);
+            throw error;
+        }
+    };
+
+    getImageDesc = async (u: string) => {
+        try {
+            const hrefBase64 = await ComparisonBox.imageUrlToBase64(u);
+            const response = await gptImageLabel(hrefBase64, 'Answer the following question as a short flashcard response. Do not include a label.' + (this.dataDoc.text as RichTextField)?.Text);
+
+            DocCast(this.dataDoc[this.props.fieldKey + '_0'])[DocData].text = response;
+        } catch (error) {
+            console.log('Error');
+        }
+    };
+
+    fetchImages = async (selection: string) => {
+        try {
+            const { data } = await axios.get(`${API_URL}?query=${selection}&page=1&per_page=${1}&client_id=Q4zruu6k6lum2kExiGhLNBJIgXDxD6NNj0SRHH_XXU0`);
+            console.log(data.results);
+            const imageSnapshot = Docs.Create.ImageDocument(data.results[0].urls.small, {
+                _nativeWidth: Doc.NativeWidth(this.layoutDoc),
+                _nativeHeight: Doc.NativeHeight(this.layoutDoc),
+                x: NumCast(this.layoutDoc.x),
+                y: NumCast(this.layoutDoc.y),
+                onClick: FollowLinkScript(),
+                _width: 150,
+                _height: 150,
+                title: '--snapshot' + NumCast(this.layoutDoc._layout_currentTimecode) + ' image-',
+            });
+            // return imageSnapshot;
+            imageSnapshot['x'] = this.layoutDoc['x'];
+            imageSnapshot['y'] = this.layoutDoc['y'];
+
+            // const newDoc = Docs.Create.TextDocument(selection);
+            // newDoc.text = selection;
+            // newDoc['backgroundColor'] = 'lightgray';
+
+            // Doc.AddToMyOverlay(imageSnapshot);
+            return imageSnapshot;
+            return data.results[0].urls.small;
+            // Doc.AddEmbedding(newDoc, imageSnapshot);
+            // Doc.MakeEmbedding(imageSnapshot);
+            // return imageSnapshot;
+            // imageSnapshot['zIndex'] = 20000;
+            // this._props.DocumentView?.()._props.addDocument?.(newDoc);
+        } catch (error) {
+            console.log(error);
+        }
+    };
+
+    // handleSelection = async (selection: string, newDoc: Doc) => {
+    //     const images = await this.fetchImages(selection);
+    //     return images;
+    // // Doc.AddDocToList(Doc.MyRecentlyClosed, 'data', dashDoc, undefined, true, true);
+    // images!.embedContainer = newDoc;
+    // Doc.AddEmbedding(newDoc, images!);
+    // const c = this.DocumentView?.().ContentDiv!.getElementsByClassName('afterBox-cont');
+    // for (let i in c) {
+    //     console.log('HERE' + i);
+    // }
+    // this.addDoc(images!, this.fieldKey + '_0');
+    // Doc.AddEmbedding(newDoc, images!);
+    // this._props.
+    // Doc.AddToMyOverlay(images!);
+    // const node = schema.nodes.dashDoc.create({
+    //     width: NumCast(images?._width),
+    //     height: NumCast(images?._height),
+    //     title: 'dashDoc',
+    //     docId: images![Id],
+    //     float: 'unset',
+    // });
+    // };
+
+    @observable listening = false;
+    @observable transcriptElement = '';
+    SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
+    recognition = new this.SpeechRecognition();
+
+    handleResult = (e: SpeechRecognitionEvent) => {
+        let interimTranscript = '';
+        let finalTranscript = '';
+        for (let i = e.resultIndex; i < e.results.length; i++) {
+            const transcript = e.results[i][0].transcript;
+            if (e.results[i].isFinal) {
+                finalTranscript += transcript;
+            } else {
+                interimTranscript += transcript;
+            }
+        }
+        console.log(interimTranscript);
+        this._inputValue += finalTranscript;
+    };
+
+    setListening = () => {
+        const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
+        if (SpeechRecognition) {
+            console.log('here');
+            // const recognition = new SpeechRecognition();
+            this.recognition.continuous = true; // Continue listening even if the user pauses
+            this.recognition.interimResults = true; // Show interim results
+            this.recognition.lang = 'en-US'; // Set language (optional)
+            this.recognition.onresult = this.handleResult.bind(this);
+            // recognition.onend = this.handleEnd.bind(this);
+
+            // this.handleResult;
+            // recognition.stop();
+        }
+    };
+
+    setLanguage = (language: string) => {
+        this.recognition.lang = language;
+    };
+
+    startListening = () => {
+        this.recognition.start();
+        this.listening = true;
+    };
+
+    stopListening = () => {
+        this.recognition.stop();
+        this.listening = false;
+    };
 
     render() {
         const clearButton = (which: string) => (
@@ -542,13 +722,62 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
             // add text box to each side when comparison box is first created
             // (!this.dataDoc[this.fieldKey + '_0'] && this.dataDoc[this._props.fieldKey + '_0'] !== 'empty')
             if (!this.dataDoc[this.fieldKey + '_0'] && !this._isEmpty) {
-                const dataSplit = StrCast(this.dataDoc.data).split('Answer: ');
+                const dataSplit = StrCast(this.dataDoc.data).includes('Keyword: ') ? StrCast(this.dataDoc.data).split('Keyword: ') : StrCast(this.dataDoc.data).split('Answer: ');
                 const newDoc = Docs.Create.TextDocument(dataSplit[1]);
+                if (this.Document.image) DocCast(newDoc).image = DocCast(this.Document.image);
+                console.log('D' + this.Document.image);
+                //if (DocCast(DocCast(newDoc).dataDoc)) DocCast(DocCast(newDoc).dataDoc)['image'] = this.dataDoc['image'];
+
+                // console.log('HI' + this.Document.image);
+                // const imageSnapshot = Docs.Create.ImageDocument(StrCast(this.Document.image), {
+                //     _nativeWidth: Doc.NativeWidth(this.layoutDoc),
+                //     _nativeHeight: Doc.NativeHeight(this.layoutDoc),
+                //     x: NumCast(this.layoutDoc.x),
+                //     y: NumCast(this.layoutDoc.y),
+                //     onClick: FollowLinkScript(),
+                //     _width: 150,
+                //     _height: 150,
+                //     title: '--snapshot' + NumCast(this.layoutDoc._layout_currentTimecode) + ' image-',
+                // });
+                // // return imageSnapshot;
+                // imageSnapshot['x'] = this.layoutDoc['x'];
+                // imageSnapshot['y'] = this.layoutDoc['y'];
+
+                // const newDoc = Docs.Create.TextDocument(selection);
+                // newDoc.text = selection;
+                // newDoc['backgroundColor'] = 'lightgray';
+                // newDoc.data = imageSnapshot;
+                // this.createDropTarget(this., this.fieldKey + '_0', 0)
+                // Doc.AddEmbedding(imageSnapshot, newDoc);
+                // Doc.SetContainer(imageSnapshot, newDoc);
+                // Doc.AddToMyOverlay(imageSnapshot);
+
+                // if (StrCast(this.dataDoc.data).includes('Keyword: ')) {
+                //     console.log('HERE' + this.dataDoc.data);
+                //     this.fetchImages(StrCast(this.dataDoc.data).split('Keyword: ')[1]);
+                // }
+                //     // const node = schema.nodes.dashDoc.create({
+                //     //     width: NumCast(newDoc._width),
+                //     //     height: NumCast(newDoc._height),
+                //     //     title: 'dashDoc',
+                //     //     docId: newDoc[Id],
+                //     //     float: 'unset',
+                //     // });
+                //     // Doc.AddEmbedding(images!, newDoc);
+                //     // Doc.SetContainer(images, this.newDoc);
+                // } else {
+                // newDoc.text = dataSplit[1];
+                // newDoc['backgroundColor'] = 'lightgray';
+                this.addDoc(newDoc, this.fieldKey + '_0');
+                // this.addDoc()
+                // }
+                // newDoc?.addDocument?.(images);
+
                 // if there is text from the pdf ai cards, put the question on the front side.
                 // eslint-disable-next-line prefer-destructuring
                 // newDoc.text = dataSplit[1];
-                newDoc['backgroundColor'] = 'lightgray';
-                this.addDoc(newDoc, this.fieldKey + '_0');
+                // newDoc['backgroundColor'] = 'lightgray';
+                // this.addDoc(newDoc, this.fieldKey + '_0');
                 // DocCast(this.dataDoc[this.fieldKey + '_0'])[DocData].text = dataSplit[1];
                 // DocCast(this.dataDoc[this.fieldKey + '_0']).text = dataSplit[1];
                 // console.log('HI' + DocCast(this.dataDoc[this.fieldKey + '_0']).text);
@@ -556,7 +785,7 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
             }
 
             if (!this.dataDoc[this.fieldKey + '_1'] && !this._isEmpty) {
-                const dataSplit = StrCast(this.dataDoc.data).split('Answer: ');
+                const dataSplit = StrCast(this.dataDoc.data).includes('Keyword: ') ? StrCast(this.dataDoc.data).split('Keyword: ') : StrCast(this.dataDoc.data).split('Answer: ');
                 const newDoc = Docs.Create.TextDocument(dataSplit[0]);
                 this.addDoc(newDoc, this.fieldKey + '_1');
                 // if there is text from the pdf ai cards, put the answer on the alternate side.
@@ -592,15 +821,21 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
                                 </div>
                             ) : null}
                         </div>
-                        <div className="submit-button" style={{ overflow: 'hidden', display: this.layoutDoc[`_${this._props.fieldKey}_usePath`] === 'alternate' ? 'none' : 'flex' }}>
-                            <button type="button" onClick={this.handleRenderGPTClick} style={{ borderRadius: '2px', marginBottom: '3px' }}>
-                                Submit
-                            </button>
-                        </div>
-                        <div className="submit-button" style={{ overflow: 'hidden', marginBottom: '2px', display: this.layoutDoc[`_${this._props.fieldKey}_usePath`] === 'alternate' ? 'flex' : 'none' }}>
-                            <button type="button" onClick={this.handleRenderClick} style={{ borderRadius: '2px' }}>
-                                Redo the Question
-                            </button>
+                        <div style={{ display: 'inline-block' }}>
+                            <div className="submit-button" style={{ overflow: 'hidden' }}>
+                                <button style={{ width: '10px' }} onClick={this.listening ? this.stopListening : this.startListening}>
+                                    {<FontAwesomeIcon icon="microphone" size="lg" />}
+                                </button>
+                                {this.layoutDoc[`_${this._props.fieldKey}_usePath`] !== 'alternate' ? (
+                                    <button type="button" onClick={this.handleRenderGPTClick} style={{ borderRadius: '2px', marginBottom: '3px' }}>
+                                        Submit
+                                    </button>
+                                ) : (
+                                    <button type="button" onClick={this.handleRenderClick} style={{ borderRadius: '2px' }}>
+                                        Redo the Question
+                                    </button>
+                                )}
+                            </div>
                         </div>
                     </div>
                 );
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index fde9fe582..65a645560 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -375,7 +375,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         this._loading = true;
         try {
             const hrefBase64 = await this.createCanvas();
-            const response = await gptImageLabel(hrefBase64, 'Make flashcards out of this text with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ');
+            const response = await gptImageLabel(hrefBase64, 'Make flashcards out of this image with each question and answer labeled as "question" and "answer". Do not label each flashcard and do not include asterisks: ');
             console.log(response);
             AnchorMenu.Instance.transferToFlashcard(response);
         } catch (error) {
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index 2091ee89a..0be51816f 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -909,11 +909,11 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
         );
         const appearance = cm.findByDescription('Appearance...');
         const appearanceItems: ContextMenuProps[] = appearance && 'subitems' in appearance ? appearance.subitems : [];
-        appearanceItems.push({
-            description: 'Find image tags',
-            event: this.findImageTags,
-            icon: !this.Document._layout_noSidebar ? 'eye-slash' : 'eye',
-        });
+        // appearanceItems.push({
+        //     description: 'Find image tags',
+        //     event: this.findImageTags,
+        //     icon: !this.Document._layout_noSidebar ? 'eye-slash' : 'eye',
+        // });
         appearanceItems.push({
             description: !this.Document._layout_noSidebar ? 'Hide Sidebar Handle' : 'Show Sidebar Handle',
             event: () => {
@@ -1040,10 +1040,14 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
         const hrefComplete = `${hrefParts[0]}_o.${hrefParts[1]}`;
         try {
             const hrefBase64 = await FormattedTextBox.imageUrlToBase64(u);
-            const response = await gptImageLabel(hrefBase64, 'Tell me what you see in this image');
+            const response = await gptImageLabel(
+                hrefBase64,
+                'Make flashcards out of this text and image with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ' + (this.dataDoc.text as RichTextField)?.Text
+            );
             //const response = await gptImageLabel(u, 'Make flashcards out of this text with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ');
-            console.log(response);
-            // AnchorMenu.Instance.transferToFlashcard(response);
+            // console.log(response);
+            AnchorMenu.Instance.transferToFlashcard(response || 'Something went wrong');
+            // this._props.addto_;
             // this.Document[DocData].description = response.trim();
             // return response; // Return the response
         } catch (error) {
@@ -1399,7 +1403,35 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
             { fireImmediately: true }
         );
         this.tryUpdateScrollHeight();
+
+        console.log('S' + this.Document.image);
+        console.log('S' + DocCast(this.Document).image);
+        if (this.Document.image) {
+            // const node = schema.nodes.dashDoc.create({
+            //     width: 200,
+            //     height: 200,
+            //     title: 'dashDoc',
+            //     docId: DocCast(this.Document.image)[Id],
+            //     float: 'unset',
+            // });
+
+            // DocCast(this.Document.image)._freeform_fitContentsToBox = true;
+            // Doc.SetContainer(DocCast(this.Document.image), this.Document);
+            // const view = this._editorView!;
+            // try {
+            //     this._inDrop = true;
+            //     const pos = view.posAtCoords({ left: 0, top: 0 })?.pos;
+            //     pos && view.dispatch(view.state.tr.insert(pos, node));
+            // } catch (err) {
+            //     console.log('Drop failed', err);
+            // }
+            // console.log('LKSDFLJ');
+            this.addDocument?.(DocCast(this.Document.image));
+        }
+
+        //if (this.Document.image) this.addDocument?.(DocCast(this.Document.image));
         setTimeout(this.tryUpdateScrollHeight, 250);
+        AnchorMenu.Instance.addToCollection = this._props.DocumentView?.()._props.addDocument;
     }
 
     clipboardTextSerializer = (slice: Slice): string => {
diff --git a/src/client/views/pdf/AnchorMenu.tsx b/src/client/views/pdf/AnchorMenu.tsx
index 87031487f..dcd76979f 100644
--- a/src/client/views/pdf/AnchorMenu.tsx
+++ b/src/client/views/pdf/AnchorMenu.tsx
@@ -142,6 +142,7 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
             console.log('Arr ' + i + ': ' + senArr[i]);
             const newDoc = Docs.Create.ComparisonDocument(senArr[i], { _layout_isFlashcard: true, _width: 300, _height: 300 });
             newDoc.text = senArr[i];
+
             collectionArr.push(newDoc);
         }
         // create a new carousel collection of these flashcards
@@ -152,6 +153,7 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
             _layout_autoHeight: true,
         });
 
+        console.log(collectionArr);
         newCol.x = this._x;
         newCol.y = this._y;
         newCol.zIndex = 100;
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 27a523465..1af7b1fc0 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -34,6 +34,8 @@ import { Docs } from '../../documents/Documents';
 import './PDFViewer.scss';
 import { GPTCallType, gptAPICall } from '../../apis/gpt/GPT';
 import ReactLoading from 'react-loading';
+import html2canvas from 'html2canvas';
+import SpeechRecognition, { useSpeechRecognition } from 'react-speech-recognition';
 
 // pdfjsLib.GlobalWorkerOptions.workerSrc = `/assets/pdf.worker.js`;
 // The workerSrc property shall be specified.
@@ -66,6 +68,43 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         super(props);
         makeObservable(this);
     }
+    // @observable transcriptRef = React.createRef();
+    // @observable startBtnRef = React.createRef();
+    // @observable stopBtnRef = React.createRef();
+    // @observable transcriptElement = '';
+
+    // handleResult = (e: SpeechRecognitionEvent) => {
+    //     let interimTranscript = '';
+    //     let finalTranscript = '';
+    //     console.log('H');
+    //     for (let i = e.resultIndex; i < e.results.length; i++) {
+    //         const transcript = e.results[i][0].transcript;
+    //         if (e.results[i].isFinal) {
+    //             finalTranscript += transcript;
+    //         } else {
+    //             interimTranscript += transcript;
+    //         }
+    //     }
+    //     console.log(interimTranscript);
+    //     this.transcriptElement = finalTranscript || interimTranscript;
+    // };
+
+    // startListening = () => {
+    //     const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
+    //     if (SpeechRecognition) {
+    //         console.log('here');
+    //         const recognition = new SpeechRecognition();
+    //         recognition.continuous = true; // Continue listening even if the user pauses
+    //         recognition.interimResults = true; // Show interim results
+    //         recognition.lang = 'en-US'; // Set language (optional)
+    //         recognition.onresult = this.handleResult.bind(this);
+    //         // recognition.onend = this.handleEnd.bind(this);
+
+    //         recognition.start();
+    //         // this.handleResult;
+    //         // recognition.stop();
+    //     }
+    // };
 
     @observable _pageSizes: { width: number; height: number }[] = [];
     @observable _savedAnnotations = new ObservableMap<number, HTMLDivElement[]>();
@@ -410,7 +449,106 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
     };
 
     gptPDFFlashcards = async () => {
+        // const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
+        // if (SpeechRecognition) {
+        //     this.recognition = new SpeechRecognition();
+        //     this.recognition.continuous = true; // Continue listening even if the user pauses
+        //     this.recognition.interimResults = true; // Show interim results
+        //     this.recognition.lang = 'en-US'; // Set language (optional)
+
+        //     this.recognition.onresult = this.handleResult;
+        //     this.recognition.onerror = this.handleError;
+        //     this.recognition.onend = this.handleEnd;
+        // } else {
+        //     console.error("Browser doesn't support Speech Recognition API");
+        // }
+        // const Dictaphone = () => {
+        //     const { transcript, resetTranscript } = useSpeechRecognition();
+
+        //     if (!SpeechRecognition.browserSupportsSpeechRecognition()) {
+        //         return null;
+        //     }
+
+        //     return (
+        //         <div>
+        //             <button onClick={e => SpeechRecognition.startListening}>Start</button>
+        //             <button onClick={e => SpeechRecognition.stopListening}>Stop</button>
+        //             <button onClick={resetTranscript}>Reset</button>
+        //             <p>{transcript}</p>
+        //         </div>
+        //     );
+        // };
+        // const grammar =
+        //     '#JSGF V1.0; grammar colors; public <color> = aqua | azure | beige | bisque | black | blue | brown | chocolate | coral | crimson | cyan | fuchsia | ghostwhite | gold | goldenrod | gray | green | indigo | ivory | khaki | lavender | lime | linen | magenta | maroon | moccasin | navy | olive | orange | orchid | peru | pink | plum | purple | red | salmon | sienna | silver | snow | tan | teal | thistle | tomato | turquoise | violet | white | yellow ;';
+        // const recognition = new SpeechRecognition();
+        // const speechRecognitionList = new SpeechGrammarList();
+        // speechRecognitionList.addFromString(grammar, 1);
+        // recognition.grammars = speechRecognitionList;
+        // recognition.continuous = false;
+        // recognition.lang = 'en-US';
+        // recognition.interimResults = false;
+        // recognition.maxAlternatives = 1;
+
+        // const diagnostic = document.querySelector('.output');
+        // const bg = document.querySelector('html');
+
+        // document.body.onclick = () => {
+        //     recognition.start();
+        //     console.log('Ready to receive a color command.');
+        // };
+
+        // recognition.onresult = event => {
+        //     const color = event.results[0][0].transcript;
+        //     diagnostic!.textContent = `Result received: ${color}`;
+        //     bg!.style.backgroundColor = color;
+        // };
+
+        //const SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
+
+        // recognition.continous = true;
+        // recognition.interimResults = true;
+        // recognition.lang = 'en-US';
+
         const queryText = this._selectionText;
+
+        // const canvas = await html2canvas();
+        // const image = canvas.toDataURL("image/png", 1.0);
+        // (window as any)
+        //     .html2canvas(this._marqueeref, {
+        //         x: 100,
+        //         y: 100,
+        //         width: 100,
+        //         height: 100,
+        //     })
+        //     .then((canvas: HTMLCanvasElement) => {
+        //         const img = canvas.toDataURL('image/png');
+
+        //         const link = document.createElement('a');
+        //         link.href = img;
+        //         link.download = 'screenshot.png';
+
+        //         document.body.appendChild(link);
+        //         link.click();
+        //         link.remove();
+        //     });
+
+        // var range = window.getSelection()?.getRangeAt(0);
+        // var selectionContents = range?.extractContents();
+        // var div = document.createElement("div");
+        // div.style.color = "yellow";
+        // div.appendChild(selectionContents!);
+        // range!.insertNode(div);
+
+        // const canvas = document.createElement('canvas');
+        // const scaling = 1 / (this._props.NativeDimScaling?.() || 1);
+        // const w = AnchorMenu.Instance.marqueeWidth * scaling;
+        // const h = AnchorMenu.Instance.marqueeHeight * scaling;
+        // canvas.width = w;
+        // canvas.height = h;
+        // const ctx = canvas.getContext('2d'); // draw image to canvas. scale to target dimensions
+        // if (ctx) {
+        //     this._marqueeref && ctx.drawImage(div, NumCast(this._marqueeref.current?.left) * scaling, NumCast(this._marqueeref.current?.top) * scaling, w, h, 0, 0, w, h);
+        // }
         this._loading = true;
         try {
             if (this._selectionText === '') {
-- 
cgit v1.2.3-70-g09d2


From 20611e69b3f4afca5d35a440278f4dcbbda523c7 Mon Sep 17 00:00:00 2001
From: alyssaf16 <alyssa_feinberg@brown.edu>
Date: Mon, 24 Jun 2024 13:05:02 -0400
Subject: language menu

---
 src/client/views/ContextMenu.scss                  |  4 +-
 src/client/views/ContextMenu.tsx                   |  8 +-
 src/client/views/ContextMenuItem.tsx               |  2 +-
 src/client/views/nodes/ComparisonBox.scss          | 87 +++++++++++++++++++++-
 src/client/views/nodes/ComparisonBox.tsx           | 55 +++++++++-----
 src/client/views/nodes/ImageBox.tsx                |  2 +-
 .../views/nodes/formattedText/FormattedTextBox.tsx |  2 +-
 src/client/views/pdf/AnchorMenu.tsx                |  9 ++-
 src/client/views/pdf/PDFViewer.tsx                 |  2 +-
 9 files changed, 137 insertions(+), 34 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/ContextMenu.scss b/src/client/views/ContextMenu.scss
index 232362c5c..13ef8acec 100644
--- a/src/client/views/ContextMenu.scss
+++ b/src/client/views/ContextMenu.scss
@@ -116,7 +116,9 @@
 }
 
 .contextMenu-itemSelected {
-    background: lightgoldenrodyellow;
+    background: white;
+    color: black;
+    // background: lightgoldenrodyellow;
     border-style: none;
 }
 
diff --git a/src/client/views/ContextMenu.tsx b/src/client/views/ContextMenu.tsx
index d784a14b8..348d248c8 100644
--- a/src/client/views/ContextMenu.tsx
+++ b/src/client/views/ContextMenu.tsx
@@ -182,7 +182,8 @@ export class ContextMenu extends ObservableReactComponent<{}> {
 
     @computed get menuItems() {
         if (!this._searchString) {
-            return this._items.map((item, ind) => <ContextMenuItem key={item.description + ind} {...item} noexpand={this.itemsNeedSearch ? true : (item as any).noexpand} closeMenu={this.closeMenu} />);
+            console.log('HERESDF');
+            return this._items.map((item, ind) => <ContextMenuItem key={item.description + ind} {...item} selected={ind === this._selectedIndex} noexpand={this.itemsNeedSearch ? true : (item as any).noexpand} closeMenu={this.closeMenu} />);
         }
         return this.filteredItems.map((value, index) =>
             Array.isArray(value) ? (
@@ -249,6 +250,11 @@ export class ContextMenu extends ObservableReactComponent<{}> {
         );
     }
 
+    @action
+    setLangIndex = (ind: number) => {
+        this._selectedIndex = ind;
+    };
+
     @action
     onKeyDown = (e: React.KeyboardEvent) => {
         if (e.key === 'ArrowDown') {
diff --git a/src/client/views/ContextMenuItem.tsx b/src/client/views/ContextMenuItem.tsx
index eb1030eec..21faad0c1 100644
--- a/src/client/views/ContextMenuItem.tsx
+++ b/src/client/views/ContextMenuItem.tsx
@@ -12,7 +12,7 @@ export interface OriginalMenuProps {
     description: string;
     event: (stuff?: any) => void;
     undoable?: boolean;
-    icon: IconProp | JSX.Element; // maybe should be optional (icon?)
+    icon?: IconProp | JSX.Element; // maybe should be optional (icon?)
     closeMenu?: () => void;
 }
 
diff --git a/src/client/views/nodes/ComparisonBox.scss b/src/client/views/nodes/ComparisonBox.scss
index f7389e39b..41ff56514 100644
--- a/src/client/views/nodes/ComparisonBox.scss
+++ b/src/client/views/nodes/ComparisonBox.scss
@@ -28,17 +28,96 @@
         padding-bottom: 10px;
         padding-left: 5px;
         padding-right: 5px;
-        width: 100%;
+        // width: 80%;
         border-radius: 2px;
         height: 15%;
-        display: flex;
+        display: inline-block;
         bottom: 0;
+        // right: 0;
+
+        &.schema-header-button {
+            color: gray;
+            margin: 3px;
+            cursor: pointer;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+
+            svg {
+                width: 15px;
+            }
+        }
+
+        &.submit {
+            width: 80%;
+            // float: right;
+
+            // position: absolute;
+            // position: 10px;
+            // padding-left: 35%;
+            // padding-right: 80%;
+            // // width: 80px;
+            // // right: 0;
+            // right: 0;
+            // bottom: 0;
+        }
+        &.record {
+            width: 20%;
+            float: left;
+            border-radius: 2px;
+            // right: 0;
+            // height: 30%;
+        }
 
         button {
-            flex: 1;
-            position: relative;
+            // flex: 1;
+            // position: relative;
         }
     }
+
+    .dropbtn {
+        background-color: #3498db;
+        color: white;
+        padding: 16px;
+        font-size: 16px;
+        border: none;
+    }
+
+    .dropup {
+        position: absolute;
+        display: inline-block;
+        margin-top: 150px;
+        bottom: 0;
+    }
+
+    .dropup-content {
+        display: none;
+        position: absolute;
+        background-color: #f1f1f1;
+        min-width: 160px;
+        bottom: 40px;
+        z-index: 1000;
+    }
+
+    .dropup-content a {
+        color: black;
+        padding: 12px 16px;
+        text-decoration: none;
+        display: block;
+    }
+
+    .dropup-content a:hover {
+        background-color: #ccc;
+    }
+
+    .dropup:hover .dropup-content {
+        display: block;
+    }
+
+    .dropup:hover .dropbtn {
+        background-color: #2980b9;
+    }
+
     textarea {
         flex: 1;
         padding: 10px;
diff --git a/src/client/views/nodes/ComparisonBox.tsx b/src/client/views/nodes/ComparisonBox.tsx
index 06ecf8893..3d2a1f0a9 100644
--- a/src/client/views/nodes/ComparisonBox.tsx
+++ b/src/client/views/nodes/ComparisonBox.tsx
@@ -602,10 +602,10 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
     // });
     // };
 
-    @observable listening = false;
+    @observable private _listening = false;
     @observable transcriptElement = '';
     SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
-    recognition = new this.SpeechRecognition();
+    @observable recognition = new this.SpeechRecognition();
 
     handleResult = (e: SpeechRecognitionEvent) => {
         let interimTranscript = '';
@@ -625,31 +625,39 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
     setListening = () => {
         const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
         if (SpeechRecognition) {
-            console.log('here');
-            // const recognition = new SpeechRecognition();
-            this.recognition.continuous = true; // Continue listening even if the user pauses
-            this.recognition.interimResults = true; // Show interim results
-            this.recognition.lang = 'en-US'; // Set language (optional)
+            this.recognition.continuous = true;
+            this.recognition.interimResults = true;
+            this.recognition.lang = 'en-US';
             this.recognition.onresult = this.handleResult.bind(this);
-            // recognition.onend = this.handleEnd.bind(this);
-
-            // this.handleResult;
-            // recognition.stop();
         }
+        ContextMenu.Instance.setLangIndex(0);
     };
 
-    setLanguage = (language: string) => {
+    setLanguage = (e: React.MouseEvent, language: string, ind: number) => {
         this.recognition.lang = language;
+        ContextMenu.Instance.setLangIndex(ind);
     };
 
     startListening = () => {
         this.recognition.start();
-        this.listening = true;
+        this._listening = true;
     };
 
     stopListening = () => {
         this.recognition.stop();
-        this.listening = false;
+        this._listening = false;
+    };
+
+    openContextMenu = (x: number, y: number) => {
+        ContextMenu.Instance.clearItems();
+        ContextMenu.Instance.addItem({ description: 'English', event: e => this.setLanguage(e, 'en-US', 0) }); //prettier-ignore
+        ContextMenu.Instance.addItem({ description: 'Spanish', event: e => this.setLanguage(e, 'es-ES', 1 )}); //prettier-ignore
+        ContextMenu.Instance.addItem({ description: 'French', event: e => this.setLanguage(e, 'fr-FR', 2) }); //prettier-ignore
+        ContextMenu.Instance.addItem({ description: 'Italian', event: e => this.setLanguage(e, 'it-IT', 3) }); //prettier-ignore
+        ContextMenu.Instance.addItem({ description: 'Mandarin Chinese', event: e => this.setLanguage(e, 'zh-CH', 4) }); //prettier-ignore
+        ContextMenu.Instance.addItem({ description: 'Japanese', event: e => this.setLanguage(e, 'ja', 5) }); //prettier-ignore
+        ContextMenu.Instance.addItem({ description: 'Korean', event: e => this.setLanguage(e, 'ko', 6) }); //prettier-ignore
+        ContextMenu.Instance.displayMenu(x, y);
     };
 
     render() {
@@ -725,7 +733,7 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
                 const dataSplit = StrCast(this.dataDoc.data).includes('Keyword: ') ? StrCast(this.dataDoc.data).split('Keyword: ') : StrCast(this.dataDoc.data).split('Answer: ');
                 const newDoc = Docs.Create.TextDocument(dataSplit[1]);
                 if (this.Document.image) DocCast(newDoc).image = DocCast(this.Document.image);
-                console.log('D' + this.Document.image);
+                // console.log('D' + this.Document.image);
                 //if (DocCast(DocCast(newDoc).dataDoc)) DocCast(DocCast(newDoc).dataDoc)['image'] = this.dataDoc['image'];
 
                 // console.log('HI' + this.Document.image);
@@ -821,17 +829,24 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
                                 </div>
                             ) : null}
                         </div>
-                        <div style={{ display: 'inline-block' }}>
-                            <div className="submit-button" style={{ overflow: 'hidden' }}>
-                                <button style={{ width: '10px' }} onClick={this.listening ? this.stopListening : this.startListening}>
+                        <div>
+                            <div className="submit-button" style={{ overflow: 'hidden', display: 'flex', width: '100%' }}>
+                                <div
+                                    className="submit-buttonschema-header-button"
+                                    onPointerDown={e => this.openContextMenu(e.clientX, e.clientY)}
+                                    style={{ position: 'absolute', top: '1px', left: '11px', zIndex: '100', width: '5px', height: '5px', cursor: 'pointer' }}>
+                                    <FontAwesomeIcon color={'white'} icon="caret-down" />
+                                </div>
+                                <button className="submit-buttonrecord" onClick={this._listening ? this.stopListening : this.startListening} style={{ background: this._listening ? 'lightgray' : '', borderRadius: '2px' }}>
                                     {<FontAwesomeIcon icon="microphone" size="lg" />}
                                 </button>
+
                                 {this.layoutDoc[`_${this._props.fieldKey}_usePath`] !== 'alternate' ? (
-                                    <button type="button" onClick={this.handleRenderGPTClick} style={{ borderRadius: '2px', marginBottom: '3px' }}>
+                                    <button className="submit-buttonsubmit" type="button" onClick={this.handleRenderGPTClick} style={{ borderRadius: '2px', marginBottom: '3px', width: '300%' }}>
                                         Submit
                                     </button>
                                 ) : (
-                                    <button type="button" onClick={this.handleRenderClick} style={{ borderRadius: '2px' }}>
+                                    <button className="submit-buttonsubmit" type="button" onClick={this.handleRenderClick} style={{ borderRadius: '2px' }}>
                                         Redo the Question
                                     </button>
                                 )}
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index 65a645560..93c07f3a8 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -377,7 +377,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
             const hrefBase64 = await this.createCanvas();
             const response = await gptImageLabel(hrefBase64, 'Make flashcards out of this image with each question and answer labeled as "question" and "answer". Do not label each flashcard and do not include asterisks: ');
             console.log(response);
-            AnchorMenu.Instance.transferToFlashcard(response);
+            AnchorMenu.Instance.transferToFlashcard(response, NumCast(this.layoutDoc['x']), NumCast(this.layoutDoc['y']));
         } catch (error) {
             console.log('Error');
         }
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index 0be51816f..3c12db965 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -1046,7 +1046,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
             );
             //const response = await gptImageLabel(u, 'Make flashcards out of this text with each question and answer labeled as question and answer. Do not label each flashcard and do not include asterisks: ');
             // console.log(response);
-            AnchorMenu.Instance.transferToFlashcard(response || 'Something went wrong');
+            AnchorMenu.Instance.transferToFlashcard(response || 'Something went wrong', NumCast(this.dataDoc['x']), NumCast(this.dataDoc['y']));
             // this._props.addto_;
             // this.Document[DocData].description = response.trim();
             // return response; // Return the response
diff --git a/src/client/views/pdf/AnchorMenu.tsx b/src/client/views/pdf/AnchorMenu.tsx
index dcd76979f..31941a299 100644
--- a/src/client/views/pdf/AnchorMenu.tsx
+++ b/src/client/views/pdf/AnchorMenu.tsx
@@ -134,7 +134,7 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
      * Transfers the flashcard text generated by GPT on flashcards and creates a collection out them.
      */
 
-    transferToFlashcard = (text: string) => {
+    transferToFlashcard = (text: string, x: number, y: number) => {
         // put each question generated by GPT on the front of the flashcard
         var senArr = text.trim().split('Question: ');
         var collectionArr: Doc[] = [];
@@ -154,9 +154,10 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
         });
 
         console.log(collectionArr);
-        newCol.x = this._x;
-        newCol.y = this._y;
-        newCol.zIndex = 100;
+        newCol.x = x;
+        newCol.y = y;
+        console.log(this._x);
+        newCol.zIndex = 1000;
 
         this.addToCollection?.(newCol);
         this._loading = false;
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 1af7b1fc0..9d06f81ed 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -556,7 +556,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
             const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
 
             console.log(res);
-            AnchorMenu.Instance.transferToFlashcard(res || 'Something went wrong');
+            AnchorMenu.Instance.transferToFlashcard(res || 'Something went wrong', NumCast(this._props.layoutDoc['x']), NumCast(this._props.layoutDoc['y']));
             this._selectionText = '';
         } catch (err) {
             console.error(err);
-- 
cgit v1.2.3-70-g09d2


From 07f525dc8eef3fdedc476af1a98b5bb35314b6c6 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Mon, 30 Sep 2024 15:03:57 -0400
Subject: cleaned up some lint errors.

---
 src/client/views/ContextMenu.tsx                         |  3 ---
 src/client/views/nodes/AudioBox.tsx                      |  3 +--
 src/client/views/nodes/ImageBox.tsx                      | 11 ++++-------
 src/client/views/nodes/PDFBox.tsx                        |  5 +----
 .../views/nodes/formattedText/FormattedTextBox.tsx       | 16 +++++-----------
 src/client/views/pdf/AnchorMenu.tsx                      |  5 ++---
 src/client/views/pdf/PDFViewer.tsx                       |  2 --
 src/fields/Doc.ts                                        |  4 ----
 8 files changed, 13 insertions(+), 36 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/ContextMenu.tsx b/src/client/views/ContextMenu.tsx
index 0e98d2e35..e0eeb3f53 100644
--- a/src/client/views/ContextMenu.tsx
+++ b/src/client/views/ContextMenu.tsx
@@ -1,6 +1,3 @@
-/* eslint-disable react/no-array-index-key */
-/* eslint-disable react/jsx-props-no-spreading */
-/* eslint-disable default-param-last */
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { action, computed, IReactionDisposer, makeObservable, observable, runInAction } from 'mobx';
 import { observer } from 'mobx-react';
diff --git a/src/client/views/nodes/AudioBox.tsx b/src/client/views/nodes/AudioBox.tsx
index 8056ced1e..aaeb1eb31 100644
--- a/src/client/views/nodes/AudioBox.tsx
+++ b/src/client/views/nodes/AudioBox.tsx
@@ -8,7 +8,7 @@ import { DateField } from '../../../fields/DateField';
 import { Doc, Opt } from '../../../fields/Doc';
 import { DocData } from '../../../fields/DocSymbols';
 import { ComputedField } from '../../../fields/ScriptField';
-import { Cast, DateCast, DocCast, NumCast } from '../../../fields/Types';
+import { Cast, DateCast, NumCast } from '../../../fields/Types';
 import { AudioField, nullAudio } from '../../../fields/URLField';
 import { formatTime } from '../../../Utils';
 import { Docs } from '../../documents/Documents';
@@ -741,7 +741,6 @@ export class AudioBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 ref={action((r: CollectionStackedTimeline | null) => {
                     this._stackedTimeline = r;
                 })}
-                // eslint-disable-next-line react/jsx-props-no-spreading
                 {...this._props}
                 dataFieldKey={this.fieldKey}
                 fieldKey={this.annotationKey}
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index 91e51d24e..ae9e70e8d 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -316,7 +316,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         return cropping;
     };
 
-    createCanvas = async (downX?: number, downY?: number, cb?: (filename: string, x: number | undefined, y: number | undefined) => void) => {
+    createCanvas = async () => {
         const canvas = document.createElement('canvas');
         const scaling = 1 / (this._props.NativeDimScaling?.() || 1);
         const w = AnchorMenu.Instance.marqueeWidth * scaling;
@@ -393,9 +393,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
      * @param texts
      */
     createBoxes = (boxes: [[[number, number]]], texts: [string]) => {
-        const nscale = NumCast(this._props.PanelWidth()) * NumCast(this.layoutDoc._freeform_scale, 1);
-        const nw = nscale / NumCast(this.dataDoc[this.fieldKey + '_nativeWidth']);
-        for (var i = 0; i < boxes.length; i++) {
+        for (let i = 0; i < boxes.length; i++) {
             const coords = boxes[i] ? boxes[i] : [];
             const width = coords[1][0] - coords[0][0];
             const height = coords[2][1] - coords[0][1];
@@ -432,7 +430,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
             const response = await gptImageLabel(hrefBase64, 'Make flashcards out of this image with each question and answer labeled as "question" and "answer". Do not label each flashcard and do not include asterisks: ');
             AnchorMenu.Instance.transferToFlashcard(response, NumCast(this.layoutDoc['x']), NumCast(this.layoutDoc['y']));
         } catch (error) {
-            console.log('Error');
+            console.log('Error', error);
         }
         this._loading = false;
     };
@@ -442,7 +440,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
             const hrefBase64 = await this.createCanvas();
             this.pushInfo(quizMode.NORMAL, hrefBase64);
         } catch (error) {
-            console.log('Error');
+            console.log('Error', error);
         }
     };
 
@@ -824,7 +822,6 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 }}>
                 <CollectionFreeFormView
                     ref={this._ffref}
-                    // eslint-disable-next-line react/jsx-props-no-spreading
                     {...this._props}
                     setContentViewBox={emptyFunction}
                     NativeWidth={returnZero}
diff --git a/src/client/views/nodes/PDFBox.tsx b/src/client/views/nodes/PDFBox.tsx
index cb0b0d71f..596975062 100644
--- a/src/client/views/nodes/PDFBox.tsx
+++ b/src/client/views/nodes/PDFBox.tsx
@@ -10,7 +10,7 @@ import { DocData } from '../../../fields/DocSymbols';
 import { Id } from '../../../fields/FieldSymbols';
 import { InkTool } from '../../../fields/InkField';
 import { ComputedField } from '../../../fields/ScriptField';
-import { Cast, FieldValue, ImageCast, NumCast, StrCast, toList } from '../../../fields/Types';
+import { Cast, FieldValue, NumCast, StrCast, toList } from '../../../fields/Types';
 import { ImageField, PdfField } from '../../../fields/URLField';
 import { TraceMobx } from '../../../fields/util';
 import { emptyFunction } from '../../../Utils';
@@ -540,7 +540,6 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
             return ComponentTag === CollectionStackingView ? (
                 <SidebarAnnos
                     ref={this._sidebarRef}
-                    // eslint-disable-next-line react/jsx-props-no-spreading
                     {...this._props}
                     Document={this.Document}
                     layoutDoc={this.layoutDoc}
@@ -556,7 +555,6 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
             ) : (
                 <div onPointerDown={e => setupMoveUpEvents(this, e, returnFalse, emptyFunction, () => this._props.select(false), true)}>
                     <ComponentTag
-                        // eslint-disable-next-line react/jsx-props-no-spreading
                         {...this._props}
                         setContentViewBox={emptyFunction} // override setContentView to do nothing
                         NativeWidth={this.sidebarNativeWidthFunc}
@@ -610,7 +608,6 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                         top: 0,
                     }}>
                     <PDFViewer
-                        // eslint-disable-next-line react/jsx-props-no-spreading
                         {...this._props}
                         pdfBox={this}
                         sidebarAddDoc={this.sidebarAddDocument}
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index 07a4d1093..9b3e1ca39 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -141,6 +141,9 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
     set _recordingDictation(value) {
         !this.dataDoc[`${this.fieldKey}_recordingSource`] && (this.dataDoc.mediaState = value ? mediaState.Recording : undefined);
     }
+
+    // eslint-disable-next-line no-return-assign
+    @computed get config()                     { return FormattedTextBox.MakeConfig(this._rules = new RichTextRules(this.Document, this), this._props); } // prettier-ignore
     @computed get _recordingDictation()        { return this.dataDoc?.mediaState === mediaState.Recording; } // prettier-ignore
     @computed get SidebarShown()               {  return !!(this._showSidebar || this.layoutDoc._layout_showSidebar);  } // prettier-ignore
     @computed get allSidebarDocs()             { return DocListCast(this.dataDoc[this.sidebarKey]); } // prettier-ignore
@@ -153,7 +156,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
     @computed get sidebarHeight()              { return !this.sidebarWidth() ? 0 : NumCast(this.dataDoc[this.sidebarKey + '_height']); } // prettier-ignore
     @computed get titleHeight()                { return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.HeaderMargin) as number || 0; } // prettier-ignore
     @computed get layout_autoHeightMargins()   { return this.titleHeight + NumCast(this.layoutDoc._layout_autoHeightMargins); } // prettier-ignore
-    @computed get config()                     { return FormattedTextBox.MakeConfig(this._rules = new RichTextRules(this.Document, this), this._props); } // prettier-ignore
     @computed get sidebarKey()                 { return this.fieldKey + '_sidebar'; } // prettier-ignore
 
     constructor(props: FormattedTextBoxProps) {
@@ -663,7 +665,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
                         textContent += node.child(i).textContent;
                         i++;
                     }
-                    // eslint-disable-next-line no-cond-assign
                     while (ep && (foundAt = textContent.slice(index).search(regexp)) > -1) {
                         const sel = new TextSelection(pm.state.doc.resolve(ep.from + index + blockOffset + foundAt + 1), pm.state.doc.resolve(ep.from + index + blockOffset + foundAt + find.length + 1));
                         ret.push(sel);
@@ -722,7 +723,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
             const hr = Math.round(Date.now() / 1000 / 60 / 60);
             numberRange(10).map(i => addStyleSheetRule(FormattedTextBox._userStyleSheet, 'UM-hr-' + (hr - i), { opacity: ((10 - i - 1) / 10).toString() }));
         }
-        // eslint-disable-next-line operator-assignment
         this.layoutDoc[DocCss] = this.layoutDoc[DocCss] + 1; // css changes happen outside of react/mobx.  so we need to set a flag that will notify anyone interested in layout changes triggered by css changes (eg., CollectionLinkView)
     };
 
@@ -987,7 +987,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
     findImageTags = async () => {
         const c = this.ProseRef?.getElementsByTagName('img');
         if (c) {
-            for (let i of c) {
+            for (const i of c) {
                 console.log(i);
 
                 // console.log(canvas.toDataURL());
@@ -1034,7 +1034,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
             // this.Document[DocData].description = response.trim();
             // return response; // Return the response
         } catch (error) {
-            console.log('Error');
+            console.log('Error', error);
         }
         // return '';
     };
@@ -1195,7 +1195,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
             const nodes: Node[] = [];
             let hadStart = start !== 0;
             frag.forEach((node, index) => {
-                // eslint-disable-next-line no-use-before-define
                 const examinedNode = findAnchorNode(node, editor);
                 if (examinedNode?.node && (examinedNode.node.textContent || examinedNode.node.type === this._editorView?.state.schema.nodes.dashDoc || examinedNode.node.type === this._editorView?.state.schema.nodes.audiotag)) {
                     nodes.push(examinedNode.node);
@@ -1349,7 +1348,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
             action(selected => {
                 this.prepareForTyping();
                 if (FormattedTextBox._globalHighlights.has('Bold Text')) {
-                    // eslint-disable-next-line operator-assignment
                     this.layoutDoc[DocCss] = this.layoutDoc[DocCss] + 1; // css change happens outside of mobx/react, so this will notify anyone interested in the layout that it has changed
                 }
                 if (RichTextMenu.Instance?.view === this._editorView && !selected) {
@@ -1800,7 +1798,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
         const match = RTFCast(this.Document[this.fieldKey])?.Text.match(/^(@[a-zA-Z][a-zA-Z_0-9 -]*[a-zA-Z_0-9-]+)/);
         if (match) {
             this.dataDoc.title_custom = true;
-            // eslint-disable-next-line prefer-destructuring
             this.dataDoc.title = match[1]; // this triggers the collectionDockingView to publish this Doc
             this.EditorView?.dispatch(this.EditorView?.state.tr.deleteRange(0, match[1].length + 1));
         }
@@ -1882,7 +1879,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
         const margins = 2 * NumCast(this.layoutDoc._yMargin, this._props.yPadding || 0);
         const children = this.ProseRef?.children.length ? Array.from(this.ProseRef.children[0].children) : undefined;
         if (children && !SnappingManager.IsDragging) {
-            // eslint-disable-next-line no-use-before-define
             const getChildrenHeights = (kids: Element[] | undefined) => kids?.reduce((p, child) => p + toHgt(child), margins) ?? 0;
             const toNum = (val: string) => Number(val.replace('px', ''));
             const toHgt = (node: Element): number => {
@@ -1969,7 +1965,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
             return ComponentTag === CollectionStackingView ? (
                 <SidebarAnnos
                     ref={this._sidebarRef}
-                    // eslint-disable-next-line react/jsx-props-no-spreading
                     {...this._props}
                     Document={this.Document}
                     layoutDoc={this.layoutDoc}
@@ -1989,7 +1984,6 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
             ) : (
                 <div onPointerDown={e => setupMoveUpEvents(this, e, returnFalse, emptyFunction, () => DocumentView.SelectView(this.DocumentView?.(), false), true)}>
                     <ComponentTag
-                        // eslint-disable-next-line react/jsx-props-no-spreading
                         {...this._props}
                         ref={this._sidebarTagRef}
                         setContentView={emptyFunction}
diff --git a/src/client/views/pdf/AnchorMenu.tsx b/src/client/views/pdf/AnchorMenu.tsx
index 6dd036cf6..a212cbd91 100644
--- a/src/client/views/pdf/AnchorMenu.tsx
+++ b/src/client/views/pdf/AnchorMenu.tsx
@@ -15,7 +15,6 @@ import { LinkPopup } from '../linking/LinkPopup';
 import { DocumentView } from '../nodes/DocumentView';
 import './AnchorMenu.scss';
 import { GPTPopup, GPTPopupMode } from './GPTPopup/GPTPopup';
-import ReactLoading from 'react-loading';
 
 @observer
 export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
@@ -137,8 +136,8 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
 
     transferToFlashcard = (text: string, x: number, y: number) => {
         // put each question generated by GPT on the front of the flashcard
-        var senArr = text.trim().split('Question: ');
-        var collectionArr: Doc[] = [];
+        const senArr = text.trim().split('Question: ');
+        const collectionArr: Doc[] = [];
         for (let i = 1; i < senArr.length; i++) {
             console.log('Arr ' + i + ': ' + senArr[i]);
             const newDoc = Docs.Create.ComparisonDocument(senArr[i], { _layout_isFlashcard: true, _width: 300, _height: 300 });
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 02d310f7d..477157cce 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -660,7 +660,6 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         return (
             <div className="pdfViewerDash-annotationLayer" style={{ height: Doc.NativeHeight(this._props.Document), transform: `scale(${NumCast(this._props.layoutDoc._freeform_scale, 1)})` }} ref={this._annotationLayer}>
                 {inlineAnnos.map(anno => (
-                    // eslint-disable-next-line react/jsx-props-no-spreading
                     <Annotation {...this._props} fieldKey={this._props.fieldKey + '_annotations'} pointerEvents={this.pointerEvents} containerDataDoc={this._props.dataDoc} annoDoc={anno} key={`${anno[Id]}-annotation`} />
                 ))}
             </div>
@@ -694,7 +693,6 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
                 pointerEvents: Doc.ActiveTool !== InkTool.None ? 'all' : undefined,
             }}>
             <CollectionFreeFormView
-                // eslint-disable-next-line react/jsx-props-no-spreading
                 {...this._props}
                 NativeWidth={returnZero}
                 NativeHeight={returnZero}
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index b8025cac4..90ecc7f56 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -335,7 +335,6 @@ export class Doc extends RefField {
         if (!id || forceSave) {
             DocServer.CreateDocField(docProxy);
         }
-        // eslint-disable-next-line no-constructor-return
         return docProxy; // need to return the proxy from the constructor so that all our added fields will get called
     }
 
@@ -463,7 +462,6 @@ export class Doc extends RefField {
     }
 }
 
-// eslint-disable-next-line no-redeclare
 export namespace Doc {
     export let SelectOnLoad: Doc | undefined;
     export function SetSelectOnLoad(doc: Doc | undefined) {
@@ -659,7 +657,6 @@ export namespace Doc {
                     if (reversed) list.splice(0, 0, doc);
                     else list.push(doc);
                 } else {
-                    // eslint-disable-next-line no-lonely-if
                     if (reversed) list.splice(before ? list.length - ind + 1 : list.length - ind, 0, doc);
                     else list.splice(before ? ind : ind + 1, 0, doc);
                 }
@@ -1191,7 +1188,6 @@ export namespace Doc {
         return Cast(Doc.UserDoc().myLinkDatabase, Doc, null);
     }
     export function SetUserDoc(doc: Doc) {
-        // eslint-disable-next-line no-return-assign
         return (manager._user_doc = doc);
     }
 
-- 
cgit v1.2.3-70-g09d2


From fa54fdf2bf9bf8523da393a81ec1ac1cd4fa0f4c Mon Sep 17 00:00:00 2001
From: alyssaf16 <alyssa_feinberg@brown.edu>
Date: Sun, 6 Oct 2024 15:11:20 -0400
Subject: comments

---
 src/client/views/nodes/AudioBox.tsx       |  3 --
 src/client/views/nodes/ComparisonBox.scss | 44 ------------------------
 src/client/views/nodes/ComparisonBox.tsx  | 13 ++++++-
 src/client/views/nodes/ImageBox.tsx       | 57 +++++++++++++++++++++++++++++--
 src/client/views/nodes/LabelBox.tsx       |  8 +----
 src/client/views/nodes/PDFBox.tsx         |  5 +--
 src/client/views/pdf/PDFViewer.tsx        | 43 -----------------------
 7 files changed, 69 insertions(+), 104 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/nodes/AudioBox.tsx b/src/client/views/nodes/AudioBox.tsx
index 8056ced1e..6a918664c 100644
--- a/src/client/views/nodes/AudioBox.tsx
+++ b/src/client/views/nodes/AudioBox.tsx
@@ -297,7 +297,6 @@ export class AudioBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
             },
         });
         this.Document[DocData].phoneticTranscription = response.data['transcription'];
-        console.log('RESPONSE: ' + response.data['transcription']);
     };
 
     youtubeUpload = async () => {
@@ -310,13 +309,11 @@ export class AudioBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 'Content-Type': 'application/json',
             },
         });
-        console.log('RESPONSE: ' + response.data['transcription']);
     };
 
     // context menu
     specificContextMenu = (): void => {
         const funcs: ContextMenuProps[] = [];
-        // funcs.push({ description: 'Push info', event: this.pushInfo, icon: 'redo-alt' });
 
         funcs.push({
             description: 'Youtube',
diff --git a/src/client/views/nodes/ComparisonBox.scss b/src/client/views/nodes/ComparisonBox.scss
index da1d352f2..b7307f3a3 100644
--- a/src/client/views/nodes/ComparisonBox.scss
+++ b/src/client/views/nodes/ComparisonBox.scss
@@ -30,12 +30,10 @@
         padding-top: 5px;
         padding-left: 5px;
         padding-right: 5px;
-        // width: 80%;
         border-radius: 2px;
         height: 17%;
         display: inline-block;
         bottom: 0;
-        // right: 0;
 
         &.schema-header-button {
             color: gray;
@@ -57,28 +55,11 @@
         }
         &.submit {
             width: 40%;
-            // float: right;
-
-            // position: absolute;
-            // position: 10px;
-            // padding-left: 35%;
-            // padding-right: 80%;
-            // // width: 80px;
-            // // right: 0;
-            // right: 0;
-            // bottom: 0;
         }
         &.record {
             width: 20%;
             float: left;
             border-radius: 2px;
-            // right: 0;
-            // height: 30%;
-        }
-
-        button {
-            // flex: 1;
-            // position: relative;
         }
     }
 
@@ -128,7 +109,6 @@
     textarea {
         flex: 1;
         padding: 10px;
-        // position: relative;
         resize: none;
         position: 'absolute';
         width: '91%';
@@ -235,7 +215,6 @@
     top: 10px;
     left: 10px;
     z-index: 200;
-    // padding: 5px;
     background: #dfdfdf;
     pointer-events: none;
 }
@@ -249,29 +228,8 @@
             display: flex;
         }
     }
-
-    // .input-box {
-    //     position: absolute;
-    //     padding: 10px;
-    // }
-    // input[type='text'] {
-    //     flex: 1;
-    //     position: relative;
-    //     margin-right: 10px;
-    //     width: 100px;
-    // }
 }
 
-// .quiz-card {
-//     position: relative;
-
-//     input[type='text'] {
-//         flex: 1;
-//         position: relative;
-//         margin-right: 10px;
-//         width: 100px;
-//     }
-// }
 .QuizCard {
     width: 100%;
     height: 100%;
@@ -288,8 +246,6 @@
         align-items: center;
         justify-content: center;
         .QuizCardBox {
-            /* existing code */
-
             .DIYNodeBox-iframe {
                 height: 100%;
                 width: 100%;
diff --git a/src/client/views/nodes/ComparisonBox.tsx b/src/client/views/nodes/ComparisonBox.tsx
index 9ac8d7c52..461a65c27 100644
--- a/src/client/views/nodes/ComparisonBox.tsx
+++ b/src/client/views/nodes/ComparisonBox.tsx
@@ -340,6 +340,10 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
         ContextMenu.Instance.setLangIndex(ind);
     };
 
+    /**
+     * Determine which language the speech to text tool is in.
+     * @returns
+     */
     convertAbr = () => {
         switch (this.recognition.lang) {
             case 'en-US': return 'English'; //prettier-ignore
@@ -364,6 +368,9 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
         ContextMenu.Instance.displayMenu(x, y);
     };
 
+    /**
+     * Creates an AudioBox to record a user's audio.
+     */
     evaluatePronunciation = () => {
         const newAudio = Docs.Create.AudioDocument(nullAudio, { _width: 200, _height: 100 });
         this.Document.audio = newAudio[DocData];
@@ -386,6 +393,11 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
         this.Document.phoneticTranscription = response.data['transcription'];
     };
 
+    /**
+     * Extracts the id of the youtube video url.
+     * @param url
+     * @returns
+     */
     getYouTubeVideoId = (url: string) => {
         const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
         const match = url.match(regExp);
@@ -510,7 +522,6 @@ export class ComparisonBox extends ViewBoxAnnotatableComponent<FieldViewProps>()
             } else if (callType === GPTCallType.FLASHCARD) {
                 this._loading = false;
                 return res;
-            } else if (callType === GPTCallType.STACK) {
             }
             this._loading = false;
             return res;
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index 91e51d24e..32d1e471e 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -316,6 +316,14 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         return cropping;
     };
 
+    /**
+     * Draw image to a canvas so it can be converted to base64 and be passed into
+     * GPT to be analyzed.
+     * @param downX
+     * @param downY
+     * @param cb
+     * @returns
+     */
     createCanvas = async (downX?: number, downY?: number, cb?: (filename: string, x: number | undefined, y: number | undefined) => void) => {
         const canvas = document.createElement('canvas');
         const scaling = 1 / (this._props.NativeDimScaling?.() || 1);
@@ -366,6 +374,12 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         }
     };
 
+    /**
+     * Calls backend to find any text on an image. Gets the text and the
+     * coordinates of the text and creates label boxes at those locations.
+     * @param quiz
+     * @param i
+     */
     pushInfo = async (quiz: quizMode, i?: string) => {
         this._quizMode = quiz;
         this._loading = true;
@@ -437,6 +451,11 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         this._loading = false;
     };
 
+    /**
+     * Calls the createCanvas and pushInfo methods to convert the
+     * image to a form that can be passed to GPT and find the locations
+     * of the text.
+     */
     makeLabels = async () => {
         try {
             const hrefBase64 = await this.createCanvas();
@@ -446,6 +465,13 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         }
     };
 
+    /**
+     * Determines whether two words should be considered
+     * the same, allowing minor typos.
+     * @param str1
+     * @param str2
+     * @returns
+     */
     levenshteinDistance = (str1: string, str2: string) => {
         const len1 = str1.length;
         const len2 = str2.length;
@@ -471,6 +497,12 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         return dp[len1][len2];
     };
 
+    /**
+     * Different algorithm for determining string similarity.
+     * @param str1
+     * @param str2
+     * @returns
+     */
     jaccardSimilarity = (str1: string, str2: string) => {
         const set1 = new Set(str1.split(' '));
         const set2 = new Set(str2.split(' '));
@@ -481,6 +513,14 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         return intersection.size / union.size;
     };
 
+    /**
+     * Averages the jaccardSimilarity and levenshteinDistance scores
+     * to determine string similarity for the labelboxes answers and
+     * the users response.
+     * @param str1
+     * @param str2
+     * @returns
+     */
     stringSimilarity(str1: string, str2: string) {
         const levenshteinDist = this.levenshteinDistance(str1, str2);
         const levenshteinScore = 1 - levenshteinDist / Math.max(str1.length, str2.length);
@@ -511,12 +551,23 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         );
     }
 
+    /**
+     * Returns whether two strings are similar
+     * @param input
+     * @param target
+     * @returns
+     */
     compareWords = (input: string, target: string) => {
         const distance = this.stringSimilarity(input.toLowerCase(), target.toLowerCase());
-        // const threshold = Math.max(input.length, target.length) * 0.2; // Allow up to 20% of the length as difference
         return distance >= 0.7;
     };
 
+    /**
+     * GPT returns a hex color for what color the label box should be based on
+     * the correctness of the users answer.
+     * @param inputString
+     * @returns
+     */
     extractHexAndSentences = (inputString: string) => {
         // Regular expression to match a hexadecimal number at the beginning followed by a period and sentences
         const regex = /^#([0-9A-Fa-f]+)\.\s*(.+)$/s;
@@ -569,13 +620,15 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         });
     };
 
+    /**
+     * Get rid of all the label boxes on the images.
+     */
     exitQuizMode = () => {
         this._quizMode = quizMode.NONE;
         this._quizBoxes.forEach(doc => {
             this.removeDocument?.(doc);
         });
         this._quizBoxes = [];
-        console.log('remove');
     };
 
     @action
diff --git a/src/client/views/nodes/LabelBox.tsx b/src/client/views/nodes/LabelBox.tsx
index bcf55fbe8..79366f76f 100644
--- a/src/client/views/nodes/LabelBox.tsx
+++ b/src/client/views/nodes/LabelBox.tsx
@@ -169,11 +169,7 @@ export class LabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
                         width: this._props.PanelWidth(),
                         height: this._props.PanelHeight(),
                         whiteSpace: 'multiLine' in boxParams && boxParams.multiLine ? 'pre-wrap' : 'pre',
-                    }}
-                    // onMouseLeave={() => {
-                    //     this.hoverFlip(undefined);
-                    // }}
-                >
+                    }}>
                     <div
                         style={{
                             width: this._props.PanelWidth() - 2 * NumCast(this.layoutDoc._xPadding),
@@ -185,10 +181,8 @@ export class LabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
                         })}
                         onKeyUp={action(e => {
                             e.stopPropagation();
-                            // if (e.key === 'Enter') {
                             this.dataDoc[this.fieldKey] = this._divRef?.innerText ?? '';
                             setTimeout(() => this._props.select(false));
-                            // }
                         })}
                         onBlur={() => {
                             this.dataDoc[this.fieldKey] = this._divRef?.innerText ?? '';
diff --git a/src/client/views/nodes/PDFBox.tsx b/src/client/views/nodes/PDFBox.tsx
index cb0b0d71f..e7470c74c 100644
--- a/src/client/views/nodes/PDFBox.tsx
+++ b/src/client/views/nodes/PDFBox.tsx
@@ -120,11 +120,9 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         this.replaceCanvases(docViewContent, newDiv);
         const htmlString = this._pdfViewer?._mainCont.current && new XMLSerializer().serializeToString(newDiv);
 
-        // const anchx = NumCast(cropping.x);
-        // const anchy = NumCast(cropping.y);
         const anchw = NumCast(cropping._width) * (this._props.NativeDimScaling?.() || 1);
         const anchh = NumCast(cropping._height) * (this._props.NativeDimScaling?.() || 1);
-        // const viewScale = 1;
+
         cropping.title = 'crop: ' + this.Document.title;
         cropping.x = NumCast(this.Document.x) + NumCast(this.layoutDoc._width);
         cropping.y = NumCast(this.Document.y);
@@ -473,7 +471,6 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
 
         !Doc.noviceMode && optionItems.push({ description: 'Toggle Sidebar Type', event: this.toggleSidebarType, icon: 'expand-arrows-alt' });
         !Doc.noviceMode && optionItems.push({ description: 'update icon', event: () => this.pdfUrl && this.updateIcon(), icon: 'expand-arrows-alt' });
-        // optionItems.push({ description: "Toggle Sidebar ", event: () => this.toggleSidebar(), icon: "expand-arrows-alt" });
         !options && ContextMenu.Instance.addItem({ description: 'Options...', subitems: optionItems, icon: 'asterisk' });
         const help = cm.findByDescription('Help...');
         const helpItems = help?.subitems ?? [];
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 02d310f7d..1d7f269fb 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -30,12 +30,6 @@ import { GPTPopup } from './GPTPopup/GPTPopup';
 import './PDFViewer.scss';
 import { GPTCallType, gptAPICall } from '../../apis/gpt/GPT';
 import ReactLoading from 'react-loading';
-// import html2canvas from 'html2canvas';
-// import SpeechRecognition, { useSpeechRecognition } from 'react-speech-recognition';
-
-// pdfjsLib.GlobalWorkerOptions.workerSrc = `/assets/pdf.worker.js`;
-// The workerSrc property shall be specified.
-// Pdfjs.GlobalWorkerOptions.workerSrc = 'https://unpkg.com/pdfjs-dist@4.4.168/build/pdf.worker.mjs';
 
 interface IViewerProps extends FieldViewProps {
     pdfBox: PDFBox;
@@ -64,43 +58,6 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         super(props);
         makeObservable(this);
     }
-    // @observable transcriptRef = React.createRef();
-    // @observable startBtnRef = React.createRef();
-    // @observable stopBtnRef = React.createRef();
-    // @observable transcriptElement = '';
-
-    // handleResult = (e: SpeechRecognitionEvent) => {
-    //     let interimTranscript = '';
-    //     let finalTranscript = '';
-    //     console.log('H');
-    //     for (let i = e.resultIndex; i < e.results.length; i++) {
-    //         const transcript = e.results[i][0].transcript;
-    //         if (e.results[i].isFinal) {
-    //             finalTranscript += transcript;
-    //         } else {
-    //             interimTranscript += transcript;
-    //         }
-    //     }
-    //     console.log(interimTranscript);
-    //     this.transcriptElement = finalTranscript || interimTranscript;
-    // };
-
-    // startListening = () => {
-    //     const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
-    //     if (SpeechRecognition) {
-    //         console.log('here');
-    //         const recognition = new SpeechRecognition();
-    //         recognition.continuous = true; // Continue listening even if the user pauses
-    //         recognition.interimResults = true; // Show interim results
-    //         recognition.lang = 'en-US'; // Set language (optional)
-    //         recognition.onresult = this.handleResult.bind(this);
-    //         // recognition.onend = this.handleEnd.bind(this);
-
-    //         recognition.start();
-    //         // this.handleResult;
-    //         // recognition.stop();
-    //     }
-    // };
 
     @observable _pageSizes: { width: number; height: number }[] = [];
     @observable _savedAnnotations = new ObservableMap<number, (HTMLDivElement & { marqueeing?: boolean })[]>();
-- 
cgit v1.2.3-70-g09d2


From fc3e2b18b9dad38920e1cec5e58bf9fbd06f4aaf Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 8 Oct 2024 03:30:21 -0400
Subject: changed carousel view to resize ui buttons based on screen scaling
 and document dimensions.  lint errors.

---
 src/client/util/Import & Export/ImageUtils.ts      |   1 -
 .../views/collections/CollectionCarouselView.scss  |  95 ++++++-----
 .../views/collections/CollectionCarouselView.tsx   | 176 +++++++++++----------
 src/client/views/collections/TabDocView.tsx        |   1 -
 src/client/views/nodes/LabelBox.tsx                |   2 +-
 src/client/views/pdf/PDFViewer.tsx                 |   2 -
 6 files changed, 142 insertions(+), 135 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/util/Import & Export/ImageUtils.ts b/src/client/util/Import & Export/ImageUtils.ts
index 266e05f08..8d4eefa7e 100644
--- a/src/client/util/Import & Export/ImageUtils.ts	
+++ b/src/client/util/Import & Export/ImageUtils.ts	
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/no-namespace */
 import { ClientUtils } from '../../../ClientUtils';
 import { Doc } from '../../../fields/Doc';
 import { DocData } from '../../../fields/DocSymbols';
diff --git a/src/client/views/collections/CollectionCarouselView.scss b/src/client/views/collections/CollectionCarouselView.scss
index af617254a..97952822e 100644
--- a/src/client/views/collections/CollectionCarouselView.scss
+++ b/src/client/views/collections/CollectionCarouselView.scss
@@ -40,7 +40,6 @@
 }
 .carouselView-back,
 .carouselView-fwd,
-.carouselView-star,
 .carouselView-remove,
 .carouselView-check,
 .carouselView-add {
@@ -58,16 +57,14 @@
     }
 }
 .carouselView-fwd {
-    top: 42.5%;
-    right: 20;
+    top: calc(50% - 15px);
+    right: 0;
+    transform-origin: right top;
 }
 .carouselView-back {
-    top: 42.5%;
-    left: 20;
-}
-.carouselView-star {
-    top: 0;
+    top: calc(50% - 15px);
     left: 0;
+    transform-origin: top left;
 }
 .carouselView-add {
     position: absolute;
@@ -75,62 +72,60 @@
     left: 0;
 }
 .carouselView-remove {
-    top: 80%;
     left: 52%;
 }
 .carouselView-check {
-    top: 80%;
     right: 52%;
 }
-.carouselView-quiz {
-    position: relative;
-    display: flex;
-    height: 20px;
-    align-items: center;
-    margin: auto;
-    &:hover {
-        color: white;
-    }
-}
-
-.carouselView-practice {
-    position: relative;
-    display: flex;
-    flex-direction: column;
-    height: 20px;
-    align-items: center;
-    margin: auto;
-    &:hover {
-        color: white;
-    }
-}
-.carouselView-starFilter {
-    position: relative;
-    display: flex;
-    height: 20px;
-    align-items: center;
-    &:hover {
-        color: white;
-    }
-}
-
-.carouselView-practiceModes {
-    width: 100%;
-    height: 40px;
-    display: flex;
-    flex-direction: column;
-}
 .carouselView-menu {
     position: absolute;
     flex-direction: column;
     align-items: center;
     display: flex;
-    top: 2px;
-    left: 2px;
+    top: 0px;
+    left: 0px;
     width: 30;
+    transform-origin: top left;
     border-radius: 5px;
     color: rgba(255, 255, 255, 0.5);
     background: rgba(0, 0, 0, 0.1);
+    .carouselView-practiceModes {
+        width: 100%;
+        display: flex;
+        flex-direction: column;
+        top: 0;
+        position: relative;
+        .carouselView-quiz {
+            position: relative;
+            display: flex;
+            height: 20px;
+            align-items: center;
+            margin: auto;
+            &:hover {
+                color: white;
+            }
+            & > svg {
+                height: 100%;
+                width: 100%;
+            }
+        }
+
+        .carouselView-practice {
+            position: relative;
+            display: flex;
+            flex-direction: column;
+            height: 20px;
+            align-items: center;
+            margin: auto;
+            &:hover {
+                color: white;
+            }
+            & > svg {
+                height: 100%;
+                width: 100%;
+            }
+        }
+    }
 }
 
 .carouselView-back:hover,
diff --git a/src/client/views/collections/CollectionCarouselView.tsx b/src/client/views/collections/CollectionCarouselView.tsx
index 936226baf..559dcfe2a 100644
--- a/src/client/views/collections/CollectionCarouselView.tsx
+++ b/src/client/views/collections/CollectionCarouselView.tsx
@@ -7,7 +7,6 @@ import { StopEvent, returnOne, returnZero } from '../../../ClientUtils';
 import { Doc, DocListCast, Opt } from '../../../fields/Doc';
 import { BoolCast, DocCast, NumCast, ScriptCast, StrCast } from '../../../fields/Types';
 import { DocumentType } from '../../documents/DocumentTypes';
-import { Docs } from '../../documents/Documents';
 import { DragManager } from '../../util/DragManager';
 import { StyleProp } from '../StyleProp';
 import { TagItem } from '../TagsView';
@@ -36,6 +35,8 @@ export class CollectionCarouselView extends CollectionSubView() {
     get sideField()     { return "_" + this.fieldKey + "_usePath"; } // prettier-ignore
     get starField()     { return "#star"; } // prettier-ignore
 
+    _sideBtnWidth = 35;
+
     _fadeTimer: NodeJS.Timeout | undefined;
 
     constructor(props: SubCollectionViewProps) {
@@ -155,7 +156,11 @@ export class CollectionCarouselView extends CollectionSubView() {
     onContentDoubleClick = () => ScriptCast(this.layoutDoc.onChildDoubleClick);
     onContentClick = () => ScriptCast(this.layoutDoc.onChildClick);
     captionWidth = () => this._props.PanelWidth() - 2 * this.marginX;
-    contentScreentToLocalXf = () => this._props.ScreenToLocalTransform().translate(-NumCast(this.layoutDoc.xMargin), -NumCast(this.layoutDoc.yMargin));
+    contentScreenToLocalXf = () =>
+        this._props
+            .ScreenToLocalTransform()
+            .translate(-NumCast(this.layoutDoc.xMargin), -NumCast(this.layoutDoc.yMargin))
+            .scale(this._props.NativeDimScaling?.() || 1);
 
     contentPanelWidth = () => this._props.PanelWidth() - 2 * NumCast(this.layoutDoc.xMargin);
 
@@ -168,9 +173,9 @@ export class CollectionCarouselView extends CollectionSubView() {
                 ? false
                 : undefined;
 
-    childScreenToLocalXf = () => this._props.ScreenToLocalTransform().scale(this._props.NativeDimScaling?.() || 1);
-
     renderDoc = (doc: Doc, showCaptions: boolean, overlayFunc?: (r: DocumentView | null) => void) => {
+        const screenScale = this.ScreenToLocalBoxXf().Scale;
+        const fitWidthScale = (NumCast(this.Document.width, 1) / NumCast(this.carouselItems[this.carouselIndex]?._width)) * (this._props.NativeDimScaling?.() || 1);
         return (
             <DocumentView
                 {...this._props}
@@ -195,10 +200,10 @@ export class CollectionCarouselView extends CollectionSubView() {
                 childFilters={this.childDocFilters}
                 hideDecorations={BoolCast(this.layoutDoc.layout_hideDecorations)}
                 addDocument={this._props.addDocument}
-                ScreenToLocalTransform={this.contentScreentToLocalXf}
+                ScreenToLocalTransform={this.contentScreenToLocalXf}
                 PanelWidth={this.contentPanelWidth}
                 PanelHeight={this.contentPanelHeight}
-                xPadding={35}
+                xPadding={(this._sideBtnWidth * Math.min(this.maxWidgetScale, screenScale * screenScale)) / fitWidthScale} // padding shrinks based on screenScale to maintain its size, and then again by screenSize to get smaller
             />
         );
     };
@@ -259,46 +264,6 @@ export class CollectionCarouselView extends CollectionSubView() {
         );
     }
 
-    addFlashcard() {
-        const newDoc = Docs.Create.ComparisonDocument('', { _layout_isFlashcard: true, _width: 300, _height: 300 });
-        this.addDocument?.(newDoc);
-    }
-
-    @computed get buttons() {
-        if (!this.carouselItems?.[this.carouselIndex]) return null;
-        return (
-            <>
-                <div>
-                    {/* <Tooltip title="add new flashcard to pile">
-                        <div key="add" className="carouselView-add" onClick={this.addFlashcard}>
-                            <FontAwesomeIcon icon="plus" color={this.carouselItems?.[NumCast(this.layoutDoc._carousel_index)].layout[this.starField] ? 'yellow' : 'gray'} size="1x" />
-                        </div>
-                    </Tooltip> */}
-                </div>
-                <div key="back" className="carouselView-back" onClick={this.goback}>
-                    <FontAwesomeIcon icon="chevron-left" size="2x" />
-                </div>
-                <div key="fwd" className="carouselView-fwd" onClick={this.advance}>
-                    <FontAwesomeIcon icon="chevron-right" size="2x" />
-                </div>
-                {this.practiceMode == practiceMode.PRACTICE ? (
-                    <div>
-                        <Tooltip title="Incorrect. View again later.">
-                            <div key="remove" className="carouselView-remove" onClick={e => this.setPracticeVal(e, practiceVal.MISSED)}>
-                                <FontAwesomeIcon icon="xmark" color="red" size="1x" />
-                            </div>
-                        </Tooltip>
-                        <Tooltip title="Correct">
-                            <div key="check" className="carouselView-check" onClick={e => this.setPracticeVal(e, practiceVal.CORRECT)}>
-                                <FontAwesomeIcon icon="check" color="green" size="1x" />
-                            </div>
-                        </Tooltip>
-                    </div>
-                ) : null}
-            </>
-        );
-    }
-
     togglePracticeMode = (mode: practiceMode) => this.setPracticeMode(mode === this.practiceMode ? undefined : mode);
     toggleFilterMode = () => Doc.setDocFilter(this.Document, 'tags', this.starField, 'check', true);
     setColor = (mode: practiceMode | cardMode, which: string) => (which === mode ? 'white' : 'light gray');
@@ -306,50 +271,75 @@ export class CollectionCarouselView extends CollectionSubView() {
     @computed get filterDoc() {
         return DocListCast(Doc.MyContextMenuBtns.data).find(doc => doc.title === 'Filter');
     }
-    filterHeight = () => NumCast(this.filterDoc?.height);
+    filterHeight = () => NumCast(this.filterDoc?.height) * Math.min(1, this.ScreenToLocalBoxXf().Scale);
     filterWidth = () => (!this.filterDoc ? 1 : (this.filterHeight() * NumCast(this.filterDoc._width)) / NumCast(this.filterDoc._height));
+
+    /**
+     * How much the content of the carousel view is being scaled based on its nesting and its fit-to-width settings
+     */
+    @computed get contentScaling() {
+        return this.ScreenToLocalBoxXf().Scale * (this._props.NativeDimScaling?.() ?? 1);
+    }
+
+    /**
+     * The maximum size a UI widget can be scaled so that it won't be bigger in screen pixels than its normal 35 pixel size.
+     */
+    @computed get maxWidgetScale() {
+        const maxWidgetSize = Math.min(this._sideBtnWidth * this.contentScaling, 0.1 * NumCast(this.Document.width, 1));
+        return Math.max(maxWidgetSize / this._sideBtnWidth, 1);
+    }
+    /**
+     * How much to reactively scale a UI element so that it is as big as it can be (up to its normal 35pixel size) without being too big for the Doc content
+     */
+    @computed get uiBtnScaleTransform() {
+        return `scale(${this.maxWidgetScale * Math.min(1, this.contentScaling)})`;
+    }
     @computed get menu() {
         const curDoc = this.carouselItems?.[this.carouselIndex];
         return (
-            <div className="carouselView-menu">
+            <div className="carouselView-menu" style={{ height: this.filterHeight(), width: this.filterHeight(), transform: this.uiBtnScaleTransform }}>
                 {!this.filterDoc ? null : (
-                    <div style={{ height: this.filterHeight(), width: this.filterHeight() }}>
-                        <DocumentView
-                            {...this._props}
-                            Document={this.filterDoc}
-                            TemplateDataDocument={undefined}
-                            LayoutTemplate={this._props.childLayoutTemplate}
-                            LayoutTemplateString={this._props.childLayoutString}
-                            renderDepth={this._props.renderDepth + 1}
-                            NativeWidth={returnZero}
-                            NativeHeight={returnZero}
-                            fitWidth={undefined}
-                            showTags={false}
-                            hideFilterStatus={true}
-                            containerViewPath={this.childContainerViewPath}
-                            setContentViewBox={undefined}
-                            onDoubleClickScript={this.onContentDoubleClick}
-                            onClickScript={this.onContentClick}
-                            isDocumentActive={this._props.childDocumentsActive?.() ? this._props.isDocumentActive : this._props.isContentActive}
-                            isContentActive={this.isChildContentActive}
-                            hideCaptions={true}
-                            childFilters={this.childDocFilters}
-                            hideDecorations={BoolCast(this.layoutDoc.layout_hideDecorations)}
-                            addDocument={this._props.addDocument}
-                            ScreenToLocalTransform={this.contentScreentToLocalXf}
-                            PanelWidth={this.filterWidth}
-                            PanelHeight={this.filterHeight}
-                        />
-                    </div>
+                    <DocumentView
+                        {...this._props}
+                        Document={this.filterDoc}
+                        TemplateDataDocument={undefined}
+                        LayoutTemplate={this._props.childLayoutTemplate}
+                        LayoutTemplateString={this._props.childLayoutString}
+                        renderDepth={this._props.renderDepth + 1}
+                        NativeWidth={returnZero}
+                        NativeHeight={returnZero}
+                        fitWidth={undefined}
+                        showTags={false}
+                        hideFilterStatus={true}
+                        containerViewPath={this.childContainerViewPath}
+                        setContentViewBox={undefined}
+                        onDoubleClickScript={this.onContentDoubleClick}
+                        onClickScript={this.onContentClick}
+                        isDocumentActive={this._props.childDocumentsActive?.() ? this._props.isDocumentActive : this._props.isContentActive}
+                        isContentActive={this.isChildContentActive}
+                        hideCaptions={true}
+                        childFilters={this.childDocFilters}
+                        hideDecorations={BoolCast(this.layoutDoc.layout_hideDecorations)}
+                        addDocument={this._props.addDocument}
+                        ScreenToLocalTransform={this.contentScreenToLocalXf}
+                        PanelWidth={this.filterWidth}
+                        PanelHeight={this.filterHeight}
+                    />
                 )}
-                <div className="carouselView-practiceModes" style={{ display: BoolCast(curDoc?._layout_isFlashcard) ? undefined : 'none' }}>
+                <div
+                    className="carouselView-practiceModes"
+                    style={{
+                        transformOrigin: `0px ${-this.filterHeight()}px`,
+                        transform: `scale(${Math.max(1, 1 / this.ScreenToLocalBoxXf().Scale / this.maxWidgetScale)})`,
+                        display: BoolCast(curDoc?._layout_isFlashcard) ? undefined : 'none',
+                    }}>
                     <Tooltip title="Practice flashcards using GPT">
-                        <div key="back" className="carouselView-quiz" onClick={() => this.togglePracticeMode(practiceMode.QUIZ)}>
+                        <div key="back" className="carouselView-quiz" style={{ width: this.filterWidth(), height: this.filterHeight() }} onClick={() => this.togglePracticeMode(practiceMode.QUIZ)}>
                             <FontAwesomeIcon icon="file-pen" color={this.setColor(practiceMode.QUIZ, StrCast(this.practiceMode))} size="1x" />
                         </div>
                     </Tooltip>
                     <Tooltip title={this.practiceMode === practiceMode.PRACTICE ? 'Exit practice mode' : 'Practice flashcards manually'}>
-                        <div key="back" className="carouselView-practice" onClick={() => this.togglePracticeMode(practiceMode.PRACTICE)}>
+                        <div key="back" className="carouselView-practice" style={{ width: this.filterWidth(), height: this.filterHeight() }} onClick={() => this.togglePracticeMode(practiceMode.PRACTICE)}>
                             <FontAwesomeIcon icon="check" color={this.setColor(practiceMode.PRACTICE, StrCast(this.practiceMode))} size="1x" />
                         </div>
                     </Tooltip>
@@ -357,6 +347,32 @@ export class CollectionCarouselView extends CollectionSubView() {
             </div>
         );
     }
+    @computed get buttons() {
+        return (
+            <>
+                <div key="back" className="carouselView-back" style={{ transform: this.uiBtnScaleTransform }} onClick={this.goback}>
+                    <FontAwesomeIcon icon="chevron-left" size="2x" />
+                </div>
+                <div key="fwd" className="carouselView-fwd" style={{ transform: this.uiBtnScaleTransform }} onClick={this.advance}>
+                    <FontAwesomeIcon icon="chevron-right" size="2x" />
+                </div>
+                {this.practiceMode == practiceMode.PRACTICE ? (
+                    <div style={{ transform: this.uiBtnScaleTransform, bottom: `${this._sideBtnWidth}px`, height: `${this._sideBtnWidth}px`, position: 'absolute', width: `100%` }}>
+                        <Tooltip title="Incorrect. View again later.">
+                            <div key="remove" className="carouselView-remove" onClick={e => this.setPracticeVal(e, practiceVal.MISSED)}>
+                                <FontAwesomeIcon icon="xmark" color="red" size="1x" />
+                            </div>
+                        </Tooltip>
+                        <Tooltip title="Correct">
+                            <div key="check" className="carouselView-check" onClick={e => this.setPracticeVal(e, practiceVal.CORRECT)}>
+                                <FontAwesomeIcon icon="check" color="green" size="1x" />
+                            </div>
+                        </Tooltip>
+                    </div>
+                ) : null}
+            </>
+        );
+    }
 
     render() {
         return (
@@ -388,7 +404,7 @@ export class CollectionCarouselView extends CollectionSubView() {
                     )}
                 </div>
                 {!this.Document._chromeHidden ? this.menu : null}
-                {!this.Document._chromeHidden ? this.buttons : null}
+                {!this.Document._chromeHidden && this.carouselItems?.[this.carouselIndex] ? this.buttons : null}
             </div>
         );
     }
diff --git a/src/client/views/collections/TabDocView.tsx b/src/client/views/collections/TabDocView.tsx
index f56ea9d76..5bfdee1f5 100644
--- a/src/client/views/collections/TabDocView.tsx
+++ b/src/client/views/collections/TabDocView.tsx
@@ -478,7 +478,6 @@ export class TabDocView extends ObservableReactComponent<TabDocViewProps> {
     componentDidMount() {
         new ResizeObserver(
             action(entries => {
-                // eslint-disable-next-line no-restricted-syntax
                 for (const entry of entries) {
                     this._panelWidth = entry.contentRect.width;
                     this._panelHeight = entry.contentRect.height;
diff --git a/src/client/views/nodes/LabelBox.tsx b/src/client/views/nodes/LabelBox.tsx
index 696ba5697..94a9541f2 100644
--- a/src/client/views/nodes/LabelBox.tsx
+++ b/src/client/views/nodes/LabelBox.tsx
@@ -138,7 +138,7 @@ export class LabelBox extends ViewBoxBaseComponent<FieldViewProps>() {
                         onBlur={() => {
                             this.dataDoc[this.fieldKey] = this._divRef?.innerText ?? '';
                         }}
-                        contentEditable={this._props.onClickScript?.() ? false : true}
+                        contentEditable={this._props.onClickScript?.() ? undefined : true}
                         ref={r => {
                             this._divRef = r;
                             this.fitTextToBox(r);
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index fc74a480e..5743b17c6 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -498,8 +498,6 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         // }
         this._loading = true;
         try {
-            if (this._selectionText === '') {
-            }
             const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
 
             console.log(res);
-- 
cgit v1.2.3-70-g09d2


From a606005a5934913c38fba9b73886ee6e743aa635 Mon Sep 17 00:00:00 2001
From: alyssaf16 <alyssa_feinberg@brown.edu>
Date: Tue, 8 Oct 2024 10:49:12 -0400
Subject: get rid of commented out code

---
 dash-speech-to-text-101b507c5e39.json   |  13 ----
 src/client/views/StyleProviderQuiz.scss |   2 -
 src/client/views/pdf/AnchorMenu.tsx     |  31 ----------
 src/client/views/pdf/Annotation.scss    |  17 ------
 src/client/views/pdf/PDFViewer.scss     |   6 --
 src/client/views/pdf/PDFViewer.tsx      | 103 +-------------------------------
 6 files changed, 3 insertions(+), 169 deletions(-)
 delete mode 100644 dash-speech-to-text-101b507c5e39.json

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/dash-speech-to-text-101b507c5e39.json b/dash-speech-to-text-101b507c5e39.json
deleted file mode 100644
index 62a7c7eb0..000000000
--- a/dash-speech-to-text-101b507c5e39.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "type": "service_account",
-  "project_id": "dash-speech-to-text",
-  "private_key_id": "101b507c5e394ec62f075d9416890bef0f597f7f",
-  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC1BQ4iu7RNbiVF\nuIk/7+Zby4mMy0fde/WaCc4VxEQELK8ys2UtLU92L0npSLOyLACtLcNexdihoPMs\nHcQV7jxj9KRlk7tx3CPuVj8mn52WNIxX5ds5BszQqrfNQGObfdeFsROFzcA2ysbz\nEyfkqoFSQU5OUYANwEaF9oXc5nEkZaz5Zjjy34g8USAlySbB2sKI4o372Xi0slJo\nuPYWn93k/IA7HAmCOeooc2LTi+gu2KCnkXKevXdJCcK9Lntbm9RjoSUQiR/6R0Ls\nCTXY/g3G2FMJiraqxeI4HeAU2Pyw0sl86nHYTHh3/wNRxQkpLXROAc5qlPbMbTzp\nEu7kLI7PAgMBAAECggEADQyQk00SrKOXCOqfl5NUo3i4XATqE6ZJndFny3E63KOC\npwCq93xqW6usWVEbWxRe9seeFik5pOp0Unwm1CnjV+qdJea7aXQkHEdCsCcWIMDS\n/nccZtpS+MEwahm31Hqthv6tLe/CE8ZpscDHbG16Jb19cUSLcEepuHh9TTTzd7Bu\n9iaQGNC4Kpfvnl4zxr5RlooQFBXI/izSnHqlKW6yz/j3ntpabDFp7U3ZDe7cRpJa\nsDXwOXSULrg7LRcV9sPyC4UwfEVNFdJJg7QxWcmJe4QYdDCNnZ7JnKvMcBgZmvyH\nbJZosZGMB3QW/BdPHugk5dmT2Zm7j/0axwNdIflFwQKBgQDddrnGLQMqZwQU+Ag6\nTFjXdSXaGDKRvK4W+PvsNla8kin1TU3NHd+GUGPnBbR+bOF5Y1m0IYEHOOtgVB6E\ni+RzytKPM6ghMDAkzLTrB1R9a1Aj0b2OWQrdPjDgDw2BHcGVmwHsy3i2v97e+1hn\nduEFHZOawg2LALlXqxXb+TyYrwKBgQDRP7k9wcnju1JOcfMFcUH1gcG6CmKoZwVK\nl7cGcKYaTAZZl4W8cZVuC+l/LPH4xXQYg9FqGQ3R6NQQFQV3g83ym2nQeALluuXJ\n7vlFtViu89uiiBtg9DL1wsbYnbUjOd4CYoW9GWv5Jy99SSHp4XIIcy6MNYwuRZaq\nObx5dViz4QKBgBWqBpRPVO7x8uFGPi/NxicVi6VhFplRFsqigqphymxZ9AbOEB1P\nnc0a0hsIYNa5OflQ8baATInzVHsw32dh8/Ar2BswF3NfrmX7LHuNVQOL2uQWIW/q\nX/iym79fWZfW3FgROMf8Q4vFCz1O4yAD7hE9CnJqJz8AzCC6WMITCI17AoGANMv3\nWXXEEwn4woJN51mkYuXSk7Z7HjKgSynsrFtQDeKQ15o7zEh8g7/NsqEMjNCFcooQ\nFM0th4FPwJ8NOhKvrD86e7dMQ9rckA8UJlqTfdFZ4bCl99il4wy6T327bp/zPHbP\nd98qNzuD6ADD5ddUhn1JiWcZb7NvSJQ40gyhzQECgYB7rMpNCq46NNozGktHRhuo\nGJjHiGgSM6vVPkC7DVJbU4jU2RjI7IUL2wfFEWDKOovkts7Ugp/KEFVcff4neeuz\nMomaVWaaT3xIKENUIAzSpqcqshkqDJ/2kAknD30IJXAvGuaK49rql5Vab/Rh6zVW\nWH5hqTQk5IXR02zFSIXwXg==\n-----END PRIVATE KEY-----\n",
-  "client_email": "af010101@dash-speech-to-text.iam.gserviceaccount.com",
-  "client_id": "110674669436677368261",
-  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
-  "token_uri": "https://oauth2.googleapis.com/token",
-  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
-  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/af010101%40dash-speech-to-text.iam.gserviceaccount.com",
-  "universe_domain": "googleapis.com"
-}
diff --git a/src/client/views/StyleProviderQuiz.scss b/src/client/views/StyleProviderQuiz.scss
index 2f52c8dec..84b3f1fef 100644
--- a/src/client/views/StyleProviderQuiz.scss
+++ b/src/client/views/StyleProviderQuiz.scss
@@ -5,8 +5,6 @@
     align-items: center;
     height: 100%;
     width: 100%;
-    // left: 50%;
-    // top: 50%;
     z-index: 200;
     font-size: 20px;
     font-weight: bold;
diff --git a/src/client/views/pdf/AnchorMenu.tsx b/src/client/views/pdf/AnchorMenu.tsx
index bff112017..e3a968180 100644
--- a/src/client/views/pdf/AnchorMenu.tsx
+++ b/src/client/views/pdf/AnchorMenu.tsx
@@ -29,8 +29,6 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
     private _commentRef = React.createRef<HTMLDivElement>();
     private _cropRef = React.createRef<HTMLDivElement>();
     @observable private _loading = false;
-    // @observable protected _top: number = -300;
-    // @observable protected _left: number = -300;
 
     constructor(props: AntimodeMenuProps) {
         super(props);
@@ -113,28 +111,6 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
         }
         GPTPopup.Instance.setLoading(false);
     };
-    // gptSummarize = async () => {
-    //     GPTPopup.Instance?.setSelectedText(this._selectedText);
-    //     GPTPopup.Instance.generateSummary();
-    // };
-
-    /**
-     * Invokes the API with the selected text and stores it in the selected text.
-     * @param e pointer down event
-     */
-    // gptPDFFlashcards = async () => {
-    //     const queryText = this._selectedText;
-    //     this._loading = true;
-    //     try {
-    //         const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
-    //         console.log(res);
-    //         // GPTPopup.Instance.setText(res || 'Something went wrong.');
-    //         this.transferToFlashcard(res || 'Something went wrong');
-    //     } catch (err) {
-    //         console.error(err);
-    //     }
-    //     // GPTPopup.Instance.setLoading(false);
-    // };
 
     /*
      * Transfers the flashcard text generated by GPT on flashcards and creates a collection out them.
@@ -158,10 +134,8 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
             _layout_autoHeight: true,
         });
 
-        console.log(collectionArr);
         newCol.x = x;
         newCol.y = y;
-        console.log(this._x);
         newCol.zIndex = 1000;
 
         this.addToCollection?.(newCol);
@@ -315,11 +289,6 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
                             />
                         </div>
                     )}
-                    {/* {this._loading ? (
-                        <div className="loading-spinner" style={{ position: 'absolute' }}>
-                            <ReactLoading type="spin" height={30} width={30} color={'white'} />
-                        </div>
-                    ) : null} */}
                 </>
             ) : (
                 <>
diff --git a/src/client/views/pdf/Annotation.scss b/src/client/views/pdf/Annotation.scss
index 26856b74e..da7efe3da 100644
--- a/src/client/views/pdf/Annotation.scss
+++ b/src/client/views/pdf/Annotation.scss
@@ -8,20 +8,3 @@
         cursor: pointer;
     }
 }
-// .loading-spinner {
-//     display: flex;
-//     justify-content: center;
-//     align-items: center;
-//     height: 90%;
-//     width: 93%;
-//     left: 10;
-//     font-size: 20px;
-//     font-weight: bold;
-//     color: #0b0a0a;
-// }
-
-// @keyframes spin {
-//     to {
-//         transform: rotate(360deg);
-//     }
-// }
diff --git a/src/client/views/pdf/PDFViewer.scss b/src/client/views/pdf/PDFViewer.scss
index e70102ce9..a225c4b59 100644
--- a/src/client/views/pdf/PDFViewer.scss
+++ b/src/client/views/pdf/PDFViewer.scss
@@ -19,10 +19,6 @@
     overflow-x: hidden;
     transform-origin: top left;
 
-    // .canvasWrapper {
-    //     transform: scale(0.75);
-    //     transform-origin: top left;
-    // }
     .textLayer {
         opacity: unset;
         mix-blend-mode: multiply; // bcz: makes text fuzzy!
@@ -115,8 +111,6 @@
     align-items: center;
     height: 100%;
     width: 100%;
-    // left: 50%;
-    // top: 50%;
     z-index: 200;
     font-size: 20px;
     font-weight: bold;
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index fc74a480e..18db214c8 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -395,114 +395,17 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         }
     };
 
+    /**
+     * Create a flashcard pile based on the selected text of a pdf.
+     */
     gptPDFFlashcards = async () => {
-        // const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
-        // if (SpeechRecognition) {
-        //     this.recognition = new SpeechRecognition();
-        //     this.recognition.continuous = true; // Continue listening even if the user pauses
-        //     this.recognition.interimResults = true; // Show interim results
-        //     this.recognition.lang = 'en-US'; // Set language (optional)
-
-        //     this.recognition.onresult = this.handleResult;
-        //     this.recognition.onerror = this.handleError;
-        //     this.recognition.onend = this.handleEnd;
-        // } else {
-        //     console.error("Browser doesn't support Speech Recognition API");
-        // }
-        // const Dictaphone = () => {
-        //     const { transcript, resetTranscript } = useSpeechRecognition();
-
-        //     if (!SpeechRecognition.browserSupportsSpeechRecognition()) {
-        //         return null;
-        //     }
-
-        //     return (
-        //         <div>
-        //             <button onClick={e => SpeechRecognition.startListening}>Start</button>
-        //             <button onClick={e => SpeechRecognition.stopListening}>Stop</button>
-        //             <button onClick={resetTranscript}>Reset</button>
-        //             <p>{transcript}</p>
-        //         </div>
-        //     );
-        // };
-        // const grammar =
-        //     '#JSGF V1.0; grammar colors; public <color> = aqua | azure | beige | bisque | black | blue | brown | chocolate | coral | crimson | cyan | fuchsia | ghostwhite | gold | goldenrod | gray | green | indigo | ivory | khaki | lavender | lime | linen | magenta | maroon | moccasin | navy | olive | orange | orchid | peru | pink | plum | purple | red | salmon | sienna | silver | snow | tan | teal | thistle | tomato | turquoise | violet | white | yellow ;';
-        // const recognition = new SpeechRecognition();
-        // const speechRecognitionList = new SpeechGrammarList();
-        // speechRecognitionList.addFromString(grammar, 1);
-        // recognition.grammars = speechRecognitionList;
-        // recognition.continuous = false;
-        // recognition.lang = 'en-US';
-        // recognition.interimResults = false;
-        // recognition.maxAlternatives = 1;
-
-        // const diagnostic = document.querySelector('.output');
-        // const bg = document.querySelector('html');
-
-        // document.body.onclick = () => {
-        //     recognition.start();
-        //     console.log('Ready to receive a color command.');
-        // };
-
-        // recognition.onresult = event => {
-        //     const color = event.results[0][0].transcript;
-        //     diagnostic!.textContent = `Result received: ${color}`;
-        //     bg!.style.backgroundColor = color;
-        // };
-
-        //const SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
-
-        // recognition.continous = true;
-        // recognition.interimResults = true;
-        // recognition.lang = 'en-US';
-
         const queryText = this._selectionText;
-
-        // const canvas = await html2canvas();
-        // const image = canvas.toDataURL("image/png", 1.0);
-        // (window as any)
-        //     .html2canvas(this._marqueeref, {
-        //         x: 100,
-        //         y: 100,
-        //         width: 100,
-        //         height: 100,
-        //     })
-        //     .then((canvas: HTMLCanvasElement) => {
-        //         const img = canvas.toDataURL('image/png');
-
-        //         const link = document.createElement('a');
-        //         link.href = img;
-        //         link.download = 'screenshot.png';
-
-        //         document.body.appendChild(link);
-        //         link.click();
-        //         link.remove();
-        //     });
-
-        // var range = window.getSelection()?.getRangeAt(0);
-        // var selectionContents = range?.extractContents();
-        // var div = document.createElement("div");
-        // div.style.color = "yellow";
-        // div.appendChild(selectionContents!);
-        // range!.insertNode(div);
-
-        // const canvas = document.createElement('canvas');
-        // const scaling = 1 / (this._props.NativeDimScaling?.() || 1);
-        // const w = AnchorMenu.Instance.marqueeWidth * scaling;
-        // const h = AnchorMenu.Instance.marqueeHeight * scaling;
-        // canvas.width = w;
-        // canvas.height = h;
-        // const ctx = canvas.getContext('2d'); // draw image to canvas. scale to target dimensions
-        // if (ctx) {
-        //     this._marqueeref && ctx.drawImage(div, NumCast(this._marqueeref.current?.left) * scaling, NumCast(this._marqueeref.current?.top) * scaling, w, h, 0, 0, w, h);
-        // }
         this._loading = true;
         try {
             if (this._selectionText === '') {
             }
             const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
 
-            console.log(res);
             AnchorMenu.Instance.transferToFlashcard(res || 'Something went wrong', NumCast(this._props.layoutDoc['x']), NumCast(this._props.layoutDoc['y']));
             this._selectionText = '';
         } catch (err) {
-- 
cgit v1.2.3-70-g09d2


From 4c768162e0436115a05b9c8b0e4d837d626d45ba Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Wed, 30 Oct 2024 18:54:52 -0400
Subject: reworked how context menu buttons for ink and text work. added
 disableMixBlend for making transparent docs not use 'multiply'.

---
 src/ClientUtils.ts                                 |  11 +-
 src/client/documents/DocUtils.ts                   |  16 +-
 src/client/documents/Documents.ts                  |   1 -
 src/client/util/CurrentUserUtils.ts                |  78 +++++----
 src/client/util/InteractionUtils.tsx               |   6 +-
 src/client/util/SettingsManager.tsx                |   4 +-
 src/client/util/SnappingManager.ts                 |   7 +
 src/client/views/FilterPanel.tsx                   |   2 +-
 src/client/views/GestureOverlay.tsx                | 164 ++++++------------
 src/client/views/GlobalKeyHandler.ts               |   9 +-
 src/client/views/InkingStroke.tsx                  |   3 +-
 src/client/views/LightboxView.tsx                  |   4 +-
 src/client/views/StyleProp.ts                      |   4 +-
 src/client/views/StyleProvider.tsx                 |   5 +-
 .../views/collections/CollectionDockingView.tsx    |   2 +-
 .../CollectionFreeFormInfoUI.tsx                   |   6 +-
 .../collectionFreeForm/CollectionFreeFormView.tsx  |  71 ++++----
 .../collections/collectionFreeForm/MarqueeView.tsx |   2 +-
 src/client/views/global/globalScripts.ts           | 112 +++++++------
 .../views/newlightbox/ButtonMenu/ButtonMenu.tsx    |   6 +-
 .../views/nodes/CollectionFreeFormDocumentView.tsx |   5 +-
 src/client/views/nodes/DataVizBox/DataVizBox.tsx   |   4 +-
 src/client/views/nodes/DocumentView.tsx            |  72 ++++----
 .../views/nodes/FontIconBox/FontIconBox.scss       |   3 +
 src/client/views/nodes/FontIconBox/FontIconBox.tsx | 186 ++++++++++++---------
 src/client/views/nodes/ImageBox.tsx                |  10 +-
 src/client/views/nodes/VideoBox.tsx                |   2 +-
 src/client/views/nodes/WebBox.tsx                  |  13 +-
 .../views/nodes/formattedText/FormattedTextBox.tsx |  12 +-
 .../views/nodes/formattedText/RichTextMenu.tsx     |  22 +--
 src/client/views/pdf/PDFViewer.tsx                 |   2 +-
 src/client/views/smartdraw/SmartDrawHandler.tsx    |  12 +-
 src/fields/Doc.ts                                  |   6 +-
 src/fields/InkField.ts                             |  27 +--
 src/pen-gestures/GestureTypes.ts                   |   1 -
 35 files changed, 444 insertions(+), 446 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/ClientUtils.ts b/src/ClientUtils.ts
index e7aee1c2a..baad9a06c 100644
--- a/src/ClientUtils.ts
+++ b/src/ClientUtils.ts
@@ -107,12 +107,12 @@ export namespace ClientUtils {
             default:                 return type.charAt(0).toUpperCase() + type.substring(1,3);
         } // prettier-ignore
     }
-    export function cleanDocumentType(type: DocumentType, colType: CollectionViewType) {
+    export function cleanDocumentType(type: DocumentType, colType?: CollectionViewType) {
         switch (type) {
             case DocumentType.PDF:   return 'PDF';
             case DocumentType.IMG:   return 'Image';
             case DocumentType.AUDIO: return 'Audio';
-            case DocumentType.COL:   return 'Collection:'+colType;
+            case DocumentType.COL:   return 'Collection:'+ (colType ?? "");
             case DocumentType.RTF:   return 'Text';
             default:                 return type.charAt(0).toUpperCase() + type.slice(1);
         } // prettier-ignore
@@ -212,7 +212,7 @@ export namespace ClientUtils {
         return { r: r, g: g, b: b, a: a };
     }
 
-    const isTransparentFunctionHack = 'isTransparent(__value__)';
+    export const isTransparentFunctionHack = 'isTransparent(__value__)';
     export const noRecursionHack = '__noRecursion';
 
     // special case filters
@@ -223,11 +223,6 @@ export namespace ClientUtils {
     export function IsRecursiveFilter(val: string) {
         return !val.includes(noRecursionHack);
     }
-    export function HasFunctionFilter(val: string) {
-        if (val.includes(isTransparentFunctionHack)) return (color: string) => color !== '' && DashColor(color).alpha() !== 1;
-        // add other function filters here...
-        return undefined;
-    }
 
     export function toRGBAstr(col: { r: number; g: number; b: number; a?: number }) {
         return 'rgba(' + col.r + ',' + col.g + ',' + col.b + (col.a !== undefined ? ',' + col.a : '') + ')';
diff --git a/src/client/documents/DocUtils.ts b/src/client/documents/DocUtils.ts
index dae3e48ad..067b9c5e0 100644
--- a/src/client/documents/DocUtils.ts
+++ b/src/client/documents/DocUtils.ts
@@ -3,7 +3,7 @@ import { IconProp } from '@fortawesome/fontawesome-svg-core';
 import { saveAs } from 'file-saver';
 import * as JSZip from 'jszip';
 import { action, runInAction } from 'mobx';
-import { ClientUtils } from '../../ClientUtils';
+import { ClientUtils, DashColor } from '../../ClientUtils';
 import * as JSZipUtils from '../../JSZipUtils';
 import { decycle } from '../../decycler/decycler';
 import { DateField } from '../../fields/DateField';
@@ -36,11 +36,16 @@ import { DocumentView } from '../views/nodes/DocumentView';
 import { CollectionFreeFormView } from '../views/collections/collectionFreeForm';
 
 export namespace DocUtils {
+    function HasFunctionFilter(val: string) {
+        if (val.includes(ClientUtils.isTransparentFunctionHack)) return (d: Doc, color: string) => !d.disableMixBlend && color !== '' && DashColor(color).alpha() !== 1;
+        // add other function filters here...
+        return undefined;
+    }
     function matchFieldValue(doc: Doc, key: string, valueIn: unknown): boolean {
         let value = valueIn;
-        const hasFunctionFilter = ClientUtils.HasFunctionFilter(value as string);
+        const hasFunctionFilter = HasFunctionFilter(value as string);
         if (hasFunctionFilter) {
-            return hasFunctionFilter(StrCast(doc[key]));
+            return hasFunctionFilter(doc, StrCast(doc[key]));
         }
         if (key === LinkedTo) {
             // links are not a field value, so handled here.  value is an expression of form ([field=]idToDoc("..."))
@@ -683,9 +688,14 @@ export namespace DocUtils {
                       _layout_centered: BoolCast(Doc.UserDoc()._layout_centered),
                       _layout_fitWidth: true,
                       _layout_autoHeight: true,
+                      backgroundColor: StrCast(Doc.UserDoc().textBackgroundColor),
                       text_fitBox: BoolCast(Doc.UserDoc().fitBox),
                       text_align: StrCast(Doc.UserDoc().textAlign),
                       text_fontColor: StrCast(Doc.UserDoc().fontColor),
+                      text_fontFamily: StrCast(Doc.UserDoc().fontFamily),
+                      text_fontWeight: StrCast(Doc.UserDoc().fontWeight),
+                      text_fontStyle: StrCast(Doc.UserDoc().fontStyle),
+                      text_fontDecoration: StrCast(Doc.UserDoc().fontDecoration),
                   }),
         });
 
diff --git a/src/client/documents/Documents.ts b/src/client/documents/Documents.ts
index b0e1a7545..efd6ce3c9 100644
--- a/src/client/documents/Documents.ts
+++ b/src/client/documents/Documents.ts
@@ -927,7 +927,6 @@ export namespace Docs {
             I.text_align = 'center';
             I.rotation = 0;
             I.defaultDoubleClick = 'ignore';
-            I.keepZWhenDragged = true;
             I.author_date = new DateField();
             I.acl_Guest = Doc.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.View;
             // I.acl_Override = SharingPermissions.Unset;
diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index b3aa5e145..98a3e8914 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -4,7 +4,7 @@ import * as rp from 'request-promise';
 import { ClientUtils, OmitKeys } from "../../ClientUtils";
 import { Doc, DocListCast, DocListCastAsync, FieldType, Opt } from "../../fields/Doc";
 import { DocData } from "../../fields/DocSymbols";
-import { InkTool } from "../../fields/InkField";
+import { InkEraserTool, InkInkTool, InkTool } from "../../fields/InkField";
 import { List } from "../../fields/List";
 import { PrefetchProxy } from "../../fields/Proxy";
 import { RichTextField } from "../../fields/RichTextField";
@@ -39,6 +39,7 @@ import { SelectionManager } from "./SelectionManager";
 import { ColorScheme } from "./SettingsManager";
 import { SnappingManager } from "./SnappingManager";
 import { UndoManager } from "./UndoManager";
+import { DocumentView } from "../views/nodes/DocumentView";
 
 export interface Button {
     // DocumentOptions fields a button can set
@@ -731,11 +732,11 @@ pie title Minerals in my tap water
         return [
             { title: "Font",     toolTip: "Font", width: 100,     btnType: ButtonType.DropdownList,                      toolType:"font",     ignoreClick: true,   scripts: {script:  '{ return setFontAttr(this.toolType, value, _readOnly_);}'},
               btnList: new List<string>(["Roboto", "Roboto Mono", "Nunito", "Times New Roman", "Arial", "Georgia", "Comic Sans MS", "Tahoma", "Impact", "Crimson Text"]) },
-            { title: "Font Size",toolTip: "Font size (%size)",    btnType: ButtonType.NumberDropdownButton,              toolType:"fontSize", ignoreClick: true,   scripts: {script:  '{ return setFontAttr(this.toolType, value, _readOnly_);}'}, numBtnMax: 200, numBtnMin: 9 },
+            { title: " Size",    toolTip: "Font size (%size)",    btnType: ButtonType.NumberDropdownButton,              toolType:"fontSize", ignoreClick: true,   scripts: {script:  '{ return setFontAttr(this.toolType, value, _readOnly_);}'}, numBtnMax: 200, numBtnMin: 9 },
             { title: "Color",    toolTip: "Font color (%color)",  btnType: ButtonType.ColorButton,  icon: "font",        toolType:"fontColor",ignoreClick: true,   scripts: {script:  '{ return setFontAttr(this.toolType, value, _readOnly_);}'} },
             { title: "Highlight",toolTip: "Font highlight",       btnType: ButtonType.ColorButton,  icon: "highlighter", toolType:"highlight",ignoreClick: true,   scripts: {script:  '{ return setFontAttr(this.toolType, value, _readOnly_);}'} },
             { title: "Bold",     toolTip: "Bold (Ctrl+B)",        btnType: ButtonType.ToggleButton, icon: "bold",        toolType:"bold",     ignoreClick: true,   scripts: {onClick: '{ return toggleCharStyle(this.toolType, _readOnly_);}'} },
-            { title: "Italic",   toolTip: "Italic (Ctrl+I)",      btnType: ButtonType.ToggleButton, icon: "italic",      toolType:"italics",  ignoreClick: true,   scripts: {onClick: '{ return toggleCharStyle(this.toolType, _readOnly_);}'} },
+            { title: "Italic",   toolTip: "Italic (Ctrl+I)",      btnType: ButtonType.ToggleButton, icon: "italic",      toolType:"italic",   ignoreClick: true,   scripts: {onClick: '{ return toggleCharStyle(this.toolType, _readOnly_);}'} },
             { title: "Under",    toolTip: "Underline (Ctrl+U)",   btnType: ButtonType.ToggleButton, icon: "underline",   toolType:"underline",ignoreClick: true,   scripts: {onClick: '{ return toggleCharStyle(this.toolType, _readOnly_);}'} },
             { title: "Bullets",  toolTip: "Bullet List",          btnType: ButtonType.ToggleButton, icon: "list",        toolType:"bullet",   ignoreClick: true,   scripts: {onClick: '{ return toggleCharStyle(this.toolType, _readOnly_);}'} },
             { title: "#",        toolTip: "Number List",          btnType: ButtonType.ToggleButton, icon: "list-ol",     toolType:"decimal",  ignoreClick: true,   scripts: {onClick: '{ return toggleCharStyle(this.toolType, _readOnly_);}'} },
@@ -758,24 +759,27 @@ pie title Minerals in my tap water
 
     static inkTools():Button[] {
         return [
-            { title: "Pen",      toolTip: "Pen (Ctrl+P)",                   btnType: ButtonType.ToggleButton, icon: "pen-nib",    toolType: "pen",                                   scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}' }},
-            { title: "Highlight",toolTip: "Highlight (Ctrl+H)",             btnType: ButtonType.ToggleButton, icon: "highlighter",toolType: "highlighter",                           scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}' }},
-            { title: "Write",    toolTip: "Write (Ctrl+Shift+P)",           btnType: ButtonType.ToggleButton, icon: "pen",        toolType: "write",                                 scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}' }, funcs: {hidden:"IsNoviceMode()" }},
-            { title: "Eraser",   toolTip: "Eraser (Ctrl+E)",                btnType: ButtonType.MultiToggleButton,                toolType: InkTool.Eraser,                          scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}' },
+            { title: "Circle", toolTip: "Circle (double tap to lock mode)", btnType: ButtonType.ToggleButton, icon: "circle",      toolType: Gestures.Circle,                          scripts: {onClick:`{ return setActiveTool(this.toolType, false, _readOnly_);}`,   onDoubleClick:`{ return setActiveTool(this.toolType, true, _readOnly_);}`} },
+            { title: "Square", toolTip: "Square (double tap to lock mode)", btnType: ButtonType.ToggleButton, icon: "square",      toolType: Gestures.Rectangle,                       scripts: {onClick:`{ return setActiveTool(this.toolType, false, _readOnly_);}`,   onDoubleClick:`{ return setActiveTool(this.toolType, true, _readOnly_);}`} },
+            { title: "Line",   toolTip: "Line (double tap to lock mode)",   btnType: ButtonType.ToggleButton, icon: "minus",       toolType: Gestures.Line,                            scripts: {onClick:`{ return setActiveTool(this.toolType, false, _readOnly_);}`,   onDoubleClick:`{ return setActiveTool(this.toolType, true, _readOnly_);}`} },
+            { title: "Ink",    toolTip: "Ink",                              btnType: ButtonType.MultiToggleButton,                 toolType: InkTool.Ink,                              scripts: {onClick:'{ return setActiveTool(this.toolType, true, _readOnly_);}' }, 
+                subMenu: [
+                    { title: "Pen",      toolTip: "Pen (Ctrl+P)",           btnType: ButtonType.ToggleButton, icon: "pen-nib",     toolType: InkInkTool.Pen,        ignoreClick: true, scripts: {onClick:'{ return setActiveTool(this.toolType, true, _readOnly_);}' }},
+                    { title: "Highlight",toolTip: "Highlight (Ctrl+H)",     btnType: ButtonType.ToggleButton, icon: "highlighter", toolType: InkInkTool.Highlight,  ignoreClick: true, scripts: {onClick:'{ return setActiveTool(this.toolType, true, _readOnly_);}' }},
+                    { title: "Write",    toolTip: "Write (Ctrl+Shift+P)",   btnType: ButtonType.ToggleButton, icon: "pen",         toolType: InkInkTool.Write,      ignoreClick: true, scripts: {onClick:'{ return setActiveTool(this.toolType, true, _readOnly_);}' },  funcs: {hidden:"IsNoviceMode()" }},      
+                ]},
+            { title: "Width",      toolTip: "Stroke width",                 btnType: ButtonType.NumberSliderButton,                toolType: "strokeWidth",         ignoreClick: true, scripts: {script: '{ return setInkProperty(this.toolType, value, _readOnly_);}'}, funcs: {hidden:"!activeInkTool()"}, numBtnMin: 1, linearBtnWidth:40},
+            { title: "Color",      toolTip: "Stroke color",                 btnType: ButtonType.ColorButton,  icon: "pen",         toolType: "strokeColor",         ignoreClick: true, scripts: {script: '{ return setInkProperty(this.toolType, value, _readOnly_);}'}, funcs: {hidden:"!activeInkTool()"}},
+            { title: "Eraser",     toolTip: "Eraser (Ctrl+E)",              btnType: ButtonType.MultiToggleButton,                 toolType: InkTool.Eraser,                           scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}' },
               subMenu: [
-                    { title: "Stroke",   toolTip: "Stroke Erase",           btnType: ButtonType.ToggleButton, icon: "eraser",      toolType:InkTool.StrokeEraser, ignoreClick: true, scripts: {onClick: '{ return setActiveTool(this.toolType, false, _readOnly_);}'} },
-                    { title: "Segment",  toolTip: "Segment Erase",          btnType: ButtonType.ToggleButton, icon: "xmark",       toolType:InkTool.SegmentEraser,ignoreClick: true, scripts: {onClick: '{ return setActiveTool(this.toolType, false, _readOnly_);}'} },
-                    { title: "Radius",   toolTip: "Radius Erase",           btnType: ButtonType.ToggleButton, icon: "circle-xmark",toolType:InkTool.RadiusEraser, ignoreClick: true, scripts: {onClick: '{ return setActiveTool(this.toolType, false, _readOnly_);}'} },
+                    { title: "Stroke",   toolTip: "Eraser complete strokes",btnType: ButtonType.ToggleButton, icon: "eraser",      toolType:InkEraserTool.Stroke,   ignoreClick: true, scripts: {onClick: '{ return setActiveTool(this.toolType, false, _readOnly_);}'}},
+                    { title: "Segment",  toolTip: "Erase segments up to intersections",btnType: ButtonType.ToggleButton,icon: "xmark",toolType:InkEraserTool.Segment,ignoreClick:true, scripts: {onClick: '{ return setActiveTool(this.toolType, false, _readOnly_);}'}},
+                    { title: "Area",     toolTip: "Erase like a pencil",    btnType: ButtonType.ToggleButton, icon: "circle-xmark",toolType:InkEraserTool.Radius,   ignoreClick: true, scripts: {onClick: '{ return setActiveTool(this.toolType, false, _readOnly_);}'}},
             ]},
-            { title: "Eraser Width",  toolTip: "Eraser Width",              btnType: ButtonType.NumberSliderButton,               toolType: "eraserWidth", ignoreClick: true, scripts: {script: '{ return setInkProperty(this.toolType, value, _readOnly_);}'}, numBtnMin: 1, funcs: {hidden:"NotRadiusEraser()"}},
-            { title: "Circle", toolTip: "Circle (double tap to lock mode)", btnType: ButtonType.ToggleButton, icon: "circle",     toolType: Gestures.Circle,      scripts: {onClick:`{ return setActiveTool(this.toolType, false, _readOnly_);}`, onDoubleClick:`{ return setActiveTool(this.toolType, true, _readOnly_);}`} },
-            { title: "Square", toolTip: "Square (double tap to lock mode)", btnType: ButtonType.ToggleButton, icon: "square",     toolType: Gestures.Rectangle,   scripts: {onClick:`{ return setActiveTool(this.toolType, false, _readOnly_);}`, onDoubleClick:`{ return setActiveTool(this.toolType, true, _readOnly_);}`} },
-            { title: "Line",   toolTip: "Line (double tap to lock mode)",   btnType: ButtonType.ToggleButton, icon: "minus",      toolType: Gestures.Line,        scripts: {onClick:`{ return setActiveTool(this.toolType, false, _readOnly_);}`, onDoubleClick:`{ return setActiveTool(this.toolType, true, _readOnly_);}`} },
-            { title: "Mask",   toolTip: "Mask",                             btnType: ButtonType.ToggleButton, icon: "user-circle",toolType: "inkMask",                        scripts: {onClick:'{ return setInkProperty(this.toolType, value, _readOnly_);}'}, funcs: {hidden:"IsNoviceMode()" } },
-            { title: "Labels", toolTip: "Labels",                           btnType: ButtonType.ToggleButton, icon: "text-width", toolType: "labels",                         scripts: {onClick:'{ return setInkProperty(this.toolType, value, _readOnly_);}'}, },
-            { title: "Width",  toolTip: "Stroke width",                     btnType: ButtonType.NumberSliderButton,               toolType: "strokeWidth", ignoreClick: true, scripts: {script: '{ return setInkProperty(this.toolType, value, _readOnly_);}'}, numBtnMin: 1},
-            { title: "Ink",    toolTip: "Stroke color",                     btnType: ButtonType.ColorButton,  icon: "pen",        toolType: "strokeColor", ignoreClick: true, scripts: {script: '{ return setInkProperty(this.toolType, value, _readOnly_);}'} },
-            { title: "Smart Draw", toolTip: "Draw with GPT",                btnType: ButtonType.ToggleButton, icon: "user-pen",   toolType: "smartdraw",                      scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}'}, funcs: {hidden: "IsNoviceMode()"}},
+            { title: " Size",      toolTip: "Size of area pencil eraser",   btnType: ButtonType.NumberSliderButton,               toolType: "eraserWidth",          ignoreClick: true, scripts: {script: '{ return setInkProperty(this.toolType, value, _readOnly_);}'}, funcs: {hidden:"NotRadiusEraser()"}, numBtnMin: 1, linearBtnWidth:40},
+            { title: "Mask",       toolTip: "Make Stroke a Stencil Mask",   btnType: ButtonType.ToggleButton, icon: "user-circle",toolType: "inkMask",                                 scripts: {onClick:'{ return setInkProperty(this.toolType, value, _readOnly_);}'}, funcs: {hidden:"IsNoviceMode()" } },
+            { title: "Labels",     toolTip: "Show Labels Inside Shapes",    btnType: ButtonType.ToggleButton, icon: "text-width", toolType: "labels",                                  scripts: {onClick:'{ return setInkProperty(this.toolType, value, _readOnly_);}'}},
+            { title: "Smart Draw", toolTip: "Draw with GPT",                btnType: ButtonType.ToggleButton, icon: "user-pen",   toolType: "smartdraw",                               scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}'},  funcs: {hidden: "IsNoviceMode()"}},
         ];
     }
 
@@ -814,11 +818,11 @@ pie title Minerals in my tap water
             { title: "Pin",     icon: "map-pin",       toolTip: "Pin View to Trail",    btnType: ButtonType.ClickButton,         expertMode: false,                                                                                                                             width: 30,  scripts: { onClick: 'pinWithView(altKey)'}, funcs: {hidden: "IsNoneSelected()"}},
             { title: "Header",  icon: "heading",       toolTip: "Doc Titlebar Color",   btnType: ButtonType.ColorButton,         expertMode: false,                                                                                                          ignoreClick: true,             scripts: { script:  'return setHeaderColor(value, _readOnly_)'} },
             { title: "Template",icon: "scroll",        toolTip: "Default Note Template",btnType: ButtonType.ToggleButton,        expertMode: false, toolType:DocumentType.RTF,                                                                                                              scripts: { onClick: '{ return setDefaultTemplate(_readOnly_); }'} },
-            { title: "Fill",    icon: "fill-drip",     toolTip: "Fill/Background Color",btnType: ButtonType.ColorButton,         expertMode: false,                                                                                                          ignoreClick: true, width: 30,  scripts: { script:  'return setBackgroundColor(value, _readOnly_)'}, funcs: {hidden: "IsNoneSelected()"}}, // Only when a document is selected
-            { title: "Overlay", icon: "layer-group",   toolTip: "Overlay",              btnType: ButtonType.ToggleButton,        expertMode: true,  toolType:CollectionViewType.Freeform, funcs: {hidden: '!SelectedDocType(this.toolType, this.expertMode, true)'},       scripts: { onClick: '{ return toggleOverlay(_readOnly_); }'}}, // Only when floating document is selected in freeform
-            { title: "Back",    icon: "chevron-left",  toolTip: "Prev Animation Frame", btnType: ButtonType.ClickButton,         expertMode: true,  toolType:CollectionViewType.Freeform, funcs: {hidden: '!SelectedDocType(this.toolType, this.expertMode)'}, width: 30,  scripts: { onClick: 'prevKeyFrame(_readOnly_)'}},
+            { title: "Fill",    icon: "fill-drip",     toolTip: "Fill/Background Color",btnType: ButtonType.ColorButton,         expertMode: false,                                                                                                          ignoreClick: true, width: 30,  scripts: { script:  'return setBackgroundColor(value, _readOnly_)'} }, // Only when a document is selected
+            { title: "Overlay", icon: "layer-group",   toolTip: "Overlay",              btnType: ButtonType.ToggleButton,        expertMode: true,  toolType:CollectionViewType.Freeform, funcs: {hidden: '!SelectedDocType(this.toolType, this.expertMode, true)'},                        scripts: { onClick: '{ return toggleOverlay(_readOnly_); }'}}, // Only when floating document is selected in freeform
+            { title: "Back",    icon: "chevron-left",  toolTip: "Prev Animation Frame", btnType: ButtonType.ClickButton,         expertMode: true,  toolType:CollectionViewType.Freeform, funcs: {hidden: '!SelectedDocType(this.toolType, this.expertMode)'},                  width: 30,  scripts: { onClick: 'prevKeyFrame(_readOnly_)'}},
             { title: "Num",     icon:"", toolTip: "Frame # (click to toggle edit mode)",btnType: ButtonType.TextButton,          expertMode: true,  toolType:CollectionViewType.Freeform, funcs: {hidden: '!SelectedDocType(this.toolType, this.expertMode)', buttonText: 'selectedDocs()?.lastElement()?.currentFrame?.toString()'}, width: 20, scripts: { onClick: '{ return curKeyFrame(_readOnly_);}'}},
-            { title: "Fwd",     icon: "chevron-right", toolTip: "Next Animation Frame", btnType: ButtonType.ClickButton,         expertMode: true,  toolType:CollectionViewType.Freeform, funcs: {hidden: '!SelectedDocType(this.toolType, this.expertMode)'}, width: 30,  scripts: { onClick: 'nextKeyFrame(_readOnly_)'}},
+            { title: "Fwd",     icon: "chevron-right", toolTip: "Next Animation Frame", btnType: ButtonType.ClickButton,         expertMode: true,  toolType:CollectionViewType.Freeform, funcs: {hidden: '!SelectedDocType(this.toolType, this.expertMode)'},                  width: 30,  scripts: { onClick: 'nextKeyFrame(_readOnly_)'}},
             
             { title: "Filter",  icon: "=",      toolTip: "Filter cards by tags", subMenu: CurrentUserUtils.tagGroupTools(),ignoreClick:true, toolType:DocumentType.COL,            funcs: {hidden: '!SelectedDocType(this.toolType, this.expertMode)'}, btnType: ButtonType.MultiToggleButton, width: 30, backgroundColor: doc.userVariantColor as string},
             { title: "Text",    icon: "Text",   toolTip: "Text functions",       subMenu: CurrentUserUtils.textTools(),   expertMode: false, toolType:DocumentType.RTF,            funcs: {                                                                             linearView_IsOpen: `SelectedDocType(this.toolType, this.expertMode)`} }, // Always available
@@ -863,7 +867,7 @@ pie title Minerals in my tap water
         }  
         // linear view
         const reqdSubMenuOpts = { ...OmitKeys(params, ["scripts", "funcs", "subMenu"]).omit, undoIgnoreFields: new List<string>(['width', "linearView_IsOpen"]),
-            childDontRegisterViews: true, flexGap: 0, _height: 30, ignoreClick: !params.scripts?.onClick,
+            childDontRegisterViews: true, flexGap: 0, _height: 30, _width: 30, ignoreClick: !params.scripts?.onClick,
             linearView_SubMenu: true, linearView_Expandable: true, embedContainer: menuDoc};
         
         const items = (menutBtn?:Doc) => !menutBtn ? [] : subMenu.map(sub => this.setupContextMenuBtn(sub, menutBtn) );
@@ -987,15 +991,23 @@ pie title Minerals in my tap water
         Doc.noviceMode ?? (Doc.noviceMode = true);
         doc._showLabel ?? (doc._showLabel = true);
         doc.textAlign ?? (doc.textAlign = "left");
+        doc.textBackgroundColor ?? (doc.textBackgroundColor = Colors.LIGHT_GRAY);
         doc.activeTool = InkTool.None;
         doc.openInkInLightbox ?? (doc.openInkInLightbox = false);
-        doc.activeInkHideTextLabels ?? (doc.activeInkHideTextLabels = false);
-        doc.activeInkColor ?? (doc.activeInkColor = "rgb(0, 0, 0)");
-        doc.activeInkWidth ?? (doc.activeInkWidth = 1);
-        doc.activeInkBezier ?? (doc.activeInkBezier = "0");
-        doc.activeFillColor ?? (doc.activeFillColor = "");
-        doc.activeArrowStart ?? (doc.activeArrowStart = "");
-        doc.activeArrowEnd ?? (doc.activeArrowEnd = "");
+        doc.activeHideTextLabels ?? (doc.activeHideTextLabels = false);
+        doc[`active${InkInkTool.Pen}Color`]        ?? (doc[`active${InkInkTool.Pen}Color`] = "rgb(0, 0, 0)");
+        doc[`active${InkInkTool.Pen}Width`]        ?? (doc[`active${InkInkTool.Pen}Width`] = 2);
+        doc[`active${InkInkTool.Pen}Bezier`]       ?? (doc[`active${InkInkTool.Pen}Bezier`] = "0");
+        doc[`active${InkInkTool.Write}Color`]      ?? (doc[`active${InkInkTool.Write}Color`] = "rgb(255, 0, 0)");
+        doc[`active${InkInkTool.Write}Width`]      ?? (doc[`active${InkInkTool.Write}Width`] = 1);
+        doc[`active${InkInkTool.Write}Bezier`]     ?? (doc[`active${InkInkTool.Write}Bezier`] = "0");
+        doc[`active${InkInkTool.Highlight}Color`]  ?? (doc[`active${InkInkTool.Highlight}Color`] = 'transparent');
+        doc[`active${InkInkTool.Highlight}Width`]  ?? (doc[`active${InkInkTool.Highlight}Width`] = 20);
+        doc[`active${InkInkTool.Highlight}Bezier`] ?? (doc[`active${InkInkTool.Highlight}Bezier`] = "0");
+        doc[`active${InkInkTool.Highlight}Fill`]   ?? (doc[`active${InkInkTool.Highlight}Fill`] = "rgba(0, 255, 255, 0.4)");
+        doc.activeInkTool ?? (doc.activeInkTool = InkInkTool.Pen);
+        doc.activeEraserTool ?? (doc.activeEraserTool = InkEraserTool.Stroke);
+        doc.activeEraserWidth ?? (doc.activeEraserWidth = 20);
         doc.activeDash ?? (doc.activeDash === "0");
         doc.fontSize ?? (doc.fontSize = "12px");
         doc.fontFamily ?? (doc.fontFamily = "Arial");
@@ -1130,7 +1142,9 @@ pie title Minerals in my tap water
 }
 
 // eslint-disable-next-line prefer-arrow-callback
-ScriptingGlobals.add(function NotRadiusEraser() { return Doc.ActiveTool !== InkTool.RadiusEraser; }, "is the active tool anything but the radius eraser");
+ScriptingGlobals.add(function activeInkTool() { return Doc.ActiveTool=== InkTool.Ink || DocumentView.Selected().some(dv => dv.layoutDoc.layout_isSvg); }, "is a pen tool or an ink stroke active");
+// eslint-disable-next-line prefer-arrow-callback
+ScriptingGlobals.add(function NotRadiusEraser() { return Doc.ActiveTool !== InkTool.Eraser || Doc.ActiveEraser !== InkEraserTool.Radius; }, "is the active tool anything but the radius eraser");
 // eslint-disable-next-line prefer-arrow-callback
 ScriptingGlobals.add(function MySharedDocs()    { return Doc.MySharedDocs; }, "document containing all shared Docs");
 // eslint-disable-next-line prefer-arrow-callback
diff --git a/src/client/util/InteractionUtils.tsx b/src/client/util/InteractionUtils.tsx
index 4231c2ca8..ca1cb8014 100644
--- a/src/client/util/InteractionUtils.tsx
+++ b/src/client/util/InteractionUtils.tsx
@@ -109,7 +109,7 @@ export namespace InteractionUtils {
         dash: string | undefined,
         scalexIn: number,
         scaleyIn: number,
-        shape: Gestures,
+        shape: Gestures | undefined,
         pevents: Property.PointerEvents,
         opacity: number,
         nodefs: boolean,
@@ -136,7 +136,7 @@ export namespace InteractionUtils {
         const arrowLengthFactor = 5 * (markerScale || 0.5);
         const arrowNotchFactor = 2 * (markerScale || 0.5);
         return (
-            <svg fill={color} style={{ transition: 'inherit' }} onPointerDown={downHdlr}>
+            <svg fill={color || 'transparent'} style={{ transition: 'inherit' }} onPointerDown={downHdlr}>
                 {' '}
                 {/* setting the svg fill sets the arrowStart fill */}
                 {nodefs ? null : (
@@ -186,7 +186,7 @@ export namespace InteractionUtils {
                         opacity: 1.0,
                         // opacity: strokeWidth !== width ? 0.5 : undefined,
                         pointerEvents: pevents === 'all' ? 'visiblePainted' : pevents,
-                        stroke: color ?? 'rgb(0, 0, 0)',
+                        stroke: (color ?? 'rgb(0, 0, 0)') || 'transparent',
                         strokeWidth,
                         strokeLinecap: strokeLineCap,
                         strokeDasharray: dashArray,
diff --git a/src/client/util/SettingsManager.tsx b/src/client/util/SettingsManager.tsx
index 33d7d90a8..628097ca8 100644
--- a/src/client/util/SettingsManager.tsx
+++ b/src/client/util/SettingsManager.tsx
@@ -268,9 +268,9 @@ export class SettingsManager extends React.Component<object> {
                     formLabelPlacement="right"
                     toggleType={ToggleType.SWITCH}
                     onClick={() => {
-                        Doc.UserDoc().activeInkHideTextLabels = !Doc.UserDoc().activeInkHideTextLabels;
+                        Doc.UserDoc().activeHideTextLabels = !Doc.UserDoc().activeHideTextLabels;
                     }}
-                    toggleStatus={BoolCast(Doc.UserDoc().activeInkHideTextLabels)}
+                    toggleStatus={BoolCast(Doc.UserDoc().activeHideTextLabels)}
                     size={Size.XSMALL}
                     color={SettingsManager.userColor}
                 />
diff --git a/src/client/util/SnappingManager.ts b/src/client/util/SnappingManager.ts
index 5f6c7d9ac..2a150dc5a 100644
--- a/src/client/util/SnappingManager.ts
+++ b/src/client/util/SnappingManager.ts
@@ -1,4 +1,5 @@
 import { observable, action, runInAction, makeObservable } from 'mobx';
+import { Gestures } from '../../pen-gestures/GestureTypes';
 
 export enum freeformScrollMode {
     Pan = 'pan',
@@ -29,6 +30,8 @@ export class SnappingManager {
     @observable _propertyWid: number = 0;
     @observable _printToConsole: boolean = false;
     @observable _hideDecorations: boolean = false;
+    @observable _keepGestureMode: boolean = false; // for whether primitive selection enters a one-shot or persistent mode
+    @observable _inkShape: Gestures | undefined = undefined;
 
     private constructor() {
         SnappingManager._manager = this;
@@ -61,6 +64,8 @@ export class SnappingManager {
     public static get PropertiesWidth(){ return this.Instance._propertyWid; } // prettier-ignore
     public static get PrintToConsole() { return this.Instance._printToConsole; } // prettier-ignore
     public static get HideDecorations(){ return this.Instance._hideDecorations; } // prettier-ignore
+    public static get KeepGestureMode(){ return this.Instance._keepGestureMode; } // prettier-ignore
+    public static get InkShape()       { return this.Instance._inkShape; } // prettier-ignore
 
     public static SetLongPress      = (press: boolean) => runInAction(() => {this.Instance._longPress = press}); // prettier-ignore
     public static SetShiftKey       = (down: boolean) => runInAction(() => {this.Instance._shiftKey = down}); // prettier-ignore
@@ -78,6 +83,8 @@ export class SnappingManager {
     public static SetPropertiesWidth= (wid:number)     =>runInAction(() => {this.Instance._propertyWid = wid}); // prettier-ignore
     public static SetPrintToConsole = (state:boolean)  =>runInAction(() => {this.Instance._printToConsole = state}); // prettier-ignore
     public static SetHideDecorations= (state:boolean)  =>runInAction(() => {this.Instance._hideDecorations = state}); // prettier-ignore
+    public static SetKeepGestureMode= (state:boolean)  =>runInAction(() => {this.Instance._keepGestureMode = state}); // prettier-ignore
+    public static SetInkShape       = (shape?:Gestures)=>runInAction(() => {this.Instance._inkShape = shape}); // prettier-ignore
 
     public static userColor: string | undefined;
     public static userVariantColor: string | undefined;
diff --git a/src/client/views/FilterPanel.tsx b/src/client/views/FilterPanel.tsx
index 11425e477..99738052d 100644
--- a/src/client/views/FilterPanel.tsx
+++ b/src/client/views/FilterPanel.tsx
@@ -102,7 +102,7 @@ const HotKeyIconButton: React.FC<HotKeyButtonProps> = observer(({ hotKey /*, sel
 
     return (
         <div
-            className={`filterHotKey-button`}
+            className="filterHotKey-button"
             onClick={e => {
                 e.stopPropagation();
                 state.startEditing();
diff --git a/src/client/views/GestureOverlay.tsx b/src/client/views/GestureOverlay.tsx
index 59d37df91..2d6cd03e0 100644
--- a/src/client/views/GestureOverlay.tsx
+++ b/src/client/views/GestureOverlay.tsx
@@ -2,9 +2,9 @@ import * as fitCurve from 'fit-curve';
 import { action, computed, makeObservable, observable, runInAction } from 'mobx';
 import { observer } from 'mobx-react';
 import * as React from 'react';
-import { returnEmptyFilter, returnEmptyString, returnFalse, setupMoveUpEvents } from '../../ClientUtils';
+import { setupMoveUpEvents } from '../../ClientUtils';
 import { emptyFunction, intersectRect } from '../../Utils';
-import { Doc, Opt, returnEmptyDoclist } from '../../fields/Doc';
+import { Doc } from '../../fields/Doc';
 import { InkData, InkField, InkTool } from '../../fields/InkField';
 import { NumCast } from '../../fields/Types';
 import { Gestures } from '../../pen-gestures/GestureTypes';
@@ -14,27 +14,25 @@ import { DocumentType } from '../documents/DocumentTypes';
 import { Docs } from '../documents/Documents';
 import { InteractionUtils } from '../util/InteractionUtils';
 import { ScriptingGlobals } from '../util/ScriptingGlobals';
-import { Transform } from '../util/Transform';
+import { SnappingManager } from '../util/SnappingManager';
 import { undoable } from '../util/UndoManager';
 import './GestureOverlay.scss';
 import { InkingStroke } from './InkingStroke';
 import { ObservableReactComponent } from './ObservableReactComponent';
-import { returnEmptyDocViewList } from './StyleProvider';
 import { CollectionFreeFormView } from './collections/collectionFreeForm';
 import {
-    ActiveArrowEnd,
-    ActiveArrowScale,
-    ActiveArrowStart,
-    ActiveDash,
-    ActiveFillColor,
-    ActiveInkBezierApprox,
+    ActiveInkArrowEnd,
+    ActiveInkArrowScale,
+    ActiveInkArrowStart,
     ActiveInkColor,
+    ActiveInkDash,
+    ActiveInkFillColor,
     ActiveInkWidth,
     DocumentView,
-    SetActiveArrowStart,
-    SetActiveDash,
-    SetActiveFillColor,
+    SetActiveInkArrowStart,
     SetActiveInkColor,
+    SetActiveInkDash,
+    SetActiveInkFillColor,
     SetActiveInkWidth,
 } from './nodes/DocumentView';
 export enum ToolglassTools {
@@ -57,18 +55,14 @@ export class GestureOverlay extends ObservableReactComponent<React.PropsWithChil
     // eslint-disable-next-line no-use-before-define
     static Instances: GestureOverlay[] = [];
 
-    @observable public InkShape: Opt<Gestures> = undefined;
     @observable public SavedColor?: string = undefined;
     @observable public SavedWidth?: number = undefined;
     @observable public Tool: ToolglassTools = ToolglassTools.None;
-    @observable public KeepPrimitiveMode = false; // for whether primitive selection enters a one-shot or persistent mode
 
     @observable private _thumbX?: number = undefined;
     @observable private _thumbY?: number = undefined;
     @observable private _pointerY?: number = undefined;
     @observable private _points: { X: number; Y: number }[] = [];
-    @observable private _strokes: InkData[] = [];
-    @observable private _palette?: JSX.Element = undefined;
     @observable private _clipboardDoc?: JSX.Element = undefined;
 
     @computed private get height(): number {
@@ -97,7 +91,7 @@ export class GestureOverlay extends ObservableReactComponent<React.PropsWithChil
     onPointerDown = (e: React.PointerEvent) => {
         (document.activeElement as HTMLElement)?.blur();
         if (!(e.target as HTMLElement)?.className?.toString().startsWith('lm_')) {
-            if ([InkTool.Highlighter, InkTool.Pen, InkTool.Write].includes(Doc.ActiveTool)) {
+            if (Doc.ActiveTool === InkTool.Ink) {
                 this._points.push({ X: e.clientX, Y: e.clientY });
                 setupMoveUpEvents(this, e, this.onPointerMove, this.onPointerUp, emptyFunction);
             }
@@ -123,13 +117,9 @@ export class GestureOverlay extends ObservableReactComponent<React.PropsWithChil
     };
 
     @action primCreated() {
-        if (!this.KeepPrimitiveMode) {
-            this.InkShape = undefined;
-            // get out of ink mode after each stroke=
-            // if (Doc.ActiveTool === InkTool.Highlighter && GestureOverlay.Instance.SavedColor) SetActiveInkColor(GestureOverlay.Instance.SavedColor);
+        if (!SnappingManager.KeepGestureMode) {
+            SnappingManager.SetInkShape(undefined);
             Doc.ActiveTool = InkTool.None;
-            // SetActiveArrowStart('none');
-            // SetActiveArrowEnd('none');
         }
     }
     /**
@@ -253,8 +243,8 @@ export class GestureOverlay extends ObservableReactComponent<React.PropsWithChil
             const B = this.svgBounds;
             const points = this._points.map(p => ({ X: p.X - B.left, Y: p.Y - B.top }));
             const { Name, Score } =
-                (this.InkShape
-                    ? new Result(this.InkShape, 1, Date.now) 
+                (SnappingManager.InkShape
+                    ? new Result(SnappingManager.InkShape, 1, Date.now) 
                     : Doc.UserDoc().recognizeGestures && points.length > 2
                       ? GestureUtils.GestureRecognizer.Recognize([points])
                       : undefined) ?? 
@@ -292,6 +282,7 @@ export class GestureOverlay extends ObservableReactComponent<React.PropsWithChil
             (downView?.ComponentView as CollectionFreeFormView)?._marqueeViewRef?.current?.setPreviewCursor?.(this._points[0].X, this._points[0].Y, false, false, undefined);
             e.preventDefault();
         }
+        this.primCreated();
         this._points.length = 0;
     };
     /**
@@ -557,97 +548,38 @@ export class GestureOverlay extends ObservableReactComponent<React.PropsWithChil
         B.bottom += width / 2;
         B.width += width;
         B.height += width;
-        const fillColor = ActiveFillColor();
+        const fillColor = ActiveInkFillColor();
         const strokeColor = fillColor && fillColor !== 'transparent' ? fillColor : ActiveInkColor();
         return [
             this.props.children,
-            this._palette,
-            [
-                this._strokes.map((l, i) => {
-                    const b = { left: -20000, right: 20000, top: -20000, bottom: 20000, width: 40000, height: 40000 }; // this.getBounds(l, true);
-                    return (
-                        <svg key={i} width={b.width} height={b.height} style={{ top: 0, left: 0, transform: `translate(${b.left}px, ${b.top}px)`, pointerEvents: 'none', position: 'absolute', zIndex: 30000, overflow: 'visible' }}>
-                            {InteractionUtils.CreatePolyline(
-                                l,
-                                b.left,
-                                b.top,
-                                strokeColor,
-                                width,
-                                width,
-                                'miter',
-                                'round',
-                                ActiveInkBezierApprox(),
-                                'none' /* ActiveFillColor() */,
-                                ActiveArrowStart(),
-                                ActiveArrowEnd(),
-                                ActiveArrowScale(),
-                                ActiveDash(),
-                                1,
-                                1,
-                                this.InkShape as Gestures,
-                                'none',
-                                1.0,
-                                false
-                            )}
-                        </svg>
-                    );
-                }),
-                this._points.length <= 1 ? null : (
-                    <svg key="svg" width={B.width} height={B.height} style={{ top: 0, left: 0, transform: `translate(${B.left}px, ${B.top}px)`, pointerEvents: 'none', position: 'absolute', zIndex: 30000, overflow: 'visible' }}>
-                        {InteractionUtils.CreatePolyline(
-                            this._points.map(p => ({ X: p.X - (rect?.x || 0), Y: p.Y - (rect?.y || 0) })),
-                            B.left,
-                            B.top,
-                            ActiveInkColor(),
-                            width,
-                            width,
-                            'miter',
-                            'round',
-                            '',
-                            'none' /* ActiveFillColor() */,
-                            ActiveArrowStart(),
-                            ActiveArrowEnd(),
-                            ActiveArrowScale(),
-                            ActiveDash(),
-                            1,
-                            1,
-                            this.InkShape as Gestures,
-                            'none',
-                            1.0,
-                            false
-                        )}
-                    </svg>
-                ),
-            ],
+            this._points.length <= 1 ? null : (
+                <svg key="svg" width={B.width} height={B.height} style={{ top: 0, left: 0, transform: `translate(${B.left}px, ${B.top}px)`, pointerEvents: 'none', position: 'absolute', zIndex: 30000, overflow: 'visible' }}>
+                    {InteractionUtils.CreatePolyline(
+                        this._points.map(p => ({ X: p.X - (rect?.x || 0), Y: p.Y - (rect?.y || 0) })),
+                        B.left,
+                        B.top,
+                        strokeColor,
+                        width,
+                        width,
+                        'miter',
+                        'round',
+                        '',
+                        'none' /* ActiveFillColor() */,
+                        ActiveInkArrowStart(),
+                        ActiveInkArrowEnd(),
+                        ActiveInkArrowScale(),
+                        ActiveInkDash(),
+                        1,
+                        1,
+                        SnappingManager.InkShape,
+                        'none',
+                        1.0,
+                        false
+                    )}
+                </svg>
+            ),
         ];
     }
-    screenToLocalTransform = () => new Transform(-(this._thumbX ?? 0), -(this._thumbY ?? 0) + this.height, 1);
-    return300 = () => 300;
-    @action
-    public openFloatingDoc = (doc: Doc) => {
-        this._clipboardDoc = (
-            <DocumentView
-                Document={doc}
-                addDocument={undefined}
-                addDocTab={returnFalse}
-                pinToPres={emptyFunction}
-                removeDocument={undefined}
-                ScreenToLocalTransform={this.screenToLocalTransform}
-                PanelWidth={this.return300}
-                PanelHeight={this.return300}
-                isDocumentActive={returnFalse}
-                isContentActive={returnFalse}
-                renderDepth={0}
-                styleProvider={returnEmptyString}
-                containerViewPath={returnEmptyDocViewList}
-                focus={emptyFunction}
-                whenChildContentsActiveChanged={emptyFunction}
-                childFiltersByRanges={returnEmptyFilter}
-                childFilters={returnEmptyFilter}
-                searchFilterDocs={returnEmptyDoclist}
-            />
-        );
-    };
 
     @action
     public closeFloatingDoc = () => {
@@ -694,10 +626,10 @@ ScriptingGlobals.add(function setPen(width: string, color: string, fill: string,
         SetActiveInkColor(color);
         GestureOverlay.Instance.SavedWidth = ActiveInkWidth();
         SetActiveInkWidth(width);
-        SetActiveFillColor(fill);
-        SetActiveArrowStart(arrowStart);
-        SetActiveArrowStart(arrowEnd);
-        SetActiveDash(dash);
+        SetActiveInkFillColor(fill);
+        SetActiveInkArrowStart(arrowStart);
+        SetActiveInkArrowStart(arrowEnd);
+        SetActiveInkDash(dash);
     });
 });
 // eslint-disable-next-line prefer-arrow-callback
diff --git a/src/client/views/GlobalKeyHandler.ts b/src/client/views/GlobalKeyHandler.ts
index d7d8e9506..f16338361 100644
--- a/src/client/views/GlobalKeyHandler.ts
+++ b/src/client/views/GlobalKeyHandler.ts
@@ -2,7 +2,7 @@ import { random } from 'lodash';
 import { action } from 'mobx';
 import { Doc, DocListCast } from '../../fields/Doc';
 import { Id } from '../../fields/FieldSymbols';
-import { InkTool } from '../../fields/InkField';
+import { InkInkTool, InkTool } from '../../fields/InkField';
 import { ScriptField } from '../../fields/ScriptField';
 import { Cast, PromiseValue } from '../../fields/Types';
 import { GoogleAuthenticationManager } from '../apis/GoogleAuthenticationManager';
@@ -280,10 +280,10 @@ export class KeyManager {
                 }
                 break;
             case 'e':
-                Doc.ActiveTool = [InkTool.StrokeEraser, InkTool.SegmentEraser, InkTool.RadiusEraser].includes(Doc.ActiveTool) ? InkTool.None : InkTool.StrokeEraser;
+                Doc.ActiveTool = Doc.ActiveTool === InkTool.Eraser ? InkTool.None : InkTool.Eraser;
                 break;
             case 'p':
-                Doc.ActiveTool = Doc.ActiveTool === InkTool.Pen ? InkTool.None : InkTool.Pen;
+                Doc.ActiveTool = Doc.ActiveTool === InkTool.Ink ? InkTool.None : InkTool.Ink;
                 break;
             case 'r':
                 preventDefault = false;
@@ -378,7 +378,8 @@ export class KeyManager {
                 UndoManager.Redo();
                 break;
             case 'p':
-                Doc.ActiveTool = InkTool.Write;
+                Doc.ActiveInk = InkInkTool.Write;
+                Doc.ActiveTool = InkTool.Ink;
                 break;
             default:
         }
diff --git a/src/client/views/InkingStroke.tsx b/src/client/views/InkingStroke.tsx
index 270266a94..5199eb02b 100644
--- a/src/client/views/InkingStroke.tsx
+++ b/src/client/views/InkingStroke.tsx
@@ -470,14 +470,13 @@ export class InkingStroke extends ViewBoxAnnotatableComponent<FieldViewProps>()
                     className="inkStroke"
                     style={{
                         transform: isInkMask ? `rotate(-${NumCast(this._props.LocalRotation?.() ?? 0)}deg) translate(${InkingStroke.MaskDim / 2}px, ${InkingStroke.MaskDim / 2}px)` : undefined,
-                        // mixBlendMode: this.layoutDoc.tool === InkTool.Highlighter ? 'multiply' : 'unset',
                         cursor: this._props.isSelected() ? 'default' : undefined,
                     }}
                     {...interactions}>
                     {clickableLine(this.onPointerDown, isInkMask)}
                     {isInkMask ? null : inkLine}
                 </svg>
-                {!closed || this.dataDoc[this.fieldKey + '_showLabel'] === false || (!RTFCast(this.dataDoc.text)?.Text && !this.dataDoc[this.fieldKey + '_showLabel'] && (!this._props.isSelected() || Doc.UserDoc().activeInkHideTextLabels)) ? null : (
+                {!closed || this.dataDoc[this.fieldKey + '_showLabel'] === false || (!RTFCast(this.dataDoc.text)?.Text && !this.dataDoc[this.fieldKey + '_showLabel'] && (!this._props.isSelected() || Doc.UserDoc().activeHideTextLabels)) ? null : (
                     <div
                         className="inkStroke-text"
                         style={{
diff --git a/src/client/views/LightboxView.tsx b/src/client/views/LightboxView.tsx
index a543b4875..3a8a38073 100644
--- a/src/client/views/LightboxView.tsx
+++ b/src/client/views/LightboxView.tsx
@@ -214,7 +214,7 @@ export class LightboxView extends ObservableReactComponent<LightboxViewProps> {
         // if (this._showPalette === false) AnnotationPalette.Instance.resetPalette(true);
     };
     togglePen = () => {
-        Doc.ActiveTool = Doc.ActiveTool === InkTool.Pen ? InkTool.None : InkTool.Pen;
+        Doc.ActiveTool = Doc.ActiveTool === InkTool.Ink ? InkTool.None : InkTool.Ink;
     };
     toggleExplore = () => SnappingManager.SetExploreMode(!SnappingManager.ExploreMode);
 
@@ -332,7 +332,7 @@ export class LightboxView extends ObservableReactComponent<LightboxViewProps> {
                 {toggleBtn('lightboxView-navBtn', 'toggle reading view', BoolCast(this._doc?._layout_fitWidth), 'book-open', 'book', this.toggleFitWidth)}
                 {toggleBtn('lightboxView-tabBtn', 'open document in a tab', false, 'file-export', '', this.downloadDoc)}
                 {toggleBtn('lightboxView-paletteBtn', 'toggle annotation palette', this._showPalette === true, 'palette', '', this.togglePalette)}
-                {toggleBtn('lightboxView-penBtn', 'toggle pen annotation', Doc.ActiveTool === InkTool.Pen, 'pen', '', this.togglePen)}
+                {toggleBtn('lightboxView-penBtn', 'toggle pen annotation', Doc.ActiveTool === InkTool.Ink, 'pen', '', this.togglePen)}
                 {toggleBtn('lightboxView-exploreBtn', 'toggle navigate only mode', SnappingManager.ExploreMode, 'globe-americas', '', this.toggleExplore)}
             </div>
         );
diff --git a/src/client/views/StyleProp.ts b/src/client/views/StyleProp.ts
index 44d3bf757..56367e70b 100644
--- a/src/client/views/StyleProp.ts
+++ b/src/client/views/StyleProp.ts
@@ -19,7 +19,9 @@ export enum StyleProp {
     FontColor = 'fontColor', // color o tet
     FontSize = 'fontSize', // size of text font
     FontFamily = 'fontFamily', // font family of text
-    FontWeight = 'fontWeight', // font weight of text
+    FontWeight = 'fontWeight', // font weight of text (eg bold)
+    FontStyle = 'fontStyle', // font style of text (eg italic)
+    FontDecoration = 'fontDecoration', // text decoration of text (eg underline)
     Highlighting = 'highlighting', // border highlighting
     ContextMenuItems = 'contextMenuItems', // menu items to add to context menu
     AnchorMenuItems = 'anchorMenuItems',
diff --git a/src/client/views/StyleProvider.tsx b/src/client/views/StyleProvider.tsx
index 12c032964..3a5f57908 100644
--- a/src/client/views/StyleProvider.tsx
+++ b/src/client/views/StyleProvider.tsx
@@ -25,6 +25,7 @@ import { styleProviderQuiz } from './StyleProviderQuiz';
 import { StyleProp } from './StyleProp';
 import './StyleProvider.scss';
 import { TagsView } from './TagsView';
+import { InkInkTool } from '../../fields/InkField';
 
 function toggleLockedPosition(doc: Doc) {
     UndoManager.RunInBatch(() => Doc.toggleLockedPosition(doc), 'toggleBackground');
@@ -171,7 +172,9 @@ export function DefaultStyleProvider(doc: Opt<Doc>, props: Opt<FieldViewProps &
         case StyleProp.FontSize:     return StrCast(doc?.[fieldKey + 'fontSize'],   StrCast(Doc.UserDoc().fontSize));
         case StyleProp.FontFamily:   return StrCast(doc?.[fieldKey + 'fontFamily'], StrCast(Doc.UserDoc().fontFamily));
         case StyleProp.FontWeight:   return StrCast(doc?.[fieldKey + 'fontWeight'], StrCast(Doc.UserDoc().fontWeight));
-        case StyleProp.FillColor:    return StrCast(doc?._fillColor, StrCast(doc?.fillColor, StrCast(doc?.backgroundColor, 'transparent')));
+        case StyleProp.FontStyle:    return StrCast(doc?.[fieldKey + 'fontStyle'], StrCast(Doc.UserDoc().fontStyle));
+        case StyleProp.FontDecoration:return StrCast(doc?.[fieldKey + 'fontDecoration'], StrCast(Doc.UserDoc().fontDecoration));
+        case StyleProp.FillColor:    return StrCast(doc?._fillColor, StrCast(doc?.fillColor, StrCast(doc?.backgroundColor, StrCast(Doc.UserDoc()[Doc.ActiveInk === InkInkTool.Highlight ? "inkHighlighterColor": "inkFillColor"], 'transparent'))));
         case StyleProp.ShowCaption:  return hideCaptions || doc?._type_collection === CollectionViewType.Carousel ? undefined: StrCast(doc?._layout_showCaption);
         case StyleProp.TitleHeight:  return Math.min(4,(docView?.().screenToViewTransform().Scale ?? 1)) * NumCast(Doc.UserDoc().headerHeight,30);
         case StyleProp.ShowTitle:    return (
diff --git a/src/client/views/collections/CollectionDockingView.tsx b/src/client/views/collections/CollectionDockingView.tsx
index e1786d2c9..3e8138390 100644
--- a/src/client/views/collections/CollectionDockingView.tsx
+++ b/src/client/views/collections/CollectionDockingView.tsx
@@ -453,7 +453,7 @@ export class CollectionDockingView extends CollectionSubView() {
                 }
             }
         }
-        if (!InteractionUtils.IsType(e, InteractionUtils.TOUCHTYPE) && !InteractionUtils.IsType(e, InteractionUtils.PENTYPE) && ![InkTool.Highlighter, InkTool.Pen, InkTool.Write].includes(Doc.ActiveTool)) {
+        if (!InteractionUtils.IsType(e, InteractionUtils.TOUCHTYPE) && !InteractionUtils.IsType(e, InteractionUtils.PENTYPE) && Doc.ActiveTool !== InkTool.Ink) {
             e.stopPropagation();
         }
     };
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormInfoUI.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormInfoUI.tsx
index 5d8373fc7..8b9a3e0ec 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormInfoUI.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormInfoUI.tsx
@@ -29,7 +29,7 @@ export class CollectionFreeFormInfoUI extends ObservableReactComponent<Collectio
     }
     _firstDocPos = { x: 0, y: 0 };
 
-    constructor(props: any) {
+    constructor(props: CollectionFreeFormInfoUIProps) {
         super(props);
         makeObservable(this);
         this._currState = this.setupStates();
@@ -163,7 +163,7 @@ export class CollectionFreeFormInfoUI extends ObservableReactComponent<Collectio
                     return presentDocs;
                 }],
                 // eslint-disable-next-line no-use-before-define
-                activePen: [() => activeTool() === InkTool.Pen, () => penMode],
+                activePen: [() => activeTool() === InkTool.Ink, () => penMode],
             },
             'documentation.png',
             () => TopBar.Instance.FlipDocumentationIcon()
@@ -187,7 +187,7 @@ export class CollectionFreeFormInfoUI extends ObservableReactComponent<Collectio
 
         const penMode = InfoState('You\'re in pen mode. Click and drag to draw your first masterpiece.', {
             // activePen: [() => activeTool() === InkTool.Eraser, () => eraserMode],
-            activePen: [() => activeTool() !== InkTool.Pen, () => viewedLink],
+            activePen: [() => activeTool() !== InkTool.Ink, () => viewedLink],
         }); // prettier-ignore
 
         // const eraserMode = InfoState('You\'re in eraser mode. Say goodbye to your first masterpiece.', {
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
index ff711314b..f2a5780c5 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
@@ -10,7 +10,7 @@ import { DateField } from '../../../../fields/DateField';
 import { Doc, DocListCast, Field, FieldType, Opt, StrListCast } from '../../../../fields/Doc';
 import { DocData, Height, Width } from '../../../../fields/DocSymbols';
 import { Id } from '../../../../fields/FieldSymbols';
-import { InkData, InkField, InkTool, Segment } from '../../../../fields/InkField';
+import { InkData, InkEraserTool, InkField, InkInkTool, InkTool, Segment } from '../../../../fields/InkField';
 import { List } from '../../../../fields/List';
 import { RichTextField } from '../../../../fields/RichTextField';
 import { listSpec } from '../../../../fields/Schema';
@@ -36,7 +36,20 @@ import { ContextMenu } from '../../ContextMenu';
 import { InkingStroke } from '../../InkingStroke';
 import { CollectionFreeFormDocumentView } from '../../nodes/CollectionFreeFormDocumentView';
 import { SchemaCSVPopUp } from '../../nodes/DataVizBox/SchemaCSVPopUp';
-import { ActiveArrowEnd, ActiveArrowStart, ActiveDash, ActiveEraserWidth, ActiveFillColor, ActiveInkBezierApprox, ActiveInkColor, ActiveInkWidth, ActiveIsInkMask, DocumentView, SetActiveInkColor, SetActiveInkWidth } from '../../nodes/DocumentView';
+import {
+    ActiveInkArrowEnd,
+    ActiveInkArrowStart,
+    ActiveInkDash,
+    ActiveEraserWidth,
+    ActiveInkFillColor,
+    ActiveInkBezierApprox,
+    ActiveInkColor,
+    ActiveInkWidth,
+    ActiveIsInkMask,
+    DocumentView,
+    SetActiveInkColor,
+    SetActiveInkWidth,
+} from '../../nodes/DocumentView';
 import { FieldViewProps } from '../../nodes/FieldView';
 import { FocusViewOptions } from '../../nodes/FocusViewOptions';
 import { FormattedTextBox } from '../../nodes/formattedText/FormattedTextBox';
@@ -497,13 +510,9 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                 // prettier-ignore
                 const hit = this._clusters.handlePointerDown(this.screenToFreeformContentsXf.transformPoint(e.clientX, e.clientY));
                 switch (Doc.ActiveTool) {
-                    case InkTool.Highlighter:
-                    case InkTool.Write:
-                    case InkTool.Pen:
+                    case InkTool.Ink:
                         break; // the GestureOverlay handles ink stroke input -- either as gestures, or drying as ink strokes that are added to document views
-                    case InkTool.StrokeEraser:
-                    case InkTool.SegmentEraser:
-                    case InkTool.RadiusEraser:
+                    case InkTool.Eraser:
                         this._batch = UndoManager.StartBatch('collectionErase');
                         this._eraserPts.length = 0;
                         setupMoveUpEvents(this, e, this.onEraserMove, this.onEraserUp, this.onEraserClick, hit !== -1);
@@ -543,7 +552,8 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                 const { points } = ge;
                 const B = this.screenToFreeformContentsXf.transformBounds(ge.bounds.left, ge.bounds.top, ge.bounds.width, ge.bounds.height);
                 const inkDoc = this.createInkDoc(points, B);
-                if (Doc.ActiveTool === InkTool.Write) {
+                if (Doc.ActiveInk === InkInkTool.Highlight) inkDoc[DocData].backgroundColor = 'transparent';
+                if (Doc.ActiveInk === InkInkTool.Write) {
                     this.unprocessedDocs.push(inkDoc);
                     CollectionFreeFormView.collectionsWithUnprocessedInk.add(this);
                 }
@@ -606,7 +616,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
         const currPoint = { X: e.clientX, Y: e.clientY };
         this._eraserPts.push([currPoint.X, currPoint.Y]);
         this._eraserPts = this._eraserPts.slice(Math.max(0, this._eraserPts.length - 5));
-        if (Doc.ActiveTool === InkTool.RadiusEraser) {
+        if (Doc.ActiveEraser === InkEraserTool.Radius) {
             const strokeMap: Map<DocumentView, number[]> = this.getRadiusEraserIntersections({ X: currPoint.X - delta[0], Y: currPoint.Y - delta[1] }, currPoint);
             strokeMap.forEach((intersects, stroke) => {
                 if (!this._deleteList.includes(stroke)) {
@@ -614,13 +624,16 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                     SetActiveInkWidth(StrCast(stroke.Document.stroke_width?.toString()) || '1');
                     SetActiveInkColor(StrCast(stroke.Document.color?.toString()) || 'black');
                     const segments = this.radiusErase(stroke, intersects.sort());
-                    segments?.forEach(segment =>
-                        this.forceStrokeGesture(
-                            e,
-                            Gestures.Stroke,
-                            segment.reduce((data, curve) => [...data, ...curve.points.map(p => stroke.ComponentView?.ptToScreen?.({ X: p.x, Y: p.y }) ?? { X: 0, Y: 0 })], [] as PointData[])
-                        )
-                    );
+                    segments?.forEach(segment => {
+                        const points = segment.reduce((data, curve) => [...data, ...curve.points.map(p => stroke.ComponentView?.ptToScreen?.({ X: p.x, Y: p.y }) ?? { X: 0, Y: 0 })], [] as PointData[]);
+                        const bounds = InkField.getBounds(points);
+                        const B = this.screenToFreeformContentsXf.transformBounds(bounds.left, bounds.top, bounds.width, bounds.height);
+                        const inkDoc = this.createInkDoc(points, B);
+                        ['color', 'fillColor', 'stroke_width', 'stroke_dash', 'stroke_bezier'].forEach(field => {
+                            inkDoc[DocData][field] = stroke.dataDoc[field];
+                        });
+                        this.addDocument(inkDoc);
+                    });
                 }
                 stroke.layoutDoc.opacity = 0;
                 stroke.layoutDoc.dontIntersect = true;
@@ -632,7 +645,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                     SetActiveInkWidth(StrCast(intersect.inkView.Document.stroke_width?.toString()) || '1');
                     SetActiveInkColor(StrCast(intersect.inkView.Document.color?.toString()) || 'black');
                     // create a new curve by appending all curves of the current segment together in order to render a single new stroke.
-                    if (Doc.ActiveTool !== InkTool.StrokeEraser) {
+                    if (Doc.ActiveEraser !== InkEraserTool.Stroke) {
                         // this._eraserLock++;
                         const segments = this.segmentErase(intersect.inkView, intersect.t); // intersect.t is where the eraser intersected the ink stroke - want to remove the segment that starts at the intersection just before this t value and goes to the one just after it
                         const newStrokes = segments?.map(segment => {
@@ -1195,14 +1208,14 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                 y: B.y - inkWidth / 2,
                 _width: B.width + inkWidth,
                 _height: B.height + inkWidth,
-                stroke_showLabel: BoolCast(Doc.UserDoc().activeInkHideTextLabels)}, // prettier-ignore
+                stroke_showLabel: !BoolCast(Doc.UserDoc().activeHideTextLabels)}, // prettier-ignore
             inkWidth,
             ActiveInkColor(),
             ActiveInkBezierApprox(),
-            ActiveFillColor(),
-            ActiveArrowStart(),
-            ActiveArrowEnd(),
-            ActiveDash(),
+            ActiveInkFillColor(),
+            ActiveInkArrowStart(),
+            ActiveInkArrowEnd(),
+            ActiveInkDash(),
             ActiveIsInkMask()
         );
     };
@@ -1235,14 +1248,14 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                     y: B.y - inkWidth / 2,
                     _width: B.width + inkWidth,
                     _height: B.height + inkWidth,
-                    stroke_showLabel: BoolCast(Doc.UserDoc().activeInkHideTextLabels)}, // prettier-ignore
+                    stroke_showLabel: BoolCast(Doc.UserDoc().activeHideTextLabels)}, // prettier-ignore
                 inkWidth,
                 opts.autoColor ? stroke[1] : ActiveInkColor(),
                 ActiveInkBezierApprox(),
-                stroke[2] === 'none' ? ActiveFillColor() : stroke[2],
-                ActiveArrowStart(),
-                ActiveArrowEnd(),
-                ActiveDash(),
+                stroke[2] === 'none' ? ActiveInkFillColor() : stroke[2],
+                ActiveInkArrowStart(),
+                ActiveInkArrowEnd(),
+                ActiveInkDash(),
                 ActiveIsInkMask()
             );
             this._drawing.push(inkDoc);
@@ -2195,7 +2208,7 @@ export class CollectionFreeFormView extends CollectionSubView<Partial<collection
                     width: `${100 / this.nativeDimScaling}%`,
                     height: this._props.getScrollHeight?.() ?? `${100 / this.nativeDimScaling}%`,
                 }}>
-                {Doc.ActiveTool === InkTool.RadiusEraser && this._showEraserCircle && (
+                {Doc.ActiveTool === InkTool.Eraser && Doc.ActiveEraser === InkEraserTool.Radius && this._showEraserCircle && (
                     <div
                         onPointerMove={this.onCursorMove}
                         style={{
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index c865c681d..ddc50871d 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -690,7 +690,7 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
                 }}
                 style={{
                     overflow: StrCast(this._props.Document._overflow),
-                    cursor: [InkTool.Pen, InkTool.Write].includes(Doc.ActiveTool) || this._visible ? 'crosshair' : 'pointer',
+                    cursor: Doc.ActiveTool === InkTool.Ink || this._visible ? 'crosshair' : 'pointer',
                 }}
                 onDragOver={e => e.preventDefault()}
                 onScroll={e => {
diff --git a/src/client/views/global/globalScripts.ts b/src/client/views/global/globalScripts.ts
index 013b18a97..40144c4ce 100644
--- a/src/client/views/global/globalScripts.ts
+++ b/src/client/views/global/globalScripts.ts
@@ -3,7 +3,7 @@ import { Colors } from 'browndash-components';
 import { runInAction } from 'mobx';
 import { Doc, DocListCast, Opt, StrListCast } from '../../../fields/Doc';
 import { DocData } from '../../../fields/DocSymbols';
-import { InkTool } from '../../../fields/InkField';
+import { InkEraserTool, InkInkTool, InkTool } from '../../../fields/InkField';
 import { List } from '../../../fields/List';
 import { BoolCast, Cast, NumCast, StrCast } from '../../../fields/Types';
 import { WebField } from '../../../fields/URLField';
@@ -16,21 +16,20 @@ import { SnappingManager } from '../../util/SnappingManager';
 import { UndoManager, undoable } from '../../util/UndoManager';
 import { GestureOverlay } from '../GestureOverlay';
 import { InkTranscription } from '../InkTranscription';
-import { InkingStroke } from '../InkingStroke';
 import { PropertiesView } from '../PropertiesView';
 import { CollectionFreeFormView } from '../collections/collectionFreeForm';
 import { CollectionFreeFormDocumentView } from '../nodes/CollectionFreeFormDocumentView';
 import {
     ActiveEraserWidth,
-    ActiveFillColor,
+    ActiveInkFillColor,
     ActiveInkColor,
-    ActiveInkHideTextLabels,
+    ActiveHideTextLabels,
     ActiveInkWidth,
     ActiveIsInkMask,
     DocumentView,
-    SetActiveFillColor,
+    SetActiveInkFillColor,
     SetActiveInkColor,
-    SetActiveInkHideTextLabels,
+    SetactiveHideTextLabels,
     SetActiveInkWidth,
     SetActiveIsInkMask,
     SetEraserWidth,
@@ -60,20 +59,21 @@ ScriptingGlobals.add(function setView(view: string, getSelected: boolean) {
 // eslint-disable-next-line prefer-arrow-callback
 ScriptingGlobals.add(function setBackgroundColor(color?: string, checkResult?: boolean) {
     const selectedViews = DocumentView.Selected();
+    const selectedDoc = selectedViews.lastElement()?.Document;
+    const defaultFill = selectedDoc?._layout_isSvg ? () => StrCast(selectedDoc[DocData].fillColor) : !Doc.ActiveTool || Doc.ActiveTool === InkTool.None ? () => StrCast(Doc.UserDoc().textBackgroundColor, 'transparent') : () => ActiveInkFillColor();
+    const setDefaultFill = !Doc.ActiveTool || Doc.ActiveTool === InkTool.None  ? (c: string) => { Doc.UserDoc().textBackgroundColor = c; }: SetActiveInkFillColor; // prettier-ignore
     if (Doc.ActiveTool !== InkTool.None && !selectedViews.lastElement()?.Document._layout_isSvg) {
-        if (checkResult) {
-            return ActiveFillColor();
-        }
-        SetActiveFillColor(color ?? 'transparent');
+        if (checkResult) return defaultFill();
+        setDefaultFill(color ?? 'transparent');
     } else if (selectedViews.length) {
         if (checkResult) {
             const selView = selectedViews.lastElement();
             const fieldKey = selView.Document._layout_isSvg ? 'fillColor' : 'backgroundColor';
             const layoutFrameNumber = Cast(selView.containerViewPath?.().lastElement()?.Document?._currentFrame, 'number'); // frame number that container is at which determines layout frame values
             const contentFrameNumber = Cast(selView.Document?._currentFrame, 'number', layoutFrameNumber ?? null); // frame number that content is at which determines what content is displayed
-            return CollectionFreeFormDocumentView.getStringValues(selView?.Document, contentFrameNumber)[fieldKey] ?? 'transparent';
+            return CollectionFreeFormDocumentView.getStringValues(selView?.Document, contentFrameNumber)[fieldKey] || defaultFill();
         }
-        selectedViews.some(dv => dv.ComponentView instanceof InkingStroke) && SetActiveFillColor(color ?? 'transparent');
+        setDefaultFill(color ?? 'transparent');
         selectedViews.forEach(dv => {
             const fieldKey = dv.Document._layout_isSvg ? 'fillColor' : 'backgroundColor';
             const layoutFrameNumber = Cast(dv.containerViewPath?.().lastElement()?.Document?._currentFrame, 'number'); // frame number that container is at which determines layout frame values
@@ -92,10 +92,13 @@ ScriptingGlobals.add(function setBackgroundColor(color?: string, checkResult?: b
     } else {
         const selected = DocumentView.SelectedDocs().length ? DocumentView.SelectedDocs() : LinkManager.Instance.currentLink ? [LinkManager.Instance.currentLink] : [];
         if (checkResult) {
-            return selected.lastElement()?._backgroundColor ?? 'transparent';
+            return selected.lastElement()?._backgroundColor ?? defaultFill();
         }
-        SetActiveFillColor(color ?? 'transparent');
-        selected.forEach(doc => { doc[DocData].backgroundColor = color; }); // prettier-ignore
+        if (!selected.length) setDefaultFill(color ?? 'transparent');
+        else
+            selected.forEach(doc => {
+                doc[DocData][doc._layout_isSvg ? 'fillColor' : 'backgroundColor'] = color;
+            });
     }
     return '';
 });
@@ -330,7 +333,7 @@ ScriptingGlobals.add(function setFontAttr(attr: 'font' | 'fontColor' | 'highligh
     return undefined;
 });
 
-type attrname = 'noAutoLink' | 'dictation' | 'fitBox' | 'bold' | 'italics' | 'elide' | 'underline' | 'left' | 'center' | 'right' | 'vcent' | 'bullet' | 'decimal';
+type attrname = 'noAutoLink' | 'dictation' | 'fitBox' | 'bold' | 'italic' | 'elide' | 'underline' | 'left' | 'center' | 'right' | 'vcent' | 'bullet' | 'decimal';
 type attrfuncs = [attrname, { checkResult: () => boolean; toggle?: () => unknown }];
 
 // eslint-disable-next-line prefer-arrow-callback
@@ -360,10 +363,10 @@ ScriptingGlobals.add(function toggleCharStyle(charStyle: attrname, checkResult?:
                         toggle: () => editorView && RichTextMenu.Instance?.toggleNoAutoLinkAnchor()}],
         ['bold',      { checkResult: () => (editorView ? RichTextMenu.Instance?.bold??false : (Doc.UserDoc().fontWeight === 'bold')),
                         toggle: editorView ? RichTextMenu.Instance?.toggleBold : () => { Doc.UserDoc().fontWeight = Doc.UserDoc().fontWeight === 'bold' ? undefined : 'bold'; }}],
-        ['italics',   { checkResult: () => (editorView ? RichTextMenu.Instance?.italics ?? false : (Doc.UserDoc().fontStyle === 'italics')),
-                        toggle: editorView ? RichTextMenu.Instance?.toggleItalics : () => { Doc.UserDoc().fontStyle = Doc.UserDoc().fontStyle === 'italics' ? undefined : 'italics'; }}],
-        ['underline', { checkResult: () => (editorView ? RichTextMenu.Instance?.underline ?? false: (Doc.UserDoc().textDecoration === 'underline')),
-                        toggle: editorView ? RichTextMenu.Instance?.toggleUnderline : () => { Doc.UserDoc().textDecoration = Doc.UserDoc().textDecoration === 'underline' ? undefined : 'underline'; } }]]
+        ['italic',    { checkResult: () => (editorView ? RichTextMenu.Instance?.italic ?? false : (Doc.UserDoc().fontStyle === 'italic')),
+                        toggle: editorView ? RichTextMenu.Instance?.toggleItalic : () => { Doc.UserDoc().fontStyle = Doc.UserDoc().fontStyle === 'italic' ? undefined : 'italic'; }}],
+        ['underline', { checkResult: () => (editorView ? RichTextMenu.Instance?.underline ?? false: (Doc.UserDoc().fontDecoration === 'underline')),
+                        toggle: editorView ? RichTextMenu.Instance?.toggleUnderline : () => { Doc.UserDoc().fontDecoration = Doc.UserDoc().fontDecoration === 'underline' ? undefined : 'underline'; } }]]
 
     const map = new Map(attrs.concat(alignments).concat(listings));
     if (checkResult) {
@@ -373,43 +376,46 @@ ScriptingGlobals.add(function toggleCharStyle(charStyle: attrname, checkResult?:
     return undefined;
 });
 
-function setActiveTool(toolIn: InkTool | Gestures, keepPrim: boolean, checkResult?: boolean) {
+function setActiveTool(tool: InkTool | InkEraserTool | InkInkTool | Gestures, keepPrim: boolean, checkResult?: boolean) {
     InkTranscription.Instance?.createInkGroup();
-    const tool = toolIn === InkTool.Eraser ? Doc.UserDoc().activeEraserTool : toolIn;
     if (checkResult) {
-        return ((Doc.ActiveTool === tool || (Doc.UserDoc().activeEraserTool === tool && (tool === toolIn || Doc.ActiveTool === tool))) && !GestureOverlay.Instance?.InkShape) || GestureOverlay.Instance?.InkShape === tool
-            ? GestureOverlay.Instance?.KeepPrimitiveMode || ![Gestures.Circle, Gestures.Line, Gestures.Rectangle].includes(tool as Gestures)
+        return Doc.ActiveTool === tool || Doc.ActiveEraser === tool || Doc.ActiveInk === tool || SnappingManager.InkShape === tool
+            ? true //SnappingManager.KeepGestureMode || ![Gestures.Circle, Gestures.Line, Gestures.Rectangle].includes(tool as Gestures)
             : false;
     }
     runInAction(() => {
+        const eraserTool = tool === InkTool.Eraser ? Doc.ActiveEraser : [InkEraserTool.Stroke, InkEraserTool.Radius, InkEraserTool.Segment].includes(tool as InkEraserTool) ? (tool as InkEraserTool) : undefined;
+        const inkTool = tool === InkTool.Ink ? Doc.ActiveInk : [InkInkTool.Pen, InkInkTool.Write, InkInkTool.Highlight].includes(tool as InkInkTool) ? (tool as InkInkTool) : undefined;
         if (GestureOverlay.Instance) {
-            GestureOverlay.Instance.KeepPrimitiveMode = keepPrim;
+            SnappingManager.SetKeepGestureMode(keepPrim);
         }
         if (Object.values(Gestures).includes(tool as Gestures)) {
-            if (GestureOverlay.Instance.InkShape === tool && !keepPrim) {
+            if (SnappingManager.InkShape === tool && !keepPrim) {
                 Doc.ActiveTool = InkTool.None;
-                GestureOverlay.Instance.InkShape = undefined;
+                SnappingManager.SetInkShape(undefined);
             } else {
-                Doc.ActiveTool = InkTool.Pen;
-                GestureOverlay.Instance.InkShape = tool as Gestures;
+                Doc.ActiveTool = InkTool.Ink;
+                SnappingManager.SetInkShape(tool as Gestures);
             }
-        } else if (tool) {
-            if (Doc.UserDoc().ActiveTool === tool) {
+        } else if (eraserTool) {
+            if (Doc.ActiveTool === InkTool.Eraser && Doc.ActiveTool === tool) {
                 Doc.ActiveTool = InkTool.None;
             } else {
-                if ([InkTool.StrokeEraser, InkTool.RadiusEraser, InkTool.SegmentEraser].includes(tool as InkTool)) {
-                    Doc.UserDoc().activeEraserTool = tool;
-                }
-                // pen or eraser
-                if (Doc.ActiveTool === tool && !GestureOverlay.Instance.InkShape && !keepPrim) {
-                    Doc.ActiveTool = InkTool.None;
-                } else {
-                    Doc.ActiveTool = tool as InkTool;
-                    GestureOverlay.Instance.InkShape = undefined;
-                }
+                Doc.ActiveEraser = eraserTool;
+                Doc.ActiveTool = InkTool.Eraser;
+                SnappingManager.SetInkShape(undefined);
+            }
+        } else if (inkTool) {
+            if (Doc.ActiveTool === InkTool.Ink && Doc.ActiveTool === tool) {
+                Doc.ActiveTool = InkTool.None;
+            } else {
+                Doc.ActiveInk = inkTool;
+                Doc.ActiveTool = InkTool.Ink;
+                SnappingManager.SetInkShape(undefined);
             }
         } else {
-            Doc.ActiveTool = InkTool.None;
+            if ((Doc.ActiveTool === tool || !tool) && !keepPrim) Doc.ActiveTool = InkTool.None;
+            else Doc.ActiveTool = tool as InkTool;
         }
     });
     return undefined;
@@ -419,44 +425,44 @@ ScriptingGlobals.add(setActiveTool, 'sets the active ink tool mode');
 
 // eslint-disable-next-line prefer-arrow-callback
 ScriptingGlobals.add(function activeEraserTool() {
-    return StrCast(Doc.UserDoc().activeEraserTool, InkTool.StrokeEraser);
+    return StrCast(Doc.UserDoc().activeEraserTool, InkEraserTool.Stroke);
 }, 'returns the current eraser tool');
 
 // toggle: Set overlay status of selected document
 // eslint-disable-next-line prefer-arrow-callback
 ScriptingGlobals.add(function setInkProperty(option: 'inkMask' | 'labels' | 'fillColor' | 'strokeWidth' | 'strokeColor' | 'eraserWidth', value: string | number, checkResult?: boolean) {
-    const selected = DocumentView.SelectedDocs().lastElement() ?? Doc.UserDoc();
+    const selected = DocumentView.SelectedDocs().lastElement();
     // prettier-ignore
     const map: Map<'inkMask' | 'labels' | 'fillColor' | 'strokeWidth' | 'strokeColor' | 'eraserWidth', { checkResult: () => number|boolean|string|undefined; setInk: (doc: Doc) => void; setMode: () => void }> = new Map([
         ['inkMask', {
             checkResult: () => ((selected?._layout_isSvg ? BoolCast(selected[DocData].stroke_isInkMask) : ActiveIsInkMask())),
             setInk: (doc: Doc) => { doc[DocData].stroke_isInkMask = !doc.stroke_isInkMask; },
-            setMode: () => selected?.type !== DocumentType.INK && SetActiveIsInkMask(!ActiveIsInkMask()),
+            setMode: () => SetActiveIsInkMask(value ? true : false)
         }],
         ['labels', {
-            checkResult: () => ((selected?._stroke_showLabel ? BoolCast(selected[DocData].stroke_showLabel) : ActiveInkHideTextLabels())),
-            setInk: (doc: Doc) => { doc[DocData].stroke_showLabel = !doc.stroke_showLabel; },
-            setMode: () => selected?.type !== DocumentType.INK && SetActiveInkHideTextLabels(!ActiveInkHideTextLabels()),
+            checkResult: () => ((selected?._layout_isSvg ? BoolCast(selected[DocData].stroke_showLabel) : !ActiveHideTextLabels())),
+            setInk: (doc: Doc) => { doc[DocData].stroke_showLabel = value; },
+            setMode: () => SetactiveHideTextLabels(value? false : true),
         }],
         ['fillColor', {
-            checkResult: () => (selected?._layout_isSvg ? StrCast(selected[DocData].fillColor) : ActiveFillColor() ?? "transparent"),
+            checkResult: () => (selected?._layout_isSvg ? StrCast(selected[DocData].fillColor) : ActiveInkFillColor() ?? "transparent"),
             setInk: (doc: Doc) => { doc[DocData].fillColor = StrCast(value); },
-            setMode: () => SetActiveFillColor(StrCast(value)),
+            setMode: () => SetActiveInkFillColor(StrCast(value)),
         }],
         [ 'strokeWidth', {
             checkResult: () => (selected?._layout_isSvg ? NumCast(selected[DocData].stroke_width) : ActiveInkWidth()),
             setInk: (doc: Doc) => { doc[DocData].stroke_width = NumCast(value); },
-            setMode: () => { SetActiveInkWidth(value.toString()); selected?.type === DocumentType.INK && setActiveTool( GestureOverlay.Instance.InkShape ?? InkTool.Pen, true, false);},
+            setMode: () => SetActiveInkWidth(value.toString()),
         }],
         ['strokeColor', {
             checkResult: () => (selected?._layout_isSvg? StrCast(selected[DocData].color) : ActiveInkColor()),
             setInk: (doc: Doc) => { doc[DocData].color = String(value); },
-            setMode: () => { SetActiveInkColor(StrCast(value)); selected?.type === DocumentType.INK &&  setActiveTool(GestureOverlay.Instance.InkShape ?? InkTool.Pen, true, false);},
+            setMode: () => SetActiveInkColor(StrCast(value))
         }],
         [ 'eraserWidth', {
             checkResult: () => ActiveEraserWidth() === 0 ? 1 : ActiveEraserWidth(),
             setInk: (doc: Doc) => { },
-            setMode: () => { SetEraserWidth(+value);},
+            setMode: () => SetEraserWidth(+value),
         }]
     ]);
 
diff --git a/src/client/views/newlightbox/ButtonMenu/ButtonMenu.tsx b/src/client/views/newlightbox/ButtonMenu/ButtonMenu.tsx
index 3eb99f47a..8115bafbf 100644
--- a/src/client/views/newlightbox/ButtonMenu/ButtonMenu.tsx
+++ b/src/client/views/newlightbox/ButtonMenu/ButtonMenu.tsx
@@ -1,5 +1,3 @@
-/* eslint-disable jsx-a11y/no-static-element-interactions */
-/* eslint-disable jsx-a11y/click-events-have-key-events */
 import { action } from 'mobx';
 import * as React from 'react';
 import { Doc } from '../../../../fields/Doc';
@@ -35,10 +33,10 @@ export function ButtonMenu() {
             <div
                 className="newLightboxView-penBtn"
                 title="toggle pen annotation"
-                style={{ background: Doc.ActiveTool === InkTool.Pen ? 'white' : undefined }}
+                style={{ background: Doc.ActiveTool === InkTool.Ink ? 'white' : undefined }}
                 onClick={e => {
                     e.stopPropagation();
-                    Doc.ActiveTool = Doc.ActiveTool === InkTool.Pen ? InkTool.None : InkTool.Pen;
+                    Doc.ActiveTool = Doc.ActiveTool === InkTool.Ink ? InkTool.None : InkTool.Ink;
                 }}
             />
             <div
diff --git a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
index d51b1cd3a..a9edc90e7 100644
--- a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
+++ b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
@@ -1,7 +1,8 @@
+import { Colors } from 'browndash-components';
 import { action, makeObservable, observable } from 'mobx';
 import { observer } from 'mobx-react';
 import * as React from 'react';
-import { OmitKeys } from '../../../ClientUtils';
+import { DashColor, OmitKeys } from '../../../ClientUtils';
 import { numberRange } from '../../../Utils';
 import { Doc, DocListCast, Opt } from '../../../fields/Doc';
 import { TransitionTimer } from '../../../fields/DocSymbols';
@@ -296,12 +297,12 @@ export class CollectionFreeFormDocumentView extends DocComponent<CollectionFreeF
                     transition: this.DataTransition(),
                     zIndex: this.ZIndex,
                     display: this.Width ? undefined : 'none',
+                    mixBlendMode: DashColor(StrCast(this.layoutDoc[this.layoutDoc._layout_isSvg ? 'fillColor' : 'backgroundColor'], Colors.WHITE)).alpha() !== 1 ? 'multiply' : undefined,
                 }}>
                 {this.RenderCutoffProvider(this.Document) ? (
                     <div style={{ position: 'absolute', width: this.PanelWidth(), height: this.PanelHeight(), background: 'lightGreen' }} />
                 ) : (
                     <DocumentView
-                        // eslint-disable-next-line react/jsx-props-no-spreading
                         {...OmitKeys(this._props,this.WrapperKeys.map(val => val.lower)).omit} // prettier-ignore
                         Document={this._props.Document}
                         renderDepth={this._props.renderDepth}
diff --git a/src/client/views/nodes/DataVizBox/DataVizBox.tsx b/src/client/views/nodes/DataVizBox/DataVizBox.tsx
index d79a37181..7925410e2 100644
--- a/src/client/views/nodes/DataVizBox/DataVizBox.tsx
+++ b/src/client/views/nodes/DataVizBox/DataVizBox.tsx
@@ -73,7 +73,7 @@ export class DataVizBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         return <div className="dataVizBox-annotationLayer" style={{ height: this._props.PanelHeight(), width: this._props.PanelWidth() }} ref={this._annotationLayer} />;
     }
     marqueeDown = (e: React.PointerEvent) => {
-        if (!e.altKey && e.button === 0 && NumCast(this.Document._freeform_scale, 1) <= NumCast(this.Document.freeform_scaleMin, 1) && this._props.isContentActive() && ![InkTool.Highlighter, InkTool.Pen, InkTool.Write].includes(Doc.ActiveTool)) {
+        if (!e.altKey && e.button === 0 && NumCast(this.Document._freeform_scale, 1) <= NumCast(this.Document.freeform_scaleMin, 1) && this._props.isContentActive() && Doc.ActiveTool !== InkTool.Ink) {
             setupMoveUpEvents(
                 this,
                 e,
@@ -453,7 +453,7 @@ export class DataVizBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     @action
     onPointerDown = (e: React.PointerEvent): void => {
         if ((this.Document._freeform_scale || 1) !== 1) return;
-        if (!e.altKey && e.button === 0 && this._props.isContentActive() && ![InkTool.Highlighter, InkTool.Pen, InkTool.Write].includes(Doc.ActiveTool)) {
+        if (!e.altKey && e.button === 0 && this._props.isContentActive() && Doc.ActiveTool !== InkTool.Ink) {
             this._props.select(false);
             MarqueeAnnotator.clearAnnotations(this._savedAnnotations);
             this._marqueeing = [e.clientX, e.clientY];
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index eb7f333b9..30f9e6363 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -380,7 +380,7 @@ export class DocumentViewInternal extends DocComponent<FieldViewProps & Document
     };
 
     onPointerMove = (e: PointerEvent): void => {
-        if (e.buttons !== 1 || [InkTool.Highlighter, InkTool.Pen, InkTool.Write].includes(Doc.ActiveTool)) return;
+        if (e.buttons !== 1 || Doc.ActiveTool === InkTool.Ink) return;
 
         if (!ClientUtils.isClick(e.clientX, e.clientY, this._downX, this._downY, Date.now())) {
             this.cleanupPointerEvents();
@@ -1560,55 +1560,45 @@ export class DocumentView extends DocComponent<DocumentViewProps>() {
         } else func();
     }
 }
-
-export function ActiveFillColor(): string { 
-    const dv = DocumentView.Selected().lastElement() ?.Document._layout_isSvg ? DocumentView.Selected().lastElement() : undefined;
-    return StrCast(dv?.Document.fillColor, StrCast(ActiveInkPen()?.activeFillColor, "")); 
-} // prettier-ignore
-export function ActiveInkPen(): Doc { return Doc.UserDoc(); } // prettier-ignore
-export function ActiveInkColor(): string { return StrCast(ActiveInkPen()?.activeInkColor, 'black'); } // prettier-ignore
-export function ActiveIsInkMask(): boolean { return BoolCast(ActiveInkPen()?.activeIsInkMask, false); } // prettier-ignore
-export function ActiveInkHideTextLabels(): boolean { return BoolCast(ActiveInkPen().activeInkHideTextLabels, false); } // prettier-ignore
-export function ActiveArrowStart(): string { return StrCast(ActiveInkPen()?.activeArrowStart, ''); } // prettier-ignore
-export function ActiveArrowEnd(): string { return StrCast(ActiveInkPen()?.activeArrowEnd, ''); } // prettier-ignore
-export function ActiveArrowScale(): number { return NumCast(ActiveInkPen()?.activeArrowScale, 1); } // prettier-ignore
-export function ActiveDash(): string { return StrCast(ActiveInkPen()?.activeDash, '0'); } // prettier-ignore
-export function ActiveInkWidth(): number { return Number(ActiveInkPen()?.activeInkWidth); } // prettier-ignore
-export function ActiveInkBezierApprox(): string { return StrCast(ActiveInkPen()?.activeInkBezier); } // prettier-ignore
-export function ActiveEraserWidth(): number { return Number(ActiveInkPen()?.eraserWidth ?? 25); } // prettier-ignore
-
+export function ActiveHideTextLabels(): boolean { return BoolCast(Doc.UserDoc().activeHideTextLabels, false); } // prettier-ignore
+export function ActiveIsInkMask(): boolean { return BoolCast(Doc.UserDoc()?.activeIsInkMask, false); } // prettier-ignore
+export function ActiveEraserWidth(): number { return Number(Doc.UserDoc()?.activeEraserWidth ?? 25); } // prettier-ignore
+
+export function ActiveInkFillColor(): string { return StrCast(Doc.UserDoc()?.[`active${Doc.ActiveInk}Fill`]); } // prettier-ignore
+export function ActiveInkColor(): string { return StrCast(Doc.UserDoc()?.[`active${Doc.ActiveInk}Color`], 'black'); } // prettier-ignore
+export function ActiveInkArrowStart(): string { return StrCast(Doc.UserDoc()?.[`active${Doc.ActiveInk}ArrowStart`], ''); } // prettier-ignore
+export function ActiveInkArrowEnd(): string { return StrCast(Doc.UserDoc()?.[`active${Doc.ActiveInk}ArrowEnd`], ''); } // prettier-ignore
+export function ActiveInkArrowScale(): number { return NumCast(Doc.UserDoc()?.[`active${Doc.ActiveInk}ArrowScale`], 1); } // prettier-ignore
+export function ActiveInkDash(): string { return StrCast(Doc.UserDoc()?.[`active${Doc.ActiveInk}Dash`], '0'); } // prettier-ignore
+export function ActiveInkWidth(): number { return Number(Doc.UserDoc()?.[`active${Doc.ActiveInk}Width`]); } // prettier-ignore
+export function ActiveInkBezierApprox(): string { return StrCast(Doc.UserDoc()[`active${Doc.ActiveInk}Bezier`]); } // prettier-ignore
+
+export function SetActiveIsInkMask(value: boolean) { Doc.UserDoc() && (Doc.UserDoc().activeIsInkMask = value); } // prettier-ignore
+export function SetactiveHideTextLabels(value: boolean) { Doc.UserDoc() && (Doc.UserDoc().activeHideTextLabels = value); } // prettier-ignore
+export function SetEraserWidth(width: number): void { Doc.UserDoc() && (Doc.UserDoc().activeEraserWidth = width); } // prettier-ignore
 export function SetActiveInkWidth(width: string): void {
-    !isNaN(parseInt(width)) && ActiveInkPen() && (ActiveInkPen().activeInkWidth = width);
+    !isNaN(parseInt(width)) && Doc.UserDoc() && (Doc.UserDoc()[`active${Doc.ActiveInk}Width`] = width);
 }
-export function SetActiveBezierApprox(bezier: string): void {
-    ActiveInkPen() && (ActiveInkPen().activeInkBezier = isNaN(parseInt(bezier)) ? '' : bezier);
+export function SetActiveInkBezierApprox(bezier: string): void {
+    Doc.UserDoc() && (Doc.UserDoc()[`active${Doc.ActiveInk}Bezier`] = isNaN(parseInt(bezier)) ? '' : bezier);
 }
 export function SetActiveInkColor(value: string) {
-    ActiveInkPen() && (ActiveInkPen().activeInkColor = value);
-}
-export function SetActiveIsInkMask(value: boolean) {
-    ActiveInkPen() && (ActiveInkPen().activeIsInkMask = value);
-}
-export function SetActiveInkHideTextLabels(value: boolean) {
-    ActiveInkPen() && (ActiveInkPen().activeInkHideTextLabels = value);
-}
-export function SetActiveFillColor(value: string) {
-    ActiveInkPen() && (ActiveInkPen().activeFillColor = value);
+    Doc.UserDoc() && (Doc.UserDoc()[`active${Doc.ActiveInk}Color`] = value);
 }
-export function SetActiveArrowStart(value: string) {
-    ActiveInkPen() && (ActiveInkPen().activeArrowStart = value);
+export function SetActiveInkFillColor(value: string) {
+    Doc.UserDoc() && (Doc.UserDoc()[`active${Doc.ActiveInk}Fill`] = value);
 }
-export function SetActiveArrowEnd(value: string) {
-    ActiveInkPen() && (ActiveInkPen().activeArrowEnd = value);
+export function SetActiveInkArrowStart(value: string) {
+    Doc.UserDoc() && (Doc.UserDoc()[`active${Doc.ActiveInk}ArrowStart`] = value);
 }
-export function SetActiveArrowScale(value: number) {
-    ActiveInkPen() && (ActiveInkPen().activeArrowScale = value);
+export function SetActiveInkArrowEnd(value: string) {
+    Doc.UserDoc() && (Doc.UserDoc()[`active${Doc.ActiveInk}ArrowEnd`] = value);
 }
-export function SetActiveDash(dash: string): void {
-    !isNaN(parseInt(dash)) && ActiveInkPen() && (ActiveInkPen().activeDash = dash);
+export function SetActiveInkArrowScale(value: number) {
+    Doc.UserDoc() && (Doc.UserDoc()[`active${Doc.ActiveInk}ArrowScale`] = value);
 }
-export function SetEraserWidth(width: number): void {
-    ActiveInkPen() && (ActiveInkPen().eraserWidth = width);
+export function SetActiveInkDash(dash: string): void {
+    !isNaN(parseInt(dash)) && Doc.UserDoc() && (Doc.UserDoc()[`active${Doc.ActiveInk}`] = dash);
 }
 
 // eslint-disable-next-line prefer-arrow-callback
diff --git a/src/client/views/nodes/FontIconBox/FontIconBox.scss b/src/client/views/nodes/FontIconBox/FontIconBox.scss
index ab03a2318..2405889cf 100644
--- a/src/client/views/nodes/FontIconBox/FontIconBox.scss
+++ b/src/client/views/nodes/FontIconBox/FontIconBox.scss
@@ -13,6 +13,9 @@
 .fonticonbox {
     margin: auto;
     width: 100%;
+    .formLabel {
+        height: 5px;
+    }
 }
 .menuButton {
     height: 100%;
diff --git a/src/client/views/nodes/FontIconBox/FontIconBox.tsx b/src/client/views/nodes/FontIconBox/FontIconBox.tsx
index b45774a75..8c138c2ee 100644
--- a/src/client/views/nodes/FontIconBox/FontIconBox.tsx
+++ b/src/client/views/nodes/FontIconBox/FontIconBox.tsx
@@ -4,7 +4,7 @@ import { Button, ColorPicker, Dropdown, DropdownType, IconButton, IListItemProps
 import { action, computed, makeObservable, observable } from 'mobx';
 import { observer } from 'mobx-react';
 import * as React from 'react';
-import { ClientUtils, returnFalse, returnTrue, setupMoveUpEvents } from '../../../../ClientUtils';
+import { ClientUtils, DashColor, returnFalse, returnTrue, setupMoveUpEvents } from '../../../../ClientUtils';
 import { Doc, DocListCast, StrListCast } from '../../../../fields/Doc';
 import { BoolCast, DocCast, NumCast, ScriptCast, StrCast } from '../../../../fields/Types';
 import { emptyFunction } from '../../../../Utils';
@@ -21,6 +21,8 @@ import { FieldView, FieldViewProps } from '../FieldView';
 import { OpenWhere } from '../OpenWhere';
 import './FontIconBox.scss';
 import TrailsIcon from './TrailsIcon';
+import { InkTool } from '../../../../fields/InkField';
+import { ScriptField } from '../../../../fields/ScriptField';
 
 export enum ButtonType {
     TextButton = 'textBtn',
@@ -126,7 +128,8 @@ export class FontIconBox extends ViewBoxBaseComponent<ButtonProps>() {
                 background={SnappingManager.userBackgroundColor}
                 numberDropdownType={type}
                 showPlusMinus={false}
-                tooltip={this.label}
+                formLabel={(StrCast(this.Document.title).startsWith(' ') ? '\u00A0' : '') + StrCast(this.Document.title)}
+                tooltip={StrCast(this.Document.toolTip, this.label)}
                 type={Type.PRIM}
                 min={NumCast(this.dataDoc.numBtnMin, 0)}
                 max={NumCast(this.dataDoc.numBtnMax, 100)}
@@ -148,65 +151,80 @@ export class FontIconBox extends ViewBoxBaseComponent<ButtonProps>() {
         return false;
     };
 
+    /**
+     * Displays custom dropdown menu for fonts -- this is a HACK -- fix for generality, don't copy
+     */
+    handleFontDropdown = (script: () => string, buttonList: string[]) => {
+        // text = StrCast((RichTextMenu.Instance?.TextView?.EditorView ? RichTextMenu.Instance : Doc.UserDoc()).fontFamily);
+        return {
+            buttonList,
+            jsx: undefined,
+            selectedVal: script(),
+            getStyle: (val: string) => ({ fontFamily: val }),
+        };
+    };
+    /**
+     * Displays custom dropdown menu for view selection -- this is a HACK -- fix for generality, don't copy
+     */
+    handleViewDropdown = (script: ScriptField, buttonList: string[]) => {
+        const selected = Array.from(script?.script.run({ _readOnly_: true }).result as Doc[]);
+        const noviceList = [CollectionViewType.Freeform, CollectionViewType.Schema, CollectionViewType.Card, CollectionViewType.Carousel3D, CollectionViewType.Carousel, CollectionViewType.Stacking, CollectionViewType.NoteTaking];
+        return selected.length === 1 && selected[0].type === DocumentType.COL
+            ? {
+                  buttonList: buttonList.filter(value => !Doc.noviceMode || !noviceList.length || noviceList.includes(value as CollectionViewType)),
+                  getStyle: undefined,
+                  selectedVal: StrCast(selected[0]._type_collection),
+              }
+            : {
+                  jsx: selected.length ? (
+                      <Popup
+                          icon={<FontAwesomeIcon size="1x" icon={selected.length > 1 ? 'caret-down' : (Doc.toIcon(selected.lastElement()) as IconProp)} />}
+                          text={selected.length === 1 ? ClientUtils.cleanDocumentType(StrCast(selected[0].type) as DocumentType) : selected.length + ' selected'}
+                          type={Type.TERT}
+                          color={SnappingManager.userColor}
+                          background={SnappingManager.userVariantColor}
+                          popup={<SelectedDocView selectedDocs={selected} />}
+                          fillWidth
+                      />
+                  ) : (
+                      <Button
+                          text={`${Doc.ActiveTool === InkTool.None ? 'Text box' : Doc.ActiveInk} defaults`} //
+                          type={Type.TERT}
+                          color={SnappingManager.userColor}
+                          background={SnappingManager.userVariantColor}
+                          fillWidth
+                          inactive
+                      />
+                  ),
+              };
+    };
+
     /**
      * Dropdown list
      */
     @computed get dropdownListButton() {
         const script = ScriptCast(this.Document.script);
-
-        let noviceList: string[] = [];
-        let text: string | undefined;
-        let getStyle: (val: string) => { [key: string]: string } = () => ({});
-        let icon: IconProp = 'caret-down';
-        const isViewDropdown = script?.script.originalScript.startsWith('{ return setView');
-        if (isViewDropdown) {
-            const selected = Array.from(script?.script.run({ _readOnly_: true }).result as Doc[]);
-            // const selected = DocumentView.SelectedDocs();
-            if (selected.lastElement()) {
-                if (StrCast(selected.lastElement().type) === DocumentType.COL) {
-                    text = StrCast(selected.lastElement()._type_collection);
-                } else {
-                    if (selected.length > 1) {
-                        text = selected.length + ' selected';
-                    } else {
-                        text = ClientUtils.cleanDocumentType(StrCast(selected.lastElement().type) as DocumentType, '' as CollectionViewType);
-                        icon = Doc.toIcon(selected.lastElement());
-                    }
-                    return (
-                        <Popup
-                            icon={<FontAwesomeIcon size="1x" icon={icon} />}
-                            text={text}
-                            type={Type.TERT}
-                            color={SnappingManager.userColor}
-                            background={SnappingManager.userVariantColor}
-                            popup={<SelectedDocView selectedDocs={selected} />}
-                            fillWidth
-                        />
-                    );
-                }
-            } else {
-                return <Button text="None Selected" type={Type.TERT} color={SnappingManager.userColor} background={SnappingManager.userVariantColor} fillWidth inactive />;
-            }
-            noviceList = [CollectionViewType.Freeform, CollectionViewType.Schema, CollectionViewType.Card, CollectionViewType.Carousel3D, CollectionViewType.Carousel, CollectionViewType.Stacking, CollectionViewType.NoteTaking];
-        } else {
-            text = script?.script.run({ this: this.Document, value: '', _readOnly_: true }).result as string;
-            // text = StrCast((RichTextMenu.Instance?.TextView?.EditorView ? RichTextMenu.Instance : Doc.UserDoc()).fontFamily);
-            if (this.Document.title === 'Font') getStyle = (val: string) => ({ fontFamily: val }); // bcz: major hack to style the font dropdown items --- needs to become part of the dropdown's metadata
-        }
+        const selectedFunc = () => script?.script.run({ this: this.Document, value: '', _readOnly_: true }).result as string;
+        const { buttonList, selectedVal, getStyle, jsx } = (() => {
+            switch (this.Document.title) {
+                case 'Font':         return this.handleFontDropdown(selectedFunc, this.buttonList);
+                case 'Perspective':  return this.handleViewDropdown(script, this.buttonList);
+                default:             return { buttonList: this.buttonList, selectedVal: selectedFunc(), jsx: undefined, getStyle: undefined };
+            } // prettier-ignore
+        })();
+        if (jsx) return jsx;
 
         // Get items to place into the list
-        const list: IListItemProps[] = this.buttonList
-            .filter(value => !Doc.noviceMode || !noviceList.length || noviceList.includes(value))
-            .map(value => ({
-                text: typeof value === 'string' ? value.charAt(0).toUpperCase() + value.slice(1) : StrCast(DocCast(value)?.title),
-                val: value,
-                style: getStyle(value),
-                // shortcut: '#',
-            }));
+        const list: IListItemProps[] = buttonList.map(value => ({
+            text: typeof value === 'string' ? value.charAt(0).toUpperCase() + value.slice(1) : StrCast(DocCast(value)?.title),
+            val: value,
+            style: getStyle?.(value),
+            // shortcut: '#',
+        }));
 
         return (
             <Dropdown
-                selectedVal={text}
+                selectedVal={selectedVal}
                 setSelectedVal={undoable(value => script.script.run({ this: this.Document, value }), `dropdown select ${this.label}`)}
                 color={SnappingManager.userColor}
                 background={SnappingManager.userVariantColor}
@@ -215,7 +233,7 @@ export class FontIconBox extends ViewBoxBaseComponent<ButtonProps>() {
                 dropdownType={DropdownType.SELECT}
                 onItemDown={this.dropdownItemDown}
                 items={list}
-                tooltip={this.label}
+                tooltip={StrCast(this.Document.toolTip, this.label)}
                 fillWidth
             />
         );
@@ -235,51 +253,53 @@ export class FontIconBox extends ViewBoxBaseComponent<ButtonProps>() {
         const tooltip: string = StrCast(this.Document.toolTip);
 
         return (
-            <ColorPicker
-                setSelectedColor={value => {
-                    if (!this.colorBatch) this.colorBatch = UndoManager.StartBatch(`Set ${tooltip} color`);
-                    this.colorScript?.script.run({ this: this.Document, value: value, _readOnly_: false });
-                }}
-                setFinalColor={value => {
-                    this.colorScript?.script.run({ this: this.Document, value: value, _readOnly_: false });
-                    this.colorBatch?.end();
-                    this.colorBatch = undefined;
-                }}
-                defaultPickerType="Classic"
-                selectedColor={curColor}
-                type={Type.PRIM}
-                color={color}
-                background={SnappingManager.userBackgroundColor}
-                icon={this.Icon(color) ?? undefined}
-                tooltip={tooltip}
-                label={this.label}
-            />
+            <div
+                onPointerDown={e => {
+                    e.stopPropagation();
+                }}>
+                <ColorPicker
+                    setSelectedColor={value => {
+                        if (!this.colorBatch) this.colorBatch = UndoManager.StartBatch(`Set ${tooltip} color`);
+                        this.colorScript?.script.run({ this: this.Document, value: value, _readOnly_: false });
+                    }}
+                    setFinalColor={value => {
+                        this.colorScript?.script.run({ this: this.Document, value: value, _readOnly_: false });
+                        this.colorBatch?.end();
+                        this.colorBatch = undefined;
+                    }}
+                    defaultPickerType="Classic"
+                    selectedColor={curColor}
+                    type={Type.PRIM}
+                    color={color}
+                    background={SnappingManager.userBackgroundColor}
+                    icon={this.Icon(color) ?? undefined}
+                    tooltip={tooltip}
+                    label={this.label}
+                />
+            </div>
         );
     }
     @computed get multiToggleButton() {
-        // Determine the type of toggle button
-        const tooltip: string = StrCast(this.Document.toolTip);
+        const tooltip = StrCast(this.Document.toolTip);
 
         const script = ScriptCast(this.Document.onClick)?.script;
         const toggleStatus = script?.run({ this: this.Document, value: undefined, _readOnly_: true }).result as boolean;
 
-        // Colors
         const color = this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.Color) as string;
-        const background = this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.BackgroundColor) as string;
         const items = DocListCast(this.dataDoc.data);
         const selectedItems = items.filter(itemDoc => ScriptCast(itemDoc.onClick).script.run({ this: itemDoc, value: undefined, _readOnly_: true }).result).map(item => StrCast(item.toolType));
 
         return (
             <MultiToggle
-                tooltip={`Toggle ${tooltip}`}
+                tooltip={`Click to Toggle ${tooltip} or select new option`}
                 type={Type.PRIM}
                 color={color}
-                background={background === SnappingManager.userBackgroundColor ? undefined : background}
+                background={undefined}
                 multiSelect={true}
                 onPointerDown={e => script && !toggleStatus && setupMoveUpEvents(this, e, returnFalse, emptyFunction, () => script.run({ this: this.Document, value: undefined, _readOnly_: false }))}
                 isToggle={false}
                 toggleStatus={toggleStatus}
-                label={this.label}
+                label={selectedItems.length === 1 ? selectedItems[0] : this.label}
                 items={items.map(item => ({
                     icon: <FontAwesomeIcon className={`fontIconBox-icon-${this.type}`} icon={StrCast(item.icon) as IconProp} color={color} />,
                     tooltip: StrCast(item.toolTip),
@@ -292,7 +312,7 @@ export class FontIconBox extends ViewBoxBaseComponent<ButtonProps>() {
                     //   it would be better to pas the 'added' flag to the callback script, but our script generator from currentUserUtils makes it hard to define
                     //   arbitrary parameter variables (but it could be done as a special case or with additional effort when creating the sript)
                     const itemsChanged = items.filter(item => (val instanceof Array ? val.includes(item.toolType as string | number) : item.toolType === val));
-                    itemsChanged.forEach(itemDoc => ScriptCast(itemDoc.onClick).script.run({ this: itemDoc, _added_: added, itemDoc, _readOnly_: false }));
+                    itemsChanged.forEach(itemDoc => ScriptCast(itemDoc.onClick).script.run({ this: itemDoc, _added_: added, value: toggleStatus, itemDoc, _readOnly_: false }));
                 }}
             />
         );
@@ -310,17 +330,19 @@ export class FontIconBox extends ViewBoxBaseComponent<ButtonProps>() {
         const toggleStatus = (script?.script.run({ this: this.Document, value: undefined, _readOnly_: true }).result as boolean) ?? false;
         // Colors
         const color = this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.Color) as string;
-        // const backgroundColor = this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.BackgroundColor);
 
+        // bcz: ink shapes are tri-state - off, one-shot, and on.  Need to update Toggle buttons to allow this and update currentUserUtils to set the tri-state on the Doc
+        // in the meantime, if the button matches a tool type that is not locked, we want to set the background color to something distinct.
+        const inkShapeHack = ((this.Document.toolType && this.Document.toolType === SnappingManager.InkShape) || this.Document.toolType === Doc.ActiveTool) && !SnappingManager.KeepGestureMode;
         return (
             <Toggle
                 tooltip={`Toggle ${tooltip}`}
                 toggleType={ToggleType.BUTTON}
-                type={Type.PRIM}
+                type={inkShapeHack ? Type.TERT : Type.PRIM}
                 toggleStatus={toggleStatus}
                 text={buttonText}
                 color={color}
-                // background={SnappingManager.userBackgroundColor}
+                background={inkShapeHack ? DashColor(SnappingManager.userBackgroundColor).darken(0.05).toString() : undefined}
                 icon={this.Icon(color)!}
                 label={this.label}
                 onPointerDown={e =>
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index 0dfc0ec28..ff879a2ab 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -338,7 +338,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
 
     @computed get nativeSize() {
         TraceMobx();
-        if (this.paths.length && this.paths[0].includes('icon-hi')) return { nativeWidth: NumCast(this.layoutDoc._width), nativeHeight: NumCast(this.layoutDoc._height), nativeOrientation: 0}
+        if (this.paths.length && this.paths[0].includes('icon-hi')) return { nativeWidth: NumCast(this.layoutDoc._width), nativeHeight: NumCast(this.layoutDoc._height), nativeOrientation: 0 };
         const nativeWidth = NumCast(this.dataDoc[this.fieldKey + '_nativeWidth'], NumCast(this.layoutDoc[this.fieldKey + '_nativeWidth'], 500));
         const nativeHeight = NumCast(this.dataDoc[this.fieldKey + '_nativeHeight'], NumCast(this.layoutDoc[this.fieldKey + '_nativeHeight'], 500));
         const nativeOrientation = NumCast(this.dataDoc[this.fieldKey + '_nativeOrientation'], 1);
@@ -465,13 +465,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     marqueeDown = (e: React.PointerEvent) => {
         if (!this.dataDoc[this.fieldKey]) {
             this.chooseImage();
-        } else if (
-            !e.altKey &&
-            e.button === 0 &&
-            NumCast(this.layoutDoc._freeform_scale, 1) <= NumCast(this.dataDoc.freeform_scaleMin, 1) &&
-            this._props.isContentActive() &&
-            ![InkTool.Highlighter, InkTool.Pen, InkTool.Write].includes(Doc.ActiveTool)
-        ) {
+        } else if (!e.altKey && e.button === 0 && NumCast(this.layoutDoc._freeform_scale, 1) <= NumCast(this.dataDoc.freeform_scaleMin, 1) && this._props.isContentActive() && Doc.ActiveTool !== InkTool.Ink) {
             setupMoveUpEvents(
                 this,
                 e,
diff --git a/src/client/views/nodes/VideoBox.tsx b/src/client/views/nodes/VideoBox.tsx
index de51f6447..3bf7de2fe 100644
--- a/src/client/views/nodes/VideoBox.tsx
+++ b/src/client/views/nodes/VideoBox.tsx
@@ -776,7 +776,7 @@ export class VideoBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
 
     // starts marquee selection
     marqueeDown = (e: React.PointerEvent) => {
-        if (!e.altKey && e.button === 0 && NumCast(this.layoutDoc._freeform_scale, 1) === 1 && this._props.isContentActive() && ![InkTool.Highlighter, InkTool.Pen].includes(Doc.ActiveTool)) {
+        if (!e.altKey && e.button === 0 && NumCast(this.layoutDoc._freeform_scale, 1) === 1 && this._props.isContentActive() && Doc.ActiveTool !== InkTool.Ink) {
             setupMoveUpEvents(
                 this,
                 e,
diff --git a/src/client/views/nodes/WebBox.tsx b/src/client/views/nodes/WebBox.tsx
index a5788d02a..9ba4f8ead 100644
--- a/src/client/views/nodes/WebBox.tsx
+++ b/src/client/views/nodes/WebBox.tsx
@@ -44,6 +44,7 @@ import { LinkInfo } from './LinkDocPreview';
 import { OpenWhere } from './OpenWhere';
 import './WebBox.scss';
 
+// eslint-disable-next-line @typescript-eslint/no-require-imports
 const { CreateImage } = require('./WebBoxRenderer');
 
 @observer
@@ -335,7 +336,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 ele = document.createElement('div');
                 ele.append(contents);
             }
-        } catch (e) {
+        } catch {
             /* empty */
         }
         const visibleAnchor = this._getAnchor(this._savedAnnotations, true);
@@ -506,7 +507,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         let href: Opt<string>;
         try {
             href = iframe?.contentWindow?.location.href;
-        } catch (e) {
+        } catch {
             runInAction(() => this._warning++);
             href = undefined;
         }
@@ -713,7 +714,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                     this._webUrl = this._url;
                 }
             }
-        } catch (e) {
+        } catch {
             console.log('WebBox URL error:' + this._url);
         }
         return true;
@@ -805,7 +806,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
             sel.empty(); // Chrome
         else if (sel?.removeAllRanges) sel.removeAllRanges(); // Firefox
         this.marqueeing = [e.clientX, e.clientY];
-        if (!e.altKey && e.button === 0 && this._props.isContentActive() && ![InkTool.Highlighter, InkTool.Pen, InkTool.Write].includes(Doc.ActiveTool)) {
+        if (!e.altKey && e.button === 0 && this._props.isContentActive() && Doc.ActiveTool !== InkTool.Ink) {
             setupMoveUpEvents(
                 this,
                 e,
@@ -855,7 +856,6 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                     })}
                     contentEditable
                     onPointerDown={this.webClipDown}
-                    // eslint-disable-next-line react/no-danger
                     dangerouslySetInnerHTML={{ __html: field.html }}
                 />
             );
@@ -1031,7 +1031,6 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 {this.inlineTextAnnotations
                     .sort((a, b) => NumCast(a.y) - NumCast(b.y))
                     .map(anno => (
-                        // eslint-disable-next-line react/jsx-props-no-spreading
                         <Annotation {...this._props} fieldKey={this.annotationKey} pointerEvents={this.pointerEvents} containerDataDoc={this.dataDoc} annoDoc={anno} key={`${anno[Id]}-annotation`} />
                     ))}
             </div>
@@ -1042,7 +1041,6 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     }
     renderAnnotations = (childFilters: () => string[]) => (
         <CollectionFreeFormView
-            // eslint-disable-next-line react/jsx-props-no-spreading
             {...this._props}
             setContentViewBox={this.setInnerContent}
             NativeWidth={returnZero}
@@ -1217,7 +1215,6 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 <div style={{ position: 'absolute', height: '100%', right: 0, top: 0, width: `calc(100 * ${this.sidebarWidth() / this._props.PanelWidth()}%` }}>
                     <SidebarAnnos
                         ref={this._sidebarRef}
-                        // eslint-disable-next-line react/jsx-props-no-spreading
                         {...this._props}
                         whenChildContentsActiveChanged={this.whenChildContentsActiveChanged}
                         fieldKey={this.fieldKey + '_' + this._urlHash}
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index 659cda9dd..905c69bb8 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -135,10 +135,12 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
 
     @observable _showSidebar = false;
 
-    @computed get fontColor() {  return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontColor) as string; } // prettier-ignore
-    @computed get fontSize()  {  return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontSize) as string; } // prettier-ignore
-    @computed get fontFamily() { return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontFamily) as string; } // prettier-ignore
-    @computed get fontWeight() { return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontWeight) as string;  } // prettier-ignore
+    @computed get fontColor()      { return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontColor) as string; } // prettier-ignore
+    @computed get fontSize()       { return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontSize) as string; } // prettier-ignore
+    @computed get fontFamily()     { return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontFamily) as string; } // prettier-ignore
+    @computed get fontWeight()     { return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontWeight) as string;  } // prettier-ignore
+    @computed get fontStyle()      { return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontStyle) as string;  } // prettier-ignore
+    @computed get fontDecoration() { return this._props.styleProvider?.(this.layoutDoc, this._props, StyleProp.FontDecoration) as string;  } // prettier-ignore
 
     set _recordingDictation(value) {
         !this.dataDoc[`${this.fieldKey}_recordingSource`] && (this.dataDoc.mediaState = value ? mediaState.Recording : undefined);
@@ -2119,6 +2121,8 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
                     fontSize: this.fontSize,
                     fontFamily: this.fontFamily,
                     fontWeight: this.fontWeight,
+                    fontStyle: this.fontStyle,
+                    textDecoration: this.fontDecoration,
                     ...styleFromLayout,
                 }}>
                 <div
diff --git a/src/client/views/nodes/formattedText/RichTextMenu.tsx b/src/client/views/nodes/formattedText/RichTextMenu.tsx
index 33cfbb510..62fbd23ea 100644
--- a/src/client/views/nodes/formattedText/RichTextMenu.tsx
+++ b/src/client/views/nodes/formattedText/RichTextMenu.tsx
@@ -41,7 +41,7 @@ export class RichTextMenu extends AntimodeMenu<AntimodeMenuProps> {
     @observable private collapsed: boolean = false;
     @observable private _noLinkActive: boolean = false;
     @observable private _boldActive: boolean = false;
-    @observable private _italicsActive: boolean = false;
+    @observable private _italicActive: boolean = false;
     @observable private _underlineActive: boolean = false;
     @observable private _strikethroughActive: boolean = false;
     @observable private _subscriptActive: boolean = false;
@@ -89,8 +89,8 @@ export class RichTextMenu extends AntimodeMenu<AntimodeMenuProps> {
     @computed get underline() {
         return this._underlineActive;
     }
-    @computed get italics() {
-        return this._italicsActive;
+    @computed get italic() {
+        return this._italicActive;
     }
     @computed get strikeThrough() {
         return this._strikethroughActive;
@@ -280,7 +280,7 @@ export class RichTextMenu extends AntimodeMenu<AntimodeMenuProps> {
 
         this._noLinkActive = false;
         this._boldActive = false;
-        this._italicsActive = false;
+        this._italicActive = false;
         this._underlineActive = false;
         this._strikethroughActive = false;
         this._subscriptActive = false;
@@ -290,7 +290,7 @@ export class RichTextMenu extends AntimodeMenu<AntimodeMenuProps> {
             switch (mark.name) {
                 case 'noAutoLinkAnchor': this._noLinkActive = true; break;
                 case 'strong':           this._boldActive = true; break;
-                case 'em':               this._italicsActive = true; break;
+                case 'em':               this._italicActive = true; break;
                 case 'underline':        this._underlineActive = true; break;
                 case 'strikethrough':    this._strikethroughActive = true; break;
                 case 'subscript':        this._subscriptActive = true; break;
@@ -352,7 +352,7 @@ export class RichTextMenu extends AntimodeMenu<AntimodeMenuProps> {
         }
     };
 
-    toggleItalics = () => {
+    toggleItalic = () => {
         if (this.view) {
             const mark = this.view.state.schema.mark(this.view.state.schema.marks.em);
             this.setMark(mark, this.view.state, this.view.dispatch, false);
@@ -361,13 +361,10 @@ export class RichTextMenu extends AntimodeMenu<AntimodeMenuProps> {
     };
 
     setFontField = (value: string, fontField: 'fitBox' | 'fontSize' | 'fontFamily' | 'fontColor' | 'fontHighlight') => {
-        if (this.dataDoc) {
-            this.dataDoc[`text_${fontField}`] = value;
-            this.updateMenu(undefined, undefined, undefined, this.dataDoc);
-        } else if (this.TextView && this.view) {
+        if (this.TextView && this.view && fontField !== 'fitBox') {
             const { text, paragraph } = this.view.state.schema.nodes;
             const selNode = this.view.state.selection.$anchor.node();
-            if ((fontField === 'fontSize' && value === '0px') || (this.view.state.selection.from === 1 && this.view.state.selection.empty && [undefined, text, paragraph].includes(selNode?.type))) {
+            if (this.view.state.selection.from === 1 && this.view.state.selection.empty && [undefined, text, paragraph].includes(selNode?.type)) {
                 this.TextView.dataDoc[this.TextView.fieldKey + `_${fontField}`] = value;
                 this.view.focus();
             }
@@ -376,6 +373,9 @@ export class RichTextMenu extends AntimodeMenu<AntimodeMenuProps> {
             const fmark = this.view?.state.schema.marks['pF' + fontField.substring(1)].create(attrs);
             this.setMark(fmark, this.view.state, (tx: Transaction) => this.view!.dispatch(tx.addStoredMark(fmark)), true);
             this.view.focus();
+        } else if (this.dataDoc) {
+            this.dataDoc[`text_${fontField}`] = value;
+            this.updateMenu(undefined, undefined, undefined, this.dataDoc);
         } else {
             Doc.UserDoc()[fontField] = value;
             this.updateMenu(undefined, undefined, undefined, this.dataDoc);
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 358557ad7..920c9ea8b 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -377,7 +377,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         if ((e.button !== 0 || e.altKey) && this._props.isContentActive()) {
             this._setPreviewCursor?.(e.clientX, e.clientY, true, false, this._props.Document);
         }
-        if (!e.altKey && e.button === 0 && this._props.isContentActive() && ![InkTool.Highlighter, InkTool.Pen, InkTool.Write].includes(Doc.ActiveTool)) {
+        if (!e.altKey && e.button === 0 && this._props.isContentActive() && Doc.ActiveTool !== InkTool.Ink) {
             this._props.select(false);
             MarqueeAnnotator.clearAnnotations(this._savedAnnotations);
             this.isAnnotating = true;
diff --git a/src/client/views/smartdraw/SmartDrawHandler.tsx b/src/client/views/smartdraw/SmartDrawHandler.tsx
index b4635673c..d0f6566a5 100644
--- a/src/client/views/smartdraw/SmartDrawHandler.tsx
+++ b/src/client/views/smartdraw/SmartDrawHandler.tsx
@@ -21,7 +21,7 @@ import { SVGToBezier, SVGType } from '../../util/bezierFit';
 import { InkingStroke } from '../InkingStroke';
 import { ObservableReactComponent } from '../ObservableReactComponent';
 import { MarqueeView } from '../collections/collectionFreeForm';
-import { ActiveArrowEnd, ActiveArrowStart, ActiveDash, ActiveFillColor, ActiveInkBezierApprox, ActiveInkColor, ActiveInkWidth, ActiveIsInkMask, DocumentView } from '../nodes/DocumentView';
+import { ActiveInkArrowEnd, ActiveInkArrowStart, ActiveInkDash, ActiveInkFillColor, ActiveInkBezierApprox, ActiveInkColor, ActiveInkWidth, ActiveIsInkMask, DocumentView } from '../nodes/DocumentView';
 import './SmartDrawHandler.scss';
 
 export interface DrawingOptions {
@@ -105,14 +105,14 @@ export class SmartDrawHandler extends ObservableReactComponent<object> {
                         y: bounds.top - inkWidth / 2,
                         _width: bounds.width + inkWidth,
                         _height: bounds.height + inkWidth,
-                        stroke_showLabel: BoolCast(Doc.UserDoc().activeInkHideTextLabels)}, // prettier-ignore
+                        stroke_showLabel: !BoolCast(Doc.UserDoc().activeHideTextLabels)}, // prettier-ignore
                 inkWidth,
                 opts.autoColor ? stroke[1] : ActiveInkColor(),
                 ActiveInkBezierApprox(),
-                stroke[2] === 'none' ? ActiveFillColor() : stroke[2],
-                ActiveArrowStart(),
-                ActiveArrowEnd(),
-                ActiveDash(),
+                stroke[2] === 'none' ? ActiveInkFillColor() : stroke[2],
+                ActiveInkArrowStart(),
+                ActiveInkArrowEnd(),
+                ActiveInkDash(),
                 ActiveIsInkMask()
             );
             drawing.push(inkDoc);
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index 6ec195910..aef7bf330 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -14,7 +14,7 @@ import {
     Initializing, Self, SelfProxy, TransitionTimer, UpdatingFromServer, Width
 } from './DocSymbols'; // prettier-ignore
 import { Copy, FieldChanged, HandleUpdate, Id, Parent, ToJavascriptString, ToScriptString, ToString } from './FieldSymbols';
-import { InkTool } from './InkField';
+import { InkEraserTool, InkInkTool, InkTool } from './InkField';
 import { List } from './List';
 import { ObjectField, serverOpType } from './ObjectField';
 import { PrefetchProxy, ProxyField } from './Proxy';
@@ -253,6 +253,10 @@ export class Doc extends RefField {
     public static set ActivePage(val)         { Doc.UserDoc().activePage = val; } // prettier-ignore
     public static get ActiveTool(): InkTool   { return StrCast(Doc.UserDoc().activeTool, InkTool.None) as InkTool;  } // prettier-ignore
     public static set ActiveTool(tool:InkTool){ Doc.UserDoc().activeTool = tool; } // prettier-ignore
+    public static get ActiveInk(): InkInkTool { return StrCast(Doc.UserDoc().activeInkTool, InkTool.None) as InkInkTool;  } // prettier-ignore
+    public static set ActiveInk(tool:InkInkTool){ Doc.UserDoc().activeInkTool = tool; } // prettier-ignore
+    public static get ActiveEraser(): InkEraserTool { return StrCast(Doc.UserDoc().activeEraserTool, InkTool.None) as InkEraserTool;  } // prettier-ignore
+    public static set ActiveEraser(tool:InkEraserTool){ Doc.UserDoc().activeEraserTool = tool; } // prettier-ignore
     public static get ActivePresentation()    { return DocCast(Doc.ActiveDashboard?.activePresentation) as Opt<Doc>;  } // prettier-ignore
     public static set ActivePresentation(val) { Doc.ActiveDashboard && (Doc.ActiveDashboard.activePresentation = val) } // prettier-ignore
     public static get ActiveDashboard()       { return DocCast(Doc.UserDoc().activeDashboard); } // prettier-ignore
diff --git a/src/fields/InkField.ts b/src/fields/InkField.ts
index 17b99b033..f3ff5f11f 100644
--- a/src/fields/InkField.ts
+++ b/src/fields/InkField.ts
@@ -8,17 +8,22 @@ import { ObjectField } from './ObjectField';
 
 // Helps keep track of the current ink tool in use.
 export enum InkTool {
-    None = 'none',
-    Pen = 'pen',
-    Highlighter = 'highlighter',
-    StrokeEraser = 'strokeeraser',
-    SegmentEraser = 'segmenteraser',
-    RadiusEraser = 'radiuseraser',
-    Eraser = 'eraser', // not a real tool, but a class of tools
-    Stamp = 'stamp',
-    Write = 'write',
-    PresentationPin = 'presentationpin',
-    SmartDraw = 'smartdraw',
+    None = 'None',
+    Ink = 'Ink',
+    Eraser = 'Eraser', // not a real tool, but a class of tools
+    SmartDraw = 'Smartdraw',
+}
+
+export enum InkInkTool {
+    Pen = 'Pen',
+    Highlight = 'Highlight',
+    Write = 'Write',
+}
+
+export enum InkEraserTool {
+    Stroke = 'Stroke',
+    Segment = 'Segment',
+    Radius = 'Radius',
 }
 
 export type Segment = Array<Bezier>;
diff --git a/src/pen-gestures/GestureTypes.ts b/src/pen-gestures/GestureTypes.ts
index 5a8e9bd97..10f9ba6d0 100644
--- a/src/pen-gestures/GestureTypes.ts
+++ b/src/pen-gestures/GestureTypes.ts
@@ -8,7 +8,6 @@ export enum Gestures {
     Arrow = 'arrow',
     RightAngle = 'rightangle',
 }
-
 // Defines a point in an ink as a pair of x- and y-coordinates.
 export interface PointData {
     X: number;
-- 
cgit v1.2.3-70-g09d2


From 6f8bb6d69d9e671aa6dc4b076f913a63fa73f9f2 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Mon, 6 Jan 2025 15:16:28 -0500
Subject: pdf fixes for latest version of PDFjs.

---
 src/client/views/nodes/PDFBox.tsx   |  4 ++--
 src/client/views/nodes/WebBox.tsx   |  5 +++--
 src/client/views/pdf/PDFViewer.scss | 12 ++++++++++++
 src/client/views/pdf/PDFViewer.tsx  | 11 +++++++----
 4 files changed, 24 insertions(+), 8 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/nodes/PDFBox.tsx b/src/client/views/nodes/PDFBox.tsx
index 2e4c87d38..37807e818 100644
--- a/src/client/views/nodes/PDFBox.tsx
+++ b/src/client/views/nodes/PDFBox.tsx
@@ -267,8 +267,8 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     @action
     loaded = (nw: number, nh: number, np: number) => {
         this.dataDoc[this._props.fieldKey + '_numPages'] = np;
-        Doc.SetNativeWidth(this.dataDoc, Math.max(Doc.NativeWidth(this.dataDoc), (nw * 96) / 72));
-        Doc.SetNativeHeight(this.dataDoc, (nh * 96) / 72);
+        Doc.SetNativeWidth(this.dataDoc, Math.max(Doc.NativeWidth(this.dataDoc), nw * Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS));
+        Doc.SetNativeHeight(this.dataDoc, nh * Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS);
         this.layoutDoc._height = NumCast(this.layoutDoc._width) / (Doc.NativeAspect(this.dataDoc) || 1);
         !this.Document._layout_fitWidth && (this.Document._height = NumCast(this.Document._width) * (nh / nw));
     };
diff --git a/src/client/views/nodes/WebBox.tsx b/src/client/views/nodes/WebBox.tsx
index 9ba4f8ead..ffeb574e9 100644
--- a/src/client/views/nodes/WebBox.tsx
+++ b/src/client/views/nodes/WebBox.tsx
@@ -202,8 +202,9 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
             () => this.layoutDoc._layout_autoHeight,
             layoutAutoHeight => {
                 if (layoutAutoHeight) {
-                    this.layoutDoc._nativeHeight = NumCast(this.Document[this._props.fieldKey + '_nativeHeight']);
-                    this._props.setHeight?.(NumCast(this.Document[this._props.fieldKey + '_nativeHeight']) * (this._props.NativeDimScaling?.() || 1));
+                    const nh = NumCast(this.Document[this._props.fieldKey + '_nativeHeight'], NumCast(this.Document.nativeHeight));
+                    this.layoutDoc._nativeHeight = nh;
+                    this._props.setHeight?.(nh * (this._props.NativeDimScaling?.() || 1));
                 }
             }
         );
diff --git a/src/client/views/pdf/PDFViewer.scss b/src/client/views/pdf/PDFViewer.scss
index a225c4b59..030251762 100644
--- a/src/client/views/pdf/PDFViewer.scss
+++ b/src/client/views/pdf/PDFViewer.scss
@@ -7,6 +7,10 @@
     left: 0;
 }
 
+:root {
+    --devicePixelRatio: 1; // the actual value of this will be set in PDFViewer.tsx;
+}
+
 .pdfViewerDash,
 .pdfViewerDash-interactive {
     position: absolute;
@@ -19,9 +23,16 @@
     overflow-x: hidden;
     transform-origin: top left;
 
+    .annotationLayer {
+        transform: scale(var(--devicePixelRatio));
+    }
     .textLayer {
         opacity: unset;
         mix-blend-mode: multiply; // bcz: makes text fuzzy!
+        transform: scale(var(--devicePixelRatio));
+    }
+    [data-main-rotation='90'] {
+        transform: scale(var(--devicePixelRatio)) rotate(90deg) translateY(-100%);
     }
     .textLayer ::selection {
         background: #accef76a;
@@ -39,6 +50,7 @@
     .page {
         position: relative;
         border: unset;
+        height: 100% !important;
     }
 
     .pdfViewerDash-text-selected {
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 920c9ea8b..5594254b3 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -152,17 +152,20 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
     initialLoad = async () => {
         if (this._pageSizes.length === 0) {
             this._pageSizes = Array<{ width: number; height: number }>(this._props.pdf.numPages);
+            const devicePixelRatio = window.devicePixelRatio;
+            document.documentElement?.style.setProperty('--devicePixelRatio', devicePixelRatio.toString()); // set so that css can use this to adjust various PDFJs divs
             await Promise.all(
                 this._pageSizes.map((val, i) =>
                     this._props.pdf.getPage(i + 1).then(
                         action((page: Pdfjs.PDFPageProxy) => {
                             const page0or180 = page.rotate === 0 || page.rotate === 180;
                             this._pageSizes.splice(i, 1, {
-                                width: page.view[page0or180 ? 2 : 3] - page.view[page0or180 ? 0 : 1],
-                                height: page.view[page0or180 ? 3 : 2] - page.view[page0or180 ? 1 : 0],
+                                width: page.view[page0or180 ? 2 : 3] * devicePixelRatio - page.view[page0or180 ? 0 : 1] * devicePixelRatio,
+                                height: page.view[page0or180 ? 3 : 2] * devicePixelRatio - page.view[page0or180 ? 1 : 0] * devicePixelRatio,
                             });
                             if (i === this._props.pdf.numPages - 1) {
-                                this._props.loaded?.(page.view[page0or180 ? 2 : 3] - page.view[page0or180 ? 0 : 1], page.view[page0or180 ? 3 : 2] - page.view[page0or180 ? 1 : 0], this._props.pdf.numPages);
+                                const lastPage = this._pageSizes.lastElement();
+                                this._props.loaded?.(lastPage.width, lastPage.height, this._props.pdf.numPages);
                             }
                         })
                     )
@@ -170,7 +173,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
             );
         }
         runInAction(() => {
-            this._scrollHeight = (this._pageSizes.reduce((size, page) => size + page.height, 0) * 96) / 72;
+            this._scrollHeight = this._pageSizes.reduce((size, page) => size + page.height, 0) * Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS;
         });
     };
 
-- 
cgit v1.2.3-70-g09d2


From 68af8fffb3111870dd84d4280fdd73b05832dfd2 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Mon, 6 Jan 2025 15:59:25 -0500
Subject: more pdf tweaks

---
 src/client/views/nodes/PDFBox.tsx  | 14 +++++-----
 src/client/views/pdf/PDFViewer.tsx | 52 ++++++++++++++++++--------------------
 2 files changed, 32 insertions(+), 34 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/nodes/PDFBox.tsx b/src/client/views/nodes/PDFBox.tsx
index 37807e818..1de4d2512 100644
--- a/src/client/views/nodes/PDFBox.tsx
+++ b/src/client/views/nodes/PDFBox.tsx
@@ -267,8 +267,8 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     @action
     loaded = (nw: number, nh: number, np: number) => {
         this.dataDoc[this._props.fieldKey + '_numPages'] = np;
-        Doc.SetNativeWidth(this.dataDoc, Math.max(Doc.NativeWidth(this.dataDoc), nw * Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS));
-        Doc.SetNativeHeight(this.dataDoc, nh * Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS);
+        Doc.SetNativeWidth(this.dataDoc, Math.max(Doc.NativeWidth(this.dataDoc), nw));
+        Doc.SetNativeHeight(this.dataDoc, nh);
         this.layoutDoc._height = NumCast(this.layoutDoc._width) / (Doc.NativeAspect(this.dataDoc) || 1);
         !this.Document._layout_fitWidth && (this.Document._height = NumCast(this.Document._width) * (nh / nw));
     };
@@ -584,7 +584,9 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     @computed get renderPdfView() {
         TraceMobx();
         const previewScale = this._previewNativeWidth ? 1 - this.sidebarWidth() / this._previewNativeWidth : 1;
-        const scale = previewScale * (this._props.NativeDimScaling?.() || 1);
+        // PDFjs scales page renderings to be the render container size times the ratio of CSS/print pixels.
+        // So we have to scale the render container down by this ratio, so that the renderings will match the size of the container
+        const viewScale = (previewScale * (this._props.NativeDimScaling?.() || 1)) / Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS;
         return !this._pdf ? null : (
             <div
                 className="pdfBox"
@@ -595,9 +597,9 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 <div className="pdfBox-background" onPointerDown={e => this.sidebarBtnDown(e, false)} />
                 <div
                     style={{
-                        width: `calc(${100 / scale}% - ${(this.sidebarWidth() / scale) * (this._previewWidth ? scale : 1)}px)`,
-                        height: `${100 / scale}%`,
-                        transform: `scale(${scale})`,
+                        width: `calc(${100 / viewScale}% - ${(this.sidebarWidth() / viewScale) * (this._previewWidth ? viewScale : 1)}px)`,
+                        height: `${100 / viewScale}%`,
+                        transform: `scale(${viewScale})`,
                         position: 'absolute',
                         transformOrigin: 'top left',
                         top: 0,
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 5594254b3..722492e8d 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -11,7 +11,7 @@ import { Id } from '../../../fields/FieldSymbols';
 import { InkTool } from '../../../fields/InkField';
 import { Cast, NumCast, StrCast } from '../../../fields/Types';
 import { TraceMobx } from '../../../fields/util';
-import { emptyFunction } from '../../../Utils';
+import { emptyFunction, numberRange } from '../../../Utils';
 import { DocUtils } from '../../documents/DocUtils';
 import { SnappingManager } from '../../util/SnappingManager';
 import { MarqueeOptionsMenu } from '../collections/collectionFreeForm';
@@ -146,35 +146,33 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         }
     };
 
-    @observable _scrollHeight = 0;
+    @computed get _scrollHeight() {
+        return this._pageSizes.reduce((size, page) => size + page.height, 0) * Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS;
+    }
 
-    @action
-    initialLoad = async () => {
+    initialLoad = () => {
         if (this._pageSizes.length === 0) {
-            this._pageSizes = Array<{ width: number; height: number }>(this._props.pdf.numPages);
             const devicePixelRatio = window.devicePixelRatio;
-            document.documentElement?.style.setProperty('--devicePixelRatio', devicePixelRatio.toString()); // set so that css can use this to adjust various PDFJs divs
-            await Promise.all(
-                this._pageSizes.map((val, i) =>
-                    this._props.pdf.getPage(i + 1).then(
-                        action((page: Pdfjs.PDFPageProxy) => {
-                            const page0or180 = page.rotate === 0 || page.rotate === 180;
-                            this._pageSizes.splice(i, 1, {
-                                width: page.view[page0or180 ? 2 : 3] * devicePixelRatio - page.view[page0or180 ? 0 : 1] * devicePixelRatio,
-                                height: page.view[page0or180 ? 3 : 2] * devicePixelRatio - page.view[page0or180 ? 1 : 0] * devicePixelRatio,
-                            });
-                            if (i === this._props.pdf.numPages - 1) {
-                                const lastPage = this._pageSizes.lastElement();
-                                this._props.loaded?.(lastPage.width, lastPage.height, this._props.pdf.numPages);
-                            }
-                        })
-                    )
+            document.documentElement?.style.setProperty('--devicePixelRatio', window.devicePixelRatio.toString()); // set so that css can use this to adjust various PDFJs divs
+            Promise.all(
+                numberRange(this._props.pdf.numPages).map(i =>
+                    this._props.pdf.getPage(i + 1).then(page => {
+                        const page0or180 = page.rotate === 0 || page.rotate === 180;
+                        return {
+                            width: page.view[page0or180 ? 2 : 3] * devicePixelRatio - page.view[page0or180 ? 0 : 1] * devicePixelRatio,
+                            height: page.view[page0or180 ? 3 : 2] * devicePixelRatio - page.view[page0or180 ? 1 : 0] * devicePixelRatio,
+                        };
+                    })
                 )
+            ).then(
+                action(pages => {
+                    this._pageSizes = pages;
+                    const lastPage = pages.lastElement();
+                    this._props.loaded?.(lastPage.width, lastPage.height, this._props.pdf.numPages);
+                    this.createPdfViewer();
+                })
             );
         }
-        runInAction(() => {
-            this._scrollHeight = this._pageSizes.reduce((size, page) => size + page.height, 0) * Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS;
-        });
     };
 
     _scrollStopper: undefined | (() => void);
@@ -200,14 +198,12 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
     crop = (region: Doc | undefined, addCrop?: boolean) => this._props.crop(region, addCrop);
 
     @action
-    setupPdfJsViewer = async () => {
+    setupPdfJsViewer = () => {
         if (this._viewerIsSetup) return;
         this._viewerIsSetup = true;
         this._showWaiting = true;
         this._props.setPdfViewer(this);
-        await this.initialLoad();
-
-        this.createPdfViewer();
+        this.initialLoad();
     };
 
     pagesinit = () => {
-- 
cgit v1.2.3-70-g09d2


From 93ee735e435de5949a0eec54c07537c4de2eedf4 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 7 Jan 2025 01:24:55 -0500
Subject: fixed pdfs/marqueeAnnotator so that you can add rectangle
 annotations.

---
 src/client/views/MarqueeAnnotator.tsx            |  5 ++--
 src/client/views/nodes/DataVizBox/DataVizBox.tsx |  1 +
 src/client/views/nodes/ImageBox.tsx              |  6 ++---
 src/client/views/nodes/PDFBox.scss               | 11 ++++++++
 src/client/views/nodes/PDFBox.tsx                | 34 +++++++++++-------------
 src/client/views/nodes/VideoBox.tsx              |  1 +
 src/client/views/nodes/WebBox.tsx                |  1 +
 src/client/views/pdf/PDFViewer.tsx               | 25 +++++++++--------
 8 files changed, 48 insertions(+), 36 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/MarqueeAnnotator.tsx b/src/client/views/MarqueeAnnotator.tsx
index fa1123a2d..02516264c 100644
--- a/src/client/views/MarqueeAnnotator.tsx
+++ b/src/client/views/MarqueeAnnotator.tsx
@@ -15,18 +15,19 @@ import './MarqueeAnnotator.scss';
 import { DocumentView } from './nodes/DocumentView';
 import { ObservableReactComponent } from './ObservableReactComponent';
 import { AnchorMenu } from './pdf/AnchorMenu';
+import { Transform } from '../util/Transform';
 
 export interface MarqueeAnnotatorProps {
     Document: Doc;
     down?: number[];
     scrollTop: number;
-    isNativeScaled?: boolean;
     scaling?: () => number;
     annotationLayerScaling?: () => number;
     annotationLayerScrollTop: number;
     containerOffset?: () => number[];
     marqueeContainer: HTMLDivElement;
     docView: () => DocumentView;
+    screenTransform: () => Transform;
     savedAnnotations: () => ObservableMap<number, (HTMLDivElement & { marqueeing?: boolean })[]>;
     selectionText: () => string;
     annotationLayer: HTMLDivElement;
@@ -157,7 +158,7 @@ export class MarqueeAnnotator extends ObservableReactComponent<MarqueeAnnotatorP
     //    4) reattach the vector to the center of the bounding box
     getTransformedScreenPt = (down: number[]) => {
         const { marqueeContainer } = this.props;
-        const containerXf = this.props.isNativeScaled ? this.props.docView().screenToContentsTransform() : this.props.docView().screenToViewTransform();
+        const containerXf = this.props.screenTransform();
         const boundingRect = marqueeContainer.getBoundingClientRect();
         const center = { x: boundingRect.x + boundingRect.width / 2, y: boundingRect.y + boundingRect.height / 2 };
         const downVec = Utils.rotPt(down[0] - center.x,  
diff --git a/src/client/views/nodes/DataVizBox/DataVizBox.tsx b/src/client/views/nodes/DataVizBox/DataVizBox.tsx
index 7026c3b01..b874d077b 100644
--- a/src/client/views/nodes/DataVizBox/DataVizBox.tsx
+++ b/src/client/views/nodes/DataVizBox/DataVizBox.tsx
@@ -832,6 +832,7 @@ export class DataVizBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                         annotationLayerScrollTop={NumCast(this.Document._layout_scrollTop)}
                         scaling={returnOne}
                         docView={this.DocumentView}
+                        screenTransform={this.DocumentView().screenToViewTransform}
                         addDocument={this.sidebarAddDocument}
                         finishMarquee={this.finishMarquee}
                         savedAnnotations={this.savedAnnotations}
diff --git a/src/client/views/nodes/ImageBox.tsx b/src/client/views/nodes/ImageBox.tsx
index 423a73f44..de8a9ad21 100644
--- a/src/client/views/nodes/ImageBox.tsx
+++ b/src/client/views/nodes/ImageBox.tsx
@@ -39,7 +39,6 @@ import { FocusViewOptions } from './FocusViewOptions';
 import './ImageBox.scss';
 import { OpenWhere } from './OpenWhere';
 import { Upload } from '../../../server/SharedMediaTypes';
-import { ImageUtils } from '../../util/Import & Export/ImageUtils';
 
 export class ImageEditorData {
     // eslint-disable-next-line no-use-before-define
@@ -268,7 +267,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         const anchy = NumCast(cropping.y);
         const anchw = NumCast(cropping._width);
         const anchh = NumCast(cropping._height);
-        const viewScale = NumCast(this.dataDoc[this.fieldKey + '_nativeWidth']) / anchw;
+        const viewScale = NumCast(this.dataDoc[this.fieldKey + '_nativeHeight']) / anchh;
         cropping.title = 'crop: ' + this.Document.title;
         cropping.x = NumCast(this.Document.x) + NumCast(this.layoutDoc._width);
         cropping.y = NumCast(this.Document.y);
@@ -286,9 +285,9 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         croppingProto.data_nativeWidth = anchw;
         croppingProto.data_nativeHeight = anchh;
         croppingProto.freeform_scale = viewScale;
-        croppingProto.freeform_scale_min = viewScale;
         croppingProto.freeform_panX = anchx / viewScale;
         croppingProto.freeform_panY = anchy / viewScale;
+        croppingProto.freeform_scale_min = viewScale;
         croppingProto.freeform_panX_min = anchx / viewScale;
         croppingProto.freeform_panX_max = anchw / viewScale;
         croppingProto.freeform_panY_min = anchy / viewScale;
@@ -593,6 +592,7 @@ export class ImageBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                         annotationLayerScrollTop={0}
                         scaling={returnOne}
                         annotationLayerScaling={this._props.NativeDimScaling}
+                        screenTransform={this.DocumentView().screenToViewTransform}
                         docView={this.DocumentView}
                         addDocument={this.addDocument}
                         finishMarquee={this.finishMarquee}
diff --git a/src/client/views/nodes/PDFBox.scss b/src/client/views/nodes/PDFBox.scss
index 7bca1230f..f6908d5fd 100644
--- a/src/client/views/nodes/PDFBox.scss
+++ b/src/client/views/nodes/PDFBox.scss
@@ -250,6 +250,17 @@
     cursor: ew-resize;
     background: lightGray;
 }
+.pdfBox-container {
+    position: absolute;
+    transform-origin: top left;
+    top: 0;
+}
+.pdfBox-sidebarContainer {
+    position: absolute;
+    height: 100%;
+    right: 0;
+    top: 0;
+}
 
 .pdfBox-interactive {
     width: 100%;
diff --git a/src/client/views/nodes/PDFBox.tsx b/src/client/views/nodes/PDFBox.tsx
index 1de4d2512..06b75e243 100644
--- a/src/client/views/nodes/PDFBox.tsx
+++ b/src/client/views/nodes/PDFBox.tsx
@@ -1,5 +1,5 @@
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { action, computed, IReactionDisposer, makeObservable, observable, reaction, runInAction } from 'mobx';
+import { action, computed, IReactionDisposer, makeObservable, observable, reaction } from 'mobx';
 import { observer } from 'mobx-react';
 import * as Pdfjs from 'pdfjs-dist';
 import 'pdfjs-dist/web/pdf_viewer.css';
@@ -40,8 +40,11 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     public static LayoutString(fieldKey: string) {
         return FieldView.LayoutString(PDFBox, fieldKey);
     }
+    static pdfcache = new Map<string, Pdfjs.PDFDocumentProxy>();
+    static pdfpromise = new Map<string, Promise<Pdfjs.PDFDocumentProxy>>();
     public static openSidebarWidth = 250;
     public static sidebarResizerWidth = 5;
+
     private _searchString: string = '';
     private _initialScrollTarget: Opt<Doc>;
     private _pdfViewer: PDFViewer | undefined;
@@ -63,11 +66,8 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         const nh = Doc.NativeHeight(this.Document, this.dataDoc) || 1200;
         !this.Document._layout_fitWidth && (this.Document._height = NumCast(this.Document._width) * (nh / nw));
         if (this.pdfUrl) {
-            if (PDFBox.pdfcache.get(this.pdfUrl.url.href))
-                runInAction(() => {
-                    this._pdf = PDFBox.pdfcache.get(this.pdfUrl!.url.href);
-                });
-            else if (PDFBox.pdfpromise.get(this.pdfUrl.url.href))
+            this._pdf = PDFBox.pdfcache.get(this.pdfUrl.url.href);
+            !this._pdf &&
                 PDFBox.pdfpromise.get(this.pdfUrl.url.href)?.then(
                     action(pdf => {
                         this._pdf = pdf;
@@ -265,12 +265,12 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     };
 
     @action
-    loaded = (nw: number, nh: number, np: number) => {
-        this.dataDoc[this._props.fieldKey + '_numPages'] = np;
-        Doc.SetNativeWidth(this.dataDoc, Math.max(Doc.NativeWidth(this.dataDoc), nw));
-        Doc.SetNativeHeight(this.dataDoc, nh);
+    loaded = (p: { width: number; height: number }, pages: number) => {
+        this.dataDoc[this._props.fieldKey + '_numPages'] = pages;
+        Doc.SetNativeWidth(this.dataDoc, Math.max(Doc.NativeWidth(this.dataDoc), p.width));
+        Doc.SetNativeHeight(this.dataDoc, p.height);
         this.layoutDoc._height = NumCast(this.layoutDoc._width) / (Doc.NativeAspect(this.dataDoc) || 1);
-        !this.Document._layout_fitWidth && (this.Document._height = NumCast(this.Document._width) * (nh / nw));
+        !this.Document._layout_fitWidth && (this.Document._height = NumCast(this.Document._width) * (p.height / p.width));
     };
 
     override search = action((searchString: string, bwd?: boolean, clear: boolean = false) => {
@@ -596,13 +596,11 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 }}>
                 <div className="pdfBox-background" onPointerDown={e => this.sidebarBtnDown(e, false)} />
                 <div
+                    className="pdfBox-container"
                     style={{
                         width: `calc(${100 / viewScale}% - ${(this.sidebarWidth() / viewScale) * (this._previewWidth ? viewScale : 1)}px)`,
                         height: `${100 / viewScale}%`,
                         transform: `scale(${viewScale})`,
-                        position: 'absolute',
-                        transformOrigin: 'top left',
-                        top: 0,
                     }}>
                     <PDFViewer
                         {...this._props}
@@ -615,7 +613,7 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                         focus={this.focus}
                         url={this.pdfUrl!.url.pathname}
                         anchorMenuClick={this.anchorMenuClick}
-                        loaded={!Doc.NativeAspect(this.dataDoc) ? this.loaded : undefined}
+                        loaded={Doc.NativeAspect(this.dataDoc) ? emptyFunction : this.loaded}
                         setPdfViewer={this.setPdfViewer}
                         addDocument={this.addDocument}
                         moveDocument={this.moveDocument}
@@ -624,14 +622,14 @@ export class PDFBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                         crop={this.crop}
                     />
                 </div>
-                <div style={{ position: 'absolute', height: '100%', right: 0, top: 0, width: `calc(100 * ${this.sidebarWidth() / this._props.PanelWidth()}%` }}>{this.sidebarCollection}</div>
+                <div className="pdfBox-sidebarContainer" style={{ width: `calc(100 * ${this.sidebarWidth() / this._props.PanelWidth()}%` }}>
+                    {this.sidebarCollection}
+                </div>
                 {this.settingsPanel()}
             </div>
         );
     }
 
-    static pdfcache = new Map<string, Pdfjs.PDFDocumentProxy>();
-    static pdfpromise = new Map<string, Promise<Pdfjs.PDFDocumentProxy>>();
     render() {
         TraceMobx();
         const pdfView = !this._pdf ? null : this.renderPdfView;
diff --git a/src/client/views/nodes/VideoBox.tsx b/src/client/views/nodes/VideoBox.tsx
index 3bf7de2fe..9adee53e8 100644
--- a/src/client/views/nodes/VideoBox.tsx
+++ b/src/client/views/nodes/VideoBox.tsx
@@ -1023,6 +1023,7 @@ export class VideoBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                             scaling={returnOne}
                             annotationLayerScaling={this._props.NativeDimScaling}
                             docView={this.DocumentView}
+                            screenTransform={this.DocumentView().screenToViewTransform}
                             containerOffset={this.marqueeOffset}
                             addDocument={this.addDocWithTimecode}
                             finishMarquee={this.finishMarquee}
diff --git a/src/client/views/nodes/WebBox.tsx b/src/client/views/nodes/WebBox.tsx
index ffeb574e9..6026d9ca7 100644
--- a/src/client/views/nodes/WebBox.tsx
+++ b/src/client/views/nodes/WebBox.tsx
@@ -1196,6 +1196,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                             scaling={this._props.NativeDimScaling}
                             addDocument={this.addDocumentWrapper}
                             docView={this.DocumentView}
+                            screenTransform={this.DocumentView().screenToViewTransform}
                             finishMarquee={this.finishMarquee}
                             savedAnnotations={this.savedAnnotationsCreator}
                             selectionText={this.selectionText}
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 722492e8d..ca7f72811 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -30,6 +30,7 @@ import { GPTPopup } from './GPTPopup/GPTPopup';
 import './PDFViewer.scss';
 import { GPTCallType, gptAPICall } from '../../apis/gpt/GPT';
 import ReactLoading from 'react-loading';
+import { Transform } from '../../util/Transform';
 
 interface IViewerProps extends FieldViewProps {
     pdfBox: PDFBox;
@@ -40,7 +41,7 @@ interface IViewerProps extends FieldViewProps {
     pdf: Pdfjs.PDFDocumentProxy;
     url: string;
     sidebarAddDoc: (doc: Doc | Doc[], sidebarKey?: string | undefined) => boolean;
-    loaded?: (nw: number, nh: number, np: number) => void;
+    loaded: (p: { width: number; height: number }, pages: number) => void;
     // eslint-disable-next-line no-use-before-define
     setPdfViewer: (view: PDFViewer) => void;
     anchorMenuClick?: () => undefined | ((anchor: Doc) => void);
@@ -151,24 +152,21 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
     }
 
     initialLoad = () => {
+        const page0or180 = (page: { rotate: number }) => page.rotate === 0 || page.rotate === 180;
         if (this._pageSizes.length === 0) {
             const devicePixelRatio = window.devicePixelRatio;
             document.documentElement?.style.setProperty('--devicePixelRatio', window.devicePixelRatio.toString()); // set so that css can use this to adjust various PDFJs divs
             Promise.all(
                 numberRange(this._props.pdf.numPages).map(i =>
-                    this._props.pdf.getPage(i + 1).then(page => {
-                        const page0or180 = page.rotate === 0 || page.rotate === 180;
-                        return {
-                            width: page.view[page0or180 ? 2 : 3] * devicePixelRatio - page.view[page0or180 ? 0 : 1] * devicePixelRatio,
-                            height: page.view[page0or180 ? 3 : 2] * devicePixelRatio - page.view[page0or180 ? 1 : 0] * devicePixelRatio,
-                        };
-                    })
+                    this._props.pdf.getPage(i + 1).then(page => ({
+                        width: (page.view[page0or180(page) ? 2 : 3] - page.view[page0or180(page) ? 0 : 1]) * devicePixelRatio,
+                        height: (page.view[page0or180(page) ? 3 : 2] - page.view[page0or180(page) ? 1 : 0]) * devicePixelRatio,
+                    }))
                 )
             ).then(
                 action(pages => {
                     this._pageSizes = pages;
-                    const lastPage = pages.lastElement();
-                    this._props.loaded?.(lastPage.width, lastPage.height, this._props.pdf.numPages);
+                    this._props.loaded(pages.lastElement(), this._props.pdf.numPages);
                     this.createPdfViewer();
                 })
             );
@@ -599,6 +597,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
     }
     savedAnnotations = () => this._savedAnnotations;
     addDocumentWrapper = (doc: Doc | Doc[]) => this._props.addDocument!(doc);
+    screenToMarqueeXf = () => this.props.pdfBox.DocumentView?.()?.screenToContentsTransform().scale(Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS) ?? Transform.Identity();
     render() {
         TraceMobx();
         return (
@@ -618,17 +617,17 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
                     {this.annotationLayer}
                     {this.overlayLayer}
                     {this._showWaiting ? <img alt="" className="pdfViewerDash-waiting" src="/assets/loading.gif" /> : null}
-                    {!this._mainCont.current || !this._annotationLayer.current ? null : (
+                    {!this._mainCont.current || !this._annotationLayer.current || !this.props.pdfBox.DocumentView ? null : (
                         <MarqueeAnnotator
                             ref={this._marqueeref}
                             Document={this._props.Document}
                             getPageFromScroll={this.getPageFromScroll}
                             anchorMenuClick={this._props.anchorMenuClick}
                             scrollTop={0}
-                            isNativeScaled
                             annotationLayerScrollTop={NumCast(this._props.Document._layout_scrollTop)}
                             addDocument={this.addDocumentWrapper}
-                            docView={this._props.pdfBox.DocumentView!}
+                            docView={this.props.pdfBox.DocumentView}
+                            screenTransform={this.screenToMarqueeXf}
                             finishMarquee={this.finishMarquee}
                             savedAnnotations={this.savedAnnotations}
                             selectionText={this.selectionText}
-- 
cgit v1.2.3-70-g09d2


From 4a892c9bc87b798bd96cffec9d90b670f9ee118d Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 7 Jan 2025 02:08:46 -0500
Subject: fixed right-drag selections on PDFs

---
 src/client/views/pdf/PDFViewer.tsx | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index ca7f72811..48df66031 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -551,7 +551,8 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
             className="pdfViewerDash-overlay"
             style={{
                 mixBlendMode,
-                display: display,
+                display,
+                transform: `scale(${Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS})`,
                 pointerEvents: Doc.ActiveTool !== InkTool.None ? 'all' : undefined,
             }}>
             <CollectionFreeFormView
@@ -624,6 +625,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
                             getPageFromScroll={this.getPageFromScroll}
                             anchorMenuClick={this._props.anchorMenuClick}
                             scrollTop={0}
+                            annotationLayerScaling={() => Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS}
                             annotationLayerScrollTop={NumCast(this._props.Document._layout_scrollTop)}
                             addDocument={this.addDocumentWrapper}
                             docView={this.props.pdfBox.DocumentView}
-- 
cgit v1.2.3-70-g09d2


From 9411a0ef68045fc1ab5a3d312709ae47080e8f27 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 7 Jan 2025 02:55:11 -0500
Subject: yet another fix to marquee annotations on PDFs that are scrolled.

---
 src/client/views/pdf/PDFViewer.tsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 48df66031..8728ce99c 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -148,7 +148,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
     };
 
     @computed get _scrollHeight() {
-        return this._pageSizes.reduce((size, page) => size + page.height, 0) * Pdfjs.PixelsPerInch.PDF_TO_CSS_UNITS;
+        return this._pageSizes.reduce((size, page) => size + page.height, 0);
     }
 
     initialLoad = () => {
@@ -530,7 +530,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
     }
 
     getScrollHeight = () => this._scrollHeight;
-    scrollXf = () => this._props.ScreenToLocalTransform().translate(0, this._mainCont.current ? NumCast(this._props.layoutDoc._layout_scrollTop) : 0);
+    scrollXf = () => this._props.ScreenToLocalTransform().translate(0, this._mainCont.current ? NumCast(this._props.layoutDoc._layout_scrollTop) / 1.333 : 0);
     overlayTransform = () => this.scrollXf().scale(1 / NumCast(this._props.layoutDoc._freeform_scale, 1));
     panelWidth = () => this._props.PanelWidth() / (this._props.NativeDimScaling?.() || 1);
     panelHeight = () => this._props.PanelHeight() / (this._props.NativeDimScaling?.() || 1);
-- 
cgit v1.2.3-70-g09d2


From 3f6a168b2916ccac707cf5ea1e4ef898a470d7d1 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Thu, 13 Feb 2025 23:27:42 -0500
Subject: lots of cleanup in GPTpopup.

---
 src/client/apis/gpt/GPT.ts                         |  20 +-
 .../views/collections/CollectionCardDeckView.tsx   |  20 +-
 src/client/views/global/globalScripts.ts           |   5 -
 src/client/views/nodes/DataVizBox/DataVizBox.tsx   |   4 +-
 src/client/views/nodes/WebBox.tsx                  |   4 +-
 .../views/nodes/formattedText/FormattedTextBox.tsx |   6 +-
 src/client/views/pdf/AnchorMenu.tsx                |  17 +-
 src/client/views/pdf/GPTPopup/GPTPopup.scss        |  45 +-
 src/client/views/pdf/GPTPopup/GPTPopup.tsx         | 629 ++++++++-------------
 src/client/views/pdf/PDFViewer.tsx                 |   2 +-
 10 files changed, 285 insertions(+), 467 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/apis/gpt/GPT.ts b/src/client/apis/gpt/GPT.ts
index dc4607b94..066510a6a 100644
--- a/src/client/apis/gpt/GPT.ts
+++ b/src/client/apis/gpt/GPT.ts
@@ -1,6 +1,14 @@
 import { ChatCompletionMessageParam, Image } from 'openai/resources';
 import { openai } from './setup';
 
+export enum GPTTypeStyle {
+    AssignTags = 1,
+    Filter = 2,
+    DocInfo = 3,
+    ChooseDoc = 4,
+    GeneralInfo = 5,
+    SortDocs = 6,
+}
 enum GPTCallType {
     SUMMARY = 'summary',
     COMPLETION = 'completion',
@@ -127,12 +135,12 @@ const callTypeMap: { [type: string]: GPTCallOpts } = {
         temp: 0,
         prompt: `I'm going to provide you with a question. 
                  Based on the question, is the user asking you to 
-                     1. Assigns docs with tags(like star / heart etc)/labels, 
-                     2. Filter docs, 
-                     3. Provide information about a specific doc 
-                     4. Provide a specific doc based on a question/information 
-                     5. Provide general information 
-                     6. Put cards in a specific order. 
+                     ${GPTTypeStyle.AssignTags}. Assigns docs with tags(like star / heart etc)/labels, 
+                     ${GPTTypeStyle.ChooseDoc}. Filter docs, 
+                     ${GPTTypeStyle.DocInfo}. Provide information about a specific doc 
+                     ${GPTTypeStyle.Filter}. Provide a specific doc based on a question/information 
+                     ${GPTTypeStyle.GeneralInfo}. Provide general information 
+                     ${GPTTypeStyle.SortDocs}. Put cards in a specific order. 
                 Answer with only the number for 2-6. For number one, provide the number (1) and the appropriate tag`,
     },
     subset: {
diff --git a/src/client/views/collections/CollectionCardDeckView.tsx b/src/client/views/collections/CollectionCardDeckView.tsx
index 43464e50c..a3ec3884b 100644
--- a/src/client/views/collections/CollectionCardDeckView.tsx
+++ b/src/client/views/collections/CollectionCardDeckView.tsx
@@ -12,7 +12,7 @@ import { List } from '../../../fields/List';
 import { ScriptField } from '../../../fields/ScriptField';
 import { BoolCast, DocCast, NumCast, RTFCast, ScriptCast, StrCast } from '../../../fields/Types';
 import { URLField } from '../../../fields/URLField';
-import { gptImageLabel } from '../../apis/gpt/GPT';
+import { gptImageLabel, GPTTypeStyle } from '../../apis/gpt/GPT';
 import { DocumentType } from '../../documents/DocumentTypes';
 import { Docs } from '../../documents/Documents';
 import { DragManager } from '../../util/DragManager';
@@ -80,7 +80,7 @@ export class CollectionCardView extends CollectionSubView() {
     childPairStringListAndUpdateSortDesc = () =>
         this.childPairStringList().then(sortDesc => {
             GPTPopup.Instance.setSortDesc(sortDesc.join());
-            GPTPopup.Instance.onSortComplete = this.processGptOutput;
+            GPTPopup.Instance.onGptResponse = this.processGptResponse;
             GPTPopup.Instance.onQuizRandom = this.quizMode;
         });
 
@@ -113,7 +113,7 @@ export class CollectionCardView extends CollectionSubView() {
     onGptHide = () => Doc.setDocFilter(this.Document, 'tags', '#chat', 'remove');
     componentWillUnmount() {
         GPTPopup.Instance.setSortDesc('');
-        GPTPopup.Instance.onSortComplete = undefined;
+        GPTPopup.Instance.onGptResponse = undefined;
         GPTPopup.Instance.onQuizRandom = undefined;
         GPTPopup.Instance.setRegenerateCallback(undefined, null);
         Object.keys(this._disposers).forEach(key => this._disposers[key]?.());
@@ -443,18 +443,18 @@ export class CollectionCardView extends CollectionSubView() {
      * @param questionType
      * @param tag
      */
-    processGptOutput = (gptOutput: string, questionType: string, tag?: string) =>
+    processGptResponse = (gptOutput: string, questionType: GPTTypeStyle, tag?: string) =>
         undoable(() => {
             // Split the string into individual list items
             const listItems = gptOutput.split('======').filter(item => item.trim() !== '');
 
-            if (questionType === '2' || questionType === '4') {
+            if (questionType === GPTTypeStyle.Filter || questionType === GPTTypeStyle.ChooseDoc) {
                 this.childDocs.forEach(d => {
                     TagItem.removeTagFromDoc(d, '#chat');
                 });
             }
 
-            if (questionType === '6') {
+            if (questionType === GPTTypeStyle.SortDocs) {
                 this.Document[this._props.fieldKey + '_sort'] = docSortings.Chat;
             }
 
@@ -464,18 +464,18 @@ export class CollectionCardView extends CollectionSubView() {
                 const doc = this._textToDoc.get(normalizedItem);
                 if (doc) {
                     switch (questionType) {
-                        case '6':
+                        case GPTTypeStyle.SortDocs:
                             doc.chatIndex = index;
                             break;
-                        case '1':
+                        case GPTTypeStyle.AssignTags:
                             if (tag) {
                                 const hashTag = tag.startsWith('#') ? tag : '#' + tag[0].toLowerCase() + tag.slice(1);
                                 const filterTag = Doc.MyFilterHotKeys.map(key => StrCast(key.toolType)).find(key => key.includes(tag)) ?? hashTag;
                                 TagItem.addTagToDoc(doc, filterTag);
                             }
                             break;
-                        case '2':
-                        case '4':
+                        case GPTTypeStyle.Filter:
+                        case GPTTypeStyle.ChooseDoc:
                             TagItem.addTagToDoc(doc, '#chat');
                             Doc.setDocFilter(this.Document, 'tags', '#chat', 'check');
                             break;
diff --git a/src/client/views/global/globalScripts.ts b/src/client/views/global/globalScripts.ts
index b44292164..029c4dbc7 100644
--- a/src/client/views/global/globalScripts.ts
+++ b/src/client/views/global/globalScripts.ts
@@ -228,15 +228,10 @@ ScriptingGlobals.add(function showFreeform(
                 if (GPTPopup.Instance.Visible){
                     doc[Doc.LayoutFieldKey(doc)+"_sort"] = '';
                     GPTPopup.Instance.setVisible(false);
-   
                 } else {
                     GPTPopup.Instance.setVisible(true);
                     GPTPopup.Instance.setMode(GPTPopupMode.CARD);
-                    GPTPopup.Instance.setCardsDoneLoading(true);
-
                 }
-                
-
             },
         }],
         ['toggle-tags', {
diff --git a/src/client/views/nodes/DataVizBox/DataVizBox.tsx b/src/client/views/nodes/DataVizBox/DataVizBox.tsx
index b874d077b..fa3ab73a7 100644
--- a/src/client/views/nodes/DataVizBox/DataVizBox.tsx
+++ b/src/client/views/nodes/DataVizBox/DataVizBox.tsx
@@ -489,7 +489,7 @@ export class DataVizBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
         }
 
         // Changing which document to add the annotation to (the currently selected PDF)
-        GPTPopup.Instance.setSidebarId('data_sidebar');
+        GPTPopup.Instance.setSidebarFieldKey('data_sidebar');
         GPTPopup.Instance.addDoc = this.sidebarAddDocument;
     };
 
@@ -523,7 +523,7 @@ export class DataVizBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
     };
 
     askGPT = action(async () => {
-        GPTPopup.Instance.setSidebarId('data_sidebar');
+        GPTPopup.Instance.setSidebarFieldKey('data_sidebar');
         GPTPopup.Instance.addDoc = this.sidebarAddDocument;
         GPTPopup.Instance.createFilteredDoc = this.createFilteredDoc;
         GPTPopup.Instance.setDataJson('');
diff --git a/src/client/views/nodes/WebBox.tsx b/src/client/views/nodes/WebBox.tsx
index 6026d9ca7..e7a10cc29 100644
--- a/src/client/views/nodes/WebBox.tsx
+++ b/src/client/views/nodes/WebBox.tsx
@@ -383,7 +383,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
                 this._textAnnotationCreator = () => this.createTextAnnotation(sel, !sel.isCollapsed ? sel.getRangeAt(0) : undefined);
                 AnchorMenu.Instance.jumpTo(e.clientX * scale + mainContBounds.translateX, e.clientY * scale + mainContBounds.translateY - NumCast(this.layoutDoc._layout_scrollTop) * scale);
                 // Changing which document to add the annotation to (the currently selected WebBox)
-                GPTPopup.Instance.setSidebarId(`${this._props.fieldKey}_${this._urlHash ? this._urlHash + '_' : ''}sidebar`);
+                GPTPopup.Instance.setSidebarFieldKey(`${this._props.fieldKey}_${this._urlHash ? this._urlHash + '_' : ''}sidebar`);
                 GPTPopup.Instance.addDoc = this.sidebarAddDocument;
             }
         } else {
@@ -446,7 +446,7 @@ export class WebBox extends ViewBoxAnnotatableComponent<FieldViewProps>() {
             this._textAnnotationCreator = () => this.createTextAnnotation(sel, selRange);
             (!sel.isCollapsed || this.marqueeing) && AnchorMenu.Instance.jumpTo(e.clientX, e.clientY);
             // Changing which document to add the annotation to (the currently selected WebBox)
-            GPTPopup.Instance.setSidebarId(`${this._props.fieldKey}_${this._urlHash ? this._urlHash + '_' : ''}sidebar`);
+            GPTPopup.Instance.setSidebarFieldKey(`${this._props.fieldKey}_${this._urlHash ? this._urlHash + '_' : ''}sidebar`);
             GPTPopup.Instance.addDoc = this.sidebarAddDocument;
         }
     };
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index eb1f9d07b..17b9bce47 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -135,7 +135,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
 
     /**
      * ApplyingChange - Marks whether an interactive text edit is currently in the process of being written to the database.
-     * This is needed to distinguish changes to text fields caused by editing vs those caused by changes to 
+     * This is needed to distinguish changes to text fields caused by editing vs those caused by changes to
      * the prototype or other external edits
      */
     public ApplyingChange: string = '';
@@ -1043,7 +1043,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
 
     askGPT = action(async () => {
         try {
-            GPTPopup.Instance.setSidebarId(this.sidebarKey);
+            GPTPopup.Instance.setSidebarFieldKey(this.sidebarKey);
             GPTPopup.Instance.addDoc = this.sidebarAddDocument;
             const res = await gptAPICall((this.dataDoc.text as RichTextField)?.Text, GPTCallType.COMPLETION);
             if (!res) {
@@ -1660,7 +1660,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
         }
     };
     onSelectEnd = () => {
-        GPTPopup.Instance.setSidebarId(this.sidebarKey);
+        GPTPopup.Instance.setSidebarFieldKey(this.sidebarKey);
         GPTPopup.Instance.addDoc = this.sidebarAddDocument;
         document.removeEventListener('pointerup', this.onSelectEnd);
     };
diff --git a/src/client/views/pdf/AnchorMenu.tsx b/src/client/views/pdf/AnchorMenu.tsx
index 18da01890..f7070c780 100644
--- a/src/client/views/pdf/AnchorMenu.tsx
+++ b/src/client/views/pdf/AnchorMenu.tsx
@@ -1,5 +1,5 @@
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { ColorPicker, Group, IconButton, Popup, Size, Toggle, ToggleType, Type } from '@dash/components';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { IReactionDisposer, ObservableMap, action, computed, makeObservable, observable, reaction, runInAction } from 'mobx';
 import { observer } from 'mobx-react';
 import * as React from 'react';
@@ -9,16 +9,15 @@ import { ClientUtils, returnFalse, setupMoveUpEvents } from '../../../ClientUtil
 import { emptyFunction, unimplementedFunction } from '../../../Utils';
 import { Doc, Opt } from '../../../fields/Doc';
 import { DocData } from '../../../fields/DocSymbols';
-import { GPTCallType, gptAPICall } from '../../apis/gpt/GPT';
 import { SettingsManager } from '../../util/SettingsManager';
 import { undoBatch } from '../../util/UndoManager';
 import { AntimodeMenu, AntimodeMenuProps } from '../AntimodeMenu';
 import { LinkPopup } from '../linking/LinkPopup';
+import { ComparisonBox } from '../nodes/ComparisonBox';
 import { DocumentView } from '../nodes/DocumentView';
 import { DrawingOptions, SmartDrawHandler } from '../smartdraw/SmartDrawHandler';
 import './AnchorMenu.scss';
-import { GPTPopup, GPTPopupMode } from './GPTPopup/GPTPopup';
-import { ComparisonBox } from '../nodes/ComparisonBox';
+import { GPTPopup } from './GPTPopup/GPTPopup';
 
 @observer
 export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
@@ -98,15 +97,7 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
      * Invokes the API with the selected text and stores it in the summarized text.
      * @param e pointer down event
      */
-    gptSummarize = () => {
-        GPTPopup.Instance.setVisible(true);
-        GPTPopup.Instance.setMode(GPTPopupMode.SUMMARY);
-        GPTPopup.Instance.setLoading(true);
-        gptAPICall(this._selectedText, GPTCallType.SUMMARY)
-            .then(res => GPTPopup.Instance.setText(res || 'Something went wrong.'))
-            .catch(err => console.error(err))
-            .finally(() => GPTPopup.Instance.setLoading(false));
-    };
+    gptSummarize = () => GPTPopup.Instance.generateSummary(this._selectedText);
 
     /*
      * Transfers the flashcard text generated by GPT on flashcards and creates a collection out them.
diff --git a/src/client/views/pdf/GPTPopup/GPTPopup.scss b/src/client/views/pdf/GPTPopup/GPTPopup.scss
index 0247dc10c..9cf318dc0 100644
--- a/src/client/views/pdf/GPTPopup/GPTPopup.scss
+++ b/src/client/views/pdf/GPTPopup/GPTPopup.scss
@@ -5,7 +5,7 @@ $lightgrey: #ececec;
 $button: #5b97ff;
 $highlightedText: #82e0ff;
 
-.summary-box {
+.gptPopup-summary-box {
     position: fixed;
     top: 115px;
     left: 75px;
@@ -35,7 +35,7 @@ $highlightedText: #82e0ff;
         right: 0;
         bottom: 0;
         cursor: se-resize;
-      }
+    }
 
     .summary-heading {
         display: flex;
@@ -63,12 +63,12 @@ $highlightedText: #82e0ff;
         cursor: pointer;
     }
 
-    .content-wrapper {
+    .gptPopup-content-wrapper {
         padding-top: 10px;
         min-height: 50px;
         // max-height: 150px;
         overflow-y: auto;
-        height: 100%
+        height: 100%;
     }
 
     .btns-wrapper-gpt {
@@ -78,7 +78,7 @@ $highlightedText: #82e0ff;
         align-items: center;
         flex-direction: column;
 
-        .inputWrapper{
+        .inputWrapper {
             display: flex;
             justify-content: center;
             align-items: center;
@@ -87,17 +87,15 @@ $highlightedText: #82e0ff;
             bottom: 0;
             width: 100%;
             background-color: white;
-
-
         }
 
-        .searchBox-input{
+        .searchBox-input {
             height: 40px;
             border-radius: 10px;
             position: absolute;
             bottom: 10px;
             border-color: #5b97ff;
-            width: 90%
+            width: 90%;
         }
 
         .chat-wrapper {
@@ -106,52 +104,41 @@ $highlightedText: #82e0ff;
             width: 100%;
             max-height: calc(100vh - 80px);
             overflow-y: auto;
-            padding-bottom: 60px; 
+            padding-bottom: 60px;
         }
-    
+
         .chat-bubbles {
             margin-top: 20px;
             display: flex;
             flex-direction: column;
             flex-grow: 1;
         }
-    
+
         .chat-bubble {
             padding: 10px;
             margin-bottom: 10px;
             border-radius: 10px;
             max-width: 60%;
         }
-    
+
         .user-message {
             background-color: #283d53;
             align-self: flex-end;
             color: whitesmoke;
         }
-    
+
         .chat-message {
             background-color: #367ae7;
             align-self: flex-start;
-            color:whitesmoke;
+            color: whitesmoke;
         }
 
-
-        
-
         .summarizing {
             display: flex;
             align-items: center;
         }
-
-        
-
-        
-
-        
     }
 
-
-
     .text-btn {
         &:hover {
             background-color: $button;
@@ -198,18 +185,12 @@ $highlightedText: #82e0ff;
     color: #666;
 }
 
-
-
-
-
 @keyframes spin {
     to {
         transform: rotate(360deg);
     }
 }
 
-
-
 .image-content-wrapper {
     display: flex;
     flex-direction: column;
diff --git a/src/client/views/pdf/GPTPopup/GPTPopup.tsx b/src/client/views/pdf/GPTPopup/GPTPopup.tsx
index 2d95ac2eb..691c24792 100644
--- a/src/client/views/pdf/GPTPopup/GPTPopup.tsx
+++ b/src/client/views/pdf/GPTPopup/GPTPopup.tsx
@@ -1,6 +1,6 @@
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 import { Button, IconButton, Toggle, ToggleType, Type } from '@dash/components';
-import { action, makeObservable, observable, runInAction } from 'mobx';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { action, makeObservable, observable } from 'mobx';
 import { observer } from 'mobx-react';
 import * as React from 'react';
 import { CgClose, CgCornerUpLeft } from 'react-icons/cg';
@@ -10,7 +10,7 @@ import { ClientUtils } from '../../../../ClientUtils';
 import { Doc } from '../../../../fields/Doc';
 import { NumCast, StrCast } from '../../../../fields/Types';
 import { Networking } from '../../../Network';
-import { GPTCallType, gptAPICall, gptImageCall } from '../../../apis/gpt/GPT';
+import { GPTCallType, GPTTypeStyle, gptAPICall, gptImageCall } from '../../../apis/gpt/GPT';
 import { DocUtils } from '../../../documents/DocUtils';
 import { Docs } from '../../../documents/Documents';
 import { SettingsManager } from '../../../util/SettingsManager';
@@ -19,7 +19,6 @@ import { ObservableReactComponent } from '../../ObservableReactComponent';
 import { DocumentView } from '../../nodes/DocumentView';
 import { AnchorMenu } from '../AnchorMenu';
 import './GPTPopup.scss';
-import { isJSDocProtectedTag } from 'typescript';
 
 export enum GPTPopupMode {
     SUMMARY,
@@ -42,133 +41,79 @@ export enum GPTQuizType {
 export class GPTPopup extends ObservableReactComponent<object> {
     // eslint-disable-next-line no-use-before-define
     static Instance: GPTPopup;
-    private messagesEndRef: React.RefObject<HTMLDivElement>;
-
-    @observable private chatMode: boolean = false;
-    private correlatedColumns: string[] = [];
-
-    @observable public Visible: boolean = false;
-    @action public setVisible = (vis: boolean) => {
-        this.Visible = vis;
-    };
-    @observable public loading: boolean = false;
-    @action public setLoading = (loading: boolean) => {
-        this.loading = loading;
-    };
-    @observable public text: string = '';
-    @action public setText = (text: string) => {
-        this.text = text;
-    };
-    @observable public selectedText: string = '';
-    @action public setSelectedText = (text: string) => {
-        this.selectedText = text;
-    };
-    @observable public dataJson: string = '';
-    public dataChatPrompt: string | undefined = undefined;
-    @action public setDataJson = (text: string) => {
-        if (text === '') this.dataChatPrompt = '';
-        this.dataJson = text;
-    };
-
-    @observable public imgDesc: string = '';
-    @action public setImgDesc = (text: string) => {
-        this.imgDesc = text;
-    };
-
-    @observable public imgUrls: string[][] = [];
-    @action public setImgUrls = (imgs: string[][]) => {
-        this.imgUrls = imgs;
-    };
-
-    @observable public mode: GPTPopupMode = GPTPopupMode.SUMMARY;
-    @action public setMode = (mode: GPTPopupMode) => {
-        this.mode = mode;
-    };
-
-    @observable public highlightRange: number[] = [];
-    @action callSummaryApi = () => {};
-
-    @observable private done: boolean = false;
-    @action public setDone = (done: boolean) => {
-        this.done = done;
-        this.chatMode = false;
-    };
-
-    // change what can be a ref into a ref
-    @observable private sidebarId: string = '';
-    @action public setSidebarId = (id: string) => {
-        this.sidebarId = id;
-    };
-
-    @observable private imgTargetDoc: Doc | undefined;
-    @action public setImgTargetDoc = (anchor: Doc) => {
-        this.imgTargetDoc = anchor;
-    };
-
-    @observable private textAnchor: Doc | undefined;
-    @action public setTextAnchor = (anchor: Doc) => {
-        this.textAnchor = anchor;
+    private _regenerateCallback: (() => Promise<void>) | null = null;
+    private _messagesEndRef: React.RefObject<HTMLDivElement>;
+    private _correlatedColumns: string[] = [];
+    private _dataChatPrompt: string | undefined = undefined;
+    private _imgTargetDoc: Doc | undefined;
+    private _textAnchor: Doc | undefined;
+    private _dataJson: string = '';
+    private _sortDesc: string = '';
+    private _sidebarFieldKey: string = '';
+    private _imgDesc: string = '';
+    private _selectedText: string = '';
+
+    public setImgDesc = (text: string) => (this._imgDesc = text);
+    public setSidebarFieldKey = (id: string) => (this._sidebarFieldKey = id);
+    public setSortDesc = (t: string) => (this._sortDesc = t);
+    public setImgTargetDoc = (anchor: Doc) => (this._imgTargetDoc = anchor);
+    public setTextAnchor = (anchor: Doc) => (this._textAnchor = anchor);
+    public onGptResponse?: (sortResult: string, questionType: GPTTypeStyle, tag?: string) => void;
+    public onQuizRandom?: () => void;
+    public setDataJson = (text: string) => {
+        if (text === '') this._dataChatPrompt = '';
+        this._dataJson = text;
     };
 
-    @observable public sortDesc: string = '';
-    @action public setSortDesc = (t: string) => {
-        this.sortDesc = t;
-    };
-
-    onSortComplete?: (sortResult: string, questionType: string, tag?: string) => void;
-    onQuizRandom?: () => void;
-
-    @observable collectionDoc: Doc | undefined = undefined;
-    @action setCollectionDoc(doc: Doc | undefined) {
-        this.collectionDoc = doc;
-    }
-
-    @observable sortRespText: string = '';
-
-    @action setSortRespText(resp: string) {
-        this.sortRespText = resp;
+    constructor(props: object) {
+        super(props);
+        makeObservable(this);
+        GPTPopup.Instance = this;
+        this._messagesEndRef = React.createRef();
     }
 
-    @observable chatSortPrompt: string = '';
-
-    sortPromptChanged = action((e: React.ChangeEvent<HTMLInputElement>) => {
-        this.chatSortPrompt = e.target.value;
-    });
+    componentDidUpdate = () => this._gptProcessing && this.setStopAnimatingResponse(false);
 
-    @observable quizAnswer: string = '';
-
-    quizAnswerChanged = action((e: React.ChangeEvent<HTMLInputElement>) => {
-        this.quizAnswer = e.target.value;
-    });
-
-    @observable conversationArray: string[] = ['Hi! In this pop up, you can ask ChatGPT questions about your documents and filter / sort them. '];
+    @observable private _conversationArray: string[] = ['Hi! In this pop up, you can ask ChatGPT questions about your documents and filter / sort them. '];
+    @observable private _chatEnabled: boolean = false;
+    @action private setChatEnabled = (start: boolean) => (this._chatEnabled = start);
+    @observable public Visible: boolean = false;
+    @action public setVisible = (vis: boolean) => (this.Visible = vis);
+    @observable private _gptProcessing: boolean = false;
+    @action public setGptProcessing = (loading: boolean) => (this._gptProcessing = loading);
+    @observable private _responseText: string = '';
+    @action public setResponseText = (text: string) => (this._responseText = text);
+    @observable private _imgUrls: string[][] = [];
+    @action public setImgUrls = (imgs: string[][]) => (this._imgUrls = imgs);
+    @observable private _mode: GPTPopupMode = GPTPopupMode.SUMMARY;
+    @action public setMode = (mode: GPTPopupMode) => (this._mode = mode);
+    @observable private _collectionContext: Doc | undefined = undefined;
+    @action setCollectionContext = (doc: Doc | undefined) => (this._collectionContext = doc);
+    @observable private _sortPrompt: string = '';
+    @action setSortPrompt = (e: React.ChangeEvent<HTMLInputElement>) => (this._sortPrompt = e.target.value);
+    @observable private _quizAnswer: string = '';
+    @action setQuizAnswer = (e: React.ChangeEvent<HTMLInputElement>) => (this._quizAnswer = e.target.value);
+    @observable private _stopAnimatingResponse: boolean = false;
+    @action public setStopAnimatingResponse = (done: boolean) => (this._stopAnimatingResponse = done);
 
     /**
-     * When the cards are in quiz mode in the card view, allows gpt to determine whether the user's answer was correct
-     * @returns
+     * Callback function that causes the card view to update the childpair string list
+     * @param callback
      */
-    generateQuiz = (selected: Doc) =>
-        (this.regenerateCallback?.() ?? Promise.resolve()).then(() =>
-            this.generateRubric(selected).then(() =>
-                gptAPICall('Question: ' + StrCast(selected.gptInputText) + ' UserAnswer: ' + this.quizAnswer + '.  Rubric: ' + StrCast(selected.gptRubric), GPTCallType.QUIZ)
-                    .then(res => {
-                        if (res) {
-                            this.setQuizResp(res);
-                            this.conversationArray.push(res);
-                            this.onQuizRandom?.();
-                        } else {
-                            console.error('GPT provided no response');
-                        }
-                    })
-                    .catch(err => console.error('GPT call failed', err))
-            )
-        );
+    public setRegenerateCallback(collectionDoc: Doc | undefined, callback: null | (() => Promise<void>)) {
+        this.setCollectionContext(collectionDoc);
+        this._regenerateCallback = callback;
+    }
+
+    public addDoc: (doc: Doc | Doc[], sidebarKey?: string | undefined) => boolean = () => false;
+    public createFilteredDoc: (axes?: string[]) => boolean = () => false;
+    public addToCollection: ((doc: Doc | Doc[], annotationKey?: string | undefined) => boolean) | undefined;
+    public questionTypeNumberToStyle = (questionType: string) => +questionType.split(' ')[0][0];
 
     /**
-     * Generates a rubric by which to compare the user's answer to
-     * @param inputText user's answer
+     * Generates a rubric for evaluating the user's description of the document's text
      * @param doc the doc the user is providing info about
-     * @returns gpt's response
+     * @returns gpt's response rubric
      */
     generateRubric = (doc: Doc) =>
         StrCast(doc.gptRubric)
@@ -177,148 +122,129 @@ export class GPTPopup extends ObservableReactComponent<object> {
                   .then(res => (doc.gptRubric = res))
                   .catch(err => console.error('GPT call failed', err));
 
-    @observable private regenerateCallback: (() => Promise<void>) | null = null;
-
     /**
-     * Callback function that causes the card view to update the childpair string list
-     * @param callback
+     * When the cards are in quiz mode in the card view, allows gpt to determine whether the user's answer was correct
+     * @param doc the doc the user is providing info about
+     * @param quizAnswer the user's answer/description for the document
+     * @returns
      */
-    @action public setRegenerateCallback(collectionDoc: Doc | undefined, callback: null | (() => Promise<void>)) {
-        this.setCollectionDoc(collectionDoc);
-        this.regenerateCallback = callback;
-    }
-
-    public addDoc: (doc: Doc | Doc[], sidebarKey?: string | undefined) => boolean = () => false;
-    public createFilteredDoc: (axes?: string[]) => boolean = () => false;
-    public addToCollection: ((doc: Doc | Doc[], annotationKey?: string | undefined) => boolean) | undefined;
-
-    @observable quizRespText: string = '';
-
-    @action setQuizResp(resp: string) {
-        this.quizRespText = resp;
-    }
+    generateQuizAnswerAnalysis = (doc: Doc, quizAnswer: string) =>
+        (this._regenerateCallback?.() ?? Promise.resolve()).then(
+            () =>
+            this.generateRubric(doc).then(() =>
+                gptAPICall(
+                    `Question: ${StrCast(doc.gptInputText)}; 
+                     UserAnswer: ${quizAnswer};
+                     Rubric: ${StrCast(doc.gptRubric)}`,
+                    GPTCallType.QUIZ
+                ).then(res => {
+                    this._conversationArray.push(res || 'GPT provided no answer');
+                    this.onQuizRandom?.();
+                })
+                .catch(err => console.error('GPT call failed', err))
+            ) // prettier-ignore
+        );
 
     /**
      * Generates a response to the user's question depending on the type of their question
+     * @param userPrompt the user's input that chat will respond to
      */
-    generateCard = async () => {
-        this.setLoading(true);
-
-        await this.regenerateCallback?.();
-
-        try {
-            const questionType = await gptAPICall(this.chatSortPrompt, GPTCallType.TYPE);
-            const questionNumber = questionType.split(' ')[0][0];
-            const res = await (() => {
-                switch (questionNumber) {
-                    case '1':
-                    case '2':
-                    case '4': return gptAPICall(this.sortDesc, GPTCallType.SUBSET, this.chatSortPrompt);
-                    case '6': return gptAPICall(this.sortDesc, GPTCallType.SORT, this.chatSortPrompt);
-                    default: return gptAPICall(StrCast(DocumentView.SelectedDocs().lastElement()?.gptInputText), GPTCallType.INFO, this.chatSortPrompt);
-                }})(); // prettier-ignore
-
-            // Trigger the callback with the result
-            if (this.onSortComplete) {
-                this.onSortComplete(res || 'Something went wrong :(', questionNumber, questionType.split(' ').slice(1).join(' '));
-
-                let explanation = res;
-
-                if (questionType != '5' && questionType != '3') {
-                    // Extract explanation surrounded by ------ at the top or both at the top and bottom
-                    const explanationMatch = res.match(/------\s*([\s\S]*?)\s*(?:------|$)/) || [];
-                    explanation = explanationMatch[1] ? explanationMatch[1].trim() : 'No explanation found';
-                }
-
-                // Set the extracted explanation to sortRespText
-                this.setSortRespText(explanation);
-                runInAction(() => this.conversationArray.push(this.sortRespText));
-                this.scrollToBottom();
-
-                console.log(res);
-            }
-        } catch (err) {
-            console.error(err);
-        }
-
-        this.setLoading(false);
-    };
+    generateQueryResponse = (userPrompt: string) =>
+        (this._regenerateCallback ?? Promise.resolve)().then(() =>
+            gptAPICall(userPrompt, GPTCallType.TYPE).then(questionType =>
+                (() => {
+                    switch (this.questionTypeNumberToStyle(questionType)) {
+                        case GPTTypeStyle.AssignTags:
+                        case GPTTypeStyle.Filter:
+                        case GPTTypeStyle.ChooseDoc: return gptAPICall(this._sortDesc, GPTCallType.SUBSET, userPrompt);
+                        case GPTTypeStyle.SortDocs:  return gptAPICall(this._sortDesc, GPTCallType.SORT, userPrompt);
+                        default:                     return gptAPICall(StrCast(DocumentView.SelectedDocs().lastElement()?.gptInputText), GPTCallType.INFO, userPrompt);
+                    } // prettier-ignore
+                })().then(
+                    action(res => {
+                        // Trigger the callback with the result
+                        this.onGptResponse?.(res || 'Something went wrong :(', this.questionTypeNumberToStyle(questionType), questionType.split(' ').slice(1).join(' '));
+                        this._conversationArray.push(
+                            ![GPTTypeStyle.GeneralInfo, GPTTypeStyle.DocInfo].includes(this.questionTypeNumberToStyle(questionType))? 
+                            // Extract explanation surrounded by ------ at the top or both at the top and bottom
+                            (res.match(/------\s*([\s\S]*?)\s*(?:------|$)/) ?? [])[1]?.trim() ?? 'No explanation found' : res);
+                    })
+                ).catch(err => console.log(err))
+            ).catch(err => console.log(err))
+        ); // prettier-ignore
 
     /**
      * Generates a Dalle image and uploads it to the server.
      */
-    generateImage = async () => {
-        if (this.imgDesc === '') return undefined;
-        this.setImgUrls([]);
-        this.setMode(GPTPopupMode.IMAGE);
-        this.setVisible(true);
-        this.setLoading(true);
-
-        try {
-            const imageUrls = await gptImageCall(this.imgDesc);
-            if (imageUrls && imageUrls[0]) {
-                const [result] = await Networking.PostToServer('/uploadRemoteImage', { sources: [imageUrls[0]] });
-                const source = ClientUtils.prepend(result.accessPaths.agnostic.client);
-                this.setImgUrls([[imageUrls[0], source]]);
-            }
-        } catch (err) {
-            console.error(err);
+    generateImage = () => {
+        if (this._imgDesc !== '') {
+            this.setImgUrls([]);
+            this.setMode(GPTPopupMode.IMAGE);
+            this.setVisible(true);
+            this.setGptProcessing(true);
+
+            return gptImageCall(this._imgDesc)
+                .then(imageUrls =>
+                    imageUrls?.[0]
+                        ? Networking.PostToServer('/uploadRemoteImage', { sources: [imageUrls[0]] }).then(res => {
+                              const source = ClientUtils.prepend(res[0].accessPaths.agnostic.client);
+                              return this.setImgUrls([[imageUrls[0]!, source]]);
+                          })
+                        : undefined
+                )
+                .catch(err => console.error(err))
+                .finally(() => this.setGptProcessing(false));
         }
-        this.setLoading(false);
         return undefined;
     };
 
     /**
-     * Completes an API call to generate a summary of
-     * this.selectedText in the popup.
+     * Completes an API call to generate a summary of the specified text
+     *
+     * @param text the text to summarizz
      */
-    generateSummary = async () => {
-        GPTPopup.Instance.setVisible(true);
-        GPTPopup.Instance.setMode(GPTPopupMode.SUMMARY);
-        GPTPopup.Instance.setLoading(true);
-
-        try {
-            const res = await gptAPICall(this.selectedText, GPTCallType.SUMMARY);
-            GPTPopup.Instance.setText(res || 'Something went wrong.');
-        } catch (err) {
-            console.error(err);
-        }
-        GPTPopup.Instance.setLoading(false);
+    generateSummary = (text?: string) => {
+        this._selectedText = text ?? this._selectedText;
+        this.setVisible(true);
+        this.setMode(GPTPopupMode.SUMMARY);
+        this.setGptProcessing(true);
+        return gptAPICall(this._selectedText, GPTCallType.SUMMARY)
+            .then(res => this.setResponseText(res || 'Something went wrong.'))
+            .catch(err => console.error(err))
+            .finally(() => this.setGptProcessing(false));
     };
 
     /**
      * Completes an API call to generate an analysis of
      * this.dataJson in the popup.
      */
-    generateDataAnalysis = async () => {
-        GPTPopup.Instance.setVisible(true);
-        GPTPopup.Instance.setLoading(true);
-        try {
-            const res = await gptAPICall(this.dataJson, GPTCallType.DATA, this.dataChatPrompt);
-            const json = JSON.parse(res! as string);
-            const keys = Object.keys(json);
-            this.correlatedColumns = [];
-            this.correlatedColumns.push(json[keys[0]]);
-            this.correlatedColumns.push(json[keys[1]]);
-            GPTPopup.Instance.setText(json[keys[2]] || 'Something went wrong.');
-        } catch (err) {
-            console.error(err);
-        }
-        GPTPopup.Instance.setLoading(false);
+    generateDataAnalysis = () => {
+        this.setVisible(true);
+        this.setGptProcessing(true);
+        return gptAPICall(this._dataJson, GPTCallType.DATA, this._dataChatPrompt)
+            .then(res => {
+                const json = JSON.parse(res! as string);
+                const keys = Object.keys(json);
+                this._correlatedColumns = [];
+                this._correlatedColumns.push(json[keys[0]]);
+                this._correlatedColumns.push(json[keys[1]]);
+                this.setResponseText(json[keys[2]] || 'Something went wrong.');
+            })
+            .catch(err => console.error(err))
+            .finally(() => this.setGptProcessing(false));
     };
 
     /**
      * Transfers the summarization text to a sidebar annotation text document.
      */
     private transferToText = () => {
-        const newDoc = Docs.Create.TextDocument(this.text.trim(), {
+        const newDoc = Docs.Create.TextDocument(this._responseText.trim(), {
             _width: 200,
             _height: 50,
             _layout_fitWidth: true,
             _layout_autoHeight: true,
         });
-        this.addDoc(newDoc, this.sidebarId);
-        // newDoc.data = 'Hello world';
+        this.addDoc(newDoc, this._sidebarFieldKey);
         const anchor = AnchorMenu.Instance?.GetAnchor(undefined, false);
         if (anchor) {
             DocUtils.MakeLink(newDoc, anchor, {
@@ -330,73 +256,35 @@ export class GPTPopup extends ObservableReactComponent<object> {
     /**
      * Creates a histogram to show the correlation relationship that was found
      */
-    private createVisualization = () => {
-        this.createFilteredDoc(this.correlatedColumns);
-    };
+    private createVisualization = () => this.createFilteredDoc(this._correlatedColumns);
 
     /**
      * Transfers the image urls to actual image docs
      */
     private transferToImage = (source: string) => {
-        const textAnchor = this.textAnchor ?? this.imgTargetDoc;
-        if (!textAnchor) return;
-        const newDoc = Docs.Create.ImageDocument(source, {
-            x: NumCast(textAnchor.x) + NumCast(textAnchor._width) + 10,
-            y: NumCast(textAnchor.y),
-            _height: 200,
-            _width: 200,
-            data_nativeWidth: 1024,
-            data_nativeHeight: 1024,
-        });
-        if (Doc.IsInMyOverlay(textAnchor)) {
-            newDoc.overlayX = textAnchor.x;
-            newDoc.overlayY = NumCast(textAnchor.y) + NumCast(textAnchor._height);
-            Doc.AddToMyOverlay(newDoc);
-        } else {
-            this.addToCollection?.(newDoc);
-        }
-        // Create link between prompt and image
-        DocUtils.MakeLink(textAnchor, newDoc, { link_relationship: 'Image Prompt' });
-    };
-
-    /**
-     * Creates a chatbox for analyzing data so that users can ask specific questions.
-     */
-    private chatWithAI = () => {
-        this.chatMode = true;
-    };
-    dataPromptChanged = action((e: React.ChangeEvent<HTMLInputElement>) => {
-        this.dataChatPrompt = e.target.value;
-    });
-
-    private getPreviewUrl = (source: string) => source.split('.').join('_m.');
-
-    constructor(props: object) {
-        super(props);
-        makeObservable(this);
-        GPTPopup.Instance = this;
-        this.messagesEndRef = React.createRef();
-    }
-
-    scrollToBottom = () => {
-        setTimeout(() => {
-            // Code to execute after 1 second (1000 ms)
-            if (this.messagesEndRef.current) {
-                this.messagesEndRef.current.scrollIntoView({ behavior: 'smooth', block: 'end' });
+        const textAnchor = this._textAnchor ?? this._imgTargetDoc;
+        if (textAnchor) {
+            const newDoc = Docs.Create.ImageDocument(source, {
+                x: NumCast(textAnchor.x) + NumCast(textAnchor._width) + 10,
+                y: NumCast(textAnchor.y),
+                _height: 200,
+                _width: 200,
+                data_nativeWidth: 1024,
+                data_nativeHeight: 1024,
+            });
+            if (Doc.IsInMyOverlay(textAnchor)) {
+                newDoc.overlayX = textAnchor.x;
+                newDoc.overlayY = NumCast(textAnchor.y) + NumCast(textAnchor._height);
+                Doc.AddToMyOverlay(newDoc);
+            } else {
+                this.addToCollection?.(newDoc);
             }
-        }, 50);
-    };
-
-    componentDidUpdate = () => {
-        if (this.loading) {
-            this.setDone(false);
+            // Create link between prompt and image
+            DocUtils.MakeLink(textAnchor, newDoc, { link_relationship: 'Image Prompt' });
         }
     };
 
-    @observable quizMode: GPTQuizType = GPTQuizType.CURRENT;
-    @action setQuizMode(g: GPTQuizType) {
-        this.quizMode = g;
-    }
+    scrollToBottom = () => setTimeout(() => this._messagesEndRef.current?.scrollIntoView({ behavior: 'smooth', block: 'end' }), 50);
 
     cardMenu = () => (
         <div className="btns-wrapper-gpt">
@@ -419,7 +307,7 @@ export class GPTPopup extends ObservableReactComponent<object> {
                 tooltip="Test your knowledge with ChatGPT!"
                 text="Quiz Cards!"
                 onClick={() => {
-                    this.conversationArray = ['Define the selected card!'];
+                    this._conversationArray = ['Define the selected card!'];
                     this.setMode(GPTPopupMode.QUIZ);
                     this.onQuizRandom?.();
                 }}
@@ -437,27 +325,19 @@ export class GPTPopup extends ObservableReactComponent<object> {
     );
 
     @action
-    handleKeyPress = (e: React.KeyboardEvent, isSort: boolean) => {
+    handleKeyPress = async (e: React.KeyboardEvent, isSort: boolean) => {
         if (e.key === 'Enter') {
             e.stopPropagation();
 
+            this.setGptProcessing(true);
             if (isSort) {
-                this.conversationArray.push(this.chatSortPrompt);
-                this.generateCard().then(
-                    action(() => {
-                        this.chatSortPrompt = '';
-                    })
-                );
+                this._conversationArray.push(this._sortPrompt);
+                await this.generateQueryResponse(this._sortPrompt).then(action(() => (this._sortPrompt = '')));
             } else {
-                this.conversationArray.push(this.quizAnswer);
-                this.setLoading(true);
-                this.generateQuiz(DocumentView.SelectedDocs().lastElement()).then(
-                    action(() => {
-                        this.quizAnswer = '';
-                        this.setLoading(false);
-                    })
-                );
+                this._conversationArray.push(this._quizAnswer);
+                await this.generateQuizAnswerAnalysis(DocumentView.SelectedDocs().lastElement(), this._quizAnswer).then(action(() => (this._quizAnswer = '')));
             }
+            this.setGptProcessing(false);
 
             this.scrollToBottom();
         }
@@ -467,26 +347,24 @@ export class GPTPopup extends ObservableReactComponent<object> {
         <div className="btns-wrapper-gpt">
             <div className="chat-wrapper">
                 <div className="chat-bubbles">
-                    {this.conversationArray.map((message, index) => (
+                    {this._conversationArray.map((message, index) => (
                         <div key={index} className={`chat-bubble ${index % 2 === 1 ? 'user-message' : 'chat-message'}`}>
                             {message}
                         </div>
                     ))}
-                    {this.loading && <div className={`chat-bubble chat-message`}>...</div>}
+                    {this._gptProcessing && <div className={`chat-bubble chat-message`}>...</div>}
                 </div>
 
-                <div ref={this.messagesEndRef} style={{ height: '100px' }} />
+                <div ref={this._messagesEndRef} style={{ height: '100px' }} />
             </div>
             <div className="inputWrapper">
                 <input
                     className="searchBox-input"
                     defaultValue=""
-                    value={isSort ? this.chatSortPrompt : this.quizAnswer} // Controlled input
+                    value={isSort ? this._sortPrompt : this._quizAnswer} // Controlled input
                     autoComplete="off"
-                    onChange={isSort ? this.sortPromptChanged : this.quizAnswerChanged}
-                    onKeyDown={e => {
-                        this.handleKeyPress(e, isSort);
-                    }}
+                    onChange={isSort ? this.setSortPrompt : this.setQuizAnswer}
+                    onKeyDown={e => this.handleKeyPress(e, isSort)}
                     type="text"
                     placeholder={`${isSort ? 'Have ChatGPT sort, tag, define, or filter your cards for you!' : 'Define the selected card!'}`}
                 />
@@ -497,7 +375,7 @@ export class GPTPopup extends ObservableReactComponent<object> {
     sortBox = (isSort: boolean) => (
         <div className="gptPopup-sortBox" style={{ height: '80%' }}>
             {this.heading(isSort ? 'SORTING' : 'QUIZ')}
-            {this.mode === GPTPopupMode.CARD ? this.cardMenu() : this.cardActual(isSort)}
+            {this._mode === GPTPopupMode.CARD ? this.cardMenu() : this.cardActual(isSort)}
         </div>
     );
 
@@ -505,7 +383,7 @@ export class GPTPopup extends ObservableReactComponent<object> {
         <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
             {this.heading('GENERATED IMAGE')}
             <div className="image-content-wrapper">
-                {this.imgUrls.map((rawSrc, i) => (
+                {this._imgUrls.map((rawSrc, i) => (
                     <div key={rawSrc[0] + i} className="img-wrapper">
                         <div className="img-container">
                             <img key={rawSrc[0]} src={rawSrc[0]} width={150} height={150} alt="dalle generation" />
@@ -516,7 +394,7 @@ export class GPTPopup extends ObservableReactComponent<object> {
                     </div>
                 ))}
             </div>
-            {!this.loading && <IconButton tooltip="Generate Again" onClick={this.generateImage} icon={<FontAwesomeIcon icon="redo-alt" size="lg" />} color={StrCast(Doc.UserDoc().userVariantColor)} />}
+            {this._gptProcessing ? null : <IconButton tooltip="Generate Again" onClick={this.generateImage} icon={<FontAwesomeIcon icon="redo-alt" size="lg" />} color={StrCast(Doc.UserDoc().userVariantColor)} />}
         </div>
     );
 
@@ -524,44 +402,35 @@ export class GPTPopup extends ObservableReactComponent<object> {
         <>
             <div>
                 {this.heading('SUMMARY')}
-                <div className="content-wrapper">
-                    {!this.loading &&
-                        (!this.done ? (
+                <div className="gptPopup-content-wrapper">
+                    {!this._gptProcessing &&
+                        (!this._stopAnimatingResponse ? (
                             <TypeAnimation
                                 speed={50}
                                 sequence={[
-                                    this.text,
+                                    this._responseText,
                                     () => {
-                                        setTimeout(() => {
-                                            this.setDone(true);
-                                        }, 500);
+                                        setTimeout(() => this.setStopAnimatingResponse(true), 500);
                                     },
                                 ]}
                             />
                         ) : (
-                            this.text
+                            this._responseText
                         ))}
                 </div>
             </div>
-            {!this.loading && (
+            {!this._gptProcessing && (
                 <div className="btns-wrapper">
-                    {this.done ? (
+                    {this._stopAnimatingResponse ? (
                         <>
-                            <IconButton tooltip="Generate Again" onClick={this.generateSummary /* this.callSummaryApi */} icon={<FontAwesomeIcon icon="redo-alt" size="lg" />} color={StrCast(SettingsManager.userVariantColor)} />
+                            <IconButton tooltip="Generate Again" onClick={() => this.generateSummary(this._selectedText + ' ')} icon={<FontAwesomeIcon icon="redo-alt" size="lg" />} color={StrCast(SettingsManager.userVariantColor)} />
                             <Button tooltip="Transfer to text" text="Transfer To Text" onClick={this.transferToText} color={StrCast(SettingsManager.userVariantColor)} type={Type.TERT} />
                         </>
                     ) : (
                         <div className="summarizing">
                             <span>Summarizing</span>
                             <ReactLoading type="bubbles" color="#bcbcbc" width={20} height={20} />
-                            <Button
-                                text="Stop Animation"
-                                onClick={() => {
-                                    this.setDone(true);
-                                }}
-                                color={StrCast(SettingsManager.userVariantColor)}
-                                type={Type.TERT}
-                            />
+                            <Button text="Stop Animation" onClick={() => this.setStopAnimatingResponse(true)} color={StrCast(SettingsManager.userVariantColor)} type={Type.TERT} />
                         </div>
                     )}
                 </div>
@@ -573,33 +442,31 @@ export class GPTPopup extends ObservableReactComponent<object> {
         <>
             <div>
                 {this.heading('ANALYSIS')}
-                <div className="content-wrapper">
-                    {!this.loading &&
-                        (!this.done ? (
+                <div className="gptPopup-content-wrapper">
+                    {!this._gptProcessing &&
+                        (!this._stopAnimatingResponse ? (
                             <TypeAnimation
                                 speed={50}
                                 sequence={[
-                                    this.text,
+                                    this._responseText,
                                     () => {
-                                        setTimeout(() => {
-                                            this.setDone(true);
-                                        }, 500);
+                                        setTimeout(() => this.setStopAnimatingResponse(true), 500);
                                     },
                                 ]}
                             />
                         ) : (
-                            this.text
+                            this._responseText
                         ))}
                 </div>
             </div>
-            {!this.loading && (
+            {!this._gptProcessing && (
                 <div className="btns-wrapper">
-                    {this.done ? (
-                        this.chatMode ? (
+                    {this._stopAnimatingResponse ? (
+                        this._chatEnabled ? (
                             <input
                                 defaultValue=""
                                 autoComplete="off"
-                                onChange={this.dataPromptChanged}
+                                onChange={e => (this._dataChatPrompt = e.target.value)}
                                 onKeyDown={e => {
                                     e.key === 'Enter' ? this.generateDataAnalysis() : null;
                                     e.stopPropagation();
@@ -613,21 +480,14 @@ export class GPTPopup extends ObservableReactComponent<object> {
                         ) : (
                             <>
                                 <Button tooltip="Transfer to text" text="Transfer To Text" onClick={this.transferToText} color={StrCast(SnappingManager.userVariantColor)} type={Type.TERT} />
-                                <Button tooltip="Chat with AI" text="Chat with AI" onClick={this.chatWithAI} color={StrCast(SnappingManager.userVariantColor)} type={Type.TERT} />
+                                <Button tooltip="Chat with AI" text="Chat with AI" onClick={() => this.setChatEnabled(true)} color={StrCast(SnappingManager.userVariantColor)} type={Type.TERT} />
                             </>
                         )
                     ) : (
                         <div className="summarizing">
                             <span>Summarizing</span>
                             <ReactLoading type="bubbles" color="#bcbcbc" width={20} height={20} />
-                            <Button
-                                text="Stop Animation"
-                                onClick={() => {
-                                    this.setDone(true);
-                                }}
-                                color={StrCast(SnappingManager.userVariantColor)}
-                                type={Type.TERT}
-                            />
+                            <Button text="Stop Animation" onClick={() => this.setStopAnimatingResponse(true)} color={StrCast(SnappingManager.userVariantColor)} type={Type.TERT} />
                         </div>
                     )}
                 </div>
@@ -636,70 +496,53 @@ export class GPTPopup extends ObservableReactComponent<object> {
     );
 
     aiWarning = () =>
-        this.done ? (
+        !this._stopAnimatingResponse ? null : (
             <div className="ai-warning">
                 <FontAwesomeIcon icon="exclamation-circle" size="sm" style={{ paddingRight: '5px' }} />
                 AI generated responses can contain inaccurate or misleading content.
             </div>
-        ) : null;
+        );
 
     heading = (headingText: string) => (
         <div className="summary-heading">
             <label className="summary-text">{headingText}</label>
-            {this.loading ? (
+            {this._gptProcessing ? (
                 <ReactLoading type="spin" color="#bcbcbc" width={14} height={14} />
             ) : (
                 <>
-                    {(this.mode === GPTPopupMode.SORT || this.mode === GPTPopupMode.QUIZ) && (
-                        <IconButton color={StrCast(SettingsManager.userVariantColor)} tooltip="back" icon={<CgCornerUpLeft size="16px" />} onClick={() => (this.mode = GPTPopupMode.CARD)} style={{ right: '50px', position: 'absolute' }} />
+                    {(this._mode === GPTPopupMode.SORT || this._mode === GPTPopupMode.QUIZ) && (
+                        <IconButton color={StrCast(SettingsManager.userVariantColor)} tooltip="back" icon={<CgCornerUpLeft size="16px" />} onClick={() => (this._mode = GPTPopupMode.CARD)} style={{ right: '50px', position: 'absolute' }} />
                     )}
                     <Toggle
                         tooltip="Clear Chat filter"
                         toggleType={ToggleType.BUTTON}
                         type={Type.PRIM}
-                        toggleStatus={Doc.hasDocFilter(this.collectionDoc, 'tags', '#chat')}
-                        text={Doc.hasDocFilter(this.collectionDoc, 'tags', '#chat') ? 'filtered' : ''}
+                        toggleStatus={Doc.hasDocFilter(this._collectionContext, 'tags', '#chat')}
+                        text={Doc.hasDocFilter(this._collectionContext, 'tags', '#chat') ? 'filtered' : ''}
                         color="red"
-                        onClick={() => this.collectionDoc && Doc.setDocFilter(this.collectionDoc, 'tags', '#chat', 'remove')}
-                    />
-                    <IconButton
-                        color={StrCast(SettingsManager.userVariantColor)}
-                        tooltip="close"
-                        icon={<CgClose size="16px" />}
-                        onClick={() => {
-                            this.setVisible(false);
-                        }}
+                        onClick={() => this._collectionContext && Doc.setDocFilter(this._collectionContext, 'tags', '#chat', 'remove')}
                     />
+                    <IconButton color={StrCast(SettingsManager.userVariantColor)} tooltip="close" icon={<CgClose size="16px" />} onClick={() => this.setVisible(false)} />
                 </>
             )}
         </div>
     );
 
     render() {
-        let content;
-
-        switch (this.mode) {
-            case GPTPopupMode.SUMMARY:
-                content = this.summaryBox();
-                break;
-            case GPTPopupMode.DATA:
-                content = this.dataAnalysisBox();
-                break;
-            case GPTPopupMode.IMAGE:
-                content = this.imageBox();
-                break;
-            case GPTPopupMode.SORT:
-            case GPTPopupMode.CARD:
-            case GPTPopupMode.QUIZ:
-                content = this.sortBox(this.mode === GPTPopupMode.SORT);
-                break;
-            default:
-                content = null;
-        }
-
         return (
-            <div className="summary-box" style={{ display: this.Visible ? 'flex' : 'none' }}>
-                {content}
+            <div className="gptPopup-summary-box" style={{ display: this.Visible ? 'flex' : 'none' }}>
+                {(() => {
+                    //prettier-ignore
+                    switch (this._mode) {
+                        case GPTPopupMode.SORT:
+                        case GPTPopupMode.CARD:
+                        case GPTPopupMode.QUIZ:    return this.sortBox(this._mode === GPTPopupMode.SORT);
+                        case GPTPopupMode.SUMMARY: return this.summaryBox();
+                        case GPTPopupMode.DATA:    return this.dataAnalysisBox();
+                        case GPTPopupMode.IMAGE:   return this.imageBox();
+                        default:                   return null;
+                }
+                })()}
                 <div className="resize-handle" />
             </div>
         );
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 8728ce99c..167421a4a 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -437,7 +437,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
             AnchorMenu.Instance.jumpTo(e.clientX, e.clientY);
         }
 
-        GPTPopup.Instance.setSidebarId('data_sidebar');
+        GPTPopup.Instance.setSidebarFieldKey('data_sidebar');
         GPTPopup.Instance.addDoc = this._props.sidebarAddDoc;
         // allows for creating collection
         AnchorMenu.Instance.addToCollection = this._props.DocumentView?.()._props.addDocument;
-- 
cgit v1.2.3-70-g09d2


From 04669ffeb163688c7aefd7b5face7998252abdca Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Mon, 10 Mar 2025 18:02:07 -0400
Subject: removed label creation from text's anchor menu.  removed label
 creation from pdfs.

---
 src/client/views/StyleProviderQuiz.tsx             |  9 ++--
 .../views/nodes/formattedText/FormattedTextBox.tsx |  5 +-
 src/client/views/pdf/AnchorMenu.tsx                | 53 ++--------------------
 src/client/views/pdf/PDFViewer.tsx                 |  8 ++--
 src/client/views/smartdraw/StickerPalette.tsx      |  4 +-
 5 files changed, 16 insertions(+), 63 deletions(-)

(limited to 'src/client/views/pdf/PDFViewer.tsx')

diff --git a/src/client/views/StyleProviderQuiz.tsx b/src/client/views/StyleProviderQuiz.tsx
index c2c352113..acda38dd7 100644
--- a/src/client/views/StyleProviderQuiz.tsx
+++ b/src/client/views/StyleProviderQuiz.tsx
@@ -3,7 +3,7 @@ import { Tooltip } from '@mui/material';
 import { runInAction } from 'mobx';
 import * as React from 'react';
 import { returnFalse, setupMoveUpEvents } from '../../ClientUtils';
-import { emptyFunction } from '../../Utils';
+import { emptyFunction, unimplementedFunction } from '../../Utils';
 import { Doc, DocListCast, Opt } from '../../fields/Doc';
 import { DocData } from '../../fields/DocSymbols';
 import { List } from '../../fields/List';
@@ -113,7 +113,7 @@ export namespace styleProviderQuiz {
     /**
      * Create flashcards from an image.
      */
-    async function getImageDesc(img: ImageBox) {
+    async function makeFlashcardsForImage(img: ImageBox) {
         img.Loading = true;
         try {
             const hrefBase64 = await createCanvas(img);
@@ -383,10 +383,7 @@ export namespace styleProviderQuiz {
                 }
                 break;
             case StyleProp.AnchorMenuItems:
-                if (imgBox) {
-                    AnchorMenu.Instance.gptFlashcards = () => getImageDesc(imgBox);
-                    AnchorMenu.Instance.makeLabels = () => makeLabels(props?.DocumentView?.().ComponentView as ImageBox);
-                }
+                AnchorMenu.Instance.makeLabels = imgBox ? () => makeLabels(props?.DocumentView?.().ComponentView as ImageBox) : unimplementedFunction;
         }
         return undefined;
     }
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index 7feaac6ae..38817ac6d 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -226,7 +226,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
         return anchor;
     };
 
-    gptPDFFlashcards = async () => {
+    selectionToFlashcards = async () => {
         const queryText = window.getSelection()?.toString() ?? '';
         try {
             if (queryText) {
@@ -241,7 +241,8 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FormattedTextB
     @action
     setupAnchorMenu = () => {
         AnchorMenu.Instance.Status = 'marquee';
-        AnchorMenu.Instance.gptFlashcards = this.gptPDFFlashcards;
+        // AnchorMenu.Instance.gptFlashcards = this.selectionToFlashcards;
+        AnchorMenu.Instance.makeLabels = unimplementedFunction;
         AnchorMenu.Instance.addToCollection = this._props.DocumentView?.()._props.addDocument;
         AnchorMenu.Instance.OnClick = () => {
             !this.layoutDoc.layout_showSidebar && this.toggleSidebar();
diff --git a/src/client/views/pdf/AnchorMenu.tsx b/src/client/views/pdf/AnchorMenu.tsx
index 9aa8fe649..eaaeb8d97 100644
--- a/src/client/views/pdf/AnchorMenu.tsx
+++ b/src/client/views/pdf/AnchorMenu.tsx
@@ -1,24 +1,19 @@
 import { ColorPicker, Group, IconButton, Popup, Size, Toggle, ToggleType, Type } from '@dash/components';
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { IReactionDisposer, ObservableMap, action, computed, makeObservable, observable, reaction, runInAction } from 'mobx';
+import { IReactionDisposer, ObservableMap, action, computed, makeObservable, observable, reaction } from 'mobx';
 import { observer } from 'mobx-react';
 import * as React from 'react';
 import { ColorResult } from 'react-color';
-import ReactLoading from 'react-loading';
 import { ClientUtils, returnFalse, setupMoveUpEvents } from '../../../ClientUtils';
 import { emptyFunction, unimplementedFunction } from '../../../Utils';
 import { Doc, Opt } from '../../../fields/Doc';
-import { DocData } from '../../../fields/DocSymbols';
 import { SettingsManager } from '../../util/SettingsManager';
-import { undoBatch } from '../../util/UndoManager';
 import { AntimodeMenu, AntimodeMenuProps } from '../AntimodeMenu';
 import { LinkPopup } from '../linking/LinkPopup';
 import { ComparisonBox } from '../nodes/ComparisonBox';
 import { DocumentView } from '../nodes/DocumentView';
-import { DrawingOptions, SmartDrawHandler } from '../smartdraw/SmartDrawHandler';
 import './AnchorMenu.scss';
 import { GPTPopup } from './GPTPopup/GPTPopup';
-import { RichTextMenu } from '../nodes/formattedText/RichTextMenu';
 
 @observer
 export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
@@ -116,39 +111,6 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
         );
     };
 
-    /**
-     * Creates a GPT drawing based on selected text.
-     */
-    gptDraw = (e: React.PointerEvent) => {
-        try {
-            SmartDrawHandler.Instance.AddDrawing = this.createDrawingAnnotation;
-            runInAction(() => (this._isLoading = true));
-            SmartDrawHandler.Instance.drawWithGPT({ X: e.clientX, Y: e.clientY }, this._selectedText, 5, 100, true)?.then(
-                action(() => {
-                    this._isLoading = false;
-                })
-            );
-        } catch (err) {
-            console.error(err);
-        }
-    };
-
-    /**
-     * Defines how a GPT drawing should be added to the current document.
-     */
-    @undoBatch
-    createDrawingAnnotation = action((drawing: Doc, opts: DrawingOptions, gptRes: string) => {
-        this.AddDrawingAnnotation(drawing);
-        const docData = drawing[DocData];
-        docData.title = opts.text?.match(/^(.*?)~~~.*$/)?.[1] || opts.text;
-        docData.ai_drawing_input = opts.text;
-        docData.ai_drawing_complexity = opts.complexity;
-        docData.ai_drawing_colored = opts.autoColor;
-        docData.ai_drawing_size = opts.size;
-        docData.ai_drawing_data = gptRes;
-        docData.ai = 'gpt';
-    });
-
     pointerDown = (e: React.PointerEvent) => {
         setupMoveUpEvents(
             this,
@@ -232,17 +194,8 @@ export class AnchorMenu extends AntimodeMenu<AntimodeMenuProps> {
                         />
                     )}
                     {/* Adds a create flashcards option to the anchor menu, which calls the gptFlashcard method. */}
-                    <IconButton tooltip="Create flashcards" onPointerDown={this.gptFlashcards} icon={<FontAwesomeIcon icon="layer-group" size="lg" />} color={SettingsManager.userColor} />
-                    <IconButton tooltip="Create labels" onPointerDown={this.makeLabels} icon={<FontAwesomeIcon icon="tag" size="lg" />} color={SettingsManager.userColor} />
-                    {this._selectedText && (
-                        <IconButton
-                            tooltip="Create drawing"
-                            onPointerDown={e => this.gptDraw(e)}
-                            icon={this._isLoading ? <ReactLoading type="spin" color={SettingsManager.userVariantColor} width={16} height={20} /> : <FontAwesomeIcon icon="paintbrush" size="lg" />}
-                            color={SettingsManager.userColor}
-                        />
-                    )}
-                    {this._selectedText && RichTextMenu.Instance?.createLinkButton()}
+                    {this.gptFlashcards === unimplementedFunction ? null : <IconButton tooltip="Create flashcards" onPointerDown={this.gptFlashcards} icon={<FontAwesomeIcon icon="layer-group" size="lg" />} color={SettingsManager.userColor} />}
+                    {this.makeLabels === unimplementedFunction ? null : <IconButton tooltip="Create labels" onPointerDown={this.makeLabels} icon={<FontAwesomeIcon icon="tag" size="lg" />} color={SettingsManager.userColor} />}
                     {AnchorMenu.Instance.OnAudio === unimplementedFunction ? null : (
                         <IconButton
                             tooltip="Click to Record Annotation" //
diff --git a/src/client/views/pdf/PDFViewer.tsx b/src/client/views/pdf/PDFViewer.tsx
index 167421a4a..a50526223 100644
--- a/src/client/views/pdf/PDFViewer.tsx
+++ b/src/client/views/pdf/PDFViewer.tsx
@@ -11,7 +11,7 @@ import { Id } from '../../../fields/FieldSymbols';
 import { InkTool } from '../../../fields/InkField';
 import { Cast, NumCast, StrCast } from '../../../fields/Types';
 import { TraceMobx } from '../../../fields/util';
-import { emptyFunction, numberRange } from '../../../Utils';
+import { emptyFunction, numberRange, unimplementedFunction } from '../../../Utils';
 import { DocUtils } from '../../documents/DocUtils';
 import { SnappingManager } from '../../util/SnappingManager';
 import { MarqueeOptionsMenu } from '../collections/collectionFreeForm';
@@ -397,7 +397,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
      */
     gptPDFFlashcards = async () => {
         const queryText = this._selectionText;
-        this._loading = true;
+        runInAction(() => (this._loading = true));
         try {
             const res = await gptAPICall(queryText, GPTCallType.FLASHCARD);
 
@@ -406,11 +406,12 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         } catch (err) {
             console.error(err);
         }
-        this._loading = false;
+        runInAction(() => (this._loading = false));
     };
 
     @action
     finishMarquee = (/* x?: number, y?: number */) => {
+        AnchorMenu.Instance.makeLabels = unimplementedFunction;
         this._getAnchor = AnchorMenu.Instance?.GetAnchor;
         this.isAnnotating = false;
         this._marqueeref.current?.onTerminateSelection();
@@ -442,6 +443,7 @@ export class PDFViewer extends ObservableReactComponent<IViewerProps> {
         // allows for creating collection
         AnchorMenu.Instance.addToCollection = this._props.DocumentView?.()._props.addDocument;
         AnchorMenu.Instance.gptFlashcards = this.gptPDFFlashcards;
+        AnchorMenu.Instance.makeLabels = unimplementedFunction;
         AnchorMenu.Instance.AddDrawingAnnotation = this.addDrawingAnnotation;
     };
 
diff --git a/src/client/views/smartdraw/StickerPalette.tsx b/src/client/views/smartdraw/StickerPalette.tsx
index d5307974f..e3305851a 100644
--- a/src/client/views/smartdraw/StickerPalette.tsx
+++ b/src/client/views/smartdraw/StickerPalette.tsx
@@ -151,7 +151,7 @@ export class StickerPalette extends ObservableReactComponent<StickerPaletteProps
             numberRange(3).map(i => {
                 return this._showRegenerate
                     ? SmartDrawHandler.Instance.regenerate(prevDrawings, this._opts, this._gptRes[i], this._userInput)
-                    : SmartDrawHandler.Instance.drawWithGPT({ X: 0, Y: 0 }, this._userInput, this._opts.complexity, this._opts.size, this._opts.autoColor);
+                    : SmartDrawHandler.Instance.drawWithGPT({ X: 0, Y: 0 }, this._userInput, this._opts.complexity || 0, this._opts.size || 0, !!this._opts.autoColor);
             })
         ).then(() => {
             this._opts.text !== '' ? (this._opts.text = `${this._opts.text} ~~~ ${this._userInput}`) : (this._opts.text = this._userInput);
@@ -177,7 +177,7 @@ export class StickerPalette extends ObservableReactComponent<StickerPaletteProps
         const cIndex = NumCast(this._props.Document.carousel_index);
         const focusedDrawing = DocListCast(this._props.Document.data)[cIndex];
         const docData = focusedDrawing[DocData];
-        docData.title = this._opts.text.match(/^(.*?)~~~.*$/)?.[1] || this._opts.text;
+        docData.title = this._opts.text?.match(/^(.*?)~~~.*$/)?.[1] || this._opts.text;
         docData.ai_drawing_input = this._opts.text;
         docData.ai_drawing_complexity = this._opts.complexity;
         docData.ai_drawing_colored = this._opts.autoColor;
-- 
cgit v1.2.3-70-g09d2

