From 68ad193a73fbe191f5828b7eec5b80d73b4f0bf2 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Wed, 22 May 2024 12:29:41 -0400
Subject: [PATCH 01/79] breakdown tab for payments and offercreates

---
 package-lock.json                             | 101 ++++--
 package.json                                  |   3 +-
 public/locales/ca-CA/translations.json        |   7 +-
 public/locales/en-US/translations.json        |   7 +-
 .../BreakDownTab/breakDownTab.scss            | 119 +++++++
 .../Transactions/BreakDownTab/index.tsx       | 303 ++++++++++++++++++
 src/containers/Transactions/index.tsx         |  10 +
 7 files changed, 519 insertions(+), 31 deletions(-)
 create mode 100644 src/containers/Transactions/BreakDownTab/breakDownTab.scss
 create mode 100644 src/containers/Transactions/BreakDownTab/index.tsx

diff --git a/package-lock.json b/package-lock.json
index 7b1f75f3a..3d3492750 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -59,7 +59,8 @@
         "vite-plugin-html": "^3.2.0",
         "vite-plugin-svgr": "^4.2.0",
         "vite-tsconfig-paths": "^4.2.0",
-        "xrpl-client": "^2.1.0"
+        "xrpl-client": "^2.1.0",
+        "xrpl-tx-path-parser": "github:shortthefomo/xrpl-tx-path-parser#dev"
       },
       "devDependencies": {
         "@babel/eslint-parser": "^7.22.6",
@@ -5351,7 +5352,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
       "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
-      "dev": true,
       "dependencies": {
         "@noble/hashes": "1.3.2"
       },
@@ -5521,7 +5521,6 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz",
       "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==",
-      "dev": true,
       "dependencies": {
         "@noble/curves": "~1.2.0",
         "@noble/hashes": "~1.3.2",
@@ -5535,7 +5534,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
       "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
-      "dev": true,
       "dependencies": {
         "@noble/hashes": "~1.3.0",
         "@scure/base": "~1.1.0"
@@ -6878,12 +6876,33 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-1.0.0.tgz",
       "integrity": "sha512-qsCLGyqe1zaq9j7PZJopK+iGTGRbk6akkg6iZXJJgxKwck0C5x5Gnwlb1HKYGOwPKyrXWpV6a2YmcpNpUFctGg==",
-      "dev": true,
       "dependencies": {
         "@xrplf/isomorphic": "^1.0.0",
         "ripple-keypairs": "^2.0.0"
       }
     },
+    "node_modules/@xrplkit/amount": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@xrplkit/amount/-/amount-1.2.3.tgz",
+      "integrity": "sha512-poV7ym7EhjAlEGym9Kc3AHuy3uuhVW3qnl2KDr8D4zk7hANj7aG6l1XdtWIAGAgBpHnvPEaOG7+llPRRv1irZw==",
+      "dependencies": {
+        "@xrplkit/xfl": "2.0.2"
+      }
+    },
+    "node_modules/@xrplkit/txmeta": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@xrplkit/txmeta/-/txmeta-1.3.1.tgz",
+      "integrity": "sha512-iJNtLgXTpbuYBI0VDsXJhi3MHxmsCdWsI3OumETk+21HjxDw1AmPGmVHWu8q8turFth1qzRIAtHjxLHDl307sg==",
+      "dependencies": {
+        "@xrplkit/amount": "1.2.3",
+        "@xrplkit/xfl": "2.0.2"
+      }
+    },
+    "node_modules/@xrplkit/xfl": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+      "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+    },
     "node_modules/abab": {
       "version": "2.0.5",
       "dev": true,
@@ -9825,10 +9844,9 @@
       }
     },
     "node_modules/decimal.js": {
-      "version": "10.3.1",
-      "dev": true,
-      "license": "MIT",
-      "peer": true
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
     },
     "node_modules/decimal.js-light": {
       "version": "2.5.1",
@@ -23893,7 +23911,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.0.0.tgz",
       "integrity": "sha512-zakENc9A5dlW85uzrmQHrJehymhL59ftggboRNrjxFDJdlNJ6DSE210P3ys/9kL0oVtOzFnTrOPFfxHZeOsA/Q==",
-      "dev": true,
       "dependencies": {
         "@xrplf/isomorphic": "^1.0.0",
         "bignumber.js": "^9.0.0",
@@ -23907,7 +23924,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz",
       "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==",
-      "dev": true,
       "dependencies": {
         "@noble/curves": "^1.0.0",
         "@xrplf/isomorphic": "^1.0.0",
@@ -27964,7 +27980,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.0.0.tgz",
       "integrity": "sha512-QC+dNx3tvMEn9IrxcXFFa0rWwvBwACkGFNKl+W2miMGYnlgSiIsnjdqwtG2WRs0Pyxs5dd9nBTQHyQ1BPxZ78A==",
-      "dev": true,
       "dependencies": {
         "@scure/bip32": "^1.3.1",
         "@scure/bip39": "^1.2.1",
@@ -27990,11 +28005,20 @@
         "websocket": "^1.0.34"
       }
     },
+    "node_modules/xrpl-tx-path-parser": {
+      "version": "1.0.4",
+      "resolved": "git+ssh://git@github.com/shortthefomo/xrpl-tx-path-parser.git#8f5f4d5bc3bc83c6fffedf9bfe172d5a3c9d1c76",
+      "license": "ISC",
+      "dependencies": {
+        "@xrplkit/txmeta": "^1.3.1",
+        "decimal.js": "^10.4.3",
+        "xrpl": "^3.0.0"
+      }
+    },
     "node_modules/xrpl/node_modules/cross-fetch": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
       "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
-      "dev": true,
       "dependencies": {
         "node-fetch": "^2.6.12"
       }
@@ -28002,8 +28026,7 @@
     "node_modules/xrpl/node_modules/eventemitter3": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
-      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
-      "dev": true
+      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
     },
     "node_modules/y18n": {
       "version": "4.0.3",
@@ -31558,7 +31581,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
       "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
-      "dev": true,
       "requires": {
         "@noble/hashes": "1.3.2"
       }
@@ -31665,7 +31687,6 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz",
       "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==",
-      "dev": true,
       "requires": {
         "@noble/curves": "~1.2.0",
         "@noble/hashes": "~1.3.2",
@@ -31676,7 +31697,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
       "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
-      "dev": true,
       "requires": {
         "@noble/hashes": "~1.3.0",
         "@scure/base": "~1.1.0"
@@ -32576,12 +32596,33 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-1.0.0.tgz",
       "integrity": "sha512-qsCLGyqe1zaq9j7PZJopK+iGTGRbk6akkg6iZXJJgxKwck0C5x5Gnwlb1HKYGOwPKyrXWpV6a2YmcpNpUFctGg==",
-      "dev": true,
       "requires": {
         "@xrplf/isomorphic": "^1.0.0",
         "ripple-keypairs": "^2.0.0"
       }
     },
+    "@xrplkit/amount": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@xrplkit/amount/-/amount-1.2.3.tgz",
+      "integrity": "sha512-poV7ym7EhjAlEGym9Kc3AHuy3uuhVW3qnl2KDr8D4zk7hANj7aG6l1XdtWIAGAgBpHnvPEaOG7+llPRRv1irZw==",
+      "requires": {
+        "@xrplkit/xfl": "2.0.2"
+      }
+    },
+    "@xrplkit/txmeta": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@xrplkit/txmeta/-/txmeta-1.3.1.tgz",
+      "integrity": "sha512-iJNtLgXTpbuYBI0VDsXJhi3MHxmsCdWsI3OumETk+21HjxDw1AmPGmVHWu8q8turFth1qzRIAtHjxLHDl307sg==",
+      "requires": {
+        "@xrplkit/amount": "1.2.3",
+        "@xrplkit/xfl": "2.0.2"
+      }
+    },
+    "@xrplkit/xfl": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+      "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+    },
     "abab": {
       "version": "2.0.5",
       "dev": true
@@ -34648,9 +34689,9 @@
       }
     },
     "decimal.js": {
-      "version": "10.3.1",
-      "dev": true,
-      "peer": true
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
     },
     "decimal.js-light": {
       "version": "2.5.1"
@@ -44266,7 +44307,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.0.0.tgz",
       "integrity": "sha512-zakENc9A5dlW85uzrmQHrJehymhL59ftggboRNrjxFDJdlNJ6DSE210P3ys/9kL0oVtOzFnTrOPFfxHZeOsA/Q==",
-      "dev": true,
       "requires": {
         "@xrplf/isomorphic": "^1.0.0",
         "bignumber.js": "^9.0.0",
@@ -44277,7 +44317,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz",
       "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==",
-      "dev": true,
       "requires": {
         "@noble/curves": "^1.0.0",
         "@xrplf/isomorphic": "^1.0.0",
@@ -46953,7 +46992,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.0.0.tgz",
       "integrity": "sha512-QC+dNx3tvMEn9IrxcXFFa0rWwvBwACkGFNKl+W2miMGYnlgSiIsnjdqwtG2WRs0Pyxs5dd9nBTQHyQ1BPxZ78A==",
-      "dev": true,
       "requires": {
         "@scure/bip32": "^1.3.1",
         "@scure/bip39": "^1.2.1",
@@ -46971,7 +47009,6 @@
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
           "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
-          "dev": true,
           "requires": {
             "node-fetch": "^2.6.12"
           }
@@ -46979,8 +47016,7 @@
         "eventemitter3": {
           "version": "5.0.1",
           "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
-          "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
-          "dev": true
+          "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
         }
       }
     },
@@ -46993,6 +47029,15 @@
         "websocket": "^1.0.34"
       }
     },
+    "xrpl-tx-path-parser": {
+      "version": "git+ssh://git@github.com/shortthefomo/xrpl-tx-path-parser.git#8f5f4d5bc3bc83c6fffedf9bfe172d5a3c9d1c76",
+      "from": "xrpl-tx-path-parser@github:shortthefomo/xrpl-tx-path-parser#dev",
+      "requires": {
+        "@xrplkit/txmeta": "^1.3.1",
+        "decimal.js": "^10.4.3",
+        "xrpl": "^3.0.0"
+      }
+    },
     "y18n": {
       "version": "4.0.3",
       "dev": true,
diff --git a/package.json b/package.json
index 9a0de5711..9065f14e3 100644
--- a/package.json
+++ b/package.json
@@ -54,7 +54,8 @@
     "vite-plugin-html": "^3.2.0",
     "vite-plugin-svgr": "^4.2.0",
     "vite-tsconfig-paths": "^4.2.0",
-    "xrpl-client": "^2.1.0"
+    "xrpl-client": "^2.1.0",
+    "xrpl-tx-path-parser": "github:shortthefomo/xrpl-tx-path-parser#dev"
   },
   "devDependencies": {
     "@babel/eslint-parser": "^7.22.6",
diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 1e7efac16..8c7a11d27 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -75,6 +75,7 @@
   "not_found_default_title": "No s'ha trobat la pàgina",
   "not_found_check_url": "Si us plau, comproba l'URL",
   "not_found": "No s'ha trobat",
+  "breakdown": "Breakdown",
   "buy": "Compra",
   "sell": "Ven",
   "price": "Preu",
@@ -522,5 +523,9 @@
   "note": "Nota",
   "indicate_unl": "indica un validador en una UNL",
   "transaction_tokens_involved": "<Currency/> i <Currency2/>",
-  "transaction_tokens_swapped": "<Currency/> per <Currency2/>"
+  "transaction_tokens_swapped": "<Currency/> per <Currency2/>",
+  "graph_dependant_currency": "*Graph is dependant on the currency used.",
+  "incomplete_transaction": "Incomplete transaction",
+  "liquidity_source": "Liquidity Source",
+  "balance_changes": "Balance Changes"
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index 9d7630114..9af853fcb 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -76,6 +76,7 @@
   "not_found_default_title": "Page Not Found",
   "not_found_check_url": "Please double check your URL",
   "not_found": "Not found",
+  "breakdown": "Breakdown",
   "buy": "Buy",
   "sell": "Sell",
   "price": "Price",
@@ -522,5 +523,9 @@
   "note": "Note",
   "indicate_unl": "indicates a validator on an UNL",
   "transaction_tokens_involved": "<Currency/> and <Currency2/>",
-  "transaction_tokens_swapped": "<Currency/> for <Currency2/>"
+  "transaction_tokens_swapped": "<Currency/> for <Currency2/>",
+  "graph_dependant_currency": "*Graph is dependant on the currency used.",
+  "incomplete_transaction": "Incomplete transaction",
+  "liquidity_source": "Liquidity Source",
+  "balance_changes": "Balance Changes"
 }
diff --git a/src/containers/Transactions/BreakDownTab/breakDownTab.scss b/src/containers/Transactions/BreakDownTab/breakDownTab.scss
new file mode 100644
index 000000000..2dd19fa67
--- /dev/null
+++ b/src/containers/Transactions/BreakDownTab/breakDownTab.scss
@@ -0,0 +1,119 @@
+@import '../../shared/css/variables';
+
+.breakdown-body {
+  margin-top: 20px;
+  color: $black-40;
+  font-size: 12px;
+  letter-spacing: 0px;
+}
+
+.detail-section {
+  padding: 5px 15px;
+  border-bottom: 1px solid $black-70;
+  margin: 0px 0px 30px;
+
+  &:last-child {
+    border: none;
+  }
+
+  &.no-border {
+    border: none;
+  }
+}
+
+.title {
+  margin-bottom: 4px;
+  color: $white;
+  font-size: 16px;
+  text-transform: capitalize;
+  @include bold;
+
+  span {
+    margin-left: 8px;
+    font-size: 10px;
+    line-height: 18px;
+  }
+}
+
+.flex {
+  display: flex;
+}
+
+.rectangle-container {
+  min-height: 200px;
+  // margin-top: 100px;
+}
+
+:root{
+  --max-height: 80%;
+}
+
+// Build the cylinder
+$circle-height: 9px;
+
+.rectangle-row {
+  position: relative;
+  display: block;
+  height: 50px;
+}
+
+.rectangle {
+  position: relative;
+  left: 0;
+  display: block;
+  width: $circle-height;
+  height: 30px;
+  box-sizing: border-box;
+  border-top: solid 2px var(--cylinder-color);
+  border-bottom: solid 2px var(--cylinder-color);
+  margin-top: 10px;
+  margin-left: 10px;
+  animation: grow 600ms 1.5s ease both;
+  background: linear-gradient(to right, #271527, var(--cylinder-color));
+  // transform: rotate(90deg);
+}
+
+.margin-text {
+  position: relative;
+  display: block;
+  border-bottom: dashed 1px $white;
+  font-weight: bold;
+  text-align: right;
+  text-transform: capitalize;
+  // transform: rotate(-180deg);
+  // writing-mode: vertical-rl;
+}
+
+.rectangle::before,
+.rectangle::after {
+  position: absolute;
+  top: -2px;
+  right: -3px;
+  width: $circle-height;
+  height: 30px;
+  box-sizing: border-box;
+  border: solid 2px var(--cylinder-color);
+  border-radius: 50%;
+  content: '';
+}
+
+.rectangle::before {
+  left: calc(-1 * $circle-height / 2);
+  background: #271527;
+}
+
+.rectangle::after {
+  z-index: -1;
+  right: calc(-1 * $circle-height / 2);
+  background: var(--cylinder-color);
+}
+
+@keyframes grow {
+  0% {
+    width: 0;
+  }
+
+  100% {
+    width: calc(var(--max-height) * var(--percent-value)); // Change this to make things ✨
+  }
+}
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
new file mode 100644
index 000000000..31decba57
--- /dev/null
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -0,0 +1,303 @@
+import { FC, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import parsePayment from 'xrpl-tx-path-parser'
+import { Account } from '../../shared/components/Account'
+import { Amount } from '../../shared/components/Amount'
+import { formatAmount } from '../../../rippled/lib/txSummary/formatAmount'
+import Currency from '../../shared/components/Currency'
+
+import './breakDownTab.scss'
+
+// import {
+//   createSourceAmount,
+//   createPaymentDefaultPaths,
+//   amountToBalance,
+// } from 'xrpl-tx-path-parser'
+
+export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
+  const { t } = useTranslation()
+  const [selectedView, setView] = useState('source')
+
+  const hexToString = (hex: string) => {
+    let string = ''
+    for (let i = 0; i < hex.length; i += 2) {
+      const part = hex.substring(i, i + 2)
+      const code = parseInt(part, 16)
+      if (!isNaN(code) && code !== 0) {
+        string += String.fromCharCode(code)
+      }
+    }
+    return string
+  }
+  const BalanceChange: FC<{
+    data: any
+    label: Boolean
+    type: String
+  }> = ({ data, label, type }) => {
+    const balances = []
+    data.forEach((change, index) => {
+      change.value *= -1
+
+      let balanceLabel =
+        type === 'direct' ? 'recieved' : change.value < 0 ? 'sold' : 'bought'
+      if (type === 'direct') {
+        change.value *= -1
+      }
+      if (!label) {
+        balanceLabel = ''
+      }
+      balances.push(
+        <li key={index}>
+          {balanceLabel} <Amount value={formatAmount(change)} />
+        </li>,
+      )
+    })
+
+    return <ul>{balances}</ul>
+  }
+  // eslint-disable-next-line react/no-unstable-nested-components
+  const Transaction: FC<{ parsed: any; account: Account }> = ({
+    parsed,
+    account,
+  }) => {
+    const changes = []
+    parsed.accountBalanceChanges.forEach((change, index) => {
+      if (account !== change.account) {
+        let type: String = 'direct'
+        if (change.isAMM) {
+          type = 'amm'
+        }
+        if (change.isOffer) {
+          type = 'dex'
+        }
+        if (change.isRippling) {
+          type = 'rippling'
+        }
+        changes.push(
+          <p key={`${index}-p`}>
+            <span>{type}</span> <Account account={change.account} />
+          </p>,
+
+          <BalanceChange
+            key={`${index}-b`}
+            data={change.balances}
+            label={!change.isRippling}
+            type={type}
+          />,
+        )
+      }
+    })
+
+    return <div>{changes}</div>
+  }
+
+  // eslint-disable-next-line react/no-unstable-nested-components
+  const Cylindars: FC<{ parsed: any; account: Account }> = ({
+    parsed,
+    account,
+  }) => {
+    const sum = {
+      amm: 0,
+      rippling: 0,
+      dex: 0,
+      direct: 0,
+      total: 0,
+    }
+    parsed.accountBalanceChanges.forEach((change) => {
+      if (account !== change.account) {
+        change.balances.forEach((balance) => {
+          // if (parsed.sourceAmount.currency === balance.currency) {
+          if (
+            (selectedView === 'source' &&
+              parsed.destinationAmount.currency === balance.currency) ||
+            (selectedView === 'destination' &&
+              parsed.sourceAmount.currency === balance.currency)
+          ) {
+            if (change.isAMM) {
+              sum.amm += balance.value * -1
+              sum.total += balance.value * -1
+            }
+            if (change.isOffer) {
+              sum.dex += balance.value * -1
+              sum.total += balance.value * -1
+            }
+            if (change.isDirect) {
+              sum.direct += balance.value * 1
+              sum.total += balance.value * 1
+            }
+            if (change.isRippling && balance.value * 1 > 0) {
+              sum.rippling +=
+                selectedView === 'destination'
+                  ? balance.value * -1
+                  : balance.value * 1
+            }
+          }
+        })
+      }
+    })
+
+    const NON_STANDARD_CODE_LENGTH = 40
+    const XRP = 'XRP'
+    const LP_TOKEN_IDENTIFIER = '03'
+    const destinationCurrencyCode =
+      parsed.destinationAmount.currency?.length === NON_STANDARD_CODE_LENGTH &&
+      parsed.destinationAmount.currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER
+        ? hexToString(parsed.destinationAmount.currency)
+        : parsed.destinationAmount.currency
+    const sourceCurrencyCode =
+      parsed.sourceAmount.currency?.length === NON_STANDARD_CODE_LENGTH &&
+      parsed.sourceAmount.currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER
+        ? hexToString(parsed.sourceAmount.currency)
+        : parsed.sourceAmount.currency
+
+    return (
+      <div>
+        {/* <h5>
+          AMM: {sum.amm} {(sum.amm / sum.total) * 100}
+        </h5>
+        <h5>
+          RIPPLING: {sum.rippling} {(sum.rippling / sum.total) * 100}
+        </h5>
+        <h5>
+          DEX: {sum.dex} {(sum.dex / sum.total) * 100}
+        </h5>
+        <h5>
+          DIRECT: {sum.direct} {(sum.direct / sum.total) * 100}
+        </h5>
+        <h5>TOTAL: {sum.total}</h5> */}
+
+        <select
+          value={selectedView} // ...force the select's value to match the state variable...
+          onChange={(e) => setView(e.target.value)}
+        >
+          <option value="source">
+            {sourceCurrencyCode} {t('source')}
+          </option>
+          <option value="destination">
+            {destinationCurrencyCode} {t('destination')}
+          </option>
+        </select>
+        <p>{t('graph_dependant_currency')}</p>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: sum.amm / sum.total,
+              ['--cylinder-color' as any]: '#ff198b',
+            }}
+          />
+          <span className="margin-text">
+            AMM ({Math.round((sum.amm / sum.total) * 100)}%)
+          </span>
+        </div>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: sum.rippling / sum.total,
+              ['--cylinder-color' as any]: '#32e685',
+            }}
+          />
+          <span className="margin-text">
+            RIPPLING ({Math.round((sum.rippling / sum.total) * 100)}%)
+          </span>
+        </div>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: sum.dex / sum.total,
+              ['--cylinder-color' as any]: '#19a3ff',
+            }}
+          />
+          <span className="margin-text">
+            DEX ({Math.round((sum.dex / sum.total) * 100)}%)
+          </span>
+        </div>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: sum.direct / sum.total,
+              ['--cylinder-color' as any]: '#9a52ff',
+            }}
+          />
+          <span className="margin-text">
+            DIRECT ({Math.round((sum.direct / sum.total) * 100)}%)
+          </span>
+        </div>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: 1,
+              ['--cylinder-color' as any]: '#faff19',
+            }}
+          />
+          <span className="margin-text">
+            TOTAL{' '}
+            <Amount
+              value={formatAmount(
+                selectedView === 'destination'
+                  ? parsed.sourceAmount
+                  : parsed.destinationAmount,
+              )}
+            />
+          </span>
+        </div>
+      </div>
+    )
+  }
+
+  const renderData = () => {
+    data.tx.meta = data.meta
+    // delete mutate.meta
+    try {
+      const parsed = parsePayment(data.tx)
+      if (
+        parsed.sourceAmount.value === '0' &&
+        data.tx.TransactionType === 'OfferCreate'
+      ) {
+        return <h3>{t('The offer has not crossed anything yet.')}</h3>
+      }
+
+      return (
+        <div className="row">
+          <div className="detail-section">
+            <div className="title">{data.tx.TransactionType}</div>
+            <div>
+              Source: <Account account={parsed.sourceAccount} />
+            </div>
+            <div>
+              <Amount value={formatAmount(parsed.sourceAmount)} />
+            </div>
+            <br />
+            <div>
+              Destination: <Account account={parsed.destinationAccount} />
+            </div>
+            <div>
+              <Amount value={formatAmount(parsed.destinationAmount)} />
+            </div>
+          </div>
+          <div className="detail-section no-border">
+            <div className="title">{t('liquidity_source')}</div>
+            <Cylindars parsed={parsed} account={parsed.sourceAccount} />
+          </div>
+          <div className="detail-section">
+            <div className="title">{t('balance_changes')}</div>
+            <Transaction parsed={parsed} account={parsed.sourceAccount} />
+          </div>
+          {/* <
+          // debug....
+          div className="detail-section">
+            <pre>{JSON.stringify(parsed, null, 2)}</pre>
+          </div> */}
+        </div>
+      )
+    } catch (e) {
+      return <h3>{t('incomplete_transaction')}</h3>
+    }
+  }
+
+  return <div className="breakdown-body">{renderData()}</div>
+}
diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index b5de8319f..22d5161aa 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -9,6 +9,7 @@ import { Tabs } from '../shared/components/Tabs'
 import { NOT_FOUND, BAD_REQUEST, HASH_REGEX, CTID_REGEX } from '../shared/utils'
 import { SimpleTab } from './SimpleTab'
 import { DetailTab } from './DetailTab'
+import { BreakDownTab } from './BreakDownTab'
 import './transaction.scss'
 import { AnalyticsFields, useAnalytics } from '../shared/analytics'
 import SocketContext from '../shared/SocketContext'
@@ -115,6 +116,12 @@ export const Transaction = () => {
 
   function renderTabs() {
     const tabs = ['simple', 'detailed', 'raw']
+    if (
+      data.raw.tx.TransactionType === 'OfferCreate' ||
+      data.raw.tx.TransactionType === 'Payment'
+    ) {
+      tabs.push('breakdown')
+    }
     const mainPath = buildPath(TRANSACTION_ROUTE, { identifier })
     return <Tabs tabs={tabs} selected={tab} path={mainPath} />
   }
@@ -125,6 +132,9 @@ export const Transaction = () => {
     let body
 
     switch (tab) {
+      case 'breakdown':
+        body = <BreakDownTab data={data.raw} />
+        break
       case 'detailed':
         body = <DetailTab data={data.raw} />
         break

From 842cbe75a83ef139ef0a846b6b05fde90f5d7bb9 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Wed, 22 May 2024 12:56:08 -0400
Subject: [PATCH 02/79] color code breakdown and add missing transation labels

---
 public/locales/ca-CA/translations.json        |  6 ++++-
 public/locales/en-US/translations.json        |  6 ++++-
 .../BreakDownTab/breakDownTab.scss            | 24 +++++++++++++++++++
 .../Transactions/BreakDownTab/index.tsx       | 23 ++++++++++++------
 4 files changed, 50 insertions(+), 9 deletions(-)

diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 8c7a11d27..894cfd305 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -527,5 +527,9 @@
   "graph_dependant_currency": "*Graph is dependant on the currency used.",
   "incomplete_transaction": "Incomplete transaction",
   "liquidity_source": "Liquidity Source",
-  "balance_changes": "Balance Changes"
+  "balance_changes": "Balance Changes",
+  "direct": "direct",
+  "dex": "dex",
+  "amm": "amm",
+  "rippling": "rippling"
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index 9af853fcb..ad03d229a 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -527,5 +527,9 @@
   "graph_dependant_currency": "*Graph is dependant on the currency used.",
   "incomplete_transaction": "Incomplete transaction",
   "liquidity_source": "Liquidity Source",
-  "balance_changes": "Balance Changes"
+  "balance_changes": "Balance Changes",
+  "direct": "direct",
+  "dex": "dex",
+  "amm": "amm",
+  "rippling": "rippling"
 }
diff --git a/src/containers/Transactions/BreakDownTab/breakDownTab.scss b/src/containers/Transactions/BreakDownTab/breakDownTab.scss
index 2dd19fa67..16acfc3d3 100644
--- a/src/containers/Transactions/BreakDownTab/breakDownTab.scss
+++ b/src/containers/Transactions/BreakDownTab/breakDownTab.scss
@@ -35,6 +35,30 @@
   }
 }
 
+.badge {
+  padding: 5px;
+  padding-top: 3px;
+  border-radius: 5px;
+  color: $black;
+
+  &.amm {
+    background-color: #ff198b;
+
+  }
+
+  &.dex {
+    background-color: #19a3ff;
+  }
+
+  &.direct {
+    background-color: #9a52ff;
+  }
+
+  &.rippling {
+    background-color: #32e685;
+  }
+}
+
 .flex {
   display: flex;
 }
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index 31decba57..f2ae68ae3 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -63,19 +63,28 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     const changes = []
     parsed.accountBalanceChanges.forEach((change, index) => {
       if (account !== change.account) {
-        let type: String = 'direct'
+        let type: String = ''
+        let span_class: String = ''
+        if (change.isDirect) {
+          type = 'direct'
+          span_class = 'badge direct'
+        }
         if (change.isAMM) {
           type = 'amm'
+          span_class = 'badge amm'
         }
         if (change.isOffer) {
           type = 'dex'
+          span_class = 'badge dex'
         }
         if (change.isRippling) {
           type = 'rippling'
+          span_class = 'badge rippling'
         }
         changes.push(
           <p key={`${index}-p`}>
-            <span>{type}</span> <Account account={change.account} />
+            <span className={span_class}>{type}</span>{' '}
+            <Account account={change.account} />
           </p>,
 
           <BalanceChange
@@ -187,7 +196,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            AMM ({Math.round((sum.amm / sum.total) * 100)}%)
+            {t('amm')} ({Math.round((sum.amm / sum.total) * 100)}%)
           </span>
         </div>
         <div className="rectangle-row">
@@ -199,7 +208,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            RIPPLING ({Math.round((sum.rippling / sum.total) * 100)}%)
+            {t('rippling')} ({Math.round((sum.rippling / sum.total) * 100)}%)
           </span>
         </div>
         <div className="rectangle-row">
@@ -211,7 +220,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            DEX ({Math.round((sum.dex / sum.total) * 100)}%)
+            {t('dex')} ({Math.round((sum.dex / sum.total) * 100)}%)
           </span>
         </div>
         <div className="rectangle-row">
@@ -223,7 +232,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            DIRECT ({Math.round((sum.direct / sum.total) * 100)}%)
+            {t('direct')} ({Math.round((sum.direct / sum.total) * 100)}%)
           </span>
         </div>
         <div className="rectangle-row">
@@ -235,7 +244,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            TOTAL{' '}
+            {t('total')}{' '}
             <Amount
               value={formatAmount(
                 selectedView === 'destination'

From 511f0dc170e08a907e0577ff9b16517d144ddb1d Mon Sep 17 00:00:00 2001
From: Fomo <508629+shortthefomo@users.noreply.github.com>
Date: Wed, 22 May 2024 14:02:00 -0400
Subject: [PATCH 03/79] Update public/locales/ca-CA/translations.json

fix spelling

Co-authored-by: Mayukha Vadari <mvadari@gmail.com>
---
 public/locales/ca-CA/translations.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 894cfd305..601d4ffb8 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -524,7 +524,7 @@
   "indicate_unl": "indica un validador en una UNL",
   "transaction_tokens_involved": "<Currency/> i <Currency2/>",
   "transaction_tokens_swapped": "<Currency/> per <Currency2/>",
-  "graph_dependant_currency": "*Graph is dependant on the currency used.",
+  "graph_dependant_currency": "*Graph is dependent on the currency used.",
   "incomplete_transaction": "Incomplete transaction",
   "liquidity_source": "Liquidity Source",
   "balance_changes": "Balance Changes",

From a453001ab084627b6cb12e854a9701e10620d791 Mon Sep 17 00:00:00 2001
From: Fomo <508629+shortthefomo@users.noreply.github.com>
Date: Wed, 22 May 2024 14:02:35 -0400
Subject: [PATCH 04/79] Update src/containers/Transactions/index.tsx

use of ternary

Co-authored-by: Mayukha Vadari <mvadari@gmail.com>
---
 src/containers/Transactions/index.tsx | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index 22d5161aa..aa884387b 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -115,13 +115,7 @@ export const Transaction = () => {
   }
 
   function renderTabs() {
-    const tabs = ['simple', 'detailed', 'raw']
-    if (
-      data.raw.tx.TransactionType === 'OfferCreate' ||
-      data.raw.tx.TransactionType === 'Payment'
-    ) {
-      tabs.push('breakdown')
-    }
+    const tabs = (data.raw.tx.TransactionType === 'OfferCreate' || data.raw.tx.TransactionType === 'Payment') ? ['simple', 'breakdown', 'detailed', 'raw'] ? ['simple', 'detailed', 'raw']
     const mainPath = buildPath(TRANSACTION_ROUTE, { identifier })
     return <Tabs tabs={tabs} selected={tab} path={mainPath} />
   }

From ba3879469dce65da5ce20ac7cdc18cad19032b21 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Wed, 22 May 2024 14:08:55 -0400
Subject: [PATCH 05/79] missed two more translation labels

---
 public/locales/ca-CA/translations.json             | 6 ++++--
 public/locales/en-US/translations.json             | 6 ++++--
 src/containers/Transactions/BreakDownTab/index.tsx | 8 ++++++--
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 601d4ffb8..5c46543b4 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -524,12 +524,14 @@
   "indicate_unl": "indica un validador en una UNL",
   "transaction_tokens_involved": "<Currency/> i <Currency2/>",
   "transaction_tokens_swapped": "<Currency/> per <Currency2/>",
-  "graph_dependant_currency": "*Graph is dependent on the currency used.",
+  "graph_dependent_currency": "*Graph is dependent on the currency used.",
   "incomplete_transaction": "Incomplete transaction",
   "liquidity_source": "Liquidity Source",
   "balance_changes": "Balance Changes",
   "direct": "direct",
   "dex": "dex",
   "amm": "amm",
-  "rippling": "rippling"
+  "rippling": "rippling",
+  "sold": "sold",
+  "bought": "bought"
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index ad03d229a..7f9bf7403 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -524,12 +524,14 @@
   "indicate_unl": "indicates a validator on an UNL",
   "transaction_tokens_involved": "<Currency/> and <Currency2/>",
   "transaction_tokens_swapped": "<Currency/> for <Currency2/>",
-  "graph_dependant_currency": "*Graph is dependant on the currency used.",
+  "graph_dependent_currency": "*Graph is dependent on the currency used.",
   "incomplete_transaction": "Incomplete transaction",
   "liquidity_source": "Liquidity Source",
   "balance_changes": "Balance Changes",
   "direct": "direct",
   "dex": "dex",
   "amm": "amm",
-  "rippling": "rippling"
+  "rippling": "rippling",
+  "sold": "sold",
+  "bought": "bought"
 }
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index f2ae68ae3..cadfd6791 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -39,7 +39,11 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
       change.value *= -1
 
       let balanceLabel =
-        type === 'direct' ? 'recieved' : change.value < 0 ? 'sold' : 'bought'
+        type === 'direct'
+          ? 'recieved'
+          : change.value < 0
+          ? t('sold')
+          : t('bought')
       if (type === 'direct') {
         change.value *= -1
       }
@@ -186,7 +190,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             {destinationCurrencyCode} {t('destination')}
           </option>
         </select>
-        <p>{t('graph_dependant_currency')}</p>
+        <p>{t('graph_dependent_currency')}</p>
         <div className="rectangle-row">
           <div
             className="rectangle"

From e529f6ca5f38cbb5fb3dbfcada00dab17ca61fc9 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Wed, 22 May 2024 16:38:17 -0400
Subject: [PATCH 06/79] fix turnary

---
 src/containers/Transactions/index.tsx | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index aa884387b..0342dfc75 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -115,7 +115,11 @@ export const Transaction = () => {
   }
 
   function renderTabs() {
-    const tabs = (data.raw.tx.TransactionType === 'OfferCreate' || data.raw.tx.TransactionType === 'Payment') ? ['simple', 'breakdown', 'detailed', 'raw'] ? ['simple', 'detailed', 'raw']
+    const tabs =
+      data.raw.tx.TransactionType === 'OfferCreate' ||
+      data.raw.tx.TransactionType === 'Payment'
+        ? ['simple', 'breakdown', 'detailed', 'raw']
+        : ['simple', 'detailed', 'raw']
     const mainPath = buildPath(TRANSACTION_ROUTE, { identifier })
     return <Tabs tabs={tabs} selected={tab} path={mainPath} />
   }

From 9bc78b812b9b422069f2fd2b5ca46d5c8ec26811 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Thu, 23 May 2024 08:43:30 -0400
Subject: [PATCH 07/79] use non dev version of xrpl-tx-path-parser changes have
 been comitted

---
 package-lock.json                             | 14 +++--
 package.json                                  |  2 +-
 public/locales/ca-CA/translations.json        |  3 +-
 public/locales/en-US/translations.json        |  3 +-
 .../Transactions/BreakDownTab/index.tsx       | 56 ++++++++-----------
 src/containers/Transactions/index.tsx         |  1 +
 .../Transactions/test/Transaction.test.tsx    |  5 +-
 7 files changed, 40 insertions(+), 44 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3d3492750..bd7859205 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
         "@vitejs/plugin-react": "^4.2.1",
         "@xrplf/isomorphic": "^1.0.0-beta.1",
         "@xrplf/prettier-config": "^1.9.1",
+        "@xrplkit/txmeta": "^1.3.1",
         "assert": "^2.1.0",
         "autoprefixer": "^10.4.17",
         "axios": "^1.6.5",
@@ -60,7 +61,7 @@
         "vite-plugin-svgr": "^4.2.0",
         "vite-tsconfig-paths": "^4.2.0",
         "xrpl-client": "^2.1.0",
-        "xrpl-tx-path-parser": "github:shortthefomo/xrpl-tx-path-parser#dev"
+        "xrpl-tx-path-parser": "^1.0.5"
       },
       "devDependencies": {
         "@babel/eslint-parser": "^7.22.6",
@@ -28006,9 +28007,9 @@
       }
     },
     "node_modules/xrpl-tx-path-parser": {
-      "version": "1.0.4",
-      "resolved": "git+ssh://git@github.com/shortthefomo/xrpl-tx-path-parser.git#8f5f4d5bc3bc83c6fffedf9bfe172d5a3c9d1c76",
-      "license": "ISC",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/xrpl-tx-path-parser/-/xrpl-tx-path-parser-1.0.5.tgz",
+      "integrity": "sha512-eQTdv/OKe5MIjOuiYB6FseUtiD8WOqYTmAGfOkHn4DWn233ES/970Yr10QPTrQoWtoA5forroXSiXBse6xxvow==",
       "dependencies": {
         "@xrplkit/txmeta": "^1.3.1",
         "decimal.js": "^10.4.3",
@@ -47030,8 +47031,9 @@
       }
     },
     "xrpl-tx-path-parser": {
-      "version": "git+ssh://git@github.com/shortthefomo/xrpl-tx-path-parser.git#8f5f4d5bc3bc83c6fffedf9bfe172d5a3c9d1c76",
-      "from": "xrpl-tx-path-parser@github:shortthefomo/xrpl-tx-path-parser#dev",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/xrpl-tx-path-parser/-/xrpl-tx-path-parser-1.0.5.tgz",
+      "integrity": "sha512-eQTdv/OKe5MIjOuiYB6FseUtiD8WOqYTmAGfOkHn4DWn233ES/970Yr10QPTrQoWtoA5forroXSiXBse6xxvow==",
       "requires": {
         "@xrplkit/txmeta": "^1.3.1",
         "decimal.js": "^10.4.3",
diff --git a/package.json b/package.json
index 9065f14e3..2cc88639f 100644
--- a/package.json
+++ b/package.json
@@ -55,7 +55,7 @@
     "vite-plugin-svgr": "^4.2.0",
     "vite-tsconfig-paths": "^4.2.0",
     "xrpl-client": "^2.1.0",
-    "xrpl-tx-path-parser": "github:shortthefomo/xrpl-tx-path-parser#dev"
+    "xrpl-tx-path-parser": "^1.0.5"
   },
   "devDependencies": {
     "@babel/eslint-parser": "^7.22.6",
diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 5c46543b4..f063221ed 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -533,5 +533,6 @@
   "amm": "amm",
   "rippling": "rippling",
   "sold": "sold",
-  "bought": "bought"
+  "bought": "bought",
+  "no_cross": "The offer has not crossed anything yet"
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index 7f9bf7403..d846e9368 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -533,5 +533,6 @@
   "amm": "amm",
   "rippling": "rippling",
   "sold": "sold",
-  "bought": "bought"
+  "bought": "bought",
+  "no_cross": "The offer has not crossed anything yet"
 }
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index cadfd6791..3e0e92ce7 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -1,25 +1,17 @@
 import { FC, useState } from 'react'
 import { useTranslation } from 'react-i18next'
-import parsePayment from 'xrpl-tx-path-parser'
+import pathParser from 'xrpl-tx-path-parser'
 import { Account } from '../../shared/components/Account'
 import { Amount } from '../../shared/components/Amount'
 import { formatAmount } from '../../../rippled/lib/txSummary/formatAmount'
-import Currency from '../../shared/components/Currency'
-
 import './breakDownTab.scss'
 
-// import {
-//   createSourceAmount,
-//   createPaymentDefaultPaths,
-//   amountToBalance,
-// } from 'xrpl-tx-path-parser'
-
 export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
   const { t } = useTranslation()
   const [selectedView, setView] = useState('source')
 
   const hexToString = (hex: string) => {
-    let string = ''
+    let string: string = ''
     for (let i = 0; i < hex.length; i += 2) {
       const part = hex.substring(i, i + 2)
       const code = parseInt(part, 16)
@@ -35,24 +27,25 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     type: String
   }> = ({ data, label, type }) => {
     const balances = []
-    data.forEach((change, index) => {
-      change.value *= -1
+    data.forEach((change: any, index: any) => {
+      const amount = change
+      amount.value *= -1
 
-      let balanceLabel =
+      let balanceLabel: string =
         type === 'direct'
           ? 'recieved'
-          : change.value < 0
+          : amount.value < 0
           ? t('sold')
           : t('bought')
       if (type === 'direct') {
-        change.value *= -1
+        amount.value *= -1
       }
       if (!label) {
         balanceLabel = ''
       }
       balances.push(
-        <li key={index}>
-          {balanceLabel} <Amount value={formatAmount(change)} />
+        <li key={String(index)}>
+          {balanceLabel} <Amount value={formatAmount(amount)} />
         </li>,
       )
     })
@@ -60,39 +53,39 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     return <ul>{balances}</ul>
   }
   // eslint-disable-next-line react/no-unstable-nested-components
-  const Transaction: FC<{ parsed: any; account: Account }> = ({
+  const Transaction: FC<{ parsed: any; account: any }> = ({
     parsed,
     account,
   }) => {
     const changes = []
     parsed.accountBalanceChanges.forEach((change, index) => {
       if (account !== change.account) {
-        let type: String = ''
-        let span_class: String = ''
+        let type: string = ''
+        let spanClass: string = ''
         if (change.isDirect) {
           type = 'direct'
-          span_class = 'badge direct'
+          spanClass = 'badge direct'
         }
         if (change.isAMM) {
           type = 'amm'
-          span_class = 'badge amm'
+          spanClass = 'badge amm'
         }
         if (change.isOffer) {
           type = 'dex'
-          span_class = 'badge dex'
+          spanClass = 'badge dex'
         }
         if (change.isRippling) {
           type = 'rippling'
-          span_class = 'badge rippling'
+          spanClass = 'badge rippling'
         }
         changes.push(
-          <p key={`${index}-p`}>
-            <span className={span_class}>{type}</span>{' '}
+          <p key={`${String(index)}-p`}>
+            <span className={spanClass}>{type}</span>{' '}
             <Account account={change.account} />
           </p>,
 
           <BalanceChange
-            key={`${index}-b`}
+            key={`${String(index)}-b`}
             data={change.balances}
             label={!change.isRippling}
             type={type}
@@ -105,7 +98,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
   }
 
   // eslint-disable-next-line react/no-unstable-nested-components
-  const Cylindars: FC<{ parsed: any; account: Account }> = ({
+  const Cylindars: FC<{ parsed: any; account: any }> = ({
     parsed,
     account,
   }) => {
@@ -119,7 +112,6 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     parsed.accountBalanceChanges.forEach((change) => {
       if (account !== change.account) {
         change.balances.forEach((balance) => {
-          // if (parsed.sourceAmount.currency === balance.currency) {
           if (
             (selectedView === 'source' &&
               parsed.destinationAmount.currency === balance.currency) ||
@@ -150,7 +142,6 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     })
 
     const NON_STANDARD_CODE_LENGTH = 40
-    const XRP = 'XRP'
     const LP_TOKEN_IDENTIFIER = '03'
     const destinationCurrencyCode =
       parsed.destinationAmount.currency?.length === NON_STANDARD_CODE_LENGTH &&
@@ -264,14 +255,13 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
 
   const renderData = () => {
     data.tx.meta = data.meta
-    // delete mutate.meta
     try {
-      const parsed = parsePayment(data.tx)
+      const parsed = pathParser(data.tx)
       if (
         parsed.sourceAmount.value === '0' &&
         data.tx.TransactionType === 'OfferCreate'
       ) {
-        return <h3>{t('The offer has not crossed anything yet.')}</h3>
+        return <h3>{t('no_cross')}</h3>
       }
 
       return (
diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index 0342dfc75..3fb30d601 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -116,6 +116,7 @@ export const Transaction = () => {
 
   function renderTabs() {
     const tabs =
+      data === undefined ||
       data.raw.tx.TransactionType === 'OfferCreate' ||
       data.raw.tx.TransactionType === 'Payment'
         ? ['simple', 'breakdown', 'detailed', 'raw']
diff --git a/src/containers/Transactions/test/Transaction.test.tsx b/src/containers/Transactions/test/Transaction.test.tsx
index 774d3da56..cf0a1b388 100644
--- a/src/containers/Transactions/test/Transaction.test.tsx
+++ b/src/containers/Transactions/test/Transaction.test.tsx
@@ -137,8 +137,9 @@ describe('Transaction container', () => {
       expect(wrapper.find('.tabs').length).toBe(1)
       expect(wrapper.find('a.tab').length).toBe(3)
       expect(wrapper.find('a.tab').at(0).props().title).toBe('simple')
-      expect(wrapper.find('a.tab').at(1).props().title).toBe('detailed')
-      expect(wrapper.find('a.tab').at(2).props().title).toBe('raw')
+      expect(wrapper.find('a.tab').at(1).props().title).toBe('breakdown')
+      expect(wrapper.find('a.tab').at(2).props().title).toBe('detailed')
+      expect(wrapper.find('a.tab').at(3).props().title).toBe('raw')
       expect(wrapper.find('a.tab.selected').text()).toEqual('simple')
       wrapper.unmount()
     })

From c8573fbbdc1429c1f74984e84e450c1fecd9c18b Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Fri, 24 May 2024 16:36:38 -0400
Subject: [PATCH 08/79] add testes

---
 package-lock.json                             |  33 +-
 package.json                                  |   2 +
 .../Transactions/BreakDownTab/index.tsx       |  36 +-
 .../Transactions/test/BreakDownTab.test.tsx   |  76 +++
 .../Transactions/test/Transaction.test.tsx    |   2 +-
 .../test/mock_data/PaymentBreakdown.json      | 476 ++++++++++++++++++
 6 files changed, 602 insertions(+), 23 deletions(-)
 create mode 100644 src/containers/Transactions/test/BreakDownTab.test.tsx
 create mode 100644 src/containers/Transactions/test/mock_data/PaymentBreakdown.json

diff --git a/package-lock.json b/package-lock.json
index bd7859205..f39c8ccbe 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
         "@xrplf/isomorphic": "^1.0.0-beta.1",
         "@xrplf/prettier-config": "^1.9.1",
         "@xrplkit/txmeta": "^1.3.1",
+        "@xrplkit/xfl": "^2.1.0",
         "assert": "^2.1.0",
         "autoprefixer": "^10.4.17",
         "axios": "^1.6.5",
@@ -6890,6 +6891,11 @@
         "@xrplkit/xfl": "2.0.2"
       }
     },
+    "node_modules/@xrplkit/amount/node_modules/@xrplkit/xfl": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+      "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+    },
     "node_modules/@xrplkit/txmeta": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/@xrplkit/txmeta/-/txmeta-1.3.1.tgz",
@@ -6899,11 +6905,16 @@
         "@xrplkit/xfl": "2.0.2"
       }
     },
-    "node_modules/@xrplkit/xfl": {
+    "node_modules/@xrplkit/txmeta/node_modules/@xrplkit/xfl": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
       "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
     },
+    "node_modules/@xrplkit/xfl": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.1.0.tgz",
+      "integrity": "sha512-CgRztE77c0hsZ57aPxwQg0vC6gSP/3Hz7cdzUQJSMBTy+b3VK/rGs+rMrmd9CY68jvVyTrhRpq6EgUPDBsywIg=="
+    },
     "node_modules/abab": {
       "version": "2.0.5",
       "dev": true,
@@ -32608,6 +32619,13 @@
       "integrity": "sha512-poV7ym7EhjAlEGym9Kc3AHuy3uuhVW3qnl2KDr8D4zk7hANj7aG6l1XdtWIAGAgBpHnvPEaOG7+llPRRv1irZw==",
       "requires": {
         "@xrplkit/xfl": "2.0.2"
+      },
+      "dependencies": {
+        "@xrplkit/xfl": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+          "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+        }
       }
     },
     "@xrplkit/txmeta": {
@@ -32617,12 +32635,19 @@
       "requires": {
         "@xrplkit/amount": "1.2.3",
         "@xrplkit/xfl": "2.0.2"
+      },
+      "dependencies": {
+        "@xrplkit/xfl": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+          "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+        }
       }
     },
     "@xrplkit/xfl": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
-      "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.1.0.tgz",
+      "integrity": "sha512-CgRztE77c0hsZ57aPxwQg0vC6gSP/3Hz7cdzUQJSMBTy+b3VK/rGs+rMrmd9CY68jvVyTrhRpq6EgUPDBsywIg=="
     },
     "abab": {
       "version": "2.0.5",
diff --git a/package.json b/package.json
index 2cc88639f..de14e9896 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,8 @@
     "@vitejs/plugin-react": "^4.2.1",
     "@xrplf/isomorphic": "^1.0.0-beta.1",
     "@xrplf/prettier-config": "^1.9.1",
+    "@xrplkit/txmeta": "^1.3.1",
+    "@xrplkit/xfl": "^2.1.0",
     "assert": "^2.1.0",
     "autoprefixer": "^10.4.17",
     "axios": "^1.6.5",
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index 3e0e92ce7..338c479ad 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -26,7 +26,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     label: Boolean
     type: String
   }> = ({ data, label, type }) => {
-    const balances = []
+    const balances: string[] = []
     data.forEach((change: any, index: any) => {
       const amount = change
       amount.value *= -1
@@ -43,11 +43,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
       if (!label) {
         balanceLabel = ''
       }
-      balances.push(
-        <li key={String(index)}>
-          {balanceLabel} <Amount value={formatAmount(amount)} />
-        </li>,
-      )
+      balances.push(<li key={String(index)}>{balanceLabel}</li>)
     })
 
     return <ul>{balances}</ul>
@@ -57,7 +53,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     parsed,
     account,
   }) => {
-    const changes = []
+    const changes: string[] = []
     parsed.accountBalanceChanges.forEach((change, index) => {
       if (account !== change.account) {
         let type: string = ''
@@ -254,32 +250,36 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
   }
 
   const renderData = () => {
-    data.tx.meta = data.meta
+    if (data === undefined || data.tx === undefined) {
+      return null
+    }
+
+    const mutated = data
+    mutated.tx.meta = data.meta
     try {
-      const parsed = pathParser(data.tx)
+      const parsed = pathParser(mutated.tx)
       if (
         parsed.sourceAmount.value === '0' &&
-        data.tx.TransactionType === 'OfferCreate'
+        mutated.tx.TransactionType === 'OfferCreate'
       ) {
         return <h3>{t('no_cross')}</h3>
       }
-
       return (
         <div className="row">
           <div className="detail-section">
-            <div className="title">{data.tx.TransactionType}</div>
-            <div>
+            <div className="title">{mutated.tx.TransactionType}</div>
+            <div className="source-account">
               Source: <Account account={parsed.sourceAccount} />
             </div>
-            <div>
-              <Amount value={formatAmount(parsed.sourceAmount)} />
+            <div className="source-amount">
+              <Amount value={formatAmount(parsed.sourceAmount as any)} />
             </div>
             <br />
-            <div>
+            <div className="destination-account">
               Destination: <Account account={parsed.destinationAccount} />
             </div>
-            <div>
-              <Amount value={formatAmount(parsed.destinationAmount)} />
+            <div className="destination-amount">
+              <Amount value={formatAmount(parsed.destinationAmount as any)} />
             </div>
           </div>
           <div className="detail-section no-border">
diff --git a/src/containers/Transactions/test/BreakDownTab.test.tsx b/src/containers/Transactions/test/BreakDownTab.test.tsx
new file mode 100644
index 000000000..0a0f829d4
--- /dev/null
+++ b/src/containers/Transactions/test/BreakDownTab.test.tsx
@@ -0,0 +1,76 @@
+import { mount } from 'enzyme'
+import { I18nextProvider } from 'react-i18next'
+import { BrowserRouter as Router } from 'react-router-dom'
+
+import EnableAmendment from './mock_data/EnableAmendment.json'
+import Payment from './mock_data/PaymentBreakdown.json'
+import { BreakDownTab } from '../BreakDownTab'
+import i18n from '../../../i18n/testConfig'
+
+describe('BreakdownTab container', () => {
+  const createWrapper = (tx) =>
+    mount(
+      <Router>
+        <I18nextProvider i18n={i18n}>
+          <BreakDownTab data={tx} />
+        </I18nextProvider>
+      </Router>,
+    )
+
+  it('renders EnableAmendment without crashing', () => {
+    const wrapper = createWrapper(EnableAmendment)
+    wrapper.unmount()
+  })
+
+  it('renders breakdown tab information', () => {
+    const wrapper = createWrapper(Payment)
+
+    console.log(Payment)
+
+    expect(wrapper.find('.breakdown-body').length).toBe(1)
+    expect(wrapper.find('.detail-section').length).toBe(3)
+
+    expect(wrapper.find('.source-account').length).toBe(1)
+    expect(wrapper.find('.source-amount').length).toBe(1)
+    expect(wrapper.find('.destination-account').length).toBe(1)
+    expect(wrapper.find('.destination-amount').length).toBe(1)
+
+    expect(
+      wrapper.contains(<div className="title">liquidity_source</div>),
+    ).toBe(true)
+
+    expect(wrapper.contains(<option value="source">USD source</option>)).toBe(
+      true,
+    )
+    expect(
+      wrapper.contains(<option value="destination">XRP destination</option>),
+    ).toBe(true)
+
+    expect(wrapper.contains(<p>graph_dependent_currency</p>)).toBe(true)
+
+    expect(
+      wrapper.contains(<span className="margin-text">amm (98%)</span>),
+    ).toBe(true)
+    expect(
+      wrapper.contains(<span className="margin-text">rippling (0%)</span>),
+    ).toBe(true)
+    expect(
+      wrapper.contains(<span className="margin-text">dex (2%)</span>),
+    ).toBe(true)
+    expect(
+      wrapper.contains(<span className="margin-text">direct (0%)</span>),
+    ).toBe(true)
+
+    expect(wrapper.contains(<div className="title">balance_changes</div>)).toBe(
+      true,
+    )
+    expect(wrapper.contains(<span className="badge dex">dex</span>)).toBe(true)
+    expect(
+      wrapper.contains(<span className="badge rippling">rippling</span>),
+    ).toBe(true)
+    expect(wrapper.contains(<span className="badge amm">amm</span>)).toBe(true)
+
+    console.log(wrapper.debug())
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/Transactions/test/Transaction.test.tsx b/src/containers/Transactions/test/Transaction.test.tsx
index cf0a1b388..6f65b23e5 100644
--- a/src/containers/Transactions/test/Transaction.test.tsx
+++ b/src/containers/Transactions/test/Transaction.test.tsx
@@ -135,7 +135,7 @@ describe('Transaction container', () => {
       )
       expect(summary.contains(<TxStatus status="tesSUCCESS" />)).toBe(true)
       expect(wrapper.find('.tabs').length).toBe(1)
-      expect(wrapper.find('a.tab').length).toBe(3)
+      expect(wrapper.find('a.tab').length).toBe(4)
       expect(wrapper.find('a.tab').at(0).props().title).toBe('simple')
       expect(wrapper.find('a.tab').at(1).props().title).toBe('breakdown')
       expect(wrapper.find('a.tab').at(2).props().title).toBe('detailed')
diff --git a/src/containers/Transactions/test/mock_data/PaymentBreakdown.json b/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
new file mode 100644
index 000000000..0c7223914
--- /dev/null
+++ b/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
@@ -0,0 +1,476 @@
+{
+  "hash": "9D6DC95E7B95F7302EBF711F9384B51666E3D98D5B177A6EF0C0250D7F3410D2",
+  "ledger_index": 88213902,
+  "date": 1716575361000,
+  "tx": {
+    "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+    "Amount": "149343627",
+    "DeliverMax": "149343627",
+    "DeliverMin": "146356755",
+    "Destination": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+    "Fee": "12",
+    "Flags": 131072,
+    "LastLedgerSequence": 88213910,
+    "Memos": [
+      {
+        "Memo": {
+          "MemoData": "5472616E73616374696F6E20696E6974696174656420627920786D61676E657469632E6F7267"
+        }
+      }
+    ],
+    "SendMax": {
+      "currency": "USD",
+      "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+      "value": "79.6770766125"
+    },
+    "Sequence": 88196798,
+    "SigningPubKey": "021738EBB3F528A186919463A8B4C31BADDE35B579B1F2F86DF4383547AE7865C9",
+    "SourceTag": 10011010,
+    "TransactionType": "Payment",
+    "TxnSignature": "304402205B749EEE748F7EB49BBA734558ADB257FB83B60C7224A7B6CAD9C910619486F202206EE3C12787A085AEFADC6E053824562A48DB2072E5F19D57C6D41415A5DBE5FB",
+    "ctid": "C542098E000D0000",
+    "date": 1716575361000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": {
+      "AffectedNodes": [
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+              "Balance": "56685726",
+              "Flags": 0,
+              "OwnerCount": 13,
+              "Sequence": 75621582
+            },
+            "LedgerEntryType": "AccountRoot",
+            "LedgerIndex": "13CD16752E004F76B468237B2F44DA9CFCA143A28C8EB6686D6A05695C8C3F7B",
+            "PreviousFields": { "Balance": "59581035", "OwnerCount": 14 },
+            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+            "PreviousTxnLgrSeq": 88213895
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+              "Balance": "6284089037",
+              "Flags": 0,
+              "OwnerCount": 4,
+              "Sequence": 88196799
+            },
+            "LedgerEntryType": "AccountRoot",
+            "LedgerIndex": "181A3BAD298B55A47F4F9A0247D638F33BFF7DEDC7A1ECD1392C2ADF9A3F46C9",
+            "PreviousFields": { "Balance": "6134969072", "Sequence": 88196798 },
+            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+            "PreviousTxnLgrSeq": 88213878
+          }
+        },
+        {
+          "DeletedNode": {
+            "FinalFields": {
+              "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+              "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
+              "BookNode": "0",
+              "Flags": 0,
+              "OwnerNode": "0",
+              "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+              "PreviousTxnLgrSeq": 88213895,
+              "Sequence": 75621581,
+              "TakerGets": "0",
+              "TakerPays": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "0"
+              }
+            },
+            "LedgerEntryType": "Offer",
+            "LedgerIndex": "6AB7F7F338C9FFF65323CCAEF7E38FE93D45D6F67E0ABF11822216D1A90DF89E",
+            "PreviousFields": {
+              "TakerGets": "2895309",
+              "TakerPays": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "1.543863643330838"
+              }
+            }
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-222732.5928364204"
+              },
+              "Flags": 16908288,
+              "HighLimit": {
+                "currency": "USD",
+                "issuer": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
+                "value": "0"
+              },
+              "HighNode": "0",
+              "LowLimit": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "0"
+              },
+              "LowNode": "bd7"
+            },
+            "LedgerEntryType": "RippleState",
+            "LedgerIndex": "832F2523220A304ECEB7B2AE3E0D30829ACBCA0A31722FA8D952CC5BE7D9478B",
+            "PreviousFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-222654.5789600612"
+              }
+            },
+            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+            "PreviousTxnLgrSeq": 88213878
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "AMMID": "EF95AD04AF97DF0DD76C5C624F93EF6F5479CDF8F30FAE612F1D434B5D6A914B",
+              "Account": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
+              "Balance": "417539550052",
+              "Flags": 26214400,
+              "OwnerCount": 1,
+              "Sequence": 86795414
+            },
+            "LedgerEntryType": "AccountRoot",
+            "LedgerIndex": "B21B05E69AFB3F98B8D6F8066A69C4B189F3D804D8BE896AE11E60189AAFAD51",
+            "PreviousFields": { "Balance": "417685774720" },
+            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+            "PreviousTxnLgrSeq": 88213878
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-15.22762820406059"
+              },
+              "Flags": 2228224,
+              "HighLimit": {
+                "currency": "USD",
+                "issuer": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+                "value": "1000000000"
+              },
+              "HighNode": "0",
+              "LowLimit": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "0"
+              },
+              "LowNode": "b09"
+            },
+            "LedgerEntryType": "RippleState",
+            "LedgerIndex": "CFCB7153408413FDB9A4B5AD3530680442200FA6F620711A80567DD1A965FD96",
+            "PreviousFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-13.68376456072975"
+              }
+            },
+            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+            "PreviousTxnLgrSeq": 88213895
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Flags": 0,
+              "Owner": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+              "RootIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
+            },
+            "LedgerEntryType": "DirectoryNode",
+            "LedgerIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-6450000000000000e-26"
+              },
+              "Flags": 2228224,
+              "HighLimit": {
+                "currency": "USD",
+                "issuer": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+                "value": "0"
+              },
+              "HighNode": "0",
+              "LowLimit": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "0"
+              },
+              "LowNode": "bea"
+            },
+            "LedgerEntryType": "RippleState",
+            "LedgerIndex": "DE51B19CCC570DB23F7A831943C8D874FB1928E513EC88090A543E32340AE813",
+            "PreviousFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-79.6770766125645"
+              }
+            },
+            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+            "PreviousTxnLgrSeq": 88213878
+          }
+        },
+        {
+          "DeletedNode": {
+            "FinalFields": {
+              "ExchangeRate": "4e12f1b0ae6a0fb3",
+              "Flags": 0,
+              "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
+              "TakerGetsCurrency": "0000000000000000000000000000000000000000",
+              "TakerGetsIssuer": "0000000000000000000000000000000000000000",
+              "TakerPaysCurrency": "0000000000000000000000005553440000000000",
+              "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1"
+            },
+            "LedgerEntryType": "DirectoryNode",
+            "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3"
+          }
+        }
+      ],
+      "DeliveredAmount": "149119977",
+      "TransactionIndex": 13,
+      "TransactionResult": "tesSUCCESS",
+      "delivered_amount": "149119977"
+    },
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+            "Balance": "56685726",
+            "Flags": 0,
+            "OwnerCount": 13,
+            "Sequence": 75621582
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "13CD16752E004F76B468237B2F44DA9CFCA143A28C8EB6686D6A05695C8C3F7B",
+          "PreviousFields": { "Balance": "59581035", "OwnerCount": 14 },
+          "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+          "PreviousTxnLgrSeq": 88213895
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+            "Balance": "6284089037",
+            "Flags": 0,
+            "OwnerCount": 4,
+            "Sequence": 88196799
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "181A3BAD298B55A47F4F9A0247D638F33BFF7DEDC7A1ECD1392C2ADF9A3F46C9",
+          "PreviousFields": { "Balance": "6134969072", "Sequence": 88196798 },
+          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+          "PreviousTxnLgrSeq": 88213878
+        }
+      },
+      {
+        "DeletedNode": {
+          "FinalFields": {
+            "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+            "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
+            "BookNode": "0",
+            "Flags": 0,
+            "OwnerNode": "0",
+            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+            "PreviousTxnLgrSeq": 88213895,
+            "Sequence": 75621581,
+            "TakerGets": "0",
+            "TakerPays": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "0"
+            }
+          },
+          "LedgerEntryType": "Offer",
+          "LedgerIndex": "6AB7F7F338C9FFF65323CCAEF7E38FE93D45D6F67E0ABF11822216D1A90DF89E",
+          "PreviousFields": {
+            "TakerGets": "2895309",
+            "TakerPays": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "1.543863643330838"
+            }
+          }
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-222732.5928364204"
+            },
+            "Flags": 16908288,
+            "HighLimit": {
+              "currency": "USD",
+              "issuer": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
+              "value": "0"
+            },
+            "HighNode": "0",
+            "LowLimit": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "0"
+            },
+            "LowNode": "bd7"
+          },
+          "LedgerEntryType": "RippleState",
+          "LedgerIndex": "832F2523220A304ECEB7B2AE3E0D30829ACBCA0A31722FA8D952CC5BE7D9478B",
+          "PreviousFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-222654.5789600612"
+            }
+          },
+          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+          "PreviousTxnLgrSeq": 88213878
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "AMMID": "EF95AD04AF97DF0DD76C5C624F93EF6F5479CDF8F30FAE612F1D434B5D6A914B",
+            "Account": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
+            "Balance": "417539550052",
+            "Flags": 26214400,
+            "OwnerCount": 1,
+            "Sequence": 86795414
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "B21B05E69AFB3F98B8D6F8066A69C4B189F3D804D8BE896AE11E60189AAFAD51",
+          "PreviousFields": { "Balance": "417685774720" },
+          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+          "PreviousTxnLgrSeq": 88213878
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-15.22762820406059"
+            },
+            "Flags": 2228224,
+            "HighLimit": {
+              "currency": "USD",
+              "issuer": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+              "value": "1000000000"
+            },
+            "HighNode": "0",
+            "LowLimit": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "0"
+            },
+            "LowNode": "b09"
+          },
+          "LedgerEntryType": "RippleState",
+          "LedgerIndex": "CFCB7153408413FDB9A4B5AD3530680442200FA6F620711A80567DD1A965FD96",
+          "PreviousFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-13.68376456072975"
+            }
+          },
+          "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+          "PreviousTxnLgrSeq": 88213895
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Flags": 0,
+            "Owner": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+            "RootIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
+          },
+          "LedgerEntryType": "DirectoryNode",
+          "LedgerIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-6450000000000000e-26"
+            },
+            "Flags": 2228224,
+            "HighLimit": {
+              "currency": "USD",
+              "issuer": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+              "value": "0"
+            },
+            "HighNode": "0",
+            "LowLimit": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "0"
+            },
+            "LowNode": "bea"
+          },
+          "LedgerEntryType": "RippleState",
+          "LedgerIndex": "DE51B19CCC570DB23F7A831943C8D874FB1928E513EC88090A543E32340AE813",
+          "PreviousFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-79.6770766125645"
+            }
+          },
+          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+          "PreviousTxnLgrSeq": 88213878
+        }
+      },
+      {
+        "DeletedNode": {
+          "FinalFields": {
+            "ExchangeRate": "4e12f1b0ae6a0fb3",
+            "Flags": 0,
+            "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
+            "TakerGetsCurrency": "0000000000000000000000000000000000000000",
+            "TakerGetsIssuer": "0000000000000000000000000000000000000000",
+            "TakerPaysCurrency": "0000000000000000000000005553440000000000",
+            "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1"
+          },
+          "LedgerEntryType": "DirectoryNode",
+          "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3"
+        }
+      }
+    ],
+    "DeliveredAmount": "149119977",
+    "TransactionIndex": 13,
+    "TransactionResult": "tesSUCCESS",
+    "delivered_amount": "149119977"
+  }
+}

From 4468cfa79d66f92a5f2576d00b4be57364f166a6 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Fri, 24 May 2024 16:45:42 -0400
Subject: [PATCH 09/79] remove debug

---
 src/containers/Transactions/test/BreakDownTab.test.tsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/containers/Transactions/test/BreakDownTab.test.tsx b/src/containers/Transactions/test/BreakDownTab.test.tsx
index 0a0f829d4..4505cf561 100644
--- a/src/containers/Transactions/test/BreakDownTab.test.tsx
+++ b/src/containers/Transactions/test/BreakDownTab.test.tsx
@@ -25,7 +25,7 @@ describe('BreakdownTab container', () => {
   it('renders breakdown tab information', () => {
     const wrapper = createWrapper(Payment)
 
-    console.log(Payment)
+    // console.log(Payment)
 
     expect(wrapper.find('.breakdown-body').length).toBe(1)
     expect(wrapper.find('.detail-section').length).toBe(3)
@@ -70,7 +70,7 @@ describe('BreakdownTab container', () => {
     ).toBe(true)
     expect(wrapper.contains(<span className="badge amm">amm</span>)).toBe(true)
 
-    console.log(wrapper.debug())
+    // console.log(wrapper.debug())
     wrapper.unmount()
   })
 })

From 317314524fc1cdb5eab417095eacb8d23c3ee82b Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Fri, 24 May 2024 16:59:19 -0400
Subject: [PATCH 10/79] revert unwanted change

---
 src/containers/Transactions/BreakDownTab/index.tsx | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index 338c479ad..126b5e57c 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -43,7 +43,11 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
       if (!label) {
         balanceLabel = ''
       }
-      balances.push(<li key={String(index)}>{balanceLabel}</li>)
+      balances.push(
+        <li key={String(index)}>
+          {balanceLabel} <Amount value={formatAmount(amount)} />
+        </li>,
+      )
     })
 
     return <ul>{balances}</ul>

From 0a7c68dd787311694465c847f1d96a2bb41d8934 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Fri, 24 May 2024 18:37:27 -0400
Subject: [PATCH 11/79] more test

---
 .../Transactions/BreakDownTab/index.tsx       |   6 +-
 .../Transactions/test/BreakDownTab.test.tsx   |  37 +-
 .../test/mock_data/PaymentBreakdown.json      | 466 ++++++------------
 3 files changed, 173 insertions(+), 336 deletions(-)

diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index 126b5e57c..697caaa14 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -45,7 +45,8 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
       }
       balances.push(
         <li key={String(index)}>
-          {balanceLabel} <Amount value={formatAmount(amount)} />
+          {balanceLabel}{' '}
+          <Amount change_type={type} value={formatAmount(amount)} />
         </li>,
       )
     })
@@ -290,7 +291,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             <div className="title">{t('liquidity_source')}</div>
             <Cylindars parsed={parsed} account={parsed.sourceAccount} />
           </div>
-          <div className="detail-section">
+          <div className="detail-section balance-changes">
             <div className="title">{t('balance_changes')}</div>
             <Transaction parsed={parsed} account={parsed.sourceAccount} />
           </div>
@@ -302,6 +303,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
         </div>
       )
     } catch (e) {
+      // console.log(e)
       return <h3>{t('incomplete_transaction')}</h3>
     }
   }
diff --git a/src/containers/Transactions/test/BreakDownTab.test.tsx b/src/containers/Transactions/test/BreakDownTab.test.tsx
index 4505cf561..928f7ddf7 100644
--- a/src/containers/Transactions/test/BreakDownTab.test.tsx
+++ b/src/containers/Transactions/test/BreakDownTab.test.tsx
@@ -39,23 +39,23 @@ describe('BreakdownTab container', () => {
       wrapper.contains(<div className="title">liquidity_source</div>),
     ).toBe(true)
 
-    expect(wrapper.contains(<option value="source">USD source</option>)).toBe(
+    expect(wrapper.contains(<option value="source">XRP source</option>)).toBe(
       true,
     )
     expect(
-      wrapper.contains(<option value="destination">XRP destination</option>),
+      wrapper.contains(<option value="destination">USDC destination</option>),
     ).toBe(true)
 
     expect(wrapper.contains(<p>graph_dependent_currency</p>)).toBe(true)
 
     expect(
-      wrapper.contains(<span className="margin-text">amm (98%)</span>),
+      wrapper.contains(<span className="margin-text">amm (100%)</span>),
     ).toBe(true)
     expect(
-      wrapper.contains(<span className="margin-text">rippling (0%)</span>),
+      wrapper.contains(<span className="margin-text">rippling (100%)</span>),
     ).toBe(true)
     expect(
-      wrapper.contains(<span className="margin-text">dex (2%)</span>),
+      wrapper.contains(<span className="margin-text">dex (0%)</span>),
     ).toBe(true)
     expect(
       wrapper.contains(<span className="margin-text">direct (0%)</span>),
@@ -64,13 +64,38 @@ describe('BreakdownTab container', () => {
     expect(wrapper.contains(<div className="title">balance_changes</div>)).toBe(
       true,
     )
-    expect(wrapper.contains(<span className="badge dex">dex</span>)).toBe(true)
+
+    expect(wrapper.contains(<span className="badge dex">dex</span>)).toBe(false)
+    expect(wrapper.contains(<span className="badge dex">direct</span>)).toBe(
+      false,
+    )
     expect(
       wrapper.contains(<span className="badge rippling">rippling</span>),
     ).toBe(true)
     expect(wrapper.contains(<span className="badge amm">amm</span>)).toBe(true)
 
+    const balanceChanges = wrapper.find('.balance-changes')
+    expect(balanceChanges.find('BalanceChange')).toHaveLength(2)
     // console.log(wrapper.debug())
+
+    expect(
+      balanceChanges.contains(
+        <span className="amount-localized">26.79746261</span>,
+      ),
+    ).toBe(true)
+    expect(
+      balanceChanges.contains(
+        <span className="amount-localized">-26.877855</span>,
+      ),
+    ).toBe(true)
+    expect(
+      balanceChanges.contains(
+        <span className="amount-localized">-50.624692</span>,
+      ),
+    ).toBe(true)
+
     wrapper.unmount()
   })
+
+  // console.log(balanceChanges.debug())
 })
diff --git a/src/containers/Transactions/test/mock_data/PaymentBreakdown.json b/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
index 0c7223914..6336382c0 100644
--- a/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
+++ b/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
@@ -1,35 +1,40 @@
 {
-  "hash": "9D6DC95E7B95F7302EBF711F9384B51666E3D98D5B177A6EF0C0250D7F3410D2",
-  "ledger_index": 88213902,
-  "date": 1716575361000,
   "tx": {
-    "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
-    "Amount": "149343627",
-    "DeliverMax": "149343627",
-    "DeliverMin": "146356755",
-    "Destination": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+    "Account": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+    "Amount": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "1000000000000000e2"
+    },
+    "DeliverMax": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "1000000000000000e2"
+    },
+    "DeliverMin": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "25.639817695"
+    },
+    "Destination": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
     "Fee": "12",
     "Flags": 131072,
-    "LastLedgerSequence": 88213910,
+    "LastLedgerSequence": 88214940,
     "Memos": [
       {
         "Memo": {
-          "MemoData": "5472616E73616374696F6E20696E6974696174656420627920786D61676E657469632E6F7267"
+          "MemoData": "53574150205472616E73616374696F6E20696E69746961746564207669612058506D61726B65742E636F6D"
         }
       }
     ],
-    "SendMax": {
-      "currency": "USD",
-      "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-      "value": "79.6770766125"
-    },
-    "Sequence": 88196798,
-    "SigningPubKey": "021738EBB3F528A186919463A8B4C31BADDE35B579B1F2F86DF4383547AE7865C9",
-    "SourceTag": 10011010,
+    "SendMax": "50624692",
+    "Sequence": 88214147,
+    "SigningPubKey": "02F00DADAD94C694359D9FB84163D390CDC418BDA6313A139945C09D2277B39B55",
+    "SourceTag": 20221212,
     "TransactionType": "Payment",
-    "TxnSignature": "304402205B749EEE748F7EB49BBA734558ADB257FB83B60C7224A7B6CAD9C910619486F202206EE3C12787A085AEFADC6E053824562A48DB2072E5F19D57C6D41415A5DBE5FB",
-    "ctid": "C542098E000D0000",
-    "date": 1716575361000,
+    "TxnSignature": "30450221009510B1D5C84A82D870C2827F6A82E6E8AE930778A75D2623D1E8D8280368D6D602207B74F93375275265AB59988748DD1D34F758960EE8FEE5C572A8E84A71205C0F",
+    "ctid": "C5420D9400120000",
+    "date": 1716579292000,
     "hash": "undefined",
     "inLedger": "undefined",
     "ledger_index": "undefined",
@@ -38,218 +43,119 @@
         {
           "ModifiedNode": {
             "FinalFields": {
-              "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-              "Balance": "56685726",
+              "Account": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+              "Balance": "15877383",
               "Flags": 0,
-              "OwnerCount": 13,
-              "Sequence": 75621582
+              "OwnerCount": 1,
+              "Sequence": 88214148
             },
             "LedgerEntryType": "AccountRoot",
-            "LedgerIndex": "13CD16752E004F76B468237B2F44DA9CFCA143A28C8EB6686D6A05695C8C3F7B",
-            "PreviousFields": { "Balance": "59581035", "OwnerCount": 14 },
-            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-            "PreviousTxnLgrSeq": 88213895
-          }
-        },
-        {
-          "ModifiedNode": {
-            "FinalFields": {
-              "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
-              "Balance": "6284089037",
-              "Flags": 0,
-              "OwnerCount": 4,
-              "Sequence": 88196799
-            },
-            "LedgerEntryType": "AccountRoot",
-            "LedgerIndex": "181A3BAD298B55A47F4F9A0247D638F33BFF7DEDC7A1ECD1392C2ADF9A3F46C9",
-            "PreviousFields": { "Balance": "6134969072", "Sequence": 88196798 },
-            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-            "PreviousTxnLgrSeq": 88213878
-          }
-        },
-        {
-          "DeletedNode": {
-            "FinalFields": {
-              "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-              "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
-              "BookNode": "0",
-              "Flags": 0,
-              "OwnerNode": "0",
-              "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-              "PreviousTxnLgrSeq": 88213895,
-              "Sequence": 75621581,
-              "TakerGets": "0",
-              "TakerPays": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-                "value": "0"
-              }
-            },
-            "LedgerEntryType": "Offer",
-            "LedgerIndex": "6AB7F7F338C9FFF65323CCAEF7E38FE93D45D6F67E0ABF11822216D1A90DF89E",
-            "PreviousFields": {
-              "TakerGets": "2895309",
-              "TakerPays": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-                "value": "1.543863643330838"
-              }
-            }
+            "LedgerIndex": "4ACE281E26640B951CB4A23768CA6C7E1B0F602053B3C86A653847FE5A5AA1ED",
+            "PreviousFields": { "Balance": "66502087", "Sequence": 88214147 },
+            "PreviousTxnID": "6947EB21D0A745A96F9B2F9B5BABFFE43CE66AF8488365DBC112BC38F8FAC0EA",
+            "PreviousTxnLgrSeq": 88214779
           }
         },
         {
           "ModifiedNode": {
             "FinalFields": {
               "Balance": {
-                "currency": "USD",
+                "currency": "5553444300000000000000000000000000000000",
                 "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-222732.5928364204"
+                "value": "-26.79746261485543"
               },
-              "Flags": 16908288,
+              "Flags": 2228224,
               "HighLimit": {
-                "currency": "USD",
-                "issuer": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
-                "value": "0"
+                "currency": "5553444300000000000000000000000000000000",
+                "issuer": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+                "value": "775905"
               },
               "HighNode": "0",
               "LowLimit": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "currency": "5553444300000000000000000000000000000000",
+                "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
                 "value": "0"
               },
-              "LowNode": "bd7"
+              "LowNode": "14f"
             },
             "LedgerEntryType": "RippleState",
-            "LedgerIndex": "832F2523220A304ECEB7B2AE3E0D30829ACBCA0A31722FA8D952CC5BE7D9478B",
+            "LedgerIndex": "5F1DFBA426DB53A57ECEFE3EAEB804107DA1B899D4A90C794E577E5082D7C125",
             "PreviousFields": {
               "Balance": {
-                "currency": "USD",
+                "currency": "5553444300000000000000000000000000000000",
                 "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-222654.5789600612"
+                "value": "0"
               }
             },
-            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-            "PreviousTxnLgrSeq": 88213878
+            "PreviousTxnID": "6947EB21D0A745A96F9B2F9B5BABFFE43CE66AF8488365DBC112BC38F8FAC0EA",
+            "PreviousTxnLgrSeq": 88214779
           }
         },
         {
           "ModifiedNode": {
             "FinalFields": {
-              "AMMID": "EF95AD04AF97DF0DD76C5C624F93EF6F5479CDF8F30FAE612F1D434B5D6A914B",
-              "Account": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
-              "Balance": "417539550052",
+              "AMMID": "383669860F36CDD7BF543C0711DD523E35F60ACA22C8AAD8FDDBB2632C4C5821",
+              "Account": "rGHt6LT5v9DVaEAmFzj5ciuxuj41ZjLofs",
+              "Balance": "534441055888",
               "Flags": 26214400,
               "OwnerCount": 1,
-              "Sequence": 86795414
+              "Sequence": 86795379
             },
             "LedgerEntryType": "AccountRoot",
-            "LedgerIndex": "B21B05E69AFB3F98B8D6F8066A69C4B189F3D804D8BE896AE11E60189AAFAD51",
-            "PreviousFields": { "Balance": "417685774720" },
-            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-            "PreviousTxnLgrSeq": 88213878
+            "LedgerIndex": "AEAC617A4934A4E1029581A159AF8EB3356E4DE3C52324D9D5A73C00B8828BCF",
+            "PreviousFields": { "Balance": "534390431196" },
+            "PreviousTxnID": "1FADA966F7F1E8465E17DE2F83216663BE8360B172AC3A0D13FC81757C64AC42",
+            "PreviousTxnLgrSeq": 88214747
           }
         },
         {
           "ModifiedNode": {
             "FinalFields": {
               "Balance": {
-                "currency": "USD",
+                "currency": "5553444300000000000000000000000000000000",
                 "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-15.22762820406059"
-              },
-              "Flags": 2228224,
-              "HighLimit": {
-                "currency": "USD",
-                "issuer": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-                "value": "1000000000"
+                "value": "-284983.085646821"
               },
-              "HighNode": "0",
-              "LowLimit": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-                "value": "0"
-              },
-              "LowNode": "b09"
-            },
-            "LedgerEntryType": "RippleState",
-            "LedgerIndex": "CFCB7153408413FDB9A4B5AD3530680442200FA6F620711A80567DD1A965FD96",
-            "PreviousFields": {
-              "Balance": {
-                "currency": "USD",
-                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-13.68376456072975"
-              }
-            },
-            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-            "PreviousTxnLgrSeq": 88213895
-          }
-        },
-        {
-          "ModifiedNode": {
-            "FinalFields": {
-              "Flags": 0,
-              "Owner": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-              "RootIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
-            },
-            "LedgerEntryType": "DirectoryNode",
-            "LedgerIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
-          }
-        },
-        {
-          "ModifiedNode": {
-            "FinalFields": {
-              "Balance": {
-                "currency": "USD",
-                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-6450000000000000e-26"
-              },
-              "Flags": 2228224,
+              "Flags": 16908288,
               "HighLimit": {
-                "currency": "USD",
-                "issuer": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+                "currency": "5553444300000000000000000000000000000000",
+                "issuer": "rGHt6LT5v9DVaEAmFzj5ciuxuj41ZjLofs",
                 "value": "0"
               },
               "HighNode": "0",
               "LowLimit": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "currency": "5553444300000000000000000000000000000000",
+                "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
                 "value": "0"
               },
-              "LowNode": "bea"
+              "LowNode": "10a"
             },
             "LedgerEntryType": "RippleState",
-            "LedgerIndex": "DE51B19CCC570DB23F7A831943C8D874FB1928E513EC88090A543E32340AE813",
+            "LedgerIndex": "CDE55A8290DF221A643F51798BE6294A69384066D1ECFB7C2B9BEE2004B38D63",
             "PreviousFields": {
               "Balance": {
-                "currency": "USD",
+                "currency": "5553444300000000000000000000000000000000",
                 "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-79.6770766125645"
+                "value": "-285009.9635018237"
               }
             },
-            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-            "PreviousTxnLgrSeq": 88213878
-          }
-        },
-        {
-          "DeletedNode": {
-            "FinalFields": {
-              "ExchangeRate": "4e12f1b0ae6a0fb3",
-              "Flags": 0,
-              "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
-              "TakerGetsCurrency": "0000000000000000000000000000000000000000",
-              "TakerGetsIssuer": "0000000000000000000000000000000000000000",
-              "TakerPaysCurrency": "0000000000000000000000005553440000000000",
-              "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1"
-            },
-            "LedgerEntryType": "DirectoryNode",
-            "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3"
+            "PreviousTxnID": "1FADA966F7F1E8465E17DE2F83216663BE8360B172AC3A0D13FC81757C64AC42",
+            "PreviousTxnLgrSeq": 88214747
           }
         }
       ],
-      "DeliveredAmount": "149119977",
-      "TransactionIndex": 13,
+      "DeliveredAmount": {
+        "currency": "5553444300000000000000000000000000000000",
+        "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+        "value": "26.79746261485543"
+      },
+      "TransactionIndex": 18,
       "TransactionResult": "tesSUCCESS",
-      "delivered_amount": "149119977"
+      "delivered_amount": {
+        "currency": "5553444300000000000000000000000000000000",
+        "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+        "value": "26.79746261485543"
+      }
     },
     "validated": "undefined",
     "metaData": "undefined",
@@ -260,217 +166,121 @@
       {
         "ModifiedNode": {
           "FinalFields": {
-            "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-            "Balance": "56685726",
+            "Account": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+            "Balance": "15877383",
             "Flags": 0,
-            "OwnerCount": 13,
-            "Sequence": 75621582
+            "OwnerCount": 1,
+            "Sequence": 88214148
           },
           "LedgerEntryType": "AccountRoot",
-          "LedgerIndex": "13CD16752E004F76B468237B2F44DA9CFCA143A28C8EB6686D6A05695C8C3F7B",
-          "PreviousFields": { "Balance": "59581035", "OwnerCount": 14 },
-          "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-          "PreviousTxnLgrSeq": 88213895
-        }
-      },
-      {
-        "ModifiedNode": {
-          "FinalFields": {
-            "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
-            "Balance": "6284089037",
-            "Flags": 0,
-            "OwnerCount": 4,
-            "Sequence": 88196799
-          },
-          "LedgerEntryType": "AccountRoot",
-          "LedgerIndex": "181A3BAD298B55A47F4F9A0247D638F33BFF7DEDC7A1ECD1392C2ADF9A3F46C9",
-          "PreviousFields": { "Balance": "6134969072", "Sequence": 88196798 },
-          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-          "PreviousTxnLgrSeq": 88213878
-        }
-      },
-      {
-        "DeletedNode": {
-          "FinalFields": {
-            "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-            "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
-            "BookNode": "0",
-            "Flags": 0,
-            "OwnerNode": "0",
-            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-            "PreviousTxnLgrSeq": 88213895,
-            "Sequence": 75621581,
-            "TakerGets": "0",
-            "TakerPays": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-              "value": "0"
-            }
-          },
-          "LedgerEntryType": "Offer",
-          "LedgerIndex": "6AB7F7F338C9FFF65323CCAEF7E38FE93D45D6F67E0ABF11822216D1A90DF89E",
-          "PreviousFields": {
-            "TakerGets": "2895309",
-            "TakerPays": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-              "value": "1.543863643330838"
-            }
-          }
+          "LedgerIndex": "4ACE281E26640B951CB4A23768CA6C7E1B0F602053B3C86A653847FE5A5AA1ED",
+          "PreviousFields": { "Balance": "66502087", "Sequence": 88214147 },
+          "PreviousTxnID": "6947EB21D0A745A96F9B2F9B5BABFFE43CE66AF8488365DBC112BC38F8FAC0EA",
+          "PreviousTxnLgrSeq": 88214779
         }
       },
       {
         "ModifiedNode": {
           "FinalFields": {
             "Balance": {
-              "currency": "USD",
+              "currency": "5553444300000000000000000000000000000000",
               "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-222732.5928364204"
+              "value": "-26.79746261485543"
             },
-            "Flags": 16908288,
+            "Flags": 2228224,
             "HighLimit": {
-              "currency": "USD",
-              "issuer": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
-              "value": "0"
+              "currency": "5553444300000000000000000000000000000000",
+              "issuer": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+              "value": "775905"
             },
             "HighNode": "0",
             "LowLimit": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "currency": "5553444300000000000000000000000000000000",
+              "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
               "value": "0"
             },
-            "LowNode": "bd7"
+            "LowNode": "14f"
           },
           "LedgerEntryType": "RippleState",
-          "LedgerIndex": "832F2523220A304ECEB7B2AE3E0D30829ACBCA0A31722FA8D952CC5BE7D9478B",
+          "LedgerIndex": "5F1DFBA426DB53A57ECEFE3EAEB804107DA1B899D4A90C794E577E5082D7C125",
           "PreviousFields": {
             "Balance": {
-              "currency": "USD",
+              "currency": "5553444300000000000000000000000000000000",
               "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-222654.5789600612"
+              "value": "0"
             }
           },
-          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-          "PreviousTxnLgrSeq": 88213878
+          "PreviousTxnID": "6947EB21D0A745A96F9B2F9B5BABFFE43CE66AF8488365DBC112BC38F8FAC0EA",
+          "PreviousTxnLgrSeq": 88214779
         }
       },
       {
         "ModifiedNode": {
           "FinalFields": {
-            "AMMID": "EF95AD04AF97DF0DD76C5C624F93EF6F5479CDF8F30FAE612F1D434B5D6A914B",
-            "Account": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
-            "Balance": "417539550052",
+            "AMMID": "383669860F36CDD7BF543C0711DD523E35F60ACA22C8AAD8FDDBB2632C4C5821",
+            "Account": "rGHt6LT5v9DVaEAmFzj5ciuxuj41ZjLofs",
+            "Balance": "534441055888",
             "Flags": 26214400,
             "OwnerCount": 1,
-            "Sequence": 86795414
+            "Sequence": 86795379
           },
           "LedgerEntryType": "AccountRoot",
-          "LedgerIndex": "B21B05E69AFB3F98B8D6F8066A69C4B189F3D804D8BE896AE11E60189AAFAD51",
-          "PreviousFields": { "Balance": "417685774720" },
-          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-          "PreviousTxnLgrSeq": 88213878
+          "LedgerIndex": "AEAC617A4934A4E1029581A159AF8EB3356E4DE3C52324D9D5A73C00B8828BCF",
+          "PreviousFields": { "Balance": "534390431196" },
+          "PreviousTxnID": "1FADA966F7F1E8465E17DE2F83216663BE8360B172AC3A0D13FC81757C64AC42",
+          "PreviousTxnLgrSeq": 88214747
         }
       },
       {
         "ModifiedNode": {
           "FinalFields": {
             "Balance": {
-              "currency": "USD",
+              "currency": "5553444300000000000000000000000000000000",
               "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-15.22762820406059"
-            },
-            "Flags": 2228224,
-            "HighLimit": {
-              "currency": "USD",
-              "issuer": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-              "value": "1000000000"
-            },
-            "HighNode": "0",
-            "LowLimit": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-              "value": "0"
+              "value": "-284983.085646821"
             },
-            "LowNode": "b09"
-          },
-          "LedgerEntryType": "RippleState",
-          "LedgerIndex": "CFCB7153408413FDB9A4B5AD3530680442200FA6F620711A80567DD1A965FD96",
-          "PreviousFields": {
-            "Balance": {
-              "currency": "USD",
-              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-13.68376456072975"
-            }
-          },
-          "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-          "PreviousTxnLgrSeq": 88213895
-        }
-      },
-      {
-        "ModifiedNode": {
-          "FinalFields": {
-            "Flags": 0,
-            "Owner": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-            "RootIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
-          },
-          "LedgerEntryType": "DirectoryNode",
-          "LedgerIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
-        }
-      },
-      {
-        "ModifiedNode": {
-          "FinalFields": {
-            "Balance": {
-              "currency": "USD",
-              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-6450000000000000e-26"
-            },
-            "Flags": 2228224,
+            "Flags": 16908288,
             "HighLimit": {
-              "currency": "USD",
-              "issuer": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+              "currency": "5553444300000000000000000000000000000000",
+              "issuer": "rGHt6LT5v9DVaEAmFzj5ciuxuj41ZjLofs",
               "value": "0"
             },
             "HighNode": "0",
             "LowLimit": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "currency": "5553444300000000000000000000000000000000",
+              "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
               "value": "0"
             },
-            "LowNode": "bea"
+            "LowNode": "10a"
           },
           "LedgerEntryType": "RippleState",
-          "LedgerIndex": "DE51B19CCC570DB23F7A831943C8D874FB1928E513EC88090A543E32340AE813",
+          "LedgerIndex": "CDE55A8290DF221A643F51798BE6294A69384066D1ECFB7C2B9BEE2004B38D63",
           "PreviousFields": {
             "Balance": {
-              "currency": "USD",
+              "currency": "5553444300000000000000000000000000000000",
               "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-79.6770766125645"
+              "value": "-285009.9635018237"
             }
           },
-          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-          "PreviousTxnLgrSeq": 88213878
-        }
-      },
-      {
-        "DeletedNode": {
-          "FinalFields": {
-            "ExchangeRate": "4e12f1b0ae6a0fb3",
-            "Flags": 0,
-            "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
-            "TakerGetsCurrency": "0000000000000000000000000000000000000000",
-            "TakerGetsIssuer": "0000000000000000000000000000000000000000",
-            "TakerPaysCurrency": "0000000000000000000000005553440000000000",
-            "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1"
-          },
-          "LedgerEntryType": "DirectoryNode",
-          "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3"
+          "PreviousTxnID": "1FADA966F7F1E8465E17DE2F83216663BE8360B172AC3A0D13FC81757C64AC42",
+          "PreviousTxnLgrSeq": 88214747
         }
       }
     ],
-    "DeliveredAmount": "149119977",
-    "TransactionIndex": 13,
+    "DeliveredAmount": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "26.79746261485543"
+    },
+    "TransactionIndex": 18,
     "TransactionResult": "tesSUCCESS",
-    "delivered_amount": "149119977"
-  }
+    "delivered_amount": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "26.79746261485543"
+    }
+  },
+  "hash": "2C9C11811DFC51263267F7D5AA81C807876B905A99AE52321C582D8E186B7E12",
+  "ledger_index": 88214932,
+  "date": 1716579292000
 }

From 792ecbc19d6cf165e17d3b299d48b027f7f84935 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 3 Jun 2024 19:17:00 +0000
Subject: [PATCH 12/79] chore(deps-dev): bump lint-staged from 15.1.0 to 15.2.5
 (#991)

---
 package-lock.json | 519 +++++++++++++++++++++++-----------------------
 package.json      |   2 +-
 2 files changed, 265 insertions(+), 256 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index dedb0fffb..181744e1a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -91,7 +91,7 @@
         "eslint-plugin-react-hooks": "^4.6.0",
         "jest-enzyme": "^7.1.0",
         "jest-websocket-mock": "^2.5.0",
-        "lint-staged": "^15.1.0",
+        "lint-staged": "^15.2.5",
         "mock-socket": "^9.1.5",
         "moxios": "^0.4.0",
         "nodemon": "^3.0.1",
@@ -8891,16 +8891,16 @@
       }
     },
     "node_modules/cli-truncate": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
-      "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+      "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
       "dev": true,
       "dependencies": {
         "slice-ansi": "^5.0.0",
-        "string-width": "^5.0.0"
+        "string-width": "^7.0.0"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -8931,9 +8931,9 @@
       }
     },
     "node_modules/cli-truncate/node_modules/emoji-regex": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
+      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
       "dev": true
     },
     "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": {
@@ -8965,17 +8965,17 @@
       }
     },
     "node_modules/cli-truncate/node_modules/string-width": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
+      "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
       "dev": true,
       "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^9.2.2",
-        "strip-ansi": "^7.0.1"
+        "emoji-regex": "^10.3.0",
+        "get-east-asian-width": "^1.0.0",
+        "strip-ansi": "^7.1.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -10217,12 +10217,6 @@
         "stream-shift": "^1.0.0"
       }
     },
-    "node_modules/eastasianwidth": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
-      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
-      "dev": true
-    },
     "node_modules/ecc-jsbn": {
       "version": "0.1.2",
       "dev": true,
@@ -12888,6 +12882,18 @@
         "node": "6.* || 8.* || >= 10.*"
       }
     },
+    "node_modules/get-east-asian-width": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz",
+      "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==",
+      "dev": true,
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/get-intrinsic": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
@@ -20573,12 +20579,15 @@
       }
     },
     "node_modules/lilconfig": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
-      "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
+      "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
       "dev": true,
       "engines": {
-        "node": ">=10"
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antonk52"
       }
     },
     "node_modules/lines-and-columns": {
@@ -20586,21 +20595,21 @@
       "license": "MIT"
     },
     "node_modules/lint-staged": {
-      "version": "15.1.0",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz",
-      "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "5.3.0",
-        "commander": "11.1.0",
-        "debug": "4.3.4",
-        "execa": "8.0.1",
-        "lilconfig": "2.1.0",
-        "listr2": "7.0.2",
-        "micromatch": "4.0.5",
-        "pidtree": "0.6.0",
-        "string-argv": "0.3.2",
-        "yaml": "2.3.4"
+      "version": "15.2.5",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz",
+      "integrity": "sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "~5.3.0",
+        "commander": "~12.1.0",
+        "debug": "~4.3.4",
+        "execa": "~8.0.1",
+        "lilconfig": "~3.1.1",
+        "listr2": "~8.2.1",
+        "micromatch": "~4.0.7",
+        "pidtree": "~0.6.0",
+        "string-argv": "~0.3.2",
+        "yaml": "~2.4.2"
       },
       "bin": {
         "lint-staged": "bin/lint-staged.js"
@@ -20613,11 +20622,12 @@
       }
     },
     "node_modules/lint-staged/node_modules/braces": {
-      "version": "3.0.2",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       },
       "engines": {
         "node": ">=8"
@@ -20636,12 +20646,12 @@
       }
     },
     "node_modules/lint-staged/node_modules/commander": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
-      "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+      "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
       "dev": true,
       "engines": {
-        "node": ">=16"
+        "node": ">=18"
       }
     },
     "node_modules/lint-staged/node_modules/cross-spawn": {
@@ -20682,9 +20692,10 @@
       }
     },
     "node_modules/lint-staged/node_modules/fill-range": {
-      "version": "7.0.1",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -20715,8 +20726,9 @@
     },
     "node_modules/lint-staged/node_modules/is-number": {
       "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
       }
@@ -20734,11 +20746,12 @@
       }
     },
     "node_modules/lint-staged/node_modules/micromatch": {
-      "version": "4.0.5",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+      "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "braces": "^3.0.2",
+        "braces": "^3.0.3",
         "picomatch": "^2.3.1"
       },
       "engines": {
@@ -20866,8 +20879,9 @@
     },
     "node_modules/lint-staged/node_modules/to-regex-range": {
       "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "is-number": "^7.0.0"
       },
@@ -20891,29 +20905,32 @@
       }
     },
     "node_modules/lint-staged/node_modules/yaml": {
-      "version": "2.3.4",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-      "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
+      "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
       "dev": true,
+      "bin": {
+        "yaml": "bin.mjs"
+      },
       "engines": {
         "node": ">= 14"
       }
     },
     "node_modules/listr2": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz",
-      "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==",
+      "version": "8.2.1",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz",
+      "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==",
       "dev": true,
       "dependencies": {
-        "cli-truncate": "^3.1.0",
+        "cli-truncate": "^4.0.0",
         "colorette": "^2.0.20",
         "eventemitter3": "^5.0.1",
-        "log-update": "^5.0.1",
-        "rfdc": "^1.3.0",
-        "wrap-ansi": "^8.1.0"
+        "log-update": "^6.0.0",
+        "rfdc": "^1.3.1",
+        "wrap-ansi": "^9.0.0"
       },
       "engines": {
-        "node": ">=16.0.0"
+        "node": ">=18.0.0"
       }
     },
     "node_modules/listr2/node_modules/ansi-regex": {
@@ -20941,9 +20958,9 @@
       }
     },
     "node_modules/listr2/node_modules/emoji-regex": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
+      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
       "dev": true
     },
     "node_modules/listr2/node_modules/eventemitter3": {
@@ -20953,17 +20970,17 @@
       "dev": true
     },
     "node_modules/listr2/node_modules/string-width": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
+      "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
       "dev": true,
       "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^9.2.2",
-        "strip-ansi": "^7.0.1"
+        "emoji-regex": "^10.3.0",
+        "get-east-asian-width": "^1.0.0",
+        "strip-ansi": "^7.1.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -20985,17 +21002,17 @@
       }
     },
     "node_modules/listr2/node_modules/wrap-ansi": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
-      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+      "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^6.1.0",
-        "string-width": "^5.0.1",
-        "strip-ansi": "^7.0.1"
+        "ansi-styles": "^6.2.1",
+        "string-width": "^7.0.0",
+        "strip-ansi": "^7.1.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
@@ -21118,34 +21135,31 @@
       "license": "MIT"
     },
     "node_modules/log-update": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz",
-      "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz",
+      "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==",
       "dev": true,
       "dependencies": {
-        "ansi-escapes": "^5.0.0",
+        "ansi-escapes": "^6.2.0",
         "cli-cursor": "^4.0.0",
-        "slice-ansi": "^5.0.0",
-        "strip-ansi": "^7.0.1",
-        "wrap-ansi": "^8.0.1"
+        "slice-ansi": "^7.0.0",
+        "strip-ansi": "^7.1.0",
+        "wrap-ansi": "^9.0.0"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/log-update/node_modules/ansi-escapes": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz",
-      "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==",
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
+      "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
       "dev": true,
-      "dependencies": {
-        "type-fest": "^1.0.2"
-      },
       "engines": {
-        "node": ">=12"
+        "node": ">=14.16"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -21176,51 +21190,54 @@
       }
     },
     "node_modules/log-update/node_modules/emoji-regex": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
+      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
       "dev": true
     },
     "node_modules/log-update/node_modules/is-fullwidth-code-point": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
-      "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+      "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
       "dev": true,
+      "dependencies": {
+        "get-east-asian-width": "^1.0.0"
+      },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/log-update/node_modules/slice-ansi": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
-      "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+      "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^6.0.0",
-        "is-fullwidth-code-point": "^4.0.0"
+        "ansi-styles": "^6.2.1",
+        "is-fullwidth-code-point": "^5.0.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/chalk/slice-ansi?sponsor=1"
       }
     },
     "node_modules/log-update/node_modules/string-width": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
+      "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
       "dev": true,
       "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^9.2.2",
-        "strip-ansi": "^7.0.1"
+        "emoji-regex": "^10.3.0",
+        "get-east-asian-width": "^1.0.0",
+        "strip-ansi": "^7.1.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -21241,30 +21258,18 @@
         "url": "https://github.com/chalk/strip-ansi?sponsor=1"
       }
     },
-    "node_modules/log-update/node_modules/type-fest": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-      "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/log-update/node_modules/wrap-ansi": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
-      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+      "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
       "dev": true,
       "dependencies": {
-        "ansi-styles": "^6.1.0",
-        "string-width": "^5.0.1",
-        "strip-ansi": "^7.0.1"
+        "ansi-styles": "^6.2.1",
+        "string-width": "^7.0.0",
+        "strip-ansi": "^7.1.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
@@ -23861,9 +23866,9 @@
       }
     },
     "node_modules/rfdc": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
-      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
+      "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
       "dev": true
     },
     "node_modules/rimraf": {
@@ -33992,13 +33997,13 @@
       }
     },
     "cli-truncate": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
-      "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+      "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
       "dev": true,
       "requires": {
         "slice-ansi": "^5.0.0",
-        "string-width": "^5.0.0"
+        "string-width": "^7.0.0"
       },
       "dependencies": {
         "ansi-regex": {
@@ -34014,9 +34019,9 @@
           "dev": true
         },
         "emoji-regex": {
-          "version": "9.2.2",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-          "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+          "version": "10.3.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
+          "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
           "dev": true
         },
         "is-fullwidth-code-point": {
@@ -34036,14 +34041,14 @@
           }
         },
         "string-width": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-          "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
+          "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
           "dev": true,
           "requires": {
-            "eastasianwidth": "^0.2.0",
-            "emoji-regex": "^9.2.2",
-            "strip-ansi": "^7.0.1"
+            "emoji-regex": "^10.3.0",
+            "get-east-asian-width": "^1.0.0",
+            "strip-ansi": "^7.1.0"
           }
         },
         "strip-ansi": {
@@ -34927,12 +34932,6 @@
         "stream-shift": "^1.0.0"
       }
     },
-    "eastasianwidth": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
-      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
-      "dev": true
-    },
     "ecc-jsbn": {
       "version": "0.1.2",
       "dev": true,
@@ -36777,6 +36776,12 @@
       "version": "2.0.5",
       "dev": true
     },
+    "get-east-asian-width": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz",
+      "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==",
+      "dev": true
+    },
     "get-intrinsic": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
@@ -42094,37 +42099,39 @@
       }
     },
     "lilconfig": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
-      "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
+      "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
       "dev": true
     },
     "lines-and-columns": {
       "version": "1.1.6"
     },
     "lint-staged": {
-      "version": "15.1.0",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz",
-      "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==",
+      "version": "15.2.5",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz",
+      "integrity": "sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==",
       "dev": true,
       "requires": {
-        "chalk": "5.3.0",
-        "commander": "11.1.0",
-        "debug": "4.3.4",
-        "execa": "8.0.1",
-        "lilconfig": "2.1.0",
-        "listr2": "7.0.2",
-        "micromatch": "4.0.5",
-        "pidtree": "0.6.0",
-        "string-argv": "0.3.2",
-        "yaml": "2.3.4"
+        "chalk": "~5.3.0",
+        "commander": "~12.1.0",
+        "debug": "~4.3.4",
+        "execa": "~8.0.1",
+        "lilconfig": "~3.1.1",
+        "listr2": "~8.2.1",
+        "micromatch": "~4.0.7",
+        "pidtree": "~0.6.0",
+        "string-argv": "~0.3.2",
+        "yaml": "~2.4.2"
       },
       "dependencies": {
         "braces": {
-          "version": "3.0.2",
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+          "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
           "dev": true,
           "requires": {
-            "fill-range": "^7.0.1"
+            "fill-range": "^7.1.1"
           }
         },
         "chalk": {
@@ -42134,9 +42141,9 @@
           "dev": true
         },
         "commander": {
-          "version": "11.1.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
-          "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+          "version": "12.1.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+          "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
           "dev": true
         },
         "cross-spawn": {
@@ -42168,7 +42175,9 @@
           }
         },
         "fill-range": {
-          "version": "7.0.1",
+          "version": "7.1.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+          "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
           "dev": true,
           "requires": {
             "to-regex-range": "^5.0.1"
@@ -42188,6 +42197,8 @@
         },
         "is-number": {
           "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
           "dev": true
         },
         "is-stream": {
@@ -42197,10 +42208,12 @@
           "dev": true
         },
         "micromatch": {
-          "version": "4.0.5",
+          "version": "4.0.7",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+          "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
           "dev": true,
           "requires": {
-            "braces": "^3.0.2",
+            "braces": "^3.0.3",
             "picomatch": "^2.3.1"
           }
         },
@@ -42275,6 +42288,8 @@
         },
         "to-regex-range": {
           "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
           "dev": true,
           "requires": {
             "is-number": "^7.0.0"
@@ -42290,25 +42305,25 @@
           }
         },
         "yaml": {
-          "version": "2.3.4",
-          "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-          "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
+          "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
           "dev": true
         }
       }
     },
     "listr2": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz",
-      "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==",
+      "version": "8.2.1",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz",
+      "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==",
       "dev": true,
       "requires": {
-        "cli-truncate": "^3.1.0",
+        "cli-truncate": "^4.0.0",
         "colorette": "^2.0.20",
         "eventemitter3": "^5.0.1",
-        "log-update": "^5.0.1",
-        "rfdc": "^1.3.0",
-        "wrap-ansi": "^8.1.0"
+        "log-update": "^6.0.0",
+        "rfdc": "^1.3.1",
+        "wrap-ansi": "^9.0.0"
       },
       "dependencies": {
         "ansi-regex": {
@@ -42324,9 +42339,9 @@
           "dev": true
         },
         "emoji-regex": {
-          "version": "9.2.2",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-          "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+          "version": "10.3.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
+          "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
           "dev": true
         },
         "eventemitter3": {
@@ -42336,14 +42351,14 @@
           "dev": true
         },
         "string-width": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-          "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
+          "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
           "dev": true,
           "requires": {
-            "eastasianwidth": "^0.2.0",
-            "emoji-regex": "^9.2.2",
-            "strip-ansi": "^7.0.1"
+            "emoji-regex": "^10.3.0",
+            "get-east-asian-width": "^1.0.0",
+            "strip-ansi": "^7.1.0"
           }
         },
         "strip-ansi": {
@@ -42356,14 +42371,14 @@
           }
         },
         "wrap-ansi": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
-          "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+          "version": "9.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+          "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^6.1.0",
-            "string-width": "^5.0.1",
-            "strip-ansi": "^7.0.1"
+            "ansi-styles": "^6.2.1",
+            "string-width": "^7.0.0",
+            "strip-ansi": "^7.1.0"
           }
         }
       }
@@ -42462,26 +42477,23 @@
       "dev": true
     },
     "log-update": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz",
-      "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz",
+      "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==",
       "dev": true,
       "requires": {
-        "ansi-escapes": "^5.0.0",
+        "ansi-escapes": "^6.2.0",
         "cli-cursor": "^4.0.0",
-        "slice-ansi": "^5.0.0",
-        "strip-ansi": "^7.0.1",
-        "wrap-ansi": "^8.0.1"
+        "slice-ansi": "^7.0.0",
+        "strip-ansi": "^7.1.0",
+        "wrap-ansi": "^9.0.0"
       },
       "dependencies": {
         "ansi-escapes": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz",
-          "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==",
-          "dev": true,
-          "requires": {
-            "type-fest": "^1.0.2"
-          }
+          "version": "6.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
+          "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
+          "dev": true
         },
         "ansi-regex": {
           "version": "6.0.1",
@@ -42496,36 +42508,39 @@
           "dev": true
         },
         "emoji-regex": {
-          "version": "9.2.2",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-          "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+          "version": "10.3.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
+          "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
           "dev": true
         },
         "is-fullwidth-code-point": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
-          "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
-          "dev": true
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+          "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
+          "dev": true,
+          "requires": {
+            "get-east-asian-width": "^1.0.0"
+          }
         },
         "slice-ansi": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
-          "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+          "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^6.0.0",
-            "is-fullwidth-code-point": "^4.0.0"
+            "ansi-styles": "^6.2.1",
+            "is-fullwidth-code-point": "^5.0.0"
           }
         },
         "string-width": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-          "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
+          "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
           "dev": true,
           "requires": {
-            "eastasianwidth": "^0.2.0",
-            "emoji-regex": "^9.2.2",
-            "strip-ansi": "^7.0.1"
+            "emoji-regex": "^10.3.0",
+            "get-east-asian-width": "^1.0.0",
+            "strip-ansi": "^7.1.0"
           }
         },
         "strip-ansi": {
@@ -42537,21 +42552,15 @@
             "ansi-regex": "^6.0.1"
           }
         },
-        "type-fest": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-          "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
-          "dev": true
-        },
         "wrap-ansi": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
-          "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+          "version": "9.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+          "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^6.1.0",
-            "string-width": "^5.0.1",
-            "strip-ansi": "^7.0.1"
+            "ansi-styles": "^6.2.1",
+            "string-width": "^7.0.0",
+            "strip-ansi": "^7.1.0"
           }
         }
       }
@@ -44241,9 +44250,9 @@
       "version": "1.0.4"
     },
     "rfdc": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
-      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
+      "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
       "dev": true
     },
     "rimraf": {
diff --git a/package.json b/package.json
index 83aec7b08..4fe98693b 100644
--- a/package.json
+++ b/package.json
@@ -86,7 +86,7 @@
     "eslint-plugin-react-hooks": "^4.6.0",
     "jest-enzyme": "^7.1.0",
     "jest-websocket-mock": "^2.5.0",
-    "lint-staged": "^15.1.0",
+    "lint-staged": "^15.2.5",
     "mock-socket": "^9.1.5",
     "moxios": "^0.4.0",
     "nodemon": "^3.0.1",

From a48b8ca426c79205f5e076c5d2b2445b3b9f3365 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 3 Jun 2024 19:21:56 +0000
Subject: [PATCH 13/79] chore(deps-dev): bump eslint-plugin-react from 7.33.2
 to 7.34.2 (#992)

---
 package-lock.json | 1522 ++++++++++++++++++++++++++++-----------------
 package.json      |    2 +-
 2 files changed, 959 insertions(+), 565 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 181744e1a..b039594c6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -87,7 +87,7 @@
         "eslint-plugin-import": "^2.29.1",
         "eslint-plugin-jsx-a11y": "^6.7.1",
         "eslint-plugin-prettier": "^5.1.3",
-        "eslint-plugin-react": "^7.33.2",
+        "eslint-plugin-react": "^7.34.2",
         "eslint-plugin-react-hooks": "^4.6.0",
         "jest-enzyme": "^7.1.0",
         "jest-websocket-mock": "^2.5.0",
@@ -7121,13 +7121,16 @@
       }
     },
     "node_modules/array-buffer-byte-length": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
-      "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+      "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "is-array-buffer": "^3.0.1"
+        "call-bind": "^1.0.5",
+        "is-array-buffer": "^3.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -7143,15 +7146,16 @@
       "license": "MIT"
     },
     "node_modules/array-includes": {
-      "version": "3.1.7",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
-      "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+      "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1",
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
         "is-string": "^1.0.7"
       },
       "engines": {
@@ -7201,6 +7205,26 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/array.prototype.findlast": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+      "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/array.prototype.findlastindex": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
@@ -7256,30 +7280,47 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/array.prototype.tosorted": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
-      "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
+    "node_modules/array.prototype.toreversed": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
+      "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
       "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4",
-        "es-shim-unscopables": "^1.0.0",
-        "get-intrinsic": "^1.1.3"
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "es-shim-unscopables": "^1.0.0"
+      }
+    },
+    "node_modules/array.prototype.tosorted": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+      "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.3",
+        "es-errors": "^1.3.0",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/arraybuffer.prototype.slice": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz",
-      "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+      "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
       "dev": true,
       "dependencies": {
-        "array-buffer-byte-length": "^1.0.0",
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "get-intrinsic": "^1.2.1",
-        "is-array-buffer": "^3.0.2",
+        "array-buffer-byte-length": "^1.0.1",
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.22.3",
+        "es-errors": "^1.2.1",
+        "get-intrinsic": "^1.2.3",
+        "is-array-buffer": "^3.0.4",
         "is-shared-array-buffer": "^1.0.2"
       },
       "engines": {
@@ -7363,15 +7404,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/asynciterator.prototype": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
-      "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
-      "dev": true,
-      "dependencies": {
-        "has-symbols": "^1.0.3"
-      }
-    },
     "node_modules/asynckit": {
       "version": "0.4.0",
       "license": "MIT"
@@ -7424,8 +7456,12 @@
       }
     },
     "node_modules/available-typed-arrays": {
-      "version": "1.0.5",
-      "license": "MIT",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "dependencies": {
+        "possible-typed-array-names": "^1.0.0"
+      },
       "engines": {
         "node": ">= 0.4"
       },
@@ -8556,11 +8592,18 @@
       }
     },
     "node_modules/call-bind": {
-      "version": "1.0.2",
-      "license": "MIT",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
       "dependencies": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -9776,6 +9819,57 @@
         "webidl-conversions": "^4.0.2"
       }
     },
+    "node_modules/data-view-buffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-offset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/debug": {
       "version": "4.3.4",
       "license": "MIT",
@@ -9925,16 +10019,19 @@
       }
     },
     "node_modules/define-data-property": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
-      "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
       "dependencies": {
-        "get-intrinsic": "^1.2.1",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.0"
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
       },
       "engines": {
         "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/define-properties": {
@@ -10463,50 +10560,57 @@
       }
     },
     "node_modules/es-abstract": {
-      "version": "1.22.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz",
-      "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==",
-      "dev": true,
-      "dependencies": {
-        "array-buffer-byte-length": "^1.0.0",
-        "arraybuffer.prototype.slice": "^1.0.1",
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
-        "es-set-tostringtag": "^2.0.1",
+      "version": "1.23.3",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+      "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+      "dev": true,
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.1",
+        "arraybuffer.prototype.slice": "^1.0.3",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "data-view-buffer": "^1.0.1",
+        "data-view-byte-length": "^1.0.1",
+        "data-view-byte-offset": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-set-tostringtag": "^2.0.3",
         "es-to-primitive": "^1.2.1",
-        "function.prototype.name": "^1.1.5",
-        "get-intrinsic": "^1.2.1",
-        "get-symbol-description": "^1.0.0",
+        "function.prototype.name": "^1.1.6",
+        "get-intrinsic": "^1.2.4",
+        "get-symbol-description": "^1.0.2",
         "globalthis": "^1.0.3",
         "gopd": "^1.0.1",
-        "has": "^1.0.3",
-        "has-property-descriptors": "^1.0.0",
-        "has-proto": "^1.0.1",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.0.3",
         "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.5",
-        "is-array-buffer": "^3.0.2",
+        "hasown": "^2.0.2",
+        "internal-slot": "^1.0.7",
+        "is-array-buffer": "^3.0.4",
         "is-callable": "^1.2.7",
-        "is-negative-zero": "^2.0.2",
+        "is-data-view": "^1.0.1",
+        "is-negative-zero": "^2.0.3",
         "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.2",
+        "is-shared-array-buffer": "^1.0.3",
         "is-string": "^1.0.7",
-        "is-typed-array": "^1.1.10",
+        "is-typed-array": "^1.1.13",
         "is-weakref": "^1.0.2",
-        "object-inspect": "^1.12.3",
+        "object-inspect": "^1.13.1",
         "object-keys": "^1.1.1",
-        "object.assign": "^4.1.4",
-        "regexp.prototype.flags": "^1.5.0",
-        "safe-array-concat": "^1.0.0",
-        "safe-regex-test": "^1.0.0",
-        "string.prototype.trim": "^1.2.7",
-        "string.prototype.trimend": "^1.0.6",
-        "string.prototype.trimstart": "^1.0.6",
-        "typed-array-buffer": "^1.0.0",
-        "typed-array-byte-length": "^1.0.0",
-        "typed-array-byte-offset": "^1.0.0",
-        "typed-array-length": "^1.0.4",
+        "object.assign": "^4.1.5",
+        "regexp.prototype.flags": "^1.5.2",
+        "safe-array-concat": "^1.1.2",
+        "safe-regex-test": "^1.0.3",
+        "string.prototype.trim": "^1.2.9",
+        "string.prototype.trimend": "^1.0.8",
+        "string.prototype.trimstart": "^1.0.8",
+        "typed-array-buffer": "^1.0.2",
+        "typed-array-byte-length": "^1.0.1",
+        "typed-array-byte-offset": "^1.0.2",
+        "typed-array-length": "^1.0.6",
         "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.10"
+        "which-typed-array": "^1.1.15"
       },
       "engines": {
         "node": ">= 0.4"
@@ -10520,6 +10624,25 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/es-define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "dependencies": {
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/es-get-iterator": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
@@ -10547,47 +10670,63 @@
       "dev": true
     },
     "node_modules/es-iterator-helpers": {
-      "version": "1.0.15",
-      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
-      "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
+      "version": "1.0.19",
+      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
+      "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
       "dev": true,
       "dependencies": {
-        "asynciterator.prototype": "^1.0.0",
-        "call-bind": "^1.0.2",
+        "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
-        "es-abstract": "^1.22.1",
-        "es-set-tostringtag": "^2.0.1",
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.2.1",
+        "es-abstract": "^1.23.3",
+        "es-errors": "^1.3.0",
+        "es-set-tostringtag": "^2.0.3",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
         "globalthis": "^1.0.3",
-        "has-property-descriptors": "^1.0.0",
-        "has-proto": "^1.0.1",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.0.3",
         "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.5",
+        "internal-slot": "^1.0.7",
         "iterator.prototype": "^1.1.2",
-        "safe-array-concat": "^1.0.1"
+        "safe-array-concat": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+      "dev": true,
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/es-set-tostringtag": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
-      "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+      "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
       "dev": true,
       "dependencies": {
-        "get-intrinsic": "^1.1.3",
-        "has": "^1.0.3",
-        "has-tostringtag": "^1.0.0"
+        "get-intrinsic": "^1.2.4",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.1"
       },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/es-shim-unscopables": {
-      "version": "1.0.0",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+      "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "has": "^1.0.3"
+        "hasown": "^2.0.0"
       }
     },
     "node_modules/es-to-primitive": {
@@ -11250,27 +11389,29 @@
       }
     },
     "node_modules/eslint-plugin-react": {
-      "version": "7.33.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
-      "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+      "version": "7.34.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz",
+      "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==",
       "dev": true,
       "dependencies": {
-        "array-includes": "^3.1.6",
-        "array.prototype.flatmap": "^1.3.1",
-        "array.prototype.tosorted": "^1.1.1",
+        "array-includes": "^3.1.8",
+        "array.prototype.findlast": "^1.2.5",
+        "array.prototype.flatmap": "^1.3.2",
+        "array.prototype.toreversed": "^1.1.2",
+        "array.prototype.tosorted": "^1.1.3",
         "doctrine": "^2.1.0",
-        "es-iterator-helpers": "^1.0.12",
+        "es-iterator-helpers": "^1.0.19",
         "estraverse": "^5.3.0",
         "jsx-ast-utils": "^2.4.1 || ^3.0.0",
         "minimatch": "^3.1.2",
-        "object.entries": "^1.1.6",
-        "object.fromentries": "^2.0.6",
-        "object.hasown": "^1.1.2",
-        "object.values": "^1.1.6",
+        "object.entries": "^1.1.8",
+        "object.fromentries": "^2.0.8",
+        "object.hasown": "^1.1.4",
+        "object.values": "^1.2.0",
         "prop-types": "^15.8.1",
-        "resolve": "^2.0.0-next.4",
+        "resolve": "^2.0.0-next.5",
         "semver": "^6.3.1",
-        "string.prototype.matchall": "^4.0.8"
+        "string.prototype.matchall": "^4.0.11"
       },
       "engines": {
         "node": ">=4"
@@ -11312,12 +11453,12 @@
       }
     },
     "node_modules/eslint-plugin-react/node_modules/resolve": {
-      "version": "2.0.0-next.4",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
-      "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+      "version": "2.0.0-next.5",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+      "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
       "dev": true,
       "dependencies": {
-        "is-core-module": "^2.9.0",
+        "is-core-module": "^2.13.0",
         "path-parse": "^1.0.7",
         "supports-preserve-symlinks-flag": "^1.0.0"
       },
@@ -12778,14 +12919,15 @@
       }
     },
     "node_modules/function.prototype.name": {
-      "version": "1.1.5",
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+      "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0",
-        "functions-have-names": "^1.2.2"
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "functions-have-names": "^1.2.3"
       },
       "engines": {
         "node": ">= 0.4"
@@ -12895,14 +13037,18 @@
       }
     },
     "node_modules/get-intrinsic": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
-      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
       "dependencies": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
         "has-proto": "^1.0.1",
-        "has-symbols": "^1.0.3"
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -12928,12 +13074,14 @@
       }
     },
     "node_modules/get-symbol-description": {
-      "version": "1.0.0",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+      "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.1"
+        "call-bind": "^1.0.5",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4"
       },
       "engines": {
         "node": ">= 0.4"
@@ -13138,6 +13286,7 @@
     },
     "node_modules/has": {
       "version": "1.0.3",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "function-bind": "^1.1.1"
@@ -13162,19 +13311,20 @@
       }
     },
     "node_modules/has-property-descriptors": {
-      "version": "1.0.0",
-      "license": "MIT",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
       "dependencies": {
-        "get-intrinsic": "^1.1.1"
+        "es-define-property": "^1.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/has-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
-      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
       "engines": {
         "node": ">= 0.4"
       },
@@ -13193,10 +13343,11 @@
       }
     },
     "node_modules/has-tostringtag": {
-      "version": "1.0.0",
-      "license": "MIT",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
       "dependencies": {
-        "has-symbols": "^1.0.2"
+        "has-symbols": "^1.0.3"
       },
       "engines": {
         "node": ">= 0.4"
@@ -13247,9 +13398,9 @@
       }
     },
     "node_modules/hasown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
-      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -13609,13 +13760,13 @@
       "license": "ISC"
     },
     "node_modules/internal-slot": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
-      "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+      "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
       "dev": true,
       "dependencies": {
-        "get-intrinsic": "^1.2.0",
-        "has": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "hasown": "^2.0.0",
         "side-channel": "^1.0.4"
       },
       "engines": {
@@ -13688,14 +13839,16 @@
       }
     },
     "node_modules/is-array-buffer": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
-      "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+      "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
       "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.0",
-        "is-typed-array": "^1.1.10"
+        "get-intrinsic": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -13815,6 +13968,21 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/is-data-view": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+      "dev": true,
+      "dependencies": {
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/is-date-object": {
       "version": "1.0.5",
       "dev": true,
@@ -13960,9 +14128,10 @@
       }
     },
     "node_modules/is-negative-zero": {
-      "version": "2.0.2",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -14063,11 +14232,15 @@
       }
     },
     "node_modules/is-shared-array-buffer": {
-      "version": "1.0.2",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2"
+        "call-bind": "^1.0.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -14114,14 +14287,11 @@
       }
     },
     "node_modules/is-typed-array": {
-      "version": "1.1.10",
-      "license": "MIT",
+      "version": "1.1.13",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+      "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
       "dependencies": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.0"
+        "which-typed-array": "^1.1.14"
       },
       "engines": {
         "node": ">= 0.4"
@@ -22273,9 +22443,9 @@
       }
     },
     "node_modules/object-inspect": {
-      "version": "1.12.3",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
-      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+      "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -22313,11 +22483,12 @@
       }
     },
     "node_modules/object.assign": {
-      "version": "4.1.4",
-      "license": "MIT",
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
         "has-symbols": "^1.0.3",
         "object-keys": "^1.1.1"
       },
@@ -22329,28 +22500,29 @@
       }
     },
     "node_modules/object.entries": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
-      "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+      "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/object.fromentries": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
-      "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+      "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -22388,13 +22560,17 @@
       }
     },
     "node_modules/object.hasown": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
-      "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz",
+      "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==",
       "dev": true,
       "dependencies": {
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -22412,14 +22588,14 @@
       }
     },
     "node_modules/object.values": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
-      "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+      "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -22727,6 +22903,14 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/possible-typed-array-names": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/postcss": {
       "version": "8.4.35",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
@@ -23519,15 +23703,16 @@
       "license": "MIT"
     },
     "node_modules/reflect.getprototypeof": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
-      "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
+      "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1",
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.1",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
         "globalthis": "^1.0.3",
         "which-builtin-type": "^1.1.3"
       },
@@ -23588,14 +23773,15 @@
       }
     },
     "node_modules/regexp.prototype.flags": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
-      "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
+      "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "functions-have-names": "^1.2.3"
+        "call-bind": "^1.0.6",
+        "define-properties": "^1.2.1",
+        "es-errors": "^1.3.0",
+        "set-function-name": "^2.0.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -23999,13 +24185,13 @@
       "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
     },
     "node_modules/safe-array-concat": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
-      "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+      "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.1",
+        "call-bind": "^1.0.7",
+        "get-intrinsic": "^1.2.4",
         "has-symbols": "^1.0.3",
         "isarray": "^2.0.5"
       },
@@ -24054,14 +24240,18 @@
       }
     },
     "node_modules/safe-regex-test": {
-      "version": "1.0.0",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+      "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.3",
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
         "is-regex": "^1.1.4"
       },
+      "engines": {
+        "node": ">= 0.4"
+      },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -24211,15 +24401,32 @@
       "dev": true,
       "license": "ISC"
     },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/set-function-name": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
-      "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
       "dev": true,
       "dependencies": {
-        "define-data-property": "^1.0.1",
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
         "functions-have-names": "^1.2.3",
-        "has-property-descriptors": "^1.0.0"
+        "has-property-descriptors": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -24290,12 +24497,17 @@
       "peer": true
     },
     "node_modules/side-channel": {
-      "version": "1.0.4",
-      "license": "MIT",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
       "dependencies": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -25042,19 +25254,26 @@
       }
     },
     "node_modules/string.prototype.matchall": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
-      "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
+      "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4",
-        "get-intrinsic": "^1.1.3",
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
         "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.3",
-        "regexp.prototype.flags": "^1.4.3",
-        "side-channel": "^1.0.4"
+        "internal-slot": "^1.0.7",
+        "regexp.prototype.flags": "^1.5.2",
+        "set-function-name": "^2.0.2",
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -25077,14 +25296,15 @@
       }
     },
     "node_modules/string.prototype.trim": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
-      "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.0",
+        "es-object-atoms": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -25094,26 +25314,31 @@
       }
     },
     "node_modules/string.prototype.trimend": {
-      "version": "1.0.6",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/string.prototype.trimstart": {
-      "version": "1.0.6",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -26615,29 +26840,30 @@
       }
     },
     "node_modules/typed-array-buffer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
-      "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+      "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.1",
-        "is-typed-array": "^1.1.10"
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-typed-array": "^1.1.13"
       },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/typed-array-byte-length": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
-      "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+      "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "has-proto": "^1.0.1",
-        "is-typed-array": "^1.1.10"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
       },
       "engines": {
         "node": ">= 0.4"
@@ -26647,16 +26873,17 @@
       }
     },
     "node_modules/typed-array-byte-offset": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
-      "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+      "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
       "dev": true,
       "dependencies": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "has-proto": "^1.0.1",
-        "is-typed-array": "^1.1.10"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
       },
       "engines": {
         "node": ">= 0.4"
@@ -26666,14 +26893,20 @@
       }
     },
     "node_modules/typed-array-length": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
-      "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+      "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "is-typed-array": "^1.1.9"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13",
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -27792,15 +28025,15 @@
       "peer": true
     },
     "node_modules/which-typed-array": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
-      "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
       "dependencies": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
         "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.0"
+        "has-tostringtag": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -32754,13 +32987,13 @@
       "dev": true
     },
     "array-buffer-byte-length": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
-      "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+      "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "is-array-buffer": "^3.0.1"
+        "call-bind": "^1.0.5",
+        "is-array-buffer": "^3.0.4"
       }
     },
     "array-equal": {
@@ -32771,15 +33004,16 @@
       "version": "1.1.1"
     },
     "array-includes": {
-      "version": "3.1.7",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
-      "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+      "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1",
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
         "is-string": "^1.0.7"
       }
     },
@@ -32808,6 +33042,20 @@
         "es-shim-unscopables": "^1.0.0"
       }
     },
+    "array.prototype.findlast": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+      "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-shim-unscopables": "^1.0.2"
+      }
+    },
     "array.prototype.findlastindex": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
@@ -32845,30 +33093,44 @@
         "es-shim-unscopables": "^1.0.0"
       }
     },
-    "array.prototype.tosorted": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
-      "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
+    "array.prototype.toreversed": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
+      "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
       "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4",
-        "es-shim-unscopables": "^1.0.0",
-        "get-intrinsic": "^1.1.3"
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "es-shim-unscopables": "^1.0.0"
+      }
+    },
+    "array.prototype.tosorted": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+      "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.3",
+        "es-errors": "^1.3.0",
+        "es-shim-unscopables": "^1.0.2"
       }
     },
     "arraybuffer.prototype.slice": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz",
-      "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+      "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
       "dev": true,
       "requires": {
-        "array-buffer-byte-length": "^1.0.0",
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "get-intrinsic": "^1.2.1",
-        "is-array-buffer": "^3.0.2",
+        "array-buffer-byte-length": "^1.0.1",
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.22.3",
+        "es-errors": "^1.2.1",
+        "get-intrinsic": "^1.2.3",
+        "is-array-buffer": "^3.0.4",
         "is-shared-array-buffer": "^1.0.2"
       }
     },
@@ -32930,15 +33192,6 @@
       "version": "1.0.1",
       "dev": true
     },
-    "asynciterator.prototype": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
-      "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
-      "dev": true,
-      "requires": {
-        "has-symbols": "^1.0.3"
-      }
-    },
     "asynckit": {
       "version": "0.4.0"
     },
@@ -32960,7 +33213,12 @@
       }
     },
     "available-typed-arrays": {
-      "version": "1.0.5"
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "requires": {
+        "possible-typed-array-names": "^1.0.0"
+      }
     },
     "aws-sign2": {
       "version": "0.7.0",
@@ -33783,10 +34041,15 @@
       }
     },
     "call-bind": {
-      "version": "1.0.2",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
       "requires": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
       }
     },
     "callsites": {
@@ -34624,6 +34887,39 @@
         }
       }
     },
+    "data-view-buffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      }
+    },
+    "data-view-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      }
+    },
+    "data-view-byte-offset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      }
+    },
     "debug": {
       "version": "4.3.4",
       "requires": {
@@ -34737,13 +35033,13 @@
       "peer": true
     },
     "define-data-property": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
-      "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
       "requires": {
-        "get-intrinsic": "^1.2.1",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.0"
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
       }
     },
     "define-properties": {
@@ -35110,56 +35406,76 @@
       }
     },
     "es-abstract": {
-      "version": "1.22.1",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz",
-      "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==",
-      "dev": true,
-      "requires": {
-        "array-buffer-byte-length": "^1.0.0",
-        "arraybuffer.prototype.slice": "^1.0.1",
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
-        "es-set-tostringtag": "^2.0.1",
+      "version": "1.23.3",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+      "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+      "dev": true,
+      "requires": {
+        "array-buffer-byte-length": "^1.0.1",
+        "arraybuffer.prototype.slice": "^1.0.3",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
+        "data-view-buffer": "^1.0.1",
+        "data-view-byte-length": "^1.0.1",
+        "data-view-byte-offset": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-set-tostringtag": "^2.0.3",
         "es-to-primitive": "^1.2.1",
-        "function.prototype.name": "^1.1.5",
-        "get-intrinsic": "^1.2.1",
-        "get-symbol-description": "^1.0.0",
+        "function.prototype.name": "^1.1.6",
+        "get-intrinsic": "^1.2.4",
+        "get-symbol-description": "^1.0.2",
         "globalthis": "^1.0.3",
         "gopd": "^1.0.1",
-        "has": "^1.0.3",
-        "has-property-descriptors": "^1.0.0",
-        "has-proto": "^1.0.1",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.0.3",
         "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.5",
-        "is-array-buffer": "^3.0.2",
+        "hasown": "^2.0.2",
+        "internal-slot": "^1.0.7",
+        "is-array-buffer": "^3.0.4",
         "is-callable": "^1.2.7",
-        "is-negative-zero": "^2.0.2",
+        "is-data-view": "^1.0.1",
+        "is-negative-zero": "^2.0.3",
         "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.2",
+        "is-shared-array-buffer": "^1.0.3",
         "is-string": "^1.0.7",
-        "is-typed-array": "^1.1.10",
+        "is-typed-array": "^1.1.13",
         "is-weakref": "^1.0.2",
-        "object-inspect": "^1.12.3",
+        "object-inspect": "^1.13.1",
         "object-keys": "^1.1.1",
-        "object.assign": "^4.1.4",
-        "regexp.prototype.flags": "^1.5.0",
-        "safe-array-concat": "^1.0.0",
-        "safe-regex-test": "^1.0.0",
-        "string.prototype.trim": "^1.2.7",
-        "string.prototype.trimend": "^1.0.6",
-        "string.prototype.trimstart": "^1.0.6",
-        "typed-array-buffer": "^1.0.0",
-        "typed-array-byte-length": "^1.0.0",
-        "typed-array-byte-offset": "^1.0.0",
-        "typed-array-length": "^1.0.4",
+        "object.assign": "^4.1.5",
+        "regexp.prototype.flags": "^1.5.2",
+        "safe-array-concat": "^1.1.2",
+        "safe-regex-test": "^1.0.3",
+        "string.prototype.trim": "^1.2.9",
+        "string.prototype.trimend": "^1.0.8",
+        "string.prototype.trimstart": "^1.0.8",
+        "typed-array-buffer": "^1.0.2",
+        "typed-array-byte-length": "^1.0.1",
+        "typed-array-byte-offset": "^1.0.2",
+        "typed-array-length": "^1.0.6",
         "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.10"
+        "which-typed-array": "^1.1.15"
       }
     },
     "es-array-method-boxes-properly": {
       "version": "1.0.0",
       "dev": true
     },
+    "es-define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "requires": {
+        "get-intrinsic": "^1.2.4"
+      }
+    },
+    "es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+    },
     "es-get-iterator": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
@@ -35186,43 +35502,54 @@
       }
     },
     "es-iterator-helpers": {
-      "version": "1.0.15",
-      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
-      "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
+      "version": "1.0.19",
+      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
+      "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
       "dev": true,
       "requires": {
-        "asynciterator.prototype": "^1.0.0",
-        "call-bind": "^1.0.2",
+        "call-bind": "^1.0.7",
         "define-properties": "^1.2.1",
-        "es-abstract": "^1.22.1",
-        "es-set-tostringtag": "^2.0.1",
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.2.1",
+        "es-abstract": "^1.23.3",
+        "es-errors": "^1.3.0",
+        "es-set-tostringtag": "^2.0.3",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
         "globalthis": "^1.0.3",
-        "has-property-descriptors": "^1.0.0",
-        "has-proto": "^1.0.1",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.0.3",
         "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.5",
+        "internal-slot": "^1.0.7",
         "iterator.prototype": "^1.1.2",
-        "safe-array-concat": "^1.0.1"
+        "safe-array-concat": "^1.1.2"
+      }
+    },
+    "es-object-atoms": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+      "dev": true,
+      "requires": {
+        "es-errors": "^1.3.0"
       }
     },
     "es-set-tostringtag": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
-      "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+      "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
       "dev": true,
       "requires": {
-        "get-intrinsic": "^1.1.3",
-        "has": "^1.0.3",
-        "has-tostringtag": "^1.0.0"
+        "get-intrinsic": "^1.2.4",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.1"
       }
     },
     "es-shim-unscopables": {
-      "version": "1.0.0",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+      "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
       "dev": true,
       "requires": {
-        "has": "^1.0.3"
+        "hasown": "^2.0.0"
       }
     },
     "es-to-primitive": {
@@ -35881,27 +36208,29 @@
       }
     },
     "eslint-plugin-react": {
-      "version": "7.33.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
-      "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+      "version": "7.34.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz",
+      "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==",
       "dev": true,
       "requires": {
-        "array-includes": "^3.1.6",
-        "array.prototype.flatmap": "^1.3.1",
-        "array.prototype.tosorted": "^1.1.1",
+        "array-includes": "^3.1.8",
+        "array.prototype.findlast": "^1.2.5",
+        "array.prototype.flatmap": "^1.3.2",
+        "array.prototype.toreversed": "^1.1.2",
+        "array.prototype.tosorted": "^1.1.3",
         "doctrine": "^2.1.0",
-        "es-iterator-helpers": "^1.0.12",
+        "es-iterator-helpers": "^1.0.19",
         "estraverse": "^5.3.0",
         "jsx-ast-utils": "^2.4.1 || ^3.0.0",
         "minimatch": "^3.1.2",
-        "object.entries": "^1.1.6",
-        "object.fromentries": "^2.0.6",
-        "object.hasown": "^1.1.2",
-        "object.values": "^1.1.6",
+        "object.entries": "^1.1.8",
+        "object.fromentries": "^2.0.8",
+        "object.hasown": "^1.1.4",
+        "object.values": "^1.2.0",
         "prop-types": "^15.8.1",
-        "resolve": "^2.0.0-next.4",
+        "resolve": "^2.0.0-next.5",
         "semver": "^6.3.1",
-        "string.prototype.matchall": "^4.0.8"
+        "string.prototype.matchall": "^4.0.11"
       },
       "dependencies": {
         "doctrine": {
@@ -35918,12 +36247,12 @@
           "dev": true
         },
         "resolve": {
-          "version": "2.0.0-next.4",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
-          "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+          "version": "2.0.0-next.5",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+          "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
           "dev": true,
           "requires": {
-            "is-core-module": "^2.9.0",
+            "is-core-module": "^2.13.0",
             "path-parse": "^1.0.7",
             "supports-preserve-symlinks-flag": "^1.0.0"
           }
@@ -36701,13 +37030,15 @@
       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
     },
     "function.prototype.name": {
-      "version": "1.1.5",
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+      "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
       "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.19.0",
-        "functions-have-names": "^1.2.2"
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "functions-have-names": "^1.2.3"
       }
     },
     "functions-have-names": {
@@ -36783,14 +37114,15 @@
       "dev": true
     },
     "get-intrinsic": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
-      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
       "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
         "has-proto": "^1.0.1",
-        "has-symbols": "^1.0.3"
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
       }
     },
     "get-package-type": {
@@ -36805,11 +37137,14 @@
       }
     },
     "get-symbol-description": {
-      "version": "1.0.0",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+      "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.1"
+        "call-bind": "^1.0.5",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4"
       }
     },
     "get-value": {
@@ -36949,6 +37284,7 @@
     },
     "has": {
       "version": "1.0.3",
+      "dev": true,
       "requires": {
         "function-bind": "^1.1.1"
       }
@@ -36961,23 +37297,27 @@
       "version": "3.0.0"
     },
     "has-property-descriptors": {
-      "version": "1.0.0",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
       "requires": {
-        "get-intrinsic": "^1.1.1"
+        "es-define-property": "^1.0.0"
       }
     },
     "has-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
-      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg=="
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
     },
     "has-symbols": {
       "version": "1.0.3"
     },
     "has-tostringtag": {
-      "version": "1.0.0",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
       "requires": {
-        "has-symbols": "^1.0.2"
+        "has-symbols": "^1.0.3"
       }
     },
     "has-unicode": {
@@ -37011,9 +37351,9 @@
       }
     },
     "hasown": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
-      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "requires": {
         "function-bind": "^1.1.2"
       }
@@ -37250,13 +37590,13 @@
       "dev": true
     },
     "internal-slot": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
-      "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+      "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
       "dev": true,
       "requires": {
-        "get-intrinsic": "^1.2.0",
-        "has": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "hasown": "^2.0.0",
         "side-channel": "^1.0.4"
       }
     },
@@ -37301,14 +37641,13 @@
       }
     },
     "is-array-buffer": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
-      "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+      "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
       "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.0",
-        "is-typed-array": "^1.1.10"
+        "get-intrinsic": "^1.2.1"
       }
     },
     "is-arrayish": {
@@ -37382,6 +37721,15 @@
         }
       }
     },
+    "is-data-view": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+      "dev": true,
+      "requires": {
+        "is-typed-array": "^1.1.13"
+      }
+    },
     "is-date-object": {
       "version": "1.0.5",
       "dev": true,
@@ -37466,7 +37814,9 @@
       }
     },
     "is-negative-zero": {
-      "version": "2.0.2",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
       "dev": true
     },
     "is-number": {
@@ -37528,10 +37878,12 @@
       "dev": true
     },
     "is-shared-array-buffer": {
-      "version": "1.0.2",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2"
+        "call-bind": "^1.0.7"
       }
     },
     "is-stream": {
@@ -37556,13 +37908,11 @@
       }
     },
     "is-typed-array": {
-      "version": "1.1.10",
+      "version": "1.1.13",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+      "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
       "requires": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.0"
+        "which-typed-array": "^1.1.14"
       }
     },
     "is-typedarray": {
@@ -43231,9 +43581,9 @@
       }
     },
     "object-inspect": {
-      "version": "1.12.3",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
-      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+      "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
     },
     "object-is": {
       "version": "1.1.5",
@@ -43253,34 +43603,37 @@
       }
     },
     "object.assign": {
-      "version": "4.1.4",
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
+        "call-bind": "^1.0.5",
+        "define-properties": "^1.2.1",
         "has-symbols": "^1.0.3",
         "object-keys": "^1.1.1"
       }
     },
     "object.entries": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
-      "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+      "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       }
     },
     "object.fromentries": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
-      "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+      "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
       }
     },
     "object.getownpropertydescriptors": {
@@ -43305,13 +43658,14 @@
       }
     },
     "object.hasown": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
-      "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz",
+      "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==",
       "dev": true,
       "requires": {
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
       }
     },
     "object.pick": {
@@ -43322,14 +43676,14 @@
       }
     },
     "object.values": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
-      "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+      "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       }
     },
     "oblivious-set": {
@@ -43511,6 +43865,11 @@
       "version": "0.1.1",
       "dev": true
     },
+    "possible-typed-array-names": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q=="
+    },
     "postcss": {
       "version": "8.4.35",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
@@ -44011,15 +44370,16 @@
       "version": "2.3.0"
     },
     "reflect.getprototypeof": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
-      "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
+      "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1",
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.1",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
         "globalthis": "^1.0.3",
         "which-builtin-type": "^1.1.3"
       }
@@ -44066,14 +44426,15 @@
       }
     },
     "regexp.prototype.flags": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
-      "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
+      "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "functions-have-names": "^1.2.3"
+        "call-bind": "^1.0.6",
+        "define-properties": "^1.2.1",
+        "es-errors": "^1.3.0",
+        "set-function-name": "^2.0.1"
       }
     },
     "regexpu-core": {
@@ -44338,13 +44699,13 @@
       "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
     },
     "safe-array-concat": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
-      "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+      "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.1",
+        "call-bind": "^1.0.7",
+        "get-intrinsic": "^1.2.4",
         "has-symbols": "^1.0.3",
         "isarray": "^2.0.5"
       },
@@ -44372,11 +44733,13 @@
       }
     },
     "safe-regex-test": {
-      "version": "1.0.0",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+      "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.1.3",
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
         "is-regex": "^1.1.4"
       }
     },
@@ -44485,15 +44848,29 @@
       "version": "2.0.0",
       "dev": true
     },
+    "set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "requires": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      }
+    },
     "set-function-name": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
-      "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
       "dev": true,
       "requires": {
-        "define-data-property": "^1.0.1",
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
         "functions-have-names": "^1.2.3",
-        "has-property-descriptors": "^1.0.0"
+        "has-property-descriptors": "^1.0.2"
       }
     },
     "set-value": {
@@ -44543,11 +44920,14 @@
       "peer": true
     },
     "side-channel": {
-      "version": "1.0.4",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
       "requires": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
       }
     },
     "signal-exit": {
@@ -45062,19 +45442,23 @@
       }
     },
     "string.prototype.matchall": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
-      "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
+      "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4",
-        "get-intrinsic": "^1.1.3",
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
         "has-symbols": "^1.0.3",
-        "internal-slot": "^1.0.3",
-        "regexp.prototype.flags": "^1.4.3",
-        "side-channel": "^1.0.4"
+        "internal-slot": "^1.0.7",
+        "regexp.prototype.flags": "^1.5.2",
+        "set-function-name": "^2.0.2",
+        "side-channel": "^1.0.6"
       }
     },
     "string.prototype.padend": {
@@ -45087,32 +45471,37 @@
       }
     },
     "string.prototype.trim": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
-      "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.0",
+        "es-object-atoms": "^1.0.0"
       }
     },
     "string.prototype.trimend": {
-      "version": "1.0.6",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       }
     },
     "string.prototype.trimstart": {
-      "version": "1.0.6",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.4",
-        "es-abstract": "^1.20.4"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       }
     },
     "strip-ansi": {
@@ -46118,50 +46507,55 @@
       }
     },
     "typed-array-buffer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
-      "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+      "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.1",
-        "is-typed-array": "^1.1.10"
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-typed-array": "^1.1.13"
       }
     },
     "typed-array-byte-length": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
-      "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+      "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "has-proto": "^1.0.1",
-        "is-typed-array": "^1.1.10"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
       }
     },
     "typed-array-byte-offset": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
-      "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+      "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
       "dev": true,
       "requires": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "has-proto": "^1.0.1",
-        "is-typed-array": "^1.1.10"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13"
       }
     },
     "typed-array-length": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
-      "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+      "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
-        "is-typed-array": "^1.1.9"
+        "gopd": "^1.0.1",
+        "has-proto": "^1.0.3",
+        "is-typed-array": "^1.1.13",
+        "possible-typed-array-names": "^1.0.0"
       }
     },
     "typedarray-to-buffer": {
@@ -46840,15 +47234,15 @@
       "peer": true
     },
     "which-typed-array": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
-      "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
       "requires": {
-        "available-typed-arrays": "^1.0.5",
-        "call-bind": "^1.0.2",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.7",
         "for-each": "^0.3.3",
         "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.0"
+        "has-tostringtag": "^1.0.2"
       }
     },
     "wide-align": {
diff --git a/package.json b/package.json
index 4fe98693b..06f672fcd 100644
--- a/package.json
+++ b/package.json
@@ -82,7 +82,7 @@
     "eslint-plugin-import": "^2.29.1",
     "eslint-plugin-jsx-a11y": "^6.7.1",
     "eslint-plugin-prettier": "^5.1.3",
-    "eslint-plugin-react": "^7.33.2",
+    "eslint-plugin-react": "^7.34.2",
     "eslint-plugin-react-hooks": "^4.6.0",
     "jest-enzyme": "^7.1.0",
     "jest-websocket-mock": "^2.5.0",

From 6f3e824c72cb71026028ca988211ccd329d7b441 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 3 Jun 2024 19:28:06 +0000
Subject: [PATCH 14/79] chore(deps): bump usehooks-ts from 2.9.1 to 3.1.0
 (#993)

---
 package-lock.json | 33 +++++++++++++++++----------------
 package.json      |  2 +-
 2 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b039594c6..540f5f8f4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -53,7 +53,7 @@
         "redux-thunk": "^2.2.0",
         "ripple-address-codec": "^5.0.0",
         "topojson-client": "^3.0.0",
-        "usehooks-ts": "^2.9.1",
+        "usehooks-ts": "^3.1.0",
         "vite": "^4.2.3",
         "vite-plugin-environment": "^1.1.3",
         "vite-plugin-html": "^3.2.0",
@@ -21241,8 +21241,7 @@
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-      "dev": true
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
     },
     "node_modules/lodash.escape": {
       "version": "4.0.1",
@@ -27138,16 +27137,17 @@
       }
     },
     "node_modules/usehooks-ts": {
-      "version": "2.9.1",
-      "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.9.1.tgz",
-      "integrity": "sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-3.1.0.tgz",
+      "integrity": "sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==",
+      "dependencies": {
+        "lodash.debounce": "^4.0.8"
+      },
       "engines": {
-        "node": ">=16.15.0",
-        "npm": ">=8"
+        "node": ">=16.15.0"
       },
       "peerDependencies": {
-        "react": "^16.8.0  || ^17.0.0 || ^18.0.0",
-        "react-dom": "^16.8.0  || ^17.0.0 || ^18.0.0"
+        "react": "^16.8.0  || ^17 || ^18"
       }
     },
     "node_modules/utf-8-validate": {
@@ -42774,8 +42774,7 @@
     "lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-      "dev": true
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
     },
     "lodash.escape": {
       "version": "4.0.1",
@@ -46706,10 +46705,12 @@
       "requires": {}
     },
     "usehooks-ts": {
-      "version": "2.9.1",
-      "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.9.1.tgz",
-      "integrity": "sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA==",
-      "requires": {}
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-3.1.0.tgz",
+      "integrity": "sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==",
+      "requires": {
+        "lodash.debounce": "^4.0.8"
+      }
     },
     "utf-8-validate": {
       "version": "5.0.8",
diff --git a/package.json b/package.json
index 06f672fcd..c7a22f153 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,7 @@
     "redux-thunk": "^2.2.0",
     "ripple-address-codec": "^5.0.0",
     "topojson-client": "^3.0.0",
-    "usehooks-ts": "^2.9.1",
+    "usehooks-ts": "^3.1.0",
     "vite": "^4.2.3",
     "vite-plugin-environment": "^1.1.3",
     "vite-plugin-html": "^3.2.0",

From c1cd631edcf2bc8c4913d61183a664e651dbee1e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 3 Jun 2024 19:33:31 +0000
Subject: [PATCH 15/79] chore(deps-dev): bump @types/node from 18.19.31 to
 18.19.33 (#994)

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 540f5f8f4..898b4ee53 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -69,7 +69,7 @@
         "@types/enzyme": "^3.10.12",
         "@types/jest": "^26.0.24",
         "@types/lodash": "^4.14.194",
-        "@types/node": "^18.19.31",
+        "@types/node": "^18.19.33",
         "@types/react": "^17.0.39",
         "@types/react-dom": "^17.0.9",
         "@types/react-redux": "^7.1.22",
@@ -6086,9 +6086,9 @@
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "18.19.31",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz",
-      "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==",
+      "version": "18.19.33",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz",
+      "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==",
       "devOptional": true,
       "dependencies": {
         "undici-types": "~5.26.4"
@@ -32306,9 +32306,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "18.19.31",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz",
-      "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==",
+      "version": "18.19.33",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz",
+      "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==",
       "devOptional": true,
       "requires": {
         "undici-types": "~5.26.4"
diff --git a/package.json b/package.json
index c7a22f153..687c9718f 100644
--- a/package.json
+++ b/package.json
@@ -64,7 +64,7 @@
     "@types/enzyme": "^3.10.12",
     "@types/jest": "^26.0.24",
     "@types/lodash": "^4.14.194",
-    "@types/node": "^18.19.31",
+    "@types/node": "^18.19.33",
     "@types/react": "^17.0.39",
     "@types/react-dom": "^17.0.9",
     "@types/react-redux": "^7.1.22",

From a551eb563293ad5ed9ecbc74f34af9dcdf52fa3d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 3 Jun 2024 20:51:19 +0000
Subject: [PATCH 16/79] chore(deps): bump xrpl-client from 2.1.0 to 2.4.0
 (#995)

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 898b4ee53..11751ec71 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -59,7 +59,7 @@
         "vite-plugin-html": "^3.2.0",
         "vite-plugin-svgr": "^4.2.0",
         "vite-tsconfig-paths": "^4.2.0",
-        "xrpl-client": "^2.1.0"
+        "xrpl-client": "^2.4.0"
       },
       "devDependencies": {
         "@babel/eslint-parser": "^7.22.6",
@@ -28220,9 +28220,9 @@
       }
     },
     "node_modules/xrpl-client": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/xrpl-client/-/xrpl-client-2.1.0.tgz",
-      "integrity": "sha512-WuMQHTPFgEPq4yXA01vgoVI01iNNFmdHK0OTJoVf/PT6fAJWfTwJwV3AKh1Z7wmQqsAnlKVnMh8g7XzJqS0mFg==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/xrpl-client/-/xrpl-client-2.4.0.tgz",
+      "integrity": "sha512-UQiCHVtdqqXt5uzOEZzQZ+idXvVJDnXrTjaQ5wwYDAolI6YXSBZCXWaljdY8b10LEZqq6Xr8dMaSHivr8P4LIQ==",
       "dependencies": {
         "debug": "^4.1.1",
         "websocket": "^1.0.34"
@@ -47389,9 +47389,9 @@
       }
     },
     "xrpl-client": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/xrpl-client/-/xrpl-client-2.1.0.tgz",
-      "integrity": "sha512-WuMQHTPFgEPq4yXA01vgoVI01iNNFmdHK0OTJoVf/PT6fAJWfTwJwV3AKh1Z7wmQqsAnlKVnMh8g7XzJqS0mFg==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/xrpl-client/-/xrpl-client-2.4.0.tgz",
+      "integrity": "sha512-UQiCHVtdqqXt5uzOEZzQZ+idXvVJDnXrTjaQ5wwYDAolI6YXSBZCXWaljdY8b10LEZqq6Xr8dMaSHivr8P4LIQ==",
       "requires": {
         "debug": "^4.1.1",
         "websocket": "^1.0.34"
diff --git a/package.json b/package.json
index 687c9718f..1bd418589 100644
--- a/package.json
+++ b/package.json
@@ -54,7 +54,7 @@
     "vite-plugin-html": "^3.2.0",
     "vite-plugin-svgr": "^4.2.0",
     "vite-tsconfig-paths": "^4.2.0",
-    "xrpl-client": "^2.1.0"
+    "xrpl-client": "^2.4.0"
   },
   "devDependencies": {
     "@babel/eslint-parser": "^7.22.6",

From 9e98d376e573e9450dc8e47b605abe8985c46018 Mon Sep 17 00:00:00 2001
From: pdp2121 <71317875+pdp2121@users.noreply.github.com>
Date: Tue, 2 Jul 2024 13:24:45 -0400
Subject: [PATCH 17/79] fix: amendmentUtils rippled link (#1002)

## High Level Overview of Change

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

The link to populate amendment names by id has been changed to:

https://raw.githubusercontent.com/XRPLF/rippled/develop/src/libxrpl/protocol/Feature.cpp

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release
---
 src/containers/shared/amendmentUtils.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/containers/shared/amendmentUtils.ts b/src/containers/shared/amendmentUtils.ts
index d1961bd22..96e189e33 100644
--- a/src/containers/shared/amendmentUtils.ts
+++ b/src/containers/shared/amendmentUtils.ts
@@ -33,7 +33,7 @@ export function getExpectedDate(date: string, language: string) {
 
 async function fetchAmendmentNames() {
   const response = await axios.get(
-    'https://raw.githubusercontent.com/ripple/rippled/develop/src/ripple/protocol/impl/Feature.cpp',
+    'https://raw.githubusercontent.com/XRPLF/rippled/develop/src/libxrpl/protocol/Feature.cpp',
   )
   const text = response.data
 

From 30a622355c9d4204f268a1733b417d3ac78a9e46 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 3 Jul 2024 11:02:38 -0500
Subject: [PATCH 18/79] chore(deps): bump react-router-dom from 6.18.0 to
 6.24.0 (#1004)

Bumps
[react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom)
from 6.18.0 to 6.24.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/remix-run/react-router/releases">react-router-dom's
releases</a>.</em></p>
<blockquote>
<h2>react-router-dom-v5-compat@6.4.0-pre.15</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies
<ul>
<li>react-router@6.4.0-pre.15</li>
<li>react-router-dom@6.4.0-pre.15</li>
</ul>
</li>
</ul>
<h2>react-router-dom-v5-compat@6.4.0-pre.11</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies
<ul>
<li>react-router@6.4.0-pre.11</li>
<li>react-router-dom@6.4.0-pre.11</li>
</ul>
</li>
</ul>
<h2>react-router-dom-v5-compat@6.4.0-pre.10</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies
<ul>
<li>react-router@6.4.0-pre.10</li>
<li>react-router-dom@6.4.0-pre.10</li>
</ul>
</li>
</ul>
<h2>react-router-dom-v5-compat@6.4.0-pre.9</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies
<ul>
<li>react-router@6.4.0-pre.9</li>
<li>react-router-dom@6.4.0-pre.9</li>
</ul>
</li>
</ul>
<h2>react-router-dom-v5-compat@6.4.0-pre.8</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies
<ul>
<li>react-router@6.4.0-pre.8</li>
<li>react-router-dom@6.4.0-pre.8</li>
</ul>
</li>
</ul>
<h2>react-router-dom-v5-compat@6.4.0-pre.7</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies
<ul>
<li><code>react-router@6.4.0-pre.7</code></li>
<li><code>react-router-dom@6.4.0-pre.7</code></li>
</ul>
</li>
</ul>
<h2>react-router-dom-v5-compat@6.4.0-pre.6</h2>
<h3>Patch Changes</h3>
<ul>
<li>44bce3c6: Fix <code>react-router-dom</code> peer dependency version
<ul>
<li>react-router@6.4.0-pre.6</li>
<li>react-router-dom@6.4.0-pre.6</li>
</ul>
</li>
</ul>
<h2>react-router-dom-v5-compat@6.4.0-pre.5</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md">react-router-dom's
changelog</a>.</em></p>
<blockquote>
<h2>6.24.0</h2>
<h3>Minor Changes</h3>
<ul>
<li>
<p>Add support for Lazy Route Discovery (a.k.a. Fog of War) (<a
href="https://redirect.github.com/remix-run/react-router/pull/11626">#11626</a>)</p>
<ul>
<li>RFC: <a
href="https://github.com/remix-run/react-router/discussions/11113">https://github.com/remix-run/react-router/discussions/11113</a></li>
<li><code>unstable_patchRoutesOnMiss</code> docs: <a
href="https://reactrouter.com/en/main/routers/create-browser-router">https://reactrouter.com/en/main/routers/create-browser-router</a></li>
</ul>
</li>
</ul>
<h3>Patch Changes</h3>
<ul>
<li>Fix <code>fetcher.submit</code> types - remove incorrect
<code>navigate</code>/<code>fetcherKey</code>/<code>unstable_viewTransition</code>
options because they are only relevant for <code>useSubmit</code> (<a
href="https://redirect.github.com/remix-run/react-router/pull/11631">#11631</a>)</li>
<li>Allow falsy <code>location.state</code> values passed to
<code>&lt;StaticRouter&gt;</code> (<a
href="https://redirect.github.com/remix-run/react-router/pull/11495">#11495</a>)</li>
<li>Updated dependencies:
<ul>
<li><code>react-router@6.24.0</code></li>
<li><code>@remix-run/router@1.17.0</code></li>
</ul>
</li>
</ul>
<h2>6.23.1</h2>
<h3>Patch Changes</h3>
<ul>
<li>Check for <code>document</code> existence when checking
<code>startViewTransition</code> (<a
href="https://redirect.github.com/remix-run/react-router/pull/11544">#11544</a>)</li>
<li>Change the <code>react-router-dom/server</code> import back to
<code>react-router-dom</code> instead of <code>index.ts</code> (<a
href="https://redirect.github.com/remix-run/react-router/pull/11514">#11514</a>)</li>
<li>Updated dependencies:
<ul>
<li><code>@remix-run/router@1.16.1</code></li>
<li><code>react-router@6.23.1</code></li>
</ul>
</li>
</ul>
<h2>6.23.0</h2>
<h3>Minor Changes</h3>
<ul>
<li>Add a new <code>unstable_dataStrategy</code> configuration option
(<a
href="https://redirect.github.com/remix-run/react-router/pull/11098">#11098</a>)
<ul>
<li>This option allows Data Router applications to take control over the
approach for executing route loaders and actions</li>
<li>The default implementation is today's behavior, to fetch all loaders
in parallel, but this option allows users to implement more advanced
data flows including Remix single-fetch, middleware/context APIs,
automatic loader caching, and more</li>
</ul>
</li>
</ul>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies:
<ul>
<li><code>@remix-run/router@1.16.0</code></li>
<li><code>react-router@6.23.0</code></li>
</ul>
</li>
</ul>
<h2>6.22.3</h2>
<h3>Patch Changes</h3>
<ul>
<li>Updated dependencies:
<ul>
<li><code>@remix-run/router@1.15.3</code></li>
<li><code>react-router@6.22.3</code></li>
</ul>
</li>
</ul>
<h2>6.22.2</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/remix-run/react-router/commit/a569d7699fbd6760fd2d5a339aab9bc0caf750ab"><code>a569d76</code></a>
chore: Update version for release (<a
href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/11717">#11717</a>)</li>
<li><a
href="https://github.com/remix-run/react-router/commit/a2f718bb037d9ec82d82339bade7e82af0bc8b1a"><code>a2f718b</code></a>
chore: Update version for release (pre) (<a
href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/11661">#11661</a>)</li>
<li><a
href="https://github.com/remix-run/react-router/commit/4e85e9884c2c0c7125edc91941b3e023a9d3180c"><code>4e85e98</code></a>
Support lazy route discovery (fog of war) (<a
href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/11626">#11626</a>)</li>
<li><a
href="https://github.com/remix-run/react-router/commit/be8a2590eb3ebd91294835031ff788d4fd59070c"><code>be8a259</code></a>
Fix fetcher.submit types (<a
href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/11631">#11631</a>)</li>
<li><a
href="https://github.com/remix-run/react-router/commit/58dcfbb97db73a6d29f12a9ab8567540b8e9a24b"><code>58dcfbb</code></a>
Merge branch 'release-next' into dev</li>
<li><a
href="https://github.com/remix-run/react-router/commit/aef5c4a617756e6fcc493de17b4be9997a5a19c8"><code>aef5c4a</code></a>
chore: Update version for release (<a
href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/11551">#11551</a>)</li>
<li><a
href="https://github.com/remix-run/react-router/commit/26bc8e295398b571104ef529149c22a0724eeb7e"><code>26bc8e2</code></a>
chore: Update version for release (pre) (<a
href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/11545">#11545</a>)</li>
<li><a
href="https://github.com/remix-run/react-router/commit/031478d4acc46cc631673ef14e3215fac97dee8b"><code>031478d</code></a>
Add defensive window.document check when checking for
startViewTransition (<a
href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/1">#1</a>...</li>
<li><a
href="https://github.com/remix-run/react-router/commit/127e69343f8eeb2233a8bec37d97fca5541f90a1"><code>127e693</code></a>
Fix useLocation to receive 0 instead of null when state is set to 0 (<a
href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/11495">#11495</a>)</li>
<li><a
href="https://github.com/remix-run/react-router/commit/9651465485fc6c96c1dd793a96d8af8f1ebf42d0"><code>9651465</code></a>
chore: Update version for release (pre) (<a
href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/11516">#11516</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/remix-run/react-router/commits/react-router-dom@6.24.0/packages/react-router-dom">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=react-router-dom&package-manager=npm_and_yarn&previous-version=6.18.0&new-version=6.24.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 package-lock.json | 50 +++++++++++++++++++++++------------------------
 package.json      |  2 +-
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 11751ec71..95406dc95 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -45,7 +45,7 @@
         "react-query": "^3.39.3",
         "react-redux": "^8.1.3",
         "react-router": "^6.12.1",
-        "react-router-dom": "^6.18.0",
+        "react-router-dom": "^6.24.0",
         "react18-json-view": "^0.2.7",
         "recharts": "^2.12.6",
         "redux": "^5.0.1",
@@ -5438,9 +5438,9 @@
       }
     },
     "node_modules/@remix-run/router": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz",
-      "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==",
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.0.tgz",
+      "integrity": "sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw==",
       "engines": {
         "node": ">=14.0.0"
       }
@@ -23476,11 +23476,11 @@
       "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
     },
     "node_modules/react-router": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz",
-      "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==",
+      "version": "6.24.0",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.0.tgz",
+      "integrity": "sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg==",
       "dependencies": {
-        "@remix-run/router": "1.11.0"
+        "@remix-run/router": "1.17.0"
       },
       "engines": {
         "node": ">=14.0.0"
@@ -23490,12 +23490,12 @@
       }
     },
     "node_modules/react-router-dom": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz",
-      "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==",
+      "version": "6.24.0",
+      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.0.tgz",
+      "integrity": "sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g==",
       "dependencies": {
-        "@remix-run/router": "1.11.0",
-        "react-router": "6.18.0"
+        "@remix-run/router": "1.17.0",
+        "react-router": "6.24.0"
       },
       "engines": {
         "node": ">=14.0.0"
@@ -31849,9 +31849,9 @@
       }
     },
     "@remix-run/router": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz",
-      "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ=="
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.0.tgz",
+      "integrity": "sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw=="
     },
     "@rollup/plugin-inject": {
       "version": "5.0.5",
@@ -44210,20 +44210,20 @@
       }
     },
     "react-router": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz",
-      "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==",
+      "version": "6.24.0",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.0.tgz",
+      "integrity": "sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg==",
       "requires": {
-        "@remix-run/router": "1.11.0"
+        "@remix-run/router": "1.17.0"
       }
     },
     "react-router-dom": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz",
-      "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==",
+      "version": "6.24.0",
+      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.0.tgz",
+      "integrity": "sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g==",
       "requires": {
-        "@remix-run/router": "1.11.0",
-        "react-router": "6.18.0"
+        "@remix-run/router": "1.17.0",
+        "react-router": "6.24.0"
       }
     },
     "react-shallow-renderer": {
diff --git a/package.json b/package.json
index 1bd418589..a436575b0 100644
--- a/package.json
+++ b/package.json
@@ -40,7 +40,7 @@
     "react-query": "^3.39.3",
     "react-redux": "^8.1.3",
     "react-router": "^6.12.1",
-    "react-router-dom": "^6.18.0",
+    "react-router-dom": "^6.24.0",
     "react18-json-view": "^0.2.7",
     "recharts": "^2.12.6",
     "redux": "^5.0.1",

From bc2d613ae22e696555c51b0ea4bb89649fcafbac Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 3 Jul 2024 17:25:40 +0000
Subject: [PATCH 19/79] chore(deps-dev): bump @types/lodash from 4.14.194 to
 4.17.6 (#1006)

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 95406dc95..642797b3e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -68,7 +68,7 @@
         "@types/create-hash": "^1.2.2",
         "@types/enzyme": "^3.10.12",
         "@types/jest": "^26.0.24",
-        "@types/lodash": "^4.14.194",
+        "@types/lodash": "^4.17.6",
         "@types/node": "^18.19.33",
         "@types/react": "^17.0.39",
         "@types/react-dom": "^17.0.9",
@@ -6074,9 +6074,9 @@
       "dev": true
     },
     "node_modules/@types/lodash": {
-      "version": "4.14.194",
-      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz",
-      "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==",
+      "version": "4.17.6",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.6.tgz",
+      "integrity": "sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==",
       "dev": true
     },
     "node_modules/@types/minimist": {
@@ -32294,9 +32294,9 @@
       "dev": true
     },
     "@types/lodash": {
-      "version": "4.14.194",
-      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz",
-      "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==",
+      "version": "4.17.6",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.6.tgz",
+      "integrity": "sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==",
       "dev": true
     },
     "@types/minimist": {
diff --git a/package.json b/package.json
index a436575b0..63b2241fe 100644
--- a/package.json
+++ b/package.json
@@ -63,7 +63,7 @@
     "@types/create-hash": "^1.2.2",
     "@types/enzyme": "^3.10.12",
     "@types/jest": "^26.0.24",
-    "@types/lodash": "^4.14.194",
+    "@types/lodash": "^4.17.6",
     "@types/node": "^18.19.33",
     "@types/react": "^17.0.39",
     "@types/react-dom": "^17.0.9",

From 81be2d02fd06760966bd11c9cb2ebc858fdbf3c3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 3 Jul 2024 17:31:16 +0000
Subject: [PATCH 20/79] chore(deps-dev): bump @babel/preset-react from 7.22.15
 to 7.24.7 (#1007)

---
 package-lock.json | 504 +++++++++++++++++++++++-----------------------
 package.json      |   2 +-
 2 files changed, 258 insertions(+), 248 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 642797b3e..d20793619 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -64,7 +64,7 @@
       "devDependencies": {
         "@babel/eslint-parser": "^7.22.6",
         "@babel/preset-env": "^7.24.5",
-        "@babel/preset-react": "^7.22.15",
+        "@babel/preset-react": "^7.24.7",
         "@types/create-hash": "^1.2.2",
         "@types/enzyme": "^3.10.12",
         "@types/jest": "^26.0.24",
@@ -152,12 +152,12 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.23.5",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
-      "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+      "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.23.4",
-        "chalk": "^2.4.2"
+        "@babel/highlight": "^7.24.7",
+        "picocolors": "^1.0.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -240,13 +240,13 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
-      "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+      "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.23.6",
-        "@jridgewell/gen-mapping": "^0.3.2",
-        "@jridgewell/trace-mapping": "^0.3.17",
+        "@babel/types": "^7.24.7",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^2.5.1"
       },
       "engines": {
@@ -254,12 +254,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+      "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -388,31 +388,34 @@
       }
     },
     "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"
@@ -431,11 +434,12 @@
       }
     },
     "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.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/types": "^7.24.0"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -472,9 +476,9 @@
       }
     },
     "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.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"
       }
@@ -537,36 +541,36 @@
       }
     },
     "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"
       }
@@ -599,22 +603,23 @@
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
-      "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+      "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.22.20",
+        "@babel/helper-validator-identifier": "^7.24.7",
         "chalk": "^2.4.2",
-        "js-tokens": "^4.0.0"
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "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"
       },
@@ -955,12 +960,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-jsx": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
-      "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
+      "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==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1713,12 +1718,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-display-name": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz",
-      "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz",
+      "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1728,16 +1733,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-jsx": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz",
-      "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz",
+      "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==",
       "dev": true,
       "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.22.5",
-        "@babel/types": "^7.22.15"
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-jsx": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1747,12 +1752,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz",
+      "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==",
       "dev": true,
       "dependencies": {
-        "@babel/plugin-transform-react-jsx": "^7.22.5"
+        "@babel/plugin-transform-react-jsx": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1790,13 +1795,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-pure-annotations": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz",
-      "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz",
+      "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2182,17 +2187,17 @@
       }
     },
     "node_modules/@babel/preset-react": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz",
-      "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz",
+      "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.15",
-        "@babel/plugin-transform-react-display-name": "^7.22.5",
-        "@babel/plugin-transform-react-jsx": "^7.22.15",
-        "@babel/plugin-transform-react-jsx-development": "^7.22.5",
-        "@babel/plugin-transform-react-pure-annotations": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-transform-react-display-name": "^7.24.7",
+        "@babel/plugin-transform-react-jsx": "^7.24.7",
+        "@babel/plugin-transform-react-jsx-development": "^7.24.7",
+        "@babel/plugin-transform-react-pure-annotations": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2238,31 +2243,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.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz",
-      "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==",
-      "dependencies": {
-        "@babel/code-frame": "^7.23.5",
-        "@babel/generator": "^7.23.6",
-        "@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.22.6",
-        "@babel/parser": "^7.23.6",
-        "@babel/types": "^7.23.6",
+      "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"
       },
@@ -2271,12 +2276,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": {
@@ -5177,13 +5182,13 @@
       }
     },
     "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
-      "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
       "dependencies": {
-        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.9"
+        "@jridgewell/trace-mapping": "^0.3.24"
       },
       "engines": {
         "node": ">=6.0.0"
@@ -5198,9 +5203,9 @@
       }
     },
     "node_modules/@jridgewell/set-array": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
-      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
       "engines": {
         "node": ">=6.0.0"
       }
@@ -5220,9 +5225,9 @@
       "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
     },
     "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.22",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
-      "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
         "@jridgewell/sourcemap-codec": "^1.4.14"
@@ -28327,12 +28332,12 @@
       }
     },
     "@babel/code-frame": {
-      "version": "7.23.5",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
-      "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+      "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==",
       "requires": {
-        "@babel/highlight": "^7.23.4",
-        "chalk": "^2.4.2"
+        "@babel/highlight": "^7.24.7",
+        "picocolors": "^1.0.0"
       }
     },
     "@babel/compat-data": {
@@ -28392,23 +28397,23 @@
       }
     },
     "@babel/generator": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
-      "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz",
+      "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==",
       "requires": {
-        "@babel/types": "^7.23.6",
-        "@jridgewell/gen-mapping": "^0.3.2",
-        "@jridgewell/trace-mapping": "^0.3.17",
+        "@babel/types": "^7.24.7",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^2.5.1"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+      "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
@@ -28510,25 +28515,28 @@
       }
     },
     "@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==",
+      "requires": {
+        "@babel/types": "^7.24.7"
+      }
     },
     "@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==",
       "requires": {
-        "@babel/template": "^7.22.15",
-        "@babel/types": "^7.23.0"
+        "@babel/template": "^7.24.7",
+        "@babel/types": "^7.24.7"
       }
     },
     "@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==",
       "requires": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       }
     },
     "@babel/helper-member-expression-to-functions": {
@@ -28541,11 +28549,12 @@
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+      "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
       "requires": {
-        "@babel/types": "^7.24.0"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       }
     },
     "@babel/helper-module-transforms": {
@@ -28570,9 +28579,9 @@
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
+      "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg=="
     },
     "@babel/helper-remap-async-to-generator": {
       "version": "7.22.20",
@@ -28614,27 +28623,27 @@
       }
     },
     "@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==",
       "requires": {
-        "@babel/types": "^7.24.5"
+        "@babel/types": "^7.24.7"
       }
     },
     "@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=="
     },
     "@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=="
     },
     "@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=="
     },
     "@babel/helper-wrap-function": {
       "version": "7.24.5",
@@ -28658,19 +28667,20 @@
       }
     },
     "@babel/highlight": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
-      "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
       "requires": {
-        "@babel/helper-validator-identifier": "^7.22.20",
+        "@babel/helper-validator-identifier": "^7.24.7",
         "chalk": "^2.4.2",
-        "js-tokens": "^4.0.0"
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
       }
     },
     "@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=="
     },
     "@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
       "version": "7.24.5",
@@ -28886,12 +28896,12 @@
       }
     },
     "@babel/plugin-syntax-jsx": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
-      "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
+      "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==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@babel/plugin-syntax-logical-assignment-operators": {
@@ -29361,34 +29371,34 @@
       }
     },
     "@babel/plugin-transform-react-display-name": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz",
-      "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz",
+      "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@babel/plugin-transform-react-jsx": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz",
-      "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz",
+      "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==",
       "dev": true,
       "requires": {
-        "@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.22.5",
-        "@babel/types": "^7.22.15"
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-jsx": "^7.24.7",
+        "@babel/types": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz",
+      "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==",
       "dev": true,
       "requires": {
-        "@babel/plugin-transform-react-jsx": "^7.22.5"
+        "@babel/plugin-transform-react-jsx": "^7.24.7"
       }
     },
     "@babel/plugin-transform-react-jsx-self": {
@@ -29408,13 +29418,13 @@
       }
     },
     "@babel/plugin-transform-react-pure-annotations": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz",
-      "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz",
+      "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@babel/plugin-transform-regenerator": {
@@ -29696,17 +29706,17 @@
       }
     },
     "@babel/preset-react": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz",
-      "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz",
+      "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.15",
-        "@babel/plugin-transform-react-display-name": "^7.22.5",
-        "@babel/plugin-transform-react-jsx": "^7.22.15",
-        "@babel/plugin-transform-react-jsx-development": "^7.22.5",
-        "@babel/plugin-transform-react-pure-annotations": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-transform-react-display-name": "^7.24.7",
+        "@babel/plugin-transform-react-jsx": "^7.24.7",
+        "@babel/plugin-transform-react-jsx-development": "^7.24.7",
+        "@babel/plugin-transform-react-pure-annotations": "^7.24.7"
       }
     },
     "@babel/preset-typescript": {
@@ -29737,39 +29747,39 @@
       }
     },
     "@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==",
       "requires": {
-        "@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"
       }
     },
     "@babel/traverse": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz",
-      "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==",
-      "requires": {
-        "@babel/code-frame": "^7.23.5",
-        "@babel/generator": "^7.23.6",
-        "@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.22.6",
-        "@babel/parser": "^7.23.6",
-        "@babel/types": "^7.23.6",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz",
+      "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==",
+      "requires": {
+        "@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"
       }
     },
     "@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==",
       "requires": {
-        "@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"
       }
     },
@@ -31674,13 +31684,13 @@
       }
     },
     "@jridgewell/gen-mapping": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
-      "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
       "requires": {
-        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.9"
+        "@jridgewell/trace-mapping": "^0.3.24"
       }
     },
     "@jridgewell/resolve-uri": {
@@ -31689,9 +31699,9 @@
       "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
     },
     "@jridgewell/set-array": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
-      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="
     },
     "@jridgewell/source-map": {
       "version": "0.3.2",
@@ -31708,9 +31718,9 @@
       "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
     },
     "@jridgewell/trace-mapping": {
-      "version": "0.3.22",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
-      "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "requires": {
         "@jridgewell/resolve-uri": "^3.1.0",
         "@jridgewell/sourcemap-codec": "^1.4.14"
diff --git a/package.json b/package.json
index 63b2241fe..ce67b1da0 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,7 @@
   "devDependencies": {
     "@babel/eslint-parser": "^7.22.6",
     "@babel/preset-env": "^7.24.5",
-    "@babel/preset-react": "^7.22.15",
+    "@babel/preset-react": "^7.24.7",
     "@types/create-hash": "^1.2.2",
     "@types/enzyme": "^3.10.12",
     "@types/jest": "^26.0.24",

From cd21a6cbf3ffa1f9036f2c0e508850e187dc0513 Mon Sep 17 00:00:00 2001
From: Mayukha Vadari <mvadari@ripple.com>
Date: Fri, 5 Jul 2024 11:45:00 -0400
Subject: [PATCH 21/79] fix: remove xchain from legend (#1013)

## High Level Overview of Change

This PR removes `XChain` from the homepage legend.

### Context of Change

XLS-38 has been put on hiatus for now. If it starts moving back towards
being activated, we can revert this commit.

### Type of Change

- [x] Bug fix (non-breaking change which fixes an issue)
---
 src/containers/Ledgers/Legend.tsx           | 1 -
 src/containers/Ledgers/test/Legend.test.tsx | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/containers/Ledgers/Legend.tsx b/src/containers/Ledgers/Legend.tsx
index d0b7e764f..d4a408fbc 100644
--- a/src/containers/Ledgers/Legend.tsx
+++ b/src/containers/Ledgers/Legend.tsx
@@ -39,7 +39,6 @@ export const Legend = () => {
     TransactionCategory.DEX,
     TransactionCategory.NFT,
     TransactionCategory.ACCOUNT,
-    TransactionCategory.XCHAIN,
     TransactionCategory.PSEUDO,
     TransactionCategory.UNKNOWN,
   ]
diff --git a/src/containers/Ledgers/test/Legend.test.tsx b/src/containers/Ledgers/test/Legend.test.tsx
index 8f9336301..4624cb95e 100644
--- a/src/containers/Ledgers/test/Legend.test.tsx
+++ b/src/containers/Ledgers/test/Legend.test.tsx
@@ -27,7 +27,7 @@ describe(`Legend`, () => {
     expect(wrapper.find('.legend-heading')).toHaveLength(2)
     expect(wrapper.find('.legend-section')).toHaveLength(2)
     expect(wrapper.find(TransactionActionIcon)).toHaveLength(5)
-    expect(wrapper.find('.legend-category')).toHaveLength(7)
+    expect(wrapper.find('.legend-category')).toHaveLength(6)
     wrapper.unmount()
   })
   it(`renders open when localStorage entry 'explorer-legend-previous-interaction' is set to false`, () => {

From 9660793c3b887ba86e0efac5dc838ea6b994f6c1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 8 Jul 2024 16:10:29 +0000
Subject: [PATCH 22/79] chore(deps-dev): bump xrpl from 3.0.0 to 3.1.0 (#1005)

---
 package-lock.json | 50 +++++++++++++++++++++++------------------------
 package.json      |  2 +-
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d20793619..383903997 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -111,7 +111,7 @@
         "ts-jest": "^26.5.6",
         "ts-node": "^10.9.2",
         "typescript": "^4.9.4",
-        "xrpl": "^3.0.0"
+        "xrpl": "^3.1.0"
       },
       "engines": {
         "node": ">=18.0.0 <19",
@@ -6838,9 +6838,9 @@
       }
     },
     "node_modules/@xrplf/isomorphic": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.0.tgz",
-      "integrity": "sha512-IyMsxyjkJK8YWq566KyuFuh/PUiLzQ02RbUO5qa+vEQb6zIAR9MzFwN7wBmBy7wmKkjligcdNDMG5EaBRH8FxQ==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.1.tgz",
+      "integrity": "sha512-0bIpgx8PDjYdrLFeC3csF305QQ1L7sxaWnL5y71mCvhenZzJgku9QsA+9QCXBC1eNYtxWO/xR91zrXJy2T/ixg==",
       "dependencies": {
         "@noble/hashes": "^1.0.0",
         "eventemitter3": "5.0.1",
@@ -24085,12 +24085,12 @@
       }
     },
     "node_modules/ripple-binary-codec": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.0.0.tgz",
-      "integrity": "sha512-zakENc9A5dlW85uzrmQHrJehymhL59ftggboRNrjxFDJdlNJ6DSE210P3ys/9kL0oVtOzFnTrOPFfxHZeOsA/Q==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.1.0.tgz",
+      "integrity": "sha512-q0GAx+hj3UVcDbhXVjk7qeNfgUMehlElYJwiCuIBwqs/51GVTOwLr39Ht3eNsX5ow2xPRaC5mqHwcFDvLRm6cA==",
       "dev": true,
       "dependencies": {
-        "@xrplf/isomorphic": "^1.0.0",
+        "@xrplf/isomorphic": "^1.0.1",
         "bignumber.js": "^9.0.0",
         "ripple-address-codec": "^5.0.0"
       },
@@ -28204,20 +28204,20 @@
       "peer": true
     },
     "node_modules/xrpl": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.0.0.tgz",
-      "integrity": "sha512-QC+dNx3tvMEn9IrxcXFFa0rWwvBwACkGFNKl+W2miMGYnlgSiIsnjdqwtG2WRs0Pyxs5dd9nBTQHyQ1BPxZ78A==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.1.0.tgz",
+      "integrity": "sha512-+97WiaF/AQTT6fXgD9Z5xyYbtlML0USCWrZFYjrC57yqtlWluacwwbMZa/I6ByVIKqCqVXJwRuRl20IQGlVGlg==",
       "dev": true,
       "dependencies": {
         "@scure/bip32": "^1.3.1",
         "@scure/bip39": "^1.2.1",
-        "@xrplf/isomorphic": "^1.0.0",
+        "@xrplf/isomorphic": "^1.0.1",
         "@xrplf/secret-numbers": "^1.0.0",
         "bignumber.js": "^9.0.0",
         "cross-fetch": "^4.0.0",
         "eventemitter3": "^5.0.1",
         "ripple-address-codec": "^5.0.0",
-        "ripple-binary-codec": "^2.0.0",
+        "ripple-binary-codec": "^2.1.0",
         "ripple-keypairs": "^2.0.0"
       },
       "engines": {
@@ -32795,9 +32795,9 @@
       }
     },
     "@xrplf/isomorphic": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.0.tgz",
-      "integrity": "sha512-IyMsxyjkJK8YWq566KyuFuh/PUiLzQ02RbUO5qa+vEQb6zIAR9MzFwN7wBmBy7wmKkjligcdNDMG5EaBRH8FxQ==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.1.tgz",
+      "integrity": "sha512-0bIpgx8PDjYdrLFeC3csF305QQ1L7sxaWnL5y71mCvhenZzJgku9QsA+9QCXBC1eNYtxWO/xR91zrXJy2T/ixg==",
       "requires": {
         "@noble/hashes": "^1.0.0",
         "eventemitter3": "5.0.1",
@@ -44642,12 +44642,12 @@
       }
     },
     "ripple-binary-codec": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.0.0.tgz",
-      "integrity": "sha512-zakENc9A5dlW85uzrmQHrJehymhL59ftggboRNrjxFDJdlNJ6DSE210P3ys/9kL0oVtOzFnTrOPFfxHZeOsA/Q==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.1.0.tgz",
+      "integrity": "sha512-q0GAx+hj3UVcDbhXVjk7qeNfgUMehlElYJwiCuIBwqs/51GVTOwLr39Ht3eNsX5ow2xPRaC5mqHwcFDvLRm6cA==",
       "dev": true,
       "requires": {
-        "@xrplf/isomorphic": "^1.0.0",
+        "@xrplf/isomorphic": "^1.0.1",
         "bignumber.js": "^9.0.0",
         "ripple-address-codec": "^5.0.0"
       }
@@ -47364,20 +47364,20 @@
       "peer": true
     },
     "xrpl": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.0.0.tgz",
-      "integrity": "sha512-QC+dNx3tvMEn9IrxcXFFa0rWwvBwACkGFNKl+W2miMGYnlgSiIsnjdqwtG2WRs0Pyxs5dd9nBTQHyQ1BPxZ78A==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.1.0.tgz",
+      "integrity": "sha512-+97WiaF/AQTT6fXgD9Z5xyYbtlML0USCWrZFYjrC57yqtlWluacwwbMZa/I6ByVIKqCqVXJwRuRl20IQGlVGlg==",
       "dev": true,
       "requires": {
         "@scure/bip32": "^1.3.1",
         "@scure/bip39": "^1.2.1",
-        "@xrplf/isomorphic": "^1.0.0",
+        "@xrplf/isomorphic": "^1.0.1",
         "@xrplf/secret-numbers": "^1.0.0",
         "bignumber.js": "^9.0.0",
         "cross-fetch": "^4.0.0",
         "eventemitter3": "^5.0.1",
         "ripple-address-codec": "^5.0.0",
-        "ripple-binary-codec": "^2.0.0",
+        "ripple-binary-codec": "^2.1.0",
         "ripple-keypairs": "^2.0.0"
       },
       "dependencies": {
diff --git a/package.json b/package.json
index ce67b1da0..8cee95c15 100644
--- a/package.json
+++ b/package.json
@@ -106,7 +106,7 @@
     "ts-jest": "^26.5.6",
     "ts-node": "^10.9.2",
     "typescript": "^4.9.4",
-    "xrpl": "^3.0.0"
+    "xrpl": "^3.1.0"
   },
   "resolutions": {
     "jest-environment-jsdom": "29.3.1"

From da383d0a408d37122535e22584843dc4575ccb38 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 9 Jul 2024 18:38:12 +0000
Subject: [PATCH 23/79] chore(deps-dev): bump prettier from 3.0.3 to 3.3.2
 (#1010)

---
 package-lock.json                              | 14 +++++++-------
 package.json                                   |  2 +-
 src/containers/Amendment/Votes.tsx             |  9 ++++-----
 .../Transaction/NFTokenMint/parser.ts          | 18 ++++++++----------
 .../components/Transaction/SetHook/parser.ts   |  9 ++++-----
 5 files changed, 24 insertions(+), 28 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 383903997..f183415a8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -96,7 +96,7 @@
         "moxios": "^0.4.0",
         "nodemon": "^3.0.1",
         "npm-run-all": "^4.1.5",
-        "prettier": "^3.0.3",
+        "prettier": "^3.3.2",
         "react-error-overlay": "6.0.11",
         "react-test-renderer": "^17.0.2",
         "redux-mock-store": "^1.5.1",
@@ -23012,9 +23012,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
-      "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
+      "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
       "dev": true,
       "bin": {
         "prettier": "bin/prettier.cjs"
@@ -43929,9 +43929,9 @@
       "dev": true
     },
     "prettier": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
-      "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
+      "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
       "dev": true
     },
     "prettier-linter-helpers": {
diff --git a/package.json b/package.json
index 8cee95c15..a9f0147c2 100644
--- a/package.json
+++ b/package.json
@@ -91,7 +91,7 @@
     "moxios": "^0.4.0",
     "nodemon": "^3.0.1",
     "npm-run-all": "^4.1.5",
-    "prettier": "^3.0.3",
+    "prettier": "^3.3.2",
     "react-error-overlay": "6.0.11",
     "react-test-renderer": "^17.0.2",
     "redux-mock-store": "^1.5.1",
diff --git a/src/containers/Amendment/Votes.tsx b/src/containers/Amendment/Votes.tsx
index 571844858..ca887b0c3 100644
--- a/src/containers/Amendment/Votes.tsx
+++ b/src/containers/Amendment/Votes.tsx
@@ -85,11 +85,10 @@ export const Votes = ({ data, validators }: VotesProps) => {
 
   const getYeas = () =>
     validators
-      .filter(
-        (validator) =>
-          data.voted?.validators.some(
-            (voted) => voted.signing_key === validator.signing_key,
-          ),
+      .filter((validator) =>
+        data.voted?.validators.some(
+          (voted) => voted.signing_key === validator.signing_key,
+        ),
       )
       .sort(compareValidators)
 
diff --git a/src/containers/shared/components/Transaction/NFTokenMint/parser.ts b/src/containers/shared/components/Transaction/NFTokenMint/parser.ts
index 81dbc527c..998ab089f 100644
--- a/src/containers/shared/components/Transaction/NFTokenMint/parser.ts
+++ b/src/containers/shared/components/Transaction/NFTokenMint/parser.ts
@@ -27,21 +27,19 @@ export const parser: TransactionParser<NFTokenMint, NFTokenMintInstructions> = (
 
   const previousTokenIDSet = new Set(
     affectedNodes
-      .flatMap(
-        (node: any) =>
-          node.ModifiedNode?.PreviousFields?.NFTokens?.map(
-            (token: any) => token.NFToken.NFTokenID,
-          ),
+      .flatMap((node: any) =>
+        node.ModifiedNode?.PreviousFields?.NFTokens?.map(
+          (token: any) => token.NFToken.NFTokenID,
+        ),
       )
       .filter((id: any) => id),
   )
 
   const finalTokenIDs = affectedNodes
-    .flatMap(
-      (node: any) =>
-        (
-          node.ModifiedNode?.FinalFields ?? node.CreatedNode?.NewFields
-        )?.NFTokens?.map((token: any) => token.NFToken.NFTokenID),
+    .flatMap((node: any) =>
+      (
+        node.ModifiedNode?.FinalFields ?? node.CreatedNode?.NewFields
+      )?.NFTokens?.map((token: any) => token.NFToken.NFTokenID),
     )
     .filter((id: any) => id)
 
diff --git a/src/containers/shared/components/Transaction/SetHook/parser.ts b/src/containers/shared/components/Transaction/SetHook/parser.ts
index 8e0e10ca0..9761f7c78 100644
--- a/src/containers/shared/components/Transaction/SetHook/parser.ts
+++ b/src/containers/shared/components/Transaction/SetHook/parser.ts
@@ -8,11 +8,10 @@ export const parser = (tx: SetHook, meta: any): SetHookInstructions => {
       (node.ModifiedNode?.LedgerEntryType === 'Hook' &&
         !!node.ModifiedNode?.PreviousFields?.Hooks),
   )
-  const hashes = affectedNodes.flatMap(
-    (node: any) =>
-      (
-        node.ModifiedNode?.FinalFields ?? node.CreatedNode?.NewFields
-      )?.Hooks?.map((hook: any) => hook.Hook.HookHash),
+  const hashes = affectedNodes.flatMap((node: any) =>
+    (node.ModifiedNode?.FinalFields ?? node.CreatedNode?.NewFields)?.Hooks?.map(
+      (hook: any) => hook.Hook.HookHash,
+    ),
   )
   // TODO: there may be bugs here when a `HookHash` is already specified in a hook
   // It's difficult to understand what situation that would be in, so this is left here for now

From 5498fa43788d9d2f32b23e00db998e59d36685bf Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 11 Jul 2024 18:52:34 +0000
Subject: [PATCH 24/79] chore(deps): bump esbuild from 0.19.8 to 0.23.0 (#1011)

---
 package-lock.json | 460 +++++++++++++++++++++++++---------------------
 package.json      |   2 +-
 2 files changed, 254 insertions(+), 208 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f183415a8..774723f74 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -30,7 +30,7 @@
         "dotenv": "^16.4.5",
         "enzyme": "3.11.0",
         "enzyme-adapter-react-17-updated": "^1.0.2",
-        "esbuild": "^0.19.8",
+        "esbuild": "^0.23.0",
         "events": "^3.3.0",
         "express": "^4.18.2",
         "i18next": "^23.9.0",
@@ -2417,10 +2417,25 @@
         "postcss-selector-parser": "^6.0.13"
       }
     },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz",
+      "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz",
-      "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz",
+      "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==",
       "cpu": [
         "arm"
       ],
@@ -2429,13 +2444,13 @@
         "android"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz",
-      "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz",
+      "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==",
       "cpu": [
         "arm64"
       ],
@@ -2444,13 +2459,13 @@
         "android"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz",
-      "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz",
+      "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==",
       "cpu": [
         "x64"
       ],
@@ -2459,13 +2474,13 @@
         "android"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz",
-      "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz",
+      "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==",
       "cpu": [
         "arm64"
       ],
@@ -2474,13 +2489,13 @@
         "darwin"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz",
-      "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz",
+      "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==",
       "cpu": [
         "x64"
       ],
@@ -2489,13 +2504,13 @@
         "darwin"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz",
-      "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz",
+      "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==",
       "cpu": [
         "arm64"
       ],
@@ -2504,13 +2519,13 @@
         "freebsd"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz",
-      "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz",
+      "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==",
       "cpu": [
         "x64"
       ],
@@ -2519,13 +2534,13 @@
         "freebsd"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz",
-      "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz",
+      "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==",
       "cpu": [
         "arm"
       ],
@@ -2534,13 +2549,13 @@
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz",
-      "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz",
+      "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==",
       "cpu": [
         "arm64"
       ],
@@ -2549,13 +2564,13 @@
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz",
-      "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz",
+      "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==",
       "cpu": [
         "ia32"
       ],
@@ -2564,13 +2579,13 @@
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz",
-      "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz",
+      "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==",
       "cpu": [
         "loong64"
       ],
@@ -2579,13 +2594,13 @@
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz",
-      "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz",
+      "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==",
       "cpu": [
         "mips64el"
       ],
@@ -2594,13 +2609,13 @@
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz",
-      "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz",
+      "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==",
       "cpu": [
         "ppc64"
       ],
@@ -2609,13 +2624,13 @@
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz",
-      "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz",
+      "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==",
       "cpu": [
         "riscv64"
       ],
@@ -2624,13 +2639,13 @@
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz",
-      "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz",
+      "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==",
       "cpu": [
         "s390x"
       ],
@@ -2639,13 +2654,13 @@
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz",
-      "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz",
+      "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==",
       "cpu": [
         "x64"
       ],
@@ -2654,13 +2669,13 @@
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz",
-      "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz",
+      "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==",
       "cpu": [
         "x64"
       ],
@@ -2669,13 +2684,28 @@
         "netbsd"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz",
+      "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz",
-      "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz",
+      "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==",
       "cpu": [
         "x64"
       ],
@@ -2684,13 +2714,13 @@
         "openbsd"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz",
-      "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz",
+      "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==",
       "cpu": [
         "x64"
       ],
@@ -2699,13 +2729,13 @@
         "sunos"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz",
-      "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz",
+      "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==",
       "cpu": [
         "arm64"
       ],
@@ -2714,13 +2744,13 @@
         "win32"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz",
-      "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz",
+      "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==",
       "cpu": [
         "ia32"
       ],
@@ -2729,13 +2759,13 @@
         "win32"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz",
-      "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz",
+      "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==",
       "cpu": [
         "x64"
       ],
@@ -2744,7 +2774,7 @@
         "win32"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       }
     },
     "node_modules/@eslint-community/eslint-utils": {
@@ -10777,39 +10807,41 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz",
-      "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz",
+      "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==",
       "hasInstallScript": true,
       "bin": {
         "esbuild": "bin/esbuild"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "optionalDependencies": {
-        "@esbuild/android-arm": "0.19.8",
-        "@esbuild/android-arm64": "0.19.8",
-        "@esbuild/android-x64": "0.19.8",
-        "@esbuild/darwin-arm64": "0.19.8",
-        "@esbuild/darwin-x64": "0.19.8",
-        "@esbuild/freebsd-arm64": "0.19.8",
-        "@esbuild/freebsd-x64": "0.19.8",
-        "@esbuild/linux-arm": "0.19.8",
-        "@esbuild/linux-arm64": "0.19.8",
-        "@esbuild/linux-ia32": "0.19.8",
-        "@esbuild/linux-loong64": "0.19.8",
-        "@esbuild/linux-mips64el": "0.19.8",
-        "@esbuild/linux-ppc64": "0.19.8",
-        "@esbuild/linux-riscv64": "0.19.8",
-        "@esbuild/linux-s390x": "0.19.8",
-        "@esbuild/linux-x64": "0.19.8",
-        "@esbuild/netbsd-x64": "0.19.8",
-        "@esbuild/openbsd-x64": "0.19.8",
-        "@esbuild/sunos-x64": "0.19.8",
-        "@esbuild/win32-arm64": "0.19.8",
-        "@esbuild/win32-ia32": "0.19.8",
-        "@esbuild/win32-x64": "0.19.8"
+        "@esbuild/aix-ppc64": "0.23.0",
+        "@esbuild/android-arm": "0.23.0",
+        "@esbuild/android-arm64": "0.23.0",
+        "@esbuild/android-x64": "0.23.0",
+        "@esbuild/darwin-arm64": "0.23.0",
+        "@esbuild/darwin-x64": "0.23.0",
+        "@esbuild/freebsd-arm64": "0.23.0",
+        "@esbuild/freebsd-x64": "0.23.0",
+        "@esbuild/linux-arm": "0.23.0",
+        "@esbuild/linux-arm64": "0.23.0",
+        "@esbuild/linux-ia32": "0.23.0",
+        "@esbuild/linux-loong64": "0.23.0",
+        "@esbuild/linux-mips64el": "0.23.0",
+        "@esbuild/linux-ppc64": "0.23.0",
+        "@esbuild/linux-riscv64": "0.23.0",
+        "@esbuild/linux-s390x": "0.23.0",
+        "@esbuild/linux-x64": "0.23.0",
+        "@esbuild/netbsd-x64": "0.23.0",
+        "@esbuild/openbsd-arm64": "0.23.0",
+        "@esbuild/openbsd-x64": "0.23.0",
+        "@esbuild/sunos-x64": "0.23.0",
+        "@esbuild/win32-arm64": "0.23.0",
+        "@esbuild/win32-ia32": "0.23.0",
+        "@esbuild/win32-x64": "0.23.0"
       }
     },
     "node_modules/escalade": {
@@ -29844,136 +29876,148 @@
       "dev": true,
       "requires": {}
     },
+    "@esbuild/aix-ppc64": {
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz",
+      "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==",
+      "optional": true
+    },
     "@esbuild/android-arm": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz",
-      "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz",
+      "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==",
       "optional": true
     },
     "@esbuild/android-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz",
-      "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz",
+      "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==",
       "optional": true
     },
     "@esbuild/android-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz",
-      "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz",
+      "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==",
       "optional": true
     },
     "@esbuild/darwin-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz",
-      "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz",
+      "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==",
       "optional": true
     },
     "@esbuild/darwin-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz",
-      "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz",
+      "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==",
       "optional": true
     },
     "@esbuild/freebsd-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz",
-      "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz",
+      "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==",
       "optional": true
     },
     "@esbuild/freebsd-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz",
-      "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz",
+      "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==",
       "optional": true
     },
     "@esbuild/linux-arm": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz",
-      "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz",
+      "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==",
       "optional": true
     },
     "@esbuild/linux-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz",
-      "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz",
+      "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==",
       "optional": true
     },
     "@esbuild/linux-ia32": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz",
-      "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz",
+      "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==",
       "optional": true
     },
     "@esbuild/linux-loong64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz",
-      "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz",
+      "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==",
       "optional": true
     },
     "@esbuild/linux-mips64el": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz",
-      "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz",
+      "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==",
       "optional": true
     },
     "@esbuild/linux-ppc64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz",
-      "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz",
+      "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==",
       "optional": true
     },
     "@esbuild/linux-riscv64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz",
-      "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz",
+      "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==",
       "optional": true
     },
     "@esbuild/linux-s390x": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz",
-      "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz",
+      "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==",
       "optional": true
     },
     "@esbuild/linux-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz",
-      "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz",
+      "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==",
       "optional": true
     },
     "@esbuild/netbsd-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz",
-      "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz",
+      "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==",
+      "optional": true
+    },
+    "@esbuild/openbsd-arm64": {
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz",
+      "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==",
       "optional": true
     },
     "@esbuild/openbsd-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz",
-      "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz",
+      "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==",
       "optional": true
     },
     "@esbuild/sunos-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz",
-      "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz",
+      "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==",
       "optional": true
     },
     "@esbuild/win32-arm64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz",
-      "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz",
+      "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==",
       "optional": true
     },
     "@esbuild/win32-ia32": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz",
-      "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz",
+      "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==",
       "optional": true
     },
     "@esbuild/win32-x64": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz",
-      "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==",
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz",
+      "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==",
       "optional": true
     },
     "@eslint-community/eslint-utils": {
@@ -35595,32 +35639,34 @@
       }
     },
     "esbuild": {
-      "version": "0.19.8",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz",
-      "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==",
-      "requires": {
-        "@esbuild/android-arm": "0.19.8",
-        "@esbuild/android-arm64": "0.19.8",
-        "@esbuild/android-x64": "0.19.8",
-        "@esbuild/darwin-arm64": "0.19.8",
-        "@esbuild/darwin-x64": "0.19.8",
-        "@esbuild/freebsd-arm64": "0.19.8",
-        "@esbuild/freebsd-x64": "0.19.8",
-        "@esbuild/linux-arm": "0.19.8",
-        "@esbuild/linux-arm64": "0.19.8",
-        "@esbuild/linux-ia32": "0.19.8",
-        "@esbuild/linux-loong64": "0.19.8",
-        "@esbuild/linux-mips64el": "0.19.8",
-        "@esbuild/linux-ppc64": "0.19.8",
-        "@esbuild/linux-riscv64": "0.19.8",
-        "@esbuild/linux-s390x": "0.19.8",
-        "@esbuild/linux-x64": "0.19.8",
-        "@esbuild/netbsd-x64": "0.19.8",
-        "@esbuild/openbsd-x64": "0.19.8",
-        "@esbuild/sunos-x64": "0.19.8",
-        "@esbuild/win32-arm64": "0.19.8",
-        "@esbuild/win32-ia32": "0.19.8",
-        "@esbuild/win32-x64": "0.19.8"
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz",
+      "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==",
+      "requires": {
+        "@esbuild/aix-ppc64": "0.23.0",
+        "@esbuild/android-arm": "0.23.0",
+        "@esbuild/android-arm64": "0.23.0",
+        "@esbuild/android-x64": "0.23.0",
+        "@esbuild/darwin-arm64": "0.23.0",
+        "@esbuild/darwin-x64": "0.23.0",
+        "@esbuild/freebsd-arm64": "0.23.0",
+        "@esbuild/freebsd-x64": "0.23.0",
+        "@esbuild/linux-arm": "0.23.0",
+        "@esbuild/linux-arm64": "0.23.0",
+        "@esbuild/linux-ia32": "0.23.0",
+        "@esbuild/linux-loong64": "0.23.0",
+        "@esbuild/linux-mips64el": "0.23.0",
+        "@esbuild/linux-ppc64": "0.23.0",
+        "@esbuild/linux-riscv64": "0.23.0",
+        "@esbuild/linux-s390x": "0.23.0",
+        "@esbuild/linux-x64": "0.23.0",
+        "@esbuild/netbsd-x64": "0.23.0",
+        "@esbuild/openbsd-arm64": "0.23.0",
+        "@esbuild/openbsd-x64": "0.23.0",
+        "@esbuild/sunos-x64": "0.23.0",
+        "@esbuild/win32-arm64": "0.23.0",
+        "@esbuild/win32-ia32": "0.23.0",
+        "@esbuild/win32-x64": "0.23.0"
       }
     },
     "escalade": {
diff --git a/package.json b/package.json
index a9f0147c2..1b8768b72 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
     "dotenv": "^16.4.5",
     "enzyme": "3.11.0",
     "enzyme-adapter-react-17-updated": "^1.0.2",
-    "esbuild": "^0.19.8",
+    "esbuild": "^0.23.0",
     "events": "^3.3.0",
     "express": "^4.18.2",
     "i18next": "^23.9.0",

From 16c3676d2b650816f468eeb5a0815d7dae50212b Mon Sep 17 00:00:00 2001
From: achowdhry-ripple <achowdhry@ripple.com>
Date: Thu, 18 Jul 2024 18:44:16 -0400
Subject: [PATCH 25/79] Leverage nftoken_id, nftoken_ids and offer_id meta
 fields in transaction parsers (#1018)

## High Level Overview of Change
utilize added ID fields based on [this rippled
PR](https://github.com/XRPLF/rippled/pull/4447), rather than manually
parsing for NFToken transactions.

### Context of Change
https://github.com/ripple/explorer/issues/708
---
 .../Transaction/NFTokenAcceptOffer/parser.ts  |  4 +-
 .../mock_data/NFTokenAcceptOffer_Broker.json  |  3 +-
 .../mock_data/NFTokenAcceptOffer_Buy.json     |  3 +-
 .../mock_data/NFTokenAcceptOffer_Sell.json    |  3 +-
 .../Transaction/NFTokenCancelOffer/parser.ts  |  2 +-
 .../test/mock_data/NFTokenCancelOffer.json    |  3 +-
 .../Transaction/NFTokenCreateOffer/parser.ts  |  3 +-
 .../mock_data/NFTokenCreateOffer_Buy.json     |  3 +-
 .../mock_data/NFTokenCreateOffer_Sell.json    |  3 +-
 .../Transaction/NFTokenMint/parser.ts         | 53 +++----------------
 .../NFTokenMintModified1Created1.json         |  3 +-
 .../test/mock_data/NFTokenMintModified2.json  |  3 +-
 .../NFTokenMintModified4Created1.json         |  3 +-
 .../NFTokenMintMostModified2Created1.json     |  3 +-
 .../test/mock_data/NFTokenMintWithIssuer.json |  3 +-
 15 files changed, 33 insertions(+), 62 deletions(-)

diff --git a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/parser.ts b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/parser.ts
index 85abfdaa6..5586be0c8 100644
--- a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/parser.ts
+++ b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/parser.ts
@@ -35,7 +35,7 @@ export const parser: TransactionParser<
 
     return {
       amount: formatAmount(buyOfferNode.Amount),
-      tokenID: buyOfferNode.NFTokenID,
+      tokenID: meta.nftoken_id,
       seller: sellOfferNode.Owner,
       buyer: buyOfferNode.Owner,
       acceptedOfferIDs,
@@ -51,7 +51,7 @@ export const parser: TransactionParser<
   }
 
   const amount = formatAmount(acceptedOfferNode.Amount)
-  const tokenID = acceptedOfferNode.NFTokenID
+  const tokenID = meta.nftoken_id
   const offerer = acceptedOfferNode.Owner
   const accepter = tx.Account
   const isSellOffer = determineIsSellOffer(acceptedOfferNode.Flags)
diff --git a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Broker.json b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Broker.json
index 4a2ab29ab..f1bc90003 100644
--- a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Broker.json
+++ b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Broker.json
@@ -255,7 +255,8 @@
       }
     ],
     "TransactionIndex": 7,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "nftoken_id": "00081B581189F5687DBB7516339D6CCB5593D96622AD82DF08CFDA8600000A17"
   },
   "hash": "E6CE3C3C554BA01891A9D12E89062C34BBEA6282CF8AA4D9AF8BF7D0E7D26B7D",
   "ledger_index": 76208251,
diff --git a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Buy.json b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Buy.json
index d984fc1f7..6bb4a8973 100644
--- a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Buy.json
+++ b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Buy.json
@@ -439,7 +439,8 @@
       }
     ],
     "TransactionIndex": 4,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "nftoken_id": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C29ABA6A90000000D"
   },
   "hash": "21C60F255B29D0034B9EBA2ED1F7523635C61DED1D6BDBCFFD67703C45F7072D",
   "ledger_index": 1799495,
diff --git a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Sell.json b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Sell.json
index 3f78b0426..77fe997f5 100644
--- a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Sell.json
+++ b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/test/mock_data/NFTokenAcceptOffer_Sell.json
@@ -392,7 +392,8 @@
       }
     ],
     "TransactionIndex": 0,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "nftoken_id": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C216B9CBF00000023"
   },
   "hash": "553922B202932DD500C6E0D6905BA1D8ACC0DF746519DD6AAA724AF70D23F1E6",
   "ledger_index": 1889191,
diff --git a/src/containers/shared/components/Transaction/NFTokenCancelOffer/parser.ts b/src/containers/shared/components/Transaction/NFTokenCancelOffer/parser.ts
index f2a8debe2..4857fb442 100644
--- a/src/containers/shared/components/Transaction/NFTokenCancelOffer/parser.ts
+++ b/src/containers/shared/components/Transaction/NFTokenCancelOffer/parser.ts
@@ -10,7 +10,7 @@ export const parser: TransactionParser<
   const cancelledOffers = meta.AffectedNodes.filter(
     (node: any) => node.DeletedNode?.LedgerEntryType === 'NFTokenOffer',
   ).map((node: any) => ({
-    offerID: node.DeletedNode.LedgerIndex,
+    offerID: meta.offer_id,
     amount: formatAmount(node.DeletedNode.FinalFields.Amount),
     tokenID: node.DeletedNode.FinalFields.NFTokenID,
     offerer: node.DeletedNode.FinalFields.Owner,
diff --git a/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/mock_data/NFTokenCancelOffer.json b/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/mock_data/NFTokenCancelOffer.json
index ee6e5472d..d625ca873 100644
--- a/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/mock_data/NFTokenCancelOffer.json
+++ b/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/mock_data/NFTokenCancelOffer.json
@@ -81,7 +81,8 @@
       }
     ],
     "TransactionIndex": 2,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "offer_id": "35F3D6D99548FA5F5315580FBF8BA6B15CAA2CAE93023D5CE4FDC130602BC5C3"
   },
   "hash": "AF12B2694896ADE0F93C8C3D09602B242F08C50854A0C600E0E7A2E18586C8C3",
   "ledger_index": 1799491,
diff --git a/src/containers/shared/components/Transaction/NFTokenCreateOffer/parser.ts b/src/containers/shared/components/Transaction/NFTokenCreateOffer/parser.ts
index e818c0294..deaaacffe 100644
--- a/src/containers/shared/components/Transaction/NFTokenCreateOffer/parser.ts
+++ b/src/containers/shared/components/Transaction/NFTokenCreateOffer/parser.ts
@@ -2,7 +2,6 @@ import type { NFTokenCreateOffer } from 'xrpl'
 import { NFTokenCreateOfferInstructions } from './types'
 import { TransactionParser } from '../types'
 import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount'
-import { findNode } from '../../../transactionUtils'
 
 export const parser: TransactionParser<
   NFTokenCreateOffer,
@@ -13,7 +12,7 @@ export const parser: TransactionParser<
   const tokenID = tx.NFTokenID
   const isSellOffer = ((tx.Flags as number)! & 1) !== 0
   const owner = tx.Owner
-  const offerID = findNode(meta, 'CreatedNode', 'NFTokenOffer')?.LedgerIndex
+  const offerID = meta.offer_id
   const destination = tx.Destination
 
   return {
diff --git a/src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Buy.json b/src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Buy.json
index 57b78b9c9..546e25bc7 100644
--- a/src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Buy.json
+++ b/src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Buy.json
@@ -70,7 +70,8 @@
       }
     ],
     "TransactionIndex": 0,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "offer_id": "3D1C297DA5B831267CCF692F8A023688D6A4BD5AFAE9A746D5C4E0B15D256B29"
   },
   "hash": "385DC0497AAF8061549A7DC04EB20C2B387A167792796F5806A13E0422125563",
   "ledger_index": 1887982,
diff --git a/src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Sell.json b/src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Sell.json
index ca2b485e1..01a6427e6 100644
--- a/src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Sell.json
+++ b/src/containers/shared/components/Transaction/NFTokenCreateOffer/test/mock_data/NFTokenCreateOffer_Sell.json
@@ -80,7 +80,8 @@
       }
     ],
     "TransactionIndex": 1,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "offer_id": "F660CA62E16B8067649052E8FCE947049FC6EF0D8B42EF7E5819997EC5AE45B6"
   },
   "hash": "47DCA082AE5920D672B32E63623B799899B91B77D68365711B07376E5ACFC8DB",
   "ledger_index": 1799495,
diff --git a/src/containers/shared/components/Transaction/NFTokenMint/parser.ts b/src/containers/shared/components/Transaction/NFTokenMint/parser.ts
index 998ab089f..acb0cd7c1 100644
--- a/src/containers/shared/components/Transaction/NFTokenMint/parser.ts
+++ b/src/containers/shared/components/Transaction/NFTokenMint/parser.ts
@@ -7,49 +7,10 @@ import { convertHexToString } from '../../../../../rippled/lib/utils'
 export const parser: TransactionParser<NFTokenMint, NFTokenMintInstructions> = (
   tx,
   meta,
-) => {
-  // When a mint results in splitting an existing page,
-  // it results in a created page and a modified node. Sometimes,
-  // the created node needs to be linked to a third page, resulting
-  // in modifying that third page's PreviousPageMin or NextPageMin
-  // field changing, but no NFTs within that page changing. In this
-  // case, there will be no previous NFTs and we need to skip.
-  // However, there will always be NFTs listed in the final fields,
-  // as rippled outputs all fields in final fields even if they were
-  // not changed. Thus why we add the additional condition to check
-  // if the PreviousFields contains NFTokens
-  const affectedNodes = meta.AffectedNodes.filter(
-    (node: any) =>
-      node.CreatedNode?.LedgerEntryType === 'NFTokenPage' ||
-      (node.ModifiedNode?.LedgerEntryType === 'NFTokenPage' &&
-        !!node.ModifiedNode?.PreviousFields.NFTokens),
-  )
-
-  const previousTokenIDSet = new Set(
-    affectedNodes
-      .flatMap((node: any) =>
-        node.ModifiedNode?.PreviousFields?.NFTokens?.map(
-          (token: any) => token.NFToken.NFTokenID,
-        ),
-      )
-      .filter((id: any) => id),
-  )
-
-  const finalTokenIDs = affectedNodes
-    .flatMap((node: any) =>
-      (
-        node.ModifiedNode?.FinalFields ?? node.CreatedNode?.NewFields
-      )?.NFTokens?.map((token: any) => token.NFToken.NFTokenID),
-    )
-    .filter((id: any) => id)
-
-  const tokenID = finalTokenIDs.find((id: any) => !previousTokenIDSet.has(id))
-
-  return {
-    tokenID,
-    tokenTaxon: tx.NFTokenTaxon,
-    uri: convertHexToString(tx.URI),
-    transferFee: tx.TransferFee,
-    issuer: tx.Issuer,
-  }
-}
+) => ({
+  tokenID: meta.nftoken_id,
+  tokenTaxon: tx.NFTokenTaxon,
+  uri: convertHexToString(tx.URI),
+  transferFee: tx.TransferFee,
+  issuer: tx.Issuer,
+})
diff --git a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified1Created1.json b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified1Created1.json
index d19662a65..2fb674b4e 100644
--- a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified1Created1.json
+++ b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified1Created1.json
@@ -53,7 +53,8 @@
       }
     ],
     "TransactionIndex": 1,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "nftoken_id": "0008000085D33F9C5481D3515029C9904D16F0109414D3A00000099A00000000"
   },
   "hash": "B0AAA46053F2570200CA1E12978EFFBB124374276669CC3F68602A6788182172",
   "ledger_index": 5605230,
diff --git a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified2.json b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified2.json
index 27f0ad378..4cb746d3d 100644
--- a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified2.json
+++ b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified2.json
@@ -301,7 +301,8 @@
       }
     ],
     "TransactionIndex": 0,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "nftoken_id": "000800006203F49C21D5D6E022CB16DE3538F248662FC73C535743B40000001A"
   },
   "hash": "B9A20167DC30985ABD983912F29DE81CB4579FAF9672C9D68BEC5219C19C7E50",
   "ledger_index": 1861436,
diff --git a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified4Created1.json b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified4Created1.json
index 2c9a62634..2156f52bb 100644
--- a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified4Created1.json
+++ b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintModified4Created1.json
@@ -690,7 +690,8 @@
       }
     ],
     "TransactionIndex": 337,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "nftoken_id": "000D0000B9BD7D214128A91ECECE5FCFF9BDB0D043567C51CFBEC443000063A7"
   },
   "hash": "4E0EB5F23D248740CB8FC28D1003CEFE841E21811FE2EA4B195CFE1B0BC54219",
   "ledger_index": 6453184,
diff --git a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintMostModified2Created1.json b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintMostModified2Created1.json
index 7278c7c13..f2ccdcc36 100644
--- a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintMostModified2Created1.json
+++ b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintMostModified2Created1.json
@@ -457,7 +457,8 @@
       }
     ],
     "TransactionIndex": 0,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "nftoken_id": "0008000085D33F9C5481D3515029C9904D16F0109414D3A0DCBA29BA00000020"
   },
   "hash": "C4E598099A8B13C5C8D2B8C86385A37B64C2F62BFA1FB87196401BB6ACB67A69",
   "ledger_index": 5605289,
diff --git a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintWithIssuer.json b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintWithIssuer.json
index db644a078..d0dad91c5 100644
--- a/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintWithIssuer.json
+++ b/src/containers/shared/components/Transaction/NFTokenMint/test/mock_data/NFTokenMintWithIssuer.json
@@ -72,7 +72,8 @@
       }
     ],
     "TransactionIndex": 0,
-    "TransactionResult": "tesSUCCESS"
+    "TransactionResult": "tesSUCCESS",
+    "nftoken_id": "000861A8A99B4460C2A4CCC90634FD9C7F51940AD9450BE30000099B00000000"
   },
   "hash": "73629D3E84AC18C06350A9A4A0B2EF15AB52E5A62AECDAB4A0579DEF342FC61F",
   "ledger_index": 4997948,

From 7db7962240132e30c104814634dba848c67b3327 Mon Sep 17 00:00:00 2001
From: julian78780 <berridi@tutanota.com>
Date: Tue, 30 Jul 2024 12:11:11 -0500
Subject: [PATCH 26/79] Add meta description (#1020)

Added a meta description tag to the HTML head to improve SEO and ensure
proper display in search engine results.

## High Level Overview of Change

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [ x] Bug fix (non-breaking change which fixes an issue)

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 src/index.html | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/index.html b/src/index.html
index dbf1e83b5..514732776 100644
--- a/src/index.html
+++ b/src/index.html
@@ -8,6 +8,7 @@
   <meta name="apple-mobile-web-app-capable" content="yes">
   <meta name="mobile-web-app-capable" content="yes">
   <meta name="google-site-verification" content="k8jb6KQfitguHqeR97svoRnnsgzvs3a0FliHbESVDk4" />
+  <meta name="description" content="Discover the XRP Ledger with this open source explorer. Check account balances, transactions, validators, nodes and analyze blockchain activity.">
   <!--
       manifest.json provides metadata used when your web app is added to the
       homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/

From 7570cb1fcb335e121296d4d41a7bf89d5f2750cb Mon Sep 17 00:00:00 2001
From: achowdhry-ripple <achowdhry@ripple.com>
Date: Tue, 6 Aug 2024 11:05:40 -0400
Subject: [PATCH 27/79] Ledgers page index.html redirect (#1022)

## High Level Overview of Change
Obseleted path (/index.html) now redirects to current path to ledgers
page (/).

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 src/containers/App/index.tsx         |  8 +++++++
 src/containers/App/test/App.test.jsx | 34 ++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/src/containers/App/index.tsx b/src/containers/App/index.tsx
index 29e96fa80..d03150b9e 100644
--- a/src/containers/App/index.tsx
+++ b/src/containers/App/index.tsx
@@ -104,6 +104,14 @@ export const AppWrapper = () => {
                   path={updatePath('/ledgers')}
                   element={<Navigate to={updatePath('/')} replace />}
                 />
+                <Route
+                  path={updatePath('/index.html')}
+                  element={<Navigate to={updatePath('/')} replace />}
+                />
+                <Route
+                  path={updatePath('/index.htm')}
+                  element={<Navigate to={updatePath('/')} replace />}
+                />
                 {/* End: Redirects */}
                 {mode === 'custom' && (
                   <Route path="/" element={<CustomNetworkHome />} />
diff --git a/src/containers/App/test/App.test.jsx b/src/containers/App/test/App.test.jsx
index 15674340b..29347e8c0 100644
--- a/src/containers/App/test/App.test.jsx
+++ b/src/containers/App/test/App.test.jsx
@@ -161,6 +161,40 @@ describe('App container', () => {
     ])
   })
 
+  it('renders ledger explorer page from index.html redirect', async () => {
+    wrapper = createWrapper('/index.html')
+    await flushPromises()
+    await flushPromises()
+    wrapper.update()
+
+    expect(document.title).toEqual('xrpl_explorer | ledgers')
+    expect(window.dataLayer).toEqual([
+      {
+        page_path: '/',
+        page_title: `xrpl_explorer | ledgers`,
+        event: 'screen_view',
+        network: 'mainnet',
+      },
+    ])
+  })
+
+  it('renders ledger explorer page from index.htm redirect', async () => {
+    wrapper = createWrapper('/index.html')
+    await flushPromises()
+    await flushPromises()
+    wrapper.update()
+
+    expect(document.title).toEqual('xrpl_explorer | ledgers')
+    expect(window.dataLayer).toEqual([
+      {
+        page_path: '/',
+        page_title: `xrpl_explorer | ledgers`,
+        event: 'screen_view',
+        network: 'mainnet',
+      },
+    ])
+  })
+
   it('renders not found page', () => {
     wrapper = createWrapper('/zzz')
     return new Promise((r) => setTimeout(r, 10)).then(() => {

From 1a835eb8793278eaef5acca342a777ffae800c6b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 15 Aug 2024 19:07:00 +0000
Subject: [PATCH 28/79] chore(deps-dev): bump typescript from 4.9.4 to 4.9.5
 (#1023)

---
 package-lock.json | 11 +++++++----
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 774723f74..987f3fa93 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -110,7 +110,7 @@
         "stylelint-scss": "^5.3.2",
         "ts-jest": "^26.5.6",
         "ts-node": "^10.9.2",
-        "typescript": "^4.9.4",
+        "typescript": "^4.9.5",
         "xrpl": "^3.1.0"
       },
       "engines": {
@@ -26956,9 +26956,10 @@
       }
     },
     "node_modules/typescript": {
-      "version": "4.9.4",
+      "version": "4.9.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+      "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
       "devOptional": true,
-      "license": "Apache-2.0",
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -46620,7 +46621,9 @@
       }
     },
     "typescript": {
-      "version": "4.9.4",
+      "version": "4.9.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+      "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
       "devOptional": true
     },
     "unbox-primitive": {
diff --git a/package.json b/package.json
index 1b8768b72..80407d2dc 100644
--- a/package.json
+++ b/package.json
@@ -105,7 +105,7 @@
     "stylelint-scss": "^5.3.2",
     "ts-jest": "^26.5.6",
     "ts-node": "^10.9.2",
-    "typescript": "^4.9.4",
+    "typescript": "^4.9.5",
     "xrpl": "^3.1.0"
   },
   "resolutions": {

From 33d72afc65a4f30ff0d889573e3d0e2485aa3049 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 19 Aug 2024 13:31:19 +0000
Subject: [PATCH 29/79] chore(deps): bump debug from 4.3.4 to 4.3.6 (#1024)

---
 package-lock.json | 11 +++++++----
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 987f3fa93..15a642a63 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,7 +26,7 @@
         "d3-geo": "^3.1.0",
         "d3-hexbin": "^0.2.2",
         "d3-scale": "^4.0.2",
-        "debug": "^4.3.1",
+        "debug": "^4.3.6",
         "dotenv": "^16.4.5",
         "enzyme": "3.11.0",
         "enzyme-adapter-react-17-updated": "^1.0.2",
@@ -9906,8 +9906,9 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.3.4",
-      "license": "MIT",
+      "version": "4.3.6",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
+      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -34976,7 +34977,9 @@
       }
     },
     "debug": {
-      "version": "4.3.4",
+      "version": "4.3.6",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
+      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
       "requires": {
         "ms": "2.1.2"
       }
diff --git a/package.json b/package.json
index 80407d2dc..7469338b3 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
     "d3-geo": "^3.1.0",
     "d3-hexbin": "^0.2.2",
     "d3-scale": "^4.0.2",
-    "debug": "^4.3.1",
+    "debug": "^4.3.6",
     "dotenv": "^16.4.5",
     "enzyme": "3.11.0",
     "enzyme-adapter-react-17-updated": "^1.0.2",

From 634c3b366001e89d6a90eb11f2c769db86b7920b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 19 Aug 2024 13:36:59 +0000
Subject: [PATCH 30/79] chore(deps-dev): bump nodemon from 3.0.1 to 3.1.4
 (#1027)

---
 package-lock.json | 33 +++++++++------------------------
 package.json      |  2 +-
 2 files changed, 10 insertions(+), 25 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 15a642a63..d16af9414 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -94,7 +94,7 @@
         "lint-staged": "^15.2.5",
         "mock-socket": "^9.1.5",
         "moxios": "^0.4.0",
-        "nodemon": "^3.0.1",
+        "nodemon": "^3.1.4",
         "npm-run-all": "^4.1.5",
         "prettier": "^3.3.2",
         "react-error-overlay": "6.0.11",
@@ -22280,13 +22280,13 @@
       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
     },
     "node_modules/nodemon": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
-      "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz",
+      "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==",
       "dev": true,
       "dependencies": {
         "chokidar": "^3.5.2",
-        "debug": "^3.2.7",
+        "debug": "^4",
         "ignore-by-default": "^1.0.1",
         "minimatch": "^3.1.2",
         "pstree.remy": "^1.1.8",
@@ -22307,14 +22307,6 @@
         "url": "https://opencollective.com/nodemon"
       }
     },
-    "node_modules/nodemon/node_modules/debug": {
-      "version": "3.2.7",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.1"
-      }
-    },
     "node_modules/nodemon/node_modules/semver": {
       "version": "7.5.4",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
@@ -43504,13 +43496,13 @@
       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
     },
     "nodemon": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
-      "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz",
+      "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==",
       "dev": true,
       "requires": {
         "chokidar": "^3.5.2",
-        "debug": "^3.2.7",
+        "debug": "^4",
         "ignore-by-default": "^1.0.1",
         "minimatch": "^3.1.2",
         "pstree.remy": "^1.1.8",
@@ -43521,13 +43513,6 @@
         "undefsafe": "^2.0.5"
       },
       "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
         "semver": {
           "version": "7.5.4",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
diff --git a/package.json b/package.json
index 7469338b3..e781f96de 100644
--- a/package.json
+++ b/package.json
@@ -89,7 +89,7 @@
     "lint-staged": "^15.2.5",
     "mock-socket": "^9.1.5",
     "moxios": "^0.4.0",
-    "nodemon": "^3.0.1",
+    "nodemon": "^3.1.4",
     "npm-run-all": "^4.1.5",
     "prettier": "^3.3.2",
     "react-error-overlay": "6.0.11",

From fc5b6fb1ffd8833090b9bbf62098621fb7e7cc4c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 19 Aug 2024 13:42:14 +0000
Subject: [PATCH 31/79] chore(deps-dev): bump @babel/preset-env from 7.24.5 to
 7.25.3 (#1026)

---
 package-lock.json | 1949 +++++++++++++++++++++++----------------------
 package.json      |    2 +-
 2 files changed, 976 insertions(+), 975 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d16af9414..ff556be9c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -63,7 +63,7 @@
       },
       "devDependencies": {
         "@babel/eslint-parser": "^7.22.6",
-        "@babel/preset-env": "^7.24.5",
+        "@babel/preset-env": "^7.25.3",
         "@babel/preset-react": "^7.24.7",
         "@types/create-hash": "^1.2.2",
         "@types/enzyme": "^3.10.12",
@@ -164,9 +164,9 @@
       }
     },
     "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.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
+      "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -240,11 +240,11 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz",
-      "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==",
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
+      "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
       "dependencies": {
-        "@babel/types": "^7.24.7",
+        "@babel/types": "^7.25.0",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^2.5.1"
@@ -266,25 +266,26 @@
       }
     },
     "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==",
       "dev": true,
       "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.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
+      "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
       "dependencies": {
-        "@babel/compat-data": "^7.23.5",
-        "@babel/helper-validator-option": "^7.23.5",
-        "browserslist": "^4.22.2",
+        "@babel/compat-data": "^7.25.2",
+        "@babel/helper-validator-option": "^7.24.8",
+        "browserslist": "^4.23.1",
         "lru-cache": "^5.1.1",
         "semver": "^6.3.1"
       },
@@ -314,19 +315,17 @@
       "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
     },
     "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==",
-      "dev": true,
-      "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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz",
+      "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-member-expression-to-functions": "^7.24.8",
+        "@babel/helper-optimise-call-expression": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.25.0",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/traverse": "^7.25.0",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -346,12 +345,12 @@
       }
     },
     "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.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
+      "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "@babel/helper-annotate-as-pure": "^7.24.7",
         "regexpu-core": "^5.3.1",
         "semver": "^6.3.1"
       },
@@ -387,47 +386,14 @@
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
       }
     },
-    "node_modules/@babel/helper-environment-visitor": {
-      "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.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.24.7",
-        "@babel/types": "^7.24.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-hoist-variables": {
-      "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.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.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
+      "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.24.5"
+        "@babel/traverse": "^7.24.8",
+        "@babel/types": "^7.24.8"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -446,15 +412,14 @@
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
-      "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+      "version": "7.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
+      "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-module-imports": "^7.22.15",
-        "@babel/helper-simple-access": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/helper-validator-identifier": "^7.22.20"
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-simple-access": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/traverse": "^7.25.2"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -464,34 +429,34 @@
       }
     },
     "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==",
       "dev": true,
       "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.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
-      "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
+      "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
       "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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
+      "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
       "dev": true,
       "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-wrap-function": "^7.25.0",
+        "@babel/traverse": "^7.25.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -501,14 +466,14 @@
       }
     },
     "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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
+      "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
       "dev": true,
       "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-member-expression-to-functions": "^7.24.8",
+        "@babel/helper-optimise-call-expression": "^7.24.7",
+        "@babel/traverse": "^7.25.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -518,23 +483,25 @@
       }
     },
     "node_modules/@babel/helper-simple-access": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
-      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+      "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.22.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==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -544,6 +511,7 @@
       "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==",
+      "dev": true,
       "dependencies": {
         "@babel/types": "^7.24.7"
       },
@@ -552,9 +520,9 @@
       }
     },
     "node_modules/@babel/helper-string-parser": {
-      "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==",
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+      "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -568,22 +536,22 @@
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "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==",
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
+      "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
       "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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
+      "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/template": "^7.24.0",
-        "@babel/types": "^7.24.5"
+        "@babel/template": "^7.25.0",
+        "@babel/traverse": "^7.25.0",
+        "@babel/types": "^7.25.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -617,9 +585,12 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz",
-      "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==",
+      "version": "7.25.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
+      "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
+      "dependencies": {
+        "@babel/types": "^7.25.2"
+      },
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -628,13 +599,28 @@
       }
     },
     "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.25.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
+      "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/traverse": "^7.25.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
+      "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.8"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -644,12 +630,12 @@
       }
     },
     "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.25.0",
+      "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.25.0.tgz",
+      "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.8"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -659,14 +645,14 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
+      "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
       "dev": true,
       "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.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -676,13 +662,13 @@
       }
     },
     "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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
+      "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/traverse": "^7.25.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -907,12 +893,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
+      "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -922,12 +908,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
+      "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1101,12 +1087,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
+      "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1116,15 +1102,15 @@
       }
     },
     "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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz",
+      "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==",
       "dev": true,
       "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/plugin-syntax-async-generators": "^7.8.4"
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-remap-async-to-generator": "^7.25.0",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/traverse": "^7.25.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1134,14 +1120,14 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
+      "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-remap-async-to-generator": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1151,12 +1137,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+      "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1166,12 +1152,12 @@
       }
     },
     "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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
+      "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.8"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1181,13 +1167,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
+      "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1197,13 +1183,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+      "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       },
       "engines": {
@@ -1214,18 +1200,16 @@
       }
     },
     "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==",
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz",
+      "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==",
       "dev": true,
       "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",
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.8",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-replace-supers": "^7.25.0",
+        "@babel/traverse": "^7.25.0",
         "globals": "^11.1.0"
       },
       "engines": {
@@ -1236,13 +1220,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
+      "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/template": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/template": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1252,12 +1236,12 @@
       }
     },
     "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.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
+      "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.8"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1267,13 +1251,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+      "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1283,12 +1267,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+      "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1297,13 +1281,29 @@
         "@babel/core": "^7.0.0-0"
       }
     },
+    "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
+      "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.25.0",
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+      "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3"
       },
       "engines": {
@@ -1314,13 +1314,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+      "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1330,12 +1330,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
+      "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       },
       "engines": {
@@ -1362,13 +1362,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+      "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@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"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1378,14 +1378,14 @@
       }
     },
     "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.25.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
+      "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
       "dev": true,
       "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.8",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/traverse": "^7.25.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1395,12 +1395,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+      "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-json-strings": "^7.8.3"
       },
       "engines": {
@@ -1411,12 +1411,12 @@
       }
     },
     "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.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
+      "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.8"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1426,12 +1426,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+      "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       },
       "engines": {
@@ -1442,12 +1442,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+      "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1457,13 +1457,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+      "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1473,14 +1473,14 @@
       }
     },
     "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.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
+      "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
       "dev": true,
       "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.8",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-simple-access": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1490,15 +1490,15 @@
       }
     },
     "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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
+      "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
       "dev": true,
       "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-module-transforms": "^7.25.0",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/traverse": "^7.25.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1508,13 +1508,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+      "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1524,13 +1524,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
+      "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1540,12 +1540,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+      "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1555,12 +1555,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
+      "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
       },
       "engines": {
@@ -1571,12 +1571,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+      "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       },
       "engines": {
@@ -1587,15 +1587,15 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
+      "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-plugin-utils": "^7.24.5",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.24.5"
+        "@babel/plugin-transform-parameters": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1605,13 +1605,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+      "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-replace-supers": "^7.24.1"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1621,12 +1621,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+      "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
       },
       "engines": {
@@ -1637,13 +1637,13 @@
       }
     },
     "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.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
+      "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       },
       "engines": {
@@ -1654,12 +1654,12 @@
       }
     },
     "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==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1669,13 +1669,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
+      "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1685,14 +1685,14 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
+      "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
       "dev": true,
       "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.7",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       },
       "engines": {
@@ -1703,12 +1703,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+      "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1811,12 +1811,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+      "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "regenerator-transform": "^0.15.2"
       },
       "engines": {
@@ -1827,12 +1827,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+      "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1871,12 +1871,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
+      "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1886,13 +1886,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
+      "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@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"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1902,12 +1902,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
+      "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1917,12 +1917,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
+      "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1932,12 +1932,12 @@
       }
     },
     "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.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
+      "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.8"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1965,12 +1965,12 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+      "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1980,13 +1980,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+      "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1996,13 +1996,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
+      "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2012,13 +2012,13 @@
       }
     },
     "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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
+      "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
       "dev": true,
       "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.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2028,27 +2028,28 @@
       }
     },
     "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==",
-      "dev": true,
-      "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.25.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz",
+      "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.25.2",
+        "@babel/helper-compilation-targets": "^7.25.2",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-validator-option": "^7.24.8",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
+        "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
         "@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.7",
+        "@babel/plugin-syntax-import-attributes": "^7.24.7",
         "@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",
@@ -2060,59 +2061,60 @@
         "@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.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.25.0",
+        "@babel/plugin-transform-async-to-generator": "^7.24.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+        "@babel/plugin-transform-block-scoping": "^7.25.0",
+        "@babel/plugin-transform-class-properties": "^7.24.7",
+        "@babel/plugin-transform-class-static-block": "^7.24.7",
+        "@babel/plugin-transform-classes": "^7.25.0",
+        "@babel/plugin-transform-computed-properties": "^7.24.7",
+        "@babel/plugin-transform-destructuring": "^7.24.8",
+        "@babel/plugin-transform-dotall-regex": "^7.24.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+        "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
+        "@babel/plugin-transform-dynamic-import": "^7.24.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+        "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+        "@babel/plugin-transform-for-of": "^7.24.7",
+        "@babel/plugin-transform-function-name": "^7.25.1",
+        "@babel/plugin-transform-json-strings": "^7.24.7",
+        "@babel/plugin-transform-literals": "^7.25.2",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+        "@babel/plugin-transform-modules-amd": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.8",
+        "@babel/plugin-transform-modules-systemjs": "^7.25.0",
+        "@babel/plugin-transform-modules-umd": "^7.24.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+        "@babel/plugin-transform-new-target": "^7.24.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+        "@babel/plugin-transform-numeric-separator": "^7.24.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+        "@babel/plugin-transform-object-super": "^7.24.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.8",
+        "@babel/plugin-transform-parameters": "^7.24.7",
+        "@babel/plugin-transform-private-methods": "^7.24.7",
+        "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+        "@babel/plugin-transform-property-literals": "^7.24.7",
+        "@babel/plugin-transform-regenerator": "^7.24.7",
+        "@babel/plugin-transform-reserved-words": "^7.24.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+        "@babel/plugin-transform-spread": "^7.24.7",
+        "@babel/plugin-transform-sticky-regex": "^7.24.7",
+        "@babel/plugin-transform-template-literals": "^7.24.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.24.8",
+        "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+        "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
         "@babel/preset-modules": "0.1.6-no-external-plugins",
         "babel-plugin-polyfill-corejs2": "^0.4.10",
         "babel-plugin-polyfill-corejs3": "^0.10.4",
         "babel-plugin-polyfill-regenerator": "^0.6.1",
-        "core-js-compat": "^3.31.0",
+        "core-js-compat": "^3.37.1",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -2243,31 +2245,28 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
-      "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
+      "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
       "dependencies": {
         "@babel/code-frame": "^7.24.7",
-        "@babel/parser": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/parser": "^7.25.0",
+        "@babel/types": "^7.25.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz",
-      "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==",
+      "version": "7.25.3",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
+      "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
       "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",
+        "@babel/generator": "^7.25.0",
+        "@babel/parser": "^7.25.3",
+        "@babel/template": "^7.25.0",
+        "@babel/types": "^7.25.2",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -2276,11 +2275,11 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz",
-      "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==",
+      "version": "7.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
+      "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
       "dependencies": {
-        "@babel/helper-string-parser": "^7.24.7",
+        "@babel/helper-string-parser": "^7.24.8",
         "@babel/helper-validator-identifier": "^7.24.7",
         "to-fast-properties": "^2.0.0"
       },
@@ -8502,9 +8501,9 @@
       "license": "BSD-2-Clause"
     },
     "node_modules/browserslist": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
-      "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+      "version": "4.23.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
+      "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
       "funding": [
         {
           "type": "opencollective",
@@ -8520,10 +8519,10 @@
         }
       ],
       "dependencies": {
-        "caniuse-lite": "^1.0.30001587",
-        "electron-to-chromium": "^1.4.668",
-        "node-releases": "^2.0.14",
-        "update-browserslist-db": "^1.0.13"
+        "caniuse-lite": "^1.0.30001646",
+        "electron-to-chromium": "^1.5.4",
+        "node-releases": "^2.0.18",
+        "update-browserslist-db": "^1.1.0"
       },
       "bin": {
         "browserslist": "cli.js"
@@ -8701,9 +8700,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001615",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz",
-      "integrity": "sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==",
+      "version": "1.0.30001651",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz",
+      "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==",
       "funding": [
         {
           "type": "opencollective",
@@ -9284,12 +9283,12 @@
       }
     },
     "node_modules/core-js-compat": {
-      "version": "3.37.0",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz",
-      "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==",
+      "version": "3.38.0",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz",
+      "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==",
       "dev": true,
       "dependencies": {
-        "browserslist": "^4.23.0"
+        "browserslist": "^4.23.3"
       },
       "funding": {
         "type": "opencollective",
@@ -10386,9 +10385,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.754",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.754.tgz",
-      "integrity": "sha512-7Kr5jUdns5rL/M9wFFmMZAgFDuL2YOnanFH4OI4iFzUqyh3XOL7nAGbSlSMZdzKMIyyTpNSbqZsWG9odwLeKvA=="
+      "version": "1.5.11",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.11.tgz",
+      "integrity": "sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew=="
     },
     "node_modules/emittery": {
       "version": "0.7.2",
@@ -10846,8 +10845,9 @@
       }
     },
     "node_modules/escalade": {
-      "version": "3.1.1",
-      "license": "MIT",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+      "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
       "engines": {
         "node": ">=6"
       }
@@ -22275,9 +22275,9 @@
       }
     },
     "node_modules/node-releases": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
-      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+      "version": "2.0.18",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="
     },
     "node_modules/nodemon": {
       "version": "3.1.4",
@@ -22878,8 +22878,9 @@
       "license": "MIT"
     },
     "node_modules/picocolors": {
-      "version": "1.0.0",
-      "license": "ISC"
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
@@ -27110,9 +27111,9 @@
       }
     },
     "node_modules/update-browserslist-db": {
-      "version": "1.0.13",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
-      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+      "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
       "funding": [
         {
           "type": "opencollective",
@@ -27128,8 +27129,8 @@
         }
       ],
       "dependencies": {
-        "escalade": "^3.1.1",
-        "picocolors": "^1.0.0"
+        "escalade": "^3.1.2",
+        "picocolors": "^1.0.1"
       },
       "bin": {
         "update-browserslist-db": "cli.js"
@@ -28367,9 +28368,9 @@
       }
     },
     "@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.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
+      "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ=="
     },
     "@babel/core": {
       "version": "7.23.7",
@@ -28423,11 +28424,11 @@
       }
     },
     "@babel/generator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz",
-      "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==",
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
+      "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
       "requires": {
-        "@babel/types": "^7.24.7",
+        "@babel/types": "^7.25.0",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^2.5.1"
@@ -28443,22 +28444,23 @@
       }
     },
     "@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==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.22.15"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       }
     },
     "@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.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
+      "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
       "requires": {
-        "@babel/compat-data": "^7.23.5",
-        "@babel/helper-validator-option": "^7.23.5",
-        "browserslist": "^4.22.2",
+        "@babel/compat-data": "^7.25.2",
+        "@babel/helper-validator-option": "^7.24.8",
+        "browserslist": "^4.23.1",
         "lru-cache": "^5.1.1",
         "semver": "^6.3.1"
       },
@@ -28484,19 +28486,17 @@
       }
     },
     "@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==",
-      "dev": true,
-      "requires": {
-        "@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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz",
+      "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-member-expression-to-functions": "^7.24.8",
+        "@babel/helper-optimise-call-expression": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.25.0",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/traverse": "^7.25.0",
         "semver": "^6.3.1"
       },
       "dependencies": {
@@ -28509,12 +28509,12 @@
       }
     },
     "@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.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
+      "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "@babel/helper-annotate-as-pure": "^7.24.7",
         "regexpu-core": "^5.3.1",
         "semver": "^6.3.1"
       },
@@ -28540,38 +28540,14 @@
         "resolve": "^1.14.2"
       }
     },
-    "@babel/helper-environment-visitor": {
-      "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==",
-      "requires": {
-        "@babel/types": "^7.24.7"
-      }
-    },
-    "@babel/helper-function-name": {
-      "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==",
-      "requires": {
-        "@babel/template": "^7.24.7",
-        "@babel/types": "^7.24.7"
-      }
-    },
-    "@babel/helper-hoist-variables": {
-      "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==",
-      "requires": {
-        "@babel/types": "^7.24.7"
-      }
-    },
     "@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.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
+      "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.24.5"
+        "@babel/traverse": "^7.24.8",
+        "@babel/types": "^7.24.8"
       }
     },
     "@babel/helper-module-imports": {
@@ -28584,82 +28560,84 @@
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
-      "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+      "version": "7.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
+      "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
       "requires": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-module-imports": "^7.22.15",
-        "@babel/helper-simple-access": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/helper-validator-identifier": "^7.22.20"
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-simple-access": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/traverse": "^7.25.2"
       }
     },
     "@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==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       }
     },
     "@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=="
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
+      "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg=="
     },
     "@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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
+      "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
       "dev": true,
       "requires": {
-        "@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-wrap-function": "^7.25.0",
+        "@babel/traverse": "^7.25.0"
       }
     },
     "@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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
+      "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
       "dev": true,
       "requires": {
-        "@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-member-expression-to-functions": "^7.24.8",
+        "@babel/helper-optimise-call-expression": "^7.24.7",
+        "@babel/traverse": "^7.25.0"
       }
     },
     "@babel/helper-simple-access": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
-      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+      "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==",
       "requires": {
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       }
     },
     "@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==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       }
     },
     "@babel/helper-split-export-declaration": {
       "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==",
+      "dev": true,
       "requires": {
         "@babel/types": "^7.24.7"
       }
     },
     "@babel/helper-string-parser": {
-      "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=="
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+      "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ=="
     },
     "@babel/helper-validator-identifier": {
       "version": "7.24.7",
@@ -28667,19 +28645,19 @@
       "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w=="
     },
     "@babel/helper-validator-option": {
-      "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=="
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
+      "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q=="
     },
     "@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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
+      "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/template": "^7.24.0",
-        "@babel/types": "^7.24.5"
+        "@babel/template": "^7.25.0",
+        "@babel/traverse": "^7.25.0",
+        "@babel/types": "^7.25.0"
       }
     },
     "@babel/helpers": {
@@ -28704,48 +28682,60 @@
       }
     },
     "@babel/parser": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz",
-      "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw=="
+      "version": "7.25.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
+      "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
+      "requires": {
+        "@babel/types": "^7.25.2"
+      }
     },
     "@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.25.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
+      "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/traverse": "^7.25.3"
+      }
+    },
+    "@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
+      "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
       "dev": true,
       "requires": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.8"
       }
     },
     "@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.25.0",
+      "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.25.0.tgz",
+      "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.8"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
+      "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
       "dev": true,
       "requires": {
-        "@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.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.7"
       }
     },
     "@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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
+      "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
       "dev": true,
       "requires": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/traverse": "^7.25.0"
       }
     },
     "@babel/plugin-proposal-class-properties": {
@@ -28888,21 +28878,21 @@
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
+      "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
+      "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@babel/plugin-syntax-import-meta": {
@@ -29008,157 +28998,165 @@
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
+      "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz",
+      "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-remap-async-to-generator": "^7.22.20",
-        "@babel/plugin-syntax-async-generators": "^7.8.4"
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-remap-async-to-generator": "^7.25.0",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/traverse": "^7.25.0"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
+      "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
       "dev": true,
       "requires": {
-        "@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.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-remap-async-to-generator": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+      "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
+      "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.8"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
+      "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.24.1",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+      "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.24.4",
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       }
     },
     "@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==",
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz",
+      "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==",
       "dev": true,
       "requires": {
-        "@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",
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.8",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-replace-supers": "^7.25.0",
+        "@babel/traverse": "^7.25.0",
         "globals": "^11.1.0"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
+      "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/template": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/template": "^7.24.7"
       }
     },
     "@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.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
+      "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.8"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+      "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+      "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      }
+    },
+    "@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
+      "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.0",
+        "@babel/helper-plugin-utils": "^7.24.8"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+      "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+      "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
       "dev": true,
       "requires": {
-        "@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.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
+      "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       }
     },
@@ -29173,227 +29171,227 @@
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+      "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@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-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.25.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
+      "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
       "dev": true,
       "requires": {
-        "@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.8",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/traverse": "^7.25.1"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+      "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-json-strings": "^7.8.3"
       }
     },
     "@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.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
+      "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.8"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+      "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+      "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+      "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
+      "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
       "dev": true,
       "requires": {
-        "@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.8",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-simple-access": "^7.24.7"
       }
     },
     "@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.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
+      "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
       "dev": true,
       "requires": {
-        "@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-module-transforms": "^7.25.0",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/traverse": "^7.25.0"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+      "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
+      "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+      "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
+      "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+      "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
+      "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-plugin-utils": "^7.24.5",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.24.5"
+        "@babel/plugin-transform-parameters": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+      "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-replace-supers": "^7.24.1"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+      "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
       }
     },
     "@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.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
+      "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       }
     },
     "@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==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
+      "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.24.1",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
+      "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
       "dev": true,
       "requires": {
-        "@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.7",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+      "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@babel/plugin-transform-react-display-name": {
@@ -29454,22 +29452,22 @@
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+      "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "regenerator-transform": "^0.15.2"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+      "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@babel/plugin-transform-runtime": {
@@ -29495,49 +29493,49 @@
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
+      "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
+      "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@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-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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
+      "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
+      "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
+      "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.5"
+        "@babel/helper-plugin-utils": "^7.24.8"
       }
     },
     "@babel/plugin-transform-typescript": {
@@ -29553,66 +29551,67 @@
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+      "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+      "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
+      "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
+      "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       }
     },
     "@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==",
-      "dev": true,
-      "requires": {
-        "@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.25.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz",
+      "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.25.2",
+        "@babel/helper-compilation-targets": "^7.25.2",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-validator-option": "^7.24.8",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
+        "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
         "@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.7",
+        "@babel/plugin-syntax-import-attributes": "^7.24.7",
         "@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",
@@ -29624,59 +29623,60 @@
         "@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.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.25.0",
+        "@babel/plugin-transform-async-to-generator": "^7.24.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+        "@babel/plugin-transform-block-scoping": "^7.25.0",
+        "@babel/plugin-transform-class-properties": "^7.24.7",
+        "@babel/plugin-transform-class-static-block": "^7.24.7",
+        "@babel/plugin-transform-classes": "^7.25.0",
+        "@babel/plugin-transform-computed-properties": "^7.24.7",
+        "@babel/plugin-transform-destructuring": "^7.24.8",
+        "@babel/plugin-transform-dotall-regex": "^7.24.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+        "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
+        "@babel/plugin-transform-dynamic-import": "^7.24.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+        "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+        "@babel/plugin-transform-for-of": "^7.24.7",
+        "@babel/plugin-transform-function-name": "^7.25.1",
+        "@babel/plugin-transform-json-strings": "^7.24.7",
+        "@babel/plugin-transform-literals": "^7.25.2",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+        "@babel/plugin-transform-modules-amd": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.8",
+        "@babel/plugin-transform-modules-systemjs": "^7.25.0",
+        "@babel/plugin-transform-modules-umd": "^7.24.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+        "@babel/plugin-transform-new-target": "^7.24.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+        "@babel/plugin-transform-numeric-separator": "^7.24.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+        "@babel/plugin-transform-object-super": "^7.24.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.8",
+        "@babel/plugin-transform-parameters": "^7.24.7",
+        "@babel/plugin-transform-private-methods": "^7.24.7",
+        "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+        "@babel/plugin-transform-property-literals": "^7.24.7",
+        "@babel/plugin-transform-regenerator": "^7.24.7",
+        "@babel/plugin-transform-reserved-words": "^7.24.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+        "@babel/plugin-transform-spread": "^7.24.7",
+        "@babel/plugin-transform-sticky-regex": "^7.24.7",
+        "@babel/plugin-transform-template-literals": "^7.24.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.24.8",
+        "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+        "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
         "@babel/preset-modules": "0.1.6-no-external-plugins",
         "babel-plugin-polyfill-corejs2": "^0.4.10",
         "babel-plugin-polyfill-corejs3": "^0.10.4",
         "babel-plugin-polyfill-regenerator": "^0.6.1",
-        "core-js-compat": "^3.31.0",
+        "core-js-compat": "^3.37.1",
         "semver": "^6.3.1"
       },
       "dependencies": {
@@ -29773,38 +29773,35 @@
       }
     },
     "@babel/template": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
-      "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
+      "version": "7.25.0",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
+      "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
       "requires": {
         "@babel/code-frame": "^7.24.7",
-        "@babel/parser": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/parser": "^7.25.0",
+        "@babel/types": "^7.25.0"
       }
     },
     "@babel/traverse": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz",
-      "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==",
+      "version": "7.25.3",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
+      "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
       "requires": {
         "@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",
+        "@babel/generator": "^7.25.0",
+        "@babel/parser": "^7.25.3",
+        "@babel/template": "^7.25.0",
+        "@babel/types": "^7.25.2",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       }
     },
     "@babel/types": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz",
-      "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==",
+      "version": "7.25.2",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
+      "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
       "requires": {
-        "@babel/helper-string-parser": "^7.24.7",
+        "@babel/helper-string-parser": "^7.24.8",
         "@babel/helper-validator-identifier": "^7.24.7",
         "to-fast-properties": "^2.0.0"
       }
@@ -34015,14 +34012,14 @@
       "dev": true
     },
     "browserslist": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
-      "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+      "version": "4.23.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
+      "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
       "requires": {
-        "caniuse-lite": "^1.0.30001587",
-        "electron-to-chromium": "^1.4.668",
-        "node-releases": "^2.0.14",
-        "update-browserslist-db": "^1.0.13"
+        "caniuse-lite": "^1.0.30001646",
+        "electron-to-chromium": "^1.5.4",
+        "node-releases": "^2.0.18",
+        "update-browserslist-db": "^1.1.0"
       }
     },
     "bs-logger": {
@@ -34136,9 +34133,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001615",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz",
-      "integrity": "sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ=="
+      "version": "1.0.30001651",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz",
+      "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg=="
     },
     "canvas": {
       "version": "2.11.2",
@@ -34522,12 +34519,12 @@
       "dev": true
     },
     "core-js-compat": {
-      "version": "3.37.0",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz",
-      "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==",
+      "version": "3.38.0",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz",
+      "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.23.0"
+        "browserslist": "^4.23.3"
       }
     },
     "core-util-is": {
@@ -35306,9 +35303,9 @@
       }
     },
     "electron-to-chromium": {
-      "version": "1.4.754",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.754.tgz",
-      "integrity": "sha512-7Kr5jUdns5rL/M9wFFmMZAgFDuL2YOnanFH4OI4iFzUqyh3XOL7nAGbSlSMZdzKMIyyTpNSbqZsWG9odwLeKvA=="
+      "version": "1.5.11",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.11.tgz",
+      "integrity": "sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew=="
     },
     "emittery": {
       "version": "0.7.2",
@@ -35666,7 +35663,9 @@
       }
     },
     "escalade": {
-      "version": "3.1.1"
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+      "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="
     },
     "escape-html": {
       "version": "1.0.3"
@@ -43491,9 +43490,9 @@
       }
     },
     "node-releases": {
-      "version": "2.0.14",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
-      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+      "version": "2.0.18",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="
     },
     "nodemon": {
       "version": "3.1.4",
@@ -43882,7 +43881,9 @@
       "dev": true
     },
     "picocolors": {
-      "version": "1.0.0"
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
     },
     "picomatch": {
       "version": "2.3.1"
@@ -46722,12 +46723,12 @@
       }
     },
     "update-browserslist-db": {
-      "version": "1.0.13",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
-      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
+      "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
       "requires": {
-        "escalade": "^3.1.1",
-        "picocolors": "^1.0.0"
+        "escalade": "^3.1.2",
+        "picocolors": "^1.0.1"
       }
     },
     "uri-js": {
diff --git a/package.json b/package.json
index e781f96de..d9c996a62 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
   },
   "devDependencies": {
     "@babel/eslint-parser": "^7.22.6",
-    "@babel/preset-env": "^7.24.5",
+    "@babel/preset-env": "^7.25.3",
     "@babel/preset-react": "^7.24.7",
     "@types/create-hash": "^1.2.2",
     "@types/enzyme": "^3.10.12",

From 3b83056236d06e6f123e92e22e9acb83b1328648 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 19 Aug 2024 13:47:43 +0000
Subject: [PATCH 32/79] chore(deps): bump d3 from 7.8.5 to 7.9.0 (#1025)

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index ff556be9c..d4774ed93 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,7 +22,7 @@
         "bunyan": "^1.8.15",
         "classnames": "^2.5.1",
         "compression": "^1.7.4",
-        "d3": "^7.8.5",
+        "d3": "^7.9.0",
         "d3-geo": "^3.1.0",
         "d3-hexbin": "^0.2.2",
         "d3-scale": "^4.0.2",
@@ -9425,9 +9425,9 @@
       }
     },
     "node_modules/d3": {
-      "version": "7.8.5",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz",
-      "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==",
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
+      "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
       "dependencies": {
         "d3-array": "3",
         "d3-axis": "3",
@@ -34621,9 +34621,9 @@
       }
     },
     "d3": {
-      "version": "7.8.5",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz",
-      "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==",
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
+      "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
       "requires": {
         "d3-array": "3",
         "d3-axis": "3",
diff --git a/package.json b/package.json
index d9c996a62..166d2dd5a 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
     "bunyan": "^1.8.15",
     "classnames": "^2.5.1",
     "compression": "^1.7.4",
-    "d3": "^7.8.5",
+    "d3": "^7.9.0",
     "d3-geo": "^3.1.0",
     "d3-hexbin": "^0.2.2",
     "d3-scale": "^4.0.2",

From 1e808ad9187e27207a3f42b1b63ea00c05a01acd Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 20 Aug 2024 20:42:18 +0000
Subject: [PATCH 33/79] chore(deps): bump react-router-dom from 6.24.0 to
 6.26.1 (#1031)

---
 package-lock.json | 50 +++++++++++++++++++++++------------------------
 package.json      |  2 +-
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d4774ed93..958b176c2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -45,7 +45,7 @@
         "react-query": "^3.39.3",
         "react-redux": "^8.1.3",
         "react-router": "^6.12.1",
-        "react-router-dom": "^6.24.0",
+        "react-router-dom": "^6.26.1",
         "react18-json-view": "^0.2.7",
         "recharts": "^2.12.6",
         "redux": "^5.0.1",
@@ -5472,9 +5472,9 @@
       }
     },
     "node_modules/@remix-run/router": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.0.tgz",
-      "integrity": "sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw==",
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz",
+      "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==",
       "engines": {
         "node": ">=14.0.0"
       }
@@ -23507,11 +23507,11 @@
       "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
     },
     "node_modules/react-router": {
-      "version": "6.24.0",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.0.tgz",
-      "integrity": "sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg==",
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz",
+      "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==",
       "dependencies": {
-        "@remix-run/router": "1.17.0"
+        "@remix-run/router": "1.19.1"
       },
       "engines": {
         "node": ">=14.0.0"
@@ -23521,12 +23521,12 @@
       }
     },
     "node_modules/react-router-dom": {
-      "version": "6.24.0",
-      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.0.tgz",
-      "integrity": "sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g==",
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz",
+      "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==",
       "dependencies": {
-        "@remix-run/router": "1.17.0",
-        "react-router": "6.24.0"
+        "@remix-run/router": "1.19.1",
+        "react-router": "6.26.1"
       },
       "engines": {
         "node": ">=14.0.0"
@@ -31894,9 +31894,9 @@
       }
     },
     "@remix-run/router": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.0.tgz",
-      "integrity": "sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw=="
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz",
+      "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg=="
     },
     "@rollup/plugin-inject": {
       "version": "5.0.5",
@@ -44256,20 +44256,20 @@
       }
     },
     "react-router": {
-      "version": "6.24.0",
-      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.0.tgz",
-      "integrity": "sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg==",
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz",
+      "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==",
       "requires": {
-        "@remix-run/router": "1.17.0"
+        "@remix-run/router": "1.19.1"
       }
     },
     "react-router-dom": {
-      "version": "6.24.0",
-      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.0.tgz",
-      "integrity": "sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g==",
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz",
+      "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==",
       "requires": {
-        "@remix-run/router": "1.17.0",
-        "react-router": "6.24.0"
+        "@remix-run/router": "1.19.1",
+        "react-router": "6.26.1"
       }
     },
     "react-shallow-renderer": {
diff --git a/package.json b/package.json
index 166d2dd5a..dd3c0ee27 100644
--- a/package.json
+++ b/package.json
@@ -40,7 +40,7 @@
     "react-query": "^3.39.3",
     "react-redux": "^8.1.3",
     "react-router": "^6.12.1",
-    "react-router-dom": "^6.24.0",
+    "react-router-dom": "^6.26.1",
     "react18-json-view": "^0.2.7",
     "recharts": "^2.12.6",
     "redux": "^5.0.1",

From 6dd21e510a5a5b2662f2f90ad4322aee7100bf84 Mon Sep 17 00:00:00 2001
From: pdp2121 <71317875+pdp2121@users.noreply.github.com>
Date: Tue, 27 Aug 2024 11:46:11 -0400
Subject: [PATCH 34/79] fix: raw tab on transaction pages should show `tx`
 response from `rippled` (#1033)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

## High Level Overview of Change

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->
Resolve https://github.com/ripple/explorer/issues/358

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

### Before

![Screenshot 2024-08-26 at 4 51
58 PM](https://github.com/user-attachments/assets/7ead2467-486a-45df-ae42-009545ff626c)


### After

![Screenshot 2024-08-26 at 5 20
23 PM](https://github.com/user-attachments/assets/46a21400-90d2-45bd-b948-32d4770defb4)
---
 src/containers/App/test/App.test.jsx          |  2 +-
 src/containers/Transactions/SimpleTab.tsx     | 20 +++++++-------
 src/containers/Transactions/index.tsx         | 26 +++++++++----------
 .../Transactions/test/SimpleTab.test.tsx      |  2 +-
 .../Transactions/test/Transaction.test.tsx    |  2 +-
 .../UNLModify/test/UNLModifySimple.test.tsx   |  2 +-
 src/rippled/transactions.js                   | 13 ++++++----
 7 files changed, 35 insertions(+), 32 deletions(-)

diff --git a/src/containers/App/test/App.test.jsx b/src/containers/App/test/App.test.jsx
index 29347e8c0..886d08a59 100644
--- a/src/containers/App/test/App.test.jsx
+++ b/src/containers/App/test/App.test.jsx
@@ -43,7 +43,7 @@ jest.mock('../../../rippled', () => {
     ...originalModule,
     getTransaction: () =>
       Promise.resolve({
-        raw: formatTransaction({
+        processed: formatTransaction({
           TransactionType: 'OfferCreate',
           meta: {
             TransactionResult: 'tecKILLED',
diff --git a/src/containers/Transactions/SimpleTab.tsx b/src/containers/Transactions/SimpleTab.tsx
index e183bb6d8..6f22553e3 100644
--- a/src/containers/Transactions/SimpleTab.tsx
+++ b/src/containers/Transactions/SimpleTab.tsx
@@ -72,13 +72,13 @@ export const SimpleTab: FC<{ data: any; width: number }> = ({
     </>
   )
 
-  const { raw } = data
+  const { processed } = data
   const numberOptions = { ...CURRENCY_OPTIONS, currency: 'XRP' }
-  const time = localizeDate(new Date(raw.date), language, DATE_OPTIONS)
-  const ledgerIndex = raw.ledger_index
-  const fee = raw.tx.Fee
+  const time = localizeDate(new Date(processed.date), language, DATE_OPTIONS)
+  const ledgerIndex = processed.ledger_index
+  const fee = processed.tx.Fee
     ? localizeNumber(
-        Number.parseFloat(raw.tx.Fee) / XRP_BASE,
+        Number.parseFloat(processed.tx.Fee) / XRP_BASE,
         language,
         numberOptions,
       )
@@ -88,16 +88,16 @@ export const SimpleTab: FC<{ data: any; width: number }> = ({
     time,
     ledgerIndex,
     fee,
-    raw.tx.Account,
-    raw.tx.Sequence,
-    raw.tx.TicketSequence,
-    !!raw.tx.EmitDetails,
+    processed.tx.Account,
+    processed.tx.Sequence,
+    processed.tx.TicketSequence,
+    !!processed.tx.EmitDetails,
   )
 
   return (
     <div className="simple-body simple-body-tx">
       <div className="rows">
-        <Simple type={raw.tx.TransactionType} data={data.summary} />
+        <Simple type={processed.tx.TransactionType} data={data.summary} />
         {width < BREAKPOINTS.landscape && rowIndex}
       </div>
       {width >= BREAKPOINTS.landscape && (
diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index b5de8319f..fa34e0e4f 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -75,10 +75,10 @@ export const Transaction = () => {
   const { width } = useWindowSize()
 
   useEffect(() => {
-    if (!data?.raw) return
+    if (!data?.processed) return
 
-    const type = data?.raw.tx.TransactionType
-    const status = data?.raw.meta.TransactionResult
+    const type = data?.processed.tx.TransactionType
+    const status = data?.processed.meta.TransactionResult
 
     const transactionProperties: AnalyticsFields = {
       transaction_action: getAction(type),
@@ -91,22 +91,22 @@ export const Transaction = () => {
     }
 
     trackScreenLoaded(transactionProperties)
-  }, [identifier, data?.raw, tab, trackScreenLoaded])
+  }, [identifier, data?.processed, tab, trackScreenLoaded])
 
   function renderSummary() {
-    const type = data?.raw.tx.TransactionType
+    const type = data?.processed.tx.TransactionType
     return (
       <div className="summary">
         <div className="type">{type}</div>
-        <TxStatus status={data?.raw.meta.TransactionResult} />
-        <div className="txid" title={data?.raw.hash}>
+        <TxStatus status={data?.processed.meta.TransactionResult} />
+        <div className="txid" title={data?.processed.hash}>
           <div className="title">{t('hash')}: </div>
-          {data?.raw.hash}
+          {data?.processed.hash}
         </div>
-        {data?.raw.tx.ctid && (
-          <div className="txid" title={data.raw.tx.ctid}>
+        {data?.processed.tx.ctid && (
+          <div className="txid" title={data.processed.tx.ctid}>
             <div className="title">CTID: </div>
-            {data.raw.tx.ctid}
+            {data.processed.tx.ctid}
           </div>
         )}
       </div>
@@ -126,7 +126,7 @@ export const Transaction = () => {
 
     switch (tab) {
       case 'detailed':
-        body = <DetailTab data={data.raw} />
+        body = <DetailTab data={data.processed} />
         break
       case 'raw':
         body = <JsonView data={data.raw} />
@@ -149,7 +149,7 @@ export const Transaction = () => {
   if (isError) {
     const message = getErrorMessage(error)
     body = <NoMatch title={message.title} hints={message.hints} />
-  } else if (data?.raw && data?.raw.hash) {
+  } else if (data?.processed && data?.processed.hash) {
     body = renderTransaction()
   } else if (!identifier) {
     body = (
diff --git a/src/containers/Transactions/test/SimpleTab.test.tsx b/src/containers/Transactions/test/SimpleTab.test.tsx
index 5b983ebd6..8fe7794eb 100644
--- a/src/containers/Transactions/test/SimpleTab.test.tsx
+++ b/src/containers/Transactions/test/SimpleTab.test.tsx
@@ -15,7 +15,7 @@ describe('SimpleTab container', () => {
       <Router>
         <I18nextProvider i18n={i18n}>
           <SimpleTab
-            data={{ raw: tx, summary: summarize(tx, true).details }}
+            data={{ processed: tx, summary: summarize(tx, true).details }}
             width={width}
           />
         </I18nextProvider>
diff --git a/src/containers/Transactions/test/Transaction.test.tsx b/src/containers/Transactions/test/Transaction.test.tsx
index 774d3da56..e4b471e95 100644
--- a/src/containers/Transactions/test/Transaction.test.tsx
+++ b/src/containers/Transactions/test/Transaction.test.tsx
@@ -104,7 +104,7 @@ describe('Transaction container', () => {
 
     beforeEach(async () => {
       const transaction = {
-        raw: mockTransaction,
+        processed: mockTransaction,
         summary: mockTransactionSummary,
       }
 
diff --git a/src/containers/shared/components/Transaction/UNLModify/test/UNLModifySimple.test.tsx b/src/containers/shared/components/Transaction/UNLModify/test/UNLModifySimple.test.tsx
index f3558c8ef..89cab8f69 100644
--- a/src/containers/shared/components/Transaction/UNLModify/test/UNLModifySimple.test.tsx
+++ b/src/containers/shared/components/Transaction/UNLModify/test/UNLModifySimple.test.tsx
@@ -44,7 +44,7 @@ describe('UNLModify: Simple', () => {
       <QuickHarness i18n={i18n}>
         <SimpleTab
           data={{
-            raw: mockUNLModifyDisable,
+            processed: mockUNLModifyDisable,
             summary: summarizeTransaction(mockUNLModifyDisable, true).details,
           }}
           width={800}
diff --git a/src/rippled/transactions.js b/src/rippled/transactions.js
index ed2e6835b..0dc60f1a6 100644
--- a/src/rippled/transactions.js
+++ b/src/rippled/transactions.js
@@ -8,11 +8,14 @@ const log = logger({ name: 'transactions' })
 const getTransaction = (transactionId, rippledSocket) => {
   log.info(`get tx: ${transactionId}`)
   return getRippledTransaction(rippledSocket, transactionId)
-    .then((response) => formatTransaction(response))
-    .then((data) => ({
-      summary: summarizeTransaction(data, true).details,
-      raw: data,
-    }))
+    .then((data) => {
+      const formattedTransaction = formatTransaction(data)
+      return {
+        summary: summarizeTransaction(formattedTransaction, true).details,
+        processed: formattedTransaction,
+        raw: data,
+      }
+    })
     .catch((error) => {
       log.error(error.toString())
       throw error

From a51c1538ce8796705ab237350197065aff834ae8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 3 Sep 2024 22:36:40 +0000
Subject: [PATCH 35/79] chore(deps-dev): bump eslint-plugin-jsx-a11y from 6.7.1
 to 6.9.0 (#1040)

---
 package-lock.json | 169 +++++++++++++++++++++++++++-------------------
 package.json      |   2 +-
 2 files changed, 99 insertions(+), 72 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 958b176c2..77ad86490 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -85,7 +85,7 @@
         "eslint-config-react-app": "^7.0.1",
         "eslint-plugin-flowtype": "^8.0.3",
         "eslint-plugin-import": "^2.29.1",
-        "eslint-plugin-jsx-a11y": "^6.7.1",
+        "eslint-plugin-jsx-a11y": "^6.9.0",
         "eslint-plugin-prettier": "^5.1.3",
         "eslint-plugin-react": "^7.34.2",
         "eslint-plugin-react-hooks": "^4.6.0",
@@ -7421,9 +7421,10 @@
       }
     },
     "node_modules/ast-types-flow": {
-      "version": "0.0.7",
-      "dev": true,
-      "license": "ISC"
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+      "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+      "dev": true
     },
     "node_modules/astral-regex": {
       "version": "2.0.0",
@@ -7517,9 +7518,9 @@
       "license": "MIT"
     },
     "node_modules/axe-core": {
-      "version": "4.7.2",
-      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
-      "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==",
+      "version": "4.10.0",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz",
+      "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==",
       "dev": true,
       "engines": {
         "node": ">=4"
@@ -11354,27 +11355,27 @@
       }
     },
     "node_modules/eslint-plugin-jsx-a11y": {
-      "version": "6.7.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
-      "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz",
+      "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==",
       "dev": true,
       "dependencies": {
-        "@babel/runtime": "^7.20.7",
-        "aria-query": "^5.1.3",
-        "array-includes": "^3.1.6",
-        "array.prototype.flatmap": "^1.3.1",
-        "ast-types-flow": "^0.0.7",
-        "axe-core": "^4.6.2",
-        "axobject-query": "^3.1.1",
+        "aria-query": "~5.1.3",
+        "array-includes": "^3.1.8",
+        "array.prototype.flatmap": "^1.3.2",
+        "ast-types-flow": "^0.0.8",
+        "axe-core": "^4.9.1",
+        "axobject-query": "~3.1.1",
         "damerau-levenshtein": "^1.0.8",
         "emoji-regex": "^9.2.2",
-        "has": "^1.0.3",
-        "jsx-ast-utils": "^3.3.3",
-        "language-tags": "=1.0.5",
+        "es-iterator-helpers": "^1.0.19",
+        "hasown": "^2.0.2",
+        "jsx-ast-utils": "^3.3.5",
+        "language-tags": "^1.0.9",
         "minimatch": "^3.1.2",
-        "object.entries": "^1.1.6",
-        "object.fromentries": "^2.0.6",
-        "semver": "^6.3.0"
+        "object.fromentries": "^2.0.8",
+        "safe-regex-test": "^1.0.3",
+        "string.prototype.includes": "^2.0.0"
       },
       "engines": {
         "node": ">=4.0"
@@ -11388,14 +11389,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
-      "version": "6.3.0",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
     "node_modules/eslint-plugin-prettier": {
       "version": "5.1.3",
       "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz",
@@ -20685,12 +20678,15 @@
       }
     },
     "node_modules/jsx-ast-utils": {
-      "version": "3.3.3",
+      "version": "3.3.5",
+      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+      "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "array-includes": "^3.1.5",
-        "object.assign": "^4.1.3"
+        "array-includes": "^3.1.6",
+        "array.prototype.flat": "^1.3.1",
+        "object.assign": "^4.1.4",
+        "object.values": "^1.1.6"
       },
       "engines": {
         "node": ">=4.0"
@@ -20748,16 +20744,21 @@
       "dev": true
     },
     "node_modules/language-subtag-registry": {
-      "version": "0.3.21",
-      "dev": true,
-      "license": "ODC-By-1.0"
+      "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": {
-      "version": "1.0.5",
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+      "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "language-subtag-registry": "~0.3.2"
+        "language-subtag-registry": "^0.3.20"
+      },
+      "engines": {
+        "node": ">=0.10"
       }
     },
     "node_modules/left-pad": {
@@ -25283,6 +25284,16 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/string.prototype.includes": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz",
+      "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==",
+      "dev": true,
+      "dependencies": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
     "node_modules/string.prototype.matchall": {
       "version": "4.0.11",
       "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
@@ -33226,7 +33237,9 @@
       "dev": true
     },
     "ast-types-flow": {
-      "version": "0.0.7",
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+      "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
       "dev": true
     },
     "astral-regex": {
@@ -33274,9 +33287,9 @@
       "dev": true
     },
     "axe-core": {
-      "version": "4.7.2",
-      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
-      "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==",
+      "version": "4.10.0",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz",
+      "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==",
       "dev": true
     },
     "axios": {
@@ -36215,36 +36228,32 @@
       }
     },
     "eslint-plugin-jsx-a11y": {
-      "version": "6.7.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
-      "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz",
+      "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.20.7",
-        "aria-query": "^5.1.3",
-        "array-includes": "^3.1.6",
-        "array.prototype.flatmap": "^1.3.1",
-        "ast-types-flow": "^0.0.7",
-        "axe-core": "^4.6.2",
-        "axobject-query": "^3.1.1",
+        "aria-query": "~5.1.3",
+        "array-includes": "^3.1.8",
+        "array.prototype.flatmap": "^1.3.2",
+        "ast-types-flow": "^0.0.8",
+        "axe-core": "^4.9.1",
+        "axobject-query": "~3.1.1",
         "damerau-levenshtein": "^1.0.8",
         "emoji-regex": "^9.2.2",
-        "has": "^1.0.3",
-        "jsx-ast-utils": "^3.3.3",
-        "language-tags": "=1.0.5",
+        "es-iterator-helpers": "^1.0.19",
+        "hasown": "^2.0.2",
+        "jsx-ast-utils": "^3.3.5",
+        "language-tags": "^1.0.9",
         "minimatch": "^3.1.2",
-        "object.entries": "^1.1.6",
-        "object.fromentries": "^2.0.6",
-        "semver": "^6.3.0"
+        "object.fromentries": "^2.0.8",
+        "safe-regex-test": "^1.0.3",
+        "string.prototype.includes": "^2.0.0"
       },
       "dependencies": {
         "emoji-regex": {
           "version": "9.2.2",
           "dev": true
-        },
-        "semver": {
-          "version": "6.3.0",
-          "dev": true
         }
       }
     },
@@ -42421,11 +42430,15 @@
       }
     },
     "jsx-ast-utils": {
-      "version": "3.3.3",
+      "version": "3.3.5",
+      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+      "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
       "dev": true,
       "requires": {
-        "array-includes": "^3.1.5",
-        "object.assign": "^4.1.3"
+        "array-includes": "^3.1.6",
+        "array.prototype.flat": "^1.3.1",
+        "object.assign": "^4.1.4",
+        "object.values": "^1.1.6"
       }
     },
     "jwa": {
@@ -42472,14 +42485,18 @@
       "dev": true
     },
     "language-subtag-registry": {
-      "version": "0.3.21",
+      "version": "0.3.23",
+      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+      "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
       "dev": true
     },
     "language-tags": {
-      "version": "1.0.5",
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+      "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
       "dev": true,
       "requires": {
-        "language-subtag-registry": "~0.3.2"
+        "language-subtag-registry": "^0.3.20"
       }
     },
     "left-pad": {
@@ -45486,6 +45503,16 @@
         "strip-ansi": "^3.0.0"
       }
     },
+    "string.prototype.includes": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz",
+      "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
     "string.prototype.matchall": {
       "version": "4.0.11",
       "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
diff --git a/package.json b/package.json
index dd3c0ee27..0f28ff3c1 100644
--- a/package.json
+++ b/package.json
@@ -80,7 +80,7 @@
     "eslint-config-react-app": "^7.0.1",
     "eslint-plugin-flowtype": "^8.0.3",
     "eslint-plugin-import": "^2.29.1",
-    "eslint-plugin-jsx-a11y": "^6.7.1",
+    "eslint-plugin-jsx-a11y": "^6.9.0",
     "eslint-plugin-prettier": "^5.1.3",
     "eslint-plugin-react": "^7.34.2",
     "eslint-plugin-react-hooks": "^4.6.0",

From 59931c3daf4518bd81205773861e0a81e92faa13 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 3 Sep 2024 22:42:07 +0000
Subject: [PATCH 36/79] chore(deps): bump react18-json-view from 0.2.7 to 0.2.8
 (#1039)

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 77ad86490..96073d6cb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -46,7 +46,7 @@
         "react-redux": "^8.1.3",
         "react-router": "^6.12.1",
         "react-router-dom": "^6.26.1",
-        "react18-json-view": "^0.2.7",
+        "react18-json-view": "^0.2.8",
         "recharts": "^2.12.6",
         "redux": "^5.0.1",
         "redux-logger": "^3.0.6",
@@ -23598,9 +23598,9 @@
       }
     },
     "node_modules/react18-json-view": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.7.tgz",
-      "integrity": "sha512-u1H0ZrjrYZUuXEyjcMU+/lVbFi890SNacTcYQT+e7/TI7OeczHyLwcngY4JbtZgfhwjIU078O1+NKh97IVVwZw==",
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.8.tgz",
+      "integrity": "sha512-uJlcf5PEDaba6yTqfcDAcMSYECZ15SLcpP94mLFTa/+fa1kZANjERqKzS7YxxsrGP4+jDxt6sIaglR0PbQcKPw==",
       "peerDependencies": {
         "react": ">=16.8.0"
       }
@@ -44335,9 +44335,9 @@
       }
     },
     "react18-json-view": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.7.tgz",
-      "integrity": "sha512-u1H0ZrjrYZUuXEyjcMU+/lVbFi890SNacTcYQT+e7/TI7OeczHyLwcngY4JbtZgfhwjIU078O1+NKh97IVVwZw==",
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.8.tgz",
+      "integrity": "sha512-uJlcf5PEDaba6yTqfcDAcMSYECZ15SLcpP94mLFTa/+fa1kZANjERqKzS7YxxsrGP4+jDxt6sIaglR0PbQcKPw==",
       "requires": {}
     },
     "read-pkg": {
diff --git a/package.json b/package.json
index 0f28ff3c1..f949fb19b 100644
--- a/package.json
+++ b/package.json
@@ -41,7 +41,7 @@
     "react-redux": "^8.1.3",
     "react-router": "^6.12.1",
     "react-router-dom": "^6.26.1",
-    "react18-json-view": "^0.2.7",
+    "react18-json-view": "^0.2.8",
     "recharts": "^2.12.6",
     "redux": "^5.0.1",
     "redux-logger": "^3.0.6",

From 0b38486ffe363e34a345fd4b12b080385f38c24c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 3 Sep 2024 22:47:40 +0000
Subject: [PATCH 37/79] chore(deps): bump @google-cloud/bigquery from 7.6.1 to
 7.9.0 (#1036)

---
 package-lock.json | 30 +++++++++++++++---------------
 package.json      |  2 +-
 2 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 96073d6cb..195d78093 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,7 +8,7 @@
       "name": "explorer",
       "version": "1.5.0",
       "dependencies": {
-        "@google-cloud/bigquery": "^7.6.1",
+        "@google-cloud/bigquery": "^7.9.0",
         "@paystring/utils": "^2.0.0",
         "@redux-devtools/extension": "^3.3.0",
         "@rollup/plugin-inject": "^5.0.5",
@@ -2866,12 +2866,12 @@
       }
     },
     "node_modules/@google-cloud/bigquery": {
-      "version": "7.6.1",
-      "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.6.1.tgz",
-      "integrity": "sha512-rxggrY6gBR2lijWfb37nXNg1vnCnpf01khihMIZ+497J2aY4/Y5hMLNkQe4aFw5owCjrXvqqLqBhOVzjh9kWJA==",
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.0.tgz",
+      "integrity": "sha512-KJTimGLDlAR1IfZ4Y8xhIVfoZ+XBXd0GGuJttLSXxtR0g+4vNsUt0xS33PRVa5TXey97374yU+uWNlCb5bHwBw==",
       "dependencies": {
         "@google-cloud/common": "^5.0.0",
-        "@google-cloud/paginator": "^5.0.0",
+        "@google-cloud/paginator": "^5.0.2",
         "@google-cloud/precise-date": "^4.0.0",
         "@google-cloud/promisify": "^4.0.0",
         "arrify": "^2.0.1",
@@ -2918,9 +2918,9 @@
       }
     },
     "node_modules/@google-cloud/paginator": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz",
-      "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz",
+      "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==",
       "dependencies": {
         "arrify": "^2.0.0",
         "extend": "^3.0.2"
@@ -30087,12 +30087,12 @@
       "dev": true
     },
     "@google-cloud/bigquery": {
-      "version": "7.6.1",
-      "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.6.1.tgz",
-      "integrity": "sha512-rxggrY6gBR2lijWfb37nXNg1vnCnpf01khihMIZ+497J2aY4/Y5hMLNkQe4aFw5owCjrXvqqLqBhOVzjh9kWJA==",
+      "version": "7.9.0",
+      "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.0.tgz",
+      "integrity": "sha512-KJTimGLDlAR1IfZ4Y8xhIVfoZ+XBXd0GGuJttLSXxtR0g+4vNsUt0xS33PRVa5TXey97374yU+uWNlCb5bHwBw==",
       "requires": {
         "@google-cloud/common": "^5.0.0",
-        "@google-cloud/paginator": "^5.0.0",
+        "@google-cloud/paginator": "^5.0.2",
         "@google-cloud/precise-date": "^4.0.0",
         "@google-cloud/promisify": "^4.0.0",
         "arrify": "^2.0.1",
@@ -30128,9 +30128,9 @@
       }
     },
     "@google-cloud/paginator": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz",
-      "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz",
+      "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==",
       "requires": {
         "arrify": "^2.0.0",
         "extend": "^3.0.2"
diff --git a/package.json b/package.json
index f949fb19b..d0e15cb72 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
   "description": "XRPL Data Visualization",
   "version": "1.5.0",
   "dependencies": {
-    "@google-cloud/bigquery": "^7.6.1",
+    "@google-cloud/bigquery": "^7.9.0",
     "@paystring/utils": "^2.0.0",
     "@redux-devtools/extension": "^3.3.0",
     "@rollup/plugin-inject": "^5.0.5",

From 8cb5fc91d2cd6d72f56c57dd6a6b10d6516eb619 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 3 Sep 2024 23:07:21 +0000
Subject: [PATCH 38/79] chore(deps-dev): bump @types/create-hash from 1.2.2 to
 1.2.6 (#1038)

---
 package-lock.json | 11 +++++++----
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 195d78093..ffe24019a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -65,7 +65,7 @@
         "@babel/eslint-parser": "^7.22.6",
         "@babel/preset-env": "^7.25.3",
         "@babel/preset-react": "^7.24.7",
-        "@types/create-hash": "^1.2.2",
+        "@types/create-hash": "^1.2.6",
         "@types/enzyme": "^3.10.12",
         "@types/jest": "^26.0.24",
         "@types/lodash": "^4.17.6",
@@ -5972,9 +5972,10 @@
       }
     },
     "node_modules/@types/create-hash": {
-      "version": "1.2.2",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/@types/create-hash/-/create-hash-1.2.6.tgz",
+      "integrity": "sha512-/VIViZZAK3rAFvfGbWmcLaxwKfmU213W/XL2cr5VE0ac44jE5ky7+sHl54OJhd+bTz7sqi+Ev//8RU1F/S/ZJQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@types/node": "*"
       }
@@ -32221,7 +32222,9 @@
       }
     },
     "@types/create-hash": {
-      "version": "1.2.2",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/@types/create-hash/-/create-hash-1.2.6.tgz",
+      "integrity": "sha512-/VIViZZAK3rAFvfGbWmcLaxwKfmU213W/XL2cr5VE0ac44jE5ky7+sHl54OJhd+bTz7sqi+Ev//8RU1F/S/ZJQ==",
       "dev": true,
       "requires": {
         "@types/node": "*"
diff --git a/package.json b/package.json
index d0e15cb72..2bedf9b0d 100644
--- a/package.json
+++ b/package.json
@@ -60,7 +60,7 @@
     "@babel/eslint-parser": "^7.22.6",
     "@babel/preset-env": "^7.25.3",
     "@babel/preset-react": "^7.24.7",
-    "@types/create-hash": "^1.2.2",
+    "@types/create-hash": "^1.2.6",
     "@types/enzyme": "^3.10.12",
     "@types/jest": "^26.0.24",
     "@types/lodash": "^4.17.6",

From 222a00333408ff6b3269e8deca351b6eaac1123b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 3 Sep 2024 23:12:36 +0000
Subject: [PATCH 39/79] chore(deps-dev): bump lint-staged from 15.2.5 to
 15.2.10 (#1037)

---
 package-lock.json | 344 +++++++++++++++++++++++++++++-----------------
 package.json      |   2 +-
 2 files changed, 218 insertions(+), 128 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index ffe24019a..3d1f95dee 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -91,7 +91,7 @@
         "eslint-plugin-react-hooks": "^4.6.0",
         "jest-enzyme": "^7.1.0",
         "jest-websocket-mock": "^2.5.0",
-        "lint-staged": "^15.2.5",
+        "lint-staged": "^15.2.10",
         "mock-socket": "^9.1.5",
         "moxios": "^0.4.0",
         "nodemon": "^3.1.4",
@@ -8955,15 +8955,15 @@
       "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
     },
     "node_modules/cli-cursor": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
-      "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+      "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
       "dev": true,
       "dependencies": {
-        "restore-cursor": "^4.0.0"
+        "restore-cursor": "^5.0.0"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -9010,9 +9010,9 @@
       }
     },
     "node_modules/cli-truncate/node_modules/emoji-regex": {
-      "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
-      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+      "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
       "dev": true
     },
     "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": {
@@ -9044,9 +9044,9 @@
       }
     },
     "node_modules/cli-truncate/node_modules/string-width": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
-      "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
       "dev": true,
       "dependencies": {
         "emoji-regex": "^10.3.0",
@@ -10435,6 +10435,18 @@
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
+    "node_modules/environment": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+      "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/enzyme": {
       "version": "3.11.0",
       "dev": true,
@@ -20789,9 +20801,9 @@
       }
     },
     "node_modules/lilconfig": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
-      "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+      "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
       "dev": true,
       "engines": {
         "node": ">=14"
@@ -20805,21 +20817,21 @@
       "license": "MIT"
     },
     "node_modules/lint-staged": {
-      "version": "15.2.5",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz",
-      "integrity": "sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==",
+      "version": "15.2.10",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz",
+      "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==",
       "dev": true,
       "dependencies": {
         "chalk": "~5.3.0",
         "commander": "~12.1.0",
-        "debug": "~4.3.4",
+        "debug": "~4.3.6",
         "execa": "~8.0.1",
-        "lilconfig": "~3.1.1",
-        "listr2": "~8.2.1",
-        "micromatch": "~4.0.7",
+        "lilconfig": "~3.1.2",
+        "listr2": "~8.2.4",
+        "micromatch": "~4.0.8",
         "pidtree": "~0.6.0",
         "string-argv": "~0.3.2",
-        "yaml": "~2.4.2"
+        "yaml": "~2.5.0"
       },
       "bin": {
         "lint-staged": "bin/lint-staged.js"
@@ -20956,9 +20968,9 @@
       }
     },
     "node_modules/lint-staged/node_modules/micromatch": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
-      "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
       "dev": true,
       "dependencies": {
         "braces": "^3.0.3",
@@ -21115,9 +21127,9 @@
       }
     },
     "node_modules/lint-staged/node_modules/yaml": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
-      "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz",
+      "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==",
       "dev": true,
       "bin": {
         "yaml": "bin.mjs"
@@ -21127,16 +21139,16 @@
       }
     },
     "node_modules/listr2": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz",
-      "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz",
+      "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==",
       "dev": true,
       "dependencies": {
         "cli-truncate": "^4.0.0",
         "colorette": "^2.0.20",
         "eventemitter3": "^5.0.1",
-        "log-update": "^6.0.0",
-        "rfdc": "^1.3.1",
+        "log-update": "^6.1.0",
+        "rfdc": "^1.4.1",
         "wrap-ansi": "^9.0.0"
       },
       "engines": {
@@ -21168,9 +21180,9 @@
       }
     },
     "node_modules/listr2/node_modules/emoji-regex": {
-      "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
-      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+      "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
       "dev": true
     },
     "node_modules/listr2/node_modules/eventemitter3": {
@@ -21180,9 +21192,9 @@
       "dev": true
     },
     "node_modules/listr2/node_modules/string-width": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
-      "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
       "dev": true,
       "dependencies": {
         "emoji-regex": "^10.3.0",
@@ -21344,14 +21356,14 @@
       "license": "MIT"
     },
     "node_modules/log-update": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz",
-      "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
+      "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
       "dev": true,
       "dependencies": {
-        "ansi-escapes": "^6.2.0",
-        "cli-cursor": "^4.0.0",
-        "slice-ansi": "^7.0.0",
+        "ansi-escapes": "^7.0.0",
+        "cli-cursor": "^5.0.0",
+        "slice-ansi": "^7.1.0",
         "strip-ansi": "^7.1.0",
         "wrap-ansi": "^9.0.0"
       },
@@ -21363,12 +21375,15 @@
       }
     },
     "node_modules/log-update/node_modules/ansi-escapes": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
-      "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+      "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
       "dev": true,
+      "dependencies": {
+        "environment": "^1.0.0"
+      },
       "engines": {
-        "node": ">=14.16"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -21399,9 +21414,9 @@
       }
     },
     "node_modules/log-update/node_modules/emoji-regex": {
-      "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
-      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+      "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
       "dev": true
     },
     "node_modules/log-update/node_modules/is-fullwidth-code-point": {
@@ -21436,9 +21451,9 @@
       }
     },
     "node_modules/log-update/node_modules/string-width": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
-      "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
       "dev": true,
       "dependencies": {
         "emoji-regex": "^10.3.0",
@@ -21890,10 +21905,23 @@
       "version": "2.1.0",
       "dev": true,
       "license": "MIT",
+      "peer": true,
       "engines": {
         "node": ">=6"
       }
     },
+    "node_modules/mimic-function": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+      "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+      "dev": true,
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/mimic-response": {
       "version": "2.1.0",
       "dev": true,
@@ -22667,6 +22695,7 @@
       "version": "5.1.2",
       "dev": true,
       "license": "MIT",
+      "peer": true,
       "dependencies": {
         "mimic-fn": "^2.1.0"
       },
@@ -24040,21 +24069,48 @@
       "license": "MIT"
     },
     "node_modules/restore-cursor": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
-      "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+      "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
       "dev": true,
       "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
+        "onetime": "^7.0.0",
+        "signal-exit": "^4.1.0"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/restore-cursor/node_modules/onetime": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+      "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+      "dev": true,
+      "dependencies": {
+        "mimic-function": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/restore-cursor/node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "dev": true,
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/ret": {
       "version": "0.1.15",
       "dev": true,
@@ -24084,9 +24140,9 @@
       }
     },
     "node_modules/rfdc": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
-      "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
       "dev": true
     },
     "node_modules/rimraf": {
@@ -34312,12 +34368,12 @@
       "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
     },
     "cli-cursor": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
-      "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+      "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
       "dev": true,
       "requires": {
-        "restore-cursor": "^4.0.0"
+        "restore-cursor": "^5.0.0"
       }
     },
     "cli-truncate": {
@@ -34343,9 +34399,9 @@
           "dev": true
         },
         "emoji-regex": {
-          "version": "10.3.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
-          "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
+          "version": "10.4.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+          "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
           "dev": true
         },
         "is-fullwidth-code-point": {
@@ -34365,9 +34421,9 @@
           }
         },
         "string-width": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
-          "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+          "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
           "dev": true,
           "requires": {
             "emoji-regex": "^10.3.0",
@@ -35351,6 +35407,12 @@
     "entities": {
       "version": "2.2.0"
     },
+    "environment": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+      "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+      "dev": true
+    },
     "enzyme": {
       "version": "3.11.0",
       "dev": true,
@@ -42520,30 +42582,30 @@
       }
     },
     "lilconfig": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
-      "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+      "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
       "dev": true
     },
     "lines-and-columns": {
       "version": "1.1.6"
     },
     "lint-staged": {
-      "version": "15.2.5",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.5.tgz",
-      "integrity": "sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==",
+      "version": "15.2.10",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz",
+      "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==",
       "dev": true,
       "requires": {
         "chalk": "~5.3.0",
         "commander": "~12.1.0",
-        "debug": "~4.3.4",
+        "debug": "~4.3.6",
         "execa": "~8.0.1",
-        "lilconfig": "~3.1.1",
-        "listr2": "~8.2.1",
-        "micromatch": "~4.0.7",
+        "lilconfig": "~3.1.2",
+        "listr2": "~8.2.4",
+        "micromatch": "~4.0.8",
         "pidtree": "~0.6.0",
         "string-argv": "~0.3.2",
-        "yaml": "~2.4.2"
+        "yaml": "~2.5.0"
       },
       "dependencies": {
         "braces": {
@@ -42629,9 +42691,9 @@
           "dev": true
         },
         "micromatch": {
-          "version": "4.0.7",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
-          "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
+          "version": "4.0.8",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+          "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
           "dev": true,
           "requires": {
             "braces": "^3.0.3",
@@ -42726,24 +42788,24 @@
           }
         },
         "yaml": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
-          "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz",
+          "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==",
           "dev": true
         }
       }
     },
     "listr2": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.1.tgz",
-      "integrity": "sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz",
+      "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==",
       "dev": true,
       "requires": {
         "cli-truncate": "^4.0.0",
         "colorette": "^2.0.20",
         "eventemitter3": "^5.0.1",
-        "log-update": "^6.0.0",
-        "rfdc": "^1.3.1",
+        "log-update": "^6.1.0",
+        "rfdc": "^1.4.1",
         "wrap-ansi": "^9.0.0"
       },
       "dependencies": {
@@ -42760,9 +42822,9 @@
           "dev": true
         },
         "emoji-regex": {
-          "version": "10.3.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
-          "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
+          "version": "10.4.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+          "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
           "dev": true
         },
         "eventemitter3": {
@@ -42772,9 +42834,9 @@
           "dev": true
         },
         "string-width": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
-          "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+          "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
           "dev": true,
           "requires": {
             "emoji-regex": "^10.3.0",
@@ -42897,23 +42959,26 @@
       "dev": true
     },
     "log-update": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz",
-      "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
+      "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
       "dev": true,
       "requires": {
-        "ansi-escapes": "^6.2.0",
-        "cli-cursor": "^4.0.0",
-        "slice-ansi": "^7.0.0",
+        "ansi-escapes": "^7.0.0",
+        "cli-cursor": "^5.0.0",
+        "slice-ansi": "^7.1.0",
         "strip-ansi": "^7.1.0",
         "wrap-ansi": "^9.0.0"
       },
       "dependencies": {
         "ansi-escapes": {
-          "version": "6.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
-          "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
-          "dev": true
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+          "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+          "dev": true,
+          "requires": {
+            "environment": "^1.0.0"
+          }
         },
         "ansi-regex": {
           "version": "6.0.1",
@@ -42928,9 +42993,9 @@
           "dev": true
         },
         "emoji-regex": {
-          "version": "10.3.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
-          "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
+          "version": "10.4.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+          "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
           "dev": true
         },
         "is-fullwidth-code-point": {
@@ -42953,9 +43018,9 @@
           }
         },
         "string-width": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
-          "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+          "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
           "dev": true,
           "requires": {
             "emoji-regex": "^10.3.0",
@@ -43250,6 +43315,13 @@
     },
     "mimic-fn": {
       "version": "2.1.0",
+      "dev": true,
+      "peer": true
+    },
+    "mimic-function": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+      "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
       "dev": true
     },
     "mimic-response": {
@@ -43770,6 +43842,7 @@
     "onetime": {
       "version": "5.1.2",
       "dev": true,
+      "peer": true,
       "requires": {
         "mimic-fn": "^2.1.0"
       }
@@ -44650,13 +44723,30 @@
       "dev": true
     },
     "restore-cursor": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
-      "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+      "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
       "dev": true,
       "requires": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
+        "onetime": "^7.0.0",
+        "signal-exit": "^4.1.0"
+      },
+      "dependencies": {
+        "onetime": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+          "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+          "dev": true,
+          "requires": {
+            "mimic-function": "^5.0.0"
+          }
+        },
+        "signal-exit": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+          "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+          "dev": true
+        }
       }
     },
     "ret": {
@@ -44676,9 +44766,9 @@
       "version": "1.0.4"
     },
     "rfdc": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
-      "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
       "dev": true
     },
     "rimraf": {
diff --git a/package.json b/package.json
index 2bedf9b0d..f9aeef9c5 100644
--- a/package.json
+++ b/package.json
@@ -86,7 +86,7 @@
     "eslint-plugin-react-hooks": "^4.6.0",
     "jest-enzyme": "^7.1.0",
     "jest-websocket-mock": "^2.5.0",
-    "lint-staged": "^15.2.5",
+    "lint-staged": "^15.2.10",
     "mock-socket": "^9.1.5",
     "moxios": "^0.4.0",
     "nodemon": "^3.1.4",

From 1018f056d6a7c894916969751a5a53ac2c8106aa Mon Sep 17 00:00:00 2001
From: pdp2121 <71317875+pdp2121@users.noreply.github.com>
Date: Wed, 4 Sep 2024 16:02:16 -0400
Subject: [PATCH 40/79] fix: Upgrade Status renders on data error (#1000)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

## High Level Overview of Change

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

The VHS is experiencing an intermittent issue with CORS header that
causes occasional disruption in data fetching for the Upgrade Status
chart. This PR will add checks so to ensure the chart renders even when
there's a disruption.

<img width="1725" alt="Screenshot 2024-06-12 at 4 13 54 PM"
src="https://github.com/ripple/explorer/assets/71317875/f5120024-4954-4d26-8c77-5ede6326d265">


### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release
---
 public/locales/ca-CA/translations.json        |   4 +-
 public/locales/en-US/translations.json        |   4 +-
 public/locales/es-ES/translations.json        |   4 +-
 public/locales/fr-FR/translations.json        |   4 +-
 public/locales/ja-JP/translations.json        |   4 +-
 public/locales/ko-KR/translations.json        |   4 +-
 src/containers/Network/BarChartVersion.tsx    |  12 +-
 src/containers/Network/UpgradeStatus.tsx      | 138 +++++++----
 .../Network/test/upgradeStatus.test.js        | 218 ++++++++++++------
 9 files changed, 262 insertions(+), 130 deletions(-)

diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index a4b62daf5..d5e305960 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -445,8 +445,8 @@
   "other_chain_destination": "Destinació a una altra xarxa",
   "%_of_total_nodes_validators": "% total de nodes i validadors",
   "version_display": "Versió: {{version}}",
-  "validators_count": "# de Validadors: {{vals_count}}",
-  "nodes_count": "# de Nodes: {{nodes_count}}",
+  "validator_count": "# de Validadors: {{val_count}}",
+  "node_count": "# de Nodes: {{node_count}}",
   "current_stable_version": "Versió estable actual",
   "stable_version": "{{stableVersion}}",
   "nftoken_minter": "Encunyador NFT",
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index c7e8e0642..369edfa7a 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -445,8 +445,8 @@
   "other_chain_destination": "Other Chain Destination",
   "%_of_total_nodes_validators": "% of Total Nodes & Validators",
   "version_display": "Version: {{version}}",
-  "validators_count": "# of Validators: {{vals_count}}",
-  "nodes_count": "# of Nodes: {{nodes_count}}",
+  "validator_count": "# of Validators: {{val_count}}",
+  "node_count": "# of Nodes: {{node_count}}",
   "current_stable_version": "Current Stable Version",
   "stable_version": "{{stableVersion}}",
   "nftoken_minter": "NFT Minter",
diff --git a/public/locales/es-ES/translations.json b/public/locales/es-ES/translations.json
index 4245651b0..bde04d337 100644
--- a/public/locales/es-ES/translations.json
+++ b/public/locales/es-ES/translations.json
@@ -441,8 +441,8 @@
   "other_chain_destination": "Otro Destino de Cadena",
   "%_of_total_nodes_validators": "% Total de Nodos y Validadores",
   "version_display": "Versión: {{version}}",
-  "validators_count": "# de Validadores: {{vals_count}}",
-  "nodes_count": "# de Nodos: {{nodes_count}}",
+  "validator_count": "# de Validadores: {{val_count}}",
+  "node_count": "# de Nodos: {{node_count}}",
   "current_stable_version": "Versión Estable Actual",
   "stable_version": "{{stableVersion}}",
   "nftoken_minter": "Acuñador NFT",
diff --git a/public/locales/fr-FR/translations.json b/public/locales/fr-FR/translations.json
index 3265e919e..9cbdc4293 100644
--- a/public/locales/fr-FR/translations.json
+++ b/public/locales/fr-FR/translations.json
@@ -443,8 +443,8 @@
   "other_chain_destination": "Autre destination de chaîne",
   "%_of_total_nodes_validators": "% des nœuds et des validateurs",
   "version_display": "Version: {{version}}",
-  "validators_count": "nb de Validateurs: {{vals_count}}",
-  "nodes_count": "nb de Nœuds: {{nodes_count}}",
+  "validator_count": "nb de Validateurs: {{val_count}}",
+  "node_count": "nb de Nœuds: {{node_count}}",
   "current_stable_version": "Version Stable Actuelle",
   "stable_version": "{{stableVersion}}",
   "nftoken_minter": "Créateur du NFT",
diff --git a/public/locales/ja-JP/translations.json b/public/locales/ja-JP/translations.json
index 76c396048..953a54eba 100644
--- a/public/locales/ja-JP/translations.json
+++ b/public/locales/ja-JP/translations.json
@@ -443,8 +443,8 @@
   "other_chain_destination": null,
   "%_of_total_nodes_validators": null,
   "version_display": "バージョン: {{version}}",
-  "validators_count": "バリデータの数: {{vals_count}}",
-  "nodes_count": "ノードの数: {{nodes_count}}",
+  "validator_count": "バリデータの数: {{val_count}}",
+  "node_count": "ノードの数: {{node_count}}",
   "current_stable_version": "現在の安定バージョン",
   "stable_version": null,
   "nftoken_minter": "NFT発行者",
diff --git a/public/locales/ko-KR/translations.json b/public/locales/ko-KR/translations.json
index 73951775e..2094a1fe5 100644
--- a/public/locales/ko-KR/translations.json
+++ b/public/locales/ko-KR/translations.json
@@ -441,8 +441,8 @@
   "other_chain_destination": "다른 체인의 목적지",
   "%_of_total_nodes_validators": "노드와 검증자의 총 비율",
   "version_display": "버전: {{version}}",
-  "validators_count": "검증자 수: {{vals_count}}",
-  "nodes_count": "노드 수: {{nodes_count}}",
+  "validator_count": "검증자 수: {{val_count}}",
+  "node_count": "노드 수: {{node_count}}",
   "current_stable_version": "현재 안정적인 버전",
   "stable_version": "{{stableVersion}}",
   "nftoken_minter": "NFT 발행자",
diff --git a/src/containers/Network/BarChartVersion.tsx b/src/containers/Network/BarChartVersion.tsx
index b9f63f6c4..b49b0ad13 100644
--- a/src/containers/Network/BarChartVersion.tsx
+++ b/src/containers/Network/BarChartVersion.tsx
@@ -51,13 +51,13 @@ const CustomTooltip = ({
       <div className="custom-tooltip">
         <p className="label">{t('version_display', { version: label })}</p>
         <p className="value">
-          {t('validators_count', {
-            vals_count: payload ? payload[0].payload.validatorsCount : 0,
+          {t('validator_count', {
+            val_count: payload?.[0]?.payload?.validatorCount ?? 0,
           })}
         </p>
         <p className="value">
-          {t('nodes_count', {
-            nodes_count: payload ? payload[0].payload.nodesCount : 0,
+          {t('node_count', {
+            node_count: payload?.[0]?.payload?.nodeCount ?? 0,
           })}
         </p>
       </div>
@@ -162,7 +162,7 @@ const BarChartVersion = (props: Props) => {
             />
           </YAxis>
           <Bar
-            dataKey="validatorsPercent"
+            dataKey="validatorPercent"
             barSize={30}
             fill={PURPLE}
             radius={[4, 4, 0, 0]}
@@ -183,7 +183,7 @@ const BarChartVersion = (props: Props) => {
               ))}
           </Bar>
           <Bar
-            dataKey="nodesPercent"
+            dataKey="nodePercent"
             barSize={30}
             fill={PURPLE}
             radius={[4, 4, 0, 0]}
diff --git a/src/containers/Network/UpgradeStatus.tsx b/src/containers/Network/UpgradeStatus.tsx
index 22e2f0fd1..cdd599790 100644
--- a/src/containers/Network/UpgradeStatus.tsx
+++ b/src/containers/Network/UpgradeStatus.tsx
@@ -22,63 +22,108 @@ import {
 } from '../shared/vhsTypes'
 import NetworkContext from '../shared/NetworkContext'
 import { ledgerCompare } from './Nodes'
+import { Loader } from '../shared/components/Loader'
 
-interface DataAggregation {
-  label: string
-  validatorsPercent: number
-  validatorsCount: number
-  nodesPercent: number
-  nodesCount: number
+interface NodeStats {
+  nodePercent: number
+  nodeCount: number
 }
 
-export const aggregateData = (
-  validators: ValidatorResponse[],
-  nodes: NodeResponse[],
-): DataAggregation[] => {
-  if (!validators) {
-    return []
-  }
+interface ValidatorStats {
+  validatorPercent: number
+  validatorCount: number
+}
 
-  let totalVals = 0
-  let totalNodes = 0
-  interface aggregationTypes {
-    validatorsCount: number
-    nodesCount: number
-  }
+interface ValidatorAggregation {
+  [label: string]: ValidatorStats
+}
 
-  const aggregation: Record<string, aggregationTypes> = {}
+interface NodeAggregation {
+  [label: string]: NodeStats
+}
+
+interface DataAggregation extends ValidatorStats, NodeStats {
+  label: string
+}
+
+export const aggregateValidators = (validators: ValidatorResponse[]) => {
+  let totalVals = 0
+  const aggregation: ValidatorAggregation = {}
   validators?.forEach((validator) => {
     if (!validator.signing_key) return
     const version = validator.server_version
     totalVals += 1
     if (version) {
       if (!aggregation[version]) {
-        aggregation[version] = { validatorsCount: 0, nodesCount: 0 }
+        aggregation[version] = { validatorCount: 0, validatorPercent: 0 }
       }
-      aggregation[version].validatorsCount += 1
+      aggregation[version].validatorCount += 1
     }
   })
+  for (const label of Object.keys(aggregation)) {
+    aggregation[label].validatorPercent =
+      totalVals > 0 ? (aggregation[label].validatorCount / totalVals) * 100 : 0
+  }
+
+  return aggregation
+}
 
+export const aggregateNodes = (nodes: NodeResponse[]) => {
+  let totalNodes = 0
+  const aggregation: NodeAggregation = {}
   nodes?.forEach((node) => {
     const { version } = node
     if (!node.node_public_key) return
     totalNodes += 1
     if (version) {
       if (!aggregation[version]) {
-        aggregation[version] = { validatorsCount: 0, nodesCount: 0 }
+        aggregation[version] = { nodeCount: 0, nodePercent: 0 }
       }
-      aggregation[version].nodesCount += 1
+      aggregation[version].nodeCount += 1
     }
   })
+  for (const label of Object.keys(aggregation)) {
+    aggregation[label].nodePercent =
+      totalNodes > 0 ? (aggregation[label].nodeCount / totalNodes) * 100 : 0
+  }
+
+  return aggregation
+}
 
-  return Object.entries(aggregation)
-    .map(([version, counts]) => ({
-      label: version ? version.trim() : 'N/A',
-      validatorsPercent:
-        totalVals > 0 ? (counts.validatorsCount * 100) / totalVals : 0,
-      validatorsCount: counts.validatorsCount,
-      nodesPercent: totalNodes > 0 ? (counts.nodesCount * 100) / totalNodes : 0,
-      nodesCount: counts.nodesCount,
+export const aggregateData = (
+  validatorAggregation: ValidatorAggregation,
+  nodeAggregation: NodeAggregation,
+): DataAggregation[] => {
+  const combinedAggregation: { [label: string]: ValidatorStats & NodeStats } =
+    {}
+  for (const label of Object.keys(validatorAggregation)) {
+    combinedAggregation[label] = {
+      validatorPercent: validatorAggregation[label].validatorPercent,
+      validatorCount: validatorAggregation[label].validatorCount,
+      nodePercent: 0,
+      nodeCount: 0,
+    }
+  }
+
+  for (const label of Object.keys(nodeAggregation)) {
+    if (!combinedAggregation[label]) {
+      combinedAggregation[label] = {
+        validatorPercent: 0,
+        validatorCount: 0,
+        nodePercent: nodeAggregation[label].nodePercent,
+        nodeCount: nodeAggregation[label].nodeCount,
+      }
+    } else {
+      combinedAggregation[label].nodePercent =
+        nodeAggregation[label].nodePercent
+      combinedAggregation[label].nodeCount = nodeAggregation[label].nodeCount
+    }
+  }
+
+  return Object.entries(combinedAggregation)
+    .map(([label, stats]) => ({
+      label,
+      ...stats,
     }))
     .sort((a, b) => (isEarlierVersion(a.label, b.label) ? -1 : 1))
 }
@@ -110,7 +155,9 @@ export const UpgradeStatus = () => {
   const [vList, setVList] = useState<Record<string, ValidatorResponse>>({})
   const [validations, setValidations] = useState<ValidatorResponse[]>([])
   const [unlCount, setUnlCount] = useState(0)
-  const [aggregated, setAggregated] = useState<DataAggregation[]>([])
+  const [validatorAggregation, setValidatorAggregation] =
+    useState<ValidatorAggregation>({})
+  const [nodeAggregation, setNodeAggregation] = useState<NodeAggregation>({})
   const { t } = useTranslation()
   const language = useLanguage()
   const network = useContext(NetworkContext)
@@ -145,7 +192,7 @@ export const UpgradeStatus = () => {
   )
 
   const fetchData = () => {
-    const validatorsReq = axios
+    axios
       .get(`${process.env.VITE_DATA_URL}/validators/${network}`)
       .then((resp) => resp.data.validators)
       .then((validators: ValidatorResponse[]) => {
@@ -153,16 +200,16 @@ export const UpgradeStatus = () => {
         validators.forEach((validator) => {
           newValidatorList[validator.signing_key] = validator
         })
-
         setVList(newValidatorList)
         setUnlCount(
           validators.filter((validator) => Boolean(validator.unl)).length,
         )
+        setValidatorAggregation(aggregateValidators(validators))
         return Object.values(newValidatorList)
       })
       .catch((e) => Log.error(e))
 
-    const nodesReq = axios
+    axios
       .get(`${process.env.VITE_DATA_URL}/topology/nodes/${network}`)
       .then((resp) => resp.data.nodes)
       .then((allNodes) => {
@@ -188,12 +235,11 @@ export const UpgradeStatus = () => {
           }
           return 1
         })
+
+        setNodeAggregation(aggregateNodes(nodes))
         return nodes
       })
       .catch((e) => Log.error(e))
-    Promise.all([validatorsReq, nodesReq]).then(([validators, nodes]) => {
-      setAggregated(aggregateData(validators, nodes))
-    })
   }
 
   const fetchStableVersion = () => {
@@ -250,9 +296,17 @@ export const UpgradeStatus = () => {
       </div>
       <div className="wrap">
         <NetworkTabs selected="upgrade-status" />
-        <div className="upgrade_status">
-          <BarChartVersion data={aggregated} stableVersion={stableVersion} />
-        </div>
+        {Object.keys(validatorAggregation).length > 0 ||
+        Object.keys(nodeAggregation).length > 0 ? (
+          <div className="upgrade_status">
+            <BarChartVersion
+              data={aggregateData(validatorAggregation, nodeAggregation)}
+              stableVersion={stableVersion}
+            />
+          </div>
+        ) : (
+          <Loader />
+        )}
       </div>
     </div>
   )
diff --git a/src/containers/Network/test/upgradeStatus.test.js b/src/containers/Network/test/upgradeStatus.test.js
index 79d15a0d4..28d43d480 100644
--- a/src/containers/Network/test/upgradeStatus.test.js
+++ b/src/containers/Network/test/upgradeStatus.test.js
@@ -1,84 +1,162 @@
-import { aggregateData } from '../UpgradeStatus'
+import { mount } from 'enzyme'
+import moxios from 'moxios'
+import WS from 'jest-websocket-mock'
+import { Route } from 'react-router'
+import i18n from '../../../i18n/testConfig'
+import { Network } from '../index'
+import SocketContext from '../../shared/SocketContext'
+import MockWsClient from '../../test/mockWsClient'
+import { QuickHarness } from '../../test/utils'
+import { NETWORK_ROUTE } from '../../App/routes'
+import {
+  aggregateData,
+  aggregateNodes,
+  aggregateValidators,
+} from '../UpgradeStatus'
 
-describe('UpgradeStatus test functions', () => {
-  const undefinedValidatorsData = [
-    {
-      ledger_index: 74661353,
-      ledger_hash:
-        '613E298A8C0AEB816D16AA61952E0834BBD9B5E5677EA3E9A2413118EE074363',
+const undefinedValidatorsData = [
+  {
+    ledger_index: 74661353,
+    ledger_hash:
+      '613E298A8C0AEB816D16AA61952E0834BBD9B5E5677EA3E9A2413118EE074363',
+  },
+  {
+    master_key: 'nHUakYHufAvdx5XqTS2F4Pu7i8fQqDqpKqXN2kUGHhBFcG38GNqL',
+    signing_key: 'n9M38x7Sf7epp3gaxgcFxEtwkSc4w2ePb1SgfLiz9bVCr5Lvzrm8',
+    unl: false,
+    domain: 'gerty.one',
+    ledger_index: 74554449,
+    server_version: '1.9.4',
+    agreement_1hour: {
+      missed: 936,
+      total: 936,
+      score: '0.00000',
+      incomplete: false,
     },
-    {
-      master_key: 'nHUakYHufAvdx5XqTS2F4Pu7i8fQqDqpKqXN2kUGHhBFcG38GNqL',
-      signing_key: 'n9M38x7Sf7epp3gaxgcFxEtwkSc4w2ePb1SgfLiz9bVCr5Lvzrm8',
-      unl: false,
-      domain: 'gerty.one',
-      ledger_index: 74554449,
-      server_version: '1.9.4',
-      agreement_1hour: {
-        missed: 936,
-        total: 936,
-        score: '0.00000',
-        incomplete: false,
-      },
-      agreement_24hour: {
-        missed: 22338,
-        total: 22338,
-        score: '0.00000',
-        incomplete: false,
-      },
-      agreement_30day: {
-        missed: 263139,
-        total: 535427,
-        score: '0.50854',
-        incomplete: false,
-      },
-      chain: 'chain.4',
-      partial: false,
+    agreement_24hour: {
+      missed: 22338,
+      total: 22338,
+      score: '0.00000',
+      incomplete: false,
     },
-  ]
-
-  const nodesData = [
-    {
-      node_public_key: 'n9JoeT8XKeBSR8y4D9aDz2PL1DD1j6LQwkRTbH2eFqeRmWYHj2Nw',
-      networks: 'dev',
-      complete_ledgers: '22085270-29882772',
-      ip: '34.208.12.148',
-      port: 2459,
-      uptime: 1257336,
-      version: '1.11.0-rc3',
-      server_state: 'full',
-      io_latency_ms: 1,
-      load_factor_server: '256',
-      inbound_count: 4,
-      outbound_count: 9,
-      lat: '45.82',
-      long: '-119.73',
-      country_code: 'US',
-      country: 'United States',
-      region: 'Oregon',
-      region_code: 'OR',
-      city: 'Boardman',
-      postal_code: '97818',
-      timezone: 'America/Los_Angeles',
+    agreement_30day: {
+      missed: 263139,
+      total: 535427,
+      score: '0.50854',
+      incomplete: false,
     },
-  ]
+    chain: 'chain.4',
+    partial: false,
+  },
+]
 
-  it('aggregateData handle edge case', () => {
-    expect(aggregateData(undefinedValidatorsData, nodesData)).toEqual([
+const nodesData = [
+  {
+    node_public_key: 'n9JoeT8XKeBSR8y4D9aDz2PL1DD1j6LQwkRTbH2eFqeRmWYHj2Nw',
+    networks: 'dev',
+    complete_ledgers: '22085270-29882772',
+    ip: '34.208.12.148',
+    port: 2459,
+    uptime: 1257336,
+    version: '1.11.0-rc3',
+    server_state: 'full',
+    io_latency_ms: 1,
+    load_factor_server: '256',
+    inbound_count: 4,
+    outbound_count: 9,
+    lat: '45.82',
+    long: '-119.73',
+    country_code: 'US',
+    country: 'United States',
+    region: 'Oregon',
+    region_code: 'OR',
+    city: 'Boardman',
+    postal_code: '97818',
+    timezone: 'America/Los_Angeles',
+  },
+]
+
+describe('UpgradeStatus test functions', () => {
+  it('aggregate data works with validators without keys', () => {
+    const validatorAggregate = aggregateValidators(undefinedValidatorsData)
+    expect(validatorAggregate).toEqual({
+      '1.9.4': { validatorCount: 1, validatorPercent: 100 },
+    })
+    const nodeAggregate = aggregateNodes(nodesData)
+    expect(nodeAggregate).toEqual({
+      '1.11.0-rc3': { nodeCount: 1, nodePercent: 100 },
+    })
+    expect(aggregateData(validatorAggregate, nodeAggregate)).toEqual([
       {
         label: '1.9.4',
-        validatorsCount: 1,
-        validatorsPercent: 100,
-        nodesCount: 0,
-        nodesPercent: 0,
+        validatorCount: 1,
+        validatorPercent: 100,
+        nodeCount: 0,
+        nodePercent: 0,
       },
       {
         label: '1.11.0-rc3',
-        validatorsCount: 0,
-        validatorsPercent: 0,
-        nodesCount: 1,
-        nodesPercent: 100,
+        validatorCount: 0,
+        validatorPercent: 0,
+        nodeCount: 1,
+        nodePercent: 100,
       },
     ])
   })
 })
+
+describe('UpgradeStatus renders', () => {
+  let server
+  let client
+  const WS_URL = 'ws://localhost:1234'
+  const createWrapper = () =>
+    mount(
+      <SocketContext.Provider value={client}>
+        <QuickHarness i18n={i18n} initialEntries={['/network/upgrade-status']}>
+          <Route path={NETWORK_ROUTE.path} element={<Network />} />
+        </QuickHarness>
+      </SocketContext.Provider>,
+    )
+
+  beforeEach(async () => {
+    window.ResizeObserver = jest.fn().mockImplementation(() => ({
+      observe: jest.fn(),
+      unobserve: jest.fn(),
+      disconnect: jest.fn(),
+    }))
+    server = new WS(WS_URL, { jsonProtocol: true })
+    client = new MockWsClient(WS_URL)
+    await server.connected
+    moxios.install()
+  })
+
+  afterEach(async () => {
+    moxios.uninstall()
+    server.close()
+    client.close()
+    WS.clean()
+  })
+
+  it('renders without crashing', async () => {
+    const wrapper = createWrapper()
+    wrapper.unmount()
+  })
+
+  it('renders when nodes request errors', async () => {
+    moxios.stubRequest(`${process.env.VITE_DATA_URL}/validators/main`, {
+      status: 200,
+      response: { validators: undefinedValidatorsData },
+    })
+    moxios.stubRequest(`${process.env.VITE_DATA_URL}/topology/nodes/main`, {
+      status: 502,
+    })
+
+    const wrapper = createWrapper()
+    wrapper.update()
+    setTimeout(() => {
+      wrapper.update()
+      expect(wrapper.find('.barchart').length).toEqual(1)
+    })
+    wrapper.unmount()
+  })
+})

From a1d03ea0255dcae740d8d3c46b8d6655d474892f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 2 Oct 2024 17:47:57 +0000
Subject: [PATCH 41/79] chore(deps): bump recharts from 2.12.6 to 2.12.7
 (#1050)

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3d1f95dee..2594b7037 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -47,7 +47,7 @@
         "react-router": "^6.12.1",
         "react-router-dom": "^6.26.1",
         "react18-json-view": "^0.2.8",
-        "recharts": "^2.12.6",
+        "recharts": "^2.12.7",
         "redux": "^5.0.1",
         "redux-logger": "^3.0.6",
         "redux-thunk": "^2.2.0",
@@ -23695,9 +23695,9 @@
       }
     },
     "node_modules/recharts": {
-      "version": "2.12.6",
-      "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.6.tgz",
-      "integrity": "sha512-D+7j9WI+D0NHauah3fKHuNNcRK8bOypPW7os1DERinogGBGaHI7i6tQKJ0aUF3JXyBZ63dyfKIW2WTOPJDxJ8w==",
+      "version": "2.12.7",
+      "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.7.tgz",
+      "integrity": "sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==",
       "dependencies": {
         "clsx": "^2.0.0",
         "eventemitter3": "^4.0.1",
@@ -44456,9 +44456,9 @@
       }
     },
     "recharts": {
-      "version": "2.12.6",
-      "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.6.tgz",
-      "integrity": "sha512-D+7j9WI+D0NHauah3fKHuNNcRK8bOypPW7os1DERinogGBGaHI7i6tQKJ0aUF3JXyBZ63dyfKIW2WTOPJDxJ8w==",
+      "version": "2.12.7",
+      "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.7.tgz",
+      "integrity": "sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==",
       "requires": {
         "clsx": "^2.0.0",
         "eventemitter3": "^4.0.1",
diff --git a/package.json b/package.json
index f9aeef9c5..d23c9d72b 100644
--- a/package.json
+++ b/package.json
@@ -42,7 +42,7 @@
     "react-router": "^6.12.1",
     "react-router-dom": "^6.26.1",
     "react18-json-view": "^0.2.8",
-    "recharts": "^2.12.6",
+    "recharts": "^2.12.7",
     "redux": "^5.0.1",
     "redux-logger": "^3.0.6",
     "redux-thunk": "^2.2.0",

From 46dfb607869c97e9bdb4da838345bf828e5bdcd4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 2 Oct 2024 17:54:22 +0000
Subject: [PATCH 42/79] chore(deps): bump vite from 4.2.3 to 5.4.8 (#1046)

---
 package-lock.json | 853 +++++++++++++++++++++++++++++++++-------------
 package.json      |   2 +-
 2 files changed, 611 insertions(+), 244 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 2594b7037..c13e3c552 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -54,7 +54,7 @@
         "ripple-address-codec": "^5.0.0",
         "topojson-client": "^3.0.0",
         "usehooks-ts": "^3.1.0",
-        "vite": "^4.2.3",
+        "vite": "^5.4.8",
         "vite-plugin-environment": "^1.1.3",
         "vite-plugin-html": "^3.2.0",
         "vite-plugin-svgr": "^4.2.0",
@@ -5537,6 +5537,198 @@
         }
       }
     },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
+      "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
+      "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
+      "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
+      "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
+      "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
+      "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
+      "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
+      "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
+      "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
+      "cpu": [
+        "ppc64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
+      "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
+      "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
+      "cpu": [
+        "s390x"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
+      "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
+      "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
+      "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
+      "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
+      "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
     "node_modules/@rushstack/eslint-patch": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz",
@@ -6044,9 +6236,9 @@
       }
     },
     "node_modules/@types/estree": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
-      "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
     },
     "node_modules/@types/graceful-fs": {
       "version": "4.1.5",
@@ -13983,6 +14175,7 @@
       "version": "2.13.1",
       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
       "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+      "dev": true,
       "dependencies": {
         "hasown": "^2.0.0"
       },
@@ -22881,6 +23074,7 @@
     },
     "node_modules/path-parse": {
       "version": "1.0.7",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/path-to-regexp": {
@@ -22909,9 +23103,9 @@
       "license": "MIT"
     },
     "node_modules/picocolors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
-      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+      "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
@@ -22973,9 +23167,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.4.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
-      "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
+      "version": "8.4.47",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+      "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
       "funding": [
         {
           "type": "opencollective",
@@ -22992,8 +23186,8 @@
       ],
       "dependencies": {
         "nanoid": "^3.3.7",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
+        "picocolors": "^1.1.0",
+        "source-map-js": "^1.2.1"
       },
       "engines": {
         "node": "^10 || ^12 || >=14"
@@ -24022,6 +24216,7 @@
       "version": "1.22.4",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
       "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
+      "dev": true,
       "dependencies": {
         "is-core-module": "^2.13.0",
         "path-parse": "^1.0.7",
@@ -24202,17 +24397,36 @@
       "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g=="
     },
     "node_modules/rollup": {
-      "version": "3.20.2",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz",
-      "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==",
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
+      "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
+      "dependencies": {
+        "@types/estree": "1.0.6"
+      },
       "bin": {
         "rollup": "dist/bin/rollup"
       },
       "engines": {
-        "node": ">=14.18.0",
+        "node": ">=18.0.0",
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.24.0",
+        "@rollup/rollup-android-arm64": "4.24.0",
+        "@rollup/rollup-darwin-arm64": "4.24.0",
+        "@rollup/rollup-darwin-x64": "4.24.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.24.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.24.0",
+        "@rollup/rollup-linux-arm64-musl": "4.24.0",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.24.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.24.0",
+        "@rollup/rollup-linux-x64-gnu": "4.24.0",
+        "@rollup/rollup-linux-x64-musl": "4.24.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.24.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.24.0",
+        "@rollup/rollup-win32-x64-msvc": "4.24.0",
         "fsevents": "~2.3.2"
       }
     },
@@ -25098,8 +25312,9 @@
       }
     },
     "node_modules/source-map-js": {
-      "version": "1.0.2",
-      "license": "BSD-3-Clause",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -26052,6 +26267,7 @@
     },
     "node_modules/supports-preserve-symlinks-flag": {
       "version": "1.0.0",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">= 0.4"
@@ -27377,28 +27593,32 @@
       }
     },
     "node_modules/vite": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.3.tgz",
-      "integrity": "sha512-kLU+m2q0Y434Y1kCy3TchefAdtFso0ILi0dLyFV8Us3InXTU11H/B5ZTqCKIQHzSKNxVG/yEx813EA9f1imQ9A==",
+      "version": "5.4.8",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",
+      "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
       "dependencies": {
-        "esbuild": "^0.17.5",
-        "postcss": "^8.4.21",
-        "resolve": "^1.22.1",
-        "rollup": "^3.18.0"
+        "esbuild": "^0.21.3",
+        "postcss": "^8.4.43",
+        "rollup": "^4.20.0"
       },
       "bin": {
         "vite": "bin/vite.js"
       },
       "engines": {
-        "node": "^14.18.0 || >=16.0.0"
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
       },
       "optionalDependencies": {
-        "fsevents": "~2.3.2"
+        "fsevents": "~2.3.3"
       },
       "peerDependencies": {
-        "@types/node": ">= 14",
+        "@types/node": "^18.0.0 || >=20.0.0",
         "less": "*",
+        "lightningcss": "^1.21.0",
         "sass": "*",
+        "sass-embedded": "*",
         "stylus": "*",
         "sugarss": "*",
         "terser": "^5.4.0"
@@ -27410,9 +27630,15 @@
         "less": {
           "optional": true
         },
+        "lightningcss": {
+          "optional": true
+        },
         "sass": {
           "optional": true
         },
+        "sass-embedded": {
+          "optional": true
+        },
         "stylus": {
           "optional": true
         },
@@ -27576,10 +27802,25 @@
         }
       }
     },
+    "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/vite/node_modules/@esbuild/android-arm": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
-      "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
       "cpu": [
         "arm"
       ],
@@ -27592,9 +27833,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/android-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz",
-      "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
       "cpu": [
         "arm64"
       ],
@@ -27607,9 +27848,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/android-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz",
-      "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
       "cpu": [
         "x64"
       ],
@@ -27622,9 +27863,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz",
-      "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
       "cpu": [
         "arm64"
       ],
@@ -27637,9 +27878,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/darwin-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz",
-      "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
       "cpu": [
         "x64"
       ],
@@ -27652,9 +27893,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz",
-      "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
       "cpu": [
         "arm64"
       ],
@@ -27667,9 +27908,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz",
-      "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
       "cpu": [
         "x64"
       ],
@@ -27682,9 +27923,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/linux-arm": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz",
-      "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
       "cpu": [
         "arm"
       ],
@@ -27697,9 +27938,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/linux-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz",
-      "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
       "cpu": [
         "arm64"
       ],
@@ -27712,9 +27953,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/linux-ia32": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz",
-      "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
       "cpu": [
         "ia32"
       ],
@@ -27727,9 +27968,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/linux-loong64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz",
-      "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
       "cpu": [
         "loong64"
       ],
@@ -27742,9 +27983,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz",
-      "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
       "cpu": [
         "mips64el"
       ],
@@ -27757,9 +27998,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz",
-      "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
       "cpu": [
         "ppc64"
       ],
@@ -27772,9 +28013,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz",
-      "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
       "cpu": [
         "riscv64"
       ],
@@ -27787,9 +28028,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/linux-s390x": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz",
-      "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
       "cpu": [
         "s390x"
       ],
@@ -27802,9 +28043,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/linux-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz",
-      "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
       "cpu": [
         "x64"
       ],
@@ -27817,9 +28058,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz",
-      "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
       "cpu": [
         "x64"
       ],
@@ -27832,9 +28073,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz",
-      "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
       "cpu": [
         "x64"
       ],
@@ -27847,9 +28088,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/sunos-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz",
-      "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
       "cpu": [
         "x64"
       ],
@@ -27862,9 +28103,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/win32-arm64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz",
-      "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
       "cpu": [
         "arm64"
       ],
@@ -27877,9 +28118,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/win32-ia32": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz",
-      "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
       "cpu": [
         "ia32"
       ],
@@ -27892,9 +28133,9 @@
       }
     },
     "node_modules/vite/node_modules/@esbuild/win32-x64": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz",
-      "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
       "cpu": [
         "x64"
       ],
@@ -27907,9 +28148,9 @@
       }
     },
     "node_modules/vite/node_modules/esbuild": {
-      "version": "0.17.19",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz",
-      "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
       "hasInstallScript": true,
       "bin": {
         "esbuild": "bin/esbuild"
@@ -27918,34 +28159,35 @@
         "node": ">=12"
       },
       "optionalDependencies": {
-        "@esbuild/android-arm": "0.17.19",
-        "@esbuild/android-arm64": "0.17.19",
-        "@esbuild/android-x64": "0.17.19",
-        "@esbuild/darwin-arm64": "0.17.19",
-        "@esbuild/darwin-x64": "0.17.19",
-        "@esbuild/freebsd-arm64": "0.17.19",
-        "@esbuild/freebsd-x64": "0.17.19",
-        "@esbuild/linux-arm": "0.17.19",
-        "@esbuild/linux-arm64": "0.17.19",
-        "@esbuild/linux-ia32": "0.17.19",
-        "@esbuild/linux-loong64": "0.17.19",
-        "@esbuild/linux-mips64el": "0.17.19",
-        "@esbuild/linux-ppc64": "0.17.19",
-        "@esbuild/linux-riscv64": "0.17.19",
-        "@esbuild/linux-s390x": "0.17.19",
-        "@esbuild/linux-x64": "0.17.19",
-        "@esbuild/netbsd-x64": "0.17.19",
-        "@esbuild/openbsd-x64": "0.17.19",
-        "@esbuild/sunos-x64": "0.17.19",
-        "@esbuild/win32-arm64": "0.17.19",
-        "@esbuild/win32-ia32": "0.17.19",
-        "@esbuild/win32-x64": "0.17.19"
+        "@esbuild/aix-ppc64": "0.21.5",
+        "@esbuild/android-arm": "0.21.5",
+        "@esbuild/android-arm64": "0.21.5",
+        "@esbuild/android-x64": "0.21.5",
+        "@esbuild/darwin-arm64": "0.21.5",
+        "@esbuild/darwin-x64": "0.21.5",
+        "@esbuild/freebsd-arm64": "0.21.5",
+        "@esbuild/freebsd-x64": "0.21.5",
+        "@esbuild/linux-arm": "0.21.5",
+        "@esbuild/linux-arm64": "0.21.5",
+        "@esbuild/linux-ia32": "0.21.5",
+        "@esbuild/linux-loong64": "0.21.5",
+        "@esbuild/linux-mips64el": "0.21.5",
+        "@esbuild/linux-ppc64": "0.21.5",
+        "@esbuild/linux-riscv64": "0.21.5",
+        "@esbuild/linux-s390x": "0.21.5",
+        "@esbuild/linux-x64": "0.21.5",
+        "@esbuild/netbsd-x64": "0.21.5",
+        "@esbuild/openbsd-x64": "0.21.5",
+        "@esbuild/sunos-x64": "0.21.5",
+        "@esbuild/win32-arm64": "0.21.5",
+        "@esbuild/win32-ia32": "0.21.5",
+        "@esbuild/win32-x64": "0.21.5"
       }
     },
     "node_modules/vite/node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "hasInstallScript": true,
       "optional": true,
       "os": [
@@ -32001,6 +32243,102 @@
         "picomatch": "^2.3.1"
       }
     },
+    "@rollup/rollup-android-arm-eabi": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
+      "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
+      "optional": true
+    },
+    "@rollup/rollup-android-arm64": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
+      "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
+      "optional": true
+    },
+    "@rollup/rollup-darwin-arm64": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
+      "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
+      "optional": true
+    },
+    "@rollup/rollup-darwin-x64": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
+      "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
+      "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
+      "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
+      "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm64-musl": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
+      "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
+      "optional": true
+    },
+    "@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
+      "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
+      "optional": true
+    },
+    "@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
+      "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
+      "optional": true
+    },
+    "@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
+      "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
+      "optional": true
+    },
+    "@rollup/rollup-linux-x64-gnu": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
+      "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
+      "optional": true
+    },
+    "@rollup/rollup-linux-x64-musl": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
+      "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
+      "optional": true
+    },
+    "@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
+      "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
+      "optional": true
+    },
+    "@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
+      "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
+      "optional": true
+    },
+    "@rollup/rollup-win32-x64-msvc": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
+      "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
+      "optional": true
+    },
     "@rushstack/eslint-patch": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz",
@@ -32349,9 +32687,9 @@
       }
     },
     "@types/estree": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
-      "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
     },
     "@types/graceful-fs": {
       "version": "4.1.5",
@@ -37826,6 +38164,7 @@
       "version": "2.13.1",
       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
       "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+      "dev": true,
       "requires": {
         "hasown": "^2.0.0"
       }
@@ -43952,7 +44291,8 @@
       "dev": true
     },
     "path-parse": {
-      "version": "1.0.7"
+      "version": "1.0.7",
+      "dev": true
     },
     "path-to-regexp": {
       "version": "0.1.7"
@@ -43974,9 +44314,9 @@
       "dev": true
     },
     "picocolors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
-      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+      "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw=="
     },
     "picomatch": {
       "version": "2.3.1"
@@ -44009,13 +44349,13 @@
       "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q=="
     },
     "postcss": {
-      "version": "8.4.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
-      "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
+      "version": "8.4.47",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+      "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
       "requires": {
         "nanoid": "^3.3.7",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
+        "picocolors": "^1.1.0",
+        "source-map-js": "^1.2.1"
       }
     },
     "postcss-media-query-parser": {
@@ -44692,6 +45032,7 @@
       "version": "1.22.4",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
       "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
+      "dev": true,
       "requires": {
         "is-core-module": "^2.13.0",
         "path-parse": "^1.0.7",
@@ -44815,10 +45156,27 @@
       "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g=="
     },
     "rollup": {
-      "version": "3.20.2",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz",
-      "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==",
-      "requires": {
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
+      "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
+      "requires": {
+        "@rollup/rollup-android-arm-eabi": "4.24.0",
+        "@rollup/rollup-android-arm64": "4.24.0",
+        "@rollup/rollup-darwin-arm64": "4.24.0",
+        "@rollup/rollup-darwin-x64": "4.24.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.24.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.24.0",
+        "@rollup/rollup-linux-arm64-musl": "4.24.0",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.24.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.24.0",
+        "@rollup/rollup-linux-x64-gnu": "4.24.0",
+        "@rollup/rollup-linux-x64-musl": "4.24.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.24.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.24.0",
+        "@rollup/rollup-win32-x64-msvc": "4.24.0",
+        "@types/estree": "1.0.6",
         "fsevents": "~2.3.2"
       },
       "dependencies": {
@@ -45415,7 +45773,9 @@
       }
     },
     "source-map-js": {
-      "version": "1.0.2"
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
     },
     "source-map-resolve": {
       "version": "0.5.3",
@@ -46063,7 +46423,8 @@
       }
     },
     "supports-preserve-symlinks-flag": {
-      "version": "1.0.0"
+      "version": "1.0.0",
+      "dev": true
     },
     "svg-parser": {
       "version": "2.0.4",
@@ -46974,182 +47335,188 @@
       }
     },
     "vite": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.3.tgz",
-      "integrity": "sha512-kLU+m2q0Y434Y1kCy3TchefAdtFso0ILi0dLyFV8Us3InXTU11H/B5ZTqCKIQHzSKNxVG/yEx813EA9f1imQ9A==",
+      "version": "5.4.8",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",
+      "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
       "requires": {
-        "esbuild": "^0.17.5",
-        "fsevents": "~2.3.2",
-        "postcss": "^8.4.21",
-        "resolve": "^1.22.1",
-        "rollup": "^3.18.0"
+        "esbuild": "^0.21.3",
+        "fsevents": "~2.3.3",
+        "postcss": "^8.4.43",
+        "rollup": "^4.20.0"
       },
       "dependencies": {
+        "@esbuild/aix-ppc64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+          "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+          "optional": true
+        },
         "@esbuild/android-arm": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
-          "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+          "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
           "optional": true
         },
         "@esbuild/android-arm64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz",
-          "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+          "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
           "optional": true
         },
         "@esbuild/android-x64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz",
-          "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+          "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
           "optional": true
         },
         "@esbuild/darwin-arm64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz",
-          "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+          "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
           "optional": true
         },
         "@esbuild/darwin-x64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz",
-          "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+          "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
           "optional": true
         },
         "@esbuild/freebsd-arm64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz",
-          "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+          "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
           "optional": true
         },
         "@esbuild/freebsd-x64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz",
-          "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+          "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
           "optional": true
         },
         "@esbuild/linux-arm": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz",
-          "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+          "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
           "optional": true
         },
         "@esbuild/linux-arm64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz",
-          "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+          "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
           "optional": true
         },
         "@esbuild/linux-ia32": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz",
-          "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+          "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
           "optional": true
         },
         "@esbuild/linux-loong64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz",
-          "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+          "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
           "optional": true
         },
         "@esbuild/linux-mips64el": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz",
-          "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+          "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
           "optional": true
         },
         "@esbuild/linux-ppc64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz",
-          "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+          "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
           "optional": true
         },
         "@esbuild/linux-riscv64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz",
-          "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+          "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
           "optional": true
         },
         "@esbuild/linux-s390x": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz",
-          "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+          "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
           "optional": true
         },
         "@esbuild/linux-x64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz",
-          "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+          "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
           "optional": true
         },
         "@esbuild/netbsd-x64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz",
-          "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+          "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
           "optional": true
         },
         "@esbuild/openbsd-x64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz",
-          "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+          "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
           "optional": true
         },
         "@esbuild/sunos-x64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz",
-          "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+          "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
           "optional": true
         },
         "@esbuild/win32-arm64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz",
-          "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+          "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
           "optional": true
         },
         "@esbuild/win32-ia32": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz",
-          "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+          "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
           "optional": true
         },
         "@esbuild/win32-x64": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz",
-          "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+          "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
           "optional": true
         },
         "esbuild": {
-          "version": "0.17.19",
-          "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz",
-          "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
-          "requires": {
-            "@esbuild/android-arm": "0.17.19",
-            "@esbuild/android-arm64": "0.17.19",
-            "@esbuild/android-x64": "0.17.19",
-            "@esbuild/darwin-arm64": "0.17.19",
-            "@esbuild/darwin-x64": "0.17.19",
-            "@esbuild/freebsd-arm64": "0.17.19",
-            "@esbuild/freebsd-x64": "0.17.19",
-            "@esbuild/linux-arm": "0.17.19",
-            "@esbuild/linux-arm64": "0.17.19",
-            "@esbuild/linux-ia32": "0.17.19",
-            "@esbuild/linux-loong64": "0.17.19",
-            "@esbuild/linux-mips64el": "0.17.19",
-            "@esbuild/linux-ppc64": "0.17.19",
-            "@esbuild/linux-riscv64": "0.17.19",
-            "@esbuild/linux-s390x": "0.17.19",
-            "@esbuild/linux-x64": "0.17.19",
-            "@esbuild/netbsd-x64": "0.17.19",
-            "@esbuild/openbsd-x64": "0.17.19",
-            "@esbuild/sunos-x64": "0.17.19",
-            "@esbuild/win32-arm64": "0.17.19",
-            "@esbuild/win32-ia32": "0.17.19",
-            "@esbuild/win32-x64": "0.17.19"
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+          "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+          "requires": {
+            "@esbuild/aix-ppc64": "0.21.5",
+            "@esbuild/android-arm": "0.21.5",
+            "@esbuild/android-arm64": "0.21.5",
+            "@esbuild/android-x64": "0.21.5",
+            "@esbuild/darwin-arm64": "0.21.5",
+            "@esbuild/darwin-x64": "0.21.5",
+            "@esbuild/freebsd-arm64": "0.21.5",
+            "@esbuild/freebsd-x64": "0.21.5",
+            "@esbuild/linux-arm": "0.21.5",
+            "@esbuild/linux-arm64": "0.21.5",
+            "@esbuild/linux-ia32": "0.21.5",
+            "@esbuild/linux-loong64": "0.21.5",
+            "@esbuild/linux-mips64el": "0.21.5",
+            "@esbuild/linux-ppc64": "0.21.5",
+            "@esbuild/linux-riscv64": "0.21.5",
+            "@esbuild/linux-s390x": "0.21.5",
+            "@esbuild/linux-x64": "0.21.5",
+            "@esbuild/netbsd-x64": "0.21.5",
+            "@esbuild/openbsd-x64": "0.21.5",
+            "@esbuild/sunos-x64": "0.21.5",
+            "@esbuild/win32-arm64": "0.21.5",
+            "@esbuild/win32-ia32": "0.21.5",
+            "@esbuild/win32-x64": "0.21.5"
           }
         },
         "fsevents": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-          "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+          "version": "2.3.3",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+          "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
           "optional": true
         }
       }
diff --git a/package.json b/package.json
index d23c9d72b..ced1dfd04 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
     "ripple-address-codec": "^5.0.0",
     "topojson-client": "^3.0.0",
     "usehooks-ts": "^3.1.0",
-    "vite": "^4.2.3",
+    "vite": "^5.4.8",
     "vite-plugin-environment": "^1.1.3",
     "vite-plugin-html": "^3.2.0",
     "vite-plugin-svgr": "^4.2.0",

From f6bd85405f4591b01e0e17afbf4a8b958f87ef3d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 2 Oct 2024 18:25:53 +0000
Subject: [PATCH 43/79] chore(deps): bump debug from 4.3.6 to 4.3.7 (#1048)

---
 package-lock.json | 34 +++++++++++++++-------------------
 package.json      |  2 +-
 2 files changed, 16 insertions(+), 20 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index c13e3c552..1ece46d36 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,7 +26,7 @@
         "d3-geo": "^3.1.0",
         "d3-hexbin": "^0.2.2",
         "d3-scale": "^4.0.2",
-        "debug": "^4.3.6",
+        "debug": "^4.3.7",
         "dotenv": "^16.4.5",
         "enzyme": "3.11.0",
         "enzyme-adapter-react-17-updated": "^1.0.2",
@@ -10099,11 +10099,11 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
-      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
       "dependencies": {
-        "ms": "2.1.2"
+        "ms": "^2.1.3"
       },
       "engines": {
         "node": ">=6.0"
@@ -22262,8 +22262,9 @@
       }
     },
     "node_modules/ms": {
-      "version": "2.1.2",
-      "license": "MIT"
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
     },
     "node_modules/mv": {
       "version": "2.1.1",
@@ -24674,10 +24675,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/send/node_modules/ms": {
-      "version": "2.1.3",
-      "license": "MIT"
-    },
     "node_modules/send/node_modules/statuses": {
       "version": "2.0.1",
       "license": "MIT",
@@ -35376,11 +35373,11 @@
       }
     },
     "debug": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
-      "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+      "version": "4.3.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
       "requires": {
-        "ms": "2.1.2"
+        "ms": "^2.1.3"
       }
     },
     "decamelize": {
@@ -43763,7 +43760,9 @@
       "requires": {}
     },
     "ms": {
-      "version": "2.1.2"
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
     },
     "mv": {
       "version": "2.1.1",
@@ -45340,9 +45339,6 @@
         "depd": {
           "version": "2.0.0"
         },
-        "ms": {
-          "version": "2.1.3"
-        },
         "statuses": {
           "version": "2.0.1"
         }
diff --git a/package.json b/package.json
index ced1dfd04..722babc6b 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
     "d3-geo": "^3.1.0",
     "d3-hexbin": "^0.2.2",
     "d3-scale": "^4.0.2",
-    "debug": "^4.3.6",
+    "debug": "^4.3.7",
     "dotenv": "^16.4.5",
     "enzyme": "3.11.0",
     "enzyme-adapter-react-17-updated": "^1.0.2",

From ade2d89c5a737bc77923df61d7e90f2006f139cf Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 2 Oct 2024 18:34:53 +0000
Subject: [PATCH 44/79] chore(deps): bump @google-cloud/bigquery from 7.9.0 to
 7.9.1 (#1049)

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 1ece46d36..d31cafdc1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,7 +8,7 @@
       "name": "explorer",
       "version": "1.5.0",
       "dependencies": {
-        "@google-cloud/bigquery": "^7.9.0",
+        "@google-cloud/bigquery": "^7.9.1",
         "@paystring/utils": "^2.0.0",
         "@redux-devtools/extension": "^3.3.0",
         "@rollup/plugin-inject": "^5.0.5",
@@ -2866,9 +2866,9 @@
       }
     },
     "node_modules/@google-cloud/bigquery": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.0.tgz",
-      "integrity": "sha512-KJTimGLDlAR1IfZ4Y8xhIVfoZ+XBXd0GGuJttLSXxtR0g+4vNsUt0xS33PRVa5TXey97374yU+uWNlCb5bHwBw==",
+      "version": "7.9.1",
+      "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.1.tgz",
+      "integrity": "sha512-ZkcRMpBoFLxIh6TiQBywA22yT3c2j0f07AHWEMjtYqMQzZQbFrpxuJU2COp3tyjZ91ZIGHe4gY7/dGZL88cltg==",
       "dependencies": {
         "@google-cloud/common": "^5.0.0",
         "@google-cloud/paginator": "^5.0.2",
@@ -30383,9 +30383,9 @@
       "dev": true
     },
     "@google-cloud/bigquery": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.0.tgz",
-      "integrity": "sha512-KJTimGLDlAR1IfZ4Y8xhIVfoZ+XBXd0GGuJttLSXxtR0g+4vNsUt0xS33PRVa5TXey97374yU+uWNlCb5bHwBw==",
+      "version": "7.9.1",
+      "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.1.tgz",
+      "integrity": "sha512-ZkcRMpBoFLxIh6TiQBywA22yT3c2j0f07AHWEMjtYqMQzZQbFrpxuJU2COp3tyjZ91ZIGHe4gY7/dGZL88cltg==",
       "requires": {
         "@google-cloud/common": "^5.0.0",
         "@google-cloud/paginator": "^5.0.2",
diff --git a/package.json b/package.json
index 722babc6b..a9d5d7d5e 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
   "description": "XRPL Data Visualization",
   "version": "1.5.0",
   "dependencies": {
-    "@google-cloud/bigquery": "^7.9.0",
+    "@google-cloud/bigquery": "^7.9.1",
     "@paystring/utils": "^2.0.0",
     "@redux-devtools/extension": "^3.3.0",
     "@rollup/plugin-inject": "^5.0.5",

From e1e37de1a2b82f5e44e617ee2b4b25d5f263ea3e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 2 Oct 2024 18:58:47 +0000
Subject: [PATCH 45/79] chore(deps-dev): bump @babel/preset-env from 7.25.3 to
 7.25.7 (#1053)

---
 package-lock.json | 2050 ++++++++++++++++++++++-----------------------
 package.json      |    2 +-
 2 files changed, 1019 insertions(+), 1033 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d31cafdc1..0c886fb87 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -63,7 +63,7 @@
       },
       "devDependencies": {
         "@babel/eslint-parser": "^7.22.6",
-        "@babel/preset-env": "^7.25.3",
+        "@babel/preset-env": "^7.25.7",
         "@babel/preset-react": "^7.24.7",
         "@types/create-hash": "^1.2.6",
         "@types/enzyme": "^3.10.12",
@@ -152,11 +152,11 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz",
+      "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==",
       "dependencies": {
-        "@babel/highlight": "^7.24.7",
+        "@babel/highlight": "^7.25.7",
         "picocolors": "^1.0.0"
       },
       "engines": {
@@ -164,9 +164,9 @@
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
-      "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz",
+      "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -240,52 +240,52 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
-      "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz",
+      "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==",
       "dependencies": {
-        "@babel/types": "^7.25.0",
+        "@babel/types": "^7.25.7",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
-        "jsesc": "^2.5.1"
+        "jsesc": "^3.0.2"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz",
+      "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.24.7"
+        "@babel/types": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz",
+      "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==",
       "dev": true,
       "dependencies": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
-      "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz",
+      "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==",
       "dependencies": {
-        "@babel/compat-data": "^7.25.2",
-        "@babel/helper-validator-option": "^7.24.8",
-        "browserslist": "^4.23.1",
+        "@babel/compat-data": "^7.25.7",
+        "@babel/helper-validator-option": "^7.25.7",
+        "browserslist": "^4.24.0",
         "lru-cache": "^5.1.1",
         "semver": "^6.3.1"
       },
@@ -315,17 +315,17 @@
       "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
     },
     "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz",
-      "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz",
+      "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-member-expression-to-functions": "^7.24.8",
-        "@babel/helper-optimise-call-expression": "^7.24.7",
-        "@babel/helper-replace-supers": "^7.25.0",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
-        "@babel/traverse": "^7.25.0",
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "@babel/helper-member-expression-to-functions": "^7.25.7",
+        "@babel/helper-optimise-call-expression": "^7.25.7",
+        "@babel/helper-replace-supers": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
+        "@babel/traverse": "^7.25.7",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -345,13 +345,13 @@
       }
     },
     "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
-      "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz",
+      "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "regexpu-core": "^5.3.1",
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "regexpu-core": "^6.1.1",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -387,39 +387,39 @@
       }
     },
     "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
-      "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz",
+      "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==",
       "dev": true,
       "dependencies": {
-        "@babel/traverse": "^7.24.8",
-        "@babel/types": "^7.24.8"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz",
+      "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==",
       "dependencies": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
-      "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz",
+      "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==",
       "dependencies": {
-        "@babel/helper-module-imports": "^7.24.7",
-        "@babel/helper-simple-access": "^7.24.7",
-        "@babel/helper-validator-identifier": "^7.24.7",
-        "@babel/traverse": "^7.25.2"
+        "@babel/helper-module-imports": "^7.25.7",
+        "@babel/helper-simple-access": "^7.25.7",
+        "@babel/helper-validator-identifier": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -429,34 +429,34 @@
       }
     },
     "node_modules/@babel/helper-optimise-call-expression": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz",
+      "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.24.7"
+        "@babel/types": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
-      "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz",
+      "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-remap-async-to-generator": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
-      "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz",
+      "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-wrap-function": "^7.25.0",
-        "@babel/traverse": "^7.25.0"
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "@babel/helper-wrap-function": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -466,14 +466,14 @@
       }
     },
     "node_modules/@babel/helper-replace-supers": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
-      "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz",
+      "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-member-expression-to-functions": "^7.24.8",
-        "@babel/helper-optimise-call-expression": "^7.24.7",
-        "@babel/traverse": "^7.25.0"
+        "@babel/helper-member-expression-to-functions": "^7.25.7",
+        "@babel/helper-optimise-call-expression": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -483,25 +483,25 @@
       }
     },
     "node_modules/@babel/helper-simple-access": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz",
+      "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==",
       "dependencies": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz",
+      "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==",
       "dev": true,
       "dependencies": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -520,38 +520,38 @@
       }
     },
     "node_modules/@babel/helper-string-parser": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
-      "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
+      "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
-      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
+      "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
-      "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz",
+      "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-wrap-function": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
-      "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz",
+      "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==",
       "dev": true,
       "dependencies": {
-        "@babel/template": "^7.25.0",
-        "@babel/traverse": "^7.25.0",
-        "@babel/types": "^7.25.0"
+        "@babel/template": "^7.25.7",
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -571,11 +571,11 @@
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
-      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz",
+      "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==",
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.25.7",
         "chalk": "^2.4.2",
         "js-tokens": "^4.0.0",
         "picocolors": "^1.0.0"
@@ -585,11 +585,11 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
-      "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz",
+      "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==",
       "dependencies": {
-        "@babel/types": "^7.25.2"
+        "@babel/types": "^7.25.7"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -599,13 +599,13 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
-      "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz",
+      "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/traverse": "^7.25.3"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -615,12 +615,12 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
-      "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz",
+      "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -630,12 +630,12 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.25.0",
-      "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.25.0.tgz",
-      "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
+      "version": "7.25.7",
+      "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.25.7.tgz",
+      "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -645,14 +645,14 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
-      "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz",
+      "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
-        "@babel/plugin-transform-optional-chaining": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
+        "@babel/plugin-transform-optional-chaining": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -662,13 +662,13 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
-      "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz",
+      "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/traverse": "^7.25.0"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -893,12 +893,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-import-assertions": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
-      "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz",
+      "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -908,12 +908,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-import-attributes": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
-      "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz",
+      "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1087,12 +1087,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-arrow-functions": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
-      "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz",
+      "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1102,15 +1102,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-async-generator-functions": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz",
-      "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz",
+      "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-remap-async-to-generator": "^7.25.0",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-remap-async-to-generator": "^7.25.7",
         "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/traverse": "^7.25.0"
+        "@babel/traverse": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1120,14 +1120,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-async-to-generator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
-      "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz",
+      "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-imports": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-remap-async-to-generator": "^7.24.7"
+        "@babel/helper-module-imports": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-remap-async-to-generator": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1137,12 +1137,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
-      "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz",
+      "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1152,12 +1152,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-block-scoping": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
-      "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz",
+      "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1167,13 +1167,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-class-properties": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
-      "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz",
+      "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-class-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1183,13 +1183,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-class-static-block": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
-      "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz",
+      "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-create-class-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       },
       "engines": {
@@ -1200,16 +1200,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-classes": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz",
-      "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz",
+      "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-compilation-targets": "^7.24.8",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-replace-supers": "^7.25.0",
-        "@babel/traverse": "^7.25.0",
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "@babel/helper-compilation-targets": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-replace-supers": "^7.25.7",
+        "@babel/traverse": "^7.25.7",
         "globals": "^11.1.0"
       },
       "engines": {
@@ -1220,13 +1220,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-computed-properties": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
-      "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz",
+      "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/template": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/template": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1236,12 +1236,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-destructuring": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
-      "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz",
+      "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1251,13 +1251,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-dotall-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
-      "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz",
+      "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1267,12 +1267,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-duplicate-keys": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
-      "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz",
+      "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1282,13 +1282,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
-      "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz",
+      "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.25.0",
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1298,12 +1298,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-dynamic-import": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
-      "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz",
+      "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3"
       },
       "engines": {
@@ -1314,13 +1314,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
-      "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz",
+      "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1330,12 +1330,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-export-namespace-from": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
-      "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz",
+      "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       },
       "engines": {
@@ -1362,13 +1362,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-for-of": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
-      "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz",
+      "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1378,14 +1378,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-function-name": {
-      "version": "7.25.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
-      "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz",
+      "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.24.8",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/traverse": "^7.25.1"
+        "@babel/helper-compilation-targets": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1395,12 +1395,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-json-strings": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
-      "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz",
+      "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-json-strings": "^7.8.3"
       },
       "engines": {
@@ -1411,12 +1411,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-literals": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
-      "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz",
+      "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1426,12 +1426,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-logical-assignment-operators": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
-      "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz",
+      "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       },
       "engines": {
@@ -1442,12 +1442,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-member-expression-literals": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
-      "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz",
+      "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1457,13 +1457,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-amd": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
-      "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz",
+      "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-module-transforms": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1473,14 +1473,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
-      "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz",
+      "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.24.8",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-simple-access": "^7.24.7"
+        "@babel/helper-module-transforms": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-simple-access": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1490,15 +1490,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-systemjs": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
-      "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz",
+      "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.25.0",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-validator-identifier": "^7.24.7",
-        "@babel/traverse": "^7.25.0"
+        "@babel/helper-module-transforms": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-validator-identifier": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1508,13 +1508,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-umd": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
-      "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz",
+      "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-module-transforms": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1524,13 +1524,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
-      "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz",
+      "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1540,12 +1540,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-new-target": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
-      "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz",
+      "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1555,12 +1555,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
-      "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz",
+      "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
       },
       "engines": {
@@ -1571,12 +1571,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-numeric-separator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
-      "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz",
+      "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       },
       "engines": {
@@ -1587,15 +1587,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-object-rest-spread": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
-      "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz",
+      "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.24.7"
+        "@babel/plugin-transform-parameters": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1605,13 +1605,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-object-super": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
-      "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz",
+      "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-replace-supers": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-replace-supers": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1621,12 +1621,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-optional-catch-binding": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
-      "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz",
+      "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
       },
       "engines": {
@@ -1637,13 +1637,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-optional-chaining": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
-      "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz",
+      "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       },
       "engines": {
@@ -1654,12 +1654,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-parameters": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
-      "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz",
+      "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1669,13 +1669,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-private-methods": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
-      "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz",
+      "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-class-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1685,14 +1685,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-private-property-in-object": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
-      "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz",
+      "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-create-class-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "@babel/helper-create-class-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       },
       "engines": {
@@ -1703,12 +1703,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-property-literals": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
-      "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz",
+      "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1811,12 +1811,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-regenerator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
-      "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz",
+      "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "regenerator-transform": "^0.15.2"
       },
       "engines": {
@@ -1827,12 +1827,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-reserved-words": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
-      "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz",
+      "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1871,12 +1871,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-shorthand-properties": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
-      "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz",
+      "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1886,13 +1886,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-spread": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
-      "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz",
+      "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1902,12 +1902,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-sticky-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
-      "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz",
+      "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1917,12 +1917,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-template-literals": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
-      "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz",
+      "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1932,12 +1932,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-typeof-symbol": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
-      "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz",
+      "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1965,12 +1965,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-escapes": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
-      "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz",
+      "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1980,13 +1980,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-property-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
-      "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz",
+      "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1996,13 +1996,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
-      "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz",
+      "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2012,13 +2012,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-sets-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
-      "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz",
+      "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2028,28 +2028,28 @@
       }
     },
     "node_modules/@babel/preset-env": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz",
-      "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==",
-      "dev": true,
-      "dependencies": {
-        "@babel/compat-data": "^7.25.2",
-        "@babel/helper-compilation-targets": "^7.25.2",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-validator-option": "^7.24.8",
-        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
-        "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
-        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
-        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz",
+      "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/compat-data": "^7.25.7",
+        "@babel/helper-compilation-targets": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-validator-option": "^7.25.7",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7",
+        "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7",
         "@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.7",
-        "@babel/plugin-syntax-import-attributes": "^7.24.7",
+        "@babel/plugin-syntax-import-assertions": "^7.25.7",
+        "@babel/plugin-syntax-import-attributes": "^7.25.7",
         "@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",
@@ -2061,60 +2061,60 @@
         "@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.7",
-        "@babel/plugin-transform-async-generator-functions": "^7.25.0",
-        "@babel/plugin-transform-async-to-generator": "^7.24.7",
-        "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
-        "@babel/plugin-transform-block-scoping": "^7.25.0",
-        "@babel/plugin-transform-class-properties": "^7.24.7",
-        "@babel/plugin-transform-class-static-block": "^7.24.7",
-        "@babel/plugin-transform-classes": "^7.25.0",
-        "@babel/plugin-transform-computed-properties": "^7.24.7",
-        "@babel/plugin-transform-destructuring": "^7.24.8",
-        "@babel/plugin-transform-dotall-regex": "^7.24.7",
-        "@babel/plugin-transform-duplicate-keys": "^7.24.7",
-        "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
-        "@babel/plugin-transform-dynamic-import": "^7.24.7",
-        "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
-        "@babel/plugin-transform-export-namespace-from": "^7.24.7",
-        "@babel/plugin-transform-for-of": "^7.24.7",
-        "@babel/plugin-transform-function-name": "^7.25.1",
-        "@babel/plugin-transform-json-strings": "^7.24.7",
-        "@babel/plugin-transform-literals": "^7.25.2",
-        "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
-        "@babel/plugin-transform-member-expression-literals": "^7.24.7",
-        "@babel/plugin-transform-modules-amd": "^7.24.7",
-        "@babel/plugin-transform-modules-commonjs": "^7.24.8",
-        "@babel/plugin-transform-modules-systemjs": "^7.25.0",
-        "@babel/plugin-transform-modules-umd": "^7.24.7",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
-        "@babel/plugin-transform-new-target": "^7.24.7",
-        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
-        "@babel/plugin-transform-numeric-separator": "^7.24.7",
-        "@babel/plugin-transform-object-rest-spread": "^7.24.7",
-        "@babel/plugin-transform-object-super": "^7.24.7",
-        "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
-        "@babel/plugin-transform-optional-chaining": "^7.24.8",
-        "@babel/plugin-transform-parameters": "^7.24.7",
-        "@babel/plugin-transform-private-methods": "^7.24.7",
-        "@babel/plugin-transform-private-property-in-object": "^7.24.7",
-        "@babel/plugin-transform-property-literals": "^7.24.7",
-        "@babel/plugin-transform-regenerator": "^7.24.7",
-        "@babel/plugin-transform-reserved-words": "^7.24.7",
-        "@babel/plugin-transform-shorthand-properties": "^7.24.7",
-        "@babel/plugin-transform-spread": "^7.24.7",
-        "@babel/plugin-transform-sticky-regex": "^7.24.7",
-        "@babel/plugin-transform-template-literals": "^7.24.7",
-        "@babel/plugin-transform-typeof-symbol": "^7.24.8",
-        "@babel/plugin-transform-unicode-escapes": "^7.24.7",
-        "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
-        "@babel/plugin-transform-unicode-regex": "^7.24.7",
-        "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
+        "@babel/plugin-transform-arrow-functions": "^7.25.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.25.7",
+        "@babel/plugin-transform-async-to-generator": "^7.25.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.25.7",
+        "@babel/plugin-transform-block-scoping": "^7.25.7",
+        "@babel/plugin-transform-class-properties": "^7.25.7",
+        "@babel/plugin-transform-class-static-block": "^7.25.7",
+        "@babel/plugin-transform-classes": "^7.25.7",
+        "@babel/plugin-transform-computed-properties": "^7.25.7",
+        "@babel/plugin-transform-destructuring": "^7.25.7",
+        "@babel/plugin-transform-dotall-regex": "^7.25.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.25.7",
+        "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7",
+        "@babel/plugin-transform-dynamic-import": "^7.25.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.25.7",
+        "@babel/plugin-transform-export-namespace-from": "^7.25.7",
+        "@babel/plugin-transform-for-of": "^7.25.7",
+        "@babel/plugin-transform-function-name": "^7.25.7",
+        "@babel/plugin-transform-json-strings": "^7.25.7",
+        "@babel/plugin-transform-literals": "^7.25.7",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.25.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.25.7",
+        "@babel/plugin-transform-modules-amd": "^7.25.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.25.7",
+        "@babel/plugin-transform-modules-systemjs": "^7.25.7",
+        "@babel/plugin-transform-modules-umd": "^7.25.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7",
+        "@babel/plugin-transform-new-target": "^7.25.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7",
+        "@babel/plugin-transform-numeric-separator": "^7.25.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.25.7",
+        "@babel/plugin-transform-object-super": "^7.25.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.25.7",
+        "@babel/plugin-transform-optional-chaining": "^7.25.7",
+        "@babel/plugin-transform-parameters": "^7.25.7",
+        "@babel/plugin-transform-private-methods": "^7.25.7",
+        "@babel/plugin-transform-private-property-in-object": "^7.25.7",
+        "@babel/plugin-transform-property-literals": "^7.25.7",
+        "@babel/plugin-transform-regenerator": "^7.25.7",
+        "@babel/plugin-transform-reserved-words": "^7.25.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.25.7",
+        "@babel/plugin-transform-spread": "^7.25.7",
+        "@babel/plugin-transform-sticky-regex": "^7.25.7",
+        "@babel/plugin-transform-template-literals": "^7.25.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.25.7",
+        "@babel/plugin-transform-unicode-escapes": "^7.25.7",
+        "@babel/plugin-transform-unicode-property-regex": "^7.25.7",
+        "@babel/plugin-transform-unicode-regex": "^7.25.7",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.25.7",
         "@babel/preset-modules": "0.1.6-no-external-plugins",
         "babel-plugin-polyfill-corejs2": "^0.4.10",
-        "babel-plugin-polyfill-corejs3": "^0.10.4",
+        "babel-plugin-polyfill-corejs3": "^0.10.6",
         "babel-plugin-polyfill-regenerator": "^0.6.1",
-        "core-js-compat": "^3.37.1",
+        "core-js-compat": "^3.38.1",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -2141,13 +2141,13 @@
       }
     },
     "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
-      "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
+      "version": "0.10.6",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+      "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.6.1",
-        "core-js-compat": "^3.36.1"
+        "@babel/helper-define-polyfill-provider": "^0.6.2",
+        "core-js-compat": "^3.38.0"
       },
       "peerDependencies": {
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -2227,12 +2227,6 @@
         "@babel/core": "^7.0.0-0"
       }
     },
-    "node_modules/@babel/regjsgen": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
-      "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
-      "dev": true
-    },
     "node_modules/@babel/runtime": {
       "version": "7.23.5",
       "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz",
@@ -2245,28 +2239,28 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
-      "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz",
+      "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==",
       "dependencies": {
-        "@babel/code-frame": "^7.24.7",
-        "@babel/parser": "^7.25.0",
-        "@babel/types": "^7.25.0"
+        "@babel/code-frame": "^7.25.7",
+        "@babel/parser": "^7.25.7",
+        "@babel/types": "^7.25.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
-      "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
-      "dependencies": {
-        "@babel/code-frame": "^7.24.7",
-        "@babel/generator": "^7.25.0",
-        "@babel/parser": "^7.25.3",
-        "@babel/template": "^7.25.0",
-        "@babel/types": "^7.25.2",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz",
+      "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==",
+      "dependencies": {
+        "@babel/code-frame": "^7.25.7",
+        "@babel/generator": "^7.25.7",
+        "@babel/parser": "^7.25.7",
+        "@babel/template": "^7.25.7",
+        "@babel/types": "^7.25.7",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -2275,12 +2269,12 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
-      "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz",
+      "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==",
       "dependencies": {
-        "@babel/helper-string-parser": "^7.24.8",
-        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/helper-string-parser": "^7.25.7",
+        "@babel/helper-validator-identifier": "^7.25.7",
         "to-fast-properties": "^2.0.0"
       },
       "engines": {
@@ -8695,9 +8689,9 @@
       "license": "BSD-2-Clause"
     },
     "node_modules/browserslist": {
-      "version": "4.23.3",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
-      "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz",
+      "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==",
       "funding": [
         {
           "type": "opencollective",
@@ -8713,8 +8707,8 @@
         }
       ],
       "dependencies": {
-        "caniuse-lite": "^1.0.30001646",
-        "electron-to-chromium": "^1.5.4",
+        "caniuse-lite": "^1.0.30001663",
+        "electron-to-chromium": "^1.5.28",
         "node-releases": "^2.0.18",
         "update-browserslist-db": "^1.1.0"
       },
@@ -8894,9 +8888,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001651",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz",
-      "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==",
+      "version": "1.0.30001666",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz",
+      "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==",
       "funding": [
         {
           "type": "opencollective",
@@ -9477,9 +9471,9 @@
       }
     },
     "node_modules/core-js-compat": {
-      "version": "3.38.0",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz",
-      "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==",
+      "version": "3.38.1",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
+      "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
       "dev": true,
       "dependencies": {
         "browserslist": "^4.23.3"
@@ -10579,9 +10573,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.11",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.11.tgz",
-      "integrity": "sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew=="
+      "version": "1.5.31",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz",
+      "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg=="
     },
     "node_modules/emittery": {
       "version": "0.7.2",
@@ -20807,13 +20801,14 @@
       }
     },
     "node_modules/jsesc": {
-      "version": "2.5.2",
-      "license": "MIT",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+      "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
       "bin": {
         "jsesc": "bin/jsesc"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=6"
       }
     },
     "node_modules/json-bigint": {
@@ -23991,9 +23986,9 @@
       "dev": true
     },
     "node_modules/regenerate-unicode-properties": {
-      "version": "10.1.1",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
-      "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+      "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
       "dev": true,
       "dependencies": {
         "regenerate": "^1.4.2"
@@ -24047,15 +24042,15 @@
       }
     },
     "node_modules/regexpu-core": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
-      "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz",
+      "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==",
       "dev": true,
       "dependencies": {
-        "@babel/regjsgen": "^0.8.0",
         "regenerate": "^1.4.2",
-        "regenerate-unicode-properties": "^10.1.0",
-        "regjsparser": "^0.9.1",
+        "regenerate-unicode-properties": "^10.2.0",
+        "regjsgen": "^0.8.0",
+        "regjsparser": "^0.11.0",
         "unicode-match-property-ecmascript": "^2.0.0",
         "unicode-match-property-value-ecmascript": "^2.1.0"
       },
@@ -24063,27 +24058,24 @@
         "node": ">=4"
       }
     },
+    "node_modules/regjsgen": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+      "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+      "dev": true
+    },
     "node_modules/regjsparser": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
-      "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.0.tgz",
+      "integrity": "sha512-vTbzVAjQDzwQdKuvj7qEq6OlAprCjE656khuGQ4QaBLg7abQ9I9ISpmLuc6inWe7zP75AECjqUa4g4sdQvOXhg==",
       "dev": true,
       "dependencies": {
-        "jsesc": "~0.5.0"
+        "jsesc": "~3.0.2"
       },
       "bin": {
         "regjsparser": "bin/parser"
       }
     },
-    "node_modules/regjsparser/node_modules/jsesc": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-      "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
-      "dev": true,
-      "bin": {
-        "jsesc": "bin/jsesc"
-      }
-    },
     "node_modules/relateurl": {
       "version": "0.2.7",
       "license": "MIT",
@@ -27270,9 +27262,9 @@
       "devOptional": true
     },
     "node_modules/unicode-canonical-property-names-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+      "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
       "dev": true,
       "engines": {
         "node": ">=4"
@@ -27292,9 +27284,9 @@
       }
     },
     "node_modules/unicode-match-property-value-ecmascript": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
-      "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+      "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
       "dev": true,
       "engines": {
         "node": ">=4"
@@ -28666,18 +28658,18 @@
       }
     },
     "@babel/code-frame": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz",
+      "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==",
       "requires": {
-        "@babel/highlight": "^7.24.7",
+        "@babel/highlight": "^7.25.7",
         "picocolors": "^1.0.0"
       }
     },
     "@babel/compat-data": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
-      "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ=="
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz",
+      "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw=="
     },
     "@babel/core": {
       "version": "7.23.7",
@@ -28731,43 +28723,43 @@
       }
     },
     "@babel/generator": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
-      "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz",
+      "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==",
       "requires": {
-        "@babel/types": "^7.25.0",
+        "@babel/types": "^7.25.7",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
-        "jsesc": "^2.5.1"
+        "jsesc": "^3.0.2"
       }
     },
     "@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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz",
+      "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.24.7"
+        "@babel/types": "^7.25.7"
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz",
+      "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==",
       "dev": true,
       "requires": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       }
     },
     "@babel/helper-compilation-targets": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
-      "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz",
+      "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==",
       "requires": {
-        "@babel/compat-data": "^7.25.2",
-        "@babel/helper-validator-option": "^7.24.8",
-        "browserslist": "^4.23.1",
+        "@babel/compat-data": "^7.25.7",
+        "@babel/helper-validator-option": "^7.25.7",
+        "browserslist": "^4.24.0",
         "lru-cache": "^5.1.1",
         "semver": "^6.3.1"
       },
@@ -28793,17 +28785,17 @@
       }
     },
     "@babel/helper-create-class-features-plugin": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz",
-      "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz",
+      "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-member-expression-to-functions": "^7.24.8",
-        "@babel/helper-optimise-call-expression": "^7.24.7",
-        "@babel/helper-replace-supers": "^7.25.0",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
-        "@babel/traverse": "^7.25.0",
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "@babel/helper-member-expression-to-functions": "^7.25.7",
+        "@babel/helper-optimise-call-expression": "^7.25.7",
+        "@babel/helper-replace-supers": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
+        "@babel/traverse": "^7.25.7",
         "semver": "^6.3.1"
       },
       "dependencies": {
@@ -28816,13 +28808,13 @@
       }
     },
     "@babel/helper-create-regexp-features-plugin": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
-      "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz",
+      "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "regexpu-core": "^5.3.1",
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "regexpu-core": "^6.1.1",
         "semver": "^6.3.1"
       },
       "dependencies": {
@@ -28848,88 +28840,88 @@
       }
     },
     "@babel/helper-member-expression-to-functions": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
-      "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz",
+      "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==",
       "dev": true,
       "requires": {
-        "@babel/traverse": "^7.24.8",
-        "@babel/types": "^7.24.8"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       }
     },
     "@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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz",
+      "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==",
       "requires": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
-      "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz",
+      "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==",
       "requires": {
-        "@babel/helper-module-imports": "^7.24.7",
-        "@babel/helper-simple-access": "^7.24.7",
-        "@babel/helper-validator-identifier": "^7.24.7",
-        "@babel/traverse": "^7.25.2"
+        "@babel/helper-module-imports": "^7.25.7",
+        "@babel/helper-simple-access": "^7.25.7",
+        "@babel/helper-validator-identifier": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       }
     },
     "@babel/helper-optimise-call-expression": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz",
+      "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.24.7"
+        "@babel/types": "^7.25.7"
       }
     },
     "@babel/helper-plugin-utils": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
-      "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg=="
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz",
+      "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw=="
     },
     "@babel/helper-remap-async-to-generator": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
-      "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz",
+      "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-wrap-function": "^7.25.0",
-        "@babel/traverse": "^7.25.0"
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "@babel/helper-wrap-function": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       }
     },
     "@babel/helper-replace-supers": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
-      "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz",
+      "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==",
       "dev": true,
       "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.24.8",
-        "@babel/helper-optimise-call-expression": "^7.24.7",
-        "@babel/traverse": "^7.25.0"
+        "@babel/helper-member-expression-to-functions": "^7.25.7",
+        "@babel/helper-optimise-call-expression": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       }
     },
     "@babel/helper-simple-access": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz",
+      "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==",
       "requires": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       }
     },
     "@babel/helper-skip-transparent-expression-wrappers": {
-      "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==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz",
+      "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==",
       "dev": true,
       "requires": {
-        "@babel/traverse": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       }
     },
     "@babel/helper-split-export-declaration": {
@@ -28942,29 +28934,29 @@
       }
     },
     "@babel/helper-string-parser": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
-      "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ=="
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
+      "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g=="
     },
     "@babel/helper-validator-identifier": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
-      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w=="
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
+      "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg=="
     },
     "@babel/helper-validator-option": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
-      "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q=="
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz",
+      "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ=="
     },
     "@babel/helper-wrap-function": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
-      "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz",
+      "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.25.0",
-        "@babel/traverse": "^7.25.0",
-        "@babel/types": "^7.25.0"
+        "@babel/template": "^7.25.7",
+        "@babel/traverse": "^7.25.7",
+        "@babel/types": "^7.25.7"
       }
     },
     "@babel/helpers": {
@@ -28978,71 +28970,71 @@
       }
     },
     "@babel/highlight": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
-      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz",
+      "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==",
       "requires": {
-        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.25.7",
         "chalk": "^2.4.2",
         "js-tokens": "^4.0.0",
         "picocolors": "^1.0.0"
       }
     },
     "@babel/parser": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
-      "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz",
+      "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==",
       "requires": {
-        "@babel/types": "^7.25.2"
+        "@babel/types": "^7.25.7"
       }
     },
     "@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
-      "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz",
+      "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/traverse": "^7.25.3"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       }
     },
     "@babel/plugin-bugfix-safari-class-field-initializer-scope": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
-      "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz",
+      "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.25.0",
-      "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.25.0.tgz",
-      "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
+      "version": "7.25.7",
+      "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.25.7.tgz",
+      "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
-      "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz",
+      "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
-        "@babel/plugin-transform-optional-chaining": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
+        "@babel/plugin-transform-optional-chaining": "^7.25.7"
       }
     },
     "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
-      "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz",
+      "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/traverse": "^7.25.0"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       }
     },
     "@babel/plugin-proposal-class-properties": {
@@ -29185,21 +29177,21 @@
       }
     },
     "@babel/plugin-syntax-import-assertions": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
-      "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz",
+      "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-syntax-import-attributes": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
-      "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz",
+      "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-syntax-import-meta": {
@@ -29305,165 +29297,165 @@
       }
     },
     "@babel/plugin-transform-arrow-functions": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
-      "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz",
+      "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-async-generator-functions": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz",
-      "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz",
+      "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-remap-async-to-generator": "^7.25.0",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-remap-async-to-generator": "^7.25.7",
         "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/traverse": "^7.25.0"
+        "@babel/traverse": "^7.25.7"
       }
     },
     "@babel/plugin-transform-async-to-generator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
-      "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz",
+      "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-remap-async-to-generator": "^7.24.7"
+        "@babel/helper-module-imports": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-remap-async-to-generator": "^7.25.7"
       }
     },
     "@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
-      "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz",
+      "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-block-scoping": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
-      "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz",
+      "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-class-properties": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
-      "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz",
+      "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-class-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-class-static-block": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
-      "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz",
+      "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-create-class-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       }
     },
     "@babel/plugin-transform-classes": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz",
-      "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz",
+      "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-compilation-targets": "^7.24.8",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-replace-supers": "^7.25.0",
-        "@babel/traverse": "^7.25.0",
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "@babel/helper-compilation-targets": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-replace-supers": "^7.25.7",
+        "@babel/traverse": "^7.25.7",
         "globals": "^11.1.0"
       }
     },
     "@babel/plugin-transform-computed-properties": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
-      "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz",
+      "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/template": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/template": "^7.25.7"
       }
     },
     "@babel/plugin-transform-destructuring": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
-      "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz",
+      "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-dotall-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
-      "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz",
+      "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-duplicate-keys": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
-      "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz",
+      "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
-      "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz",
+      "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.25.0",
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-dynamic-import": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
-      "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz",
+      "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3"
       }
     },
     "@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
-      "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz",
+      "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==",
       "dev": true,
       "requires": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-export-namespace-from": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
-      "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz",
+      "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       }
     },
@@ -29478,227 +29470,227 @@
       }
     },
     "@babel/plugin-transform-for-of": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
-      "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz",
+      "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7"
       }
     },
     "@babel/plugin-transform-function-name": {
-      "version": "7.25.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
-      "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz",
+      "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-compilation-targets": "^7.24.8",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/traverse": "^7.25.1"
+        "@babel/helper-compilation-targets": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       }
     },
     "@babel/plugin-transform-json-strings": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
-      "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz",
+      "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-json-strings": "^7.8.3"
       }
     },
     "@babel/plugin-transform-literals": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
-      "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz",
+      "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-logical-assignment-operators": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
-      "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz",
+      "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       }
     },
     "@babel/plugin-transform-member-expression-literals": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
-      "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz",
+      "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-modules-amd": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
-      "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz",
+      "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-module-transforms": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
-      "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz",
+      "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.24.8",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-simple-access": "^7.24.7"
+        "@babel/helper-module-transforms": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-simple-access": "^7.25.7"
       }
     },
     "@babel/plugin-transform-modules-systemjs": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
-      "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz",
+      "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.25.0",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-validator-identifier": "^7.24.7",
-        "@babel/traverse": "^7.25.0"
+        "@babel/helper-module-transforms": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-validator-identifier": "^7.25.7",
+        "@babel/traverse": "^7.25.7"
       }
     },
     "@babel/plugin-transform-modules-umd": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
-      "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz",
+      "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-module-transforms": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
-      "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz",
+      "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-new-target": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
-      "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz",
+      "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-nullish-coalescing-operator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
-      "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz",
+      "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
       }
     },
     "@babel/plugin-transform-numeric-separator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
-      "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz",
+      "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       }
     },
     "@babel/plugin-transform-object-rest-spread": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
-      "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz",
+      "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==",
       "dev": true,
       "requires": {
-        "@babel/helper-compilation-targets": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.24.7"
+        "@babel/plugin-transform-parameters": "^7.25.7"
       }
     },
     "@babel/plugin-transform-object-super": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
-      "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz",
+      "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-replace-supers": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-replace-supers": "^7.25.7"
       }
     },
     "@babel/plugin-transform-optional-catch-binding": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
-      "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz",
+      "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
       }
     },
     "@babel/plugin-transform-optional-chaining": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
-      "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz",
+      "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       }
     },
     "@babel/plugin-transform-parameters": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
-      "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz",
+      "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-private-methods": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
-      "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz",
+      "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-class-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-private-property-in-object": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
-      "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz",
+      "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-create-class-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-annotate-as-pure": "^7.25.7",
+        "@babel/helper-create-class-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       }
     },
     "@babel/plugin-transform-property-literals": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
-      "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz",
+      "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-react-display-name": {
@@ -29759,22 +29751,22 @@
       }
     },
     "@babel/plugin-transform-regenerator": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
-      "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz",
+      "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
         "regenerator-transform": "^0.15.2"
       }
     },
     "@babel/plugin-transform-reserved-words": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
-      "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz",
+      "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-runtime": {
@@ -29800,49 +29792,49 @@
       }
     },
     "@babel/plugin-transform-shorthand-properties": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
-      "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz",
+      "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-spread": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
-      "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz",
+      "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7"
       }
     },
     "@babel/plugin-transform-sticky-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
-      "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz",
+      "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-template-literals": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
-      "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz",
+      "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-typeof-symbol": {
-      "version": "7.24.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
-      "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz",
+      "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.8"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-typescript": {
@@ -29858,67 +29850,67 @@
       }
     },
     "@babel/plugin-transform-unicode-escapes": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
-      "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz",
+      "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-unicode-property-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
-      "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz",
+      "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-unicode-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
-      "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz",
+      "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/plugin-transform-unicode-sets-regex": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
-      "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz",
+      "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-create-regexp-features-plugin": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7"
       }
     },
     "@babel/preset-env": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz",
-      "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==",
-      "dev": true,
-      "requires": {
-        "@babel/compat-data": "^7.25.2",
-        "@babel/helper-compilation-targets": "^7.25.2",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/helper-validator-option": "^7.24.8",
-        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
-        "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
-        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
-        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz",
+      "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.25.7",
+        "@babel/helper-compilation-targets": "^7.25.7",
+        "@babel/helper-plugin-utils": "^7.25.7",
+        "@babel/helper-validator-option": "^7.25.7",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7",
+        "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7",
         "@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.7",
-        "@babel/plugin-syntax-import-attributes": "^7.24.7",
+        "@babel/plugin-syntax-import-assertions": "^7.25.7",
+        "@babel/plugin-syntax-import-attributes": "^7.25.7",
         "@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",
@@ -29930,60 +29922,60 @@
         "@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.7",
-        "@babel/plugin-transform-async-generator-functions": "^7.25.0",
-        "@babel/plugin-transform-async-to-generator": "^7.24.7",
-        "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
-        "@babel/plugin-transform-block-scoping": "^7.25.0",
-        "@babel/plugin-transform-class-properties": "^7.24.7",
-        "@babel/plugin-transform-class-static-block": "^7.24.7",
-        "@babel/plugin-transform-classes": "^7.25.0",
-        "@babel/plugin-transform-computed-properties": "^7.24.7",
-        "@babel/plugin-transform-destructuring": "^7.24.8",
-        "@babel/plugin-transform-dotall-regex": "^7.24.7",
-        "@babel/plugin-transform-duplicate-keys": "^7.24.7",
-        "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
-        "@babel/plugin-transform-dynamic-import": "^7.24.7",
-        "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
-        "@babel/plugin-transform-export-namespace-from": "^7.24.7",
-        "@babel/plugin-transform-for-of": "^7.24.7",
-        "@babel/plugin-transform-function-name": "^7.25.1",
-        "@babel/plugin-transform-json-strings": "^7.24.7",
-        "@babel/plugin-transform-literals": "^7.25.2",
-        "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
-        "@babel/plugin-transform-member-expression-literals": "^7.24.7",
-        "@babel/plugin-transform-modules-amd": "^7.24.7",
-        "@babel/plugin-transform-modules-commonjs": "^7.24.8",
-        "@babel/plugin-transform-modules-systemjs": "^7.25.0",
-        "@babel/plugin-transform-modules-umd": "^7.24.7",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
-        "@babel/plugin-transform-new-target": "^7.24.7",
-        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
-        "@babel/plugin-transform-numeric-separator": "^7.24.7",
-        "@babel/plugin-transform-object-rest-spread": "^7.24.7",
-        "@babel/plugin-transform-object-super": "^7.24.7",
-        "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
-        "@babel/plugin-transform-optional-chaining": "^7.24.8",
-        "@babel/plugin-transform-parameters": "^7.24.7",
-        "@babel/plugin-transform-private-methods": "^7.24.7",
-        "@babel/plugin-transform-private-property-in-object": "^7.24.7",
-        "@babel/plugin-transform-property-literals": "^7.24.7",
-        "@babel/plugin-transform-regenerator": "^7.24.7",
-        "@babel/plugin-transform-reserved-words": "^7.24.7",
-        "@babel/plugin-transform-shorthand-properties": "^7.24.7",
-        "@babel/plugin-transform-spread": "^7.24.7",
-        "@babel/plugin-transform-sticky-regex": "^7.24.7",
-        "@babel/plugin-transform-template-literals": "^7.24.7",
-        "@babel/plugin-transform-typeof-symbol": "^7.24.8",
-        "@babel/plugin-transform-unicode-escapes": "^7.24.7",
-        "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
-        "@babel/plugin-transform-unicode-regex": "^7.24.7",
-        "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
+        "@babel/plugin-transform-arrow-functions": "^7.25.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.25.7",
+        "@babel/plugin-transform-async-to-generator": "^7.25.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.25.7",
+        "@babel/plugin-transform-block-scoping": "^7.25.7",
+        "@babel/plugin-transform-class-properties": "^7.25.7",
+        "@babel/plugin-transform-class-static-block": "^7.25.7",
+        "@babel/plugin-transform-classes": "^7.25.7",
+        "@babel/plugin-transform-computed-properties": "^7.25.7",
+        "@babel/plugin-transform-destructuring": "^7.25.7",
+        "@babel/plugin-transform-dotall-regex": "^7.25.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.25.7",
+        "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7",
+        "@babel/plugin-transform-dynamic-import": "^7.25.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.25.7",
+        "@babel/plugin-transform-export-namespace-from": "^7.25.7",
+        "@babel/plugin-transform-for-of": "^7.25.7",
+        "@babel/plugin-transform-function-name": "^7.25.7",
+        "@babel/plugin-transform-json-strings": "^7.25.7",
+        "@babel/plugin-transform-literals": "^7.25.7",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.25.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.25.7",
+        "@babel/plugin-transform-modules-amd": "^7.25.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.25.7",
+        "@babel/plugin-transform-modules-systemjs": "^7.25.7",
+        "@babel/plugin-transform-modules-umd": "^7.25.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7",
+        "@babel/plugin-transform-new-target": "^7.25.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7",
+        "@babel/plugin-transform-numeric-separator": "^7.25.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.25.7",
+        "@babel/plugin-transform-object-super": "^7.25.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.25.7",
+        "@babel/plugin-transform-optional-chaining": "^7.25.7",
+        "@babel/plugin-transform-parameters": "^7.25.7",
+        "@babel/plugin-transform-private-methods": "^7.25.7",
+        "@babel/plugin-transform-private-property-in-object": "^7.25.7",
+        "@babel/plugin-transform-property-literals": "^7.25.7",
+        "@babel/plugin-transform-regenerator": "^7.25.7",
+        "@babel/plugin-transform-reserved-words": "^7.25.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.25.7",
+        "@babel/plugin-transform-spread": "^7.25.7",
+        "@babel/plugin-transform-sticky-regex": "^7.25.7",
+        "@babel/plugin-transform-template-literals": "^7.25.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.25.7",
+        "@babel/plugin-transform-unicode-escapes": "^7.25.7",
+        "@babel/plugin-transform-unicode-property-regex": "^7.25.7",
+        "@babel/plugin-transform-unicode-regex": "^7.25.7",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.25.7",
         "@babel/preset-modules": "0.1.6-no-external-plugins",
         "babel-plugin-polyfill-corejs2": "^0.4.10",
-        "babel-plugin-polyfill-corejs3": "^0.10.4",
+        "babel-plugin-polyfill-corejs3": "^0.10.6",
         "babel-plugin-polyfill-regenerator": "^0.6.1",
-        "core-js-compat": "^3.37.1",
+        "core-js-compat": "^3.38.1",
         "semver": "^6.3.1"
       },
       "dependencies": {
@@ -30001,13 +29993,13 @@
           }
         },
         "babel-plugin-polyfill-corejs3": {
-          "version": "0.10.4",
-          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
-          "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
+          "version": "0.10.6",
+          "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+          "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
           "dev": true,
           "requires": {
-            "@babel/helper-define-polyfill-provider": "^0.6.1",
-            "core-js-compat": "^3.36.1"
+            "@babel/helper-define-polyfill-provider": "^0.6.2",
+            "core-js-compat": "^3.38.0"
           }
         },
         "babel-plugin-polyfill-regenerator": {
@@ -30065,12 +30057,6 @@
         "@babel/plugin-transform-typescript": "^7.21.3"
       }
     },
-    "@babel/regjsgen": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
-      "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
-      "dev": true
-    },
     "@babel/runtime": {
       "version": "7.23.5",
       "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz",
@@ -30080,36 +30066,36 @@
       }
     },
     "@babel/template": {
-      "version": "7.25.0",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
-      "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz",
+      "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==",
       "requires": {
-        "@babel/code-frame": "^7.24.7",
-        "@babel/parser": "^7.25.0",
-        "@babel/types": "^7.25.0"
+        "@babel/code-frame": "^7.25.7",
+        "@babel/parser": "^7.25.7",
+        "@babel/types": "^7.25.7"
       }
     },
     "@babel/traverse": {
-      "version": "7.25.3",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
-      "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
-      "requires": {
-        "@babel/code-frame": "^7.24.7",
-        "@babel/generator": "^7.25.0",
-        "@babel/parser": "^7.25.3",
-        "@babel/template": "^7.25.0",
-        "@babel/types": "^7.25.2",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz",
+      "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==",
+      "requires": {
+        "@babel/code-frame": "^7.25.7",
+        "@babel/generator": "^7.25.7",
+        "@babel/parser": "^7.25.7",
+        "@babel/template": "^7.25.7",
+        "@babel/types": "^7.25.7",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       }
     },
     "@babel/types": {
-      "version": "7.25.2",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
-      "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
+      "version": "7.25.7",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz",
+      "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==",
       "requires": {
-        "@babel/helper-string-parser": "^7.24.8",
-        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/helper-string-parser": "^7.25.7",
+        "@babel/helper-validator-identifier": "^7.25.7",
         "to-fast-properties": "^2.0.0"
       }
     },
@@ -34419,12 +34405,12 @@
       "dev": true
     },
     "browserslist": {
-      "version": "4.23.3",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
-      "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
+      "version": "4.24.0",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz",
+      "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==",
       "requires": {
-        "caniuse-lite": "^1.0.30001646",
-        "electron-to-chromium": "^1.5.4",
+        "caniuse-lite": "^1.0.30001663",
+        "electron-to-chromium": "^1.5.28",
         "node-releases": "^2.0.18",
         "update-browserslist-db": "^1.1.0"
       }
@@ -34540,9 +34526,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001651",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz",
-      "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg=="
+      "version": "1.0.30001666",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz",
+      "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g=="
     },
     "canvas": {
       "version": "2.11.2",
@@ -34926,9 +34912,9 @@
       "dev": true
     },
     "core-js-compat": {
-      "version": "3.38.0",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz",
-      "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==",
+      "version": "3.38.1",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
+      "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
       "dev": true,
       "requires": {
         "browserslist": "^4.23.3"
@@ -35710,9 +35696,9 @@
       }
     },
     "electron-to-chromium": {
-      "version": "1.5.11",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.11.tgz",
-      "integrity": "sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew=="
+      "version": "1.5.31",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz",
+      "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg=="
     },
     "emittery": {
       "version": "0.7.2",
@@ -42776,7 +42762,9 @@
       }
     },
     "jsesc": {
-      "version": "2.5.2"
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+      "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="
     },
     "json-bigint": {
       "version": "1.0.0",
@@ -44872,9 +44860,9 @@
       "dev": true
     },
     "regenerate-unicode-properties": {
-      "version": "10.1.1",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
-      "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+      "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
       "dev": true,
       "requires": {
         "regenerate": "^1.4.2"
@@ -44915,34 +44903,32 @@
       }
     },
     "regexpu-core": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
-      "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz",
+      "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==",
       "dev": true,
       "requires": {
-        "@babel/regjsgen": "^0.8.0",
         "regenerate": "^1.4.2",
-        "regenerate-unicode-properties": "^10.1.0",
-        "regjsparser": "^0.9.1",
+        "regenerate-unicode-properties": "^10.2.0",
+        "regjsgen": "^0.8.0",
+        "regjsparser": "^0.11.0",
         "unicode-match-property-ecmascript": "^2.0.0",
         "unicode-match-property-value-ecmascript": "^2.1.0"
       }
     },
+    "regjsgen": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+      "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+      "dev": true
+    },
     "regjsparser": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
-      "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.0.tgz",
+      "integrity": "sha512-vTbzVAjQDzwQdKuvj7qEq6OlAprCjE656khuGQ4QaBLg7abQ9I9ISpmLuc6inWe7zP75AECjqUa4g4sdQvOXhg==",
       "dev": true,
       "requires": {
-        "jsesc": "~0.5.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
-          "dev": true
-        }
+        "jsesc": "~3.0.2"
       }
     },
     "relateurl": {
@@ -47115,9 +47101,9 @@
       "devOptional": true
     },
     "unicode-canonical-property-names-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+      "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
       "dev": true
     },
     "unicode-match-property-ecmascript": {
@@ -47131,9 +47117,9 @@
       }
     },
     "unicode-match-property-value-ecmascript": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
-      "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+      "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
       "dev": true
     },
     "unicode-property-aliases-ecmascript": {
diff --git a/package.json b/package.json
index a9d5d7d5e..f04822efe 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
   },
   "devDependencies": {
     "@babel/eslint-parser": "^7.22.6",
-    "@babel/preset-env": "^7.25.3",
+    "@babel/preset-env": "^7.25.7",
     "@babel/preset-react": "^7.24.7",
     "@types/create-hash": "^1.2.6",
     "@types/enzyme": "^3.10.12",

From e7a89c90be6df38379ead3fa8b20b350b07201b4 Mon Sep 17 00:00:00 2001
From: Shawn Xie <35279399+shawnxie999@users.noreply.github.com>
Date: Thu, 10 Oct 2024 15:34:04 -0400
Subject: [PATCH 46/79] XLS-33 Multi Purpose token (#989)

## High Level Overview of Change
- add MPT transactions: MPTokenIssuance, MPTokenIssuanceDestroy,
MPTokenAuthorize, MPTokenIssuanceSet
- add MPT page
- support search by MPTID
- updates transactions: Payment, Clawback
- modified Currency to support MPTID
<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change
Spec:
https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0033d-multi-purpose-tokens
---
 public/locales/ca-CA/translations.json        |  25 ++-
 public/locales/en-US/translations.json        |  25 ++-
 public/locales/es-ES/translations.json        |  25 ++-
 public/locales/fr-FR/translations.json        |  25 ++-
 public/locales/ja-JP/translations.json        |  25 ++-
 public/locales/ko-KR/translations.json        |  25 ++-
 .../test/AMMAccountHeader.test.tsx            |  14 +-
 .../AccountAssetTab/AccountAssetTab.tsx       |  11 +-
 .../AccountMPTTable/AccountMPTTable.tsx       | 125 +++++++++++++++
 .../test/AccountMPTRow.test.tsx               |  63 ++++++++
 .../test/AccountMPTTable.test.tsx             | 114 ++++++++++++++
 src/containers/App/index.tsx                  |   3 +
 src/containers/App/routes.ts                  |   8 +-
 src/containers/Header/Search.tsx              |  12 +-
 src/containers/Header/test/Search.test.js     |   4 +
 src/containers/Ledger/index.tsx               |   4 +-
 src/containers/MPT/MPT.tsx                    |  75 +++++++++
 src/containers/MPT/MPTHeader/Details.tsx      |  48 ++++++
 src/containers/MPT/MPTHeader/MPTHeader.tsx    | 117 ++++++++++++++
 src/containers/MPT/MPTHeader/Settings.tsx     |  41 +++++
 src/containers/MPT/MPTHeader/styles.scss      | 144 ++++++++++++++++++
 .../MPT/MPTHeader/test/Details.test.js        |  58 +++++++
 .../MPT/MPTHeader/test/MPTHeader.test.js      |  82 ++++++++++
 .../MPT/MPTHeader/test/Settings.test.js       |  48 ++++++
 src/containers/MPT/styles.scss                |  15 ++
 src/containers/MPT/test/MPT.test.js           |  46 ++++++
 src/containers/NFT/NFTHeader/NFTHeader.tsx    |   4 +-
 .../Transactions/DetailTab/Meta/MPToken.jsx   |  43 ++++++
 .../DetailTab/Meta/MPTokenIssuance.jsx        |  43 ++++++
 .../DetailTab/Meta/RippleState.jsx            |   7 +-
 .../Transactions/DetailTab/Meta/index.tsx     |   6 +
 src/containers/Transactions/index.tsx         |   9 +-
 .../Transactions/test/Description.test.tsx    |  10 +-
 .../Transactions/test/DetailTab.test.tsx      |  10 +-
 .../Transactions/test/Meta.test.tsx           |  29 ++++
 .../Transactions/test/SimpleTab.test.tsx      |  16 +-
 .../test/mock_data/DirectMPTPayment.json      |  95 ++++++++++++
 src/containers/shared/Interfaces.tsx          |  14 ++
 src/containers/shared/analytics.ts            |   1 +
 src/containers/shared/components/Amount.tsx   |  51 ++++++-
 src/containers/shared/components/Currency.tsx |  56 ++++---
 .../shared/components/MPTokenLink.tsx         |  12 ++
 .../shared/components/Tooltip/Tooltip.tsx     |   3 +
 .../Transaction/Clawback/Description.tsx      |   2 +-
 .../components/Transaction/Clawback/parser.ts |  38 ++++-
 .../Clawback/test/ClawbackSimple.test.tsx     |  48 ++++++
 .../Clawback/test/mock_data/ClawbackMPT.json  |  85 +++++++++++
 .../test/mock_data/ClawbackMPT_Failure.json   |  46 ++++++
 .../components/Transaction/Clawback/types.ts  |   1 +
 .../Transaction/MPTokenAuthorize/Simple.tsx   |  26 ++++
 .../Transaction/MPTokenAuthorize/index.ts     |  13 ++
 .../test/MPTokenAuthorizeSimple.test.jsx      |  66 ++++++++
 .../test/mock_data/MPTokenAuthorize.json      |  70 +++++++++
 .../test/mock_data/MPTokenAuthorize_Fail.json |  49 ++++++
 .../MPTokenAuthorize_WithHolder.json          |  67 ++++++++
 .../MPTokenAuthorize_WithHolderFail.json      |  50 ++++++
 .../Transaction/MPTokenAuthorize/types.ts     |   6 +
 .../MPTokenIssuanceCreate/Simple.tsx          |  63 ++++++++
 .../MPTokenIssuanceCreate/index.ts            |  15 ++
 .../MPTokenIssuanceCreate/parser.ts           |  21 +++
 .../test/MPTokenIssuanceCreateSimple.test.jsx |  27 ++++
 .../test/mock_data/MPTokenIssuanceCreate.json |  79 ++++++++++
 .../MPTokenIssuanceCreate/types.ts            |  16 ++
 .../MPTokenIssuanceDestroy/Simple.tsx         |  18 +++
 .../MPTokenIssuanceDestroy/index.ts           |  13 ++
 .../MPTokenIssuanceDestroySimple.test.jsx     |  29 ++++
 .../mock_data/MPTokenIssuanceDestroy.json     |  76 +++++++++
 .../MPTokenIssuanceDestroy_Fail.json          |  49 ++++++
 .../MPTokenIssuanceDestroy/types.ts           |   5 +
 .../Transaction/MPTokenIssuanceSet/Simple.tsx |  26 ++++
 .../Transaction/MPTokenIssuanceSet/index.ts   |  13 ++
 .../test/MPTokenIssuanceSetSimple.test.jsx    |  53 +++++++
 .../test/mock_data/MPTokenIssuanceSet.json    |  67 ++++++++
 .../mock_data/MPTokenIssuanceSet_Fail.json    |  50 ++++++
 .../MPTokenIssuanceSet_NoHolder.json          |  67 ++++++++
 .../Transaction/MPTokenIssuanceSet/types.ts   |   6 +
 .../Transaction/NFTokenAcceptOffer/types.ts   |   4 +-
 .../test/NFTokenCancelOfferSimple.test.jsx    |  18 ++-
 .../Transaction/NFTokenCreateOffer/types.ts   |   4 +-
 .../Transaction/OfferCreate/parser.ts         |   2 +-
 .../Transaction/OracleSet/parser.ts           |  15 +-
 .../OracleSet/test/ConvertScalePrice.test.ts  |   2 +-
 .../components/Transaction/Payment/parser.ts  |   5 +-
 .../Payment/test/PaymentSimple.test.tsx       |  35 +++++
 .../Payment/test/mock_data/PaymentMPT.json    |  91 +++++++++++
 .../shared/components/Transaction/index.ts    |   8 +
 .../Transaction/test/createWrapperFactory.tsx |  10 +-
 .../shared/components/Transaction/types.ts    |   1 +
 .../test/TransactionTable.test.js             |  26 ++--
 .../shared/components/test/Amount.test.tsx    |  36 +++++
 .../shared/components/test/Currency.test.tsx  |  22 +++
 src/containers/shared/css/global.scss         |   1 +
 src/containers/shared/css/variables.scss      |   1 +
 src/containers/shared/transactionUtils.ts     |  15 ++
 src/containers/shared/types.ts                |  10 +-
 src/containers/shared/utils.js                |  59 ++++++-
 src/rippled/lib/rippled.js                    |  54 ++++++-
 src/rippled/lib/txSummary/formatAmount.ts     |  28 +++-
 src/rippled/lib/utils.js                      |  45 +++++-
 99 files changed, 3225 insertions(+), 118 deletions(-)
 create mode 100644 src/containers/Accounts/AccountMPTTable/AccountMPTTable.tsx
 create mode 100644 src/containers/Accounts/AccountMPTTable/test/AccountMPTRow.test.tsx
 create mode 100644 src/containers/Accounts/AccountMPTTable/test/AccountMPTTable.test.tsx
 create mode 100644 src/containers/MPT/MPT.tsx
 create mode 100644 src/containers/MPT/MPTHeader/Details.tsx
 create mode 100644 src/containers/MPT/MPTHeader/MPTHeader.tsx
 create mode 100644 src/containers/MPT/MPTHeader/Settings.tsx
 create mode 100644 src/containers/MPT/MPTHeader/styles.scss
 create mode 100644 src/containers/MPT/MPTHeader/test/Details.test.js
 create mode 100644 src/containers/MPT/MPTHeader/test/MPTHeader.test.js
 create mode 100644 src/containers/MPT/MPTHeader/test/Settings.test.js
 create mode 100644 src/containers/MPT/styles.scss
 create mode 100644 src/containers/MPT/test/MPT.test.js
 create mode 100644 src/containers/Transactions/DetailTab/Meta/MPToken.jsx
 create mode 100644 src/containers/Transactions/DetailTab/Meta/MPTokenIssuance.jsx
 create mode 100644 src/containers/Transactions/test/mock_data/DirectMPTPayment.json
 create mode 100644 src/containers/shared/components/MPTokenLink.tsx
 create mode 100644 src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json
 create mode 100644 src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx
 create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/index.ts
 create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/MPTokenAuthorizeSimple.test.jsx
 create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_Fail.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/index.ts
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/parser.ts
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/MPTokenIssuanceCreateSimple.test.jsx
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/mock_data/MPTokenIssuanceCreate.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/types.ts
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/Simple.tsx
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/index.ts
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/MPTokenIssuanceDestroySimple.test.jsx
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy_Fail.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/types.ts
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/index.ts
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/MPTokenIssuanceSetSimple.test.jsx
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_NoHolder.json
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts
 create mode 100644 src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentMPT.json

diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index d5e305960..a39916bf5 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -530,5 +530,28 @@
   "last_update_time": null,
   "asset_class": null,
   "trading_pairs": null,
-  "deleted": null
+  "deleted": null,
+  "assets.mpt_tab_title": null,
+  "assets.no_mpts_message": null,
+  "transaction_type_name_MPTokenIssuanceCreate": null,
+  "transaction_type_name_MPTokenIssuanceDestroy": null,
+  "transaction_type_name_MPTokenIssuanceSet": null,
+  "transaction_type_name_MPTokenAuthorize": null,
+  "transaction_outstanding_balance_line_two": null,
+  "transaction_mptoken_line_one": null,
+  "transaction_mpt_issuance_line_one":null,
+  "mpt_issuance_id": null,
+  "asset_scale": null,
+  "metadata": null,
+  "max_amount": null,
+  "mpt_holder": null,
+  "check_mpt_id": null,
+  "outstanding_amount": null,
+  "locked": null,
+  "can_lock": null,
+  "require_auth": null,
+  "can_escrow": null,
+  "can_trade": null,
+  "can_transfer": null,
+  "can_clawback": null
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index 369edfa7a..58453bb65 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -2,9 +2,11 @@
   "action": "action",
   "assets": "Assets",
   "assets.nft_tab_title": "Non-Fungible Tokens",
+  "assets.mpt_tab_title": "Multi-Purpose Tokens",
   "assets.issued_tab_title": "Issued Tokens",
   "assets.no_issued_message": "No tokens found.",
   "assets.no_nfts_message": "No NFTs found.",
+  "assets.no_mpts_message": "No MPTs found.",
   "network": "Network",
   "amendments": "Amendments",
   "network_name": "Unknown Network",
@@ -166,6 +168,10 @@
   "transaction_type_name_EscrowCreate": "Escrow Create",
   "transaction_type_name_EscrowFinish": "Escrow Finish",
   "transaction_type_name_Invoke": "Invoke",
+  "transaction_type_name_MPTokenIssuanceCreate": "MPT Issuance Create",
+  "transaction_type_name_MPTokenIssuanceDestroy": "MPT Issuance Destroy",
+  "transaction_type_name_MPTokenIssuanceSet": "MPT Issuance Set",
+  "transaction_type_name_MPTokenAuthorize": "MPT Authorize",
   "transaction_type_name_NFTokenAcceptOffer": "NFT Accept Offer",
   "transaction_type_name_NFTokenBurn": "NFT Burn",
   "transaction_type_name_NFTokenCancelOffer": "NFT Cancel Offer",
@@ -248,8 +254,11 @@
   "node_meta_type": "It {{action}} a node with type",
   "transaction_balance_line_one": "It <1><0>{{action}}</0></1> a <3><0>{{currency}}</0></3> RippleState node between <5><0>{{account}}</0></5> and <7><0>{{counterAccount}}</0></7>",
   "transaction_balance_line_two": "Balance changed by <1><0>{{change}}</0></1> from <3><0>{{previousBalance}}</0></3> to <5><0>{{finalBalance}}</0></5>",
+  "transaction_outstanding_balance_line_two": "Outstanding balance changed by <1><0>{{change}}</0></1> from <3><0>{{previousBalance}}</0></3> to <5><0>{{finalBalance}}</0></5>",
   "transaction_owned_directory": "It {{action}} a DirectoryNode node owned by",
   "transaction_unowned_directory": "It {{action}} a DirectoryNode node",
+  "transaction_mptoken_line_one": "It <1><0>{{action}}</0></1> an MPToken node of <3><0>{{account}}</0></3>",
+  "transaction_mpt_issuance_line_one": "It <1><0>{{action}}</0></1> an MPTokenIssuance node of <3><0>{{account}}</0></3>",
   "owned_account_root": "It {{action}} the AccountRoot node of",
   "unowned_account_root": "It {{action}} the AccountRoot node",
   "account_balance_increased": "Balance increased by <1><0>{{difference}}</0><1><0>{{currency}}</0></1></1> from <3><0>{{previous}}</0><1><0>{{currency}}</0></1></3> to <5><0>{{final}}</0><1><0>{{currency}}</0></1></5>",
@@ -530,5 +539,19 @@
   "last_update_time": "Last Update Time",
   "asset_class": "Asset Class",
   "trading_pairs": "Trading Pairs",
-  "deleted": "Deleted"
+  "deleted": "Deleted",
+  "mpt_issuance_id": "MPT Issuance ID",
+  "asset_scale": "Asset Scale",
+  "metadata": "Metadata",
+  "max_amount": "Max Amount",
+  "mpt_holder": "MPT Holder",
+  "check_mpt_id": "Please check your MPT Issuance ID",
+  "outstanding_amount": "Issued Amount",
+  "locked": "Locked",
+  "can_lock": "Can Lock",
+  "require_auth": "Require Auth",
+  "can_escrow": "Can Escrow",
+  "can_trade": "Can Trade",
+  "can_transfer": "Can Transfer",
+  "can_clawback": "Can Clawback"
 }
diff --git a/public/locales/es-ES/translations.json b/public/locales/es-ES/translations.json
index bde04d337..d694f1db3 100644
--- a/public/locales/es-ES/translations.json
+++ b/public/locales/es-ES/translations.json
@@ -526,5 +526,28 @@
   "last_update_time": null,
   "asset_class": null,
   "trading_pairs": null,
-  "deleted": null
+  "deleted": null,
+  "assets.mpt_tab_title": null,
+  "assets.no_mpts_message": null,
+  "transaction_type_name_MPTokenIssuanceCreate": null,
+  "transaction_type_name_MPTokenIssuanceDestroy": null,
+  "transaction_type_name_MPTokenIssuanceSet": null,
+  "transaction_type_name_MPTokenAuthorize": null,
+  "transaction_outstanding_balance_line_two": null,
+  "transaction_mptoken_line_one": null,
+  "transaction_mpt_issuance_line_one":null,
+  "mpt_issuance_id": null,
+  "asset_scale": null,
+  "metadata": null,
+  "max_amount": null,
+  "mpt_holder": null,
+  "check_mpt_id": null,
+  "outstanding_amount": null,
+  "locked": null,
+  "can_lock": null,
+  "require_auth": null,
+  "can_escrow": null,
+  "can_trade": null,
+  "can_transfer": null,
+  "can_clawback": null
 }
diff --git a/public/locales/fr-FR/translations.json b/public/locales/fr-FR/translations.json
index 9cbdc4293..d6683c855 100644
--- a/public/locales/fr-FR/translations.json
+++ b/public/locales/fr-FR/translations.json
@@ -527,5 +527,28 @@
   "last_update_time": null,
   "asset_class": null,
   "trading_pairs": null,
-  "deleted": null
+  "deleted": null,
+  "assets.mpt_tab_title": null,
+  "assets.no_mpts_message": null,
+  "transaction_type_name_MPTokenIssuanceCreate": null,
+  "transaction_type_name_MPTokenIssuanceDestroy": null,
+  "transaction_type_name_MPTokenIssuanceSet": null,
+  "transaction_type_name_MPTokenAuthorize": null,
+  "transaction_outstanding_balance_line_two": null,
+  "transaction_mptoken_line_one": null,
+  "transaction_mpt_issuance_line_one":null,
+  "mpt_issuance_id": null,
+  "asset_scale": null,
+  "metadata": null,
+  "max_amount": null,
+  "mpt_holder": null,
+  "check_mpt_id": null,
+  "outstanding_amount": null,
+  "locked": null,
+  "can_lock": null,
+  "require_auth": null,
+  "can_escrow": null,
+  "can_trade": null,
+  "can_transfer": null,
+  "can_clawback": null
 }
diff --git a/public/locales/ja-JP/translations.json b/public/locales/ja-JP/translations.json
index 953a54eba..9ed8133ee 100644
--- a/public/locales/ja-JP/translations.json
+++ b/public/locales/ja-JP/translations.json
@@ -526,5 +526,28 @@
   "last_update_time": null,
   "asset_class": null,
   "trading_pairs": null,
-  "deleted": null
+  "deleted": null,
+  "assets.mpt_tab_title": null,
+  "assets.no_mpts_message": null,
+  "transaction_type_name_MPTokenIssuanceCreate": null,
+  "transaction_type_name_MPTokenIssuanceDestroy": null,
+  "transaction_type_name_MPTokenIssuanceSet": null,
+  "transaction_type_name_MPTokenAuthorize": null,
+  "transaction_outstanding_balance_line_two": null,
+  "transaction_mptoken_line_one": null,
+  "transaction_mpt_issuance_line_one":null,
+  "mpt_issuance_id": null,
+  "asset_scale": null,
+  "metadata": null,
+  "max_amount": null,
+  "mpt_holder": null,
+  "check_mpt_id": null,
+  "outstanding_amount": null,
+  "locked": null,
+  "can_lock": null,
+  "require_auth": null,
+  "can_escrow": null,
+  "can_trade": null,
+  "can_transfer": null,
+  "can_clawback": null
 }
diff --git a/public/locales/ko-KR/translations.json b/public/locales/ko-KR/translations.json
index 2094a1fe5..148714cd5 100644
--- a/public/locales/ko-KR/translations.json
+++ b/public/locales/ko-KR/translations.json
@@ -524,5 +524,28 @@
   "last_update_time": null,
   "asset_class": null,
   "trading_pairs": null,
-  "deleted": null
+  "deleted": null,
+  "assets.mpt_tab_title": null,
+  "assets.no_mpts_message": null,
+  "transaction_type_name_MPTokenIssuanceCreate": null,
+  "transaction_type_name_MPTokenIssuanceDestroy": null,
+  "transaction_type_name_MPTokenIssuanceSet": null,
+  "transaction_type_name_MPTokenAuthorize": null,
+  "transaction_outstanding_balance_line_two": null,
+  "transaction_mptoken_line_one": null,
+  "transaction_mpt_issuance_line_one":null,
+  "mpt_issuance_id": null,
+  "asset_scale": null,
+  "metadata": null,
+  "max_amount": null,
+  "mpt_holder": null,
+  "check_mpt_id": null,
+  "outstanding_amount": null,
+  "locked": null,
+  "can_lock": null,
+  "require_auth": null,
+  "can_escrow": null,
+  "can_trade": null,
+  "can_transfer": null,
+  "can_clawback": null
 }
diff --git a/src/containers/Accounts/AMM/AMMAccounts/AMMAccountHeader/test/AMMAccountHeader.test.tsx b/src/containers/Accounts/AMM/AMMAccounts/AMMAccountHeader/test/AMMAccountHeader.test.tsx
index bc38fa370..74ad7ef95 100644
--- a/src/containers/Accounts/AMM/AMMAccounts/AMMAccountHeader/test/AMMAccountHeader.test.tsx
+++ b/src/containers/Accounts/AMM/AMMAccounts/AMMAccountHeader/test/AMMAccountHeader.test.tsx
@@ -1,20 +1,24 @@
 import { mount } from 'enzyme'
 import { I18nextProvider } from 'react-i18next'
 import { MemoryRouter } from 'react-router'
+import { QueryClientProvider } from 'react-query'
 import i18n from '../../../../../../i18n/testConfig'
 import { AMMAccountHeader, AmmDataType } from '../AMMAccountHeader'
 import { flushPromises } from '../../../../../test/utils'
+import { queryClient } from '../../../../../shared/QueryClient'
 
 describe('AMM Account Header', () => {
   const TEST_ACCOUNT_ID = 'rTEST_ACCOUNT'
 
   const createWrapper = (state: AmmDataType) =>
     mount(
-      <I18nextProvider i18n={i18n}>
-        <MemoryRouter initialEntries={[`accounts/${TEST_ACCOUNT_ID}`]}>
-          <AMMAccountHeader data={state} />
-        </MemoryRouter>
-      </I18nextProvider>,
+      <QueryClientProvider client={queryClient}>
+        <I18nextProvider i18n={i18n}>
+          <MemoryRouter initialEntries={[`accounts/${TEST_ACCOUNT_ID}`]}>
+            <AMMAccountHeader data={state} />
+          </MemoryRouter>
+        </I18nextProvider>
+      </QueryClientProvider>,
     )
 
   it('renders AMM account page', async () => {
diff --git a/src/containers/Accounts/AccountAssetTab/AccountAssetTab.tsx b/src/containers/Accounts/AccountAssetTab/AccountAssetTab.tsx
index c58f6e6da..2832e2834 100644
--- a/src/containers/Accounts/AccountAssetTab/AccountAssetTab.tsx
+++ b/src/containers/Accounts/AccountAssetTab/AccountAssetTab.tsx
@@ -5,6 +5,7 @@ import { useNavigate } from 'react-router'
 import { useRouteParams } from '../../shared/routing'
 import { AccountIssuedTokenTable } from '../AccountIssuedTokenTable'
 import { AccountNFTTable } from '../AccountNFTTable/AccountNFTTable'
+import { AccountMPTTable } from '../AccountMPTTable/AccountMPTTable'
 import { ACCOUNT_ROUTE } from '../../App/routes'
 
 // TODO: Add state types or convert to react query
@@ -12,11 +13,17 @@ interface Props {
   account: any
 }
 
-const assetTypes = ['issued', 'nft']
+let assetTypes = ['issued', 'nft']
 
 const AccountAssetTabDisconnected = ({ account }: Props) => {
   const { id: accountId = '', assetType = assetTypes[0] } =
     useRouteParams(ACCOUNT_ROUTE)
+
+  const supportsMPT = ['mpt_sandbox', 'devnet'].includes(
+    process.env.VITE_ENVIRONMENT as string,
+  )
+  if (supportsMPT) assetTypes = ['issued', 'nft', 'mpt']
+
   const navigate = useNavigate()
   const { t } = useTranslation()
   function switchAsset(event: ChangeEvent<HTMLInputElement>) {
@@ -48,11 +55,13 @@ const AccountAssetTabDisconnected = ({ account }: Props) => {
           )
         })}
       </div>
+
       <div className="tab-body">
         {assetType === 'issued' && (
           <AccountIssuedTokenTable account={account} />
         )}
         {assetType === 'nft' && <AccountNFTTable accountId={accountId} />}
+        {assetType === 'mpt' && <AccountMPTTable accountId={accountId} />}
       </div>
     </>
   )
diff --git a/src/containers/Accounts/AccountMPTTable/AccountMPTTable.tsx b/src/containers/Accounts/AccountMPTTable/AccountMPTTable.tsx
new file mode 100644
index 000000000..d1ab69f6c
--- /dev/null
+++ b/src/containers/Accounts/AccountMPTTable/AccountMPTTable.tsx
@@ -0,0 +1,125 @@
+import { useContext } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useInfiniteQuery, useQuery } from 'react-query'
+import { Loader } from '../../shared/components/Loader'
+import SocketContext from '../../shared/SocketContext'
+import { useAnalytics } from '../../shared/analytics'
+import { EmptyMessageTableRow } from '../../shared/EmptyMessageTableRow'
+import { getAccountMPTs, getMPTIssuance } from '../../../rippled/lib/rippled'
+import { Account } from '../../shared/components/Account'
+import { LoadMoreButton } from '../../shared/LoadMoreButton'
+import { MPTokenLink } from '../../shared/components/MPTokenLink'
+import {
+  formatMPTokenInfo,
+  formatMPTIssuanceInfo,
+} from '../../../rippled/lib/utils'
+import { MPTIssuanceFormattedInfo } from '../../shared/Interfaces'
+import { convertScaledPrice } from '../../shared/utils'
+
+export interface AccountMPTTableProps {
+  accountId: string
+}
+
+export const AccountMPTRow = ({ mpt }: any) => {
+  const rippledSocket = useContext(SocketContext)
+  const { trackException } = useAnalytics()
+  const { data: mptIssuanceData } = useQuery<MPTIssuanceFormattedInfo>(
+    ['getMPTIssuanceScale', mpt.mptIssuanceID],
+    async () => {
+      const info = await getMPTIssuance(rippledSocket, mpt.mptIssuanceID)
+      return formatMPTIssuanceInfo(info)
+    },
+    {
+      onError: (e: any) => {
+        trackException(
+          `mptIssuance ${mpt.mptIssuanceID} --- ${JSON.stringify(e)}`,
+        )
+      },
+    },
+  )
+
+  if (!mptIssuanceData) return null
+
+  const scale = mptIssuanceData?.assetScale ?? 0
+
+  return (
+    <tr>
+      <td>
+        <MPTokenLink tokenID={mpt.mptIssuanceID} />
+      </td>
+      <td>
+        <Account account={mpt.mptIssuer} />
+      </td>
+      <td className="right">
+        {convertScaledPrice(
+          parseInt(mpt.mptAmount as string, 10).toString(16),
+          scale,
+        )}
+      </td>
+    </tr>
+  )
+}
+
+export const AccountMPTTable = ({ accountId }: AccountMPTTableProps) => {
+  const rippledSocket = useContext(SocketContext)
+  const { trackException } = useAnalytics()
+  const {
+    data: pages,
+    isFetching: loading,
+    hasNextPage,
+    fetchNextPage,
+  } = useInfiniteQuery(
+    ['account_objects', accountId],
+    ({ pageParam = '' }) =>
+      getAccountMPTs(rippledSocket, accountId, pageParam).catch(
+        (errorResponse) => {
+          const errorLocation = `account MPTs ${accountId} at ${pageParam}`
+          trackException(
+            `${errorLocation} --- ${JSON.stringify(errorResponse)}`,
+          )
+        },
+      ),
+    {
+      getNextPageParam: (data) => data.marker,
+    },
+  )
+  const { t } = useTranslation()
+
+  function renderNoResults() {
+    return (
+      <EmptyMessageTableRow colSpan={3}>
+        {t('assets.no_mpts_message')}
+      </EmptyMessageTableRow>
+    )
+  }
+
+  const renderLoadMoreButton = () =>
+    hasNextPage && <LoadMoreButton onClick={() => fetchNextPage()} />
+
+  const mpts = pages?.pages
+    .flatMap((page: any) => page.account_objects)
+    .map((mpt) => formatMPTokenInfo(mpt))
+
+  return (
+    <div className="section nodes-table">
+      <table className="basic">
+        <thead>
+          <tr>
+            <th> {t('mpt_issuance_id')}</th>
+            <th> {t('issuer')}</th>
+            <th className="right">{t('amount')}</th>
+          </tr>
+        </thead>
+        <tbody>
+          {!loading &&
+            (mpts?.length
+              ? mpts.map((mpt) => (
+                  <AccountMPTRow key={mpt.mptIssuanceID} mpt={mpt} />
+                ))
+              : renderNoResults())}
+        </tbody>
+      </table>
+      {loading ? <Loader /> : renderLoadMoreButton()}
+    </div>
+  )
+}
diff --git a/src/containers/Accounts/AccountMPTTable/test/AccountMPTRow.test.tsx b/src/containers/Accounts/AccountMPTTable/test/AccountMPTRow.test.tsx
new file mode 100644
index 000000000..04d9eb120
--- /dev/null
+++ b/src/containers/Accounts/AccountMPTTable/test/AccountMPTRow.test.tsx
@@ -0,0 +1,63 @@
+import { I18nextProvider } from 'react-i18next'
+import { BrowserRouter } from 'react-router-dom'
+import { mount } from 'enzyme'
+import { QueryClientProvider } from 'react-query'
+import { AccountMPTRow } from '../AccountMPTTable'
+import i18n from '../../../../i18n/testConfig'
+import { testQueryClient } from '../../../test/QueryClient'
+import { getMPTIssuance } from '../../../../rippled/lib/rippled'
+import { flushPromises } from '../../../test/utils'
+
+import Mock = jest.Mock
+
+jest.mock('../../../../rippled/lib/rippled', () => ({
+  __esModule: true,
+  getMPTIssuance: jest.fn(),
+}))
+
+const mockedFetMPTIssuance = getMPTIssuance as Mock
+
+const mptData = {
+  account: 'rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu',
+  flags: [],
+  mptIssuanceID: '000017C2CE76E3E3328AE9E0D80CDD68BA72CC8D8D053DB6',
+  mptIssuer: 'rKFgd9FNzwu7a7iVYa2Me4dmBC3zzUepSC',
+  mptAmount: '100',
+}
+
+describe('AccountMPTRow', () => {
+  const createWrapper = (component: JSX.Element) =>
+    mount(
+      <QueryClientProvider client={testQueryClient}>
+        <I18nextProvider i18n={i18n}>
+          <BrowserRouter>{component}</BrowserRouter>
+        </I18nextProvider>
+      </QueryClientProvider>,
+    )
+
+  it('handles Account MPT row', async () => {
+    const issuanceData = {
+      node: {
+        AssetScale: 3,
+      },
+    }
+
+    mockedFetMPTIssuance.mockReset()
+
+    mockedFetMPTIssuance.mockImplementation(() =>
+      Promise.resolve({ ...issuanceData }),
+    )
+
+    const wrapper = createWrapper(<AccountMPTRow mpt={mptData} />)
+    await flushPromises()
+    wrapper.update()
+    expect(wrapper.find('td').at(0).html()).toBe(
+      '<td><a title="000017C2CE76E3E3328AE9E0D80CDD68BA72CC8D8D053DB6" class="" href="/mpt/000017C2CE76E3E3328AE9E0D80CDD68BA72CC8D8D053DB6">000017C2CE76E3E3328AE9E0D80CDD68BA72CC8D8D053DB6</a></td>',
+    )
+    expect(wrapper.find('td').at(1).html()).toBe(
+      '<td><a title="rKFgd9FNzwu7a7iVYa2Me4dmBC3zzUepSC" class="account" href="/accounts/rKFgd9FNzwu7a7iVYa2Me4dmBC3zzUepSC">rKFgd9FNzwu7a7iVYa2Me4dmBC3zzUepSC</a></td>',
+    )
+    expect(wrapper.find('td').at(2).html()).toBe('<td class="right">0.100</td>')
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/Accounts/AccountMPTTable/test/AccountMPTTable.test.tsx b/src/containers/Accounts/AccountMPTTable/test/AccountMPTTable.test.tsx
new file mode 100644
index 000000000..5ad642fb2
--- /dev/null
+++ b/src/containers/Accounts/AccountMPTTable/test/AccountMPTTable.test.tsx
@@ -0,0 +1,114 @@
+import { mount } from 'enzyme'
+import { QueryClientProvider } from 'react-query'
+import { I18nextProvider } from 'react-i18next'
+import { BrowserRouter } from 'react-router-dom'
+import { getAccountMPTs } from '../../../../rippled/lib/rippled'
+import { AccountMPTTable } from '../AccountMPTTable'
+import i18n from '../../../../i18n/testConfig'
+import { EmptyMessageTableRow } from '../../../shared/EmptyMessageTableRow'
+import { testQueryClient } from '../../../test/QueryClient'
+import { flushPromises } from '../../../test/utils'
+
+import Mock = jest.Mock
+
+jest.mock('../../../../rippled/lib/rippled', () => ({
+  __esModule: true,
+  getAccountMPTs: jest.fn(),
+}))
+
+const mockedGetAccountMPTs = getAccountMPTs as Mock
+
+const data = {
+  account: 'rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu',
+  account_objects: [
+    {
+      Account: 'rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu',
+      Flags: 0,
+      LedgerEntryType: 'MPToken',
+      MPTAmount: '100',
+      MPTokenIssuanceID: '000017C2CE76E3E3328AE9E0D80CDD68BA72CC8D8D053DB6',
+      OwnerNode: '0',
+      PreviousTxnID:
+        '98646C9E7C6D7B8461DC92712B83EFF6CDA4203CE3FF3FF7E0B86FD57907949F',
+      PreviousTxnLgrSeq: 969,
+      index: '3BAA73912496683A414494218D3CCA33D02F80D588F80C1257C691448E00E486',
+    },
+  ],
+  ledger_current_index: 970,
+  status: 'success',
+  validated: false,
+}
+
+describe('AccountMPTTable component', () => {
+  const TEST_ACCOUNT_ID = 'rTEST_ACCOUNT'
+
+  const createWrapper = () =>
+    mount(
+      <QueryClientProvider client={testQueryClient}>
+        <BrowserRouter>
+          <I18nextProvider i18n={i18n}>
+            <AccountMPTTable accountId={TEST_ACCOUNT_ID} />
+          </I18nextProvider>
+        </BrowserRouter>
+      </QueryClientProvider>,
+    )
+
+  afterEach(() => {
+    mockedGetAccountMPTs.mockReset()
+  })
+
+  it('should render a table of mpts', async () => {
+    mockedGetAccountMPTs.mockReset()
+
+    mockedGetAccountMPTs.mockImplementation(() => Promise.resolve(data))
+
+    const wrapper = createWrapper()
+    await flushPromises()
+    wrapper.update()
+    expect(wrapper.find('.load-more-btn')).not.toExist()
+    wrapper.unmount()
+  })
+
+  it('should handle load more', async () => {
+    mockedGetAccountMPTs.mockReset()
+
+    mockedGetAccountMPTs.mockImplementation(() =>
+      Promise.resolve({
+        ...data,
+        marker: 'hello',
+      }),
+    )
+
+    const wrapper = createWrapper()
+    await flushPromises()
+    wrapper.update()
+
+    expect(wrapper.find('.load-more-btn')).toExist()
+    wrapper.find('.load-more-btn').simulate('click')
+    expect(mockedGetAccountMPTs.mock.calls[1][2]).toEqual('hello')
+    wrapper.unmount()
+  })
+
+  it(`should handle no results`, async () => {
+    mockedGetAccountMPTs.mockReset()
+
+    mockedGetAccountMPTs.mockImplementation(() =>
+      Promise.resolve({
+        account: 'rLEr9C6kwybj1BFE1iYbhJXNFVz8rnLu8C',
+        account_objects: [],
+        ledger_hash:
+          '7CC58622B7071E675AF63F39AAF81BDB4E87FDFEBB0BA8CE7D753F3C702D2886',
+        ledger_index: 6086,
+        validated: true,
+        marker: 'hello',
+      }),
+    )
+
+    const wrapper = createWrapper()
+    await flushPromises()
+    wrapper.update()
+
+    expect(wrapper.find(EmptyMessageTableRow)).toExist()
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/App/index.tsx b/src/containers/App/index.tsx
index d03150b9e..1b5734800 100644
--- a/src/containers/App/index.tsx
+++ b/src/containers/App/index.tsx
@@ -25,6 +25,7 @@ import {
   VALIDATOR_ROUTE,
   AMENDMENTS_ROUTE,
   AMENDMENT_ROUTE,
+  MPT_ROUTE,
 } from './routes'
 import { LedgersPage as Ledgers } from '../Ledgers'
 import { Ledger } from '../Ledger'
@@ -39,6 +40,7 @@ import { legacyRedirect } from './legacyRedirects'
 import { useCustomNetworks } from '../shared/hooks'
 import { Amendments } from '../Amendments'
 import { Amendment } from '../Amendment'
+import { MPT } from '../MPT/MPT'
 
 export const AppWrapper = () => {
   const mode = process.env.VITE_ENVIRONMENT
@@ -72,6 +74,7 @@ export const AppWrapper = () => {
     [TOKEN_ROUTE, Token],
     [NFT_ROUTE, NFT],
     [AMENDMENT_ROUTE, Amendment],
+    [MPT_ROUTE, MPT],
   ]
 
   const redirect = legacyRedirect(basename, location)
diff --git a/src/containers/App/routes.ts b/src/containers/App/routes.ts
index a7ece5ec3..b94707689 100644
--- a/src/containers/App/routes.ts
+++ b/src/containers/App/routes.ts
@@ -3,7 +3,7 @@ import { RouteDefinition } from '../shared/routing'
 export const ACCOUNT_ROUTE: RouteDefinition<{
   id?: string
   tab?: 'assets' | 'transactions'
-  assetType?: 'issued' | 'nfts'
+  assetType?: 'issued' | 'nfts' | 'mpts'
 }> = {
   path: '/accounts/:id?/:tab?/:assetType?',
 }
@@ -66,3 +66,9 @@ export const AMENDMENT_ROUTE: RouteDefinition<{
 }> = {
   path: `/amendment/:identifier`,
 }
+
+export const MPT_ROUTE: RouteDefinition<{
+  id: string
+}> = {
+  path: '/mpt/:id',
+}
diff --git a/src/containers/Header/Search.tsx b/src/containers/Header/Search.tsx
index 98eed5b17..65f45e3f7 100644
--- a/src/containers/Header/Search.tsx
+++ b/src/containers/Header/Search.tsx
@@ -14,9 +14,10 @@ import {
   CURRENCY_REGEX,
   DECIMAL_REGEX,
   FULL_CURRENCY_REGEX,
-  HASH_REGEX,
+  HASH256_REGEX,
   VALIDATORS_REGEX,
   CTID_REGEX,
+  HASH192_REGEX,
 } from '../shared/utils'
 import './search.scss'
 import { isValidPayString } from '../../rippled/payString'
@@ -30,6 +31,7 @@ import {
   TOKEN_ROUTE,
   TRANSACTION_ROUTE,
   VALIDATOR_ROUTE,
+  MPT_ROUTE,
 } from '../App/routes'
 
 const determineHashType = async (id: string, rippledContext: XrplClient) => {
@@ -60,7 +62,7 @@ const getRoute = async (
       path: buildPath(ACCOUNT_ROUTE, { id: normalizeAccount(id) }),
     }
   }
-  if (HASH_REGEX.test(id)) {
+  if (HASH256_REGEX.test(id)) {
     // Transactions and NFTs share the same syntax
     // We must make an api call to ensure if it's one or the other
     const type = await determineHashType(id, rippledContext)
@@ -76,6 +78,12 @@ const getRoute = async (
       type,
     }
   }
+  if (HASH192_REGEX.test(id)) {
+    return {
+      path: buildPath(MPT_ROUTE, { id: id.toUpperCase() }),
+      type: 'mpt',
+    }
+  }
   if (isValidXAddress(id) || isValidClassicAddress(id.split(':')[0])) {
     return {
       type: 'accounts',
diff --git a/src/containers/Header/test/Search.test.js b/src/containers/Header/test/Search.test.js
index c694eab6b..027075dfc 100644
--- a/src/containers/Header/test/Search.test.js
+++ b/src/containers/Header/test/Search.test.js
@@ -83,6 +83,8 @@ describe('Search component', () => {
 
     const nftoken =
       '000800011C7D8ED1D715A0017E41BF9499ECC17E7FB666320000099B00000000'
+
+    const mptoken = '00002AF2588C244FE5F74BF48B5C5E2823235B243AA34634'
     const invalidString = '123invalid'
 
     // mock getNFTInfo api to test transactions and nfts
@@ -167,6 +169,8 @@ describe('Search component', () => {
 
     // handle lower case ctid
     await testValue(ctid.toLowerCase(), `/transactions/${ctid}`)
+
+    await testValue(mptoken, `/mpt/${mptoken}`)
     wrapper.unmount()
   })
 
diff --git a/src/containers/Ledger/index.tsx b/src/containers/Ledger/index.tsx
index 840a6059d..a1ec8eea6 100644
--- a/src/containers/Ledger/index.tsx
+++ b/src/containers/Ledger/index.tsx
@@ -14,7 +14,7 @@ import {
   NOT_FOUND,
   BAD_REQUEST,
   DECIMAL_REGEX,
-  HASH_REGEX,
+  HASH256_REGEX,
 } from '../shared/utils'
 
 import LeftArrow from '../shared/images/ic_left_arrow.svg'
@@ -69,7 +69,7 @@ export const Ledger = () => {
   } = useQuery(['ledger', identifier], () => {
     if (
       !DECIMAL_REGEX.test(identifier.toString()) &&
-      !HASH_REGEX.test(identifier.toString())
+      !HASH256_REGEX.test(identifier.toString())
     ) {
       return Promise.reject(BAD_REQUEST)
     }
diff --git a/src/containers/MPT/MPT.tsx b/src/containers/MPT/MPT.tsx
new file mode 100644
index 000000000..83e55e443
--- /dev/null
+++ b/src/containers/MPT/MPT.tsx
@@ -0,0 +1,75 @@
+import { FC, PropsWithChildren, useEffect, useState } from 'react'
+import { useParams } from 'react-router'
+import { Helmet } from 'react-helmet-async'
+import NoMatch from '../NoMatch'
+import { MPTHeader } from './MPTHeader/MPTHeader'
+import { useAnalytics } from '../shared/analytics'
+import { NOT_FOUND, BAD_REQUEST } from '../shared/utils'
+import { ErrorMessage } from '../shared/Interfaces'
+import './styles.scss'
+
+const ERROR_MESSAGES: { [code: number]: ErrorMessage } = {
+  [NOT_FOUND]: {
+    title: 'assets.no_mpts_message',
+    hints: ['check_mpt_id'],
+  },
+  [BAD_REQUEST]: {
+    title: 'invalid_xrpl_address',
+    hints: ['check_mpt_id'],
+  },
+}
+
+const DEFAULT_ERROR: ErrorMessage = {
+  title: 'generic_error',
+  hints: ['not_your_fault'],
+}
+
+const getErrorMessage = (error: any) => ERROR_MESSAGES[error] ?? DEFAULT_ERROR
+
+const Page: FC<PropsWithChildren<{ tokenId: string }>> = ({
+  tokenId,
+  children,
+}) => (
+  <div className="mpt-page">
+    <Helmet title={`MPT ${tokenId.substr(0, 12)}...`} />
+    {children}
+  </div>
+)
+
+export const MPT = () => {
+  const { trackScreenLoaded } = useAnalytics()
+  const { id: tokenId = '' } = useParams<{ id: string }>()
+  const [error, setError] = useState<number | null>(null)
+
+  useEffect(() => {
+    trackScreenLoaded({
+      mpt_issuance_id: tokenId,
+    })
+    return () => {
+      window.scrollTo(0, 0)
+    }
+  }, [tokenId, trackScreenLoaded])
+
+  const renderError = () => {
+    const message = getErrorMessage(error)
+    return (
+      <div className="token-page">
+        <NoMatch title={message.title} hints={message.hints} />
+      </div>
+    )
+  }
+
+  if (error) {
+    return <Page tokenId={tokenId}>{renderError()}</Page>
+  }
+  return (
+    <Page tokenId={tokenId}>
+      {tokenId && <MPTHeader tokenId={tokenId} setError={setError} />}
+      {!tokenId && (
+        <div className="mpt-warning">
+          <h2>Enter a MPT Issuance ID in the search box</h2>
+        </div>
+      )}
+    </Page>
+  )
+}
diff --git a/src/containers/MPT/MPTHeader/Details.tsx b/src/containers/MPT/MPTHeader/Details.tsx
new file mode 100644
index 000000000..b980380c0
--- /dev/null
+++ b/src/containers/MPT/MPTHeader/Details.tsx
@@ -0,0 +1,48 @@
+import { useTranslation } from 'react-i18next'
+import './styles.scss'
+import { useLanguage } from '../../shared/hooks'
+import { localizeNumber } from '../../shared/utils'
+import { MPTIssuanceFormattedInfo } from '../../shared/Interfaces'
+import { TokenTableRow } from '../../shared/components/TokenTableRow'
+
+interface Props {
+  data: MPTIssuanceFormattedInfo
+}
+
+export const Details = ({ data }: Props) => {
+  const {
+    assetScale,
+    maxAmt,
+    outstandingAmt,
+    transferFee,
+    sequence,
+    metadata,
+  } = data
+  const { t } = useTranslation()
+  const language = useLanguage()
+  const formattedFee =
+    transferFee &&
+    `${localizeNumber((transferFee / 1000).toPrecision(5), language, {
+      minimumFractionDigits: 3,
+    })}%`
+
+  return (
+    <table className="token-table">
+      <tbody>
+        {assetScale && (
+          <TokenTableRow label={t('asset_scale')} value={assetScale} />
+        )}
+        {maxAmt && <TokenTableRow label={t('max_amount')} value={maxAmt} />}
+        {outstandingAmt && (
+          <TokenTableRow
+            label={t('outstanding_amount')}
+            value={outstandingAmt}
+          />
+        )}
+        <TokenTableRow label={t('transfer_fee')} value={formattedFee ?? '0%'} />
+        <TokenTableRow label={t('sequence_number_short')} value={sequence} />
+        {metadata && <TokenTableRow label={t('metadata')} value={metadata} />}
+      </tbody>
+    </table>
+  )
+}
diff --git a/src/containers/MPT/MPTHeader/MPTHeader.tsx b/src/containers/MPT/MPTHeader/MPTHeader.tsx
new file mode 100644
index 000000000..354268991
--- /dev/null
+++ b/src/containers/MPT/MPTHeader/MPTHeader.tsx
@@ -0,0 +1,117 @@
+import { useEffect, useContext, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useQuery } from 'react-query'
+import { Loader } from '../../shared/components/Loader'
+import './styles.scss'
+import SocketContext from '../../shared/SocketContext'
+import { Tooltip, TooltipInstance } from '../../shared/components/Tooltip'
+import { BAD_REQUEST, HASH192_REGEX } from '../../shared/utils'
+import { Account } from '../../shared/components/Account'
+import { useAnalytics } from '../../shared/analytics'
+import { getMPTIssuance } from '../../../rippled/lib/rippled'
+import { formatMPTIssuanceInfo } from '../../../rippled/lib/utils'
+import { MPTIssuanceFormattedInfo } from '../../shared/Interfaces'
+import { Details } from './Details'
+import { Settings } from './Settings'
+
+interface Props {
+  tokenId: string
+  setError: (error: number | null) => void
+}
+
+export const MPTHeader = (props: Props) => {
+  const { t } = useTranslation()
+  const { tokenId, setError } = props
+  const rippledSocket = useContext(SocketContext)
+  const { trackException } = useAnalytics()
+  const [tooltip, setTooltip] = useState<TooltipInstance | undefined>(undefined)
+
+  const { data, isFetching: loading } = useQuery<MPTIssuanceFormattedInfo>(
+    ['getMPTIssuance', tokenId],
+    async () => {
+      const info = await getMPTIssuance(rippledSocket, tokenId)
+      return formatMPTIssuanceInfo(info)
+    },
+    {
+      onError: (e: any) => {
+        trackException(`mptIssuance ${tokenId} --- ${JSON.stringify(e)}`)
+        setError(e.code)
+      },
+    },
+  )
+
+  useEffect(() => {
+    if (!HASH192_REGEX.test(tokenId)) {
+      setError(BAD_REQUEST)
+    }
+  }, [setError, tokenId])
+
+  const showTooltip = (event: any, d: any) => {
+    setTooltip({
+      data: d,
+      mode: 'mptId',
+      x: event.currentTarget.offsetLeft,
+      y: event.currentTarget.offsetTop,
+    })
+  }
+
+  const hideTooltip = () => {
+    setTooltip(undefined)
+  }
+
+  const renderHeaderContent = () => {
+    const { issuer } = data!
+
+    return (
+      <div className="section mpt-header-container">
+        <div className="mpt-info-container">
+          <div className="values">
+            <div className="title">{t('issuer_address')}</div>
+            <div className="value">
+              <div className="mpt-issuer">
+                <Account account={issuer!} />
+              </div>
+            </div>
+          </div>
+        </div>
+        <div className="mpt-bottom-container">
+          <div className="details">
+            <h2>{t('details')}</h2>
+            <Details data={data!} />
+          </div>
+          <div className="settings">
+            <h2 className="title">{t('settings')}</h2>
+            <Settings flags={data!.flags!} />
+          </div>
+        </div>
+      </div>
+    )
+  }
+
+  return (
+    <div className="mpt-token-header">
+      <div className="section">
+        {!loading && (
+          <div className="mpt-box-header">
+            <div className="token-title">
+              MPT Issuance ID
+              <div className="badge">mpt</div>
+            </div>
+            <div
+              className="title-content"
+              onMouseOver={(e) => showTooltip(e, { tokenId })}
+              onFocus={() => {}}
+              onMouseLeave={hideTooltip}
+            >
+              {tokenId}
+            </div>
+          </div>
+        )}
+      </div>
+      <div className="box-content">
+        {loading ? <Loader /> : renderHeaderContent()}
+      </div>
+      <Tooltip tooltip={tooltip} />
+    </div>
+  )
+}
diff --git a/src/containers/MPT/MPTHeader/Settings.tsx b/src/containers/MPT/MPTHeader/Settings.tsx
new file mode 100644
index 000000000..8fadc5333
--- /dev/null
+++ b/src/containers/MPT/MPTHeader/Settings.tsx
@@ -0,0 +1,41 @@
+import './styles.scss'
+import { useTranslation } from 'react-i18next'
+import { TokenTableRow } from '../../shared/components/TokenTableRow'
+
+interface Props {
+  flags: string[]
+}
+
+export const Settings = ({ flags }: Props) => {
+  const { t } = useTranslation()
+
+  const locked = flags.includes('lsfMPTLocked') ? 'enabled' : 'disabled'
+  const canLock = flags.includes('lsfMPTCanLock') ? 'enabled' : 'disabled'
+  const requireAuth = flags.includes('lsfMPTRequireAuth')
+    ? 'enabled'
+    : 'disabled'
+
+  const canEscrow = flags.includes('lsfMPTCanEscrow') ? 'enabled' : 'disabled'
+  const canTrade = flags.includes('lsfMPTCanTrade') ? 'enabled' : 'disabled'
+  const canTransfer = flags.includes('lsfMPTCanTransfer')
+    ? 'enabled'
+    : 'disabled'
+
+  const canClawback = flags.includes('lsfMPTCanClawback')
+    ? 'enabled'
+    : 'disabled'
+
+  return (
+    <table className="token-table">
+      <tbody>
+        <TokenTableRow label={t('locked')} value={locked} />
+        <TokenTableRow label={t('can_lock')} value={canLock} />
+        <TokenTableRow label={t('require_auth')} value={requireAuth} />
+        <TokenTableRow label={t('can_escrow')} value={canEscrow} />
+        <TokenTableRow label={t('can_trade')} value={canTrade} />
+        <TokenTableRow label={t('can_transfer')} value={canTransfer} />
+        <TokenTableRow label={t('can_clawback')} value={canClawback} />
+      </tbody>
+    </table>
+  )
+}
diff --git a/src/containers/MPT/MPTHeader/styles.scss b/src/containers/MPT/MPTHeader/styles.scss
new file mode 100644
index 000000000..fc1b25e01
--- /dev/null
+++ b/src/containers/MPT/MPTHeader/styles.scss
@@ -0,0 +1,144 @@
+@import '../../shared/css/variables';
+@import '../../shared/css/table';
+
+.mpt-header-container {
+  .mpt-bottom-container {
+    display: flex;
+    flex-direction: column;
+    padding-top: 64px;
+
+    @include for-size(desktop-up) {
+      flex-direction: row;
+      padding-top: 80px;
+    }
+
+    .details {
+      width: 100%;
+      @include for-size(desktop-up) {
+        width: 490px;
+      }
+    }
+
+    .settings {
+      width: 100%;
+      @include for-size(desktop-up) {
+        width: 650px;
+      }
+    }
+  }
+
+  .mpt-info-container {
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    margin-top: 68px;
+
+    @include for-size(desktop-up) {
+      flex-direction: row;
+      margin-top: 80px;
+    }
+
+    .values {
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      margin-bottom: 18px;
+      color: $white;
+
+      @include for-size(desktop-up) {
+        flex-direction: column;
+        margin-bottom: 0;
+      }
+
+      .title {
+        padding-bottom: 4px;
+        margin-bottom: 4.5px;
+        color: $black-40;
+        font-size: 14px;
+        text-transform: uppercase;
+        @include semibold;
+      }
+
+      .value {
+        display: flex;
+
+        .mpt-issuer {
+          margin: auto;
+          color: $white;
+          font-size: 18px;
+          font-style: normal;
+          line-height: 125%;
+          text-align: right;
+          text-decoration: none;
+          @include bold;
+        }
+
+        .copy {
+          width: 24px;
+          height: 24px;
+          flex: none;
+          flex-grow: 0;
+          order: 1;
+          margin-left: 10px;
+        }
+      }
+    }
+  }
+}
+
+.mpt-token-header {
+  width: 100%;
+  margin-bottom: 16px;
+
+  .mpt-box-header {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+    margin-top: 0;
+    text-align: left;
+
+    .title-content {
+      overflow: hidden;
+      width: 100%;
+      min-width: 0;
+      min-height: 0;
+      padding-top: 0;
+      margin-top: 0;
+      margin-bottom: 0;
+      color: $white;
+      font-size: 24px;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+      @include bold;
+    }
+
+    .token-title {
+      display: flex;
+      flex-direction: row;
+      align-items: center;
+      padding-bottom: 4px;
+      color: $black-40;
+      font-size: 14px;
+      text-transform: uppercase;
+
+      @include semibold;
+
+      .badge {
+        background: $mpt;
+        color: $white;
+      }
+    }
+
+    img {
+      width: 24px;
+      height: 24px;
+      margin-left: 16px;
+      object-fit: contain;
+    }
+  }
+
+  .box-content {
+    min-height: 100px;
+    padding-bottom: 20px;
+  }
+}
diff --git a/src/containers/MPT/MPTHeader/test/Details.test.js b/src/containers/MPT/MPTHeader/test/Details.test.js
new file mode 100644
index 000000000..9ccd42740
--- /dev/null
+++ b/src/containers/MPT/MPTHeader/test/Details.test.js
@@ -0,0 +1,58 @@
+import { mount } from 'enzyme'
+import { I18nextProvider } from 'react-i18next'
+import { BrowserRouter } from 'react-router-dom'
+import { Details } from '../Details'
+import i18n from '../../../../i18n/testConfig'
+
+describe('MPT Details container', () => {
+  const dataDefault = {
+    issuer: 'r3SnSE9frruxwsC9qGHFiUJShda62fNFGQ',
+    assetScale: 2,
+    maxAmt: '256',
+    outstandingAmt: '64',
+    transferFee: 3,
+    sequence: 3949,
+    metadata: 'https://www.google.com/',
+    flags: ['lsfMPTCanClawback', 'lsfMPTCanTransfer'],
+  }
+
+  const createWrapper = (data = dataDefault) =>
+    mount(
+      <I18nextProvider i18n={i18n}>
+        <BrowserRouter>
+          <Details data={data} />
+        </BrowserRouter>
+      </I18nextProvider>,
+    )
+
+  it('renders without crashing', () => {
+    const wrapper = createWrapper()
+    wrapper.unmount()
+  })
+
+  it('renders defined fields', () => {
+    const wrapper = createWrapper()
+    expect(wrapper.find('.row').length).toEqual(6)
+
+    expect(wrapper.find('.row').at(0).html()).toBe(
+      '<tr class="row"><td class="col1">asset_scale</td><td class="col2">2</td></tr>',
+    )
+    expect(wrapper.find('.row').at(1).html()).toBe(
+      '<tr class="row"><td class="col1">max_amount</td><td class="col2">256</td></tr>',
+    )
+    expect(wrapper.find('.row').at(2).html()).toBe(
+      '<tr class="row"><td class="col1">outstanding_amount</td><td class="col2">64</td></tr>',
+    )
+    expect(wrapper.find('.row').at(3).html()).toBe(
+      '<tr class="row"><td class="col1">transfer_fee</td><td class="col2">0.003%</td></tr>',
+    )
+    expect(wrapper.find('.row').at(4).html()).toBe(
+      '<tr class="row"><td class="col1">sequence_number_short</td><td class="col2">3949</td></tr>',
+    )
+    expect(wrapper.find('.row').at(5).html()).toBe(
+      '<tr class="row"><td class="col1">metadata</td><td class="col2">https://www.google.com/</td></tr>',
+    )
+
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/MPT/MPTHeader/test/MPTHeader.test.js b/src/containers/MPT/MPTHeader/test/MPTHeader.test.js
new file mode 100644
index 000000000..295110078
--- /dev/null
+++ b/src/containers/MPT/MPTHeader/test/MPTHeader.test.js
@@ -0,0 +1,82 @@
+import { mount } from 'enzyme'
+import { I18nextProvider } from 'react-i18next'
+import { BrowserRouter } from 'react-router-dom'
+import { useQuery, QueryClientProvider } from 'react-query'
+import { MPTHeader } from '../MPTHeader'
+import i18n from '../../../../i18n/testConfig'
+import { queryClient } from '../../../shared/QueryClient'
+
+const data = {
+  issuer: 'r3SnSE9frruxwsC9qGHFiUJShda62fNFGQ',
+  assetScale: 2,
+  maxAmt: '100',
+  outstandingAmt: '64',
+  transferFee: 3,
+  sequence: 3949,
+  metadata: 'https://www.google.com/',
+  flags: ['lsfMPTCanClawback', 'lsfMPTCanTransfer'],
+}
+
+jest.mock('react-query', () => ({
+  ...jest.requireActual('react-query'),
+  useQuery: jest.fn(),
+}))
+const setError = jest.fn()
+
+describe('MPT header container', () => {
+  const createWrapper = () =>
+    mount(
+      <QueryClientProvider client={queryClient}>
+        <BrowserRouter>
+          <I18nextProvider i18n={i18n}>
+            <MPTHeader
+              tokenId="00000F6D5186FB5C90A8112419BED54193EDC7218835C6F5"
+              setError={setError}
+            />
+          </I18nextProvider>
+        </BrowserRouter>
+      </QueryClientProvider>,
+    )
+
+  it('renders without crashing', async () => {
+    useQuery.mockImplementation(() => ({
+      data,
+      isFetching: false,
+    }))
+    const wrapper = createWrapper()
+    wrapper.unmount()
+  })
+
+  it('renders MPT content', async () => {
+    useQuery.mockImplementation(() => ({
+      data,
+      isFetching: false,
+    }))
+    const wrapper = createWrapper()
+
+    expect(
+      wrapper
+        .text()
+        .includes('00000F6D5186FB5C90A8112419BED54193EDC7218835C6F5'),
+    ).toBe(true)
+    expect(wrapper.text().includes('r3SnSE9frruxwsC9qGHFiUJShda62fNFGQ')).toBe(
+      true,
+    )
+    expect(wrapper.find('Settings').length).toBe(1)
+    expect(wrapper.find('Details').length).toBe(1)
+    wrapper.find('.title-content').first().simulate('mouseOver')
+    expect(wrapper.find('.tooltip').length).toBe(1)
+    wrapper.unmount()
+  })
+
+  it('renders loader', async () => {
+    useQuery.mockImplementation(() => ({
+      data,
+      isFetching: true,
+      error: {},
+    }))
+    const wrapper = createWrapper()
+    expect(wrapper.find('Loader').length).toEqual(1)
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/MPT/MPTHeader/test/Settings.test.js b/src/containers/MPT/MPTHeader/test/Settings.test.js
new file mode 100644
index 000000000..a94ee80af
--- /dev/null
+++ b/src/containers/MPT/MPTHeader/test/Settings.test.js
@@ -0,0 +1,48 @@
+import { mount } from 'enzyme'
+import { I18nextProvider } from 'react-i18next'
+import { Settings } from '../Settings'
+import i18n from '../../../../i18n/testConfig'
+
+describe('MPT Setttings container', () => {
+  const flags = ['lsfMPTCanClawback', 'lsfMPTCanTransfer']
+
+  const createWrapper = () =>
+    mount(
+      <I18nextProvider i18n={i18n}>
+        <Settings flags={flags} />
+      </I18nextProvider>,
+    )
+
+  it('renders without crashing', () => {
+    const wrapper = createWrapper()
+    wrapper.unmount()
+  })
+
+  it('renders defined fields', () => {
+    const wrapper = createWrapper()
+    expect(wrapper.find('.row').length).toEqual(7)
+
+    expect(wrapper.find('.row').at(0).html()).toBe(
+      '<tr class="row"><td class="col1">locked</td><td class="col2">disabled</td></tr>',
+    )
+    expect(wrapper.find('.row').at(1).html()).toBe(
+      '<tr class="row"><td class="col1">can_lock</td><td class="col2">disabled</td></tr>',
+    )
+    expect(wrapper.find('.row').at(2).html()).toBe(
+      '<tr class="row"><td class="col1">require_auth</td><td class="col2">disabled</td></tr>',
+    )
+    expect(wrapper.find('.row').at(3).html()).toBe(
+      '<tr class="row"><td class="col1">can_escrow</td><td class="col2">disabled</td></tr>',
+    )
+    expect(wrapper.find('.row').at(4).html()).toBe(
+      '<tr class="row"><td class="col1">can_trade</td><td class="col2">disabled</td></tr>',
+    )
+    expect(wrapper.find('.row').at(5).html()).toBe(
+      '<tr class="row"><td class="col1">can_transfer</td><td class="col2">enabled</td></tr>',
+    )
+    expect(wrapper.find('.row').at(6).html()).toBe(
+      '<tr class="row"><td class="col1">can_clawback</td><td class="col2">enabled</td></tr>',
+    )
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/MPT/styles.scss b/src/containers/MPT/styles.scss
new file mode 100644
index 000000000..51c0c4fc3
--- /dev/null
+++ b/src/containers/MPT/styles.scss
@@ -0,0 +1,15 @@
+@import '../shared/css/variables';
+
+.mpt-page {
+  width: 100%;
+  margin-top: 100px;
+
+  .loader {
+    min-height: 100px;
+  }
+}
+
+.mpt-warning {
+  font-size: 14px;
+  text-align: center;
+}
diff --git a/src/containers/MPT/test/MPT.test.js b/src/containers/MPT/test/MPT.test.js
new file mode 100644
index 000000000..ae924fc10
--- /dev/null
+++ b/src/containers/MPT/test/MPT.test.js
@@ -0,0 +1,46 @@
+import * as React from 'react'
+import { mount } from 'enzyme'
+import { Route } from 'react-router-dom'
+import { MPT } from '../MPT'
+import i18n from '../../../i18n/testConfig'
+import { QuickHarness } from '../../test/utils'
+import { MPT_ROUTE } from '../../App/routes'
+
+describe('MPT container', () => {
+  const mptID = '00000F6D5186FB5C90A8112419BED54193EDC7218835C6F5'
+
+  const createWrapper = (mpt = undefined) =>
+    mount(
+      <QuickHarness i18n={i18n} initialEntries={[`/mpt/${mpt}`]}>
+        <Route path={MPT_ROUTE.path} element={<MPT />} />
+      </QuickHarness>,
+    )
+
+  it('renders without crashing', () => {
+    const wrapper = createWrapper(mptID)
+    wrapper.unmount()
+  })
+
+  it('renders children', () => {
+    const wrapper = createWrapper(mptID)
+    expect(wrapper.find('MPTHeader').length).toBe(1)
+    wrapper.unmount()
+  })
+
+  it('does not render when no mpt provided', () => {
+    const wrapper = createWrapper()
+    expect(wrapper.find('MPTHeader').length).toBe(0)
+    wrapper.unmount()
+  })
+
+  it('renders error', () => {
+    jest.mock('../MPTHeader/MPTHeader', () => ({
+      NFTHeader: ({ setError }) => {
+        setError(404)
+      },
+    }))
+
+    const wrapper = createWrapper('something')
+    expect(wrapper.find('NoMatch').length).toBe(1)
+  })
+})
diff --git a/src/containers/NFT/NFTHeader/NFTHeader.tsx b/src/containers/NFT/NFTHeader/NFTHeader.tsx
index 1a46f7ac6..d53e2c233 100644
--- a/src/containers/NFT/NFTHeader/NFTHeader.tsx
+++ b/src/containers/NFT/NFTHeader/NFTHeader.tsx
@@ -7,7 +7,7 @@ import SocketContext from '../../shared/SocketContext'
 import { Tooltip, TooltipInstance } from '../../shared/components/Tooltip'
 import { getNFTInfo, getAccountInfo } from '../../../rippled/lib/rippled'
 import { formatNFTInfo, formatAccountInfo } from '../../../rippled/lib/utils'
-import { localizeDate, BAD_REQUEST, HASH_REGEX } from '../../shared/utils'
+import { localizeDate, BAD_REQUEST, HASH256_REGEX } from '../../shared/utils'
 import { Details } from './Details'
 import { Settings } from './Settings'
 import { Account } from '../../shared/components/Account'
@@ -56,7 +56,7 @@ export const NFTHeader = (props: Props) => {
   )
 
   useEffect(() => {
-    if (!HASH_REGEX.test(tokenId)) {
+    if (!HASH256_REGEX.test(tokenId)) {
       setError(BAD_REQUEST)
     }
   }, [setError, tokenId])
diff --git a/src/containers/Transactions/DetailTab/Meta/MPToken.jsx b/src/containers/Transactions/DetailTab/Meta/MPToken.jsx
new file mode 100644
index 000000000..b94856e40
--- /dev/null
+++ b/src/containers/Transactions/DetailTab/Meta/MPToken.jsx
@@ -0,0 +1,43 @@
+import { Trans } from 'react-i18next'
+import { Account } from '../../../shared/components/Account'
+import { computeMPTokenBalanceChange } from '../../../shared/utils'
+
+const render = (t, language, action, node, index) => {
+  const { previousBalance, finalBalance, account, change } =
+    computeMPTokenBalanceChange(node)
+  const previousBalanceStr = previousBalance.toString(10)
+  const finalBalanceStr = finalBalance.toString(10)
+  const changeStr = change.toString(10)
+
+  const line1 = (
+    <Trans i18nKey="transaction_mptoken_line_one">
+      It {action} an MPToken node of
+      <Account account={account} />
+    </Trans>
+  )
+
+  const line2 =
+    change !== BigInt(0) ? (
+      <ul key={`balance_${index}`} className="meta-line">
+        <li>
+          <Trans i18nKey="transaction_balance_line_two">
+            Balance changed by
+            <b>{changeStr}</b>
+            from
+            <b>{previousBalanceStr}</b>
+            to
+            <b>{finalBalanceStr}</b>
+          </Trans>
+        </li>
+      </ul>
+    ) : null
+
+  return (
+    <li key={`mptoken_${action}_${index}`} className="meta-line">
+      {line1}
+      {line2}
+    </li>
+  )
+}
+
+export default render
diff --git a/src/containers/Transactions/DetailTab/Meta/MPTokenIssuance.jsx b/src/containers/Transactions/DetailTab/Meta/MPTokenIssuance.jsx
new file mode 100644
index 000000000..99305b59c
--- /dev/null
+++ b/src/containers/Transactions/DetailTab/Meta/MPTokenIssuance.jsx
@@ -0,0 +1,43 @@
+import { Trans } from 'react-i18next'
+import { Account } from '../../../shared/components/Account'
+import { computeMPTIssuanceBalanceChange } from '../../../shared/utils'
+
+const render = (t, language, action, node, index) => {
+  const { previousBalance, finalBalance, account, change } =
+    computeMPTIssuanceBalanceChange(node)
+  const previousBalanceStr = previousBalance.toString(10)
+  const finalBalanceStr = finalBalance.toString(10)
+  const changeStr = change.toString(10)
+
+  const line1 = (
+    <Trans i18nKey="transaction_mpt_issuance_line_one">
+      It {action} an MPTokenIssuance node of
+      <Account account={account} />
+    </Trans>
+  )
+
+  const line2 =
+    change !== BigInt(0) ? (
+      <ul key={`balance_${index}`} className="meta-line">
+        <li>
+          <Trans i18nKey="transaction_outstanding_balance_line_two">
+            Outstanding balance changed by
+            <b>{changeStr}</b>
+            from
+            <b>{previousBalanceStr}</b>
+            to
+            <b>{finalBalanceStr}</b>
+          </Trans>
+        </li>
+      </ul>
+    ) : null
+
+  return (
+    <li key={`mpt_issuance_${action}_${index}`} className="meta-line">
+      {line1}
+      {line2}
+    </li>
+  )
+}
+
+export default render
diff --git a/src/containers/Transactions/DetailTab/Meta/RippleState.jsx b/src/containers/Transactions/DetailTab/Meta/RippleState.jsx
index 6d50ce114..2ea9539eb 100644
--- a/src/containers/Transactions/DetailTab/Meta/RippleState.jsx
+++ b/src/containers/Transactions/DetailTab/Meta/RippleState.jsx
@@ -1,6 +1,9 @@
 import { Trans } from 'react-i18next'
 import { Account } from '../../../shared/components/Account'
-import { localizeNumber, computeBalanceChange } from '../../../shared/utils'
+import {
+  localizeNumber,
+  computeRippleStateBalanceChange,
+} from '../../../shared/utils'
 
 const render = (t, language, action, node, index) => {
   const {
@@ -11,7 +14,7 @@ const render = (t, language, action, node, index) => {
     currency,
     account,
     counterAccount,
-  } = computeBalanceChange(node)
+  } = computeRippleStateBalanceChange(node)
 
   const line1 = (
     <Trans i18nKey="transaction_balance_line_one">
diff --git a/src/containers/Transactions/DetailTab/Meta/index.tsx b/src/containers/Transactions/DetailTab/Meta/index.tsx
index 24335e480..a7a6cc226 100644
--- a/src/containers/Transactions/DetailTab/Meta/index.tsx
+++ b/src/containers/Transactions/DetailTab/Meta/index.tsx
@@ -5,6 +5,8 @@ import renderDirectoryNode from './DirectoryNode'
 import renderOffer from './Offer'
 import renderRippleState from './RippleState'
 import renderPayChannel from './PayChannel'
+import renderMPToken from './MPToken'
+import renderMPTokenIssuance from './MPTokenIssuance'
 import { groupAffectedNodes } from '../../../shared/transactionUtils'
 import { useLanguage } from '../../../shared/hooks'
 
@@ -31,6 +33,10 @@ export const TransactionMeta: FC<{ data: any }> = ({ data }) => {
           return renderRippleState(t, language, action, node, index)
         case 'PayChannel':
           return renderPayChannel(t, language, action, node, index)
+        case 'MPTokenIssuance':
+          return renderMPTokenIssuance(t, language, action, node, index)
+        case 'MPToken':
+          return renderMPToken(t, language, action, node, index)
         default:
           return renderDefault(t, action, node, index)
       }
diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index fa34e0e4f..2918e7674 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -6,7 +6,12 @@ import { useWindowSize } from 'usehooks-ts'
 import NoMatch from '../NoMatch'
 import { Loader } from '../shared/components/Loader'
 import { Tabs } from '../shared/components/Tabs'
-import { NOT_FOUND, BAD_REQUEST, HASH_REGEX, CTID_REGEX } from '../shared/utils'
+import {
+  NOT_FOUND,
+  BAD_REQUEST,
+  HASH256_REGEX,
+  CTID_REGEX,
+} from '../shared/utils'
 import { SimpleTab } from './SimpleTab'
 import { DetailTab } from './DetailTab'
 import './transaction.scss'
@@ -54,7 +59,7 @@ export const Transaction = () => {
       if (identifier === '') {
         return undefined
       }
-      if (HASH_REGEX.test(identifier) || CTID_REGEX.test(identifier)) {
+      if (HASH256_REGEX.test(identifier) || CTID_REGEX.test(identifier)) {
         return getTransaction(identifier, rippledSocket).catch(
           (transactionRequestError) => {
             const status = transactionRequestError.code
diff --git a/src/containers/Transactions/test/Description.test.tsx b/src/containers/Transactions/test/Description.test.tsx
index 04ae40ccb..4c6074494 100644
--- a/src/containers/Transactions/test/Description.test.tsx
+++ b/src/containers/Transactions/test/Description.test.tsx
@@ -1,19 +1,23 @@
 import { mount } from 'enzyme'
 import { BrowserRouter as Router } from 'react-router-dom'
 import { I18nextProvider } from 'react-i18next'
+import { QueryClientProvider } from 'react-query'
 import i18n from '../../../i18n/testConfigEnglish'
 import { TransactionDescription } from '../DetailTab/Description'
 import Transaction from './mock_data/Transaction.json'
 import OfferCreateTicket from './mock_data/OfferCreateTicket.json'
 import EmittedPayment from './mock_data/EmittedPayment.json'
+import { queryClient } from '../../shared/QueryClient'
 
 describe('Description container', () => {
   const createWrapper = (data = {}) =>
     mount(
       <Router>
-        <I18nextProvider i18n={i18n}>
-          <TransactionDescription data={data} />
-        </I18nextProvider>
+        <QueryClientProvider client={queryClient}>
+          <I18nextProvider i18n={i18n}>
+            <TransactionDescription data={data} />
+          </I18nextProvider>
+        </QueryClientProvider>
       </Router>,
     )
 
diff --git a/src/containers/Transactions/test/DetailTab.test.tsx b/src/containers/Transactions/test/DetailTab.test.tsx
index 0e734c06c..46ff5488c 100644
--- a/src/containers/Transactions/test/DetailTab.test.tsx
+++ b/src/containers/Transactions/test/DetailTab.test.tsx
@@ -1,6 +1,7 @@
 import { mount } from 'enzyme'
 import { BrowserRouter as Router } from 'react-router-dom'
 import { I18nextProvider } from 'react-i18next'
+import { QueryClientProvider } from 'react-query'
 import Transaction from '../../shared/components/Transaction/EscrowCreate/test/mock_data/EscrowCreate.json'
 import FailedTransaction from '../../shared/components/Transaction/SignerListSet/test/mock_data/SignerListSet.json'
 import HookPayment from './mock_data/HookPayment.json'
@@ -8,14 +9,17 @@ import EmittedPayment from './mock_data/EmittedPayment.json'
 import { DetailTab } from '../DetailTab'
 import i18n from '../../../i18n/testConfigEnglish'
 import { convertHexToString } from '../../../rippled/lib/utils'
+import { queryClient } from '../../shared/QueryClient'
 
 describe('DetailTab container', () => {
   const createWrapper = (transaction: any = Transaction) =>
     mount(
       <Router>
-        <I18nextProvider i18n={i18n}>
-          <DetailTab data={transaction} />
-        </I18nextProvider>
+        <QueryClientProvider client={queryClient}>
+          <I18nextProvider i18n={i18n}>
+            <DetailTab data={transaction} />
+          </I18nextProvider>
+        </QueryClientProvider>
       </Router>,
     )
 
diff --git a/src/containers/Transactions/test/Meta.test.tsx b/src/containers/Transactions/test/Meta.test.tsx
index e6e2fe903..ac4195799 100644
--- a/src/containers/Transactions/test/Meta.test.tsx
+++ b/src/containers/Transactions/test/Meta.test.tsx
@@ -6,6 +6,7 @@ import Transaction from './mock_data/Transaction.json'
 import OfferCancel from '../../shared/components/Transaction/OfferCancel/test/mock_data/OfferCancel.json'
 import OfferCreateWithMissingPreviousFields from '../../shared/components/Transaction/OfferCreate/test/mock_data/OfferCreateWithMissingPreviousFields.json'
 import PaymentChannelClaim from '../../shared/components/Transaction/PaymentChannelClaim/test/mock_data/PaymentChannelClaim.json'
+import DirectMPTPayment from './mock_data/DirectMPTPayment.json'
 import { TransactionMeta } from '../DetailTab/Meta'
 
 describe('TransactionMeta container', () => {
@@ -160,4 +161,32 @@ describe('TransactionMeta container', () => {
     )
     expect(w.find('li').length).toBe(4)
   })
+
+  it('renders MPT Payment Meta', () => {
+    const w = createWrapper(DirectMPTPayment)
+
+    expect(w.find('.title').length).toBe(1)
+    expect(w.find('.detail-subsection').length).toBe(1)
+    expect(w.contains(<div>number_of_affected_node</div>)).toBe(true)
+    expect(w.contains(<div className="detail-subtitle">nodes_type</div>)).toBe(
+      true,
+    )
+    expect(w.find('li').length).toBe(6)
+
+    expect(w.find('li').at(2).html()).toBe(
+      '<li class="meta-line">It modified an MPToken node of<a title="rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d" class="account" href="/accounts/rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d">rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d</a><ul class="meta-line"><li>Balance changed by<b>100</b>from<b>0</b>to<b>100</b></li></ul></li>',
+    )
+
+    expect(w.find('li').at(3).html()).toBe(
+      '<li>Balance changed by<b>100</b>from<b>0</b>to<b>100</b></li>',
+    )
+
+    expect(w.find('li').at(4).html()).toBe(
+      '<li class="meta-line">It modified an MPTokenIssuance node of<a title="rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw" class="account" href="/accounts/rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw">rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw</a><ul class="meta-line"><li>Outstanding balance changed by<b>100</b>from<b>0</b>to<b>100</b></li></ul></li>',
+    )
+
+    expect(w.find('li').at(5).html()).toBe(
+      '<li>Outstanding balance changed by<b>100</b>from<b>0</b>to<b>100</b></li>',
+    )
+  })
 })
diff --git a/src/containers/Transactions/test/SimpleTab.test.tsx b/src/containers/Transactions/test/SimpleTab.test.tsx
index 8fe7794eb..652ded5b7 100644
--- a/src/containers/Transactions/test/SimpleTab.test.tsx
+++ b/src/containers/Transactions/test/SimpleTab.test.tsx
@@ -2,23 +2,27 @@ import { mount } from 'enzyme'
 import { I18nextProvider } from 'react-i18next'
 import { BrowserRouter as Router } from 'react-router-dom'
 
+import { QueryClientProvider } from 'react-query'
 import EnableAmendment from './mock_data/EnableAmendment.json'
 import Payment from '../../shared/components/Transaction/Payment/test/mock_data/Payment.json'
 import { SimpleTab } from '../SimpleTab'
 import summarize from '../../../rippled/lib/txSummary'
 import i18n from '../../../i18n/testConfig'
 import { expectSimpleRowText } from '../../shared/components/Transaction/test'
+import { queryClient } from '../../shared/QueryClient'
 
 describe('SimpleTab container', () => {
   const createWrapper = (tx, width = 1200) =>
     mount(
       <Router>
-        <I18nextProvider i18n={i18n}>
-          <SimpleTab
-            data={{ processed: tx, summary: summarize(tx, true).details }}
-            width={width}
-          />
-        </I18nextProvider>
+        <QueryClientProvider client={queryClient}>
+          <I18nextProvider i18n={i18n}>
+            <SimpleTab
+              data={{ processed: tx, summary: summarize(tx, true).details }}
+              width={width}
+            />
+          </I18nextProvider>
+        </QueryClientProvider>
       </Router>,
     )
 
diff --git a/src/containers/Transactions/test/mock_data/DirectMPTPayment.json b/src/containers/Transactions/test/mock_data/DirectMPTPayment.json
new file mode 100644
index 000000000..87d3c374b
--- /dev/null
+++ b/src/containers/Transactions/test/mock_data/DirectMPTPayment.json
@@ -0,0 +1,95 @@
+{
+  "tx": {
+    "Account": "rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw",
+    "Amount": {
+      "mpt_issuance_id": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3",
+      "value": "100"
+    },
+    "DeliverMax": {
+      "mpt_issuance_id": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3",
+      "value": "100"
+    },
+    "Destination": "rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d",
+    "Fee": "10",
+    "Flags": 2147483648,
+    "Sequence": 12317,
+    "SigningPubKey": "ED1E43F90700506F98E45CC8E77563ACB8FF0338739229AC98F0E1AEB409E786F9",
+    "TransactionType": "Payment",
+    "TxnSignature": "9949EF3E718A6776586A1DD91256C4055E761CBF1CE7A351912C08FE1BB415F6638FA096CAAE88D30B32E684448CDC52DEB022A7E3576AFA0C6E5ABB7BE2FE02",
+    "ctid": "C000302000000000",
+    "date": 1712087804000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 12318
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "80909CC95DCD7E5E08631635C559E218D42C49721A1285192885B46E4737CF60",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "Sequence": 12317
+          },
+          "PreviousTxnID": "C9D0965E7A13F54186B6501D08ED54D74AA946A856D96BF7AAE18EA5FD5E93C2",
+          "PreviousTxnLgrSeq": 12318
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d",
+            "Flags": 0,
+            "MPTAmount": "100",
+            "MPTokenIssuanceID": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3",
+            "OwnerNode": "0"
+          },
+          "LedgerEntryType": "MPToken",
+          "LedgerIndex": "9B2E5EA9ACF16B591B941CAE5323EBED55E42495B16C92DC9FBEC0997E8E6804",
+          "PreviousFields": {},
+          "PreviousTxnID": "4C41449D0C083746CC93DDA78F00E97AB8B857188E805F39C1A250F8C9467982",
+          "PreviousTxnLgrSeq": 12319
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Flags": 64,
+            "Issuer": "rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw",
+            "OutstandingAmount": "100",
+            "OwnerNode": "0",
+            "Sequence": 12316
+          },
+          "LedgerEntryType": "MPTokenIssuance",
+          "LedgerIndex": "C38E54FD2C98FE848FE31CDA95F6F990A9A8715987171DA342A3296B7A9123B6",
+          "PreviousFields": {
+            "OutstandingAmount": "0"
+          },
+          "PreviousTxnID": "C9D0965E7A13F54186B6501D08ED54D74AA946A856D96BF7AAE18EA5FD5E93C2",
+          "PreviousTxnLgrSeq": 12318
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tesSUCCESS",
+    "delivered_amount": {
+      "mpt_issuance_id": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3",
+      "value": "100"
+    }
+  },
+  "hash": "5E74603F7C2E11030E644E681508FD1F24CAEB4CC0CE1F35A6230689D9694E85",
+  "ledger_index": 12320,
+  "date": 1712087804000
+}
diff --git a/src/containers/shared/Interfaces.tsx b/src/containers/shared/Interfaces.tsx
index 201b0daea..83c03903f 100644
--- a/src/containers/shared/Interfaces.tsx
+++ b/src/containers/shared/Interfaces.tsx
@@ -36,6 +36,20 @@ export interface NFTFormattedInfo {
   warnings?: string[]
 }
 
+/**
+ * Values returned by 'formatMPTIssuanceInfo' from /src/rippled/lib/utils.js
+ */
+export interface MPTIssuanceFormattedInfo {
+  issuer: string
+  sequence: number
+  assetScale?: number
+  maxAmt?: string
+  outstandingAmt?: string
+  flags?: string[]
+  transferFee?: number
+  metadata?: string
+}
+
 export interface ErrorMessage {
   title: string
   hints: string[]
diff --git a/src/containers/shared/analytics.ts b/src/containers/shared/analytics.ts
index bff40dcfb..b11d5c349 100644
--- a/src/containers/shared/analytics.ts
+++ b/src/containers/shared/analytics.ts
@@ -27,6 +27,7 @@ export interface AnalyticsFields {
   search_term?: string
   search_category?: string
   validator?: string
+  mpt_issuance_id?: string
 
   description?: string
   page_title?: string
diff --git a/src/containers/shared/components/Amount.tsx b/src/containers/shared/components/Amount.tsx
index 164b06737..e7fe6ecd5 100644
--- a/src/containers/shared/components/Amount.tsx
+++ b/src/containers/shared/components/Amount.tsx
@@ -1,8 +1,15 @@
+import { useQuery } from 'react-query'
+import { useContext } from 'react'
 import { CURRENCY_OPTIONS, XRP_BASE } from '../transactionUtils'
 import { useLanguage } from '../hooks'
-import { localizeNumber } from '../utils'
+import { localizeNumber, convertScaledPrice } from '../utils'
 import Currency from './Currency'
 import { ExplorerAmount } from '../types'
+import { MPTIssuanceFormattedInfo } from '../Interfaces'
+import { getMPTIssuance } from '../../../rippled/lib/rippled'
+import { formatMPTIssuanceInfo } from '../../../rippled/lib/utils'
+import SocketContext from '../SocketContext'
+import { useAnalytics } from '../analytics'
 
 export interface AmountProps {
   value: ExplorerAmount | string
@@ -16,15 +23,17 @@ export const Amount = ({
   value,
 }: AmountProps) => {
   const language = useLanguage()
+  const rippledSocket = useContext(SocketContext)
+  const { trackException } = useAnalytics()
   const issuer = typeof value === 'string' ? undefined : value.issuer
   const currency = typeof value === 'string' ? 'XRP' : value.currency
   const amount =
     typeof value === 'string' ? parseInt(value, 10) / XRP_BASE : value.amount
+  const isMPT = typeof value === 'string' ? false : value.isMPT
 
   const options = { ...CURRENCY_OPTIONS, currency }
-  const localizedAmount = localizeNumber(amount, language, options)
 
-  return (
+  const renderAmount = (localizedAmount) => (
     <span className="amount">
       <span className="amount-localized">
         {modifier && <span className="amount-modifier">{modifier}</span>}
@@ -35,7 +44,43 @@ export const Amount = ({
         currency={currency}
         link
         displaySymbol={false}
+        isMPT={isMPT}
       />
     </span>
   )
+
+  const mptID = isMPT ? (value as ExplorerAmount).currency : null
+
+  // fetch MPTIssuance only if isMPT is true
+  const { data: mptIssuanceData } =
+    useQuery<MPTIssuanceFormattedInfo>(
+      ['getMPTIssuanceScale', mptID],
+      async () => {
+        const info = await getMPTIssuance(rippledSocket, mptID)
+        return formatMPTIssuanceInfo(info)
+      },
+      {
+        onError: (e: any) => {
+          trackException(`mptIssuance ${mptID} --- ${JSON.stringify(e)}`)
+        },
+        enabled: isMPT,
+      },
+    ) || {}
+
+  // if amount is MPT type, we need to fetch the scale from the MPTokenIssuance
+  // object so we can show the scaled amount
+  if (isMPT && typeof value !== 'string') {
+    if (mptIssuanceData) {
+      const scale = mptIssuanceData.assetScale ?? 0
+      const scaledAmount = convertScaledPrice(
+        parseInt(amount as string, 10).toString(16),
+        scale,
+      )
+
+      return renderAmount(localizeNumber(scaledAmount, language, {}, true))
+    }
+    return null
+  }
+
+  return renderAmount(localizeNumber(amount, language, options))
 }
diff --git a/src/containers/shared/components/Currency.tsx b/src/containers/shared/components/Currency.tsx
index 64727ca0a..ac48efa7c 100644
--- a/src/containers/shared/components/Currency.tsx
+++ b/src/containers/shared/components/Currency.tsx
@@ -1,5 +1,5 @@
 import { RouteLink } from '../routing'
-import { TOKEN_ROUTE } from '../../App/routes'
+import { TOKEN_ROUTE, MPT_ROUTE } from '../../App/routes'
 
 // https://xrpl.org/currency-formats.html#nonstandard-currency-codes
 const NON_STANDARD_CODE_LENGTH = 40
@@ -12,6 +12,7 @@ export interface Props {
   link?: boolean
   shortenIssuer?: boolean
   displaySymbol?: boolean
+  isMPT?: boolean
 }
 
 /*
@@ -25,33 +26,46 @@ const Currency = (props: Props) => {
     link = true,
     shortenIssuer = false,
     displaySymbol = true,
+    isMPT = false,
   } = props
+  let content
 
-  const currencyCode =
-    currency?.length === NON_STANDARD_CODE_LENGTH &&
-    currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER
-      ? hexToString(currency)
-      : currency
-
-  let display = `${currencyCode}`
-
-  if (currencyCode === XRP && displaySymbol) {
-    display = `\uE900 ${display}`
-  }
-
-  if (issuer) {
-    display += '.'
-    display += shortenIssuer ? issuer.substring(0, 4) : issuer
-  }
-
-  const content =
-    link && issuer ? (
-      <RouteLink to={TOKEN_ROUTE} params={{ token: `${currency}.${issuer}` }}>
+  if (isMPT) {
+    const display = `MPT (${currency})`
+    content = link ? (
+      <RouteLink to={MPT_ROUTE} params={{ id: currency }}>
         {display}
       </RouteLink>
     ) : (
       display
     )
+  } else {
+    const currencyCode =
+      currency?.length === NON_STANDARD_CODE_LENGTH &&
+      currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER
+        ? hexToString(currency)
+        : currency
+
+    let display = `${currencyCode}`
+
+    if (currencyCode === XRP && displaySymbol) {
+      display = `\uE900 ${display}`
+    }
+
+    if (issuer) {
+      display += '.'
+      display += shortenIssuer ? issuer.substring(0, 4) : issuer
+    }
+
+    content =
+      link && issuer ? (
+        <RouteLink to={TOKEN_ROUTE} params={{ token: `${currency}.${issuer}` }}>
+          {display}
+        </RouteLink>
+      ) : (
+        display
+      )
+  }
 
   return <span className="currency">{content}</span>
 }
diff --git a/src/containers/shared/components/MPTokenLink.tsx b/src/containers/shared/components/MPTokenLink.tsx
new file mode 100644
index 000000000..f1c2198bb
--- /dev/null
+++ b/src/containers/shared/components/MPTokenLink.tsx
@@ -0,0 +1,12 @@
+import { RouteLink } from '../routing'
+import { MPT_ROUTE } from '../../App/routes'
+
+export interface MPTokenLinkProps {
+  tokenID: string
+}
+
+export const MPTokenLink = ({ tokenID }: MPTokenLinkProps) => (
+  <RouteLink title={tokenID} to={MPT_ROUTE} params={{ id: tokenID }}>
+    {tokenID}
+  </RouteLink>
+)
diff --git a/src/containers/shared/components/Tooltip/Tooltip.tsx b/src/containers/shared/components/Tooltip/Tooltip.tsx
index 7154eb8ca..673cd72de 100644
--- a/src/containers/shared/components/Tooltip/Tooltip.tsx
+++ b/src/containers/shared/components/Tooltip/Tooltip.tsx
@@ -91,6 +91,8 @@ export const Tooltip = ({ tooltip }: { tooltip?: TooltipInstance }) => {
     </>
   )
 
+  const renderMPTId = () => <div className="mpt">{data.tokenId}</div>
+
   const { x, y, mode } = tooltip
   const style: CSSProperties = { top: y + PADDING_Y, left: x }
   const modeMap = {
@@ -100,6 +102,7 @@ export const Tooltip = ({ tooltip }: { tooltip?: TooltipInstance }) => {
     missing: renderMissingValidators,
     paystring: renderPayStringToolTip,
     nftId: renderNFTId,
+    mptId: renderMPTId,
   }
 
   return modeMap[mode] ? (
diff --git a/src/containers/shared/components/Transaction/Clawback/Description.tsx b/src/containers/shared/components/Transaction/Clawback/Description.tsx
index ec59c0a96..c92397c35 100644
--- a/src/containers/shared/components/Transaction/Clawback/Description.tsx
+++ b/src/containers/shared/components/Transaction/Clawback/Description.tsx
@@ -6,8 +6,8 @@ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount'
 
 export const Description = ({ data }: TransactionDescriptionProps) => {
   const issuer = data.tx.Account
-  const holder = data.tx.Amount.issuer
   const amount = formatAmount(data.tx.Amount)
+  const holder = amount.isMPT ? data.tx.MPTokenHolder : data.tx.Amount.issuer
   amount.issuer = issuer
   return (
     <>
diff --git a/src/containers/shared/components/Transaction/Clawback/parser.ts b/src/containers/shared/components/Transaction/Clawback/parser.ts
index 0da7126b7..f5ce6f6a0 100644
--- a/src/containers/shared/components/Transaction/Clawback/parser.ts
+++ b/src/containers/shared/components/Transaction/Clawback/parser.ts
@@ -1,7 +1,10 @@
 import { Clawback, ClawbackInstructions } from './types'
 import { TransactionParser } from '../types'
 import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount'
-import { computeBalanceChange } from '../../../utils'
+import {
+  computeRippleStateBalanceChange,
+  computeMPTokenBalanceChange,
+} from '../../../utils'
 
 export const parser: TransactionParser<Clawback, ClawbackInstructions> = (
   tx,
@@ -9,6 +12,37 @@ export const parser: TransactionParser<Clawback, ClawbackInstructions> = (
 ) => {
   const account = tx.Account
   const amount = formatAmount(tx.Amount)
+
+  if (amount.isMPT === true) {
+    const holder = tx.MPTokenHolder
+
+    const filteredMptNode = meta.AffectedNodes.filter(
+      (node: any) => node.ModifiedNode?.LedgerEntryType === 'MPToken',
+    )
+
+    // If no mpt is modified, it means the tx failed.
+    // We just return the amount that was attempted to claw.
+    if (!filteredMptNode || filteredMptNode.length !== 1)
+      return {
+        amount,
+        account,
+        holder,
+      }
+
+    const mptNode = filteredMptNode[0].ModifiedNode
+    const { change } = computeMPTokenBalanceChange(mptNode)
+    amount.amount =
+      BigInt(change) < 0
+        ? BigInt(-change).toString(10)
+        : BigInt(change).toString(10)
+
+    return {
+      account,
+      amount,
+      holder,
+    }
+  }
+
   const holder = amount.issuer
   amount.issuer = account
 
@@ -30,7 +64,7 @@ export const parser: TransactionParser<Clawback, ClawbackInstructions> = (
       holder,
     }
 
-  const { change } = computeBalanceChange(
+  const { change } = computeRippleStateBalanceChange(
     trustlineNode[0].ModifiedNode ?? trustlineNode[0].DeletedNode,
   )
 
diff --git a/src/containers/shared/components/Transaction/Clawback/test/ClawbackSimple.test.tsx b/src/containers/shared/components/Transaction/Clawback/test/ClawbackSimple.test.tsx
index 6110b2b41..1a7e19ee7 100644
--- a/src/containers/shared/components/Transaction/Clawback/test/ClawbackSimple.test.tsx
+++ b/src/containers/shared/components/Transaction/Clawback/test/ClawbackSimple.test.tsx
@@ -1,7 +1,15 @@
+import { useQuery } from 'react-query'
 import { createSimpleWrapperFactory, expectSimpleRowText } from '../../test'
 import { Simple } from '../Simple'
 import transaction from './mock_data/Clawback.json'
 import transactionFailure from './mock_data/Clawback_Failure.json'
+import transactionMPT from './mock_data/ClawbackMPT.json'
+import transactionMPTFailure from './mock_data/ClawbackMPT_Failure.json'
+
+jest.mock('react-query', () => ({
+  ...jest.requireActual('react-query'),
+  useQuery: jest.fn(),
+}))
 
 const createWrapper = createSimpleWrapperFactory(Simple)
 
@@ -17,6 +25,26 @@ describe('Clawback', () => {
     wrapper.unmount()
   })
 
+  it('handles MPT Clawback simple view ', () => {
+    const data = {
+      assetScale: 3,
+    }
+
+    // @ts-ignore
+    useQuery.mockImplementation(() => ({
+      data,
+    }))
+    const wrapper = createWrapper(transactionMPT)
+    expectSimpleRowText(wrapper, 'holder', 'rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD')
+    expectSimpleRowText(
+      wrapper,
+      'amount',
+      '0.05 MPT (00000D668E702F54A27C42EF98C13B0787D1766CC9162A47)',
+    )
+
+    wrapper.unmount()
+  })
+
   it('handles failed Clawback simple view ', () => {
     const wrapper = createWrapper(transactionFailure)
     expectSimpleRowText(wrapper, 'holder', 'rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9')
@@ -27,4 +55,24 @@ describe('Clawback', () => {
     )
     wrapper.unmount()
   })
+
+  it('handles failed MPT Clawback simple view ', () => {
+    const data = {
+      assetScale: 3,
+    }
+
+    // @ts-ignore
+    useQuery.mockImplementation(() => ({
+      data,
+    }))
+    const wrapper = createWrapper(transactionMPTFailure)
+
+    expectSimpleRowText(wrapper, 'holder', 'r9rAqX8Jjo4uACsimYDVsy5thHDPivujqf')
+    expectSimpleRowText(
+      wrapper,
+      'amount',
+      '0.05 MPT (000010952ECE2AFC727F1C67EF568F360A2D92CB7C29FF7C)',
+    )
+    wrapper.unmount()
+  })
 })
diff --git a/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json
new file mode 100644
index 000000000..2a7d4513a
--- /dev/null
+++ b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json
@@ -0,0 +1,85 @@
+{
+  "tx": {
+    "Account": "rDz9LyymZh4C1jJvFK6v6qXeeARLdYKuEW",
+    "Amount": {
+      "mpt_issuance_id": "00000D668E702F54A27C42EF98C13B0787D1766CC9162A47",
+      "value": "50"
+    },
+    "Fee": "10",
+    "Flags": 2147483648,
+    "MPTokenHolder": "rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD",
+    "Sequence": 3432,
+    "SigningPubKey": "ED0C1DE70A8762E6C98EC78CF13D278D6950ECDFE8E87BAD3732730845E2D9AB6A",
+    "TransactionType": "Clawback",
+    "TxnSignature": "8099CED925A463A2A24F55A496D2BB40108B75840770DFBA9796FBBD40AA482126EE9DAF2512D5D2E8268BCBFC277828E66A28CF3394702611290B45FBA88109",
+    "ctid": "C0000D6D00000000",
+    "date": 1728575981000
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rDz9LyymZh4C1jJvFK6v6qXeeARLdYKuEW",
+            "Balance": "99999970",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 3433
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "06A3654A4A8829FD0575ADDD068BD04F7483C407E027CB43F77C2A5CA575368B",
+          "PreviousFields": {
+            "Balance": "99999980",
+            "Sequence": 3432
+          },
+          "PreviousTxnID": "4B6D63C7AA15899EC1CB3D84C923B08A62D6643A75D28B254F7A0C082B2C0D75",
+          "PreviousTxnLgrSeq": 3436
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "AssetScale": 3,
+            "Flags": 98,
+            "Issuer": "rDz9LyymZh4C1jJvFK6v6qXeeARLdYKuEW",
+            "MPTokenMetadata": "7B226E616D65223A2255532054726561737572792042696C6C20546F6B656E222C2273796D626F6C223A225553544254222C22646563696D616C73223A322C22746F74616C537570706C79223A313030303030302C22697373756572223A225553205472656173757279222C22697373756544617465223A22323032342D30332D3235222C226D6174757269747944617465223A22323032352D30332D3235222C226661636556616C7565223A2231303030222C22696E74657265737452617465223A22322E35222C22696E7465726573744672657175656E6379223A22517561727465726C79222C22636F6C6C61746572616C223A22555320476F7665726E6D656E74222C226A7572697364696374696F6E223A22556E6974656420537461746573222C22726567756C61746F7279436F6D706C69616E6365223A2253454320526567756C6174696F6E73222C22736563757269747954797065223A2254726561737572792042696C6C222C2265787465726E616C5F75726C223A2268747470733A2F2F6578616D706C652E636F6D2F742D62696C6C2D746F6B656E2D6D657461646174612E6A736F6E227D",
+            "MaximumAmount": "9223372036854775807",
+            "OutstandingAmount": "50",
+            "OwnerNode": "0",
+            "Sequence": 3430
+          },
+          "LedgerEntryType": "MPTokenIssuance",
+          "LedgerIndex": "0EABDC95DBBC52F8A95A5F49C38211A30B916BC329774F46CC081D502F9E1895",
+          "PreviousFields": {
+            "OutstandingAmount": "100"
+          },
+          "PreviousTxnID": "4B6D63C7AA15899EC1CB3D84C923B08A62D6643A75D28B254F7A0C082B2C0D75",
+          "PreviousTxnLgrSeq": 3436
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD",
+            "Flags": 0,
+            "MPTAmount": "50",
+            "MPTokenIssuanceID": "00000D668E702F54A27C42EF98C13B0787D1766CC9162A47",
+            "OwnerNode": "0"
+          },
+          "LedgerEntryType": "MPToken",
+          "LedgerIndex": "DA40BA069F110465BD90BF5732163836F011E3E761CCF7B6949FAA24D97132F6",
+          "PreviousFields": {
+            "MPTAmount": "100"
+          },
+          "PreviousTxnID": "4B6D63C7AA15899EC1CB3D84C923B08A62D6643A75D28B254F7A0C082B2C0D75",
+          "PreviousTxnLgrSeq": 3436
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tesSUCCESS"
+  },
+  "hash": "46B686335794B911B3B76C2F4B76AF424F9978C3E82B2F6488801C359AA71856",
+  "ledger_index": 3437,
+  "date": 1728575981000
+}
diff --git a/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json
new file mode 100644
index 000000000..b0c7d31c8
--- /dev/null
+++ b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json
@@ -0,0 +1,46 @@
+{
+  "tx": {
+    "Account": "rnGVhdnWv7g3fW8UNJyFHj6eyngsMdwA8c",
+    "Amount": {
+      "mpt_issuance_id": "000010952ECE2AFC727F1C67EF568F360A2D92CB7C29FF7C",
+      "value": "50"
+    },
+    "Fee": "10",
+    "Flags": 2147483648,
+    "MPTokenHolder": "r9rAqX8Jjo4uACsimYDVsy5thHDPivujqf",
+    "Sequence": 4246,
+    "SigningPubKey": "ED4F6FF2241860884D4DD6C5797BDA553155D194F07B1BFC67129F183322DA7DC3",
+    "TransactionType": "Clawback",
+    "TxnSignature": "C54F175F0AFD950507C059E0EA5E6FA0079E7CDE5DF62BB122B56DC34A351C2369E208B31F7C27B1E9D21753506E195B147500D033884C44373899C84A97680B",
+    "ctid": "C000109B00000000",
+    "date": 1728577343000
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rnGVhdnWv7g3fW8UNJyFHj6eyngsMdwA8c",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 4247
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "95A16157D164CD90D64BC94DE3EA7758AE3088391C9AC44AFCAC90C5153D83D5",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "Sequence": 4246
+          },
+          "PreviousTxnID": "8ACD0682CB1EDDCF6C61F15E6B9637D2719FDA2EC32EB384A68F36F0A0297D91",
+          "PreviousTxnLgrSeq": 4248
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tecINSUFFICIENT_FUNDS"
+  },
+  "hash": "26E6E7AEA4F78801EB0408D802FEBA11B962BFD680501DF0D0C58F30C6EA8951",
+  "ledger_index": 4251,
+  "date": 1728577343000
+}
diff --git a/src/containers/shared/components/Transaction/Clawback/types.ts b/src/containers/shared/components/Transaction/Clawback/types.ts
index 81930d4c2..bbfaa9067 100644
--- a/src/containers/shared/components/Transaction/Clawback/types.ts
+++ b/src/containers/shared/components/Transaction/Clawback/types.ts
@@ -3,6 +3,7 @@ import { Amount, ExplorerAmount } from '../../../types'
 
 export interface Clawback extends TransactionCommonFields {
   Amount: Amount
+  MPTokenHolder?: string
 }
 
 export interface ClawbackInstructions {
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx
new file mode 100644
index 000000000..9823dfe4f
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx
@@ -0,0 +1,26 @@
+import { useTranslation } from 'react-i18next'
+import { SimpleRow } from '../SimpleRow'
+import { TransactionSimpleComponent, TransactionSimpleProps } from '../types'
+import { MPTokenAuthorize } from './types'
+import { Account } from '../../Account'
+import { MPTokenLink } from '../../MPTokenLink'
+
+export const Simple: TransactionSimpleComponent = ({
+  data,
+}: TransactionSimpleProps<MPTokenAuthorize>) => {
+  const { MPTokenIssuanceID, MPTokenHolder } = data.instructions
+  const { t } = useTranslation()
+
+  return (
+    <>
+      <SimpleRow label={t('mpt_issuance_id')} data-test="mpt-issuance-id">
+        <MPTokenLink tokenID={MPTokenIssuanceID} />
+      </SimpleRow>
+      {MPTokenHolder && (
+        <SimpleRow label={t('mpt_holder')} data-test="mpt-holder">
+          <Account account={MPTokenHolder} />
+        </SimpleRow>
+      )}
+    </>
+  )
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/index.ts b/src/containers/shared/components/Transaction/MPTokenAuthorize/index.ts
new file mode 100644
index 000000000..707282fdf
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/index.ts
@@ -0,0 +1,13 @@
+import {
+  TransactionAction,
+  TransactionCategory,
+  TransactionMapping,
+} from '../types'
+
+import { Simple } from './Simple'
+
+export const MPTokenAuthorizeTransaction: TransactionMapping = {
+  Simple,
+  action: TransactionAction.MODIFY,
+  category: TransactionCategory.MPT,
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/MPTokenAuthorizeSimple.test.jsx b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/MPTokenAuthorizeSimple.test.jsx
new file mode 100644
index 000000000..932a18cc1
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/MPTokenAuthorizeSimple.test.jsx
@@ -0,0 +1,66 @@
+import { createSimpleWrapperFactory } from '../../test/createWrapperFactory'
+import { Simple } from '../Simple'
+import { expectSimpleRowText, expectSimpleRowNotToExist } from '../../test'
+import transactionSuccess from './mock_data/MPTokenAuthorize.json'
+import transactionFail from './mock_data/MPTokenAuthorize_Fail.json'
+import transactionWithHolder from './mock_data/MPTokenAuthorize_WithHolder.json'
+import transactionWithHolderFail from './mock_data/MPTokenAuthorize_WithHolderFail.json'
+
+const createWrapper = createSimpleWrapperFactory(Simple)
+
+describe('MPTokenAuthorize', () => {
+  it('handles MPTokenAuthorize w/o holder simple view ', () => {
+    const wrapper = createWrapper(transactionSuccess)
+
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '000005F398B624EBD06822198649C920C8B20ADB8EBE745E',
+    )
+    expectSimpleRowNotToExist(wrapper, 'mpt-holder')
+    wrapper.unmount()
+  })
+
+  it('handles MPTokenAuthorize view w/ holder simple view ', () => {
+    const wrapper = createWrapper(transactionWithHolder)
+
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B',
+    )
+    expectSimpleRowText(
+      wrapper,
+      'mpt-holder',
+      'rK3bB9myvWoMaLbLnpksGx2Zz58BL225am',
+    )
+    wrapper.unmount()
+  })
+
+  it('handles failed MPTokenAuthorize view w/ holder simple view ', () => {
+    const wrapper = createWrapper(transactionWithHolderFail)
+
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '00000F76D46440EE21F74E5B2398315BC1CFEB9A7EB48A14',
+    )
+    expectSimpleRowText(
+      wrapper,
+      'mpt-holder',
+      'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh',
+    )
+    wrapper.unmount()
+  })
+
+  it('handles failed MPTokenAuthorize w/o holder simple view ', () => {
+    const wrapper = createWrapper(transactionFail)
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '0000098410531B842DEECCF4ABB1268C931EB71D9F6A1B64',
+    )
+    expectSimpleRowNotToExist(wrapper, 'mpt-holder')
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize.json
new file mode 100644
index 000000000..e41a47854
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize.json
@@ -0,0 +1,70 @@
+{
+  "tx": {
+    "Account": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny",
+    "Fee": "10",
+    "Flags": 2147483648,
+    "MPTokenIssuanceID": "000005F398B624EBD06822198649C920C8B20ADB8EBE745E",
+    "Sequence": 1524,
+    "SigningPubKey": "ED97BAFB2D380AF67DA2C1968C3A1DC38797E9BA0653CE620F6BC97FFD66925EBB",
+    "TransactionType": "MPTokenAuthorize",
+    "TxnSignature": "28879892AF0D465063993BD1DDCA147C7CA0AB9C8429DAB3A0030AA4AC57AA80F725F295622913C07E4CAFB3160DEF7E8D0209429390B0FBD78F96B28E700A07",
+    "ctid": "C00005F600000000",
+    "date": 1711397033000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny",
+            "Balance": "99999990",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 1525
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "424AAE60FE8A4B7EF77DA492F9561AAFA1D09DB56BE5804B055235BCD662C9FE",
+          "PreviousFields": {
+            "Balance": "100000000",
+            "OwnerCount": 0,
+            "Sequence": 1524
+          },
+          "PreviousTxnID": "B6301327D79A93DC211043ABF66A60DC9C70BD2962FC42E0EAD0A829680ABAE8",
+          "PreviousTxnLgrSeq": 1524
+        }
+      },
+      {
+        "CreatedNode": {
+          "LedgerEntryType": "DirectoryNode",
+          "LedgerIndex": "65BCF554A41D30521B876D012D3DC167F9E886E02D88231E9DEBD2501A4A7BB5",
+          "NewFields": {
+            "Owner": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny",
+            "RootIndex": "65BCF554A41D30521B876D012D3DC167F9E886E02D88231E9DEBD2501A4A7BB5"
+          }
+        }
+      },
+      {
+        "CreatedNode": {
+          "LedgerEntryType": "MPToken",
+          "LedgerIndex": "91D261494BB3D64D5D3D12BD480EB58C5E2B21F3222B12FE442BC73276C27266",
+          "NewFields": {
+            "Account": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny",
+            "MPTokenIssuanceID": "000005F398B624EBD06822198649C920C8B20ADB8EBE745E"
+          }
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tesSUCCESS"
+  },
+  "hash": "9592E76A725CF4A5A441024EE80596DFE8809D1AD1EC28A8D9DB2CEC2CB81EDC",
+  "ledger_index": 1526,
+  "date": 1711397033000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_Fail.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_Fail.json
new file mode 100644
index 000000000..8d305ae95
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_Fail.json
@@ -0,0 +1,49 @@
+{
+  "tx": {
+    "Account": "rJtok1j4okh4HkKxC3ArAvZbMD1vcDSteo",
+    "Fee": "10",
+    "Flags": 2147483648,
+    "MPTokenIssuanceID": "0000098410531B842DEECCF4ABB1268C931EB71D9F6A1B64",
+    "Sequence": 2438,
+    "SigningPubKey": "EDE493F0B7846A102A5C6EF4FDD9E95D1A84B0BEB99DED06C4436C0D61E5FA0B67",
+    "TransactionType": "MPTokenAuthorize",
+    "TxnSignature": "C903E4BA935BA27424D05CA230385FBA392CB4B48C136E37EF5DABE07814A2A8FA0AAEE34FCAB994D1AED7A663EB4CA121FA07B83E3C5A74289ABA258AA45F00",
+    "ctid": "C000098800000000",
+    "date": 1711398512000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rJtok1j4okh4HkKxC3ArAvZbMD1vcDSteo",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 2439
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "FE496E6B5CBE4778460846E5B93648B41E15463E691311EA4CD7E578561CA20E",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "Sequence": 2438
+          },
+          "PreviousTxnID": "26BB8D3B11AA0C967470DBA5D6B09A10608B4D1DADE0408668A45C010F4B8DDC",
+          "PreviousTxnLgrSeq": 2439
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tecMPTOKEN_EXISTS"
+  },
+  "hash": "7B785C2D172D8FAE35DBBA66868D147747F32B5D6AA41F62D698E872643CE2B6",
+  "ledger_index": 2440,
+  "date": 1711398512000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json
new file mode 100644
index 000000000..3cce1b4e2
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json
@@ -0,0 +1,67 @@
+{
+  "tx": {
+    "Account": "rwfgw2dWqUAexB46z5QRq2dJcgTK9piw5w",
+    "Fee": "10",
+    "Flags": 2147483648,
+    "MPTokenHolder": "rK3bB9myvWoMaLbLnpksGx2Zz58BL225am",
+    "MPTokenIssuanceID": "0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B",
+    "Sequence": 4876,
+    "SigningPubKey": "ED936E848B8E37D20991C2E1C5C76ABAEC0625D693CEB85BA495B58E16712DA627",
+    "TransactionType": "MPTokenAuthorize",
+    "TxnSignature": "3F31AD3682B9261975E27895DFCB9F373C33C174A076445C33AE13A6713D7FC8C8305A4D05C4918979C9EAD0230A61CE9998B71BEE21653D6BFCCC65F599100E",
+    "ctid": "C000130F00000000",
+    "date": 1711400951000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rwfgw2dWqUAexB46z5QRq2dJcgTK9piw5w",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 4877
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "C688ECD4065B909634121581E792188424F29B48C062F1D1D4FED180DEAF3A23",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "Sequence": 4876
+          },
+          "PreviousTxnID": "D12E5ED52F495449A537DB9293174209CC132CDCD4EFBBACCEB7F8E8FC582BBC",
+          "PreviousTxnLgrSeq": 4877
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rK3bB9myvWoMaLbLnpksGx2Zz58BL225am",
+            "Flags": 2,
+            "MPTokenIssuanceID": "0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B",
+            "OwnerNode": "0"
+          },
+          "LedgerEntryType": "MPToken",
+          "LedgerIndex": "E6BC3F027146E5A2A50C01C37E7C5320E608C9D1D5BE763F32748865DB6EF3DE",
+          "PreviousFields": {
+            "Flags": 0
+          },
+          "PreviousTxnID": "FA5F2B8CE18C33D09E0243A2D20319AB9AF9D6CF5F1C2568B0CC4764DEC31F7A",
+          "PreviousTxnLgrSeq": 4878
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tesSUCCESS"
+  },
+  "hash": "5F92E78273BCF8A71E129F2CC9B8B0D5611E79D4CF81B530BF7B69892A579060",
+  "ledger_index": 4879,
+  "date": 1711400951000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json
new file mode 100644
index 000000000..69b7eaa8c
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json
@@ -0,0 +1,50 @@
+{
+  "tx": {
+    "Account": "rL4pMQAa3V7s9QNw1wEk2znnhjbfYo4GQC",
+    "Fee": "10",
+    "Flags": 2147483648,
+    "MPTokenHolder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
+    "MPTokenIssuanceID": "00000F76D46440EE21F74E5B2398315BC1CFEB9A7EB48A14",
+    "Sequence": 3959,
+    "SigningPubKey": "EDF7A3D93CE3AA46168649283C20C2D4FC36642FDD87449F1CCF068638BF17B10E",
+    "TransactionType": "MPTokenAuthorize",
+    "TxnSignature": "2795F1DC9C54493ADE475800A67FD5B3BC7B65F4E343CEEA0950E994F0FC10D0DAED13B4B0FD345E92BFD2B4F42A09A44906D5B2CD1D8FD7A4B3D28983F51806",
+    "ctid": "C0000F7900000000",
+    "date": 1711400033000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rL4pMQAa3V7s9QNw1wEk2znnhjbfYo4GQC",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 3960
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "00BFE84169F6CAA5D03348856B57D47788B6856ABA9FA6EC7A16E6DA1B99B9D7",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "Sequence": 3959
+          },
+          "PreviousTxnID": "E07D68B9728EE8954C66219FF713782933612A7D5EF44B50F5485557629DFE3D",
+          "PreviousTxnLgrSeq": 3960
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tecNO_AUTH"
+  },
+  "hash": "95AE2E382D6CFBFCECC012DDC52458E753FB9208A5040D2F441B5DE5BEA535CF",
+  "ledger_index": 3961,
+  "date": 1711400033000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts b/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts
new file mode 100644
index 000000000..878129a9f
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts
@@ -0,0 +1,6 @@
+import { TransactionCommonFields } from '../types'
+
+export interface MPTokenAuthorize extends TransactionCommonFields {
+  MPTokenIssuanceID: string
+  MPTokenHolder?: string
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx
new file mode 100644
index 000000000..dc80d5625
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx
@@ -0,0 +1,63 @@
+import { useTranslation } from 'react-i18next'
+import { SimpleRow } from '../SimpleRow'
+import { TransactionSimpleComponent, TransactionSimpleProps } from '../types'
+import { MPTokenIssuanceCreateInstructions } from './types'
+import { useLanguage } from '../../../hooks'
+import { localizeNumber } from '../../../utils'
+import { MPTokenLink } from '../../MPTokenLink'
+
+export const Simple: TransactionSimpleComponent = ({
+  data,
+}: TransactionSimpleProps<MPTokenIssuanceCreateInstructions>) => {
+  const { issuanceID, metadata, assetScale, transferFee, maxAmount } =
+    data.instructions
+  const { t } = useTranslation()
+  const language = useLanguage()
+  const formattedFee =
+    transferFee &&
+    `${localizeNumber((transferFee / 1000).toPrecision(5), language, {
+      minimumFractionDigits: 3,
+    })}%`
+
+  return (
+    <>
+      {issuanceID && (
+        <SimpleRow label={t('mpt_issuance_id')} data-test="mpt-issuance-id">
+          <MPTokenLink tokenID={issuanceID} />
+        </SimpleRow>
+      )}
+      {assetScale && (
+        <SimpleRow
+          label={t('asset_scale')}
+          className="dt"
+          data-test="mpt-asset-scale"
+        >
+          {assetScale}
+        </SimpleRow>
+      )}
+      {transferFee && (
+        <SimpleRow label={t('transfer_fee')} data-test="mpt-fee">
+          {formattedFee}
+        </SimpleRow>
+      )}
+      {maxAmount && (
+        <SimpleRow
+          label={t('max_amount')}
+          className="dt"
+          data-test="mpt-max-amount"
+        >
+          {maxAmount}
+        </SimpleRow>
+      )}
+      {metadata && (
+        <SimpleRow
+          label={t('metadata')}
+          className="dt"
+          data-test="mpt-metadata"
+        >
+          {metadata}
+        </SimpleRow>
+      )}
+    </>
+  )
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/index.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/index.ts
new file mode 100644
index 000000000..03275f8f7
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/index.ts
@@ -0,0 +1,15 @@
+import {
+  TransactionAction,
+  TransactionCategory,
+  TransactionMapping,
+} from '../types'
+
+import { Simple } from './Simple'
+import { parser } from './parser'
+
+export const MPTokenIssuanceCreateTransaction: TransactionMapping = {
+  Simple,
+  action: TransactionAction.CREATE,
+  category: TransactionCategory.MPT,
+  parser,
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/parser.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/parser.ts
new file mode 100644
index 000000000..d24770bc7
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/parser.ts
@@ -0,0 +1,21 @@
+import {
+  MPTokenIssuanceCreate,
+  MPTokenIssuanceCreateInstructions,
+} from './types'
+import { TransactionParser } from '../types'
+import { convertHexToString } from '../../../../../rippled/lib/utils'
+
+export const parser: TransactionParser<
+  MPTokenIssuanceCreate,
+  MPTokenIssuanceCreateInstructions
+> = (tx, meta) => ({
+  issuanceID: meta.mpt_issuance_id,
+  metadata: tx.MPTokenMetadata
+    ? convertHexToString(tx.MPTokenMetadata)
+    : undefined,
+  transferFee: tx.TransferFee,
+  assetScale: tx.AssetScale,
+  maxAmount: tx.MaximumAmount
+    ? BigInt(tx.MaximumAmount).toString(10)
+    : undefined,
+})
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/MPTokenIssuanceCreateSimple.test.jsx b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/MPTokenIssuanceCreateSimple.test.jsx
new file mode 100644
index 000000000..0c82efab4
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/MPTokenIssuanceCreateSimple.test.jsx
@@ -0,0 +1,27 @@
+import { createSimpleWrapperFactory } from '../../test/createWrapperFactory'
+import { Simple } from '../Simple'
+import { expectSimpleRowText } from '../../test'
+import transactionSuccess from './mock_data/MPTokenIssuanceCreate.json'
+
+const createWrapper = createSimpleWrapperFactory(Simple)
+
+describe('MPTokenIssuanceCreate', () => {
+  it('handles MPTokenIssuanceCreate simple view ', () => {
+    const wrapper = createWrapper(transactionSuccess)
+
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '0000157844C3F3B57A8B579FEE1033CC8E8498729D063617',
+    )
+    expectSimpleRowText(wrapper, 'mpt-asset-scale', '2')
+    expectSimpleRowText(wrapper, 'mpt-max-amount', '9223372036854775807')
+    expectSimpleRowText(
+      wrapper,
+      'mpt-metadata',
+      'https://ipfs.io/ipfs/QmZnjmB9Tk4xaA9E679ytrPXda3beWMLUnMB5RFj1eStLp',
+    )
+    expectSimpleRowText(wrapper, 'mpt-fee', '0.010%')
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/mock_data/MPTokenIssuanceCreate.json b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/mock_data/MPTokenIssuanceCreate.json
new file mode 100644
index 000000000..2b5b91b7d
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/mock_data/MPTokenIssuanceCreate.json
@@ -0,0 +1,79 @@
+{
+  "tx": {
+    "Account": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg",
+    "AssetScale": 2,
+    "Fee": "10",
+    "Flags": 34,
+    "MPTokenMetadata": "68747470733A2F2F697066732E696F2F697066732F516D5A6E6A6D4239546B34786141394536373979747250586461336265574D4C556E4D423552466A316553744C70",
+    "MaximumAmount": "9223372036854775807",
+    "Sequence": 5496,
+    "SigningPubKey": "EDAD408FAEE57EB4A347E6FE395B834DD47C6531C3C37B09ACC35528161CAD4B0E",
+    "TransactionType": "MPTokenIssuanceCreate",
+    "TransferFee": 10,
+    "TxnSignature": "F7AA8083EE7D7EFD10E11FF5A12B73D2D45A80094AEED4B41FBF2A90C9E03E5E4D162E91FA1EC156BF94E770E70E7633DF09665A5C2D5408178FC376BFC9B100",
+    "ctid": "C000157A00000000",
+    "date": 1710949602000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg",
+            "Balance": "99999990",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 5497
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "1996F74D57092C1AC261F55CB16A45A63C785993691869A431D72A5BF8AF47A0",
+          "PreviousFields": {
+            "Balance": "100000000",
+            "OwnerCount": 0,
+            "Sequence": 5496
+          },
+          "PreviousTxnID": "531254FC0F1599CCAF9ABCDBE0854B6BFBBA225ADD7CA341D2897CBDC3E78E5E",
+          "PreviousTxnLgrSeq": 5496
+        }
+      },
+      {
+        "CreatedNode": {
+          "LedgerEntryType": "MPTokenIssuance",
+          "LedgerIndex": "265CEA78D8246B8B51D5CCC20AF4DB95569DE09E53115C888B176A3D1D05048A",
+          "NewFields": {
+            "AssetScale": 2,
+            "Flags": 34,
+            "Issuer": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg",
+            "MPTokenMetadata": "68747470733A2F2F697066732E696F2F697066732F516D5A6E6A6D4239546B34786141394536373979747250586461336265574D4C556E4D423552466A316553744C70",
+            "MaximumAmount": "9223372036854775807",
+            "Sequence": 5496,
+            "TransferFee": 10
+          }
+        }
+      },
+      {
+        "CreatedNode": {
+          "LedgerEntryType": "DirectoryNode",
+          "LedgerIndex": "3A6F809498F6C0E3664BD8451BBAE5F972E45AF17537354D1C28F3A00B35BDFE",
+          "NewFields": {
+            "Owner": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg",
+            "RootIndex": "3A6F809498F6C0E3664BD8451BBAE5F972E45AF17537354D1C28F3A00B35BDFE"
+          }
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tesSUCCESS",
+    "mpt_issuance_id": "0000157844C3F3B57A8B579FEE1033CC8E8498729D063617"
+  },
+  "hash": "9686DA1322D2D8F9CD97C5848A8E3CADB9D3F73154DA59BB3A3CACC4CA43671C",
+  "ledger_index": 5498,
+  "date": 1710949602000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/types.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/types.ts
new file mode 100644
index 000000000..2cce5aa21
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/types.ts
@@ -0,0 +1,16 @@
+import { TransactionCommonFields } from '../types'
+
+export interface MPTokenIssuanceCreate extends TransactionCommonFields {
+  AssetScale?: number
+  MaximumAmount?: string
+  TransferFee?: number
+  MPTokenMetadata?: string
+}
+
+export interface MPTokenIssuanceCreateInstructions {
+  issuanceID?: string
+  metadata?: string
+  transferFee?: number
+  assetScale?: number
+  maxAmount?: string
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/Simple.tsx
new file mode 100644
index 000000000..2b9bb6676
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/Simple.tsx
@@ -0,0 +1,18 @@
+import { useTranslation } from 'react-i18next'
+import { SimpleRow } from '../SimpleRow'
+import { TransactionSimpleComponent, TransactionSimpleProps } from '../types'
+import { MPTokenIssuanceDestroy } from './types'
+import { MPTokenLink } from '../../MPTokenLink'
+
+export const Simple: TransactionSimpleComponent = ({
+  data,
+}: TransactionSimpleProps<MPTokenIssuanceDestroy>) => {
+  const { MPTokenIssuanceID } = data.instructions
+  const { t } = useTranslation()
+
+  return (
+    <SimpleRow label={t('mpt_issuance_id')} data-test="mpt-issuance-id">
+      <MPTokenLink tokenID={MPTokenIssuanceID} />
+    </SimpleRow>
+  )
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/index.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/index.ts
new file mode 100644
index 000000000..52f730f68
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/index.ts
@@ -0,0 +1,13 @@
+import {
+  TransactionAction,
+  TransactionCategory,
+  TransactionMapping,
+} from '../types'
+
+import { Simple } from './Simple'
+
+export const MPTokenIssuanceDestroyTransaction: TransactionMapping = {
+  Simple,
+  action: TransactionAction.CANCEL,
+  category: TransactionCategory.MPT,
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/MPTokenIssuanceDestroySimple.test.jsx b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/MPTokenIssuanceDestroySimple.test.jsx
new file mode 100644
index 000000000..ee9a5b7c0
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/MPTokenIssuanceDestroySimple.test.jsx
@@ -0,0 +1,29 @@
+import { createSimpleWrapperFactory } from '../../test/createWrapperFactory'
+import { Simple } from '../Simple'
+import { expectSimpleRowText } from '../../test'
+import transactionSuccess from './mock_data/MPTokenIssuanceDestroy.json'
+import transactionFail from './mock_data/MPTokenIssuanceDestroy_Fail.json'
+
+const createWrapper = createSimpleWrapperFactory(Simple)
+
+describe('MPTokenIssuanceDestroy', () => {
+  it('handles MPTokenIssuanceDestroy simple view ', () => {
+    const wrapper = createWrapper(transactionSuccess)
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '0000071E15A457415B9A921957CA1958F0E3B8A049BE8627',
+    )
+    wrapper.unmount()
+  })
+
+  it('handles failed MPTokenIssuanceDestroy simple view ', () => {
+    const wrapper = createWrapper(transactionFail)
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '0000097E2ACB52C693EABBB156034140B2ED5E9522C4ACF4',
+    )
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy.json b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy.json
new file mode 100644
index 000000000..3ac12863b
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy.json
@@ -0,0 +1,76 @@
+{
+  "tx": {
+    "Account": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1",
+    "Fee": "10",
+    "Flags": 2147483648,
+    "MPTokenIssuanceID": "0000071E15A457415B9A921957CA1958F0E3B8A049BE8627",
+    "Sequence": 1823,
+    "SigningPubKey": "ED31ED6E308C928DA72935A03526C3C5422353EB686908D3ADAD9D573921DBDFB5",
+    "TransactionType": "MPTokenIssuanceDestroy",
+    "TxnSignature": "432417F93E86710B50619E4B9EAA43A7F636546A70D4A854E619AF01108A400519A4022B7BABE4807263CDD7EB43217B9ABB8F9745B988981B1A556D11C83200",
+    "ctid": "C000072100000000",
+    "date": 1710968140000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 0,
+            "Sequence": 1824
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "27F062565B9B9226F10C5AA25E1AD5C3E70A6A93FF2AB4851614A2C43D083850",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "OwnerCount": 1,
+            "Sequence": 1823
+          },
+          "PreviousTxnID": "E6DFD28EDD7213F43B7D0DB1296D09460458709583BEEA29F17C2F63B4DA9FC4",
+          "PreviousTxnLgrSeq": 1824
+        }
+      },
+      {
+        "DeletedNode": {
+          "FinalFields": {
+            "Flags": 0,
+            "Issuer": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1",
+            "OutstandingAmount": "0",
+            "OwnerNode": "0",
+            "PreviousTxnID": "E6DFD28EDD7213F43B7D0DB1296D09460458709583BEEA29F17C2F63B4DA9FC4",
+            "PreviousTxnLgrSeq": 1824,
+            "Sequence": 1822
+          },
+          "LedgerEntryType": "MPTokenIssuance",
+          "LedgerIndex": "9C882DA4DF7B92FC968A0ADCA8BAFB7842264F98A5E147348C6E6077EAB24AA8"
+        }
+      },
+      {
+        "DeletedNode": {
+          "FinalFields": {
+            "Flags": 0,
+            "Owner": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1",
+            "RootIndex": "B8124B2AD6A85560C73E1748E2C8B0E5C0871F4439F10B042DD7E4017D864287"
+          },
+          "LedgerEntryType": "DirectoryNode",
+          "LedgerIndex": "B8124B2AD6A85560C73E1748E2C8B0E5C0871F4439F10B042DD7E4017D864287"
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tesSUCCESS"
+  },
+  "hash": "9EB556D18BFB67F31C8716C7F3CBBB070E1E7B120DEDDC423D25DFAD850BD93A",
+  "ledger_index": 1825,
+  "date": 1710968140000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy_Fail.json b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy_Fail.json
new file mode 100644
index 000000000..88b5cc651
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy_Fail.json
@@ -0,0 +1,49 @@
+{
+  "tx": {
+    "Account": "rJbNXmT1uhmbghSQAFcgxAAN9yCRCu9y7g",
+    "Fee": "10",
+    "Flags": 2147483648,
+    "MPTokenIssuanceID": "0000097E2ACB52C693EABBB156034140B2ED5E9522C4ACF4",
+    "Sequence": 2431,
+    "SigningPubKey": "EDF5A4F08EDD12BB89658B8DE56558600342AD92D42FEDFAD682F4DAD9647EF5AA",
+    "TransactionType": "MPTokenIssuanceDestroy",
+    "TxnSignature": "C3B5F7D9A21A5EF85663058790DE7F458EA903C0010F3C2E1FEA45647052C2D85231ED4C17EB324A97AC2D4DE9A71F46D277B8A0A7AFB42D30A3EDA42E8E4106",
+    "ctid": "C000098100000000",
+    "date": 1710970247000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rJbNXmT1uhmbghSQAFcgxAAN9yCRCu9y7g",
+            "Balance": "99999990",
+            "Flags": 0,
+            "OwnerCount": 0,
+            "Sequence": 2432
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "BA6DF5388FF6BF026D3F8C91893534890F87309A32D30749CC70BCB1C6F1BEF6",
+          "PreviousFields": {
+            "Balance": "100000000",
+            "Sequence": 2431
+          },
+          "PreviousTxnID": "07F74CD4BD3E54410E436F9895BC2EC98D35E05F7584CB95D6660AF0411E9283",
+          "PreviousTxnLgrSeq": 2431
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tecNO_PERMISSION"
+  },
+  "hash": "2F31C86C343B2D2DB3D8B01BDE84E5BFA0BCB86321365A16D93DF806B79B16FD",
+  "ledger_index": 2433,
+  "date": 1710970247000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/types.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/types.ts
new file mode 100644
index 000000000..db9b812f9
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/types.ts
@@ -0,0 +1,5 @@
+import { TransactionCommonFields } from '../types'
+
+export interface MPTokenIssuanceDestroy extends TransactionCommonFields {
+  MPTokenIssuanceID: string
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx
new file mode 100644
index 000000000..9f0b13ca8
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx
@@ -0,0 +1,26 @@
+import { useTranslation } from 'react-i18next'
+import { SimpleRow } from '../SimpleRow'
+import { TransactionSimpleComponent, TransactionSimpleProps } from '../types'
+import { MPTokenIssuanceSet } from './types'
+import { Account } from '../../Account'
+import { MPTokenLink } from '../../MPTokenLink'
+
+export const Simple: TransactionSimpleComponent = ({
+  data,
+}: TransactionSimpleProps<MPTokenIssuanceSet>) => {
+  const { MPTokenIssuanceID, MPTokenHolder } = data.instructions
+  const { t } = useTranslation()
+
+  return (
+    <>
+      <SimpleRow label={t('mpt_issuance_id')} data-test="mpt-issuance-id">
+        <MPTokenLink tokenID={MPTokenIssuanceID} />
+      </SimpleRow>
+      {MPTokenHolder && (
+        <SimpleRow label={t('mpt_holder')} data-test="mpt-holder">
+          <Account account={MPTokenHolder} />
+        </SimpleRow>
+      )}
+    </>
+  )
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/index.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/index.ts
new file mode 100644
index 000000000..acbe8d389
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/index.ts
@@ -0,0 +1,13 @@
+import {
+  TransactionAction,
+  TransactionCategory,
+  TransactionMapping,
+} from '../types'
+
+import { Simple } from './Simple'
+
+export const MPTokenIssuanceSetTransaction: TransactionMapping = {
+  Simple,
+  action: TransactionAction.MODIFY,
+  category: TransactionCategory.MPT,
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/MPTokenIssuanceSetSimple.test.jsx b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/MPTokenIssuanceSetSimple.test.jsx
new file mode 100644
index 000000000..2083e158c
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/MPTokenIssuanceSetSimple.test.jsx
@@ -0,0 +1,53 @@
+import { createSimpleWrapperFactory } from '../../test/createWrapperFactory'
+import { Simple } from '../Simple'
+import { expectSimpleRowText, expectSimpleRowNotToExist } from '../../test'
+import transactionSuccess from './mock_data/MPTokenIssuanceSet.json'
+import transactionNoHolder from './mock_data/MPTokenIssuanceSet_NoHolder.json'
+import transactionFail from './mock_data/MPTokenIssuanceSet_Fail.json'
+
+const createWrapper = createSimpleWrapperFactory(Simple)
+
+describe('MPTokenIssuanceSet', () => {
+  it('handles MPTokenIssuanceSet simple view ', () => {
+    const wrapper = createWrapper(transactionSuccess)
+
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C',
+    )
+    expectSimpleRowText(
+      wrapper,
+      'mpt-holder',
+      'r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg',
+    )
+    wrapper.unmount()
+  })
+
+  it('handles MPTokenIssuanceSet simple view w/o holder ', () => {
+    const wrapper = createWrapper(transactionNoHolder)
+
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '000002609BB39CEC721B5AB337B6BD862ACD2811CBBB5F18',
+    )
+    expectSimpleRowNotToExist(wrapper, 'mpt-holder')
+    wrapper.unmount()
+  })
+
+  it('handles failed MPTokenIssuanceSet simple view ', () => {
+    const wrapper = createWrapper(transactionFail)
+    expectSimpleRowText(
+      wrapper,
+      'mpt-issuance-id',
+      '00000F83146C83112AED215CD345F8E7327459BFCF6B8062',
+    )
+    expectSimpleRowText(
+      wrapper,
+      'mpt-holder',
+      'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh',
+    )
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json
new file mode 100644
index 000000000..e78513a6c
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json
@@ -0,0 +1,67 @@
+{
+  "tx": {
+    "Account": "rERyS9qtwky94UMMjjmbku3uo5aQwAoJ58",
+    "Fee": "10",
+    "Flags": 1,
+    "MPTokenHolder": "r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg",
+    "MPTokenIssuanceID": "00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C",
+    "Sequence": 3054,
+    "SigningPubKey": "EDF73A1C528F5BFBD6FF2B05D0C71760D7D2DF1DE3496935612E47BCB440F28040",
+    "TransactionType": "MPTokenIssuanceSet",
+    "TxnSignature": "5BC9ABE91A10F86440E301F17DFADD08D2E55E0699441372BE73D843B4481869BD6224ED461BC4F9894E97F1F99562D3CF2CD1A4E991BD7993DC24EDA63F5B05",
+    "ctid": "C0000BF100000000",
+    "date": 1711047580000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg",
+            "Flags": 1,
+            "MPTokenIssuanceID": "00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C",
+            "OwnerNode": "0"
+          },
+          "LedgerEntryType": "MPToken",
+          "LedgerIndex": "DDA698915F22D7CEA45896CB70DCC0DF803E1F573B92B6F0178F1688208EED04",
+          "PreviousFields": {
+            "Flags": 0
+          },
+          "PreviousTxnID": "39709CA66D9103354D09070234A14253EC779846BB73477EEB21C5A65144C844",
+          "PreviousTxnLgrSeq": 3056
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rERyS9qtwky94UMMjjmbku3uo5aQwAoJ58",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 3055
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "EDD52DA05DAB16BAF6A3B7D47CCB9FEAB7AAC2BDD9CB007F6A3B8E0DBCE50A45",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "Sequence": 3054
+          },
+          "PreviousTxnID": "41A99F7E107F813C132B105AB930FD8C6960530DDFA5D98FCEF5A5600DA39D38",
+          "PreviousTxnLgrSeq": 3055
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tesSUCCESS"
+  },
+  "hash": "4993E5B875E0217ABC92EFC395805F1344D8A9A3D75437EEA457C05EDB3AB20B",
+  "ledger_index": 3057,
+  "date": 1711047580000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json
new file mode 100644
index 000000000..60062ffc1
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json
@@ -0,0 +1,50 @@
+{
+  "tx": {
+    "Account": "rpizWPf4g8JLWFUT7143Zn9A1n2Dy9bnji",
+    "Fee": "10",
+    "Flags": 1,
+    "MPTokenHolder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
+    "MPTokenIssuanceID": "00000F83146C83112AED215CD345F8E7327459BFCF6B8062",
+    "Sequence": 3972,
+    "SigningPubKey": "ED4EC06184C745D99AEAAA16526C900DC181C8546899F462C3D105C11A6677A65A",
+    "TransactionType": "MPTokenIssuanceSet",
+    "TxnSignature": "2A9D1795983016A162F05CEBBD35E65B955BD67AB96B8A2DB2E31027EA67DDF082B1C4D67F9219CBF9893520ACB0ACB80E2ED3CE96496AA4668BCCF4A46EAE0A",
+    "ctid": "C0000F8700000000",
+    "date": 1711048704000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rpizWPf4g8JLWFUT7143Zn9A1n2Dy9bnji",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 3973
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "F937A006AB86775D475946D43BA1612F3BC24A2C144550D4EC0266C2F08303D5",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "Sequence": 3972
+          },
+          "PreviousTxnID": "8D322CBF8A965E64FB903551C80A2E1DF9E2480A7AD0B1D98BE56574BC9FE215",
+          "PreviousTxnLgrSeq": 3973
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tecOBJECT_NOT_FOUND"
+  },
+  "hash": "E47D5242B7E210B9E1DAEFF90DC19DA9310C04CF4444C76F2C76A44533EEC48F",
+  "ledger_index": 3975,
+  "date": 1711048704000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_NoHolder.json b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_NoHolder.json
new file mode 100644
index 000000000..165596d2a
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_NoHolder.json
@@ -0,0 +1,67 @@
+{
+  "tx": {
+    "Account": "rEUGuTqrySk9o1rZSVx8seuvcsEZymeEYM",
+    "Fee": "10",
+    "Flags": 1,
+    "MPTokenIssuanceID": "000002609BB39CEC721B5AB337B6BD862ACD2811CBBB5F18",
+    "Sequence": 609,
+    "SigningPubKey": "ED92DDE49AA689EC63589623067968B85E4885A9874B3CAB89E07D192EBFA42FF9",
+    "TransactionType": "MPTokenIssuanceSet",
+    "TxnSignature": "6678BF017A62360DAA39156112960D934440467D2E4098958F053B6758A2D237DA82CD27FDA3B35BAB610D74669BF6C4DEB12D77984E48158B2D79C8BAEC3303",
+    "ctid": "C000026400000000",
+    "date": 1711133159000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": "undefined",
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rEUGuTqrySk9o1rZSVx8seuvcsEZymeEYM",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 610
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "1D54D263727856612FC7C7A27D93532ED0C41B74FA651992C125AD19C900669D",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "Sequence": 609
+          },
+          "PreviousTxnID": "CF68A8D929F089F6F53B071250935DD7C3F52F6E175D82E53118265D776D4BF7",
+          "PreviousTxnLgrSeq": 610
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Flags": 35,
+            "Issuer": "rEUGuTqrySk9o1rZSVx8seuvcsEZymeEYM",
+            "OutstandingAmount": "0",
+            "OwnerNode": "0",
+            "Sequence": 608
+          },
+          "LedgerEntryType": "MPTokenIssuance",
+          "LedgerIndex": "E8DF796110B1FBD9086A4637491E49843D33D897FBC32F03A33140F76378EE86",
+          "PreviousFields": {
+            "Flags": 34
+          },
+          "PreviousTxnID": "CF68A8D929F089F6F53B071250935DD7C3F52F6E175D82E53118265D776D4BF7",
+          "PreviousTxnLgrSeq": 610
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tesSUCCESS"
+  },
+  "hash": "73C21D8B5DFBF5DE03FCAF0D69C00E9E2918280561E9898C556A1C743A566D47",
+  "ledger_index": 612,
+  "date": 1711133159000
+}
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts
new file mode 100644
index 000000000..5e15d49e8
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts
@@ -0,0 +1,6 @@
+import { TransactionCommonFields } from '../types'
+
+export interface MPTokenIssuanceSet extends TransactionCommonFields {
+  MPTokenIssuanceID: string
+  MPTokenHolder?: string
+}
diff --git a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/types.ts b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/types.ts
index 249a9632d..5091a827e 100644
--- a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/types.ts
+++ b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/types.ts
@@ -1,6 +1,8 @@
+import { ExplorerAmount } from '../../../types'
+
 export interface NFTokenAcceptOfferInstructions {
   acceptedOfferIDs: string[]
-  amount?: { currency: string; amount: number; issuer?: string }
+  amount?: ExplorerAmount
   tokenID?: string
   seller?: string
   buyer?: string
diff --git a/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/NFTokenCancelOfferSimple.test.jsx b/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/NFTokenCancelOfferSimple.test.jsx
index b16576254..ec58e6280 100644
--- a/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/NFTokenCancelOfferSimple.test.jsx
+++ b/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/NFTokenCancelOfferSimple.test.jsx
@@ -1,21 +1,25 @@
 import { BrowserRouter as Router } from 'react-router-dom'
 import { mount } from 'enzyme'
 import { I18nextProvider } from 'react-i18next'
+import { QueryClientProvider } from 'react-query'
 import { Simple as NFTokenCancelOffer } from '../Simple'
 import transaction from './mock_data/NFTokenCancelOffer.json'
 import summarizeTransaction from '../../../../../../rippled/lib/txSummary'
 import i18n from '../../../../../../i18n/testConfig'
+import { queryClient } from '../../../../QueryClient'
 
 describe('NFTokenCancelOffer', () => {
   it.only('handles NFTokenCancelOffer simple view ', () => {
     const wrapper = mount(
-      <I18nextProvider i18n={i18n}>
-        <Router>
-          <NFTokenCancelOffer
-            data={summarizeTransaction(transaction, true).details}
-          />
-        </Router>
-      </I18nextProvider>,
+      <QueryClientProvider client={queryClient}>
+        <I18nextProvider i18n={i18n}>
+          <Router>
+            <NFTokenCancelOffer
+              data={summarizeTransaction(transaction, true).details}
+            />
+          </Router>
+        </I18nextProvider>
+      </QueryClientProvider>,
     )
     expect(wrapper.find('[data-test="token-id"] .value')).toHaveText(
       '000800006203F49C21D5D6E022CB16DE3538F248662FC73C258BA1B200000018',
diff --git a/src/containers/shared/components/Transaction/NFTokenCreateOffer/types.ts b/src/containers/shared/components/Transaction/NFTokenCreateOffer/types.ts
index 624c2dc47..e25ed0359 100644
--- a/src/containers/shared/components/Transaction/NFTokenCreateOffer/types.ts
+++ b/src/containers/shared/components/Transaction/NFTokenCreateOffer/types.ts
@@ -1,6 +1,8 @@
+import { ExplorerAmount } from '../../../types'
+
 export interface NFTokenCreateOfferInstructions {
   account: string
-  amount: { currency: string; amount: number; issuer?: string }
+  amount: ExplorerAmount
   tokenID: string
   isSellOffer: boolean
   owner?: string
diff --git a/src/containers/shared/components/Transaction/OfferCreate/parser.ts b/src/containers/shared/components/Transaction/OfferCreate/parser.ts
index e895c2b5c..238bfd6a5 100644
--- a/src/containers/shared/components/Transaction/OfferCreate/parser.ts
+++ b/src/containers/shared/components/Transaction/OfferCreate/parser.ts
@@ -6,7 +6,7 @@ export function parser(tx: any) {
   const base = tx.TakerGets.currency ? tx.TakerGets : { currency: 'XRP' }
   const counter = tx.TakerPays.currency ? tx.TakerPays : { currency: 'XRP' }
   const pays = formatAmount(tx.TakerPays)
-  const price = pays.amount / gets.amount
+  const price = Number(pays.amount) / Number(gets.amount)
   const invert =
     CURRENCY_ORDER.indexOf(counter.currency) >
     CURRENCY_ORDER.indexOf(base.currency)
diff --git a/src/containers/shared/components/Transaction/OracleSet/parser.ts b/src/containers/shared/components/Transaction/OracleSet/parser.ts
index bca503f5f..b27a3ba04 100644
--- a/src/containers/shared/components/Transaction/OracleSet/parser.ts
+++ b/src/containers/shared/components/Transaction/OracleSet/parser.ts
@@ -1,19 +1,6 @@
 import { convertHexToString } from '../../../../../rippled/lib/utils'
 import { OracleSet } from './types'
-
-// Convert scaled price (assetPrice) to original price using formula:
-// originalPrice = assetPrice / 10**scale
-// More details: https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-47d-PriceOracles
-export function convertScaledPrice(assetPrice: string, scale: number) {
-  const scaledPriceInBigInt = BigInt(`0x${assetPrice}`)
-  const divisor = BigInt(10 ** scale)
-  const integerPart = scaledPriceInBigInt / divisor
-  const remainder = scaledPriceInBigInt % divisor
-  const fractionalPart = (remainder * BigInt(10 ** scale)) / divisor
-  return fractionalPart > 0
-    ? `${integerPart}.${fractionalPart.toString().padStart(scale, '0')}`
-    : `${integerPart}`
-}
+import { convertScaledPrice } from '../../../utils'
 
 export function parser(tx: OracleSet) {
   const priceDataSeries = tx.PriceDataSeries.map((priceDataObj) => ({
diff --git a/src/containers/shared/components/Transaction/OracleSet/test/ConvertScalePrice.test.ts b/src/containers/shared/components/Transaction/OracleSet/test/ConvertScalePrice.test.ts
index 984c63e2b..2437a40c9 100644
--- a/src/containers/shared/components/Transaction/OracleSet/test/ConvertScalePrice.test.ts
+++ b/src/containers/shared/components/Transaction/OracleSet/test/ConvertScalePrice.test.ts
@@ -1,4 +1,4 @@
-import { convertScaledPrice } from '../parser'
+import { convertScaledPrice } from '../../../../utils'
 
 const numberToHex = (number) => number.toString(16)
 describe('convertScaledPrice', () => {
diff --git a/src/containers/shared/components/Transaction/Payment/parser.ts b/src/containers/shared/components/Transaction/Payment/parser.ts
index 743c05367..57dc16157 100644
--- a/src/containers/shared/components/Transaction/Payment/parser.ts
+++ b/src/containers/shared/components/Transaction/Payment/parser.ts
@@ -1,4 +1,4 @@
-import type { Payment } from 'xrpl'
+// import type { Payment } from 'xrpl'
 import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount'
 import { PaymentInstructions } from './types'
 import { Amount, ExplorerAmount } from '../../../types'
@@ -10,7 +10,8 @@ const formatFailedPartialAmount = (d: Amount): ExplorerAmount => ({
 
 export const isPartialPayment = (flags: any) => 0x00020000 & flags
 
-export const parser = (tx: Payment, meta: any): PaymentInstructions => {
+// TODO: use MPTAmount type from xrpl.js
+export const parser = (tx: any, meta: any): PaymentInstructions => {
   const max = tx.SendMax ? formatAmount(tx.SendMax) : undefined
   const partial = !!isPartialPayment(tx.Flags)
   const failedPartial = partial && meta.TransactionResult !== 'tesSUCCESS'
diff --git a/src/containers/shared/components/Transaction/Payment/test/PaymentSimple.test.tsx b/src/containers/shared/components/Transaction/Payment/test/PaymentSimple.test.tsx
index 60c9ab4b3..5166c919f 100644
--- a/src/containers/shared/components/Transaction/Payment/test/PaymentSimple.test.tsx
+++ b/src/containers/shared/components/Transaction/Payment/test/PaymentSimple.test.tsx
@@ -1,3 +1,4 @@
+import { useQuery } from 'react-query'
 import {
   createSimpleWrapperFactory,
   expectSimpleRowLabel,
@@ -10,6 +11,12 @@ import mockPaymentDestinationTag from './mock_data/PaymentWithDestinationTag.jso
 import mockPaymentPartial from './mock_data/PaymentWithPartial.json'
 import mockPaymentSendMax from './mock_data/PaymentWithSendMax.json'
 import mockPaymentSourceTag from './mock_data/PaymentWithSourceTag.json'
+import mockPaymentMPT from './mock_data/PaymentMPT.json'
+
+jest.mock('react-query', () => ({
+  ...jest.requireActual('react-query'),
+  useQuery: jest.fn(),
+}))
 
 const createWrapper = createSimpleWrapperFactory(Simple)
 
@@ -114,4 +121,32 @@ describe('Payment: Simple', () => {
 
     wrapper.unmount()
   })
+
+  it('renders direct MPT payment', () => {
+    const data = {
+      assetScale: 3,
+    }
+
+    // @ts-ignore
+    useQuery.mockImplementation(() => ({
+      data,
+    }))
+
+    const wrapper = createWrapper(mockPaymentMPT)
+
+    expectSimpleRowText(
+      wrapper,
+      'amount',
+      `0.1 MPT (000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F)`,
+    )
+    expectSimpleRowLabel(wrapper, 'amount', `send`)
+
+    expectSimpleRowText(
+      wrapper,
+      'destination',
+      `rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu`,
+    )
+
+    wrapper.unmount()
+  })
 })
diff --git a/src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentMPT.json b/src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentMPT.json
new file mode 100644
index 000000000..d35339b88
--- /dev/null
+++ b/src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentMPT.json
@@ -0,0 +1,91 @@
+{
+  "tx": {
+    "Account": "rsC4dnxCb66FQT4XmCUeuQ7dYeqNio4rWg",
+    "Amount": {
+      "mpt_issuance_id": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F",
+      "value": "100"
+    },
+    "DeliverMax": {
+      "mpt_issuance_id": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F",
+      "value": "100"
+    },
+    "Destination": "rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu",
+    "Fee": "10",
+    "Flags": 2147483648,
+    "Sequence": 964,
+    "SigningPubKey": "ED35B07F41420220332C35B9F4D1F7AF26E67EBD5AD6C9E106D0F774DA15924169",
+    "TransactionType": "Payment",
+    "TxnSignature": "2C5CB9740457222F928667DC1196060EF7E61B4E3A8824727AE63ACCFDE35ED5CBEE69E982423592DF0464C57C2C445B4271573DE7A3346630024287844F2502",
+    "ctid": "C00003C900000000",
+    "date": 1727802036000
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "AssetScale": 3,
+            "Flags": 34,
+            "Issuer": "rsC4dnxCb66FQT4XmCUeuQ7dYeqNio4rWg",
+            "MPTokenMetadata": "7B226E616D65223A2255532054726561737572792042696C6C20546F6B656E222C2273796D626F6C223A225553544254222C22646563696D616C73223A322C22746F74616C537570706C79223A313030303030302C22697373756572223A225553205472656173757279222C22697373756544617465223A22323032342D30332D3235222C226D6174757269747944617465223A22323032352D30332D3235222C226661636556616C7565223A2231303030222C22696E74657265737452617465223A22322E35222C22696E7465726573744672657175656E6379223A22517561727465726C79222C22636F6C6C61746572616C223A22555320476F7665726E6D656E74222C226A7572697364696374696F6E223A22556E6974656420537461746573222C22726567756C61746F7279436F6D706C69616E6365223A2253454320526567756C6174696F6E73222C22736563757269747954797065223A2254726561737572792042696C6C222C2265787465726E616C5F75726C223A2268747470733A2F2F6578616D706C652E636F6D2F742D62696C6C2D746F6B656E2D6D657461646174612E6A736F6E227D",
+            "MaximumAmount": "9223372036854775807",
+            "OutstandingAmount": "100",
+            "OwnerNode": "0",
+            "Sequence": 963
+          },
+          "LedgerEntryType": "MPTokenIssuance",
+          "LedgerIndex": "1CFF89335B544E0D6EEC35D74C0D26FF407DC02670F1C4E35A36CC875D34B1C3",
+          "PreviousFields": {
+            "OutstandingAmount": "0"
+          },
+          "PreviousTxnID": "6329586F264E4A6E2224318DCFC9B5F28048D84060B78A92CFFE65840DF8D970",
+          "PreviousTxnLgrSeq": 966
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu",
+            "Flags": 0,
+            "MPTAmount": "100",
+            "MPTokenIssuanceID": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F",
+            "OwnerNode": "0"
+          },
+          "LedgerEntryType": "MPToken",
+          "LedgerIndex": "3BAA73912496683A414494218D3CCA33D02F80D588F80C1257C691448E00E486",
+          "PreviousFields": {},
+          "PreviousTxnID": "60F99C8A23C4A366D19F43EA4BD43414AD4D4B7C21D0228FB7539D1C893E4A74",
+          "PreviousTxnLgrSeq": 967
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rsC4dnxCb66FQT4XmCUeuQ7dYeqNio4rWg",
+            "Balance": "99999980",
+            "Flags": 0,
+            "OwnerCount": 1,
+            "Sequence": 965
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "77ECC02B8A7F16EB19A7BFBE8494E959497B4EC7734088583BD4F6B8C82878A5",
+          "PreviousFields": {
+            "Balance": "99999990",
+            "Sequence": 964
+          },
+          "PreviousTxnID": "6329586F264E4A6E2224318DCFC9B5F28048D84060B78A92CFFE65840DF8D970",
+          "PreviousTxnLgrSeq": 966
+        }
+      }
+    ],
+    "TransactionIndex": 0,
+    "TransactionResult": "tesSUCCESS",
+    "delivered_amount": {
+      "mpt_issuance_id": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F",
+      "value": "100"
+    }
+  },
+  "hash": "CD9EC015E68D3027919598E0466CFEF19950D0BC688A568DF8822A8BB0AFF98F",
+  "ledger_index": 11707,
+  "date": 1712072515000
+}
diff --git a/src/containers/shared/components/Transaction/index.ts b/src/containers/shared/components/Transaction/index.ts
index babf265fc..c483a22cb 100644
--- a/src/containers/shared/components/Transaction/index.ts
+++ b/src/containers/shared/components/Transaction/index.ts
@@ -9,6 +9,10 @@ import { AccountSetTransaction as AccountSet } from './AccountSet'
 import { DIDSetTransaction as DIDSet } from './DIDSet'
 import { DepositPreauthTransaction as DepositPreauth } from './DepositPreauth'
 import { EnableAmendmentTransaction as EnableAmendment } from './EnableAmendment'
+import { MPTokenAuthorizeTransaction as MPTokenAuthorize } from './MPTokenAuthorize'
+import { MPTokenIssuanceCreateTransaction as MPTokenIssuanceCreate } from './MPTokenIssuanceCreate'
+import { MPTokenIssuanceDestroyTransaction as MPTokenIssuanceDestroy } from './MPTokenIssuanceDestroy'
+import { MPTokenIssuanceSetTransaction as MPTokenIssuanceSet } from './MPTokenIssuanceSet'
 import { NFTokenMintTransaction as NFTokenMint } from './NFTokenMint'
 import { NFTokenCancelOfferTransaction as NFTokenCancelOffer } from './NFTokenCancelOffer'
 import { NFTokenBurnTransaction as NFTokenBurn } from './NFTokenBurn'
@@ -55,6 +59,10 @@ export const transactionTypes: { [key: string]: TransactionMapping } = {
   DIDSet,
   DepositPreauth,
   EnableAmendment,
+  MPTokenAuthorize,
+  MPTokenIssuanceCreate,
+  MPTokenIssuanceDestroy,
+  MPTokenIssuanceSet,
   NFTokenMint,
   NFTokenCancelOffer,
   NFTokenBurn,
diff --git a/src/containers/shared/components/Transaction/test/createWrapperFactory.tsx b/src/containers/shared/components/Transaction/test/createWrapperFactory.tsx
index 709d242ee..9c93c4a01 100644
--- a/src/containers/shared/components/Transaction/test/createWrapperFactory.tsx
+++ b/src/containers/shared/components/Transaction/test/createWrapperFactory.tsx
@@ -3,6 +3,7 @@ import { ReactElement } from 'react'
 import { I18nextProvider } from 'react-i18next'
 import { BrowserRouter } from 'react-router-dom'
 import { i18n } from 'i18next'
+import { QueryClientProvider } from 'react-query'
 import defaultI18nConfig from '../../../../../i18n/testConfig'
 import summarizeTransaction from '../../../../../rippled/lib/txSummary'
 import {
@@ -10,6 +11,7 @@ import {
   TransactionSimpleComponent,
   TransactionTableDetailComponent,
 } from '../types'
+import { testQueryClient } from '../../../../test/QueryClient'
 
 /**
  * Methods that produce createWrapper function for tests
@@ -22,9 +24,11 @@ export function createWrapper(
   i18nConfig?: i18n,
 ): ReactWrapper {
   return mount(
-    <I18nextProvider i18n={i18nConfig || defaultI18nConfig}>
-      <BrowserRouter>{TestComponent}</BrowserRouter>
-    </I18nextProvider>,
+    <QueryClientProvider client={testQueryClient}>
+      <I18nextProvider i18n={i18nConfig || defaultI18nConfig}>
+        <BrowserRouter>{TestComponent}</BrowserRouter>
+      </I18nextProvider>
+    </QueryClientProvider>,
   )
 }
 
diff --git a/src/containers/shared/components/Transaction/types.ts b/src/containers/shared/components/Transaction/types.ts
index d1154be4a..722687b69 100644
--- a/src/containers/shared/components/Transaction/types.ts
+++ b/src/containers/shared/components/Transaction/types.ts
@@ -8,6 +8,7 @@ export enum TransactionCategory {
   PAYMENT = 'PAYMENT',
   NFT = 'NFT',
   XCHAIN = 'XCHAIN',
+  MPT = 'MPT',
   PSEUDO = 'PSEUDO',
   UNKNOWN = 'UNKNOWN',
 }
diff --git a/src/containers/shared/components/TransactionTable/test/TransactionTable.test.js b/src/containers/shared/components/TransactionTable/test/TransactionTable.test.js
index 54517c301..734e4f0d5 100644
--- a/src/containers/shared/components/TransactionTable/test/TransactionTable.test.js
+++ b/src/containers/shared/components/TransactionTable/test/TransactionTable.test.js
@@ -1,9 +1,11 @@
 import { mount } from 'enzyme'
 import { I18nextProvider } from 'react-i18next'
 import { BrowserRouter } from 'react-router-dom'
+import { QueryClientProvider } from 'react-query'
 import { TransactionTable } from '../TransactionTable'
 import i18n from '../../../../../i18n/testConfig'
 import mockTx from './mockTransactions.json'
+import { queryClient } from '../../../QueryClient'
 
 const loadMore = jest.fn()
 
@@ -16,17 +18,19 @@ describe('Transaction Table container', () => {
     hasAdditionalResults = false,
   ) =>
     mount(
-      <I18nextProvider i18n={i18n}>
-        <BrowserRouter>
-          <TransactionTable
-            transactions={transactions}
-            emptyMessage={emptyMessage}
-            loading={loading}
-            onLoadMore={onLoadMore}
-            hasAdditionalResults={hasAdditionalResults}
-          />
-        </BrowserRouter>
-      </I18nextProvider>,
+      <QueryClientProvider client={queryClient}>
+        <I18nextProvider i18n={i18n}>
+          <BrowserRouter>
+            <TransactionTable
+              transactions={transactions}
+              emptyMessage={emptyMessage}
+              loading={loading}
+              onLoadMore={onLoadMore}
+              hasAdditionalResults={hasAdditionalResults}
+            />
+          </BrowserRouter>
+        </I18nextProvider>
+      </QueryClientProvider>,
     )
 
   it('renders without crashing', () => {
diff --git a/src/containers/shared/components/test/Amount.test.tsx b/src/containers/shared/components/test/Amount.test.tsx
index acbe14315..749f62033 100644
--- a/src/containers/shared/components/test/Amount.test.tsx
+++ b/src/containers/shared/components/test/Amount.test.tsx
@@ -1,9 +1,15 @@
 import { I18nextProvider } from 'react-i18next'
 import { BrowserRouter } from 'react-router-dom'
 import { mount } from 'enzyme'
+import { useQuery } from 'react-query'
 import { Amount } from '../Amount'
 import i18n from '../../../../i18n/testConfig'
 
+jest.mock('react-query', () => ({
+  ...jest.requireActual('react-query'),
+  useQuery: jest.fn(),
+}))
+
 describe('Amount', () => {
   const createWrapper = (component: JSX.Element) =>
     mount(
@@ -117,4 +123,34 @@ describe('Amount', () => {
     expect(wrapper.find('.amount-localized').text()).toEqual('+\uE9000.009')
     wrapper.unmount()
   })
+
+  it('handles MPT amount', async () => {
+    const data = {
+      issuer: 'rL2LzUhsBJMqsaVCXVvzedPjePbjVzBCC',
+      assetScale: 3,
+      maxAmt: '100000000',
+      outstandingAmt: '1043001',
+      sequence: 2447,
+      metadata:
+        '{"name":"US Treasury Bill Token","symbol":"USTBT","decimals":2,"totalSupply":1000000,"issuer":"US Treasury","issueDate":"2024-03-25","maturityDate":"2025-03-25","faceValue":"1000","interestRate":"2.5","interestFrequency":"Quarterly","collateral":"US Government","jurisdiction":"United States","regulatoryCompliance":"SEC Regulations","securityType":"Treasury Bill","external_url":"https://example.com/t-bill-token-metadata.json"}',
+      flags: [],
+    }
+
+    // @ts-ignore
+    useQuery.mockImplementation(() => ({
+      data,
+    }))
+
+    const value = {
+      amount: '1043001',
+      currency: '0000098F03B3BCE934EE8CAA1DF25A42032388361B9E5A65',
+      isMPT: true,
+    }
+    const wrapper = createWrapper(
+      <Amount value={value} displayIssuer={false} />,
+    )
+
+    expect(wrapper.find('.amount-localized').text()).toEqual('1,043.001')
+    wrapper.unmount()
+  })
 })
diff --git a/src/containers/shared/components/test/Currency.test.tsx b/src/containers/shared/components/test/Currency.test.tsx
index e3d218090..8d7de259c 100644
--- a/src/containers/shared/components/test/Currency.test.tsx
+++ b/src/containers/shared/components/test/Currency.test.tsx
@@ -63,4 +63,26 @@ describe('Currency', () => {
     expect(wrapper.find('.currency').text()).toEqual('\uE900 XRP')
     wrapper.unmount()
   })
+
+  it('handles MPT ID ', () => {
+    const wrapper = mount(
+      <BrowserRouter>
+        <Currency
+          currency="00000BDE5B4F868ECE457207E2C1750065987730B8839E0D"
+          issuer="r9Kokzc4FC1BW81pDarodghf3n8w2vufhW"
+          isMPT
+        />
+      </BrowserRouter>,
+    )
+    const mpt = wrapper.find('.currency').at(0)
+
+    expect(mpt).toHaveText(
+      'MPT (00000BDE5B4F868ECE457207E2C1750065987730B8839E0D)',
+    )
+    expect(mpt.find('a')).toHaveProp(
+      'href',
+      '/mpt/00000BDE5B4F868ECE457207E2C1750065987730B8839E0D',
+    )
+    wrapper.unmount()
+  })
 })
diff --git a/src/containers/shared/css/global.scss b/src/containers/shared/css/global.scss
index 327c74065..8d7bf9b0d 100644
--- a/src/containers/shared/css/global.scss
+++ b/src/containers/shared/css/global.scss
@@ -121,6 +121,7 @@ div.react-stockchart div {
 @include transaction-category(XCHAIN, $yellow, $yellow-30, $yellow-90);
 @include transaction-category(PSEUDO, $white, $white, $black-80);
 @include transaction-category(UNKNOWN, $black-50, $black-30, $black-90);
+@include transaction-category(MPT, $blue, $blue-30, $blue-90);
 
 .tx-result {
   &.success {
diff --git a/src/containers/shared/css/variables.scss b/src/containers/shared/css/variables.scss
index a1987f372..91b259bed 100644
--- a/src/containers/shared/css/variables.scss
+++ b/src/containers/shared/css/variables.scss
@@ -120,6 +120,7 @@ $custom: $yellow-50;
 // Feature Sets
 $amm: $blue;
 $nft: $blue-purple;
+$mpt: $blue;
 
 // Currency colors
 $CURRENCY_DEFAULT: #aedbf7;
diff --git a/src/containers/shared/transactionUtils.ts b/src/containers/shared/transactionUtils.ts
index e39c28ef1..0ccd26bd9 100644
--- a/src/containers/shared/transactionUtils.ts
+++ b/src/containers/shared/transactionUtils.ts
@@ -41,6 +41,21 @@ export const TX_FLAGS: Record<string, Record<number, string>> = {
     0x00200000: 'tfOneAssetLPToken',
     0x00400000: 'tfLimitLPToken',
   },
+  MPTokenAuthorize: {
+    0x00000001: 'tfMPTUnauthorize',
+  },
+  MPTokenIssuanceCreate: {
+    0x00000002: 'tfMPTCanLock',
+    0x00000004: 'tfMPTRequireAuth',
+    0x00000008: 'tfMPTCanEscrow',
+    0x00000010: 'tfMPTCanTrade',
+    0x00000020: 'tfMPTCanTransfer',
+    0x00000040: 'tfMPTCanClawback',
+  },
+  MPTokenIssuanceSet: {
+    0x00000001: 'tfMPTLock',
+    0x00000002: 'tfMPTUnlock',
+  },
   NFTokenMint: {
     0x00000001: 'tfBurnable',
     0x00000002: 'tfOnlyXRP',
diff --git a/src/containers/shared/types.ts b/src/containers/shared/types.ts
index d219bc63e..3ae210e27 100644
--- a/src/containers/shared/types.ts
+++ b/src/containers/shared/types.ts
@@ -17,12 +17,18 @@ export interface IssuedCurrencyAmount extends IssuedCurrency {
   value: string
 }
 
-export type Amount = IssuedCurrencyAmount | string
+export interface MPTAmount {
+  mpt_issuance_id: string
+  value: string
+}
+
+export type Amount = IssuedCurrencyAmount | MPTAmount | string
 
 export type ExplorerAmount = {
   issuer?: string
   currency: string
-  amount: number
+  amount: number | string
+  isMPT?: boolean
 }
 
 export interface Tx {
diff --git a/src/containers/shared/utils.js b/src/containers/shared/utils.js
index bdeae56e2..ac510adeb 100644
--- a/src/containers/shared/utils.js
+++ b/src/containers/shared/utils.js
@@ -23,7 +23,8 @@ export const FETCH_INTERVAL_NODES_MILLIS = 60000
 export const FETCH_INTERVAL_ERROR_MILLIS = 300
 
 export const DECIMAL_REGEX = /^\d+$/
-export const HASH_REGEX = /[0-9A-Fa-f]{64}/i
+export const HASH256_REGEX = /[0-9A-Fa-f]{64}/i
+export const HASH192_REGEX = /[0-9A-Fa-f]{48}/i
 export const CURRENCY_REGEX =
   /^[a-zA-Z0-9]{3,}[.:+-]r[rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz]{27,35}$/
 export const FULL_CURRENCY_REGEX =
@@ -129,14 +130,19 @@ export const isEarlierVersion = (source, target) => {
 }
 
 // Document: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat
-export const localizeNumber = (num, lang = 'en-US', options = {}) => {
+export const localizeNumber = (
+  num,
+  lang = 'en-US',
+  options = {},
+  isMPT = false,
+) => {
   const number = Number.parseFloat(num)
   const config = { ...NUMBER_DEFAULT_OPTIONS, ...options }
 
   if (Number.isNaN(number)) {
     return null
   }
-  if (config.style === 'currency') {
+  if (config.style === 'currency' && !isMPT) {
     try {
       const neg = number < 0 ? '-' : ''
       const d = new Intl.NumberFormat(lang, config).format(number)
@@ -255,6 +261,8 @@ export const formatLargeNumber = (d = 0, digits = 4) => {
   }
 }
 
+export const convertHexToBigInt = (s) => BigInt(`0x${s}`)
+
 export const durationToHuman = (s, decimal = 2) => {
   const d = {}
   const seconds = Math.abs(s)
@@ -301,7 +309,7 @@ export const formatTradingFee = (tradingFee) =>
       })
     : undefined
 
-export const computeBalanceChange = (node) => {
+export const computeRippleStateBalanceChange = (node) => {
   const fields = node.FinalFields || node.NewFields
   const prev = node.PreviousFields
   const { currency } = fields.Balance
@@ -333,7 +341,50 @@ export const computeBalanceChange = (node) => {
   }
 }
 
+export const computeMPTokenBalanceChange = (node) => {
+  const final = node.FinalFields || node.NewFields
+  const prev = node.PreviousFields
+  const prevAmount = prev && prev.MPTAmount ? prev.MPTAmount : '0'
+  const finalAmount = final.MPTAmount ?? '0'
+
+  return {
+    previousBalance: BigInt(prevAmount),
+    finalBalance: BigInt(finalAmount),
+    account: final.Account,
+    change: BigInt(finalAmount) - BigInt(prevAmount),
+  }
+}
+
+export const computeMPTIssuanceBalanceChange = (node) => {
+  const final = node.FinalFields || node.NewFields
+  const prev = node.PreviousFields
+  const prevAmount =
+    prev && prev.OutstandingAmount ? prev.OutstandingAmount : '0'
+  const finalAmount = final.OutstandingAmount ?? '0'
+
+  return {
+    previousBalance: BigInt(prevAmount),
+    finalBalance: BigInt(finalAmount),
+    account: final.Issuer,
+    change: BigInt(finalAmount) - BigInt(prevAmount),
+  }
+}
+
 export const renderXRP = (d, language) => {
   const options = { ...CURRENCY_OPTIONS, currency: 'XRP' }
   return localizeNumber(d, language, options)
 }
+
+// Convert scaled price (assetPrice) in hex string to original price using formula:
+// originalPrice = assetPrice / 10**scale
+// More details: https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-47d-PriceOracles
+export function convertScaledPrice(assetPrice, scale) {
+  const scaledPriceInBigInt = BigInt(`0x${assetPrice}`)
+  const divisor = BigInt(10 ** scale)
+  const integerPart = scaledPriceInBigInt / divisor
+  const remainder = scaledPriceInBigInt % divisor
+  const fractionalPart = (remainder * BigInt(10 ** scale)) / divisor
+  return fractionalPart > 0
+    ? `${integerPart}.${fractionalPart.toString().padStart(scale, '0')}`
+    : `${integerPart}`
+}
diff --git a/src/rippled/lib/rippled.js b/src/rippled/lib/rippled.js
index 598a57e63..c77c6584d 100644
--- a/src/rippled/lib/rippled.js
+++ b/src/rippled/lib/rippled.js
@@ -1,4 +1,4 @@
-import { CTID_REGEX, HASH_REGEX } from '../../containers/shared/utils'
+import { CTID_REGEX, HASH256_REGEX } from '../../containers/shared/utils'
 import { formatAmount } from './txSummary/formatAmount'
 import { Error, XRP_BASE, convertRippleDate } from './utils'
 
@@ -144,7 +144,7 @@ const getTransaction = (rippledSocket, txId) => {
   const params = {
     command: 'tx',
   }
-  if (HASH_REGEX.test(txId)) {
+  if (HASH256_REGEX.test(txId)) {
     params.transaction = txId
   } else if (CTID_REGEX.test(txId)) {
     params.ctid = txId
@@ -557,6 +557,54 @@ const getAMMInfo = (rippledSocket, asset, asset2) => {
   })
 }
 
+const getMPTIssuance = (rippledSocket, tokenId) =>
+  query(rippledSocket, {
+    command: 'ledger_entry',
+    mpt_issuance: tokenId,
+    ledger_index: 'validated',
+  }).then((resp) => {
+    if (
+      resp.error === 'entryNotFound' ||
+      resp.error === 'lgrNotFound' ||
+      resp.error === 'objectNotFound'
+    ) {
+      throw new Error('MPT not found', 404)
+    }
+
+    if (resp.error_message) {
+      throw new Error(resp.error_message, 500)
+    }
+    return resp
+  })
+
+const getAccountMPTs = (
+  rippledSocket,
+  account,
+  marker = '',
+  ledgerIndex = 'validated',
+) =>
+  query(rippledSocket, {
+    command: 'account_objects',
+    account,
+    ledger_index: ledgerIndex,
+    type: 'mptoken',
+    marker: marker || undefined,
+    limit: 400,
+  }).then((resp) => {
+    if (resp.error === 'actNotFound') {
+      throw new Error('account not found', 404)
+    }
+    if (resp.error === 'invalidParams') {
+      return undefined
+    }
+
+    if (resp.error_message) {
+      throw new Error(resp.error_message, 500)
+    }
+
+    return resp
+  })
+
 export {
   getLedger,
   getLedgerEntry,
@@ -576,4 +624,6 @@ export {
   getSellNFToffers,
   getNFTTransactions,
   getAMMInfo,
+  getMPTIssuance,
+  getAccountMPTs,
 }
diff --git a/src/rippled/lib/txSummary/formatAmount.ts b/src/rippled/lib/txSummary/formatAmount.ts
index 7eaf91239..c8cccd4d5 100644
--- a/src/rippled/lib/txSummary/formatAmount.ts
+++ b/src/rippled/lib/txSummary/formatAmount.ts
@@ -1,18 +1,34 @@
-import { Amount, ExplorerAmount } from '../../../containers/shared/types'
+import {
+  Amount,
+  ExplorerAmount,
+  MPTAmount,
+} from '../../../containers/shared/types'
 import { XRP_BASE } from '../utils'
 
+export const isMPTAmount = (amount: Amount): amount is MPTAmount =>
+  (amount as MPTAmount).mpt_issuance_id !== undefined &&
+  (amount as MPTAmount).value !== undefined
+
 export const formatAmount = (d: Amount | number): ExplorerAmount => {
   if (d == null) {
     return d
   }
-  return typeof d !== 'string' && typeof d !== 'number'
+
+  if (typeof d === 'string' || typeof d === 'number')
+    return {
+      currency: 'XRP',
+      amount: Number(d) / XRP_BASE,
+    }
+
+  return isMPTAmount(d)
     ? {
+        currency: d.mpt_issuance_id,
+        amount: d.value,
+        isMPT: true,
+      }
+    : {
         currency: d.currency,
         issuer: d.issuer,
         amount: Number(d.value),
       }
-    : {
-        currency: 'XRP',
-        amount: Number(d) / XRP_BASE,
-      }
 }
diff --git a/src/rippled/lib/utils.js b/src/rippled/lib/utils.js
index 2c95c4db4..a1b19680e 100644
--- a/src/rippled/lib/utils.js
+++ b/src/rippled/lib/utils.js
@@ -1,4 +1,5 @@
-import { hexToString } from '@xrplf/isomorphic/utils'
+import { hexToString, hexToBytes } from '@xrplf/isomorphic/utils'
+import { encodeAccountID } from 'ripple-address-codec'
 import { convertRippleDate } from './convertRippleDate'
 import { formatSignerList } from './formatSignerList'
 import { decodeHex } from '../../containers/shared/transactionUtils'
@@ -27,6 +28,19 @@ const NFT_FLAGS = {
   0x00000002: 'lsfOnlyXRP',
   0x00000008: 'lsfTransferable',
 }
+const MPT_ISSUANCE_FLAGS = {
+  0x00000001: 'lsfMPTLocked',
+  0x00000002: 'lsfMPTCanLock',
+  0x00000004: 'lsfMPTRequireAuth',
+  0x00000008: 'lsfMPTCanEscrow',
+  0x00000010: 'lsfMPTCanTrade',
+  0x00000020: 'lsfMPTCanTransfer',
+  0x00000040: 'lsfMPTCanClawback',
+}
+const MPTOKEN_FLAGS = {
+  0x00000001: 'lsfMPTLocked',
+  0x00000002: 'lsfMPTAuthorized',
+}
 const hex32 = (d) => {
   const int = d & 0xffffffff
   const hex = int.toString(16).toUpperCase()
@@ -128,6 +142,33 @@ const formatNFTInfo = (info) => ({
   warnings: info.warnings,
 })
 
+const formatMPTIssuanceInfo = (info) => ({
+  issuer: info.node.Issuer,
+  assetScale: info.node.AssetScale,
+  maxAmt: info.node.MaximumAmount
+    ? BigInt(info.node.MaximumAmount).toString(10)
+    : undefined, // default is undefined because the default maxAmt is the largest 63-bit int
+  outstandingAmt: info.node.OutstandingAmount
+    ? BigInt(info.node.OutstandingAmount).toString(10)
+    : '0',
+  transferFee: info.node.TransferFee,
+  sequence: info.node.Sequence,
+  metadata: info.node.MPTokenMetadata
+    ? decodeHex(info.node.MPTokenMetadata)
+    : info.node.MPTokenMetadata,
+  flags: buildFlags(info.node.Flags, MPT_ISSUANCE_FLAGS),
+})
+
+const formatMPTokenInfo = (info) => ({
+  account: info.Account,
+  flags: buildFlags(info.Flags, MPTOKEN_FLAGS),
+  mptIssuanceID: info.MPTokenIssuanceID,
+  mptIssuer: encodeAccountID(
+    hexToBytes(info.MPTokenIssuanceID.substring(8, 48)),
+  ),
+  mptAmount: info.MPTAmount ? info.MPTAmount.toString(10) : '0',
+})
+
 export {
   XRP_BASE,
   RippledError as Error,
@@ -137,4 +178,6 @@ export {
   formatAccountInfo,
   convertHexToString,
   formatNFTInfo,
+  formatMPTIssuanceInfo,
+  formatMPTokenInfo,
 }

From 6d1d9d14b9ec234d6a8ff5fe32931f335c8dafb7 Mon Sep 17 00:00:00 2001
From: pdp2121 <71317875+pdp2121@users.noreply.github.com>
Date: Mon, 14 Oct 2024 14:05:00 -0400
Subject: [PATCH 47/79] Add metadata styling for Multi Purpose Token (#1057)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

## High Level Overview of Change

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

MPTokenMetadata is an essential part of a MPT token as it allows issuers
to define their own metadata standards, tailored to their specific
requirements, encompassing details like asset codes, common names,
symbols, or even visual representations.

This PR formats the display of this metadata field in the Explorer by
adding json formatter for readability.

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->
Spec:
https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0033d-multi-purpose-tokens

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

MPTokenIssuanceCreate Page:

![Screenshot 2024-10-10 at 3 53
01 PM](https://github.com/user-attachments/assets/eb0b6f27-3d8e-494a-9af0-00f96f119d3e)

MPT Page:
![Screenshot 2024-10-10 at 3 53
20 PM](https://github.com/user-attachments/assets/5316a92f-4c22-4dcf-82cd-3dd6f6a6f3f8)
---
 src/containers/MPT/MPTHeader/Details.tsx         | 16 ++++++++++++++--
 src/containers/MPT/MPTHeader/styles.scss         |  4 ++++
 .../Transaction/MPTokenIssuanceCreate/Simple.tsx | 10 ++++++++--
 .../MPTokenIssuanceCreate/styles.scss            |  3 +++
 src/containers/shared/utils.js                   |  9 +++++++++
 5 files changed, 38 insertions(+), 4 deletions(-)
 create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/styles.scss

diff --git a/src/containers/MPT/MPTHeader/Details.tsx b/src/containers/MPT/MPTHeader/Details.tsx
index b980380c0..6a0e3d9f1 100644
--- a/src/containers/MPT/MPTHeader/Details.tsx
+++ b/src/containers/MPT/MPTHeader/Details.tsx
@@ -1,9 +1,10 @@
 import { useTranslation } from 'react-i18next'
 import './styles.scss'
 import { useLanguage } from '../../shared/hooks'
-import { localizeNumber } from '../../shared/utils'
+import { isValidJsonString, localizeNumber } from '../../shared/utils'
 import { MPTIssuanceFormattedInfo } from '../../shared/Interfaces'
 import { TokenTableRow } from '../../shared/components/TokenTableRow'
+import { JsonView } from '../../shared/components/JsonView'
 
 interface Props {
   data: MPTIssuanceFormattedInfo
@@ -41,7 +42,18 @@ export const Details = ({ data }: Props) => {
         )}
         <TokenTableRow label={t('transfer_fee')} value={formattedFee ?? '0%'} />
         <TokenTableRow label={t('sequence_number_short')} value={sequence} />
-        {metadata && <TokenTableRow label={t('metadata')} value={metadata} />}
+        {metadata && (
+          <TokenTableRow
+            label={t('metadata')}
+            value={
+              isValidJsonString(metadata) ? (
+                <JsonView data={JSON.parse(metadata)} />
+              ) : (
+                metadata
+              )
+            }
+          />
+        )}
       </tbody>
     </table>
   )
diff --git a/src/containers/MPT/MPTHeader/styles.scss b/src/containers/MPT/MPTHeader/styles.scss
index fc1b25e01..682ea36e4 100644
--- a/src/containers/MPT/MPTHeader/styles.scss
+++ b/src/containers/MPT/MPTHeader/styles.scss
@@ -17,6 +17,10 @@
       @include for-size(desktop-up) {
         width: 490px;
       }
+
+      .jv-indent {
+        border-left: none;
+      }
     }
 
     .settings {
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx
index dc80d5625..218ae93d2 100644
--- a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx
@@ -3,8 +3,10 @@ import { SimpleRow } from '../SimpleRow'
 import { TransactionSimpleComponent, TransactionSimpleProps } from '../types'
 import { MPTokenIssuanceCreateInstructions } from './types'
 import { useLanguage } from '../../../hooks'
-import { localizeNumber } from '../../../utils'
+import { isValidJsonString, localizeNumber } from '../../../utils'
 import { MPTokenLink } from '../../MPTokenLink'
+import { JsonView } from '../../JsonView'
+import './styles.scss'
 
 export const Simple: TransactionSimpleComponent = ({
   data,
@@ -55,7 +57,11 @@ export const Simple: TransactionSimpleComponent = ({
           className="dt"
           data-test="mpt-metadata"
         >
-          {metadata}
+          {isValidJsonString(metadata) ? (
+            <JsonView data={JSON.parse(metadata)} />
+          ) : (
+            metadata
+          )}
         </SimpleRow>
       )}
     </>
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/styles.scss b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/styles.scss
new file mode 100644
index 000000000..f7ce40841
--- /dev/null
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/styles.scss
@@ -0,0 +1,3 @@
+.jv-indent {
+  border-left: none;
+}
diff --git a/src/containers/shared/utils.js b/src/containers/shared/utils.js
index ac510adeb..9046410e0 100644
--- a/src/containers/shared/utils.js
+++ b/src/containers/shared/utils.js
@@ -129,6 +129,15 @@ export const isEarlierVersion = (source, target) => {
   return false
 }
 
+export const isValidJsonString = (str) => {
+  try {
+    JSON.parse(str)
+    return true
+  } catch (e) {
+    return false
+  }
+}
+
 // Document: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat
 export const localizeNumber = (
   num,

From 22795133e0ea18556dcd8c2230dd5eea845977f4 Mon Sep 17 00:00:00 2001
From: pdp2121 <71317875+pdp2121@users.noreply.github.com>
Date: Tue, 15 Oct 2024 11:00:42 -0400
Subject: [PATCH 48/79] Use feature rpc for EnableAmendment (#1052)

## High Level Overview of Change

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

With the new feature RPC introduced in [rippled
2.2.0](https://github.com/XRPLF/rippled/releases/tag/2.2.0),
EnableAmendment tx Simple page can populate its data using amendment id
without dependence on xrpl.org and rippled docs (which change pretty
frequently):


https://github.com/ripple/explorer/blob/staging/src/containers/shared/amendmentUtils.ts

The logic would be simplified and consistency would be improved

This resolves: https://github.com/ripple/explorer/issues/1001

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release
---
 .../Transactions/test/SimpleTab.test.tsx      |  21 ++-
 src/containers/shared/amendmentUtils.ts       |  41 -----
 .../Transaction/EnableAmendment/Simple.tsx    |  40 ++---
 .../test/EnableAmendmentSimple.test.tsx       |  51 ++++--
 .../mock_data/FeatureExpandedSignerList.json  |   7 +
 .../test/mock_data/FeatureNegativeUNL.json    |   7 +
 .../shared/test/amendmentUtils.test.ts        | 168 +-----------------
 src/rippled/lib/rippled.js                    |  16 ++
 8 files changed, 94 insertions(+), 257 deletions(-)
 create mode 100644 src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureExpandedSignerList.json
 create mode 100644 src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureNegativeUNL.json

diff --git a/src/containers/Transactions/test/SimpleTab.test.tsx b/src/containers/Transactions/test/SimpleTab.test.tsx
index 652ded5b7..bce4d5502 100644
--- a/src/containers/Transactions/test/SimpleTab.test.tsx
+++ b/src/containers/Transactions/test/SimpleTab.test.tsx
@@ -9,23 +9,36 @@ import { SimpleTab } from '../SimpleTab'
 import summarize from '../../../rippled/lib/txSummary'
 import i18n from '../../../i18n/testConfig'
 import { expectSimpleRowText } from '../../shared/components/Transaction/test'
+import SocketContext from '../../shared/SocketContext'
+import MockWsClient from '../../test/mockWsClient'
 import { queryClient } from '../../shared/QueryClient'
 
 describe('SimpleTab container', () => {
+  let client
   const createWrapper = (tx, width = 1200) =>
     mount(
       <Router>
         <QueryClientProvider client={queryClient}>
           <I18nextProvider i18n={i18n}>
-            <SimpleTab
-              data={{ processed: tx, summary: summarize(tx, true).details }}
-              width={width}
-            />
+            <SocketContext.Provider value={client}>
+              <SimpleTab
+                data={{ processed: tx, summary: summarize(tx, true).details }}
+                width={width}
+              />
+            </SocketContext.Provider>
           </I18nextProvider>
         </QueryClientProvider>
       </Router>,
     )
 
+  beforeEach(() => {
+    client = new MockWsClient()
+  })
+
+  afterEach(() => {
+    client.close()
+  })
+
   it('renders EnableAmendment without crashing', () => {
     const wrapper = createWrapper(EnableAmendment)
     wrapper.unmount()
diff --git a/src/containers/shared/amendmentUtils.ts b/src/containers/shared/amendmentUtils.ts
index 96e189e33..b9e21af55 100644
--- a/src/containers/shared/amendmentUtils.ts
+++ b/src/containers/shared/amendmentUtils.ts
@@ -1,14 +1,9 @@
-import { sha512 } from '@xrplf/isomorphic/sha512'
-import { hexToBytes, bytesToHex, stringToHex } from '@xrplf/isomorphic/utils'
 import axios from 'axios'
 
 import { localizeDate } from './utils'
 
-const cachedAmendmentIDs: any = {}
 let cachedRippledVersions: any = {}
 
-const ACTIVE_AMENDMENT_REGEX = /^\s*REGISTER_F[A-Z]+\s*\((\S+),\s*.*$/
-const RETIRED_AMENDMENT_REGEX = /^ .*retireFeature\("(\S+)"\)[,;].*$/
 const TIME_ZONE = 'UTC'
 const DATE_OPTIONS = {
   hour: 'numeric',
@@ -31,42 +26,6 @@ export function getExpectedDate(date: string, language: string) {
   )
 }
 
-async function fetchAmendmentNames() {
-  const response = await axios.get(
-    'https://raw.githubusercontent.com/XRPLF/rippled/develop/src/libxrpl/protocol/Feature.cpp',
-  )
-  const text = response.data
-
-  const amendmentNames: string[] = []
-  text.split('\n').forEach((line: string) => {
-    const name = line.match(ACTIVE_AMENDMENT_REGEX)
-    if (name) {
-      amendmentNames.push(name[1])
-    } else {
-      const name2 = line.match(RETIRED_AMENDMENT_REGEX)
-      name2 && amendmentNames.push(name2[1])
-    }
-  })
-  return amendmentNames
-}
-
-function sha512Half(bytes: Uint8Array) {
-  return bytesToHex(sha512(bytes)).slice(0, 64)
-}
-
-export async function nameOfAmendmentID(id: string) {
-  if (cachedAmendmentIDs[id]) {
-    return cachedAmendmentIDs[id]
-  }
-  // The Amendment ID is the hash of the Amendment name
-  const amendmentNames = await fetchAmendmentNames()
-  amendmentNames.forEach((name) => {
-    cachedAmendmentIDs[sha512Half(hexToBytes(stringToHex(name)))] = name
-  })
-
-  return cachedAmendmentIDs[id]
-}
-
 async function fetchMinRippledVersions() {
   const response = await axios.get(
     'https://raw.githubusercontent.com/XRPLF/xrpl-dev-portal/master/resources/known-amendments.md',
diff --git a/src/containers/shared/components/Transaction/EnableAmendment/Simple.tsx b/src/containers/shared/components/Transaction/EnableAmendment/Simple.tsx
index 184faee53..35f885c53 100644
--- a/src/containers/shared/components/Transaction/EnableAmendment/Simple.tsx
+++ b/src/containers/shared/components/Transaction/EnableAmendment/Simple.tsx
@@ -1,15 +1,13 @@
-import { useEffect, useState } from 'react'
+import { useContext, useEffect, useState } from 'react'
 import { useLanguage } from '../../../hooks'
 import { SimpleRow } from '../SimpleRow'
 import { TransactionSimpleProps } from '../types'
 import { EnableAmendment } from './types'
-import {
-  getExpectedDate,
-  getRippledVersion,
-  nameOfAmendmentID,
-} from '../../../amendmentUtils'
+import { getExpectedDate, getRippledVersion } from '../../../amendmentUtils'
 import { AMENDMENT_ROUTE } from '../../../../App/routes'
 import { RouteLink } from '../../../routing'
+import SocketContext from '../../../SocketContext'
+import { getFeature } from '../../../../../rippled/lib/rippled'
 
 const states = {
   loading: 'Loading',
@@ -22,31 +20,21 @@ export const Simple = ({ data }: TransactionSimpleProps<EnableAmendment>) => {
     name: states.loading,
     minRippledVersion: states.loading,
   })
+  const rippledSocket = useContext(SocketContext)
 
   useEffect(() => {
-    nameOfAmendmentID(data.instructions.Amendment).then((name: string) => {
-      if (name) {
-        getRippledVersion(name).then((rippledVersion) => {
-          if (rippledVersion) {
-            setAmendmentDetails({
-              name,
-              minRippledVersion: rippledVersion,
-            })
-          } else {
-            setAmendmentDetails({
-              name,
-              minRippledVersion: states.unknown,
-            })
-          }
-        })
-      } else {
+    const amendmentId = data.instructions.Amendment
+    getFeature(rippledSocket, amendmentId).then((feature) => {
+      const name =
+        feature && feature[amendmentId] ? feature[amendmentId].name : ''
+      getRippledVersion(name).then((rippledVersion) => {
         setAmendmentDetails({
-          name: states.unknown,
-          minRippledVersion: states.unknown,
+          name: name || states.unknown,
+          minRippledVersion: rippledVersion || states.unknown,
         })
-      }
+      })
     })
-  }, [data.instructions.Amendment])
+  }, [data.instructions.Amendment, rippledSocket])
 
   let amendmentStatus = states.unknown
   let expectedDate: string | null = states.unknown
diff --git a/src/containers/shared/components/Transaction/EnableAmendment/test/EnableAmendmentSimple.test.tsx b/src/containers/shared/components/Transaction/EnableAmendment/test/EnableAmendmentSimple.test.tsx
index d04002da3..476931b4d 100644
--- a/src/containers/shared/components/Transaction/EnableAmendment/test/EnableAmendmentSimple.test.tsx
+++ b/src/containers/shared/components/Transaction/EnableAmendment/test/EnableAmendmentSimple.test.tsx
@@ -6,11 +6,11 @@ import { Simple } from '../Simple'
 import mockEnableAmendmentWithEnabled from './mock_data/EnableAmendmentWithEnabled.json'
 import mockEnableAmendmentWithMinority from './mock_data/EnableAmendmentWithMinority.json'
 import mockEnableAmendmentWithMajority from './mock_data/EnableAmendmentWithMajority.json'
-import {
-  getRippledVersion,
-  nameOfAmendmentID,
-} from '../../../../amendmentUtils'
+import mockFeatureExpandedSignerList from './mock_data/FeatureExpandedSignerList.json'
+import mockFeatureNegativeUNL from './mock_data/FeatureNegativeUNL.json'
+import { getRippledVersion } from '../../../../amendmentUtils'
 import { flushPromises } from '../../../../../test/utils'
+import { getFeature } from '../../../../../../rippled/lib/rippled'
 
 const createWrapper = createSimpleWrapperFactory(Simple, i18n)
 
@@ -21,22 +21,35 @@ jest.mock('../../../../amendmentUtils', () => {
     __esModule: true,
     ...originalModule,
     getRippledVersion: jest.fn(),
-    nameOfAmendmentID: jest.fn(),
+  }
+})
+
+jest.mock('../../../../../../rippled/lib/rippled', () => {
+  const originalModule = jest.requireActual(
+    '../../../../../../rippled/lib/rippled',
+  )
+
+  return {
+    __esModule: true,
+    ...originalModule,
+    getFeature: jest.fn(),
   }
 })
 
 const mockedGetRippledVersion = getRippledVersion as jest.MockedFunction<
   typeof getRippledVersion
 >
-const mockedNameOfAmendmentID = nameOfAmendmentID as jest.MockedFunction<
-  typeof nameOfAmendmentID
->
+
+const mockedGetFeature = getFeature as jest.MockedFunction<typeof getFeature>
 
 describe('EnableAmendment: Simple', () => {
+  afterEach(() => {
+    mockedGetFeature.mockReset()
+  })
   it('renders tx that causes an amendment to loose majority', async () => {
     mockedGetRippledVersion.mockImplementation(() => Promise.resolve('v1.9.1'))
-    mockedNameOfAmendmentID.mockImplementation(() =>
-      Promise.resolve('ExpandedSignerList'),
+    mockedGetFeature.mockImplementation(() =>
+      Promise.resolve(mockFeatureExpandedSignerList),
     )
     const wrapper = createWrapper(mockEnableAmendmentWithMinority)
     expectSimpleRowLabel(wrapper, 'name', 'Amendment Name')
@@ -58,8 +71,8 @@ describe('EnableAmendment: Simple', () => {
 
   it('renders tx that causes an amendment to gain majority', async () => {
     mockedGetRippledVersion.mockImplementation(() => Promise.resolve('v1.9.1'))
-    mockedNameOfAmendmentID.mockImplementation(() =>
-      Promise.resolve('ExpandedSignerList'),
+    mockedGetFeature.mockImplementation(() =>
+      Promise.resolve(mockFeatureExpandedSignerList),
     )
     const wrapper = createWrapper(mockEnableAmendmentWithMajority)
     expectSimpleRowLabel(wrapper, 'name', 'Amendment Name')
@@ -86,8 +99,8 @@ describe('EnableAmendment: Simple', () => {
 
   it('renders tx that enables an amendment', async () => {
     mockedGetRippledVersion.mockImplementation(() => Promise.resolve('v1.7.3'))
-    mockedNameOfAmendmentID.mockImplementation(() =>
-      Promise.resolve('NegativeUNL'),
+    mockedGetFeature.mockImplementation(() =>
+      Promise.resolve(mockFeatureNegativeUNL),
     )
     const wrapper = createWrapper(mockEnableAmendmentWithEnabled)
     expectSimpleRowLabel(wrapper, 'name', 'Amendment Name')
@@ -108,7 +121,7 @@ describe('EnableAmendment: Simple', () => {
 
   it('renders tx that cannot determine version or name', async () => {
     mockedGetRippledVersion.mockImplementation(() => Promise.resolve(''))
-    mockedNameOfAmendmentID.mockImplementation(() => Promise.resolve(''))
+    mockedGetFeature.mockImplementation(() => Promise.resolve(null))
     const wrapper = createWrapper(mockEnableAmendmentWithEnabled)
     expectSimpleRowLabel(wrapper, 'name', 'Amendment Name')
     expectSimpleRowText(wrapper, 'name', 'Loading')
@@ -124,8 +137,8 @@ describe('EnableAmendment: Simple', () => {
 
   it('renders tx that cannot determine version', async () => {
     mockedGetRippledVersion.mockImplementation(() => Promise.resolve(''))
-    mockedNameOfAmendmentID.mockImplementation(() =>
-      Promise.resolve('NegativeUNL'),
+    mockedGetFeature.mockImplementation(() =>
+      Promise.resolve(mockFeatureNegativeUNL),
     )
     const wrapper = createWrapper(mockEnableAmendmentWithEnabled)
     expectSimpleRowLabel(wrapper, 'name', 'Amendment Name')
@@ -142,7 +155,7 @@ describe('EnableAmendment: Simple', () => {
 
   it('renders tx that cannot determine name', async () => {
     mockedGetRippledVersion.mockImplementation(() => Promise.resolve('v1.7.3'))
-    mockedNameOfAmendmentID.mockImplementation(() => Promise.resolve(''))
+    mockedGetFeature.mockImplementation(() => Promise.resolve(null))
     const wrapper = createWrapper(mockEnableAmendmentWithEnabled)
     expectSimpleRowLabel(wrapper, 'name', 'Amendment Name')
     expectSimpleRowText(wrapper, 'name', 'Loading')
@@ -153,6 +166,6 @@ describe('EnableAmendment: Simple', () => {
     wrapper.update()
 
     expectSimpleRowText(wrapper, 'name', 'Unknown')
-    expectSimpleRowText(wrapper, 'version', 'Unknown')
+    expectSimpleRowText(wrapper, 'version', 'v1.7.3')
   })
 })
diff --git a/src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureExpandedSignerList.json b/src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureExpandedSignerList.json
new file mode 100644
index 000000000..09635f407
--- /dev/null
+++ b/src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureExpandedSignerList.json
@@ -0,0 +1,7 @@
+{
+  "B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856": {
+    "enabled": false,
+    "name": "ExpandedSignerList",
+    "supported": true
+  }
+}
diff --git a/src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureNegativeUNL.json b/src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureNegativeUNL.json
new file mode 100644
index 000000000..56341a552
--- /dev/null
+++ b/src/containers/shared/components/Transaction/EnableAmendment/test/mock_data/FeatureNegativeUNL.json
@@ -0,0 +1,7 @@
+{
+  "B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076": {
+    "enabled": false,
+    "name": "NegativeUNL",
+    "supported": true
+  }
+}
diff --git a/src/containers/shared/test/amendmentUtils.test.ts b/src/containers/shared/test/amendmentUtils.test.ts
index f7f21e645..e4ef9d4e6 100644
--- a/src/containers/shared/test/amendmentUtils.test.ts
+++ b/src/containers/shared/test/amendmentUtils.test.ts
@@ -1,170 +1,4 @@
-import { getRippledVersion, nameOfAmendmentID } from '../amendmentUtils'
-
-const nameTable = [
-  [
-    '32A122F1352A4C7B3A6D790362CC34749C5E57FCE896377BFDC6CCD14F6CD627',
-    'NonFungibleTokensV1_1',
-  ],
-  [
-    '4C97EBA926031A7CF7D7B36FDE3ED66DDA5421192D63DE53FFB46E43B9DC8373',
-    'MultiSign',
-  ],
-  [
-    '6781F8368C4771B83E8B821D88F580202BCB4228075297B19E4FDC5233F1EFDC',
-    'TrustSetAuth',
-  ],
-  [
-    '42426C4D4F1009EE67080A9B7965B44656D7714D104A72F9B4369F97ABF044EE',
-    'FeeEscalation',
-  ],
-  [
-    '08DE7D96082187F6E6578530258C77FAABABE4C20474BDB82F04B021F1A68647',
-    'PayChan',
-  ],
-  ['740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D628A06927F11', 'Flow'],
-  [
-    '1562511F573A19AE9BD103B5D6B9E01B3B46805AEC5D3C4805C902B514399146',
-    'CryptoConditions',
-  ],
-  [
-    '532651B4FD58DF8922A49BA101AB3E996E5BFBF95A913B3E392504863E63B164',
-    'TickSize',
-  ],
-  [
-    'E2E6F2866106419B88C50045ACE96368558C345566AC8F2BDF5A5B5587F0E6FA',
-    'fix1368',
-  ],
-  [
-    '07D43DCE529B15A10827E5E04943B496762F9A88E3268269D69C44BE49E21104',
-    'Escrow',
-  ],
-  [
-    '86E83A7D2ECE3AD5FA87AB2195AE015C950469ABF0B72EAACED318F74886AE90',
-    'CryptoConditionsSuite',
-  ],
-  [
-    '42EEA5E28A97824821D4EF97081FE36A54E9593C6E4F20CBAE098C69D2E072DC',
-    'fix1373',
-  ],
-  [
-    'DC9CA96AEA1DCF83E527D1AFC916EFAF5D27388ECA4060A88817C1238CAEE0BF',
-    'EnforceInvariants',
-  ],
-  [
-    '3012E8230864E95A58C60FD61430D7E1B4D3353195F2981DC12B0C7C0950FFAC',
-    'FlowCross',
-  ],
-  [
-    'CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E',
-    'SortedDirectories',
-  ],
-  [
-    'B4D44CC3111ADD964E846FC57760C8B50FFCD5A82C86A72756F6B058DDDF96AD',
-    'fix1201',
-  ],
-  [
-    '6C92211186613F9647A89DFFBAB8F94C99D4C7E956D495270789128569177DA1',
-    'fix1512',
-  ],
-  [
-    '67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172',
-    'fix1513',
-  ],
-  [
-    'B9E739B8296B4A1BB29BE990B17D66E21B62A300A909F25AC55C22D6C72E1F9D',
-    'fix1523',
-  ],
-  [
-    '1D3463A5891F9E589C5AE839FFAC4A917CE96197098A1EF22304E1BC5B98A454',
-    'fix1528',
-  ],
-  [
-    'F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064',
-    'DepositAuth',
-  ],
-  [
-    '157D2D480E006395B76F948E3E07A45A05FE10230D88A7993C71F97AE4B1F2D1',
-    'Checks',
-  ],
-  [
-    '7117E2EC2DBF119CA55181D69819F1999ECEE1A0225A7FD2B9ED47940968479C',
-    'fix1571',
-  ],
-  [
-    'CA7C02118BA27599528543DFE77BA6838D1B0F43B447D4D7F53523CE6A0E9AC2',
-    'fix1543',
-  ],
-  [
-    '58BE9B5968C4DA7C59BA900961828B113E5490699B21877DEF9A31E9D0FE5D5F',
-    'fix1623',
-  ],
-  [
-    '3CBC5C4E630A1B82380295CDA84B32B49DD066602E74E39B85EF64137FA65194',
-    'DepositPreauth',
-  ],
-  [
-    '5D08145F0A4983F23AFFFF514E83FAD355C5ABFBB6CAB76FB5BC8519FF5F33BE',
-    'fix1515',
-  ],
-  [
-    'FBD513F1B893AC765B78F250E6FFA6A11B573209D1842ADC787C850696741288',
-    'fix1578',
-  ],
-  [
-    '586480873651E106F1D6339B0C4A8945BA705A777F3F4524626FF1FC07EFE41D',
-    'MultiSignReserve',
-  ],
-  [
-    '2CD5286D8D687E98B41102BDD797198E81EA41DF7BD104E6561FEB104EFF2561',
-    'fixTakerDryOfferRemoval',
-  ],
-  [
-    'C4483A1896170C66C098DEA5B0E024309C60DC960DE5F01CD7AF986AA3D9AD37',
-    'fixMasterKeyAsRegularKey',
-  ],
-  [
-    '8F81B066ED20DAECA20DF57187767685EEF3980B228E0667A650BAF24426D3B4',
-    'fixCheckThreading',
-  ],
-  [
-    '621A0B264970359869E3C0363A899909AAB7A887C8B73519E4ECF952D33258A8',
-    'fixPayChanRecipientOwnerDir',
-  ],
-  [
-    '30CD365592B8EE40489BA01AE2F7555CAC9C983145871DC82A42A31CF5BAE7D9',
-    'DeletableAccounts',
-  ],
-  [
-    '89308AF3B8B10B7192C4E613E1D2E4D9BA64B2EE2D5232402AE82A6A7220D953',
-    'fixQualityUpperBound',
-  ],
-  [
-    '00C1FC4A53E60AB02C864641002B3172F38677E29C26C5406685179B37E1EDAC',
-    'RequireFullyCanonicalSig',
-  ],
-  [
-    '25BA44241B3BD880770BFA4DA21C7180576831855368CBEC6A3154FDE4A7676E',
-    'fix1781',
-  ],
-  [
-    '1F4AFA8FA1BC8827AD4C0F682C03A8B671DCDF6B5C4DE36D44243A684103EF88',
-    'HardenedValidations',
-  ],
-  [
-    '4F46DF03559967AC60F2EB272FEFE3928A7594A45FF774B87A7E540DB0F8F068',
-    'fixAmendmentMajorityCalc',
-  ],
-]
-
-describe('nameOfAmendmentID: ', () => {
-  it.each(nameTable)(
-    `should resolve amendment id "%s" to "%s"`,
-    async (id, name) => {
-      const retrievedName = await nameOfAmendmentID(id)
-      return expect(retrievedName).toEqual(name)
-    },
-  )
-})
+import { getRippledVersion } from '../amendmentUtils'
 
 const versionTable = [
   ['NonFungibleTokensV1_1', 'v1.9.2'],
diff --git a/src/rippled/lib/rippled.js b/src/rippled/lib/rippled.js
index c77c6584d..dc7737309 100644
--- a/src/rippled/lib/rippled.js
+++ b/src/rippled/lib/rippled.js
@@ -557,6 +557,21 @@ const getAMMInfo = (rippledSocket, asset, asset2) => {
   })
 }
 
+// get feature
+const getFeature = (rippledSocket, amendmentId) => {
+  const request = {
+    command: 'feature',
+    feature: amendmentId,
+  }
+  return query(rippledSocket, request).then((resp) => {
+    if (resp == null || resp.error_message) {
+      return null
+    }
+
+    return resp
+  })
+}
+
 const getMPTIssuance = (rippledSocket, tokenId) =>
   query(rippledSocket, {
     command: 'ledger_entry',
@@ -624,6 +639,7 @@ export {
   getSellNFToffers,
   getNFTTransactions,
   getAMMInfo,
+  getFeature,
   getMPTIssuance,
   getAccountMPTs,
 }

From 3df3fb47320e2400b26c5fff4d1e809c446cde04 Mon Sep 17 00:00:00 2001
From: achowdhry-ripple <achowdhry@ripple.com>
Date: Tue, 15 Oct 2024 15:13:10 -0400
Subject: [PATCH 49/79] Change icon URL to correct path (#1055)

## High Level Overview of Change

Google chrome search result icon was broken, edited links to point to
correct assets.
<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 src/index.html | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/index.html b/src/index.html
index 514732776..8109d44f4 100644
--- a/src/index.html
+++ b/src/index.html
@@ -15,8 +15,9 @@
     -->
   <link rel="manifest" href="/manifest.json">
   <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
-  <link href="/apple-touch-icon.png" rel="apple-touch-icon" />
-  <link href="/android-icon.png" rel="icon" sizes=”192×192″ />
+  <link href="../public/apple-touch-icon.png" rel="apple-touch-icon" />
+  <link href="../public/android-icon.png" rel="icon" sizes="192×192" />
+  <link href="../public/favicon.ico" type="image/x-icon" rel="icon" sizes="64x64 32x32 24x24 16x16" />
   <link rel="preconnect" href="https://fonts.googleapis.com">
   <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
   <link href="https://fonts.googleapis.com/css2?family=Work+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&display=swap" rel="stylesheet">

From 98195b0cdef78d91c2e22d1fdc51c35a1780e476 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 1 Nov 2024 16:13:29 +0000
Subject: [PATCH 50/79] chore(deps-dev): bump eslint-plugin-import from 2.29.1
 to 2.31.0 (#1068)

---
 package-lock.json | 158 ++++++++++++++++++++++++++--------------------
 package.json      |   2 +-
 2 files changed, 91 insertions(+), 69 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 0c886fb87..648ef38b2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -84,7 +84,7 @@
         "eslint-config-prettier": "^9.1.0",
         "eslint-config-react-app": "^7.0.1",
         "eslint-plugin-flowtype": "^8.0.3",
-        "eslint-plugin-import": "^2.29.1",
+        "eslint-plugin-import": "^2.31.0",
         "eslint-plugin-jsx-a11y": "^6.9.0",
         "eslint-plugin-prettier": "^5.1.3",
         "eslint-plugin-react": "^7.34.2",
@@ -5723,6 +5723,12 @@
         "win32"
       ]
     },
+    "node_modules/@rtsao/scc": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+      "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+      "dev": true
+    },
     "node_modules/@rushstack/eslint-patch": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz",
@@ -7447,16 +7453,17 @@
       }
     },
     "node_modules/array.prototype.findlastindex": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
-      "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+      "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "es-shim-unscopables": "^1.0.0",
-        "get-intrinsic": "^1.2.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-shim-unscopables": "^1.0.2"
       },
       "engines": {
         "node": ">= 0.4"
@@ -11450,9 +11457,9 @@
       }
     },
     "node_modules/eslint-module-utils": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
-      "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+      "version": "2.12.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+      "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
       "dev": true,
       "dependencies": {
         "debug": "^3.2.7"
@@ -11494,34 +11501,36 @@
       }
     },
     "node_modules/eslint-plugin-import": {
-      "version": "2.29.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
-      "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
+      "version": "2.31.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+      "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
       "dev": true,
       "dependencies": {
-        "array-includes": "^3.1.7",
-        "array.prototype.findlastindex": "^1.2.3",
+        "@rtsao/scc": "^1.1.0",
+        "array-includes": "^3.1.8",
+        "array.prototype.findlastindex": "^1.2.5",
         "array.prototype.flat": "^1.3.2",
         "array.prototype.flatmap": "^1.3.2",
         "debug": "^3.2.7",
         "doctrine": "^2.1.0",
         "eslint-import-resolver-node": "^0.3.9",
-        "eslint-module-utils": "^2.8.0",
-        "hasown": "^2.0.0",
-        "is-core-module": "^2.13.1",
+        "eslint-module-utils": "^2.12.0",
+        "hasown": "^2.0.2",
+        "is-core-module": "^2.15.1",
         "is-glob": "^4.0.3",
         "minimatch": "^3.1.2",
-        "object.fromentries": "^2.0.7",
-        "object.groupby": "^1.0.1",
-        "object.values": "^1.1.7",
+        "object.fromentries": "^2.0.8",
+        "object.groupby": "^1.0.3",
+        "object.values": "^1.2.0",
         "semver": "^6.3.1",
+        "string.prototype.trimend": "^1.0.8",
         "tsconfig-paths": "^3.15.0"
       },
       "engines": {
         "node": ">=4"
       },
       "peerDependencies": {
-        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
       }
     },
     "node_modules/eslint-plugin-import/node_modules/debug": {
@@ -14166,12 +14175,15 @@
       }
     },
     "node_modules/is-core-module": {
-      "version": "2.13.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
-      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+      "version": "2.15.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
       "dev": true,
       "dependencies": {
-        "hasown": "^2.0.0"
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -22796,15 +22808,17 @@
       }
     },
     "node_modules/object.groupby": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
-      "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+      "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       }
     },
     "node_modules/object.hasown": {
@@ -32322,6 +32336,12 @@
       "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
       "optional": true
     },
+    "@rtsao/scc": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+      "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+      "dev": true
+    },
     "@rushstack/eslint-patch": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz",
@@ -33493,16 +33513,17 @@
       }
     },
     "array.prototype.findlastindex": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
-      "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+      "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "es-shim-unscopables": "^1.0.0",
-        "get-intrinsic": "^1.2.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-shim-unscopables": "^1.0.2"
       }
     },
     "array.prototype.flat": {
@@ -36535,9 +36556,9 @@
       }
     },
     "eslint-module-utils": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
-      "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+      "version": "2.12.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+      "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
       "dev": true,
       "requires": {
         "debug": "^3.2.7"
@@ -36565,27 +36586,29 @@
       }
     },
     "eslint-plugin-import": {
-      "version": "2.29.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
-      "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
+      "version": "2.31.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+      "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
       "dev": true,
       "requires": {
-        "array-includes": "^3.1.7",
-        "array.prototype.findlastindex": "^1.2.3",
+        "@rtsao/scc": "^1.1.0",
+        "array-includes": "^3.1.8",
+        "array.prototype.findlastindex": "^1.2.5",
         "array.prototype.flat": "^1.3.2",
         "array.prototype.flatmap": "^1.3.2",
         "debug": "^3.2.7",
         "doctrine": "^2.1.0",
         "eslint-import-resolver-node": "^0.3.9",
-        "eslint-module-utils": "^2.8.0",
-        "hasown": "^2.0.0",
-        "is-core-module": "^2.13.1",
+        "eslint-module-utils": "^2.12.0",
+        "hasown": "^2.0.2",
+        "is-core-module": "^2.15.1",
         "is-glob": "^4.0.3",
         "minimatch": "^3.1.2",
-        "object.fromentries": "^2.0.7",
-        "object.groupby": "^1.0.1",
-        "object.values": "^1.1.7",
+        "object.fromentries": "^2.0.8",
+        "object.groupby": "^1.0.3",
+        "object.values": "^1.2.0",
         "semver": "^6.3.1",
+        "string.prototype.trimend": "^1.0.8",
         "tsconfig-paths": "^3.15.0"
       },
       "dependencies": {
@@ -38144,12 +38167,12 @@
       }
     },
     "is-core-module": {
-      "version": "2.13.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
-      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+      "version": "2.15.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
       "dev": true,
       "requires": {
-        "hasown": "^2.0.0"
+        "hasown": "^2.0.2"
       }
     },
     "is-data-descriptor": {
@@ -44107,15 +44130,14 @@
       }
     },
     "object.groupby": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
-      "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+      "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "get-intrinsic": "^1.2.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2"
       }
     },
     "object.hasown": {
diff --git a/package.json b/package.json
index f04822efe..cf01b376e 100644
--- a/package.json
+++ b/package.json
@@ -79,7 +79,7 @@
     "eslint-config-prettier": "^9.1.0",
     "eslint-config-react-app": "^7.0.1",
     "eslint-plugin-flowtype": "^8.0.3",
-    "eslint-plugin-import": "^2.29.1",
+    "eslint-plugin-import": "^2.31.0",
     "eslint-plugin-jsx-a11y": "^6.9.0",
     "eslint-plugin-prettier": "^5.1.3",
     "eslint-plugin-react": "^7.34.2",

From a59444ab947a02d178502ff5b335a7d23ef24868 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 1 Nov 2024 16:19:42 +0000
Subject: [PATCH 51/79] chore(deps): bump vite-plugin-html from 3.2.0 to 3.2.2
 (#1065)

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 648ef38b2..891292ded 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -56,7 +56,7 @@
         "usehooks-ts": "^3.1.0",
         "vite": "^5.4.8",
         "vite-plugin-environment": "^1.1.3",
-        "vite-plugin-html": "^3.2.0",
+        "vite-plugin-html": "^3.2.2",
         "vite-plugin-svgr": "^4.2.0",
         "vite-tsconfig-paths": "^4.2.0",
         "xrpl-client": "^2.4.0"
@@ -27662,9 +27662,9 @@
       }
     },
     "node_modules/vite-plugin-html": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-3.2.0.tgz",
-      "integrity": "sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz",
+      "integrity": "sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==",
       "dependencies": {
         "@rollup/pluginutils": "^4.2.0",
         "colorette": "^2.0.16",
@@ -47532,9 +47532,9 @@
       "requires": {}
     },
     "vite-plugin-html": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-3.2.0.tgz",
-      "integrity": "sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz",
+      "integrity": "sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==",
       "requires": {
         "@rollup/pluginutils": "^4.2.0",
         "colorette": "^2.0.16",
diff --git a/package.json b/package.json
index cf01b376e..ac4945fac 100644
--- a/package.json
+++ b/package.json
@@ -51,7 +51,7 @@
     "usehooks-ts": "^3.1.0",
     "vite": "^5.4.8",
     "vite-plugin-environment": "^1.1.3",
-    "vite-plugin-html": "^3.2.0",
+    "vite-plugin-html": "^3.2.2",
     "vite-plugin-svgr": "^4.2.0",
     "vite-tsconfig-paths": "^4.2.0",
     "xrpl-client": "^2.4.0"

From 4cb097520fadbe1b2acbff7cd347b204e7f3c1c6 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 1 Nov 2024 16:25:18 +0000
Subject: [PATCH 52/79] chore(deps): bump autoprefixer from 10.4.17 to 10.4.20
 (#1066)

---
 package-lock.json | 26 +++++++++++++-------------
 package.json      |  2 +-
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 891292ded..f5af62c42 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
         "@xrplf/isomorphic": "^1.0.0-beta.1",
         "@xrplf/prettier-config": "^1.9.1",
         "assert": "^2.1.0",
-        "autoprefixer": "^10.4.17",
+        "autoprefixer": "^10.4.20",
         "axios": "^1.6.5",
         "body-parser": "^1.20.2",
         "bunyan": "^1.8.15",
@@ -7649,9 +7649,9 @@
       }
     },
     "node_modules/autoprefixer": {
-      "version": "10.4.17",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz",
-      "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==",
+      "version": "10.4.20",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+      "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
       "funding": [
         {
           "type": "opencollective",
@@ -7667,11 +7667,11 @@
         }
       ],
       "dependencies": {
-        "browserslist": "^4.22.2",
-        "caniuse-lite": "^1.0.30001578",
+        "browserslist": "^4.23.3",
+        "caniuse-lite": "^1.0.30001646",
         "fraction.js": "^4.3.7",
         "normalize-range": "^0.1.2",
-        "picocolors": "^1.0.0",
+        "picocolors": "^1.0.1",
         "postcss-value-parser": "^4.2.0"
       },
       "bin": {
@@ -33659,15 +33659,15 @@
       "dev": true
     },
     "autoprefixer": {
-      "version": "10.4.17",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz",
-      "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==",
+      "version": "10.4.20",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+      "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
       "requires": {
-        "browserslist": "^4.22.2",
-        "caniuse-lite": "^1.0.30001578",
+        "browserslist": "^4.23.3",
+        "caniuse-lite": "^1.0.30001646",
         "fraction.js": "^4.3.7",
         "normalize-range": "^0.1.2",
-        "picocolors": "^1.0.0",
+        "picocolors": "^1.0.1",
         "postcss-value-parser": "^4.2.0"
       }
     },
diff --git a/package.json b/package.json
index ac4945fac..2118505fd 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
     "@xrplf/isomorphic": "^1.0.0-beta.1",
     "@xrplf/prettier-config": "^1.9.1",
     "assert": "^2.1.0",
-    "autoprefixer": "^10.4.17",
+    "autoprefixer": "^10.4.20",
     "axios": "^1.6.5",
     "body-parser": "^1.20.2",
     "bunyan": "^1.8.15",

From 5a93a6d133a11b27968536811266261f475d9e99 Mon Sep 17 00:00:00 2001
From: achowdhry-ripple <achowdhry@ripple.com>
Date: Wed, 6 Nov 2024 12:48:16 -0500
Subject: [PATCH 53/79] Add Token Search Results (#1056)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

## High Level Overview of Change

In order to improve the usability of the search bar inside of Explorer,
matching tokens will now auto-populate as a user is typing. The results
are clickable and redirect to the respective token page. The data is
pulled from XRPLMeta and cached inside of the Explorer backend to
display an open sourced list of tokens and relevant statistics.

Backend changes implement serverside caching of tokens data from XRPL
Meta, and exposes an API from the explorer backend for search result
querying. This is less expensive than the previous approach of
websockets (which remain open for the duration of a user session) and
are susceptible to rate limits on XRPLMeta's public node infrastructure.
This also offers resilience in the case that the public XRPLMeta node
has downtime.

Desktop:
<img width="906" alt="Screenshot 2024-11-05 at 4 36 33 PM"
src="https://github.com/user-attachments/assets/8f19503d-74fc-474f-b946-534c028ce4a9">

Mobile:
<img width="453" alt="Screenshot 2024-11-05 at 4 37 26 PM"
src="https://github.com/user-attachments/assets/3ba5ba0d-1fe0-4bfd-97fe-a32f12420490">


<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->

---------

Co-authored-by: Phu Pham <ppham@ripple.com>
Co-authored-by: pdp2121 <71317875+pdp2121@users.noreply.github.com>
Co-authored-by: Caleb Kniffen <ckniffen@ripple.com>
---
 public/locales/ca-CA/translations.json        |   6 +-
 public/locales/en-US/translations.json        |   8 +-
 public/locales/es-ES/translations.json        |   6 +-
 public/locales/fr-FR/translations.json        |   6 +-
 public/locales/ja-JP/translations.json        |   6 +-
 public/locales/ko-KR/translations.json        |   6 +-
 server/routes/v1/index.js                     |   2 +
 server/routes/v1/tokens.js                    | 121 +++++++++++++++
 src/containers/Header/Search.tsx              |  72 +++++++--
 src/containers/Header/search.scss             |  76 ++++++++++
 src/containers/Header/test/Header.test.tsx    |   6 +-
 src/containers/Header/test/Search.test.js     |   6 +-
 src/containers/shared/analytics.ts            |   1 +
 .../shared/components/DomainLink.tsx          |  11 +-
 .../TokenSearchResults/TokenSearchResults.tsx |  95 ++++++++++++
 .../TokenSearchResults/TokenSearchRow.tsx     | 122 +++++++++++++++
 .../components/TokenSearchResults/styles.scss | 142 ++++++++++++++++++
 .../test/TokenSearchResults.test.js           |  75 +++++++++
 .../test/mock_data/tokens.json                |  45 ++++++
 .../components/test/DomainLink.test.tsx       |   8 +
 src/containers/shared/utils.js                |   1 +
 src/rippled/lib/rippled.js                    |  21 +++
 22 files changed, 822 insertions(+), 20 deletions(-)
 create mode 100644 server/routes/v1/tokens.js
 create mode 100644 src/containers/shared/components/TokenSearchResults/TokenSearchResults.tsx
 create mode 100644 src/containers/shared/components/TokenSearchResults/TokenSearchRow.tsx
 create mode 100644 src/containers/shared/components/TokenSearchResults/styles.scss
 create mode 100644 src/containers/shared/components/TokenSearchResults/test/TokenSearchResults.test.js
 create mode 100644 src/containers/shared/components/TokenSearchResults/test/mock_data/tokens.json

diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index a39916bf5..5dfa97bdd 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -531,6 +531,9 @@
   "asset_class": null,
   "trading_pairs": null,
   "deleted": null,
+  "holders": null,
+  "trustlines": null,
+  "website": null,
   "assets.mpt_tab_title": null,
   "assets.no_mpts_message": null,
   "transaction_type_name_MPTokenIssuanceCreate": null,
@@ -553,5 +556,6 @@
   "can_escrow": null,
   "can_trade": null,
   "can_transfer": null,
-  "can_clawback": null
+  "can_clawback": null,
+  "search_results_banner": null
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index 58453bb65..4d8196175 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -21,7 +21,7 @@
   "explorer": "Explorer",
   "xrpl_org": "XRPL.org",
   "github": "GitHub",
-  "header.search.placeholder": "Search by Address, Ledger or Txn",
+  "header.search.placeholder": "Search by Token, Address, Ledger or Txn",
   "xrp": "XRP",
   "xrpl_explorer": "XRPL Explorer",
   "ledgers": "Ledgers",
@@ -540,6 +540,9 @@
   "asset_class": "Asset Class",
   "trading_pairs": "Trading Pairs",
   "deleted": "Deleted",
+  "holders": "HOLDERS: {{holders}}",
+  "trustlines": " TRUSTLINES: {{trustlines}}",
+  "website": "Wesbite",
   "mpt_issuance_id": "MPT Issuance ID",
   "asset_scale": "Asset Scale",
   "metadata": "Metadata",
@@ -553,5 +556,6 @@
   "can_escrow": "Can Escrow",
   "can_trade": "Can Trade",
   "can_transfer": "Can Transfer",
-  "can_clawback": "Can Clawback"
+  "can_clawback": "Can Clawback",
+  "search_results_banner": "Token search by name and account is now available! Try searching for USD"
 }
diff --git a/public/locales/es-ES/translations.json b/public/locales/es-ES/translations.json
index d694f1db3..3f6ff0b18 100644
--- a/public/locales/es-ES/translations.json
+++ b/public/locales/es-ES/translations.json
@@ -527,6 +527,9 @@
   "asset_class": null,
   "trading_pairs": null,
   "deleted": null,
+  "holders": null,
+  "trustlines": null,
+  "website": null,
   "assets.mpt_tab_title": null,
   "assets.no_mpts_message": null,
   "transaction_type_name_MPTokenIssuanceCreate": null,
@@ -549,5 +552,6 @@
   "can_escrow": null,
   "can_trade": null,
   "can_transfer": null,
-  "can_clawback": null
+  "can_clawback": null,
+  "search_results_banner": null
 }
diff --git a/public/locales/fr-FR/translations.json b/public/locales/fr-FR/translations.json
index d6683c855..5e2f48fde 100644
--- a/public/locales/fr-FR/translations.json
+++ b/public/locales/fr-FR/translations.json
@@ -528,6 +528,9 @@
   "asset_class": null,
   "trading_pairs": null,
   "deleted": null,
+  "holders": null,
+  "trustlines": null,
+  "website": null,
   "assets.mpt_tab_title": null,
   "assets.no_mpts_message": null,
   "transaction_type_name_MPTokenIssuanceCreate": null,
@@ -550,5 +553,6 @@
   "can_escrow": null,
   "can_trade": null,
   "can_transfer": null,
-  "can_clawback": null
+  "can_clawback": null,
+  "search_results_banner": null
 }
diff --git a/public/locales/ja-JP/translations.json b/public/locales/ja-JP/translations.json
index 9ed8133ee..f5779f900 100644
--- a/public/locales/ja-JP/translations.json
+++ b/public/locales/ja-JP/translations.json
@@ -527,6 +527,9 @@
   "asset_class": null,
   "trading_pairs": null,
   "deleted": null,
+  "holders": null,
+  "trustlines": null,
+  "website": null,
   "assets.mpt_tab_title": null,
   "assets.no_mpts_message": null,
   "transaction_type_name_MPTokenIssuanceCreate": null,
@@ -549,5 +552,6 @@
   "can_escrow": null,
   "can_trade": null,
   "can_transfer": null,
-  "can_clawback": null
+  "can_clawback": null,
+  "search_results_banner": null
 }
diff --git a/public/locales/ko-KR/translations.json b/public/locales/ko-KR/translations.json
index 148714cd5..f44ad2a32 100644
--- a/public/locales/ko-KR/translations.json
+++ b/public/locales/ko-KR/translations.json
@@ -525,6 +525,9 @@
   "asset_class": null,
   "trading_pairs": null,
   "deleted": null,
+  "holders": null,
+  "trustlines": null,
+  "website": null,
   "assets.mpt_tab_title": null,
   "assets.no_mpts_message": null,
   "transaction_type_name_MPTokenIssuanceCreate": null,
@@ -547,5 +550,6 @@
   "can_escrow": null,
   "can_trade": null,
   "can_transfer": null,
-  "can_clawback": null
+  "can_clawback": null,
+  "search_results_banner": null
 }
diff --git a/server/routes/v1/index.js b/server/routes/v1/index.js
index 41fe59622..70428e99c 100644
--- a/server/routes/v1/index.js
+++ b/server/routes/v1/index.js
@@ -2,6 +2,7 @@ const api = require('express').Router()
 const getTokenDiscovery = require('./tokenDiscovery')
 const getHealth = require('./health')
 const getCurrentMetrics = require('./currentMetrics')
+const getTokensSearch = require('./tokens')
 
 if (process.env.VITE_ENVIRONMENT === 'mainnet') {
   api.use('/token/top', getTokenDiscovery)
@@ -13,6 +14,7 @@ if (process.env.VITE_ENVIRONMENT !== 'custom') {
   // these require a single hardcoded rippled node to connect to
   api.use('/health', getHealth)
   api.use('/metrics', getCurrentMetrics)
+  api.use('/tokens/search/:query', getTokensSearch)
 }
 
 module.exports = api
diff --git a/server/routes/v1/tokens.js b/server/routes/v1/tokens.js
new file mode 100644
index 000000000..c98198d63
--- /dev/null
+++ b/server/routes/v1/tokens.js
@@ -0,0 +1,121 @@
+const axios = require('axios')
+const log = require('../../lib/logger')({ name: 'tokens search' })
+
+const REFETCH_INTERVAL = 60 * 60 * 1000 // 1 hour
+const XRPLMETA_QUERY_LIMIT = 1000
+const cachedTokenSearchList = { tokens: [], last_updated: null }
+
+const parseCurrency = (currency) => {
+  const NON_STANDARD_CODE_LENGTH = 40
+  const LP_TOKEN_IDENTIFIER = '03'
+
+  const hexToString = (hex) => {
+    let string = ''
+    for (let i = 0; i < hex.length; i += 2) {
+      const part = hex.substring(i, i + 2)
+      const code = parseInt(part, 16)
+      if (!isNaN(code) && code !== 0) {
+        string += String.fromCharCode(code)
+      }
+    }
+    return string
+  }
+
+  return currency.length === NON_STANDARD_CODE_LENGTH &&
+    currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER
+    ? hexToString(currency)
+    : currency
+}
+
+async function fetchXRPLMetaTokens(offset) {
+  log.info(`caching tokens from ${process.env.XRPL_META_URL}`)
+  return axios
+    .get(
+      `https://${process.env.XRPL_META_URL}/tokens?trust_level=1&trust_level=2&trust_level=3`,
+      {
+        params: {
+          sort_by: 'holders',
+          offset,
+          limit: XRPLMETA_QUERY_LIMIT,
+        },
+      },
+    )
+    .then((resp) => resp.data)
+    .catch((e) => log.error(e))
+}
+
+async function cacheXRPLMetaTokens() {
+  let offset = 0
+  let tokensDataBatch = []
+  const allTokensFetched = []
+
+  tokensDataBatch = await fetchXRPLMetaTokens(0)
+  const { count } = tokensDataBatch
+  while (offset < count) {
+    allTokensFetched.push(...tokensDataBatch.tokens)
+    offset += XRPLMETA_QUERY_LIMIT
+    // eslint-disable-next-line no-await-in-loop
+    tokensDataBatch = await fetchXRPLMetaTokens(offset)
+  }
+
+  cachedTokenSearchList.tokens = allTokensFetched.filter(
+    (result) =>
+      result.metrics.trustlines > 50 &&
+      result.metrics.holders > 50 &&
+      result.metrics.marketcap > 0 &&
+      result.metrics.volume_7d > 0,
+  )
+  cachedTokenSearchList.last_updated = Date.now()
+
+  // nonstandard from XRPLMeta, check for hex codes in currencies and store parsed
+  cachedTokenSearchList.tokens.map((token) => ({
+    ...token,
+    currency: parseCurrency(token.currency),
+  }))
+}
+
+function startCaching() {
+  if (process.env.VITE_ENVIRONMENT !== 'mainnet') {
+    return
+  }
+  cacheXRPLMetaTokens()
+  setInterval(() => cacheXRPLMetaTokens(), REFETCH_INTERVAL)
+}
+
+startCaching()
+
+function queryTokens(tokenList, query) {
+  const sanitizedQuery = query.toLowerCase()
+
+  return tokenList.filter(
+    (token) =>
+      token.currency?.toLowerCase().includes(sanitizedQuery) ||
+      token.meta?.token?.name?.toLowerCase().includes(sanitizedQuery) ||
+      token.meta?.issuer?.name?.toLowerCase().includes(sanitizedQuery) ||
+      token.issuer?.toLowerCase().startsWith(sanitizedQuery),
+  )
+}
+
+function sleep(ms) {
+  return new Promise((resolve) => setTimeout(resolve, ms))
+}
+
+module.exports = async (req, res) => {
+  try {
+    log.info('getting tokens list for search')
+    const { query } = req.params
+    while (cachedTokenSearchList.tokens.length === 0) {
+      // eslint-disable-next-line no-await-in-loop -- necessary here to wait for cache to be filled
+      await sleep(1000)
+    }
+    const queriedTokens = await queryTokens(cachedTokenSearchList.tokens, query)
+    return res.status(200).json({
+      result: 'success',
+      updated: cachedTokenSearchList.last_updated,
+      tokens: queriedTokens,
+    })
+  } catch (error) {
+    log.error(error)
+    return res.status(error.code || 500).json({ message: error.message })
+  }
+}
diff --git a/src/containers/Header/Search.tsx b/src/containers/Header/Search.tsx
index 65f45e3f7..f1c0e8376 100644
--- a/src/containers/Header/Search.tsx
+++ b/src/containers/Header/Search.tsx
@@ -1,13 +1,20 @@
-import { KeyboardEventHandler, useContext } from 'react'
+import {
+  FC,
+  KeyboardEventHandler,
+  useContext,
+  useEffect,
+  useState,
+} from 'react'
 import { useTranslation } from 'react-i18next'
 import { useNavigate } from 'react-router-dom'
 import { XrplClient } from 'xrpl-client'
-
 import {
   isValidClassicAddress,
   isValidXAddress,
   classicAddressToXAddress,
 } from 'ripple-address-codec'
+import CloseIcon from '../shared/images/close.png'
+
 import { useAnalytics } from '../shared/analytics'
 import SocketContext from '../shared/SocketContext'
 import {
@@ -33,6 +40,7 @@ import {
   VALIDATOR_ROUTE,
   MPT_ROUTE,
 } from '../App/routes'
+import TokenSearchResults from '../shared/components/TokenSearchResults/TokenSearchResults'
 
 const determineHashType = async (id: string, rippledContext: XrplClient) => {
   try {
@@ -153,6 +161,26 @@ const normalizeAccount = (id: string) => {
   return id
 }
 
+const SearchBanner: FC<{ setIsBannerVisible: (visible: boolean) => void }> = ({
+  setIsBannerVisible,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div className="banner-search">
+      <div className="banner-content">
+        <div>{t('search_results_banner')}</div>
+        <button
+          className="banner-button"
+          type="button"
+          onClick={() => setIsBannerVisible(false)}
+        >
+          <img src={CloseIcon} alt="close-icon" width={10} height={10} />
+        </button>
+      </div>
+    </div>
+  )
+}
+
 export interface SearchProps {
   callback?: Function
 }
@@ -163,6 +191,8 @@ export const Search = ({ callback = () => {} }: SearchProps) => {
   const socket = useContext(SocketContext)
   const navigate = useNavigate()
 
+  const [currentSearchInput, setCurrentSearchInput] = useState('')
+
   const handleSearch = async (id: string) => {
     const strippedId = id.replace(/^["']|["']$/g, '')
     const route = await getRoute(strippedId, socket)
@@ -178,16 +208,40 @@ export const Search = ({ callback = () => {} }: SearchProps) => {
   const onKeyDown: KeyboardEventHandler<HTMLInputElement> = (event) => {
     if (event.key === 'Enter') {
       handleSearch(event.currentTarget?.value?.trim())
+      setCurrentSearchInput('')
     }
   }
 
+  const [isBannerVisible, setIsBannerVisible] = useState(true)
+
+  useEffect(() => {
+    const timeoutId = setTimeout(() => {
+      setIsBannerVisible(false)
+    }, 10000) // Disappear after 10 seconds
+
+    return () => clearTimeout(timeoutId)
+  }, [])
+
   return (
-    <div className="search">
-      <input
-        type="text"
-        placeholder={t('header.search.placeholder')}
-        onKeyDown={onKeyDown}
-      />
-    </div>
+    <>
+      {process.env.VITE_ENVIRONMENT === 'mainnet' && isBannerVisible && (
+        <SearchBanner setIsBannerVisible={setIsBannerVisible} />
+      )}
+      <div className="search">
+        <input
+          type="text"
+          placeholder={t('header.search.placeholder')}
+          onKeyDown={onKeyDown}
+          value={currentSearchInput}
+          onChange={(e) => setCurrentSearchInput(e.target.value)}
+        />
+        {process.env.VITE_ENVIRONMENT === 'mainnet' && (
+          <TokenSearchResults
+            setCurrentSearchInput={setCurrentSearchInput}
+            currentSearchValue={currentSearchInput}
+          />
+        )}
+      </div>
+    </>
   )
 }
diff --git a/src/containers/Header/search.scss b/src/containers/Header/search.scss
index 56fa80425..f0676c7ae 100644
--- a/src/containers/Header/search.scss
+++ b/src/containers/Header/search.scss
@@ -1,5 +1,9 @@
 @import '../shared/css/variables';
 
+.search-container {
+  position: relative;
+}
+
 .search {
   display: inline-block;
   width: 100%;
@@ -23,9 +27,81 @@
   }
 }
 
+.search:not(:focus-within) .search-results {
+  display: none;
+}
+
 // Only show search bar when we know which network to query
 .header-no-network {
   .search {
     display: none;
   }
 }
+
+.normal {
+  opacity: 1;
+  transition: 0.5s;
+}
+
+.normal.fade-out {
+  opacity: 0;
+}
+
+.banner-search {
+  position: absolute;
+  top: 50px;
+  left: 10%;
+  width: 80%;
+  max-width: 600px;
+  padding: 12px 16px;
+  border-radius: 4px;
+  background-color: $blue-purple-30 !important;
+  color: $black !important;
+
+  .banner-content {
+    display: flex;
+    justify-content: space-between;
+    font-size: 14px;
+    font-weight: 500;
+  }
+
+  .banner-button {
+    width: 5px;
+    height: 5px;
+    padding: 5px;
+    padding-left: 10px;
+    border: none;
+    margin-top: -5px;
+    background: none;
+    color: inherit;
+  }
+
+  @media (width >= 1350px) {
+    top: -60px;
+  }
+  @media (1000px <= width < 1350px) {
+    top: -70px;
+  }
+  @media (900px <= width < 1000px) {
+    top: -80px;
+  }
+  @media (750px <= width < 900px) {
+    top: 60px;
+  }
+
+  @media (max-width: $tablet-portrait-upper-boundary){
+    left: 5%;
+    width: 90%;
+  }
+}
+
+.banner-search::after {
+  position: absolute;
+  top: 100%;
+  left: 30%;
+  border-width: 8px;
+  border-style: solid;
+  border-color: $blue-purple-30 transparent transparent transparent;
+  content: "";
+  transform: translateX(-50%);
+}
diff --git a/src/containers/Header/test/Header.test.tsx b/src/containers/Header/test/Header.test.tsx
index c1c715fab..635ed837d 100644
--- a/src/containers/Header/test/Header.test.tsx
+++ b/src/containers/Header/test/Header.test.tsx
@@ -4,11 +4,13 @@ import { BrowserRouter as Router } from 'react-router-dom'
 import configureMockStore from 'redux-mock-store'
 import thunk from 'redux-thunk'
 import { Provider } from 'react-redux'
+import { QueryClientProvider } from 'react-query'
 import { initialState } from '../../../rootReducer'
 import i18n from '../../../i18n/testConfigEnglish'
 import SocketContext from '../../shared/SocketContext'
 import MockWsClient from '../../test/mockWsClient'
 import { Header } from '../index'
+import { queryClient } from '../../shared/QueryClient'
 
 describe('Header component', () => {
   let client
@@ -22,7 +24,9 @@ describe('Header component', () => {
         <Router>
           <Provider store={store}>
             <SocketContext.Provider value={client}>
-              <Header />
+              <QueryClientProvider client={queryClient}>
+                <Header />
+              </QueryClientProvider>
             </SocketContext.Provider>
           </Provider>
         </Router>
diff --git a/src/containers/Header/test/Search.test.js b/src/containers/Header/test/Search.test.js
index 027075dfc..d5fed3e7c 100644
--- a/src/containers/Header/test/Search.test.js
+++ b/src/containers/Header/test/Search.test.js
@@ -2,12 +2,14 @@ import { mount } from 'enzyme'
 import { I18nextProvider } from 'react-i18next'
 import { BrowserRouter as Router } from 'react-router-dom'
 import moxios from 'moxios'
+import { QueryClientProvider } from 'react-query'
 import i18n from '../../../i18n/testConfig'
 import { Search } from '../Search'
 import * as rippled from '../../../rippled/lib/rippled'
 import SocketContext from '../../shared/SocketContext'
 import MockWsClient from '../../test/mockWsClient'
 import { flushPromises } from '../../test/utils'
+import { queryClient } from '../../shared/QueryClient'
 
 describe('Search component', () => {
   const createWrapper = () => {
@@ -16,7 +18,9 @@ describe('Search component', () => {
       <I18nextProvider i18n={i18n}>
         <SocketContext.Provider value={client}>
           <Router>
-            <Search />
+            <QueryClientProvider client={queryClient}>
+              <Search />
+            </QueryClientProvider>
           </Router>
         </SocketContext.Provider>
       </I18nextProvider>,
diff --git a/src/containers/shared/analytics.ts b/src/containers/shared/analytics.ts
index b11d5c349..305c43521 100644
--- a/src/containers/shared/analytics.ts
+++ b/src/containers/shared/analytics.ts
@@ -10,6 +10,7 @@ export type AnalyticsEventNames =
   | 'network_switch'
   | 'load_more'
   | 'not_found'
+  | 'token_search_click'
 
 export interface AnalyticsFields {
   network?: string
diff --git a/src/containers/shared/components/DomainLink.tsx b/src/containers/shared/components/DomainLink.tsx
index 512482d35..4afe8e831 100644
--- a/src/containers/shared/components/DomainLink.tsx
+++ b/src/containers/shared/components/DomainLink.tsx
@@ -5,13 +5,15 @@ export interface Props {
   className?: string
   decode?: boolean
   domain: string
+  keepProtocol?: boolean
 }
 
 // Matches a protocol (e.g. 'http://' or 'https://') at the start of a string.
 const PROTOCOL_REGEX = /^([a-z][a-z0-9+\-.]*):\/\//
+const PROTOCOL_REMOVAL_REGEX = /^(https?:\/\/)?(.*?)(\/)?$/
 
 const DomainLink = (props: Props) => {
-  const { className, decode = false, domain } = props
+  const { className, decode = false, domain, keepProtocol = true } = props
 
   // If decode is true, decode the domain
   const decodedDomain = decode ? decodeHex(domain) : domain
@@ -26,14 +28,19 @@ const DomainLink = (props: Props) => {
     href = href.replace('ipfs://', 'https://ipfs.io/ipfs/')
   }
 
+  const domainText = keepProtocol
+    ? decodedDomain
+    : decodedDomain.replace(PROTOCOL_REMOVAL_REGEX, '$2')
+
   return (
     <a
       className={classnames('domain', className)}
       rel="noopener noreferrer"
       target="_blank"
       href={href}
+      onClick={(event) => event.stopPropagation()}
     >
-      {decode ? decodeHex(domain) : domain}
+      {domainText}
     </a>
   )
 }
diff --git a/src/containers/shared/components/TokenSearchResults/TokenSearchResults.tsx b/src/containers/shared/components/TokenSearchResults/TokenSearchResults.tsx
new file mode 100644
index 000000000..d2418319d
--- /dev/null
+++ b/src/containers/shared/components/TokenSearchResults/TokenSearchResults.tsx
@@ -0,0 +1,95 @@
+import { useContext } from 'react'
+import './styles.scss'
+
+import { useTranslation } from 'react-i18next'
+import axios from 'axios'
+import { useQuery } from 'react-query'
+import { useAnalytics } from '../../analytics'
+import { TokenSearchRow } from './TokenSearchRow'
+import SocketContext from '../../SocketContext'
+import Log from '../../log'
+import { getAccountLines } from '../../../../rippled/lib/rippled'
+import { FETCH_INTERVAL_XRP_USD_ORACLE_MILLIS } from '../../utils'
+
+const ORACLE_ACCOUNT = 'rXUMMaPpZqPutoRszR29jtC8amWq3APkx'
+
+interface SearchResultsProps {
+  currentSearchValue: string
+  setCurrentSearchInput: (string) => void
+}
+
+const SearchResults = ({
+  currentSearchValue,
+  setCurrentSearchInput,
+}: SearchResultsProps): JSX.Element | null => {
+  const analytics = useAnalytics()
+  const { t } = useTranslation()
+  const rippledSocket = useContext(SocketContext)
+
+  const { data: XRPUSDPrice = 0.0 } = useQuery(
+    ['fetchXRPToUSDRate'],
+    () => fetchXRPToUSDRate(),
+    {
+      refetchInterval: FETCH_INTERVAL_XRP_USD_ORACLE_MILLIS,
+      onError: (error) => {
+        Log.error(error)
+        return 0.0
+      },
+    },
+  )
+
+  const { data: tokens = [] } = useQuery(
+    ['fetchTokens', currentSearchValue],
+    () => fetchTokens(),
+    {
+      enabled: !!currentSearchValue,
+      staleTime: 0,
+      keepPreviousData: false,
+      onError: (error) => Log.error(error),
+    },
+  )
+
+  const fetchXRPToUSDRate = () =>
+    getAccountLines(rippledSocket, ORACLE_ACCOUNT, 1).then(
+      (accountLines) => accountLines.lines[0]?.limit ?? 0.0,
+    )
+
+  const fetchTokens = () => {
+    if (currentSearchValue === '') {
+      return [] // Return an empty list if search is cleared
+    }
+
+    return axios
+      .get(`/api/v1/tokens/search/${currentSearchValue}`)
+      .then((response) => response.data.tokens)
+  }
+
+  const onLinkClick = () => {
+    analytics.track('token_search_click', {
+      search_category: 'token',
+      search_term: currentSearchValue,
+    })
+
+    // clear current search on navigation
+    setCurrentSearchInput('')
+  }
+
+  return tokens.length > 0 ? (
+    <div className="search-results-menu">
+      <div className="search-results-header">
+        {t('tokens')} ({tokens.length})
+      </div>
+
+      {tokens.map((token) => (
+        <TokenSearchRow
+          token={token}
+          onClick={onLinkClick}
+          xrpPrice={XRPUSDPrice}
+          key={`${token.currency}.${token.issuer}`}
+        />
+      ))}
+    </div>
+  ) : null
+}
+
+export default SearchResults
diff --git a/src/containers/shared/components/TokenSearchResults/TokenSearchRow.tsx b/src/containers/shared/components/TokenSearchResults/TokenSearchRow.tsx
new file mode 100644
index 000000000..0b1e4066a
--- /dev/null
+++ b/src/containers/shared/components/TokenSearchResults/TokenSearchRow.tsx
@@ -0,0 +1,122 @@
+import { Link } from 'react-router-dom'
+import { useTranslation } from 'react-i18next'
+import { FC } from 'react'
+import { Amount } from '../Amount'
+import { localizeNumber } from '../../utils'
+import Currency from '../Currency'
+import DomainLink from '../DomainLink'
+
+const parsePrice = (dollarPrice: string, xrpPrice: number): number => {
+  const parsedDollar = Number(dollarPrice)
+  return Number((parsedDollar * xrpPrice).toFixed(6))
+}
+
+const TokenLogo: FC<{ token: any }> = ({ token }) =>
+  token && token.meta?.token.icon ? (
+    <object data={token.meta.token.icon} className="result-row-icon">
+      <div className="result-row-icon" />
+    </object>
+  ) : (
+    <div className="result-row-icon no-logo" />
+  )
+
+const TokenName: FC<{ token: any }> = ({ token }) =>
+  token && token.meta?.token.name ? (
+    <div>
+      (
+      {token.meta.token.name
+        .trim()
+        .toUpperCase()
+        .replace('(', '')
+        .replace(')', '')}
+      )
+    </div>
+  ) : null
+
+const IssuerAddress: FC<{ token: any; onClick: any }> = ({ token, onClick }) =>
+  token && (token.issuer || token.meta?.issuer) ? (
+    <Link
+      to={`/accounts/${token.issuer}`}
+      onClick={onClick}
+      className="issuer-link"
+    >
+      <div className="issuer-name">
+        {token.meta.issuer.name ? `${token.meta.issuer.name} (` : token.issuer}
+      </div>
+      <div className="issuer-address truncate">{token.issuer}</div>
+      <div>)</div>
+    </Link>
+  ) : null
+
+interface SearchResultRowProps {
+  token: any
+  onClick: () => void
+  xrpPrice: number
+}
+
+export const TokenSearchRow = ({
+  token,
+  onClick,
+  xrpPrice,
+}: SearchResultRowProps): JSX.Element => {
+  const { t } = useTranslation()
+
+  return (
+    <Link
+      to={`/token/${token.currency}.${token.issuer}`}
+      className="search-result-row"
+      onClick={onClick}
+    >
+      <div className="result-name-line">
+        <div className="result-logo">
+          <TokenLogo token={token} />
+        </div>
+        <div className="result-currency">
+          <Currency currency={token.currency} />
+        </div>
+        <div className="result-token-name">
+          <TokenName token={token} />
+        </div>
+        <div className="metric-chip">
+          <Amount
+            value={{
+              currency: 'USD',
+              amount: parsePrice(token.metrics.price, xrpPrice),
+            }}
+            displayIssuer={false}
+            modifier={
+              parsePrice(token.metrics.price, xrpPrice) === 0 ? '~' : undefined
+            }
+          />
+        </div>
+        <div className="metric-chip">
+          {t('holders', {
+            holders: localizeNumber(token.metrics.holders),
+          })}
+        </div>
+        <div className="metric-chip">
+          {t('trustlines', {
+            trustlines: localizeNumber(token.metrics.trustlines),
+          })}
+        </div>
+      </div>
+      <div className="result-issuer-line">
+        <div className="issuer-title">{t('issuer')}:</div>
+        <IssuerAddress token={token} onClick={onClick} />
+      </div>
+      <div className="result-website-line">
+        {token.meta.issuer.domain && (
+          <>
+            <div>{t('website')}:</div>
+            <div className="result-domain-link">
+              <DomainLink
+                domain={token.meta.issuer.domain}
+                keepProtocol={false}
+              />
+            </div>
+          </>
+        )}
+      </div>
+    </Link>
+  )
+}
diff --git a/src/containers/shared/components/TokenSearchResults/styles.scss b/src/containers/shared/components/TokenSearchResults/styles.scss
new file mode 100644
index 000000000..beec5b9de
--- /dev/null
+++ b/src/containers/shared/components/TokenSearchResults/styles.scss
@@ -0,0 +1,142 @@
+@import '../../css/variables';
+
+.search-results-menu {
+  position: absolute;
+  z-index: 1;
+  width: 100%;
+  max-height: 400px;
+  border: 1px solid $black-80;
+  border-radius: 8px;
+  border-top: 0px;
+  margin-top: 6px;
+  background-color: $black-100;
+  box-shadow: 2px 2px 15px 0px rgb(131 131 134 / 30%);
+  overflow-wrap: anywhere;
+  overflow-y: scroll;
+  scrollbar-color: $black-50 transparent;
+  scrollbar-width: thin;
+
+  @media (width < 900px) {
+    max-width: calc(100% - 32px);
+  }
+}
+
+.search-results-header {
+  padding: 0.5rem 0rem 0.5rem 1rem;
+  background-color: $black-80;
+  font-size: 14px;
+  font-weight: 500;
+}
+
+.result-row-icon {
+  width: 1.5rem;
+  height: 1.5rem;
+  border-radius: 16px;
+}
+
+.no-logo {
+  border-radius: 50%;
+  background-color: $black-50;
+}
+
+.result-currency {
+  flex-shrink: 0;
+  padding-top: 2px;
+  padding-right: 0px;
+  padding-bottom: 2px;
+  white-space: nowrap;
+}
+
+.result-token-name {
+  padding-top: 2px;
+  padding-bottom: 2px;
+  margin-left: 3px;
+}
+
+.result-logo {
+  padding-right: 14px;
+  padding-left: 1rem;
+}
+
+.search-result-row {
+  position: relative;
+  display: flex;
+  width: 100%;
+  box-sizing: border-box;
+  padding-top: 13px;
+  padding-bottom: 13px;
+  color: $black-0;
+  font-size: 14px;
+  font-weight: 500;
+
+  &:hover {
+    background-color: $black-70;
+    color: $black-0;
+    cursor: pointer;
+  }
+}
+
+.result-name-line {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  margin-bottom: 0.5rem;
+  white-space: nowrap;
+}
+
+.result-issuer-line {
+  display: flex;
+  overflow: hidden;
+  padding: 0 1rem;
+  margin-bottom: 0.5rem;
+  color: $black-50;
+}
+
+.result-website-line {
+  display: flex;
+  flex-direction: row;
+  padding: 0 1rem;
+  color: $black-50;
+}
+
+.metric-chip {
+  padding: 2px 12px;
+  border: 1px solid $black-70;
+  border-radius: 100px;
+  margin-right: 8px;
+  margin-left: 8px;
+  background-color: $black-100;
+  font-size: 12px;
+  font-weight: 600;
+
+  &:hover {
+    background-color: $black-100;
+    cursor: pointer;
+  }
+}
+
+.issuer-link {
+  display: inline-flex !important;
+  overflow: hidden;
+  margin-left: 0.25rem;
+  color: $black-50;
+
+  &:hover {
+    background: transparent;
+    color: $blue-purple-30;
+  }
+
+}
+
+.issuer-address {
+  @extend %truncate;
+}
+
+.issuer-name,
+.issuer-title {
+  flex-shrink: 0;
+}
+
+.result-domain-link {
+  margin-left: 0.25rem;
+}
diff --git a/src/containers/shared/components/TokenSearchResults/test/TokenSearchResults.test.js b/src/containers/shared/components/TokenSearchResults/test/TokenSearchResults.test.js
new file mode 100644
index 000000000..a3392b28a
--- /dev/null
+++ b/src/containers/shared/components/TokenSearchResults/test/TokenSearchResults.test.js
@@ -0,0 +1,75 @@
+import { mount } from 'enzyme'
+import moxios from 'moxios'
+import i18n from '../../../../../i18n/testConfig'
+import testTokens from './mock_data/tokens.json'
+import SocketContext from '../../../SocketContext'
+import SearchResults from '../TokenSearchResults'
+import MockWsClient from '../../../../test/mockWsClient'
+import { QuickHarness } from '../../../../test/utils'
+
+const testQuery = 'test'
+
+describe('Testing tokens search', () => {
+  let client
+  let wrapper
+
+  const createWrapper = () => {
+    const searchURL = `/api/v1/tokens/search/${testQuery}`
+    moxios.stubRequest(searchURL, {
+      status: 200,
+      response: testTokens,
+    })
+    return mount(
+      <QuickHarness i18n={i18n}>
+        <SocketContext.Provider value={client}>
+          <SearchResults
+            currentSearchValue={testQuery}
+            setCurrentSearchInput={jest.fn()}
+          />
+        </SocketContext.Provider>
+      </QuickHarness>,
+    )
+  }
+
+  beforeEach(() => {
+    moxios.install()
+    client = new MockWsClient()
+    wrapper = createWrapper()
+  })
+
+  afterEach(() => {
+    client.close()
+    moxios.uninstall()
+    wrapper.unmount()
+  })
+
+  it('renders without crashing', () => {
+    wrapper.update()
+    const searchMenu = wrapper.find('.search-results-menu')
+    expect(searchMenu.length).toEqual(1)
+  })
+
+  it('renders all tokens ', () => {
+    wrapper.update()
+    const searchMenu = wrapper.find('.search-results-menu')
+
+    expect(searchMenu.find('.search-results-header').at(0).html()).toEqual(
+      `<div class="search-results-header">tokens (1)</div>`,
+    )
+    expect(searchMenu.find('.currency').at(0).html()).toEqual(
+      `<span class="currency">SOLO</span>`,
+    )
+    expect(searchMenu.find('.issuer-name').at(0).html()).toEqual(
+      `<div class="issuer-name">Sologenic (</div>`,
+    )
+    expect(searchMenu.find('.issuer-address').at(0).html()).toEqual(
+      `<div class="issuer-address truncate">rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz</div>`,
+    )
+    expect(
+      searchMenu.find('.search-result-row').at(0).find('.metric-chip').length,
+    ).toEqual(3)
+    expect(searchMenu.find('.domain').at(0).html()).toEqual(
+      `<a class="domain" rel="noopener noreferrer" target="_blank" href="https://sologenic.com">sologenic.com</a>`,
+    )
+  })
+})
diff --git a/src/containers/shared/components/TokenSearchResults/test/mock_data/tokens.json b/src/containers/shared/components/TokenSearchResults/test/mock_data/tokens.json
new file mode 100644
index 000000000..eae88720e
--- /dev/null
+++ b/src/containers/shared/components/TokenSearchResults/test/mock_data/tokens.json
@@ -0,0 +1,45 @@
+{
+  "tokens": [
+    {
+      "currency": "534F4C4F00000000000000000000000000000000",
+      "issuer": "rsoLo2S1kiGeCcn6hCUXVrCpGMWLrRrLZz",
+      "meta": {
+        "token": {
+          "description": "SOLO is the utility token for the Sologenic ecosystem. It can be used for covering fees when minting NFTs on their platform.",
+          "icon": "https://s1.xrplmeta.org/icon/C40439709A.png",
+          "name": "SOLO",
+          "trust_level": 3
+        },
+        "issuer": {
+          "domain": "sologenic.com",
+          "icon": "https://s1.xrplmeta.org/icon/C40439709A.png",
+          "kyc": true,
+          "name": "Sologenic",
+          "trust_level": 3,
+          "weblinks": [
+            {
+              "url": "https://sologenic.com"
+            },
+            {
+              "url": "https://twitter.com/realSologenic",
+              "type": "socialmedia"
+            }
+          ]
+        }
+      },
+      "metrics": {
+        "trustlines": 283920,
+        "holders": 227379,
+        "supply": "399057268.13655",
+        "marketcap": "73737104.7448899",
+        "price": "0.184476049183255",
+        "volume_24h": "97065.7035689995",
+        "volume_7d": "1387820.55867489",
+        "exchanges_24h": "3446",
+        "exchanges_7d": "38976",
+        "takers_24h": "125",
+        "takers_7d": "627"
+      }
+    }
+  ]
+}
diff --git a/src/containers/shared/components/test/DomainLink.test.tsx b/src/containers/shared/components/test/DomainLink.test.tsx
index 71e589e8a..57e83ad77 100644
--- a/src/containers/shared/components/test/DomainLink.test.tsx
+++ b/src/containers/shared/components/test/DomainLink.test.tsx
@@ -61,4 +61,12 @@ describe('DomainLink', () => {
     )
     wrapper.unmount()
   })
+
+  it('handles domain link with protocol removal', () => {
+    const url = 'https://example.com/'
+    const wrapper = mount(<DomainLink domain={url} keepProtocol={false} />)
+    expect(wrapper.find('a').props().className).toEqual('domain')
+    expect(wrapper.find('a').text()).toEqual('example.com')
+    expect(wrapper.find('a').props().href).toEqual('https://example.com/')
+  })
 })
diff --git a/src/containers/shared/utils.js b/src/containers/shared/utils.js
index 9046410e0..9580b4754 100644
--- a/src/containers/shared/utils.js
+++ b/src/containers/shared/utils.js
@@ -21,6 +21,7 @@ export const FETCH_INTERVAL_MILLIS = 5000
 export const FETCH_INTERVAL_VHS_MILLIS = 60 * 1000 // 1 minute
 export const FETCH_INTERVAL_NODES_MILLIS = 60000
 export const FETCH_INTERVAL_ERROR_MILLIS = 300
+export const FETCH_INTERVAL_XRP_USD_ORACLE_MILLIS = 60 * 1000
 
 export const DECIMAL_REGEX = /^\d+$/
 export const HASH256_REGEX = /[0-9A-Fa-f]{64}/i
diff --git a/src/rippled/lib/rippled.js b/src/rippled/lib/rippled.js
index dc7737309..85900ffa9 100644
--- a/src/rippled/lib/rippled.js
+++ b/src/rippled/lib/rippled.js
@@ -620,6 +620,26 @@ const getAccountMPTs = (
     return resp
   })
 
+const getAccountLines = (rippledSocket, account, limit) =>
+  query(rippledSocket, {
+    command: 'account_lines',
+    account,
+    limit,
+  }).then((resp) => {
+    if (resp.error === 'actNotFound') {
+      throw new Error('account not found', 404)
+    }
+    if (resp.error === 'invalidParams') {
+      return undefined
+    }
+
+    if (resp.error_message) {
+      throw new Error(resp.error_message, 500)
+    }
+
+    return resp
+  })
+
 export {
   getLedger,
   getLedgerEntry,
@@ -642,4 +662,5 @@ export {
   getFeature,
   getMPTIssuance,
   getAccountMPTs,
+  getAccountLines,
 }

From e3ddec5f60ffed41bdaee6cd6002ae707e25882b Mon Sep 17 00:00:00 2001
From: achowdhry-ripple <achowdhry@ripple.com>
Date: Mon, 11 Nov 2024 15:52:23 -0500
Subject: [PATCH 54/79] Remove token search filters for trust level 3 (#1079)

## High Level Overview of Change

We want important tokens like RLUSD to not be filtered out. Since this
token is new, it doesn't meet the minimum requirements of the filters we
put in place previously. To remain partial, we now exclude all
trust_level 3 tokens from the filters, which fixes this issue for RLUSD
as well.

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 server/routes/v1/tokens.js | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/server/routes/v1/tokens.js b/server/routes/v1/tokens.js
index c98198d63..072dcf5ab 100644
--- a/server/routes/v1/tokens.js
+++ b/server/routes/v1/tokens.js
@@ -60,10 +60,11 @@ async function cacheXRPLMetaTokens() {
 
   cachedTokenSearchList.tokens = allTokensFetched.filter(
     (result) =>
-      result.metrics.trustlines > 50 &&
-      result.metrics.holders > 50 &&
-      result.metrics.marketcap > 0 &&
-      result.metrics.volume_7d > 0,
+      (result.metrics.trustlines > 50 &&
+        result.metrics.holders > 50 &&
+        result.metrics.marketcap > 0 &&
+        result.metrics.volume_7d > 0) ||
+      result.meta.issuer.trust_level === 3,
   )
   cachedTokenSearchList.last_updated = Date.now()
 

From 4a15a3c8df81d6cee7beaf847723efc701bad1d5 Mon Sep 17 00:00:00 2001
From: achowdhry-ripple <achowdhry@ripple.com>
Date: Mon, 11 Nov 2024 15:58:40 -0500
Subject: [PATCH 55/79] Add xrplmeta url to example env file (#1078)

## High Level Overview of Change

Add URL to template based on recent token search release

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 .env.example | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/.env.example b/.env.example
index 3538fb224..097322764 100644
--- a/.env.example
+++ b/.env.example
@@ -16,6 +16,9 @@ VITE_XAHAU_TESTNET_LINK=
 VITE_CUSTOMNETWORK_LINK=
 VITE_VALIDATOR=vl.ripple.com
 
+#External data source - XRPLMeta node for token search results
+XRPL_META_URL=s1.xrplmeta.org
+
 #XRPL Environment: mainnet, testnet, devnet, amm, hooks_testnet, custom
 VITE_ENVIRONMENT=mainnet
 

From 531a59a6ee3c5e04acc8b1b753a4185706fc0e3c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 12 Nov 2024 12:43:45 -0500
Subject: [PATCH 56/79] chore(deps-dev): bump sass from 1.76.0 to 1.80.5
 (#1069)

Bumps [sass](https://github.com/sass/dart-sass) from 1.76.0 to 1.80.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/sass/dart-sass/releases">sass's
releases</a>.</em></p>
<blockquote>
<h2>Dart Sass 1.80.5</h2>
<p>To install Sass 1.80.5, download one of the packages below and <a
href="https://katiek2.github.io/path-doc/">add it to your PATH</a>, or
see <a href="https://sass-lang.com/install">the Sass website</a> for
full installation instructions.</p>
<h1>Changes</h1>
<h3>Embedded Host</h3>
<ul>
<li>Don't produce phantom <code>@import</code> deprecations when using
an importer with the legacy API.</li>
</ul>
<p>See the <a
href="https://github.com/sass/dart-sass/blob/master/CHANGELOG.md#1805">full
changelog</a> for changes in earlier releases.</p>
<h2>Dart Sass 1.80.4</h2>
<p>To install Sass 1.80.4, download one of the packages below and <a
href="https://katiek2.github.io/path-doc/">add it to your PATH</a>, or
see <a href="https://sass-lang.com/install">the Sass website</a> for
full installation instructions.</p>
<h1>Changes</h1>
<ul>
<li>No user-visible changes.</li>
</ul>
<p>See the <a
href="https://github.com/sass/dart-sass/blob/master/CHANGELOG.md#1804">full
changelog</a> for changes in earlier releases.</p>
<h2>Dart Sass 1.80.3</h2>
<p>To install Sass 1.80.3, download one of the packages below and <a
href="https://katiek2.github.io/path-doc/">add it to your PATH</a>, or
see <a href="https://sass-lang.com/install">the Sass website</a> for
full installation instructions.</p>
<h1>Changes</h1>
<ul>
<li>
<p>Fix a bug where <code>@import url(&quot;...&quot;)</code> would crash
in plain CSS files.</p>
</li>
<li>
<p>Improve consistency of how warnings are emitted by different parts of
the compiler. This should result in minimal user-visible changes, but
different types of warnings should now respond more reliably to flags
like <code>--quiet</code>, <code>--verbose</code>, and
<code>--silence-deprecation</code>.</p>
</li>
</ul>
<p>See the <a
href="https://github.com/sass/dart-sass/blob/master/CHANGELOG.md#1803">full
changelog</a> for changes in earlier releases.</p>
<h2>Dart Sass 1.80.2</h2>
<p>To install Sass 1.80.2, download one of the packages below and <a
href="https://katiek2.github.io/path-doc/">add it to your PATH</a>, or
see <a href="https://sass-lang.com/install">the Sass website</a> for
full installation instructions.</p>
<h1>Changes</h1>
<ul>
<li>Fix a bug where deprecation warnings were incorrectly emitted for
the plain-CSS <code>invert()</code> function.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/sass/dart-sass/blob/main/CHANGELOG.md">sass's
changelog</a>.</em></p>
<blockquote>
<h2>1.80.5</h2>
<h3>Embedded Host</h3>
<ul>
<li>Don't produce phantom <code>@import</code> deprecations when using
an importer with the
legacy API.</li>
</ul>
<h2>1.80.4</h2>
<ul>
<li>No user-visible changes.</li>
</ul>
<h2>1.80.3</h2>
<ul>
<li>
<p>Fix a bug where <code>@import url(&quot;...&quot;)</code> would crash
in plain CSS files.</p>
</li>
<li>
<p>Improve consistency of how warnings are emitted by different parts of
the
compiler. This should result in minimal user-visible changes, but
different
types of warnings should now respond more reliably to flags like
<code>--quiet</code>,
<code>--verbose</code>, and <code>--silence-deprecation</code>.</p>
</li>
</ul>
<h2>1.80.2</h2>
<ul>
<li>Fix a bug where deprecation warnings were incorrectly emitted for
the
plain-CSS <code>invert()</code> function.</li>
</ul>
<h2>1.80.1</h2>
<ul>
<li>Fix a bug where repeated deprecation warnings were not automatically
limited.</li>
</ul>
<h2>1.80.0</h2>
<ul>
<li><code>@import</code> is now officially deprecated, as are global
built-in functions that
are available within built-in modules. See <a
href="https://sass-lang.com/blog/import-is-deprecated/">the Sass blog
post</a> for more
details on the deprecation process.</li>
</ul>
<h3>Embedded Host</h3>
<ul>
<li>Fix an error that would sometimes occur when deprecation warnings
were
emitted when using a custom importer with the legacy API.</li>
</ul>
<h2>1.79.6</h2>
<ul>
<li>
<p>Fix a bug where Sass would add an extra <code>*/</code> after loud
comments with
whitespace after an explicit <code>*/</code> in the indented syntax.</p>
</li>
<li>
<p><strong>Potentially breaking bug fix:</strong> Adding text after an
explicit <code>*/</code> in the
indented syntax is now an error, rather than silently generating invalid
CSS.</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/sass/dart-sass/commit/d14ea754e96861c9d7cb7f2b4bc75a40364eaf31"><code>d14ea75</code></a>
Cut a release for <a
href="https://redirect.github.com/sass/embedded-host-node/issues/342">sass/embedded-host-node#342</a>
(<a
href="https://redirect.github.com/sass/dart-sass/issues/2407">#2407</a>)</li>
<li><a
href="https://github.com/sass/dart-sass/commit/7129352416784039902fbea8848c5b54f957e05b"><code>7129352</code></a>
Fix dart analyze warnings (<a
href="https://redirect.github.com/sass/dart-sass/issues/2412">#2412</a>)</li>
<li><a
href="https://github.com/sass/dart-sass/commit/5c63839328b19782bc9a434a77f6028561906b96"><code>5c63839</code></a>
Bump the sass_api dependency along with package versions (<a
href="https://redirect.github.com/sass/dart-sass/issues/2408">#2408</a>)</li>
<li><a
href="https://github.com/sass/dart-sass/commit/477b596e0527f004205dbbdf6b6433c2907799ce"><code>477b596</code></a>
Merge pull request <a
href="https://redirect.github.com/sass/dart-sass/issues/2403">#2403</a>
from sass/parser-variable</li>
<li><a
href="https://github.com/sass/dart-sass/commit/fd5cff0e7908d73d48de6a8484dde888079cbb44"><code>fd5cff0</code></a>
Add sass-parser support for the <code>@warn</code> rule</li>
<li><a
href="https://github.com/sass/dart-sass/commit/251c75714331728b1336d72710c490068de2bfef"><code>251c757</code></a>
Add sass-parser support for variable declarations</li>
<li><a
href="https://github.com/sass/dart-sass/commit/20397efa740929f95f3e18db996af84b81a0fd6f"><code>20397ef</code></a>
Add grinder tasks to bump package versions (<a
href="https://redirect.github.com/sass/dart-sass/issues/2405">#2405</a>)</li>
<li><a
href="https://github.com/sass/dart-sass/commit/c907bcb57281b51efbd7b0957ac8a4d0bead8818"><code>c907bcb</code></a>
Expose Expression.isCalculationSafe to sass_api (<a
href="https://redirect.github.com/sass/dart-sass/issues/2404">#2404</a>)</li>
<li><a
href="https://github.com/sass/dart-sass/commit/37a05f97f3ee3cec8156e5a87076c0526477bdff"><code>37a05f9</code></a>
Enable AOT build for android-riscv64 (<a
href="https://redirect.github.com/sass/dart-sass/issues/2399">#2399</a>)</li>
<li><a
href="https://github.com/sass/dart-sass/commit/473ddf9100cce7b96d3ef01b8e060f8d4517a37e"><code>473ddf9</code></a>
Add <code>sass-parser</code> support for the <code>@use</code> rule (<a
href="https://redirect.github.com/sass/dart-sass/issues/2389">#2389</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/sass/dart-sass/compare/1.76.0...1.80.5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sass&package-manager=npm_and_yarn&previous-version=1.76.0&new-version=1.80.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Justin Reynolds <justinr1234@gmail.com>
Co-authored-by: Ashray Chowdhry <achowdhry@ripple.com>
---
 package-lock.json                             | 605 +++++++++++++++++-
 package.json                                  |   2 +-
 .../BalanceSelector/balance-selector.scss     |   2 +-
 .../Accounts/AccountHeader/styles.scss        |   2 +-
 src/containers/Accounts/styles.scss           |   2 +-
 src/containers/Amendment/amendment.scss       |   4 +-
 .../Amendments/amendmentsTable.scss           |   4 +-
 src/containers/App/app.scss                   |   2 +-
 src/containers/CustomNetworkHome/index.scss   |   2 +-
 src/containers/Footer/footer.scss             |   2 +-
 .../Header/LanguagePicker/LanguagePicker.scss |   2 +-
 .../Header/NavigationMenu/NavigationMenu.scss |   2 +-
 .../Header/NetworkPicker/NetworkPicker.scss   |   2 +-
 src/containers/Header/header.scss             |   2 +-
 src/containers/Header/search.scss             |   2 +-
 src/containers/Ledger/ledger.scss             |   2 +-
 src/containers/Ledgers/css/ledgerMetrics.scss |   2 +-
 src/containers/Ledgers/css/ledgers.scss       |   2 +-
 src/containers/Ledgers/css/legend.scss        |   2 +-
 src/containers/MPT/MPTHeader/styles.scss      |   4 +-
 src/containers/MPT/styles.scss                |   2 +-
 src/containers/NFT/NFTHeader/styles.scss      |   4 +-
 src/containers/NFT/NFTTabs/styles.scss        |   4 +-
 src/containers/NFT/styles.scss                |   2 +-
 src/containers/Network/css/barchart.scss      |   2 +-
 src/containers/Network/css/hexagons.scss      |   2 +-
 src/containers/Network/css/map.scss           |   2 +-
 src/containers/Network/css/nodesTable.scss    |   4 +-
 src/containers/Network/css/style.scss         |   2 +-
 .../Network/css/validatorsTable.scss          |   2 +-
 src/containers/NoMatch/nomatch.scss           |   2 +-
 .../PayStrings/PayStringHeader/styles.scss    |   2 +-
 .../PayStringMappingsTable/styles.scss        |   2 +-
 src/containers/PayStrings/styles.scss         |   2 +-
 src/containers/Token/DEXPairs/styles.scss     |   2 +-
 src/containers/Token/TokenHeader/styles.scss  |   4 +-
 src/containers/Token/styles.scss              |   2 +-
 .../Transactions/DetailTab/detailTab.scss     |   2 +-
 src/containers/Transactions/simpleTab.scss    |   2 +-
 src/containers/Transactions/transaction.scss  |   2 +-
 src/containers/Validators/historyTab.scss     |   2 +-
 src/containers/Validators/simpleTab.scss      |   2 +-
 src/containers/Validators/validator.scss      |   2 +-
 src/containers/Validators/votingTab.scss      |   2 +-
 .../shared/components/Dropdown/dropdown.scss  |   2 +-
 .../shared/components/JsonView/json-view.scss |   2 +-
 .../components/Notification/styles.scss       |   2 +-
 .../components/TransactionTable/styles.scss   |   2 +-
 src/containers/shared/css/box.scss            |   2 +-
 src/containers/shared/css/form.scss           |   2 +-
 src/containers/shared/css/global.scss         |   4 +-
 src/containers/shared/css/simpleTab.scss      |   2 +-
 src/containers/shared/css/table.scss          |   2 +-
 src/containers/shared/css/tabs.scss           |   2 +-
 src/containers/shared/css/tooltip.scss        |   2 +-
 src/containers/shared/css/txlabel.scss        |   2 +-
 src/containers/shared/css/txstatus.scss       |   2 +-
 57 files changed, 638 insertions(+), 95 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f5af62c42..482783fdc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -100,7 +100,7 @@
         "react-error-overlay": "6.0.11",
         "react-test-renderer": "^17.0.2",
         "redux-mock-store": "^1.5.1",
-        "sass": "^1.76.0",
+        "sass": "^1.80.5",
         "source-map-explorer": "^2.5.3",
         "stylelint": "^15.11.0",
         "stylelint-config-idiomatic-order": "^10.0.0",
@@ -5428,6 +5428,337 @@
         "node": ">= 8"
       }
     },
+    "node_modules/@parcel/watcher": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
+      "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
+      "devOptional": true,
+      "dependencies": {
+        "detect-libc": "^1.0.3",
+        "is-glob": "^4.0.3",
+        "micromatch": "^4.0.5",
+        "node-addon-api": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher-android-arm64": "2.4.1",
+        "@parcel/watcher-darwin-arm64": "2.4.1",
+        "@parcel/watcher-darwin-x64": "2.4.1",
+        "@parcel/watcher-freebsd-x64": "2.4.1",
+        "@parcel/watcher-linux-arm-glibc": "2.4.1",
+        "@parcel/watcher-linux-arm64-glibc": "2.4.1",
+        "@parcel/watcher-linux-arm64-musl": "2.4.1",
+        "@parcel/watcher-linux-x64-glibc": "2.4.1",
+        "@parcel/watcher-linux-x64-musl": "2.4.1",
+        "@parcel/watcher-win32-arm64": "2.4.1",
+        "@parcel/watcher-win32-ia32": "2.4.1",
+        "@parcel/watcher-win32-x64": "2.4.1"
+      }
+    },
+    "node_modules/@parcel/watcher-android-arm64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz",
+      "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-arm64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
+      "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-x64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz",
+      "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-freebsd-x64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz",
+      "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-glibc": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz",
+      "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-glibc": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz",
+      "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-musl": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz",
+      "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-glibc": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz",
+      "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-musl": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz",
+      "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-arm64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz",
+      "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-ia32": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz",
+      "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-x64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz",
+      "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher/node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "devOptional": true,
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@parcel/watcher/node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "devOptional": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@parcel/watcher/node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "devOptional": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/@parcel/watcher/node_modules/micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "devOptional": true,
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/@parcel/watcher/node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "devOptional": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
     "node_modules/@paystring/utils": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/@paystring/utils/-/utils-2.0.0.tgz",
@@ -8546,7 +8877,7 @@
     },
     "node_modules/binary-extensions": {
       "version": "2.2.0",
-      "devOptional": true,
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=8"
@@ -9002,7 +9333,7 @@
     },
     "node_modules/chokidar": {
       "version": "3.5.2",
-      "devOptional": true,
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "anymatch": "~3.1.2",
@@ -9022,7 +9353,7 @@
     },
     "node_modules/chokidar/node_modules/anymatch": {
       "version": "3.1.2",
-      "devOptional": true,
+      "dev": true,
       "license": "ISC",
       "dependencies": {
         "normalize-path": "^3.0.0",
@@ -9034,7 +9365,7 @@
     },
     "node_modules/chokidar/node_modules/braces": {
       "version": "3.0.2",
-      "devOptional": true,
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "fill-range": "^7.0.1"
@@ -9045,7 +9376,7 @@
     },
     "node_modules/chokidar/node_modules/fill-range": {
       "version": "7.0.1",
-      "devOptional": true,
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "to-regex-range": "^5.0.1"
@@ -9068,7 +9399,7 @@
     },
     "node_modules/chokidar/node_modules/is-number": {
       "version": "7.0.0",
-      "devOptional": true,
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
@@ -9076,7 +9407,7 @@
     },
     "node_modules/chokidar/node_modules/normalize-path": {
       "version": "3.0.0",
-      "devOptional": true,
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
@@ -9084,7 +9415,7 @@
     },
     "node_modules/chokidar/node_modules/to-regex-range": {
       "version": "5.0.1",
-      "devOptional": true,
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "is-number": "^7.0.0"
@@ -10357,7 +10688,7 @@
     },
     "node_modules/detect-libc": {
       "version": "1.0.3",
-      "dev": true,
+      "devOptional": true,
       "license": "Apache-2.0",
       "bin": {
         "detect-libc": "bin/detect-libc.js"
@@ -14125,7 +14456,7 @@
     },
     "node_modules/is-binary-path": {
       "version": "2.1.0",
-      "devOptional": true,
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "binary-extensions": "^2.0.0"
@@ -22400,6 +22731,12 @@
         "tslib": "^2.0.3"
       }
     },
+    "node_modules/node-addon-api": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+      "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+      "devOptional": true
+    },
     "node_modules/node-fetch": {
       "version": "2.6.12",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
@@ -23878,7 +24215,7 @@
     },
     "node_modules/readdirp": {
       "version": "3.6.0",
-      "devOptional": true,
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "picomatch": "^2.2.1"
@@ -24592,12 +24929,13 @@
       }
     },
     "node_modules/sass": {
-      "version": "1.76.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.76.0.tgz",
-      "integrity": "sha512-nc3LeqvF2FNW5xGF1zxZifdW3ffIz5aBb7I7tSvOoNu7z1RQ6pFt9MBuiPtjgaI62YWrM/txjWlOCFiGtf2xpw==",
+      "version": "1.80.5",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.5.tgz",
+      "integrity": "sha512-TQd2aoQl/+zsxRMEDSxVdpPIqeq9UFc6pr7PzkugiTx3VYCFPUaa3P4RrBQsqok4PO200Vkz0vXQBNlg7W907g==",
       "devOptional": true,
       "dependencies": {
-        "chokidar": ">=3.0.0 <4.0.0",
+        "@parcel/watcher": "^2.4.1",
+        "chokidar": "^4.0.0",
         "immutable": "^4.0.0",
         "source-map-js": ">=0.6.2 <2.0.0"
       },
@@ -24608,6 +24946,34 @@
         "node": ">=14.0.0"
       }
     },
+    "node_modules/sass/node_modules/chokidar": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+      "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+      "devOptional": true,
+      "dependencies": {
+        "readdirp": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/sass/node_modules/readdirp": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
+      "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+      "devOptional": true,
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
     "node_modules/sax": {
       "version": "1.2.4",
       "dev": true,
@@ -32177,6 +32543,159 @@
         "fastq": "^1.6.0"
       }
     },
+    "@parcel/watcher": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
+      "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
+      "devOptional": true,
+      "requires": {
+        "@parcel/watcher-android-arm64": "2.4.1",
+        "@parcel/watcher-darwin-arm64": "2.4.1",
+        "@parcel/watcher-darwin-x64": "2.4.1",
+        "@parcel/watcher-freebsd-x64": "2.4.1",
+        "@parcel/watcher-linux-arm-glibc": "2.4.1",
+        "@parcel/watcher-linux-arm64-glibc": "2.4.1",
+        "@parcel/watcher-linux-arm64-musl": "2.4.1",
+        "@parcel/watcher-linux-x64-glibc": "2.4.1",
+        "@parcel/watcher-linux-x64-musl": "2.4.1",
+        "@parcel/watcher-win32-arm64": "2.4.1",
+        "@parcel/watcher-win32-ia32": "2.4.1",
+        "@parcel/watcher-win32-x64": "2.4.1",
+        "detect-libc": "^1.0.3",
+        "is-glob": "^4.0.3",
+        "micromatch": "^4.0.5",
+        "node-addon-api": "^7.0.0"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+          "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+          "devOptional": true,
+          "requires": {
+            "fill-range": "^7.1.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.1.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+          "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+          "devOptional": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "devOptional": true
+        },
+        "micromatch": {
+          "version": "4.0.8",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+          "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+          "devOptional": true,
+          "requires": {
+            "braces": "^3.0.3",
+            "picomatch": "^2.3.1"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "devOptional": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "@parcel/watcher-android-arm64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz",
+      "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-darwin-arm64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
+      "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-darwin-x64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz",
+      "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-freebsd-x64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz",
+      "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-arm-glibc": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz",
+      "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-arm64-glibc": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz",
+      "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-arm64-musl": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz",
+      "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-x64-glibc": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz",
+      "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-linux-x64-musl": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz",
+      "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-win32-arm64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz",
+      "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-win32-ia32": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz",
+      "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==",
+      "dev": true,
+      "optional": true
+    },
+    "@parcel/watcher-win32-x64": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz",
+      "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==",
+      "dev": true,
+      "optional": true
+    },
     "@paystring/utils": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/@paystring/utils/-/utils-2.0.0.tgz",
@@ -34311,7 +34830,7 @@
     },
     "binary-extensions": {
       "version": "2.2.0",
-      "devOptional": true
+      "dev": true
     },
     "bindings": {
       "version": "1.5.0",
@@ -34612,7 +35131,7 @@
     },
     "chokidar": {
       "version": "3.5.2",
-      "devOptional": true,
+      "dev": true,
       "requires": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
@@ -34626,7 +35145,7 @@
       "dependencies": {
         "anymatch": {
           "version": "3.1.2",
-          "devOptional": true,
+          "dev": true,
           "requires": {
             "normalize-path": "^3.0.0",
             "picomatch": "^2.0.4"
@@ -34634,14 +35153,14 @@
         },
         "braces": {
           "version": "3.0.2",
-          "devOptional": true,
+          "dev": true,
           "requires": {
             "fill-range": "^7.0.1"
           }
         },
         "fill-range": {
           "version": "7.0.1",
-          "devOptional": true,
+          "dev": true,
           "requires": {
             "to-regex-range": "^5.0.1"
           }
@@ -34653,15 +35172,15 @@
         },
         "is-number": {
           "version": "7.0.0",
-          "devOptional": true
+          "dev": true
         },
         "normalize-path": {
           "version": "3.0.0",
-          "devOptional": true
+          "dev": true
         },
         "to-regex-range": {
           "version": "5.0.1",
-          "devOptional": true,
+          "dev": true,
           "requires": {
             "is-number": "^7.0.0"
           }
@@ -35566,7 +36085,7 @@
     },
     "detect-libc": {
       "version": "1.0.3",
-      "dev": true
+      "devOptional": true
     },
     "detect-newline": {
       "version": "3.1.0",
@@ -38140,7 +38659,7 @@
     },
     "is-binary-path": {
       "version": "2.1.0",
-      "devOptional": true,
+      "dev": true,
       "requires": {
         "binary-extensions": "^2.0.0"
       }
@@ -43857,6 +44376,12 @@
         "tslib": "^2.0.3"
       }
     },
+    "node-addon-api": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+      "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+      "devOptional": true
+    },
     "node-fetch": {
       "version": "2.6.12",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
@@ -44792,7 +45317,7 @@
     },
     "readdirp": {
       "version": "3.6.0",
-      "devOptional": true,
+      "dev": true,
       "requires": {
         "picomatch": "^2.2.1"
       }
@@ -45282,14 +45807,32 @@
       }
     },
     "sass": {
-      "version": "1.76.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.76.0.tgz",
-      "integrity": "sha512-nc3LeqvF2FNW5xGF1zxZifdW3ffIz5aBb7I7tSvOoNu7z1RQ6pFt9MBuiPtjgaI62YWrM/txjWlOCFiGtf2xpw==",
+      "version": "1.80.5",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.5.tgz",
+      "integrity": "sha512-TQd2aoQl/+zsxRMEDSxVdpPIqeq9UFc6pr7PzkugiTx3VYCFPUaa3P4RrBQsqok4PO200Vkz0vXQBNlg7W907g==",
       "devOptional": true,
       "requires": {
-        "chokidar": ">=3.0.0 <4.0.0",
+        "@parcel/watcher": "^2.4.1",
+        "chokidar": "^4.0.0",
         "immutable": "^4.0.0",
         "source-map-js": ">=0.6.2 <2.0.0"
+      },
+      "dependencies": {
+        "chokidar": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+          "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+          "devOptional": true,
+          "requires": {
+            "readdirp": "^4.0.1"
+          }
+        },
+        "readdirp": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
+          "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+          "devOptional": true
+        }
       }
     },
     "sax": {
diff --git a/package.json b/package.json
index 2118505fd..f042929bf 100644
--- a/package.json
+++ b/package.json
@@ -95,7 +95,7 @@
     "react-error-overlay": "6.0.11",
     "react-test-renderer": "^17.0.2",
     "redux-mock-store": "^1.5.1",
-    "sass": "^1.76.0",
+    "sass": "^1.80.5",
     "source-map-explorer": "^2.5.3",
     "stylelint": "^15.11.0",
     "stylelint-config-idiomatic-order": "^10.0.0",
diff --git a/src/containers/Accounts/AccountHeader/BalanceSelector/balance-selector.scss b/src/containers/Accounts/AccountHeader/BalanceSelector/balance-selector.scss
index dc6c77018..30860340e 100644
--- a/src/containers/Accounts/AccountHeader/BalanceSelector/balance-selector.scss
+++ b/src/containers/Accounts/AccountHeader/BalanceSelector/balance-selector.scss
@@ -1,4 +1,4 @@
-@import 'src/containers/shared/css/variables';
+@use 'src/containers/shared/css/variables' as *;
 
 .balance-selector {
   position: relative;
diff --git a/src/containers/Accounts/AccountHeader/styles.scss b/src/containers/Accounts/AccountHeader/styles.scss
index fc35853f0..d76a9033d 100644
--- a/src/containers/Accounts/AccountHeader/styles.scss
+++ b/src/containers/Accounts/AccountHeader/styles.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .account-header {
   margin-bottom: 16px;
diff --git a/src/containers/Accounts/styles.scss b/src/containers/Accounts/styles.scss
index 3296b7a74..1b68962d2 100644
--- a/src/containers/Accounts/styles.scss
+++ b/src/containers/Accounts/styles.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables';
 
 .accounts-page {
   .loader {
diff --git a/src/containers/Amendment/amendment.scss b/src/containers/Amendment/amendment.scss
index 987963d30..2dd439d43 100644
--- a/src/containers/Amendment/amendment.scss
+++ b/src/containers/Amendment/amendment.scss
@@ -1,5 +1,5 @@
-@import '../shared/css/variables';
-@import '../shared/css/table';
+@use '../shared/css/variables' as *;
+@use '../shared/css/table';
 
 .amendment-summary {
   width: 80%;
diff --git a/src/containers/Amendments/amendmentsTable.scss b/src/containers/Amendments/amendmentsTable.scss
index ee533cffb..15805be26 100644
--- a/src/containers/Amendments/amendmentsTable.scss
+++ b/src/containers/Amendments/amendmentsTable.scss
@@ -1,5 +1,5 @@
-@import '../shared/css/variables';
-@import '../shared/css/table';
+@use '../shared/css/variables' as *;
+@use '../shared/css/table';
 
 .amendments-page{
   .summary {
diff --git a/src/containers/App/app.scss b/src/containers/App/app.scss
index 38316f6ed..aa0fe1b4d 100644
--- a/src/containers/App/app.scss
+++ b/src/containers/App/app.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .app {
   flex-grow: 1;
diff --git a/src/containers/CustomNetworkHome/index.scss b/src/containers/CustomNetworkHome/index.scss
index 00a97ca2d..180e748a3 100644
--- a/src/containers/CustomNetworkHome/index.scss
+++ b/src/containers/CustomNetworkHome/index.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .app {
   position: relative;
diff --git a/src/containers/Footer/footer.scss b/src/containers/Footer/footer.scss
index 7af646bb7..fdee0125e 100644
--- a/src/containers/Footer/footer.scss
+++ b/src/containers/Footer/footer.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .footer {
   position: relative;
diff --git a/src/containers/Header/LanguagePicker/LanguagePicker.scss b/src/containers/Header/LanguagePicker/LanguagePicker.scss
index b3513de99..5cc3a89fe 100644
--- a/src/containers/Header/LanguagePicker/LanguagePicker.scss
+++ b/src/containers/Header/LanguagePicker/LanguagePicker.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .language-picker {
   margin-left: auto;
diff --git a/src/containers/Header/NavigationMenu/NavigationMenu.scss b/src/containers/Header/NavigationMenu/NavigationMenu.scss
index 2272b0668..f94c69c6d 100644
--- a/src/containers/Header/NavigationMenu/NavigationMenu.scss
+++ b/src/containers/Header/NavigationMenu/NavigationMenu.scss
@@ -1,6 +1,6 @@
 @use 'sass:math';
 
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 $menu-toggle-size: 25px;
 $menu-toggle-line-spacing: math.div($menu-toggle-size, 4);
diff --git a/src/containers/Header/NetworkPicker/NetworkPicker.scss b/src/containers/Header/NetworkPicker/NetworkPicker.scss
index 9a60d0100..d905c3361 100644
--- a/src/containers/Header/NetworkPicker/NetworkPicker.scss
+++ b/src/containers/Header/NetworkPicker/NetworkPicker.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 @mixin dropdown-network-item(
   $background,
diff --git a/src/containers/Header/header.scss b/src/containers/Header/header.scss
index 140c659ba..06704d86e 100644
--- a/src/containers/Header/header.scss
+++ b/src/containers/Header/header.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 /* Header */
 .header {
diff --git a/src/containers/Header/search.scss b/src/containers/Header/search.scss
index f0676c7ae..b599fd295 100644
--- a/src/containers/Header/search.scss
+++ b/src/containers/Header/search.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .search-container {
   position: relative;
diff --git a/src/containers/Ledger/ledger.scss b/src/containers/Ledger/ledger.scss
index f086ff41d..990f1e4e3 100644
--- a/src/containers/Ledger/ledger.scss
+++ b/src/containers/Ledger/ledger.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .ledger-page {
   margin: 0 auto;
diff --git a/src/containers/Ledgers/css/ledgerMetrics.scss b/src/containers/Ledgers/css/ledgerMetrics.scss
index 1e12bb03b..23938904b 100644
--- a/src/containers/Ledgers/css/ledgerMetrics.scss
+++ b/src/containers/Ledgers/css/ledgerMetrics.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .metrics {
   overflow: hidden;
diff --git a/src/containers/Ledgers/css/ledgers.scss b/src/containers/Ledgers/css/ledgers.scss
index 1af05ce8f..0ae1812cc 100644
--- a/src/containers/Ledgers/css/ledgers.scss
+++ b/src/containers/Ledgers/css/ledgers.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 $ledgers-margin-large: 32px;
 $ledgers-border: 1px solid $black-70;
diff --git a/src/containers/Ledgers/css/legend.scss b/src/containers/Ledgers/css/legend.scss
index c59f5d21f..20db2f293 100644
--- a/src/containers/Ledgers/css/legend.scss
+++ b/src/containers/Ledgers/css/legend.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .legend {
   display: flex;
diff --git a/src/containers/MPT/MPTHeader/styles.scss b/src/containers/MPT/MPTHeader/styles.scss
index 682ea36e4..8a7715c88 100644
--- a/src/containers/MPT/MPTHeader/styles.scss
+++ b/src/containers/MPT/MPTHeader/styles.scss
@@ -1,5 +1,5 @@
-@import '../../shared/css/variables';
-@import '../../shared/css/table';
+@use '../../shared/css/variables' as *;
+@use '../../shared/css/table';
 
 .mpt-header-container {
   .mpt-bottom-container {
diff --git a/src/containers/MPT/styles.scss b/src/containers/MPT/styles.scss
index 51c0c4fc3..f4b0d3245 100644
--- a/src/containers/MPT/styles.scss
+++ b/src/containers/MPT/styles.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables';
 
 .mpt-page {
   width: 100%;
diff --git a/src/containers/NFT/NFTHeader/styles.scss b/src/containers/NFT/NFTHeader/styles.scss
index 656931f8f..30c3519ee 100644
--- a/src/containers/NFT/NFTHeader/styles.scss
+++ b/src/containers/NFT/NFTHeader/styles.scss
@@ -1,5 +1,5 @@
-@import '../../shared/css/variables';
-@import '../../shared/css/table';
+@use '../../shared/css/variables' as *;
+@use '../../shared/css/table';
 
 .nft-header-container {
   .nft-bottom-container {
diff --git a/src/containers/NFT/NFTTabs/styles.scss b/src/containers/NFT/NFTTabs/styles.scss
index b831aa028..6c68075a4 100644
--- a/src/containers/NFT/NFTTabs/styles.scss
+++ b/src/containers/NFT/NFTTabs/styles.scss
@@ -1,5 +1,5 @@
-@import '../../shared/css/variables';
-@import '../../shared/css/table';
+@use '../../shared/css/variables' as *;
+@use '../../shared/css/table';
 
 .nft-tabs {
   margin-top: 60px;
diff --git a/src/containers/NFT/styles.scss b/src/containers/NFT/styles.scss
index 59c9e6f90..d03f6e9f0 100644
--- a/src/containers/NFT/styles.scss
+++ b/src/containers/NFT/styles.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .nft-page {
   width: 100%;
diff --git a/src/containers/Network/css/barchart.scss b/src/containers/Network/css/barchart.scss
index dacce66c6..48a3fddb2 100644
--- a/src/containers/Network/css/barchart.scss
+++ b/src/containers/Network/css/barchart.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .y-label {
   fill: $black-40;
diff --git a/src/containers/Network/css/hexagons.scss b/src/containers/Network/css/hexagons.scss
index 5bd70e421..08413b393 100644
--- a/src/containers/Network/css/hexagons.scss
+++ b/src/containers/Network/css/hexagons.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .validators-container {
   .validators {
diff --git a/src/containers/Network/css/map.scss b/src/containers/Network/css/map.scss
index f5aefe624..ff58dd19e 100644
--- a/src/containers/Network/css/map.scss
+++ b/src/containers/Network/css/map.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .nodes-map {
   position: relative;
diff --git a/src/containers/Network/css/nodesTable.scss b/src/containers/Network/css/nodesTable.scss
index 7d8757b25..147fbc66b 100644
--- a/src/containers/Network/css/nodesTable.scss
+++ b/src/containers/Network/css/nodesTable.scss
@@ -1,5 +1,5 @@
-@import '../../shared/css/variables';
-@import '../../shared/css/table';
+@use '../../shared/css/variables' as *;
+@use '../../shared/css/table';
 
 .nodes-table {
   position: relative;
diff --git a/src/containers/Network/css/style.scss b/src/containers/Network/css/style.scss
index 091fa0268..c2f1f30e0 100644
--- a/src/containers/Network/css/style.scss
+++ b/src/containers/Network/css/style.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .network-page {
   // Needs additional bottom margin to break up table from the horizontal
diff --git a/src/containers/Network/css/validatorsTable.scss b/src/containers/Network/css/validatorsTable.scss
index ed5958bce..0b2aab55d 100644
--- a/src/containers/Network/css/validatorsTable.scss
+++ b/src/containers/Network/css/validatorsTable.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .validators-table {
   position: relative;
diff --git a/src/containers/NoMatch/nomatch.scss b/src/containers/NoMatch/nomatch.scss
index 899425ef9..7459af506 100644
--- a/src/containers/NoMatch/nomatch.scss
+++ b/src/containers/NoMatch/nomatch.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .no-match {
   margin: 10% auto;
diff --git a/src/containers/PayStrings/PayStringHeader/styles.scss b/src/containers/PayStrings/PayStringHeader/styles.scss
index 73d59bdc2..8eb0170ae 100644
--- a/src/containers/PayStrings/PayStringHeader/styles.scss
+++ b/src/containers/PayStrings/PayStringHeader/styles.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .paystring-header {
   margin-bottom: 16px;
diff --git a/src/containers/PayStrings/PayStringMappingsTable/styles.scss b/src/containers/PayStrings/PayStringMappingsTable/styles.scss
index 867362f17..b40727079 100644
--- a/src/containers/PayStrings/PayStringMappingsTable/styles.scss
+++ b/src/containers/PayStrings/PayStringMappingsTable/styles.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .paystring-table {
   .col-network,
diff --git a/src/containers/PayStrings/styles.scss b/src/containers/PayStrings/styles.scss
index 7c7201294..8912ed2c1 100644
--- a/src/containers/PayStrings/styles.scss
+++ b/src/containers/PayStrings/styles.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .paystring-page {
   width: 100%;
diff --git a/src/containers/Token/DEXPairs/styles.scss b/src/containers/Token/DEXPairs/styles.scss
index 11b19add9..20c52eab4 100644
--- a/src/containers/Token/DEXPairs/styles.scss
+++ b/src/containers/Token/DEXPairs/styles.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .dex-pairs-container {
   padding: 64px 0 100px;
diff --git a/src/containers/Token/TokenHeader/styles.scss b/src/containers/Token/TokenHeader/styles.scss
index 6ea3030d5..050a892e7 100644
--- a/src/containers/Token/TokenHeader/styles.scss
+++ b/src/containers/Token/TokenHeader/styles.scss
@@ -1,5 +1,5 @@
-@import '../../shared/css/variables';
-@import '../../shared/css/table';
+@use '../../shared/css/variables' as *;
+@use '../../shared/css/table';
 
 .header-container {
   .bottom-container {
diff --git a/src/containers/Token/styles.scss b/src/containers/Token/styles.scss
index 823aeba8d..bf32172e2 100644
--- a/src/containers/Token/styles.scss
+++ b/src/containers/Token/styles.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables';
 
 .token-page {
   width: 100%;
diff --git a/src/containers/Transactions/DetailTab/detailTab.scss b/src/containers/Transactions/DetailTab/detailTab.scss
index 569b8f1a2..6cca63254 100644
--- a/src/containers/Transactions/DetailTab/detailTab.scss
+++ b/src/containers/Transactions/DetailTab/detailTab.scss
@@ -1,4 +1,4 @@
-@import '../../shared/css/variables';
+@use '../../shared/css/variables' as *;
 
 .detail-body {
   margin-top: 20px;
diff --git a/src/containers/Transactions/simpleTab.scss b/src/containers/Transactions/simpleTab.scss
index ca374a592..978ef28f3 100644
--- a/src/containers/Transactions/simpleTab.scss
+++ b/src/containers/Transactions/simpleTab.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 $subdued-color: $black-40;
 
diff --git a/src/containers/Transactions/transaction.scss b/src/containers/Transactions/transaction.scss
index 7c80014fc..45997a886 100644
--- a/src/containers/Transactions/transaction.scss
+++ b/src/containers/Transactions/transaction.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .transaction {
   position: relative;
diff --git a/src/containers/Validators/historyTab.scss b/src/containers/Validators/historyTab.scss
index 4112abe75..69127e96f 100644
--- a/src/containers/Validators/historyTab.scss
+++ b/src/containers/Validators/historyTab.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .history-table {
   // Col overall styling
diff --git a/src/containers/Validators/simpleTab.scss b/src/containers/Validators/simpleTab.scss
index 224a55cc7..f95bbde77 100644
--- a/src/containers/Validators/simpleTab.scss
+++ b/src/containers/Validators/simpleTab.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .simple-body-validator {
   .row {
diff --git a/src/containers/Validators/validator.scss b/src/containers/Validators/validator.scss
index 58a5bfe75..7cda86f67 100644
--- a/src/containers/Validators/validator.scss
+++ b/src/containers/Validators/validator.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .validator {
   position: relative;
diff --git a/src/containers/Validators/votingTab.scss b/src/containers/Validators/votingTab.scss
index 71b6cd95b..eb6c7a489 100644
--- a/src/containers/Validators/votingTab.scss
+++ b/src/containers/Validators/votingTab.scss
@@ -1,4 +1,4 @@
-@import '../shared/css/variables';
+@use '../shared/css/variables' as *;
 
 .voting {
   margin-left: 24px;
diff --git a/src/containers/shared/components/Dropdown/dropdown.scss b/src/containers/shared/components/Dropdown/dropdown.scss
index 5d23922e5..b49e23cb4 100644
--- a/src/containers/shared/components/Dropdown/dropdown.scss
+++ b/src/containers/shared/components/Dropdown/dropdown.scss
@@ -1,4 +1,4 @@
-@import '../../css/variables';
+@use '../../css/variables' as *;
 
 .dropdown {
   position: relative;
diff --git a/src/containers/shared/components/JsonView/json-view.scss b/src/containers/shared/components/JsonView/json-view.scss
index ff09d9907..0ca1c7de1 100644
--- a/src/containers/shared/components/JsonView/json-view.scss
+++ b/src/containers/shared/components/JsonView/json-view.scss
@@ -1,4 +1,4 @@
-@import '../../css/variables';
+@use '../../css/variables' as *;
 @import 'react18-json-view/src/style.css';
 
 .json-view {
diff --git a/src/containers/shared/components/Notification/styles.scss b/src/containers/shared/components/Notification/styles.scss
index 9844d2327..a2dd6dad3 100644
--- a/src/containers/shared/components/Notification/styles.scss
+++ b/src/containers/shared/components/Notification/styles.scss
@@ -1,4 +1,4 @@
-@import '../../css/variables';
+@use '../../css/variables' as *;
 
 .notification {
   border: 1px solid;
diff --git a/src/containers/shared/components/TransactionTable/styles.scss b/src/containers/shared/components/TransactionTable/styles.scss
index ad29c981f..fa235d2d4 100644
--- a/src/containers/shared/components/TransactionTable/styles.scss
+++ b/src/containers/shared/components/TransactionTable/styles.scss
@@ -1,5 +1,5 @@
 @use 'sass:color';
-@import '../../../shared/css/variables';
+@use '../../../shared/css/variables' as *;
 
 .transaction-table {
   width: 100%;
diff --git a/src/containers/shared/css/box.scss b/src/containers/shared/css/box.scss
index bbd7ea06b..839b8e264 100644
--- a/src/containers/shared/css/box.scss
+++ b/src/containers/shared/css/box.scss
@@ -1,4 +1,4 @@
-@import './variables';
+@use 'variables' as *;
 
 .box {
   border-radius: 4px;
diff --git a/src/containers/shared/css/form.scss b/src/containers/shared/css/form.scss
index ee462e9a2..e4fefc169 100644
--- a/src/containers/shared/css/form.scss
+++ b/src/containers/shared/css/form.scss
@@ -1,4 +1,4 @@
-@import './variables';
+@use 'variables' as *;
 
 label {
   color: $black-40;
diff --git a/src/containers/shared/css/global.scss b/src/containers/shared/css/global.scss
index 8d7bf9b0d..e10fd11d1 100644
--- a/src/containers/shared/css/global.scss
+++ b/src/containers/shared/css/global.scss
@@ -1,7 +1,7 @@
 // ONLY GLOBAL CSS, KEEP IT TO MINIMAL
 // CSS SHOULD BE SCOPPED TO COMPONENT
-@import './variables';
-@import './form';
+@use 'variables' as *;
+@use 'form';
 
 /**
  * `current_symbols` is used for currency codes missing from other fonts, currently `u+e900` (XRP) and `u+e901` (BTC).
diff --git a/src/containers/shared/css/simpleTab.scss b/src/containers/shared/css/simpleTab.scss
index 574f4adda..087d3005c 100644
--- a/src/containers/shared/css/simpleTab.scss
+++ b/src/containers/shared/css/simpleTab.scss
@@ -1,4 +1,4 @@
-@import './variables';
+@use 'variables' as *;
 
 $index-width: 324px;
 
diff --git a/src/containers/shared/css/table.scss b/src/containers/shared/css/table.scss
index 53dc1e2df..4f53bac7c 100644
--- a/src/containers/shared/css/table.scss
+++ b/src/containers/shared/css/table.scss
@@ -1,4 +1,4 @@
-@import './variables';
+@use 'variables' as *;
 
 table.basic {
   overflow: hidden;
diff --git a/src/containers/shared/css/tabs.scss b/src/containers/shared/css/tabs.scss
index 379fd220c..3ffa955ec 100644
--- a/src/containers/shared/css/tabs.scss
+++ b/src/containers/shared/css/tabs.scss
@@ -1,4 +1,4 @@
-@import './variables';
+@use 'variables' as *;
 
 .tabs {
   border-top: 1px solid $black-70;
diff --git a/src/containers/shared/css/tooltip.scss b/src/containers/shared/css/tooltip.scss
index a1c6d5e4b..eaada0ce5 100644
--- a/src/containers/shared/css/tooltip.scss
+++ b/src/containers/shared/css/tooltip.scss
@@ -1,4 +1,4 @@
-@import './variables';
+@use 'variables' as *;
 
 .tooltip {
   position: absolute;
diff --git a/src/containers/shared/css/txlabel.scss b/src/containers/shared/css/txlabel.scss
index 093f8300c..dd2b520a6 100644
--- a/src/containers/shared/css/txlabel.scss
+++ b/src/containers/shared/css/txlabel.scss
@@ -1,4 +1,4 @@
-@import './variables';
+@use 'variables' as *;
 
 .tx-label {
   display: inline-flex;
diff --git a/src/containers/shared/css/txstatus.scss b/src/containers/shared/css/txstatus.scss
index 0a447f246..66933e784 100644
--- a/src/containers/shared/css/txstatus.scss
+++ b/src/containers/shared/css/txstatus.scss
@@ -1,4 +1,4 @@
-@import './variables';
+@use 'variables' as *;
 
 .tx-status {
   display: inline-flex;

From dae75f4e6880a5b7293c99a4f1733410c8ce8313 Mon Sep 17 00:00:00 2001
From: achowdhry-ripple <achowdhry@ripple.com>
Date: Wed, 13 Nov 2024 11:13:44 -0500
Subject: [PATCH 57/79] Add Simple Enable Amendment Translations (#1084)

## High Level Overview of Change

Add translations to the EnableAmendment/Simple.tsx file for the table
labels. Small code cleanup raised in
https://github.com/ripple/explorer/issues/1076

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 public/locales/ca-CA/translations.json                 |  5 ++++-
 public/locales/en-US/translations.json                 |  6 +++++-
 public/locales/es-ES/translations.json                 |  5 ++++-
 public/locales/fr-FR/translations.json                 |  5 ++++-
 public/locales/ja-JP/translations.json                 |  5 ++++-
 public/locales/ko-KR/translations.json                 |  5 ++++-
 .../components/Transaction/EnableAmendment/Simple.tsx  | 10 ++++++----
 7 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 5dfa97bdd..02d1367b3 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -557,5 +557,8 @@
   "can_trade": null,
   "can_transfer": null,
   "can_clawback": null,
-  "search_results_banner": null
+  "search_results_banner": null,
+  "enable_amendment_name": null,
+  "amendment_status": null,
+  "expected_date": null
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index 4d8196175..83fb30d98 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -557,5 +557,9 @@
   "can_trade": "Can Trade",
   "can_transfer": "Can Transfer",
   "can_clawback": "Can Clawback",
-  "search_results_banner": "Token search by name and account is now available! Try searching for USD"
+  "search_results_banner": "Token search by name and account is now available! Try searching for USD",
+  "enable_amendment_name": "Amendment Name",
+  "amendment_status": "Amendment Status",
+  "expected_date": "Expected Date"
+
 }
diff --git a/public/locales/es-ES/translations.json b/public/locales/es-ES/translations.json
index 3f6ff0b18..17965bd0a 100644
--- a/public/locales/es-ES/translations.json
+++ b/public/locales/es-ES/translations.json
@@ -553,5 +553,8 @@
   "can_trade": null,
   "can_transfer": null,
   "can_clawback": null,
-  "search_results_banner": null
+  "search_results_banner": null,
+  "enable_amendment_name": null,
+  "amendment_status": null,
+  "expected_date": null
 }
diff --git a/public/locales/fr-FR/translations.json b/public/locales/fr-FR/translations.json
index 5e2f48fde..33ac67e2d 100644
--- a/public/locales/fr-FR/translations.json
+++ b/public/locales/fr-FR/translations.json
@@ -554,5 +554,8 @@
   "can_trade": null,
   "can_transfer": null,
   "can_clawback": null,
-  "search_results_banner": null
+  "search_results_banner": null,
+  "enable_amendment_name": null,
+  "amendment_status": null,
+  "expected_date": null
 }
diff --git a/public/locales/ja-JP/translations.json b/public/locales/ja-JP/translations.json
index f5779f900..e5b667cac 100644
--- a/public/locales/ja-JP/translations.json
+++ b/public/locales/ja-JP/translations.json
@@ -553,5 +553,8 @@
   "can_trade": null,
   "can_transfer": null,
   "can_clawback": null,
-  "search_results_banner": null
+  "search_results_banner": null,
+  "enable_amendment_name": null,
+  "amendment_status": null,
+  "expected_date": null
 }
diff --git a/public/locales/ko-KR/translations.json b/public/locales/ko-KR/translations.json
index f44ad2a32..0f5406903 100644
--- a/public/locales/ko-KR/translations.json
+++ b/public/locales/ko-KR/translations.json
@@ -551,5 +551,8 @@
   "can_trade": null,
   "can_transfer": null,
   "can_clawback": null,
-  "search_results_banner": null
+  "search_results_banner": null,
+  "enable_amendment_name": null,
+  "amendment_status": null,
+  "expected_date": null
 }
diff --git a/src/containers/shared/components/Transaction/EnableAmendment/Simple.tsx b/src/containers/shared/components/Transaction/EnableAmendment/Simple.tsx
index 35f885c53..cd53f50b8 100644
--- a/src/containers/shared/components/Transaction/EnableAmendment/Simple.tsx
+++ b/src/containers/shared/components/Transaction/EnableAmendment/Simple.tsx
@@ -1,4 +1,5 @@
 import { useContext, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
 import { useLanguage } from '../../../hooks'
 import { SimpleRow } from '../SimpleRow'
 import { TransactionSimpleProps } from '../types'
@@ -16,6 +17,7 @@ const states = {
 
 export const Simple = ({ data }: TransactionSimpleProps<EnableAmendment>) => {
   const language = useLanguage()
+  const { t } = useTranslation()
   const [amendmentDetails, setAmendmentDetails] = useState({
     name: states.loading,
     minRippledVersion: states.loading,
@@ -56,7 +58,7 @@ export const Simple = ({ data }: TransactionSimpleProps<EnableAmendment>) => {
 
   return (
     <>
-      <SimpleRow label="Amendment Name" data-test="name">
+      <SimpleRow label={t('enable_amendment_name')} data-test="name">
         <RouteLink
           to={AMENDMENT_ROUTE}
           params={{ identifier: data.instructions.Amendment }}
@@ -64,16 +66,16 @@ export const Simple = ({ data }: TransactionSimpleProps<EnableAmendment>) => {
           {amendmentDetails.name}
         </RouteLink>
       </SimpleRow>
-      <SimpleRow label="Amendment Status" data-test="status">
+      <SimpleRow label={t('amendment_status')} data-test="status">
         <a href="https://xrpl.org/enableamendment.html#enableamendment-flags">
           {amendmentStatus}
         </a>
       </SimpleRow>
-      <SimpleRow label="Introduced In" data-test="version">
+      <SimpleRow label={t('introduced_in')} data-test="version">
         {amendmentDetails.minRippledVersion}
       </SimpleRow>
       {amendmentStatus === 'Got Majority' && (
-        <SimpleRow label="Expected Date" data-test="date">
+        <SimpleRow label={t('expected_date')} data-test="date">
           {expectedDate}
         </SimpleRow>
       )}

From 3dad4243f56df4f738885a65dd537e3f4a1e8a25 Mon Sep 17 00:00:00 2001
From: Mayukha Vadari <mvadari@ripple.com>
Date: Tue, 19 Nov 2024 13:40:34 -0500
Subject: [PATCH 58/79] chore: bump Github Actions versions (#1063)

## High Level Overview of Change

Title says it all.

### Context of Change

Deprecation notices on Actions:
> The following actions use a deprecated Node.js version and will be
forced to run on node20: actions/checkout@v3, actions/setup-node@v3,
actions/cache@v3. For more info:
https://github.blog/changelog/2024-03-07-github-actions-all-actions-will-run-on-node20-instead-of-node16-by-default/

### Type of Change

- [x] Tests (You added tests for code that already exists, or your new
feature included in this PR)

### TypeScript/Hooks Update

N/A

## Test Plan

The notices go away now.
---
 .github/workflows/nodejs.yml | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml
index 56af795c6..aaf9a0a1e 100644
--- a/.github/workflows/nodejs.yml
+++ b/.github/workflows/nodejs.yml
@@ -5,7 +5,7 @@ name: Node.js CI
 
 on:
   push:
-    branches: [ main, staging ]
+    branches: [main, staging]
   pull_request:
   workflow_dispatch:
 
@@ -18,15 +18,15 @@ jobs:
         node-version: [18.12]
 
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Use Node.js ${{ matrix.node-version }}
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: ${{ matrix.node-version }}
 
       - name: Cache node modules
         id: cache-nodemodules
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         env:
           cache-name: cache-node-modules
         with:
@@ -51,15 +51,15 @@ jobs:
         node-version: [18.12]
 
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Use Node.js ${{ matrix.node-version }}
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: ${{ matrix.node-version }}
 
       - name: Cache node modules
         id: cache-nodemodules
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         env:
           cache-name: cache-node-modules
         with:
@@ -91,15 +91,15 @@ jobs:
         node-version: [18.12]
 
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Use Node.js ${{ matrix.node-version }}
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: ${{ matrix.node-version }}
 
       - name: Cache node modules
         id: cache-nodemodules
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         env:
           cache-name: cache-node-modules
         with:
@@ -124,15 +124,15 @@ jobs:
         node-version: [18.12]
 
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Use Node.js ${{ matrix.node-version }}
-        uses: actions/setup-node@v3
+        uses: actions/setup-node@v4
         with:
           node-version: ${{ matrix.node-version }}
 
       - name: Cache node modules
         id: cache-nodemodules
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         env:
           cache-name: cache-node-modules
         with:

From 9eea4fa18a8f4b96d08a90e1be683116fe20ce97 Mon Sep 17 00:00:00 2001
From: Shawn Xie <35279399+shawnxie999@users.noreply.github.com>
Date: Mon, 2 Dec 2024 17:24:08 -0500
Subject: [PATCH 59/79] Fix extreneous ledger_entry call for Amount (#1095)

## High Level Overview of Change

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 src/containers/shared/components/Amount.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/containers/shared/components/Amount.tsx b/src/containers/shared/components/Amount.tsx
index e7fe6ecd5..1a767a796 100644
--- a/src/containers/shared/components/Amount.tsx
+++ b/src/containers/shared/components/Amount.tsx
@@ -29,7 +29,7 @@ export const Amount = ({
   const currency = typeof value === 'string' ? 'XRP' : value.currency
   const amount =
     typeof value === 'string' ? parseInt(value, 10) / XRP_BASE : value.amount
-  const isMPT = typeof value === 'string' ? false : value.isMPT
+  const isMPT = typeof value === 'string' ? false : value.isMPT ?? false
 
   const options = { ...CURRENCY_OPTIONS, currency }
 

From 1e89d531b696ac39c78495f2fa12d8ca8ad49d6f Mon Sep 17 00:00:00 2001
From: Mayukha Vadari <mvadari@ripple.com>
Date: Mon, 2 Dec 2024 18:49:41 -0500
Subject: [PATCH 60/79] fix: avoid initializing multiple connections (#1096)

## High Level Overview of Change

Title says it all. There are multiple connections made to a node in the
current implementation, at different ports (which all forward to the
same place on livenet). While the connection isn't sustained, it still
has to be made and canceled.

### Context of Change

There is a lot of load on s2 right now, so saving a connection or two
might make a difference.

### Type of Change

- [x] Bug fix (non-breaking change which fixes an issue)

### TypeScript/Hooks Update

N/A

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

Tested locally.
---
 server/lib/rippled.js                         | 14 +++++++------
 server/routes/v1/tokens.js                    |  7 +++++--
 src/containers/shared/SocketContext.tsx       | 10 +++++----
 .../shared/test/SocketContext.test.ts         | 21 ++++++-------------
 4 files changed, 25 insertions(+), 27 deletions(-)

diff --git a/server/lib/rippled.js b/server/lib/rippled.js
index 7e90d8c27..7d1c27467 100644
--- a/server/lib/rippled.js
+++ b/server/lib/rippled.js
@@ -4,12 +4,14 @@ const utils = require('./utils')
 const streams = require('./streams')
 
 const RIPPLEDS = []
-process.env.VITE_RIPPLED_HOST?.split(',').forEach((d) => {
-  const rippled = d.split(':')
-  RIPPLEDS.push(
-    `wss://${rippled[0]}:${rippled[1] || process.env.VITE_RIPPLED_WS_PORT}`,
-    `wss://${rippled[0]}`,
-  )
+process.env.VITE_RIPPLED_HOST?.split(',').forEach((host) => {
+  if (host?.includes(':')) {
+    RIPPLEDS.push(`wss://${host}`)
+  } else if (process.env.VITE_RIPPLED_WS_PORT) {
+    RIPPLEDS.push(`wss://${host}:${process.env.VITE_RIPPLED_WS_PORT}`)
+  } else {
+    RIPPLEDS.push(`wss://${host}`)
+  }
 })
 
 const RIPPLED_CLIENT = new XrplClient(RIPPLEDS, { tryAllNodes: true })
diff --git a/server/routes/v1/tokens.js b/server/routes/v1/tokens.js
index 072dcf5ab..0fcadbe09 100644
--- a/server/routes/v1/tokens.js
+++ b/server/routes/v1/tokens.js
@@ -41,12 +41,15 @@ async function fetchXRPLMetaTokens(offset) {
       },
     )
     .then((resp) => resp.data)
-    .catch((e) => log.error(e))
+    .catch((e) => {
+      log.error(e)
+      return { count: 0 }
+    })
 }
 
 async function cacheXRPLMetaTokens() {
   let offset = 0
-  let tokensDataBatch = []
+  let tokensDataBatch = {}
   const allTokensFetched = []
 
   tokensDataBatch = await fetchXRPLMetaTokens(0)
diff --git a/src/containers/shared/SocketContext.tsx b/src/containers/shared/SocketContext.tsx
index a8ed6f217..17ef964e4 100644
--- a/src/containers/shared/SocketContext.tsx
+++ b/src/containers/shared/SocketContext.tsx
@@ -29,11 +29,13 @@ function getSocket(rippledUrl?: string): ExplorerXrplClient {
 
     if (host?.includes(':')) {
       wsUrls.push(`${prefix}://${host}`)
+    } else if (process.env.VITE_RIPPLED_WS_PORT) {
+      wsUrls.push(`${prefix}://${host}:${process.env.VITE_RIPPLED_WS_PORT}`)
+      if (process.env.VITE_ENVIRONMENT === 'custom') {
+        wsUrls.push(`${prefix}://${host}`)
+      }
     } else {
-      wsUrls.push.apply(wsUrls, [
-        `${prefix}://${host}:${process.env.VITE_RIPPLED_WS_PORT}`,
-        `${prefix}://${host}:443`,
-      ])
+      wsUrls.push(`${prefix}://${host}`)
     }
   })
 
diff --git a/src/containers/shared/test/SocketContext.test.ts b/src/containers/shared/test/SocketContext.test.ts
index 2c268ed56..2a67fae26 100644
--- a/src/containers/shared/test/SocketContext.test.ts
+++ b/src/containers/shared/test/SocketContext.test.ts
@@ -28,7 +28,7 @@ describe('getSocket', () => {
       const client = getSocket()
       expect(XrplClient).toHaveBeenNthCalledWith(
         1,
-        ['wss://somewhere.com:51233', 'wss://somewhere.com:443'],
+        ['wss://somewhere.com:51233'],
         {
           tryAllNodes: true,
         },
@@ -47,12 +47,7 @@ describe('getSocket', () => {
       const client = getSocket()
       expect(XrplClient).toHaveBeenNthCalledWith(
         1,
-        [
-          'wss://somewhere.com:51233',
-          'wss://somewhere.com:443',
-          'wss://elsewhere.com:51233',
-          'wss://elsewhere.com:443',
-        ],
+        ['wss://somewhere.com:51233', 'wss://elsewhere.com:51233'],
         {
           tryAllNodes: true,
         },
@@ -71,7 +66,7 @@ describe('getSocket', () => {
       const client = getSocket()
       expect(XrplClient).toHaveBeenNthCalledWith(
         1,
-        ['ws://somewhere.com:51233', 'ws://somewhere.com:443'],
+        ['ws://somewhere.com:51233'],
         {
           tryAllNodes: true,
         },
@@ -120,13 +115,9 @@ describe('getSocket', () => {
 
     it('should use ws when supplied entry is for a localhost', () => {
       const client = getSocket('localhost')
-      expect(XrplClient).toHaveBeenNthCalledWith(
-        1,
-        ['ws://localhost:51233', 'ws://localhost:443'],
-        {
-          tryAllNodes: true,
-        },
-      )
+      expect(XrplClient).toHaveBeenNthCalledWith(1, ['ws://localhost:51233'], {
+        tryAllNodes: true,
+      })
 
       expect((client as any).p2pSocket).not.toBeDefined()
     })

From 8cdbf05ef6c71e4f2cf283dedd36a2e364daf3a8 Mon Sep 17 00:00:00 2001
From: Shawn Xie <35279399+shawnxie999@users.noreply.github.com>
Date: Thu, 12 Dec 2024 08:17:43 -0800
Subject: [PATCH 61/79] Use clio's include_deleted param in ledger_entry to
 fetch deleted MPT (#1097)

## High Level Overview of Change

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change
Before
<img width="1170" alt="image"
src="https://github.com/user-attachments/assets/3101cfdd-ef88-4ab0-8591-d6e18e8e9abd"
/>

after
<img width="1189" alt="image"
src="https://github.com/user-attachments/assets/faf4a733-8661-4841-a81f-5f2e52f544bc"
/>
`getMPTIssuance` fails to fetch the MPT because the MPT itself has been
deleted. Clio's ledger_entry API supports querying deleted object by
specifying `include_deleted` to be true
<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 src/rippled/lib/rippled.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/rippled/lib/rippled.js b/src/rippled/lib/rippled.js
index 85900ffa9..89f47ad6e 100644
--- a/src/rippled/lib/rippled.js
+++ b/src/rippled/lib/rippled.js
@@ -573,10 +573,11 @@ const getFeature = (rippledSocket, amendmentId) => {
 }
 
 const getMPTIssuance = (rippledSocket, tokenId) =>
-  query(rippledSocket, {
+  queryP2P(rippledSocket, {
     command: 'ledger_entry',
     mpt_issuance: tokenId,
     ledger_index: 'validated',
+    include_deleted: true,
   }).then((resp) => {
     if (
       resp.error === 'entryNotFound' ||

From 4028046daa0a1f14e10d5d1edc98cafb06e53402 Mon Sep 17 00:00:00 2001
From: Shawn Xie <35279399+shawnxie999@users.noreply.github.com>
Date: Mon, 16 Dec 2024 11:29:35 -0800
Subject: [PATCH 62/79] Rename `MPTokenHolder` to `Holder` (#1062)

## High Level Overview of Change
rippled change that renames MPTokenHolder:
https://github.com/XRPLF/rippled/pull/5143/commits/b636836a47b48f758d64ca4ea96ee42a5035fde3
<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [x] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 .../shared/components/Transaction/Clawback/Description.tsx  | 2 +-
 .../shared/components/Transaction/Clawback/parser.ts        | 2 +-
 .../Transaction/Clawback/test/mock_data/ClawbackMPT.json    | 2 +-
 .../Clawback/test/mock_data/ClawbackMPT_Failure.json        | 2 +-
 .../shared/components/Transaction/Clawback/types.ts         | 2 +-
 .../components/Transaction/MPTokenAuthorize/Simple.tsx      | 6 +++---
 .../test/mock_data/MPTokenAuthorize_WithHolder.json         | 2 +-
 .../test/mock_data/MPTokenAuthorize_WithHolderFail.json     | 2 +-
 .../shared/components/Transaction/MPTokenAuthorize/types.ts | 2 +-
 .../components/Transaction/MPTokenIssuanceSet/Simple.tsx    | 6 +++---
 .../test/mock_data/MPTokenIssuanceSet.json                  | 2 +-
 .../test/mock_data/MPTokenIssuanceSet_Fail.json             | 2 +-
 .../components/Transaction/MPTokenIssuanceSet/types.ts      | 2 +-
 13 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/containers/shared/components/Transaction/Clawback/Description.tsx b/src/containers/shared/components/Transaction/Clawback/Description.tsx
index c92397c35..42641b95c 100644
--- a/src/containers/shared/components/Transaction/Clawback/Description.tsx
+++ b/src/containers/shared/components/Transaction/Clawback/Description.tsx
@@ -7,7 +7,7 @@ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount'
 export const Description = ({ data }: TransactionDescriptionProps) => {
   const issuer = data.tx.Account
   const amount = formatAmount(data.tx.Amount)
-  const holder = amount.isMPT ? data.tx.MPTokenHolder : data.tx.Amount.issuer
+  const holder = amount.isMPT ? data.tx.Holder : data.tx.Amount.issuer
   amount.issuer = issuer
   return (
     <>
diff --git a/src/containers/shared/components/Transaction/Clawback/parser.ts b/src/containers/shared/components/Transaction/Clawback/parser.ts
index f5ce6f6a0..0f96430df 100644
--- a/src/containers/shared/components/Transaction/Clawback/parser.ts
+++ b/src/containers/shared/components/Transaction/Clawback/parser.ts
@@ -14,7 +14,7 @@ export const parser: TransactionParser<Clawback, ClawbackInstructions> = (
   const amount = formatAmount(tx.Amount)
 
   if (amount.isMPT === true) {
-    const holder = tx.MPTokenHolder
+    const holder = tx.Holder
 
     const filteredMptNode = meta.AffectedNodes.filter(
       (node: any) => node.ModifiedNode?.LedgerEntryType === 'MPToken',
diff --git a/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json
index 2a7d4513a..37e1d6630 100644
--- a/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json
+++ b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json
@@ -7,7 +7,7 @@
     },
     "Fee": "10",
     "Flags": 2147483648,
-    "MPTokenHolder": "rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD",
+    "Holder": "rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD",
     "Sequence": 3432,
     "SigningPubKey": "ED0C1DE70A8762E6C98EC78CF13D278D6950ECDFE8E87BAD3732730845E2D9AB6A",
     "TransactionType": "Clawback",
diff --git a/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json
index b0c7d31c8..d48f95247 100644
--- a/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json
+++ b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json
@@ -7,7 +7,7 @@
     },
     "Fee": "10",
     "Flags": 2147483648,
-    "MPTokenHolder": "r9rAqX8Jjo4uACsimYDVsy5thHDPivujqf",
+    "Holder": "r9rAqX8Jjo4uACsimYDVsy5thHDPivujqf",
     "Sequence": 4246,
     "SigningPubKey": "ED4F6FF2241860884D4DD6C5797BDA553155D194F07B1BFC67129F183322DA7DC3",
     "TransactionType": "Clawback",
diff --git a/src/containers/shared/components/Transaction/Clawback/types.ts b/src/containers/shared/components/Transaction/Clawback/types.ts
index bbfaa9067..19a3c8674 100644
--- a/src/containers/shared/components/Transaction/Clawback/types.ts
+++ b/src/containers/shared/components/Transaction/Clawback/types.ts
@@ -3,7 +3,7 @@ import { Amount, ExplorerAmount } from '../../../types'
 
 export interface Clawback extends TransactionCommonFields {
   Amount: Amount
-  MPTokenHolder?: string
+  Holder?: string
 }
 
 export interface ClawbackInstructions {
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx
index 9823dfe4f..fda5331b6 100644
--- a/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx
@@ -8,7 +8,7 @@ import { MPTokenLink } from '../../MPTokenLink'
 export const Simple: TransactionSimpleComponent = ({
   data,
 }: TransactionSimpleProps<MPTokenAuthorize>) => {
-  const { MPTokenIssuanceID, MPTokenHolder } = data.instructions
+  const { MPTokenIssuanceID, Holder } = data.instructions
   const { t } = useTranslation()
 
   return (
@@ -16,9 +16,9 @@ export const Simple: TransactionSimpleComponent = ({
       <SimpleRow label={t('mpt_issuance_id')} data-test="mpt-issuance-id">
         <MPTokenLink tokenID={MPTokenIssuanceID} />
       </SimpleRow>
-      {MPTokenHolder && (
+      {Holder && (
         <SimpleRow label={t('mpt_holder')} data-test="mpt-holder">
-          <Account account={MPTokenHolder} />
+          <Account account={Holder} />
         </SimpleRow>
       )}
     </>
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json
index 3cce1b4e2..010e406f9 100644
--- a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json
@@ -3,7 +3,7 @@
     "Account": "rwfgw2dWqUAexB46z5QRq2dJcgTK9piw5w",
     "Fee": "10",
     "Flags": 2147483648,
-    "MPTokenHolder": "rK3bB9myvWoMaLbLnpksGx2Zz58BL225am",
+    "Holder": "rK3bB9myvWoMaLbLnpksGx2Zz58BL225am",
     "MPTokenIssuanceID": "0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B",
     "Sequence": 4876,
     "SigningPubKey": "ED936E848B8E37D20991C2E1C5C76ABAEC0625D693CEB85BA495B58E16712DA627",
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json
index 69b7eaa8c..b2572caaf 100644
--- a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json
@@ -3,7 +3,7 @@
     "Account": "rL4pMQAa3V7s9QNw1wEk2znnhjbfYo4GQC",
     "Fee": "10",
     "Flags": 2147483648,
-    "MPTokenHolder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
+    "Holder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
     "MPTokenIssuanceID": "00000F76D46440EE21F74E5B2398315BC1CFEB9A7EB48A14",
     "Sequence": 3959,
     "SigningPubKey": "EDF7A3D93CE3AA46168649283C20C2D4FC36642FDD87449F1CCF068638BF17B10E",
diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts b/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts
index 878129a9f..c501d4639 100644
--- a/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts
+++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts
@@ -2,5 +2,5 @@ import { TransactionCommonFields } from '../types'
 
 export interface MPTokenAuthorize extends TransactionCommonFields {
   MPTokenIssuanceID: string
-  MPTokenHolder?: string
+  Holder?: string
 }
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx
index 9f0b13ca8..2825a3118 100644
--- a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx
@@ -8,7 +8,7 @@ import { MPTokenLink } from '../../MPTokenLink'
 export const Simple: TransactionSimpleComponent = ({
   data,
 }: TransactionSimpleProps<MPTokenIssuanceSet>) => {
-  const { MPTokenIssuanceID, MPTokenHolder } = data.instructions
+  const { MPTokenIssuanceID, Holder } = data.instructions
   const { t } = useTranslation()
 
   return (
@@ -16,9 +16,9 @@ export const Simple: TransactionSimpleComponent = ({
       <SimpleRow label={t('mpt_issuance_id')} data-test="mpt-issuance-id">
         <MPTokenLink tokenID={MPTokenIssuanceID} />
       </SimpleRow>
-      {MPTokenHolder && (
+      {Holder && (
         <SimpleRow label={t('mpt_holder')} data-test="mpt-holder">
-          <Account account={MPTokenHolder} />
+          <Account account={Holder} />
         </SimpleRow>
       )}
     </>
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json
index e78513a6c..c9beb8f58 100644
--- a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json
@@ -3,7 +3,7 @@
     "Account": "rERyS9qtwky94UMMjjmbku3uo5aQwAoJ58",
     "Fee": "10",
     "Flags": 1,
-    "MPTokenHolder": "r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg",
+    "Holder": "r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg",
     "MPTokenIssuanceID": "00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C",
     "Sequence": 3054,
     "SigningPubKey": "EDF73A1C528F5BFBD6FF2B05D0C71760D7D2DF1DE3496935612E47BCB440F28040",
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json
index 60062ffc1..3526bc28c 100644
--- a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json
@@ -3,7 +3,7 @@
     "Account": "rpizWPf4g8JLWFUT7143Zn9A1n2Dy9bnji",
     "Fee": "10",
     "Flags": 1,
-    "MPTokenHolder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
+    "Holder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
     "MPTokenIssuanceID": "00000F83146C83112AED215CD345F8E7327459BFCF6B8062",
     "Sequence": 3972,
     "SigningPubKey": "ED4EC06184C745D99AEAAA16526C900DC181C8546899F462C3D105C11A6677A65A",
diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts
index 5e15d49e8..038ee2607 100644
--- a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts
+++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts
@@ -2,5 +2,5 @@ import { TransactionCommonFields } from '../types'
 
 export interface MPTokenIssuanceSet extends TransactionCommonFields {
   MPTokenIssuanceID: string
-  MPTokenHolder?: string
+  Holder?: string
 }

From 12e04fa74b2718121fbf6e0b60c464db3070a888 Mon Sep 17 00:00:00 2001
From: achowdhry-ripple <achowdhry@ripple.com>
Date: Tue, 17 Dec 2024 17:16:27 -0500
Subject: [PATCH 63/79] fix double issuer address logic (#1099)

## High Level Overview of Change

Bug in the conditional rendering logic for issuer address, it
accidentally double printed the issuer if a name was not provided in the
data. Now only prints the issuer once with no parenthesis if a name is
not provided.

### Context of Change

<!--
Please include the context of a change.
If a bug fix, when was the bug introduced? What was the behavior?
If a new feature, why was this architecture chosen? What were the
alternatives?
If a refactor, how is this better than the previous implementation?

If there is a design document for this feature, please link it here.
-->

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

<!--
In an effort to modernize the codebase, you should convert the files
that you work with to React Hooks and TypeScript.
If this is not possible (e.g. it's too many changes, touching too many
files, etc.) please explain why here.
-->

- [ ] Updated files to React Hooks
- [ ] Updated files to TypeScript

## Before / After

<!--
If just refactoring / back-end changes, this can be just an in-English
description of the change at a technical level.
If a UI change, screenshots should be included.
-->

## Test Plan

<!--
Please describe the tests that you ran to verify your changes and
provide instructions so that others can reproduce.
-->

<!--
## Future Tasks
For future tasks related to PR.
-->
---
 .../shared/components/TokenSearchResults/TokenSearchRow.tsx   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/containers/shared/components/TokenSearchResults/TokenSearchRow.tsx b/src/containers/shared/components/TokenSearchResults/TokenSearchRow.tsx
index 0b1e4066a..47bdaef51 100644
--- a/src/containers/shared/components/TokenSearchResults/TokenSearchRow.tsx
+++ b/src/containers/shared/components/TokenSearchResults/TokenSearchRow.tsx
@@ -41,10 +41,10 @@ const IssuerAddress: FC<{ token: any; onClick: any }> = ({ token, onClick }) =>
       className="issuer-link"
     >
       <div className="issuer-name">
-        {token.meta.issuer.name ? `${token.meta.issuer.name} (` : token.issuer}
+        {token.meta.issuer.name && `${token.meta.issuer.name} (`}
       </div>
       <div className="issuer-address truncate">{token.issuer}</div>
-      <div>)</div>
+      {token.meta.issuer.name && <div>)</div>}
     </Link>
   ) : null
 

From 8d503dad9667a77950cdaa8ef929b81e659cc428 Mon Sep 17 00:00:00 2001
From: Caleb Kniffen <ckniffen@ripple.com>
Date: Tue, 17 Dec 2024 18:31:41 -0600
Subject: [PATCH 64/79] fix: handling of token page throttling (#1100)

The token page is prone to being throttled because it tries to load in
order books for the "top 10 tokens". This change moves logic to useQuery
and out of redux. It then makes sure the token's information is loaded
in before trying to load in dex pairs.

Fixes https://github.com/ripple/explorer/issues/790

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [x] Refactor (non-breaking change that only restructures code)
- [x] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release

### TypeScript/Hooks Update

- [ ] Updated files to React Hooks
- [x] Updated files to TypeScript

## Before / After

### Before
![Monosnap XRPL Explorer | Something bad happened 2024-12-17
14-04-17](https://github.com/user-attachments/assets/27ea108e-59ec-4318-9da3-60ec68c3c38c)

### After
![Monosnap XRPL Explorer | rMxCKbEDwqr7 2024-12-17
14-04-24](https://github.com/user-attachments/assets/7cc2d0d3-d686-408d-a5d2-d3c1c2f8880f)
---
 src/containers/App/index.tsx                  |   2 +-
 .../Token/TokenHeader/actionTypes.js          |   4 -
 src/containers/Token/TokenHeader/actions.js   |  43 -------
 src/containers/Token/TokenHeader/index.tsx    |  60 ++--------
 src/containers/Token/TokenHeader/reducer.js   |  33 ------
 .../Token/TokenHeader/test/actions.test.js    | 108 ------------------
 .../Token/TokenHeader/test/reducer.test.js    |  79 -------------
 src/containers/Token/index.tsx                |  44 ++++---
 src/containers/Token/test/index.test.tsx      |  54 ++++-----
 src/rippled/{token.js => token.ts}            |  25 +++-
 src/rootReducer.js                            |   5 -
 11 files changed, 86 insertions(+), 371 deletions(-)
 delete mode 100644 src/containers/Token/TokenHeader/actionTypes.js
 delete mode 100644 src/containers/Token/TokenHeader/actions.js
 delete mode 100644 src/containers/Token/TokenHeader/reducer.js
 delete mode 100644 src/containers/Token/TokenHeader/test/actions.test.js
 delete mode 100644 src/containers/Token/TokenHeader/test/reducer.test.js
 rename src/rippled/{token.js => token.ts} (74%)

diff --git a/src/containers/App/index.tsx b/src/containers/App/index.tsx
index 1b5734800..479628594 100644
--- a/src/containers/App/index.tsx
+++ b/src/containers/App/index.tsx
@@ -34,7 +34,7 @@ import { Transaction } from '../Transactions'
 import { Network } from '../Network'
 import { Validator } from '../Validators'
 import { PayString } from '../PayStrings'
-import Token from '../Token'
+import { Token } from '../Token'
 import { NFT } from '../NFT/NFT'
 import { legacyRedirect } from './legacyRedirects'
 import { useCustomNetworks } from '../shared/hooks'
diff --git a/src/containers/Token/TokenHeader/actionTypes.js b/src/containers/Token/TokenHeader/actionTypes.js
deleted file mode 100644
index c539d0ce4..000000000
--- a/src/containers/Token/TokenHeader/actionTypes.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export const START_LOADING_ACCOUNT_STATE = 'START_LOADING_ACCOUNT_STATE'
-export const FINISHED_LOADING_ACCOUNT_STATE = 'FINISHED_LOADING_ACCOUNT_STATE'
-export const ACCOUNT_STATE_LOAD_SUCCESS = 'ACCOUNT_STATE_LOAD_SUCCESS'
-export const ACCOUNT_STATE_LOAD_FAIL = 'ACCOUNT_STATE_LOAD_FAIL'
diff --git a/src/containers/Token/TokenHeader/actions.js b/src/containers/Token/TokenHeader/actions.js
deleted file mode 100644
index 0d56b287d..000000000
--- a/src/containers/Token/TokenHeader/actions.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import { isValidClassicAddress, isValidXAddress } from 'ripple-address-codec'
-import { getToken } from '../../../rippled'
-import { analytics } from '../../shared/analytics'
-import { BAD_REQUEST } from '../../shared/utils'
-import * as actionTypes from './actionTypes'
-
-export const loadTokenState =
-  (currency, accountId, rippledSocket) => (dispatch) => {
-    if (!isValidClassicAddress(accountId) && !isValidXAddress(accountId)) {
-      dispatch({
-        type: actionTypes.ACCOUNT_STATE_LOAD_FAIL,
-        status: BAD_REQUEST,
-        error: '',
-      })
-      return Promise.resolve()
-    }
-
-    dispatch({
-      type: actionTypes.START_LOADING_ACCOUNT_STATE,
-    })
-    return getToken(currency, accountId, rippledSocket)
-      .then((data) => {
-        dispatch({ type: actionTypes.FINISHED_LOADING_ACCOUNT_STATE })
-        dispatch({
-          type: actionTypes.ACCOUNT_STATE_LOAD_SUCCESS,
-          data,
-        })
-      })
-      .catch((error) => {
-        const status = error.code
-        analytics.trackException(
-          `token ${currency}.${accountId} --- ${JSON.stringify(error)}`,
-        )
-        dispatch({ type: actionTypes.FINISHED_LOADING_ACCOUNT_STATE })
-        dispatch({
-          type: actionTypes.ACCOUNT_STATE_LOAD_FAIL,
-          error: status === 500 ? 'get_account_state_failed' : '',
-          status,
-        })
-      })
-  }
-
-export default loadTokenState
diff --git a/src/containers/Token/TokenHeader/index.tsx b/src/containers/Token/TokenHeader/index.tsx
index f529da88a..a3b3ddcfc 100644
--- a/src/containers/Token/TokenHeader/index.tsx
+++ b/src/containers/Token/TokenHeader/index.tsx
@@ -1,12 +1,6 @@
-import { useContext, useEffect } from 'react'
 import { useTranslation } from 'react-i18next'
-import { connect } from 'react-redux'
-import { bindActionCreators } from 'redux'
-import { loadTokenState } from './actions'
-import { Loader } from '../../shared/components/Loader'
 import './styles.scss'
 import { localizeNumber, formatLargeNumber } from '../../shared/utils'
-import SocketContext from '../../shared/SocketContext'
 import Currency from '../../shared/components/Currency'
 import { Account } from '../../shared/components/Account'
 import DomainLink from '../../shared/components/DomainLink'
@@ -14,6 +8,7 @@ import { TokenTableRow } from '../../shared/components/TokenTableRow'
 import { useLanguage } from '../../shared/hooks'
 import { LEDGER_ROUTE, TRANSACTION_ROUTE } from '../../App/routes'
 import { RouteLink } from '../../shared/routing'
+import { TokenData } from '../../../rippled/token'
 
 const CURRENCY_OPTIONS = {
   style: 'currency',
@@ -23,44 +18,21 @@ const CURRENCY_OPTIONS = {
 }
 
 interface TokenHeaderProps {
-  loading: boolean
   accountId: string
   currency: string
-  data: {
-    balance: string
-    reserve: number
-    sequence: number
-    rate: number
-    obligations: string
-    domain: string
-    emailHash: string
-    previousLedger: number
-    previousTxn: string
-    flags: string[]
-  }
-  actions: {
-    loadTokenState: typeof loadTokenState
-  }
+  data: TokenData
 }
 
-const TokenHeader = ({
-  actions,
+export const TokenHeader = ({
   accountId,
   currency,
   data,
-  loading,
 }: TokenHeaderProps) => {
   const language = useLanguage()
   const { t } = useTranslation()
-  const rippledSocket = useContext(SocketContext)
-
-  useEffect(() => {
-    actions.loadTokenState(currency, accountId, rippledSocket)
-  }, [accountId, actions, currency, rippledSocket])
+  const { domain, rate, emailHash, previousLedger, previousTxn } = data
 
   const renderDetails = () => {
-    const { domain, rate, emailHash, previousLedger, previousTxn } = data
-
     const prevTxn = previousTxn && previousTxn.replace(/(.{20})..+/, '$1...')
     const abbrvEmail = emailHash && emailHash.replace(/(.{20})..+/, '$1...')
     return (
@@ -156,7 +128,9 @@ const TokenHeader = ({
       language,
       CURRENCY_OPTIONS,
     )
-    const obligationsBalance = formatLargeNumber(Number.parseFloat(obligations))
+    const obligationsBalance = formatLargeNumber(
+      Number.parseFloat(obligations || '0'),
+    )
 
     return (
       <div className="section header-container">
@@ -201,7 +175,6 @@ const TokenHeader = ({
     )
   }
 
-  const { emailHash } = data
   return (
     <div className="box token-header">
       <div className="section box-header">
@@ -213,24 +186,7 @@ const TokenHeader = ({
           />
         )}
       </div>
-      <div className="box-content">
-        {loading ? <Loader /> : renderHeaderContent()}
-      </div>
+      <div className="box-content">{renderHeaderContent()}</div>
     </div>
   )
 }
-
-export default connect(
-  (state: any) => ({
-    loading: state.tokenHeader.loading,
-    data: state.tokenHeader.data,
-  }),
-  (dispatch) => ({
-    actions: bindActionCreators(
-      {
-        loadTokenState,
-      },
-      dispatch,
-    ),
-  }),
-)(TokenHeader)
diff --git a/src/containers/Token/TokenHeader/reducer.js b/src/containers/Token/TokenHeader/reducer.js
deleted file mode 100644
index b4768d53b..000000000
--- a/src/containers/Token/TokenHeader/reducer.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import * as actionTypes from './actionTypes'
-
-export const initialState = {
-  loading: false,
-  data: {},
-  error: '',
-  status: null,
-}
-
-// eslint-disable-next-line default-param-last
-const tokenReducer = (state = initialState, action) => {
-  switch (action.type) {
-    case actionTypes.START_LOADING_ACCOUNT_STATE:
-      return { ...state, loading: true }
-    case actionTypes.FINISHED_LOADING_ACCOUNT_STATE:
-      return { ...state, loading: false }
-    case actionTypes.ACCOUNT_STATE_LOAD_SUCCESS:
-      return { ...state, error: '', data: action.data }
-    case actionTypes.ACCOUNT_STATE_LOAD_FAIL:
-      return {
-        ...state,
-        error: action.error,
-        status: action.status,
-        data: state.data.length ? state.data : {},
-      }
-    case 'persist/REHYDRATE':
-      return { ...initialState }
-    default:
-      return state
-  }
-}
-
-export default tokenReducer
diff --git a/src/containers/Token/TokenHeader/test/actions.test.js b/src/containers/Token/TokenHeader/test/actions.test.js
deleted file mode 100644
index bfae5b48a..000000000
--- a/src/containers/Token/TokenHeader/test/actions.test.js
+++ /dev/null
@@ -1,108 +0,0 @@
-import configureMockStore from 'redux-mock-store'
-import thunk from 'redux-thunk'
-import * as actions from '../actions'
-import * as actionTypes from '../actionTypes'
-import { initialState } from '../reducer'
-import { NOT_FOUND, BAD_REQUEST, SERVER_ERROR } from '../../../shared/utils'
-import rippledResponses from './rippledResponses.json'
-import actNotFound from './actNotFound.json'
-import MockWsClient from '../../../test/mockWsClient'
-
-const TEST_ADDRESS = 'rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv'
-const TEST_CURRENCY = 'abc'
-
-describe('TokenHeader Actions', () => {
-  jest.setTimeout(10000)
-
-  const middlewares = [thunk]
-  const mockStore = configureMockStore(middlewares)
-  let client
-  beforeEach(() => {
-    client = new MockWsClient()
-  })
-
-  afterEach(() => {
-    client.close()
-  })
-
-  it('should dispatch correct actions on successful loadTokenState', () => {
-    client.addResponses(rippledResponses)
-    const expectedData = {
-      name: undefined,
-      obligations: '100',
-      sequence: 2148991,
-      reserve: 10,
-      rate: undefined,
-      domain: undefined,
-      emailHash: undefined,
-      flags: [],
-      balance: '123456000',
-      previousTxn:
-        '6B6F2CA1633A22247058E988372BA9EFFFC5BF10212230B67341CA32DC9D4A82',
-      previousLedger: 68990183,
-    }
-    const expectedActions = [
-      { type: actionTypes.START_LOADING_ACCOUNT_STATE },
-      { type: actionTypes.FINISHED_LOADING_ACCOUNT_STATE },
-      { type: actionTypes.ACCOUNT_STATE_LOAD_SUCCESS, data: expectedData },
-    ]
-    const store = mockStore({ news: initialState })
-    return store
-      .dispatch(actions.loadTokenState(TEST_CURRENCY, TEST_ADDRESS, client))
-      .then(() => {
-        expect(store.getActions()).toEqual(expectedActions)
-      })
-  })
-
-  it('should dispatch correct actions on server error', () => {
-    client.setReturnError()
-    const expectedActions = [
-      { type: actionTypes.START_LOADING_ACCOUNT_STATE },
-      { type: actionTypes.FINISHED_LOADING_ACCOUNT_STATE },
-      {
-        type: actionTypes.ACCOUNT_STATE_LOAD_FAIL,
-        status: SERVER_ERROR,
-        error: 'get_account_state_failed',
-      },
-    ]
-    const store = mockStore({ news: initialState })
-    return store
-      .dispatch(actions.loadTokenState(TEST_CURRENCY, TEST_ADDRESS, client))
-      .then(() => {
-        expect(store.getActions()).toEqual(expectedActions)
-      })
-  })
-
-  it('should dispatch correct actions on ripple address not found', () => {
-    client.addResponse('account_info', { result: actNotFound })
-    const expectedActions = [
-      { type: actionTypes.START_LOADING_ACCOUNT_STATE },
-      { type: actionTypes.FINISHED_LOADING_ACCOUNT_STATE },
-      {
-        type: actionTypes.ACCOUNT_STATE_LOAD_FAIL,
-        status: NOT_FOUND,
-        error: '',
-      },
-    ]
-    const store = mockStore({ news: initialState })
-    return store
-      .dispatch(actions.loadTokenState(TEST_CURRENCY, TEST_ADDRESS, client))
-      .then(() => {
-        expect(store.getActions()).toEqual(expectedActions)
-      })
-  })
-
-  it('should dispatch correct actions on invalid ripple address', () => {
-    const expectedActions = [
-      {
-        type: actionTypes.ACCOUNT_STATE_LOAD_FAIL,
-        status: BAD_REQUEST,
-        error: '',
-      },
-    ]
-    const store = mockStore({ news: initialState })
-    store.dispatch(actions.loadTokenState('ZZZ', null, client)).then(() => {
-      expect(store.getActions()).toEqual(expectedActions)
-    })
-  })
-})
diff --git a/src/containers/Token/TokenHeader/test/reducer.test.js b/src/containers/Token/TokenHeader/test/reducer.test.js
deleted file mode 100644
index ceecc491f..000000000
--- a/src/containers/Token/TokenHeader/test/reducer.test.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import * as actionTypes from '../actionTypes'
-import reducer, { initialState } from '../reducer'
-
-describe('AccountHeader reducers', () => {
-  it('should return the initial state', () => {
-    expect(reducer(undefined, {})).toEqual(initialState)
-  })
-
-  it('should handle START_LOADING_ACCOUNT_STATE', () => {
-    const nextState = { ...initialState, loading: true }
-    expect(
-      reducer(initialState, { type: actionTypes.START_LOADING_ACCOUNT_STATE }),
-    ).toEqual(nextState)
-  })
-
-  it('should handle FINISHED_LOADING_ACCOUNT_STATE', () => {
-    const nextState = { ...initialState, loading: false }
-    expect(
-      reducer(initialState, {
-        type: actionTypes.FINISHED_LOADING_ACCOUNT_STATE,
-      }),
-    ).toEqual(nextState)
-  })
-
-  it('should handle ACCOUNT_STATE_LOAD_SUCCESS', () => {
-    const data = [['XRP', 123.456]]
-    const nextState = { ...initialState, data }
-    expect(
-      reducer(initialState, {
-        data,
-        type: actionTypes.ACCOUNT_STATE_LOAD_SUCCESS,
-      }),
-    ).toEqual(nextState)
-  })
-
-  it('should handle ACCOUNT_STATE_LOAD_FAIL', () => {
-    const status = 500
-    const error = 'error'
-    const nextState = { ...initialState, status, error }
-    expect(
-      reducer(initialState, {
-        status,
-        error,
-        type: actionTypes.ACCOUNT_STATE_LOAD_FAIL,
-      }),
-    ).toEqual(nextState)
-  })
-
-  it('will not clear previous data on ACCOUNT_STATE_LOAD_FAIL', () => {
-    const data = [['XRP', 123.456]]
-    const error = 'error'
-    const status = 500
-    const stateWithData = { ...initialState, data }
-    const nextState = { ...stateWithData, error, status }
-    expect(
-      reducer(stateWithData, {
-        status,
-        error,
-        type: actionTypes.ACCOUNT_STATE_LOAD_FAIL,
-      }),
-    ).toEqual(nextState)
-  })
-
-  it('should clear data on rehydration', () => {
-    const error = 'error'
-    const status = 500
-    const nextState = { ...initialState, error, status }
-    expect(
-      reducer(initialState, {
-        type: actionTypes.ACCOUNT_STATE_LOAD_FAIL,
-        error,
-        status,
-      }),
-    ).toEqual(nextState)
-    expect(reducer(nextState, { type: 'persist/REHYDRATE' })).toEqual(
-      initialState,
-    )
-  })
-})
diff --git a/src/containers/Token/index.tsx b/src/containers/Token/index.tsx
index 09310ac75..00362cf0e 100644
--- a/src/containers/Token/index.tsx
+++ b/src/containers/Token/index.tsx
@@ -1,9 +1,9 @@
-import { FC, PropsWithChildren, useEffect } from 'react'
+import { FC, PropsWithChildren, useContext, useEffect } from 'react'
 import { useTranslation } from 'react-i18next'
-import { connect } from 'react-redux'
 
 import { Helmet } from 'react-helmet-async'
-import TokenHeader from './TokenHeader'
+import { useQuery } from 'react-query'
+import { TokenHeader } from './TokenHeader'
 import { TokenTransactionTable } from './TokenTransactionTable'
 import { DEXPairs } from './DEXPairs'
 import NoMatch from '../NoMatch'
@@ -14,6 +14,9 @@ import { useAnalytics } from '../shared/analytics'
 import { ErrorMessages } from '../shared/Interfaces'
 import { TOKEN_ROUTE } from '../App/routes'
 import { useRouteParams } from '../shared/routing'
+import { getToken } from '../../rippled'
+import SocketContext from '../shared/SocketContext'
+import { Loader } from '../shared/components/Loader'
 
 const IS_MAINNET = process.env.VITE_ENVIRONMENT === 'mainnet'
 
@@ -45,11 +48,20 @@ const Page: FC<PropsWithChildren<{ accountId: string }>> = ({
   </div>
 )
 
-const Token: FC<{ error: string }> = ({ error }) => {
+export const Token = () => {
+  const rippledSocket = useContext(SocketContext)
   const { trackScreenLoaded } = useAnalytics()
   const { token = '' } = useRouteParams(TOKEN_ROUTE)
   const [currency, accountId] = token.split('.')
   const { t } = useTranslation()
+  const {
+    data: tokenData,
+    error: tokenDataError,
+    isLoading: isTokenDataLoading,
+  } = useQuery({
+    queryKey: ['token', currency, accountId],
+    queryFn: () => getToken(currency, accountId, rippledSocket),
+  })
 
   useEffect(() => {
     trackScreenLoaded({
@@ -63,21 +75,31 @@ const Token: FC<{ error: string }> = ({ error }) => {
   }, [accountId, currency, trackScreenLoaded])
 
   const renderError = () => {
-    const message = getErrorMessage(error)
+    const message = getErrorMessage(tokenDataError)
     return <NoMatch title={message.title} hints={message.hints} />
   }
 
-  if (error) {
+  if (tokenDataError) {
     return <Page accountId={accountId}>{renderError()}</Page>
   }
 
   return (
     <Page accountId={accountId}>
-      {accountId && <TokenHeader accountId={accountId} currency={currency} />}
-      {accountId && IS_MAINNET && (
+      {isTokenDataLoading ? (
+        <Loader />
+      ) : (
+        tokenData && (
+          <TokenHeader
+            accountId={accountId}
+            currency={currency}
+            data={tokenData}
+          />
+        )
+      )}
+      {accountId && tokenData && IS_MAINNET && (
         <DEXPairs accountId={accountId} currency={currency} />
       )}
-      {accountId && (
+      {accountId && tokenData && (
         <div className="section">
           <h2>{t('token_transactions')}</h2>
           <TokenTransactionTable accountId={accountId} currency={currency} />
@@ -91,7 +113,3 @@ const Token: FC<{ error: string }> = ({ error }) => {
     </Page>
   )
 }
-
-export default connect((state: any) => ({
-  error: state.accountHeader.status,
-}))(Token)
diff --git a/src/containers/Token/test/index.test.tsx b/src/containers/Token/test/index.test.tsx
index c2f749d62..2ff37ad5a 100644
--- a/src/containers/Token/test/index.test.tsx
+++ b/src/containers/Token/test/index.test.tsx
@@ -1,33 +1,32 @@
 import { mount } from 'enzyme'
-import configureMockStore from 'redux-mock-store'
-import thunk from 'redux-thunk'
-import { Provider } from 'react-redux'
 import { Route } from 'react-router-dom'
-import { initialState } from '../../../rootReducer'
 import i18n from '../../../i18n/testConfig'
-import Token from '../index'
-import TokenHeader from '../TokenHeader'
+import { Token } from '../index'
+import { TokenHeader } from '../TokenHeader'
 import { TokenTransactionTable } from '../TokenTransactionTable'
-import mockAccountState from '../../Accounts/test/mockAccountState.json'
-import { QuickHarness } from '../../test/utils'
+import { flushPromises, QuickHarness } from '../../test/utils'
 import { TOKEN_ROUTE } from '../../App/routes'
+import mockAccount from '../../Accounts/test/mockAccountState.json'
+import Mock = jest.Mock
+import { getToken } from '../../../rippled'
+
+jest.mock('../../../rippled', () => ({
+  __esModule: true,
+  getToken: jest.fn(),
+}))
 
 describe('Token container', () => {
   const TEST_ACCOUNT_ID = 'rTEST_ACCOUNT'
 
-  const middlewares = [thunk]
-  const mockStore = configureMockStore(middlewares)
-  const createWrapper = (state = {}) => {
-    const store = mockStore({ ...initialState, ...state })
+  const createWrapper = (getAccountImpl = () => new Promise(() => {})) => {
+    ;(getToken as Mock).mockImplementation(getAccountImpl)
     return mount(
-      <Provider store={store}>
-        <QuickHarness
-          i18n={i18n}
-          initialEntries={[`/token/USD.${TEST_ACCOUNT_ID}`]}
-        >
-          <Route path={TOKEN_ROUTE.path} element={<Token />} />
-        </QuickHarness>
-      </Provider>,
+      <QuickHarness
+        i18n={i18n}
+        initialEntries={[`/token/USD.${TEST_ACCOUNT_ID}`]}
+      >
+        <Route path={TOKEN_ROUTE.path} element={<Token />} />
+      </QuickHarness>,
     )
   }
 
@@ -36,17 +35,10 @@ describe('Token container', () => {
     wrapper.unmount()
   })
 
-  it('renders static parts', () => {
-    const state = {
-      ...initialState,
-      accountHeader: {
-        loading: false,
-        error: null,
-        data: mockAccountState,
-      },
-    }
-
-    const wrapper = createWrapper(state)
+  it('renders static parts', async () => {
+    const wrapper = createWrapper(() => Promise.resolve(mockAccount))
+    await flushPromises()
+    wrapper.update()
     expect(wrapper.find(TokenHeader).length).toBe(1)
     expect(wrapper.find(TokenTransactionTable).length).toBe(1)
     wrapper.unmount()
diff --git a/src/rippled/token.js b/src/rippled/token.ts
similarity index 74%
rename from src/rippled/token.js
rename to src/rippled/token.ts
index aedc188c2..9f6d8736d 100644
--- a/src/rippled/token.js
+++ b/src/rippled/token.ts
@@ -4,7 +4,26 @@ import { getBalances, getAccountInfo, getServerInfo } from './lib/rippled'
 
 const log = logger({ name: 'iou' })
 
-const getToken = async (currencyCode, issuer, rippledSocket) => {
+export interface TokenData {
+  name: string
+  balance: string
+  reserve: number
+  sequence: number
+  gravatar: string
+  rate?: number
+  obligations?: string
+  domain?: string
+  emailHash?: string
+  previousLedger: number
+  previousTxn: string
+  flags: string[]
+}
+
+const getToken = async (
+  currencyCode,
+  issuer,
+  rippledSocket,
+): Promise<TokenData> => {
   try {
     log.info('fetching account info from rippled')
     const accountInfo = await getAccountInfo(rippledSocket, issuer)
@@ -47,7 +66,9 @@ const getToken = async (currencyCode, issuer, rippledSocket) => {
       previousLedger,
     }
   } catch (error) {
-    log.error(error.toString())
+    if (error) {
+      log.error(error.toString())
+    }
     throw error
   }
 }
diff --git a/src/rootReducer.js b/src/rootReducer.js
index 69ab09b9a..0ad9a2f70 100644
--- a/src/rootReducer.js
+++ b/src/rootReducer.js
@@ -2,18 +2,13 @@ import { combineReducers } from 'redux'
 import accountHeaderReducer, {
   initialState as accountHeaderState,
 } from './containers/Accounts/AccountHeader/reducer'
-import tokenHeaderReducer, {
-  initialState as tokenHeaderState,
-} from './containers/Token/TokenHeader/reducer'
 
 export const initialState = {
   accountHeader: accountHeaderState,
-  tokenHeader: tokenHeaderState,
 }
 
 const rootReducer = combineReducers({
   accountHeader: accountHeaderReducer,
-  tokenHeader: tokenHeaderReducer,
 })
 
 export default rootReducer

From a123225962e9b264c8625502af00f9ad7a83387a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 18 Dec 2024 18:07:46 +0000
Subject: [PATCH 65/79] chore(deps-dev): bump eslint-plugin-react-hooks from
 4.6.0 to 4.6.2 (#1087)

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 482783fdc..e5fcdbd81 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -88,7 +88,7 @@
         "eslint-plugin-jsx-a11y": "^6.9.0",
         "eslint-plugin-prettier": "^5.1.3",
         "eslint-plugin-react": "^7.34.2",
-        "eslint-plugin-react-hooks": "^4.6.0",
+        "eslint-plugin-react-hooks": "^4.6.2",
         "jest-enzyme": "^7.1.0",
         "jest-websocket-mock": "^2.5.0",
         "lint-staged": "^15.2.10",
@@ -11991,9 +11991,9 @@
       }
     },
     "node_modules/eslint-plugin-react-hooks": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
-      "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+      "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": {
         "node": ">=10"
@@ -37254,9 +37254,9 @@
       }
     },
     "eslint-plugin-react-hooks": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
-      "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+      "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,
       "requires": {}
     },
diff --git a/package.json b/package.json
index f042929bf..d44571646 100644
--- a/package.json
+++ b/package.json
@@ -83,7 +83,7 @@
     "eslint-plugin-jsx-a11y": "^6.9.0",
     "eslint-plugin-prettier": "^5.1.3",
     "eslint-plugin-react": "^7.34.2",
-    "eslint-plugin-react-hooks": "^4.6.0",
+    "eslint-plugin-react-hooks": "^4.6.2",
     "jest-enzyme": "^7.1.0",
     "jest-websocket-mock": "^2.5.0",
     "lint-staged": "^15.2.10",

From 20a9dacdaa1bab89f9627b0e30c00cca26aeedf8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 21 Jan 2025 14:47:12 +0000
Subject: [PATCH 66/79] chore(deps-dev): bump @babel/preset-react from 7.24.7
 to 7.26.3 (#1104)

---
 package-lock.json | 411 ++++++++++++++++++++++------------------------
 package.json      |   2 +-
 2 files changed, 197 insertions(+), 216 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e5fcdbd81..0a0670ee0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -64,7 +64,7 @@
       "devDependencies": {
         "@babel/eslint-parser": "^7.22.6",
         "@babel/preset-env": "^7.25.7",
-        "@babel/preset-react": "^7.24.7",
+        "@babel/preset-react": "^7.26.3",
         "@types/create-hash": "^1.2.6",
         "@types/enzyme": "^3.10.12",
         "@types/jest": "^26.0.24",
@@ -152,11 +152,12 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz",
-      "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==",
+      "version": "7.26.2",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+      "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
       "dependencies": {
-        "@babel/highlight": "^7.25.7",
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "js-tokens": "^4.0.0",
         "picocolors": "^1.0.0"
       },
       "engines": {
@@ -240,11 +241,12 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz",
-      "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
+      "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
       "dependencies": {
-        "@babel/types": "^7.25.7",
+        "@babel/parser": "^7.26.3",
+        "@babel/types": "^7.26.3",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
@@ -254,12 +256,12 @@
       }
     },
     "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz",
-      "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+      "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.25.7"
+        "@babel/types": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -400,12 +402,12 @@
       }
     },
     "node_modules/@babel/helper-module-imports": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz",
-      "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+      "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
       "dependencies": {
-        "@babel/traverse": "^7.25.7",
-        "@babel/types": "^7.25.7"
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -441,9 +443,9 @@
       }
     },
     "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz",
-      "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+      "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -520,25 +522,25 @@
       }
     },
     "node_modules/@babel/helper-string-parser": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
-      "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
-      "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz",
-      "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+      "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -570,26 +572,12 @@
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/highlight": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz",
-      "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.25.7",
-        "chalk": "^2.4.2",
-        "js-tokens": "^4.0.0",
-        "picocolors": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/@babel/parser": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz",
-      "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
+      "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
       "dependencies": {
-        "@babel/types": "^7.25.7"
+        "@babel/types": "^7.26.3"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -946,12 +934,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-jsx": {
-      "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==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+      "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1718,12 +1706,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-display-name": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz",
-      "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz",
+      "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1733,16 +1721,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-jsx": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz",
-      "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
+      "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-module-imports": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/plugin-syntax-jsx": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/helper-annotate-as-pure": "^7.25.9",
+        "@babel/helper-module-imports": "^7.25.9",
+        "@babel/helper-plugin-utils": "^7.25.9",
+        "@babel/plugin-syntax-jsx": "^7.25.9",
+        "@babel/types": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1752,12 +1740,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-jsx-development": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz",
-      "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz",
+      "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==",
       "dev": true,
       "dependencies": {
-        "@babel/plugin-transform-react-jsx": "^7.24.7"
+        "@babel/plugin-transform-react-jsx": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1795,13 +1783,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-react-pure-annotations": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz",
-      "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz",
+      "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-annotate-as-pure": "^7.25.9",
+        "@babel/helper-plugin-utils": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2189,17 +2177,17 @@
       }
     },
     "node_modules/@babel/preset-react": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz",
-      "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz",
+      "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-validator-option": "^7.24.7",
-        "@babel/plugin-transform-react-display-name": "^7.24.7",
-        "@babel/plugin-transform-react-jsx": "^7.24.7",
-        "@babel/plugin-transform-react-jsx-development": "^7.24.7",
-        "@babel/plugin-transform-react-pure-annotations": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.9",
+        "@babel/helper-validator-option": "^7.25.9",
+        "@babel/plugin-transform-react-display-name": "^7.25.9",
+        "@babel/plugin-transform-react-jsx": "^7.25.9",
+        "@babel/plugin-transform-react-jsx-development": "^7.25.9",
+        "@babel/plugin-transform-react-pure-annotations": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2239,28 +2227,28 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz",
-      "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+      "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
       "dependencies": {
-        "@babel/code-frame": "^7.25.7",
-        "@babel/parser": "^7.25.7",
-        "@babel/types": "^7.25.7"
+        "@babel/code-frame": "^7.25.9",
+        "@babel/parser": "^7.25.9",
+        "@babel/types": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz",
-      "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==",
-      "dependencies": {
-        "@babel/code-frame": "^7.25.7",
-        "@babel/generator": "^7.25.7",
-        "@babel/parser": "^7.25.7",
-        "@babel/template": "^7.25.7",
-        "@babel/types": "^7.25.7",
+      "version": "7.26.4",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
+      "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
+      "dependencies": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.26.3",
+        "@babel/parser": "^7.26.3",
+        "@babel/template": "^7.25.9",
+        "@babel/types": "^7.26.3",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -2269,13 +2257,12 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz",
-      "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+      "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
       "dependencies": {
-        "@babel/helper-string-parser": "^7.25.7",
-        "@babel/helper-validator-identifier": "^7.25.7",
-        "to-fast-properties": "^2.0.0"
+        "@babel/helper-string-parser": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -7573,6 +7560,7 @@
     },
     "node_modules/ansi-styles": {
       "version": "3.2.1",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "color-convert": "^1.9.0"
@@ -9277,6 +9265,7 @@
     },
     "node_modules/chalk": {
       "version": "2.4.2",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "ansi-styles": "^3.2.1",
@@ -9645,6 +9634,7 @@
     },
     "node_modules/color-convert": {
       "version": "1.9.3",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "color-name": "1.1.3"
@@ -9652,6 +9642,7 @@
     },
     "node_modules/color-name": {
       "version": "1.1.3",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/colord": {
@@ -11396,6 +11387,7 @@
     },
     "node_modules/escape-string-regexp": {
       "version": "1.0.5",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
@@ -13875,6 +13867,7 @@
     },
     "node_modules/has-flag": {
       "version": "3.0.0",
+      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=4"
@@ -26592,6 +26585,7 @@
     },
     "node_modules/supports-color": {
       "version": "5.5.0",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
         "has-flag": "^3.0.0"
@@ -26966,13 +26960,6 @@
       "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
       "dev": true
     },
-    "node_modules/to-fast-properties": {
-      "version": "2.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/to-object-path": {
       "version": "0.3.0",
       "dev": true,
@@ -29038,11 +29025,12 @@
       }
     },
     "@babel/code-frame": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz",
-      "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==",
+      "version": "7.26.2",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+      "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
       "requires": {
-        "@babel/highlight": "^7.25.7",
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "js-tokens": "^4.0.0",
         "picocolors": "^1.0.0"
       }
     },
@@ -29103,23 +29091,24 @@
       }
     },
     "@babel/generator": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz",
-      "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
+      "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
       "requires": {
-        "@babel/types": "^7.25.7",
+        "@babel/parser": "^7.26.3",
+        "@babel/types": "^7.26.3",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
       }
     },
     "@babel/helper-annotate-as-pure": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz",
-      "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+      "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.25.7"
+        "@babel/types": "^7.25.9"
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
@@ -29230,12 +29219,12 @@
       }
     },
     "@babel/helper-module-imports": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz",
-      "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+      "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
       "requires": {
-        "@babel/traverse": "^7.25.7",
-        "@babel/types": "^7.25.7"
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
       }
     },
     "@babel/helper-module-transforms": {
@@ -29259,9 +29248,9 @@
       }
     },
     "@babel/helper-plugin-utils": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz",
-      "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw=="
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+      "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw=="
     },
     "@babel/helper-remap-async-to-generator": {
       "version": "7.25.7",
@@ -29314,19 +29303,19 @@
       }
     },
     "@babel/helper-string-parser": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
-      "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g=="
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
     },
     "@babel/helper-validator-identifier": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
-      "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg=="
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
     },
     "@babel/helper-validator-option": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz",
-      "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ=="
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+      "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="
     },
     "@babel/helper-wrap-function": {
       "version": "7.25.7",
@@ -29349,23 +29338,12 @@
         "@babel/types": "^7.23.6"
       }
     },
-    "@babel/highlight": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz",
-      "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==",
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.25.7",
-        "chalk": "^2.4.2",
-        "js-tokens": "^4.0.0",
-        "picocolors": "^1.0.0"
-      }
-    },
     "@babel/parser": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz",
-      "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
+      "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
       "requires": {
-        "@babel/types": "^7.25.7"
+        "@babel/types": "^7.26.3"
       }
     },
     "@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
@@ -29591,12 +29569,12 @@
       }
     },
     "@babel/plugin-syntax-jsx": {
-      "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==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+      "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.9"
       }
     },
     "@babel/plugin-syntax-logical-assignment-operators": {
@@ -30074,34 +30052,34 @@
       }
     },
     "@babel/plugin-transform-react-display-name": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz",
-      "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz",
+      "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.9"
       }
     },
     "@babel/plugin-transform-react-jsx": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz",
-      "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
+      "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-module-imports": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/plugin-syntax-jsx": "^7.24.7",
-        "@babel/types": "^7.24.7"
+        "@babel/helper-annotate-as-pure": "^7.25.9",
+        "@babel/helper-module-imports": "^7.25.9",
+        "@babel/helper-plugin-utils": "^7.25.9",
+        "@babel/plugin-syntax-jsx": "^7.25.9",
+        "@babel/types": "^7.25.9"
       }
     },
     "@babel/plugin-transform-react-jsx-development": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz",
-      "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz",
+      "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==",
       "dev": true,
       "requires": {
-        "@babel/plugin-transform-react-jsx": "^7.24.7"
+        "@babel/plugin-transform-react-jsx": "^7.25.9"
       }
     },
     "@babel/plugin-transform-react-jsx-self": {
@@ -30121,13 +30099,13 @@
       }
     },
     "@babel/plugin-transform-react-pure-annotations": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz",
-      "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz",
+      "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.7"
+        "@babel/helper-annotate-as-pure": "^7.25.9",
+        "@babel/helper-plugin-utils": "^7.25.9"
       }
     },
     "@babel/plugin-transform-regenerator": {
@@ -30411,17 +30389,17 @@
       }
     },
     "@babel/preset-react": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz",
-      "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz",
+      "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.24.7",
-        "@babel/helper-validator-option": "^7.24.7",
-        "@babel/plugin-transform-react-display-name": "^7.24.7",
-        "@babel/plugin-transform-react-jsx": "^7.24.7",
-        "@babel/plugin-transform-react-jsx-development": "^7.24.7",
-        "@babel/plugin-transform-react-pure-annotations": "^7.24.7"
+        "@babel/helper-plugin-utils": "^7.25.9",
+        "@babel/helper-validator-option": "^7.25.9",
+        "@babel/plugin-transform-react-display-name": "^7.25.9",
+        "@babel/plugin-transform-react-jsx": "^7.25.9",
+        "@babel/plugin-transform-react-jsx-development": "^7.25.9",
+        "@babel/plugin-transform-react-pure-annotations": "^7.25.9"
       }
     },
     "@babel/preset-typescript": {
@@ -30446,37 +30424,36 @@
       }
     },
     "@babel/template": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz",
-      "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==",
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+      "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
       "requires": {
-        "@babel/code-frame": "^7.25.7",
-        "@babel/parser": "^7.25.7",
-        "@babel/types": "^7.25.7"
+        "@babel/code-frame": "^7.25.9",
+        "@babel/parser": "^7.25.9",
+        "@babel/types": "^7.25.9"
       }
     },
     "@babel/traverse": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz",
-      "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==",
-      "requires": {
-        "@babel/code-frame": "^7.25.7",
-        "@babel/generator": "^7.25.7",
-        "@babel/parser": "^7.25.7",
-        "@babel/template": "^7.25.7",
-        "@babel/types": "^7.25.7",
+      "version": "7.26.4",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
+      "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
+      "requires": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.26.3",
+        "@babel/parser": "^7.26.3",
+        "@babel/template": "^7.25.9",
+        "@babel/types": "^7.26.3",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       }
     },
     "@babel/types": {
-      "version": "7.25.7",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz",
-      "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==",
+      "version": "7.26.3",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
+      "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
       "requires": {
-        "@babel/helper-string-parser": "^7.25.7",
-        "@babel/helper-validator-identifier": "^7.25.7",
-        "to-fast-properties": "^2.0.0"
+        "@babel/helper-string-parser": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9"
       }
     },
     "@bcoe/v8-coverage": {
@@ -33877,6 +33854,7 @@
     },
     "ansi-styles": {
       "version": "3.2.1",
+      "dev": true,
       "requires": {
         "color-convert": "^1.9.0"
       }
@@ -35094,6 +35072,7 @@
     },
     "chalk": {
       "version": "2.4.2",
+      "dev": true,
       "requires": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -35332,12 +35311,14 @@
     },
     "color-convert": {
       "version": "1.9.3",
+      "dev": true,
       "requires": {
         "color-name": "1.1.3"
       }
     },
     "color-name": {
-      "version": "1.1.3"
+      "version": "1.1.3",
+      "dev": true
     },
     "colord": {
       "version": "2.9.3",
@@ -36610,7 +36591,8 @@
       "version": "1.0.3"
     },
     "escape-string-regexp": {
-      "version": "1.0.5"
+      "version": "1.0.5",
+      "dev": true
     },
     "escodegen": {
       "version": "1.14.3",
@@ -38282,7 +38264,8 @@
       "dev": true
     },
     "has-flag": {
-      "version": "3.0.0"
+      "version": "3.0.0",
+      "dev": true
     },
     "has-property-descriptors": {
       "version": "1.0.2",
@@ -46941,6 +46924,7 @@
     },
     "supports-color": {
       "version": "5.5.0",
+      "dev": true,
       "requires": {
         "has-flag": "^3.0.0"
       }
@@ -47202,9 +47186,6 @@
       "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
       "dev": true
     },
-    "to-fast-properties": {
-      "version": "2.0.0"
-    },
     "to-object-path": {
       "version": "0.3.0",
       "dev": true,
diff --git a/package.json b/package.json
index d44571646..0cd388040 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,7 @@
   "devDependencies": {
     "@babel/eslint-parser": "^7.22.6",
     "@babel/preset-env": "^7.25.7",
-    "@babel/preset-react": "^7.24.7",
+    "@babel/preset-react": "^7.26.3",
     "@types/create-hash": "^1.2.6",
     "@types/enzyme": "^3.10.12",
     "@types/jest": "^26.0.24",

From 21176369800e040e2e5e1dc765338379c68a8464 Mon Sep 17 00:00:00 2001
From: pdp2121 <71317875+pdp2121@users.noreply.github.com>
Date: Wed, 29 Jan 2025 10:36:01 -0500
Subject: [PATCH 67/79] fix: Sass depreciation warnings (#1124)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

## High Level Overview of Change

<!--
Please include a summary/list of the changes.
If too broad, please consider splitting into multiple PRs.
-->

Fix these warnings in build:

```
Deprecation Warning: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0.

More info: https://sass-lang.com/d/legacy-js-api

transforming (891) ../node_modules/topojson-client/src/identity.jsDeprecation Warning: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0.

More info: https://sass-lang.com/d/legacy-js-api

Deprecation Warning: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0.

More info and automated migrator: https://sass-lang.com/d/import

  ╷
1 │ @import '../../css/variables';
  │         ^^^^^^^^^^^^^^^^^^^^^
  ╵
    src/containers/shared/components/TokenSearchResults/styles.scss 1:9  root stylesheet
Deprecation Warning: Sass's behavior for declarations that appear after nested
rules will be changing to match the behavior specified by CSS in an upcoming
version. To keep the existing behavior, move the declaration above the nested
rule. To opt into the new behavior, wrap the declaration in `& {}`.

More info: https://sass-lang.com/d/mixed-decls

    ╷
164 │     font-weight: 500;
    │     ^^^^^^^^^^^^^^^^ declaration
... │
200 │ ┌     @media (min-width: $desktop-upper-boundary) {
201 │ │       @content;
202 │ │     }
    │ └─── nested rule
    ╵
    src/containers/shared/css/variables.scss 164:3  medium()
    src/containers/NFT/NFTTabs/styles.scss 67:7     root stylesheet
```

Resolve https://github.com/ripple/explorer/issues/1121

### Type of Change

<!--
Please check relevant options, delete irrelevant ones.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] Refactor (non-breaking change that only restructures code)
- [ ] Tests (You added tests for code that already exists, or your new
feature included in this PR)
- [ ] Documentation Updates
- [ ] Translation Updates
- [ ] Release
---
 .../AccountHeader/BalanceSelector/balance-selector.scss     | 2 +-
 .../shared/components/TokenSearchResults/styles.scss        | 2 +-
 src/containers/shared/css/variables.scss                    | 2 +-
 vite.config.js                                              | 6 ++++++
 4 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/containers/Accounts/AccountHeader/BalanceSelector/balance-selector.scss b/src/containers/Accounts/AccountHeader/BalanceSelector/balance-selector.scss
index 30860340e..31c4742a4 100644
--- a/src/containers/Accounts/AccountHeader/BalanceSelector/balance-selector.scss
+++ b/src/containers/Accounts/AccountHeader/BalanceSelector/balance-selector.scss
@@ -1,4 +1,4 @@
-@use 'src/containers/shared/css/variables' as *;
+@use '../../../shared/css/variables.scss' as *;
 
 .balance-selector {
   position: relative;
diff --git a/src/containers/shared/components/TokenSearchResults/styles.scss b/src/containers/shared/components/TokenSearchResults/styles.scss
index beec5b9de..903d9688d 100644
--- a/src/containers/shared/components/TokenSearchResults/styles.scss
+++ b/src/containers/shared/components/TokenSearchResults/styles.scss
@@ -1,4 +1,4 @@
-@import '../../css/variables';
+@use '../../css/variables' as *;
 
 .search-results-menu {
   position: absolute;
diff --git a/src/containers/shared/css/variables.scss b/src/containers/shared/css/variables.scss
index 91b259bed..8acd9b3a0 100644
--- a/src/containers/shared/css/variables.scss
+++ b/src/containers/shared/css/variables.scss
@@ -155,7 +155,7 @@ $XRP_XRP: #0a93eb;
 $XRP_CAD: #ca3103;
 $XRP_OTHERS: #f52a79;
 
-// Font wights
+// Font weights
 @mixin regular {
   font-weight: 400;
 }
diff --git a/vite.config.js b/vite.config.js
index 2e64dc529..fd3b7cf11 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -87,5 +87,11 @@ export default defineConfig({
         autoprefixer({}), // add options if needed
       ],
     },
+    preprocessorOptions: {
+      scss: {
+        api: 'modern-compiler',
+        silenceDeprecations: ['mixed-decls'],
+      },
+    },
   },
 })

From f0d7385ed0506f7987aa157e7e257a45d9dd8324 Mon Sep 17 00:00:00 2001
From: Mayukha Vadari <mvadari@ripple.com>
Date: Wed, 5 Feb 2025 12:11:05 -0800
Subject: [PATCH 68/79] feat: add % upgraded to the bar charts (#1115)

---
 src/containers/Network/BarChartVersion.tsx | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/containers/Network/BarChartVersion.tsx b/src/containers/Network/BarChartVersion.tsx
index b49b0ad13..6b092b3f7 100644
--- a/src/containers/Network/BarChartVersion.tsx
+++ b/src/containers/Network/BarChartVersion.tsx
@@ -47,17 +47,21 @@ const CustomTooltip = ({
 }: TooltipProps<ValueType, NameType>) => {
   const { t } = useTranslation()
   if (active) {
+    const valCount = payload?.[0]?.payload?.validatorCount ?? 0
+    const valPercent = payload?.[0]?.payload?.validatorPercent.toFixed(2) ?? 0
+    const nodeCount = payload?.[0]?.payload?.nodeCount ?? 0
+    const nodePercent = payload?.[0]?.payload?.nodePercent.toFixed(2) ?? 0
     return (
       <div className="custom-tooltip">
         <p className="label">{t('version_display', { version: label })}</p>
         <p className="value">
           {t('validator_count', {
-            val_count: payload?.[0]?.payload?.validatorCount ?? 0,
+            val_count: `${valCount} (${valPercent}%)`,
           })}
         </p>
         <p className="value">
           {t('node_count', {
-            node_count: payload?.[0]?.payload?.nodeCount ?? 0,
+            node_count: `${nodeCount} (${nodePercent}%)`,
           })}
         </p>
       </div>

From 5b7661f55bea3d30649e23c3ca061afdc6465a1c Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Thu, 6 Feb 2025 22:12:05 -0400
Subject: [PATCH 69/79] rebase

---
 package-lock.json                             | 120 +++++--
 package.json                                  |   3 +-
 public/locales/ca-CA/translations.json        |   8 +-
 public/locales/en-US/translations.json        |   8 +-
 .../BreakDownTab/breakDownTab.scss            | 119 +++++++
 .../Transactions/BreakDownTab/index.tsx       | 303 ++++++++++++++++++
 src/containers/Transactions/index.tsx         |  10 +
 7 files changed, 543 insertions(+), 28 deletions(-)
 create mode 100644 src/containers/Transactions/BreakDownTab/breakDownTab.scss
 create mode 100644 src/containers/Transactions/BreakDownTab/index.tsx

diff --git a/package-lock.json b/package-lock.json
index 0a0670ee0..46355693f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -59,7 +59,7 @@
         "vite-plugin-html": "^3.2.2",
         "vite-plugin-svgr": "^4.2.0",
         "vite-tsconfig-paths": "^4.2.0",
-        "xrpl-client": "^2.4.0"
+        "xrpl-tx-path-parser": "github:shortthefomo/xrpl-tx-path-parser#dev"
       },
       "devDependencies": {
         "@babel/eslint-parser": "^7.22.6",
@@ -5366,7 +5366,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
       "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
-      "dev": true,
       "dependencies": {
         "@noble/hashes": "1.3.2"
       },
@@ -6065,7 +6064,6 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz",
       "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==",
-      "dev": true,
       "dependencies": {
         "@noble/curves": "~1.2.0",
         "@noble/hashes": "~1.3.2",
@@ -6079,7 +6077,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
       "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
-      "dev": true,
       "dependencies": {
         "@noble/hashes": "~1.3.0",
         "@scure/base": "~1.1.0"
@@ -7423,12 +7420,33 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-1.0.0.tgz",
       "integrity": "sha512-qsCLGyqe1zaq9j7PZJopK+iGTGRbk6akkg6iZXJJgxKwck0C5x5Gnwlb1HKYGOwPKyrXWpV6a2YmcpNpUFctGg==",
-      "dev": true,
       "dependencies": {
         "@xrplf/isomorphic": "^1.0.0",
         "ripple-keypairs": "^2.0.0"
       }
     },
+    "node_modules/@xrplkit/amount": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@xrplkit/amount/-/amount-1.2.3.tgz",
+      "integrity": "sha512-poV7ym7EhjAlEGym9Kc3AHuy3uuhVW3qnl2KDr8D4zk7hANj7aG6l1XdtWIAGAgBpHnvPEaOG7+llPRRv1irZw==",
+      "dependencies": {
+        "@xrplkit/xfl": "2.0.2"
+      }
+    },
+    "node_modules/@xrplkit/txmeta": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@xrplkit/txmeta/-/txmeta-1.3.1.tgz",
+      "integrity": "sha512-iJNtLgXTpbuYBI0VDsXJhi3MHxmsCdWsI3OumETk+21HjxDw1AmPGmVHWu8q8turFth1qzRIAtHjxLHDl307sg==",
+      "dependencies": {
+        "@xrplkit/amount": "1.2.3",
+        "@xrplkit/xfl": "2.0.2"
+      }
+    },
+    "node_modules/@xrplkit/xfl": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+      "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+    },
     "node_modules/abab": {
       "version": "2.0.5",
       "dev": true,
@@ -10471,10 +10489,9 @@
       }
     },
     "node_modules/decimal.js": {
-      "version": "10.3.1",
-      "dev": true,
-      "license": "MIT",
-      "peer": true
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
     },
     "node_modules/decimal.js-light": {
       "version": "2.5.1",
@@ -24701,10 +24718,16 @@
       }
     },
     "node_modules/ripple-binary-codec": {
+<<<<<<< HEAD
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.1.0.tgz",
       "integrity": "sha512-q0GAx+hj3UVcDbhXVjk7qeNfgUMehlElYJwiCuIBwqs/51GVTOwLr39Ht3eNsX5ow2xPRaC5mqHwcFDvLRm6cA==",
       "dev": true,
+=======
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.0.0.tgz",
+      "integrity": "sha512-zakENc9A5dlW85uzrmQHrJehymhL59ftggboRNrjxFDJdlNJ6DSE210P3ys/9kL0oVtOzFnTrOPFfxHZeOsA/Q==",
+>>>>>>> 68ad193 (breakdown tab for payments and offercreates)
       "dependencies": {
         "@xrplf/isomorphic": "^1.0.1",
         "bignumber.js": "^9.0.0",
@@ -24718,7 +24741,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz",
       "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==",
-      "dev": true,
       "dependencies": {
         "@noble/curves": "^1.0.0",
         "@xrplf/isomorphic": "^1.0.0",
@@ -28897,10 +28919,16 @@
       "peer": true
     },
     "node_modules/xrpl": {
+<<<<<<< HEAD
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.1.0.tgz",
       "integrity": "sha512-+97WiaF/AQTT6fXgD9Z5xyYbtlML0USCWrZFYjrC57yqtlWluacwwbMZa/I6ByVIKqCqVXJwRuRl20IQGlVGlg==",
       "dev": true,
+=======
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.0.0.tgz",
+      "integrity": "sha512-QC+dNx3tvMEn9IrxcXFFa0rWwvBwACkGFNKl+W2miMGYnlgSiIsnjdqwtG2WRs0Pyxs5dd9nBTQHyQ1BPxZ78A==",
+>>>>>>> 68ad193 (breakdown tab for payments and offercreates)
       "dependencies": {
         "@scure/bip32": "^1.3.1",
         "@scure/bip39": "^1.2.1",
@@ -28926,11 +28954,20 @@
         "websocket": "^1.0.34"
       }
     },
+    "node_modules/xrpl-tx-path-parser": {
+      "version": "1.0.4",
+      "resolved": "git+ssh://git@github.com/shortthefomo/xrpl-tx-path-parser.git#8f5f4d5bc3bc83c6fffedf9bfe172d5a3c9d1c76",
+      "license": "ISC",
+      "dependencies": {
+        "@xrplkit/txmeta": "^1.3.1",
+        "decimal.js": "^10.4.3",
+        "xrpl": "^3.0.0"
+      }
+    },
     "node_modules/xrpl/node_modules/cross-fetch": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
       "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
-      "dev": true,
       "dependencies": {
         "node-fetch": "^2.6.12"
       }
@@ -28938,8 +28975,7 @@
     "node_modules/xrpl/node_modules/eventemitter3": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
-      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
-      "dev": true
+      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
     },
     "node_modules/y18n": {
       "version": "4.0.3",
@@ -32491,7 +32527,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
       "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
-      "dev": true,
       "requires": {
         "@noble/hashes": "1.3.2"
       }
@@ -32853,7 +32888,6 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz",
       "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==",
-      "dev": true,
       "requires": {
         "@noble/curves": "~1.2.0",
         "@noble/hashes": "~1.3.2",
@@ -32864,7 +32898,6 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
       "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
-      "dev": true,
       "requires": {
         "@noble/hashes": "~1.3.0",
         "@scure/base": "~1.1.0"
@@ -33766,12 +33799,33 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-1.0.0.tgz",
       "integrity": "sha512-qsCLGyqe1zaq9j7PZJopK+iGTGRbk6akkg6iZXJJgxKwck0C5x5Gnwlb1HKYGOwPKyrXWpV6a2YmcpNpUFctGg==",
-      "dev": true,
       "requires": {
         "@xrplf/isomorphic": "^1.0.0",
         "ripple-keypairs": "^2.0.0"
       }
     },
+    "@xrplkit/amount": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@xrplkit/amount/-/amount-1.2.3.tgz",
+      "integrity": "sha512-poV7ym7EhjAlEGym9Kc3AHuy3uuhVW3qnl2KDr8D4zk7hANj7aG6l1XdtWIAGAgBpHnvPEaOG7+llPRRv1irZw==",
+      "requires": {
+        "@xrplkit/xfl": "2.0.2"
+      }
+    },
+    "@xrplkit/txmeta": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@xrplkit/txmeta/-/txmeta-1.3.1.tgz",
+      "integrity": "sha512-iJNtLgXTpbuYBI0VDsXJhi3MHxmsCdWsI3OumETk+21HjxDw1AmPGmVHWu8q8turFth1qzRIAtHjxLHDl307sg==",
+      "requires": {
+        "@xrplkit/amount": "1.2.3",
+        "@xrplkit/xfl": "2.0.2"
+      }
+    },
+    "@xrplkit/xfl": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+      "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+    },
     "abab": {
       "version": "2.0.5",
       "dev": true
@@ -35910,9 +35964,9 @@
       }
     },
     "decimal.js": {
-      "version": "10.3.1",
-      "dev": true,
-      "peer": true
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
     },
     "decimal.js-light": {
       "version": "2.5.1"
@@ -45644,10 +45698,16 @@
       }
     },
     "ripple-binary-codec": {
+<<<<<<< HEAD
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.1.0.tgz",
       "integrity": "sha512-q0GAx+hj3UVcDbhXVjk7qeNfgUMehlElYJwiCuIBwqs/51GVTOwLr39Ht3eNsX5ow2xPRaC5mqHwcFDvLRm6cA==",
       "dev": true,
+=======
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.0.0.tgz",
+      "integrity": "sha512-zakENc9A5dlW85uzrmQHrJehymhL59ftggboRNrjxFDJdlNJ6DSE210P3ys/9kL0oVtOzFnTrOPFfxHZeOsA/Q==",
+>>>>>>> 68ad193 (breakdown tab for payments and offercreates)
       "requires": {
         "@xrplf/isomorphic": "^1.0.1",
         "bignumber.js": "^9.0.0",
@@ -45658,7 +45718,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz",
       "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==",
-      "dev": true,
       "requires": {
         "@noble/curves": "^1.0.0",
         "@xrplf/isomorphic": "^1.0.0",
@@ -48417,10 +48476,16 @@
       "peer": true
     },
     "xrpl": {
+<<<<<<< HEAD
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.1.0.tgz",
       "integrity": "sha512-+97WiaF/AQTT6fXgD9Z5xyYbtlML0USCWrZFYjrC57yqtlWluacwwbMZa/I6ByVIKqCqVXJwRuRl20IQGlVGlg==",
       "dev": true,
+=======
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.0.0.tgz",
+      "integrity": "sha512-QC+dNx3tvMEn9IrxcXFFa0rWwvBwACkGFNKl+W2miMGYnlgSiIsnjdqwtG2WRs0Pyxs5dd9nBTQHyQ1BPxZ78A==",
+>>>>>>> 68ad193 (breakdown tab for payments and offercreates)
       "requires": {
         "@scure/bip32": "^1.3.1",
         "@scure/bip39": "^1.2.1",
@@ -48438,7 +48503,6 @@
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
           "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
-          "dev": true,
           "requires": {
             "node-fetch": "^2.6.12"
           }
@@ -48446,8 +48510,7 @@
         "eventemitter3": {
           "version": "5.0.1",
           "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
-          "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
-          "dev": true
+          "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
         }
       }
     },
@@ -48460,6 +48523,15 @@
         "websocket": "^1.0.34"
       }
     },
+    "xrpl-tx-path-parser": {
+      "version": "git+ssh://git@github.com/shortthefomo/xrpl-tx-path-parser.git#8f5f4d5bc3bc83c6fffedf9bfe172d5a3c9d1c76",
+      "from": "xrpl-tx-path-parser@github:shortthefomo/xrpl-tx-path-parser#dev",
+      "requires": {
+        "@xrplkit/txmeta": "^1.3.1",
+        "decimal.js": "^10.4.3",
+        "xrpl": "^3.0.0"
+      }
+    },
     "y18n": {
       "version": "4.0.3",
       "dev": true,
diff --git a/package.json b/package.json
index 0cd388040..cb3b9666c 100644
--- a/package.json
+++ b/package.json
@@ -54,7 +54,8 @@
     "vite-plugin-html": "^3.2.2",
     "vite-plugin-svgr": "^4.2.0",
     "vite-tsconfig-paths": "^4.2.0",
-    "xrpl-client": "^2.4.0"
+    "xrpl-client": "^2.4.0",
+    "xrpl-tx-path-parser": "github:shortthefomo/xrpl-tx-path-parser#dev"
   },
   "devDependencies": {
     "@babel/eslint-parser": "^7.22.6",
diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 02d1367b3..f908c7f53 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -75,6 +75,7 @@
   "not_found_default_title": "No s'ha trobat la pàgina",
   "not_found_check_url": "Si us plau, comproba l'URL",
   "not_found": "No s'ha trobat",
+  "breakdown": "Breakdown",
   "buy": "Compra",
   "sell": "Ven",
   "price": "Preu",
@@ -525,6 +526,7 @@
   "indicate_unl": "indica un validador en una UNL",
   "transaction_tokens_involved": "<Currency/> i <Currency2/>",
   "transaction_tokens_swapped": "<Currency/> per <Currency2/>",
+<<<<<<< HEAD
   "oracle_document_id": null,
   "provider": null,
   "last_update_time": null,
@@ -560,5 +562,9 @@
   "search_results_banner": null,
   "enable_amendment_name": null,
   "amendment_status": null,
-  "expected_date": null
+  "expected_date": null,
+  "graph_dependant_currency": "*Graph is dependant on the currency used.",
+  "incomplete_transaction": "Incomplete transaction",
+  "liquidity_source": "Liquidity Source",
+  "balance_changes": "Balance Changes"
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index 83fb30d98..20720ef48 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -78,6 +78,7 @@
   "not_found_default_title": "Page Not Found",
   "not_found_check_url": "Please double check your URL",
   "not_found": "Not found",
+  "breakdown": "Breakdown",
   "buy": "Buy",
   "sell": "Sell",
   "price": "Price",
@@ -560,6 +561,9 @@
   "search_results_banner": "Token search by name and account is now available! Try searching for USD",
   "enable_amendment_name": "Amendment Name",
   "amendment_status": "Amendment Status",
-  "expected_date": "Expected Date"
-
+  "expected_date": "Expected Date",
+  "graph_dependant_currency": "*Graph is dependant on the currency used.",
+  "incomplete_transaction": "Incomplete transaction",
+  "liquidity_source": "Liquidity Source",
+  "balance_changes": "Balance Changes"
 }
diff --git a/src/containers/Transactions/BreakDownTab/breakDownTab.scss b/src/containers/Transactions/BreakDownTab/breakDownTab.scss
new file mode 100644
index 000000000..2dd19fa67
--- /dev/null
+++ b/src/containers/Transactions/BreakDownTab/breakDownTab.scss
@@ -0,0 +1,119 @@
+@import '../../shared/css/variables';
+
+.breakdown-body {
+  margin-top: 20px;
+  color: $black-40;
+  font-size: 12px;
+  letter-spacing: 0px;
+}
+
+.detail-section {
+  padding: 5px 15px;
+  border-bottom: 1px solid $black-70;
+  margin: 0px 0px 30px;
+
+  &:last-child {
+    border: none;
+  }
+
+  &.no-border {
+    border: none;
+  }
+}
+
+.title {
+  margin-bottom: 4px;
+  color: $white;
+  font-size: 16px;
+  text-transform: capitalize;
+  @include bold;
+
+  span {
+    margin-left: 8px;
+    font-size: 10px;
+    line-height: 18px;
+  }
+}
+
+.flex {
+  display: flex;
+}
+
+.rectangle-container {
+  min-height: 200px;
+  // margin-top: 100px;
+}
+
+:root{
+  --max-height: 80%;
+}
+
+// Build the cylinder
+$circle-height: 9px;
+
+.rectangle-row {
+  position: relative;
+  display: block;
+  height: 50px;
+}
+
+.rectangle {
+  position: relative;
+  left: 0;
+  display: block;
+  width: $circle-height;
+  height: 30px;
+  box-sizing: border-box;
+  border-top: solid 2px var(--cylinder-color);
+  border-bottom: solid 2px var(--cylinder-color);
+  margin-top: 10px;
+  margin-left: 10px;
+  animation: grow 600ms 1.5s ease both;
+  background: linear-gradient(to right, #271527, var(--cylinder-color));
+  // transform: rotate(90deg);
+}
+
+.margin-text {
+  position: relative;
+  display: block;
+  border-bottom: dashed 1px $white;
+  font-weight: bold;
+  text-align: right;
+  text-transform: capitalize;
+  // transform: rotate(-180deg);
+  // writing-mode: vertical-rl;
+}
+
+.rectangle::before,
+.rectangle::after {
+  position: absolute;
+  top: -2px;
+  right: -3px;
+  width: $circle-height;
+  height: 30px;
+  box-sizing: border-box;
+  border: solid 2px var(--cylinder-color);
+  border-radius: 50%;
+  content: '';
+}
+
+.rectangle::before {
+  left: calc(-1 * $circle-height / 2);
+  background: #271527;
+}
+
+.rectangle::after {
+  z-index: -1;
+  right: calc(-1 * $circle-height / 2);
+  background: var(--cylinder-color);
+}
+
+@keyframes grow {
+  0% {
+    width: 0;
+  }
+
+  100% {
+    width: calc(var(--max-height) * var(--percent-value)); // Change this to make things ✨
+  }
+}
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
new file mode 100644
index 000000000..31decba57
--- /dev/null
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -0,0 +1,303 @@
+import { FC, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import parsePayment from 'xrpl-tx-path-parser'
+import { Account } from '../../shared/components/Account'
+import { Amount } from '../../shared/components/Amount'
+import { formatAmount } from '../../../rippled/lib/txSummary/formatAmount'
+import Currency from '../../shared/components/Currency'
+
+import './breakDownTab.scss'
+
+// import {
+//   createSourceAmount,
+//   createPaymentDefaultPaths,
+//   amountToBalance,
+// } from 'xrpl-tx-path-parser'
+
+export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
+  const { t } = useTranslation()
+  const [selectedView, setView] = useState('source')
+
+  const hexToString = (hex: string) => {
+    let string = ''
+    for (let i = 0; i < hex.length; i += 2) {
+      const part = hex.substring(i, i + 2)
+      const code = parseInt(part, 16)
+      if (!isNaN(code) && code !== 0) {
+        string += String.fromCharCode(code)
+      }
+    }
+    return string
+  }
+  const BalanceChange: FC<{
+    data: any
+    label: Boolean
+    type: String
+  }> = ({ data, label, type }) => {
+    const balances = []
+    data.forEach((change, index) => {
+      change.value *= -1
+
+      let balanceLabel =
+        type === 'direct' ? 'recieved' : change.value < 0 ? 'sold' : 'bought'
+      if (type === 'direct') {
+        change.value *= -1
+      }
+      if (!label) {
+        balanceLabel = ''
+      }
+      balances.push(
+        <li key={index}>
+          {balanceLabel} <Amount value={formatAmount(change)} />
+        </li>,
+      )
+    })
+
+    return <ul>{balances}</ul>
+  }
+  // eslint-disable-next-line react/no-unstable-nested-components
+  const Transaction: FC<{ parsed: any; account: Account }> = ({
+    parsed,
+    account,
+  }) => {
+    const changes = []
+    parsed.accountBalanceChanges.forEach((change, index) => {
+      if (account !== change.account) {
+        let type: String = 'direct'
+        if (change.isAMM) {
+          type = 'amm'
+        }
+        if (change.isOffer) {
+          type = 'dex'
+        }
+        if (change.isRippling) {
+          type = 'rippling'
+        }
+        changes.push(
+          <p key={`${index}-p`}>
+            <span>{type}</span> <Account account={change.account} />
+          </p>,
+
+          <BalanceChange
+            key={`${index}-b`}
+            data={change.balances}
+            label={!change.isRippling}
+            type={type}
+          />,
+        )
+      }
+    })
+
+    return <div>{changes}</div>
+  }
+
+  // eslint-disable-next-line react/no-unstable-nested-components
+  const Cylindars: FC<{ parsed: any; account: Account }> = ({
+    parsed,
+    account,
+  }) => {
+    const sum = {
+      amm: 0,
+      rippling: 0,
+      dex: 0,
+      direct: 0,
+      total: 0,
+    }
+    parsed.accountBalanceChanges.forEach((change) => {
+      if (account !== change.account) {
+        change.balances.forEach((balance) => {
+          // if (parsed.sourceAmount.currency === balance.currency) {
+          if (
+            (selectedView === 'source' &&
+              parsed.destinationAmount.currency === balance.currency) ||
+            (selectedView === 'destination' &&
+              parsed.sourceAmount.currency === balance.currency)
+          ) {
+            if (change.isAMM) {
+              sum.amm += balance.value * -1
+              sum.total += balance.value * -1
+            }
+            if (change.isOffer) {
+              sum.dex += balance.value * -1
+              sum.total += balance.value * -1
+            }
+            if (change.isDirect) {
+              sum.direct += balance.value * 1
+              sum.total += balance.value * 1
+            }
+            if (change.isRippling && balance.value * 1 > 0) {
+              sum.rippling +=
+                selectedView === 'destination'
+                  ? balance.value * -1
+                  : balance.value * 1
+            }
+          }
+        })
+      }
+    })
+
+    const NON_STANDARD_CODE_LENGTH = 40
+    const XRP = 'XRP'
+    const LP_TOKEN_IDENTIFIER = '03'
+    const destinationCurrencyCode =
+      parsed.destinationAmount.currency?.length === NON_STANDARD_CODE_LENGTH &&
+      parsed.destinationAmount.currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER
+        ? hexToString(parsed.destinationAmount.currency)
+        : parsed.destinationAmount.currency
+    const sourceCurrencyCode =
+      parsed.sourceAmount.currency?.length === NON_STANDARD_CODE_LENGTH &&
+      parsed.sourceAmount.currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER
+        ? hexToString(parsed.sourceAmount.currency)
+        : parsed.sourceAmount.currency
+
+    return (
+      <div>
+        {/* <h5>
+          AMM: {sum.amm} {(sum.amm / sum.total) * 100}
+        </h5>
+        <h5>
+          RIPPLING: {sum.rippling} {(sum.rippling / sum.total) * 100}
+        </h5>
+        <h5>
+          DEX: {sum.dex} {(sum.dex / sum.total) * 100}
+        </h5>
+        <h5>
+          DIRECT: {sum.direct} {(sum.direct / sum.total) * 100}
+        </h5>
+        <h5>TOTAL: {sum.total}</h5> */}
+
+        <select
+          value={selectedView} // ...force the select's value to match the state variable...
+          onChange={(e) => setView(e.target.value)}
+        >
+          <option value="source">
+            {sourceCurrencyCode} {t('source')}
+          </option>
+          <option value="destination">
+            {destinationCurrencyCode} {t('destination')}
+          </option>
+        </select>
+        <p>{t('graph_dependant_currency')}</p>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: sum.amm / sum.total,
+              ['--cylinder-color' as any]: '#ff198b',
+            }}
+          />
+          <span className="margin-text">
+            AMM ({Math.round((sum.amm / sum.total) * 100)}%)
+          </span>
+        </div>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: sum.rippling / sum.total,
+              ['--cylinder-color' as any]: '#32e685',
+            }}
+          />
+          <span className="margin-text">
+            RIPPLING ({Math.round((sum.rippling / sum.total) * 100)}%)
+          </span>
+        </div>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: sum.dex / sum.total,
+              ['--cylinder-color' as any]: '#19a3ff',
+            }}
+          />
+          <span className="margin-text">
+            DEX ({Math.round((sum.dex / sum.total) * 100)}%)
+          </span>
+        </div>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: sum.direct / sum.total,
+              ['--cylinder-color' as any]: '#9a52ff',
+            }}
+          />
+          <span className="margin-text">
+            DIRECT ({Math.round((sum.direct / sum.total) * 100)}%)
+          </span>
+        </div>
+        <div className="rectangle-row">
+          <div
+            className="rectangle"
+            style={{
+              ['--percent-value' as any]: 1,
+              ['--cylinder-color' as any]: '#faff19',
+            }}
+          />
+          <span className="margin-text">
+            TOTAL{' '}
+            <Amount
+              value={formatAmount(
+                selectedView === 'destination'
+                  ? parsed.sourceAmount
+                  : parsed.destinationAmount,
+              )}
+            />
+          </span>
+        </div>
+      </div>
+    )
+  }
+
+  const renderData = () => {
+    data.tx.meta = data.meta
+    // delete mutate.meta
+    try {
+      const parsed = parsePayment(data.tx)
+      if (
+        parsed.sourceAmount.value === '0' &&
+        data.tx.TransactionType === 'OfferCreate'
+      ) {
+        return <h3>{t('The offer has not crossed anything yet.')}</h3>
+      }
+
+      return (
+        <div className="row">
+          <div className="detail-section">
+            <div className="title">{data.tx.TransactionType}</div>
+            <div>
+              Source: <Account account={parsed.sourceAccount} />
+            </div>
+            <div>
+              <Amount value={formatAmount(parsed.sourceAmount)} />
+            </div>
+            <br />
+            <div>
+              Destination: <Account account={parsed.destinationAccount} />
+            </div>
+            <div>
+              <Amount value={formatAmount(parsed.destinationAmount)} />
+            </div>
+          </div>
+          <div className="detail-section no-border">
+            <div className="title">{t('liquidity_source')}</div>
+            <Cylindars parsed={parsed} account={parsed.sourceAccount} />
+          </div>
+          <div className="detail-section">
+            <div className="title">{t('balance_changes')}</div>
+            <Transaction parsed={parsed} account={parsed.sourceAccount} />
+          </div>
+          {/* <
+          // debug....
+          div className="detail-section">
+            <pre>{JSON.stringify(parsed, null, 2)}</pre>
+          </div> */}
+        </div>
+      )
+    } catch (e) {
+      return <h3>{t('incomplete_transaction')}</h3>
+    }
+  }
+
+  return <div className="breakdown-body">{renderData()}</div>
+}
diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index 2918e7674..c2c5e0254 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -14,6 +14,7 @@ import {
 } from '../shared/utils'
 import { SimpleTab } from './SimpleTab'
 import { DetailTab } from './DetailTab'
+import { BreakDownTab } from './BreakDownTab'
 import './transaction.scss'
 import { AnalyticsFields, useAnalytics } from '../shared/analytics'
 import SocketContext from '../shared/SocketContext'
@@ -120,6 +121,12 @@ export const Transaction = () => {
 
   function renderTabs() {
     const tabs = ['simple', 'detailed', 'raw']
+    if (
+      data.raw.tx.TransactionType === 'OfferCreate' ||
+      data.raw.tx.TransactionType === 'Payment'
+    ) {
+      tabs.push('breakdown')
+    }
     const mainPath = buildPath(TRANSACTION_ROUTE, { identifier })
     return <Tabs tabs={tabs} selected={tab} path={mainPath} />
   }
@@ -130,6 +137,9 @@ export const Transaction = () => {
     let body
 
     switch (tab) {
+      case 'breakdown':
+        body = <BreakDownTab data={data.raw} />
+        break
       case 'detailed':
         body = <DetailTab data={data.processed} />
         break

From 773dbd28173e073c23bef3a4d787e2db1a21b9b3 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Wed, 22 May 2024 12:56:08 -0400
Subject: [PATCH 70/79] color code breakdown and add missing transation labels

---
 public/locales/ca-CA/translations.json        |  6 ++++-
 public/locales/en-US/translations.json        |  6 ++++-
 .../BreakDownTab/breakDownTab.scss            | 24 +++++++++++++++++++
 .../Transactions/BreakDownTab/index.tsx       | 23 ++++++++++++------
 4 files changed, 50 insertions(+), 9 deletions(-)

diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index f908c7f53..4d0f35ecb 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -566,5 +566,9 @@
   "graph_dependant_currency": "*Graph is dependant on the currency used.",
   "incomplete_transaction": "Incomplete transaction",
   "liquidity_source": "Liquidity Source",
-  "balance_changes": "Balance Changes"
+  "balance_changes": "Balance Changes",
+  "direct": "direct",
+  "dex": "dex",
+  "amm": "amm",
+  "rippling": "rippling"
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index 20720ef48..7aad57573 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -565,5 +565,9 @@
   "graph_dependant_currency": "*Graph is dependant on the currency used.",
   "incomplete_transaction": "Incomplete transaction",
   "liquidity_source": "Liquidity Source",
-  "balance_changes": "Balance Changes"
+  "balance_changes": "Balance Changes",
+  "direct": "direct",
+  "dex": "dex",
+  "amm": "amm",
+  "rippling": "rippling"
 }
diff --git a/src/containers/Transactions/BreakDownTab/breakDownTab.scss b/src/containers/Transactions/BreakDownTab/breakDownTab.scss
index 2dd19fa67..16acfc3d3 100644
--- a/src/containers/Transactions/BreakDownTab/breakDownTab.scss
+++ b/src/containers/Transactions/BreakDownTab/breakDownTab.scss
@@ -35,6 +35,30 @@
   }
 }
 
+.badge {
+  padding: 5px;
+  padding-top: 3px;
+  border-radius: 5px;
+  color: $black;
+
+  &.amm {
+    background-color: #ff198b;
+
+  }
+
+  &.dex {
+    background-color: #19a3ff;
+  }
+
+  &.direct {
+    background-color: #9a52ff;
+  }
+
+  &.rippling {
+    background-color: #32e685;
+  }
+}
+
 .flex {
   display: flex;
 }
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index 31decba57..f2ae68ae3 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -63,19 +63,28 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     const changes = []
     parsed.accountBalanceChanges.forEach((change, index) => {
       if (account !== change.account) {
-        let type: String = 'direct'
+        let type: String = ''
+        let span_class: String = ''
+        if (change.isDirect) {
+          type = 'direct'
+          span_class = 'badge direct'
+        }
         if (change.isAMM) {
           type = 'amm'
+          span_class = 'badge amm'
         }
         if (change.isOffer) {
           type = 'dex'
+          span_class = 'badge dex'
         }
         if (change.isRippling) {
           type = 'rippling'
+          span_class = 'badge rippling'
         }
         changes.push(
           <p key={`${index}-p`}>
-            <span>{type}</span> <Account account={change.account} />
+            <span className={span_class}>{type}</span>{' '}
+            <Account account={change.account} />
           </p>,
 
           <BalanceChange
@@ -187,7 +196,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            AMM ({Math.round((sum.amm / sum.total) * 100)}%)
+            {t('amm')} ({Math.round((sum.amm / sum.total) * 100)}%)
           </span>
         </div>
         <div className="rectangle-row">
@@ -199,7 +208,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            RIPPLING ({Math.round((sum.rippling / sum.total) * 100)}%)
+            {t('rippling')} ({Math.round((sum.rippling / sum.total) * 100)}%)
           </span>
         </div>
         <div className="rectangle-row">
@@ -211,7 +220,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            DEX ({Math.round((sum.dex / sum.total) * 100)}%)
+            {t('dex')} ({Math.round((sum.dex / sum.total) * 100)}%)
           </span>
         </div>
         <div className="rectangle-row">
@@ -223,7 +232,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            DIRECT ({Math.round((sum.direct / sum.total) * 100)}%)
+            {t('direct')} ({Math.round((sum.direct / sum.total) * 100)}%)
           </span>
         </div>
         <div className="rectangle-row">
@@ -235,7 +244,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             }}
           />
           <span className="margin-text">
-            TOTAL{' '}
+            {t('total')}{' '}
             <Amount
               value={formatAmount(
                 selectedView === 'destination'

From ae192a1fe586fd2a7d2f300c3e579aec50eb43d7 Mon Sep 17 00:00:00 2001
From: Fomo <508629+shortthefomo@users.noreply.github.com>
Date: Wed, 22 May 2024 14:02:00 -0400
Subject: [PATCH 71/79] Update public/locales/ca-CA/translations.json

fix spelling

Co-authored-by: Mayukha Vadari <mvadari@gmail.com>
---
 public/locales/ca-CA/translations.json | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 4d0f35ecb..04d7a69eb 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -526,6 +526,7 @@
   "indicate_unl": "indica un validador en una UNL",
   "transaction_tokens_involved": "<Currency/> i <Currency2/>",
   "transaction_tokens_swapped": "<Currency/> per <Currency2/>",
+<<<<<<< HEAD
 <<<<<<< HEAD
   "oracle_document_id": null,
   "provider": null,
@@ -563,7 +564,7 @@
   "enable_amendment_name": null,
   "amendment_status": null,
   "expected_date": null,
-  "graph_dependant_currency": "*Graph is dependant on the currency used.",
+  "graph_dependant_currency": "*Graph is dependent on the currency used.",
   "incomplete_transaction": "Incomplete transaction",
   "liquidity_source": "Liquidity Source",
   "balance_changes": "Balance Changes",

From 92d1c6c615329593f8e949a7ae573424f866a079 Mon Sep 17 00:00:00 2001
From: Fomo <508629+shortthefomo@users.noreply.github.com>
Date: Wed, 22 May 2024 14:02:35 -0400
Subject: [PATCH 72/79] Update src/containers/Transactions/index.tsx

use of ternary

Co-authored-by: Mayukha Vadari <mvadari@gmail.com>
---
 src/containers/Transactions/index.tsx | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index c2c5e0254..fe03fa51c 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -120,13 +120,7 @@ export const Transaction = () => {
   }
 
   function renderTabs() {
-    const tabs = ['simple', 'detailed', 'raw']
-    if (
-      data.raw.tx.TransactionType === 'OfferCreate' ||
-      data.raw.tx.TransactionType === 'Payment'
-    ) {
-      tabs.push('breakdown')
-    }
+    const tabs = (data.raw.tx.TransactionType === 'OfferCreate' || data.raw.tx.TransactionType === 'Payment') ? ['simple', 'breakdown', 'detailed', 'raw'] ? ['simple', 'detailed', 'raw']
     const mainPath = buildPath(TRANSACTION_ROUTE, { identifier })
     return <Tabs tabs={tabs} selected={tab} path={mainPath} />
   }

From f40e705e9528f129b1a7c59cfb9d5b90fcb2708f Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Wed, 22 May 2024 14:08:55 -0400
Subject: [PATCH 73/79] missed two more translation labels

---
 package-lock.json                             | 24 -------------------
 public/locales/ca-CA/translations.json        |  6 ++---
 public/locales/en-US/translations.json        |  6 +++--
 .../Transactions/BreakDownTab/index.tsx       |  8 +++++--
 4 files changed, 13 insertions(+), 31 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 46355693f..b160bda44 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24718,16 +24718,10 @@
       }
     },
     "node_modules/ripple-binary-codec": {
-<<<<<<< HEAD
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.1.0.tgz",
       "integrity": "sha512-q0GAx+hj3UVcDbhXVjk7qeNfgUMehlElYJwiCuIBwqs/51GVTOwLr39Ht3eNsX5ow2xPRaC5mqHwcFDvLRm6cA==",
       "dev": true,
-=======
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.0.0.tgz",
-      "integrity": "sha512-zakENc9A5dlW85uzrmQHrJehymhL59ftggboRNrjxFDJdlNJ6DSE210P3ys/9kL0oVtOzFnTrOPFfxHZeOsA/Q==",
->>>>>>> 68ad193 (breakdown tab for payments and offercreates)
       "dependencies": {
         "@xrplf/isomorphic": "^1.0.1",
         "bignumber.js": "^9.0.0",
@@ -28919,16 +28913,10 @@
       "peer": true
     },
     "node_modules/xrpl": {
-<<<<<<< HEAD
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.1.0.tgz",
       "integrity": "sha512-+97WiaF/AQTT6fXgD9Z5xyYbtlML0USCWrZFYjrC57yqtlWluacwwbMZa/I6ByVIKqCqVXJwRuRl20IQGlVGlg==",
       "dev": true,
-=======
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.0.0.tgz",
-      "integrity": "sha512-QC+dNx3tvMEn9IrxcXFFa0rWwvBwACkGFNKl+W2miMGYnlgSiIsnjdqwtG2WRs0Pyxs5dd9nBTQHyQ1BPxZ78A==",
->>>>>>> 68ad193 (breakdown tab for payments and offercreates)
       "dependencies": {
         "@scure/bip32": "^1.3.1",
         "@scure/bip39": "^1.2.1",
@@ -45698,16 +45686,10 @@
       }
     },
     "ripple-binary-codec": {
-<<<<<<< HEAD
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.1.0.tgz",
       "integrity": "sha512-q0GAx+hj3UVcDbhXVjk7qeNfgUMehlElYJwiCuIBwqs/51GVTOwLr39Ht3eNsX5ow2xPRaC5mqHwcFDvLRm6cA==",
       "dev": true,
-=======
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-2.0.0.tgz",
-      "integrity": "sha512-zakENc9A5dlW85uzrmQHrJehymhL59ftggboRNrjxFDJdlNJ6DSE210P3ys/9kL0oVtOzFnTrOPFfxHZeOsA/Q==",
->>>>>>> 68ad193 (breakdown tab for payments and offercreates)
       "requires": {
         "@xrplf/isomorphic": "^1.0.1",
         "bignumber.js": "^9.0.0",
@@ -48476,16 +48458,10 @@
       "peer": true
     },
     "xrpl": {
-<<<<<<< HEAD
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.1.0.tgz",
       "integrity": "sha512-+97WiaF/AQTT6fXgD9Z5xyYbtlML0USCWrZFYjrC57yqtlWluacwwbMZa/I6ByVIKqCqVXJwRuRl20IQGlVGlg==",
       "dev": true,
-=======
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-3.0.0.tgz",
-      "integrity": "sha512-QC+dNx3tvMEn9IrxcXFFa0rWwvBwACkGFNKl+W2miMGYnlgSiIsnjdqwtG2WRs0Pyxs5dd9nBTQHyQ1BPxZ78A==",
->>>>>>> 68ad193 (breakdown tab for payments and offercreates)
       "requires": {
         "@scure/bip32": "^1.3.1",
         "@scure/bip39": "^1.2.1",
diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 04d7a69eb..5217f95cf 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -526,8 +526,6 @@
   "indicate_unl": "indica un validador en una UNL",
   "transaction_tokens_involved": "<Currency/> i <Currency2/>",
   "transaction_tokens_swapped": "<Currency/> per <Currency2/>",
-<<<<<<< HEAD
-<<<<<<< HEAD
   "oracle_document_id": null,
   "provider": null,
   "last_update_time": null,
@@ -571,5 +569,7 @@
   "direct": "direct",
   "dex": "dex",
   "amm": "amm",
-  "rippling": "rippling"
+  "rippling": "rippling",
+  "sold": "sold",
+  "bought": "bought"
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index 7aad57573..caba266bb 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -562,12 +562,14 @@
   "enable_amendment_name": "Amendment Name",
   "amendment_status": "Amendment Status",
   "expected_date": "Expected Date",
-  "graph_dependant_currency": "*Graph is dependant on the currency used.",
+  "graph_dependent_currency": "*Graph is dependent on the currency used.",
   "incomplete_transaction": "Incomplete transaction",
   "liquidity_source": "Liquidity Source",
   "balance_changes": "Balance Changes",
   "direct": "direct",
   "dex": "dex",
   "amm": "amm",
-  "rippling": "rippling"
+  "rippling": "rippling",
+  "sold": "sold",
+  "bought": "bought"
 }
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index f2ae68ae3..cadfd6791 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -39,7 +39,11 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
       change.value *= -1
 
       let balanceLabel =
-        type === 'direct' ? 'recieved' : change.value < 0 ? 'sold' : 'bought'
+        type === 'direct'
+          ? 'recieved'
+          : change.value < 0
+          ? t('sold')
+          : t('bought')
       if (type === 'direct') {
         change.value *= -1
       }
@@ -186,7 +190,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             {destinationCurrencyCode} {t('destination')}
           </option>
         </select>
-        <p>{t('graph_dependant_currency')}</p>
+        <p>{t('graph_dependent_currency')}</p>
         <div className="rectangle-row">
           <div
             className="rectangle"

From 2af602a365bfb967f560352ff59e8547cdbc1755 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Wed, 22 May 2024 16:38:17 -0400
Subject: [PATCH 74/79] fix turnary

---
 src/containers/Transactions/index.tsx | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index fe03fa51c..1102e4f4c 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -120,7 +120,11 @@ export const Transaction = () => {
   }
 
   function renderTabs() {
-    const tabs = (data.raw.tx.TransactionType === 'OfferCreate' || data.raw.tx.TransactionType === 'Payment') ? ['simple', 'breakdown', 'detailed', 'raw'] ? ['simple', 'detailed', 'raw']
+    const tabs =
+      data.raw.tx.TransactionType === 'OfferCreate' ||
+      data.raw.tx.TransactionType === 'Payment'
+        ? ['simple', 'breakdown', 'detailed', 'raw']
+        : ['simple', 'detailed', 'raw']
     const mainPath = buildPath(TRANSACTION_ROUTE, { identifier })
     return <Tabs tabs={tabs} selected={tab} path={mainPath} />
   }

From afa8dccdf33aaaa2945eb9c5df27797a72c7f8e2 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Thu, 23 May 2024 08:43:30 -0400
Subject: [PATCH 75/79] use non dev version of xrpl-tx-path-parser changes have
 been comitted

---
 package-lock.json                             | 12 ++--
 public/locales/ca-CA/translations.json        |  3 +-
 public/locales/en-US/translations.json        |  3 +-
 .../Transactions/BreakDownTab/index.tsx       | 56 ++++++++-----------
 src/containers/Transactions/index.tsx         |  1 +
 .../Transactions/test/Transaction.test.tsx    |  5 +-
 6 files changed, 38 insertions(+), 42 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b160bda44..6027ebad9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
         "@vitejs/plugin-react": "^4.2.1",
         "@xrplf/isomorphic": "^1.0.0-beta.1",
         "@xrplf/prettier-config": "^1.9.1",
+        "@xrplkit/txmeta": "^1.3.1",
         "assert": "^2.1.0",
         "autoprefixer": "^10.4.20",
         "axios": "^1.6.5",
@@ -28943,9 +28944,9 @@
       }
     },
     "node_modules/xrpl-tx-path-parser": {
-      "version": "1.0.4",
-      "resolved": "git+ssh://git@github.com/shortthefomo/xrpl-tx-path-parser.git#8f5f4d5bc3bc83c6fffedf9bfe172d5a3c9d1c76",
-      "license": "ISC",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/xrpl-tx-path-parser/-/xrpl-tx-path-parser-1.0.5.tgz",
+      "integrity": "sha512-eQTdv/OKe5MIjOuiYB6FseUtiD8WOqYTmAGfOkHn4DWn233ES/970Yr10QPTrQoWtoA5forroXSiXBse6xxvow==",
       "dependencies": {
         "@xrplkit/txmeta": "^1.3.1",
         "decimal.js": "^10.4.3",
@@ -48500,8 +48501,9 @@
       }
     },
     "xrpl-tx-path-parser": {
-      "version": "git+ssh://git@github.com/shortthefomo/xrpl-tx-path-parser.git#8f5f4d5bc3bc83c6fffedf9bfe172d5a3c9d1c76",
-      "from": "xrpl-tx-path-parser@github:shortthefomo/xrpl-tx-path-parser#dev",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/xrpl-tx-path-parser/-/xrpl-tx-path-parser-1.0.5.tgz",
+      "integrity": "sha512-eQTdv/OKe5MIjOuiYB6FseUtiD8WOqYTmAGfOkHn4DWn233ES/970Yr10QPTrQoWtoA5forroXSiXBse6xxvow==",
       "requires": {
         "@xrplkit/txmeta": "^1.3.1",
         "decimal.js": "^10.4.3",
diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json
index 5217f95cf..1418be160 100644
--- a/public/locales/ca-CA/translations.json
+++ b/public/locales/ca-CA/translations.json
@@ -571,5 +571,6 @@
   "amm": "amm",
   "rippling": "rippling",
   "sold": "sold",
-  "bought": "bought"
+  "bought": "bought",
+  "no_cross": "The offer has not crossed anything yet"
 }
diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json
index caba266bb..e82ecdee6 100644
--- a/public/locales/en-US/translations.json
+++ b/public/locales/en-US/translations.json
@@ -571,5 +571,6 @@
   "amm": "amm",
   "rippling": "rippling",
   "sold": "sold",
-  "bought": "bought"
+  "bought": "bought",
+  "no_cross": "The offer has not crossed anything yet"
 }
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index cadfd6791..3e0e92ce7 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -1,25 +1,17 @@
 import { FC, useState } from 'react'
 import { useTranslation } from 'react-i18next'
-import parsePayment from 'xrpl-tx-path-parser'
+import pathParser from 'xrpl-tx-path-parser'
 import { Account } from '../../shared/components/Account'
 import { Amount } from '../../shared/components/Amount'
 import { formatAmount } from '../../../rippled/lib/txSummary/formatAmount'
-import Currency from '../../shared/components/Currency'
-
 import './breakDownTab.scss'
 
-// import {
-//   createSourceAmount,
-//   createPaymentDefaultPaths,
-//   amountToBalance,
-// } from 'xrpl-tx-path-parser'
-
 export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
   const { t } = useTranslation()
   const [selectedView, setView] = useState('source')
 
   const hexToString = (hex: string) => {
-    let string = ''
+    let string: string = ''
     for (let i = 0; i < hex.length; i += 2) {
       const part = hex.substring(i, i + 2)
       const code = parseInt(part, 16)
@@ -35,24 +27,25 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     type: String
   }> = ({ data, label, type }) => {
     const balances = []
-    data.forEach((change, index) => {
-      change.value *= -1
+    data.forEach((change: any, index: any) => {
+      const amount = change
+      amount.value *= -1
 
-      let balanceLabel =
+      let balanceLabel: string =
         type === 'direct'
           ? 'recieved'
-          : change.value < 0
+          : amount.value < 0
           ? t('sold')
           : t('bought')
       if (type === 'direct') {
-        change.value *= -1
+        amount.value *= -1
       }
       if (!label) {
         balanceLabel = ''
       }
       balances.push(
-        <li key={index}>
-          {balanceLabel} <Amount value={formatAmount(change)} />
+        <li key={String(index)}>
+          {balanceLabel} <Amount value={formatAmount(amount)} />
         </li>,
       )
     })
@@ -60,39 +53,39 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     return <ul>{balances}</ul>
   }
   // eslint-disable-next-line react/no-unstable-nested-components
-  const Transaction: FC<{ parsed: any; account: Account }> = ({
+  const Transaction: FC<{ parsed: any; account: any }> = ({
     parsed,
     account,
   }) => {
     const changes = []
     parsed.accountBalanceChanges.forEach((change, index) => {
       if (account !== change.account) {
-        let type: String = ''
-        let span_class: String = ''
+        let type: string = ''
+        let spanClass: string = ''
         if (change.isDirect) {
           type = 'direct'
-          span_class = 'badge direct'
+          spanClass = 'badge direct'
         }
         if (change.isAMM) {
           type = 'amm'
-          span_class = 'badge amm'
+          spanClass = 'badge amm'
         }
         if (change.isOffer) {
           type = 'dex'
-          span_class = 'badge dex'
+          spanClass = 'badge dex'
         }
         if (change.isRippling) {
           type = 'rippling'
-          span_class = 'badge rippling'
+          spanClass = 'badge rippling'
         }
         changes.push(
-          <p key={`${index}-p`}>
-            <span className={span_class}>{type}</span>{' '}
+          <p key={`${String(index)}-p`}>
+            <span className={spanClass}>{type}</span>{' '}
             <Account account={change.account} />
           </p>,
 
           <BalanceChange
-            key={`${index}-b`}
+            key={`${String(index)}-b`}
             data={change.balances}
             label={!change.isRippling}
             type={type}
@@ -105,7 +98,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
   }
 
   // eslint-disable-next-line react/no-unstable-nested-components
-  const Cylindars: FC<{ parsed: any; account: Account }> = ({
+  const Cylindars: FC<{ parsed: any; account: any }> = ({
     parsed,
     account,
   }) => {
@@ -119,7 +112,6 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     parsed.accountBalanceChanges.forEach((change) => {
       if (account !== change.account) {
         change.balances.forEach((balance) => {
-          // if (parsed.sourceAmount.currency === balance.currency) {
           if (
             (selectedView === 'source' &&
               parsed.destinationAmount.currency === balance.currency) ||
@@ -150,7 +142,6 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     })
 
     const NON_STANDARD_CODE_LENGTH = 40
-    const XRP = 'XRP'
     const LP_TOKEN_IDENTIFIER = '03'
     const destinationCurrencyCode =
       parsed.destinationAmount.currency?.length === NON_STANDARD_CODE_LENGTH &&
@@ -264,14 +255,13 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
 
   const renderData = () => {
     data.tx.meta = data.meta
-    // delete mutate.meta
     try {
-      const parsed = parsePayment(data.tx)
+      const parsed = pathParser(data.tx)
       if (
         parsed.sourceAmount.value === '0' &&
         data.tx.TransactionType === 'OfferCreate'
       ) {
-        return <h3>{t('The offer has not crossed anything yet.')}</h3>
+        return <h3>{t('no_cross')}</h3>
       }
 
       return (
diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx
index 1102e4f4c..1f3f8cc8b 100644
--- a/src/containers/Transactions/index.tsx
+++ b/src/containers/Transactions/index.tsx
@@ -121,6 +121,7 @@ export const Transaction = () => {
 
   function renderTabs() {
     const tabs =
+      data === undefined ||
       data.raw.tx.TransactionType === 'OfferCreate' ||
       data.raw.tx.TransactionType === 'Payment'
         ? ['simple', 'breakdown', 'detailed', 'raw']
diff --git a/src/containers/Transactions/test/Transaction.test.tsx b/src/containers/Transactions/test/Transaction.test.tsx
index e4b471e95..31ee2d3e9 100644
--- a/src/containers/Transactions/test/Transaction.test.tsx
+++ b/src/containers/Transactions/test/Transaction.test.tsx
@@ -137,8 +137,9 @@ describe('Transaction container', () => {
       expect(wrapper.find('.tabs').length).toBe(1)
       expect(wrapper.find('a.tab').length).toBe(3)
       expect(wrapper.find('a.tab').at(0).props().title).toBe('simple')
-      expect(wrapper.find('a.tab').at(1).props().title).toBe('detailed')
-      expect(wrapper.find('a.tab').at(2).props().title).toBe('raw')
+      expect(wrapper.find('a.tab').at(1).props().title).toBe('breakdown')
+      expect(wrapper.find('a.tab').at(2).props().title).toBe('detailed')
+      expect(wrapper.find('a.tab').at(3).props().title).toBe('raw')
       expect(wrapper.find('a.tab.selected').text()).toEqual('simple')
       wrapper.unmount()
     })

From 42a8be12cd52f4838d66a0d39d3dea26c3e915f1 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Fri, 24 May 2024 16:36:38 -0400
Subject: [PATCH 76/79] add testes

---
 package-lock.json                             |  33 +-
 package.json                                  |   2 +
 .../Transactions/BreakDownTab/index.tsx       |  36 +-
 .../Transactions/test/BreakDownTab.test.tsx   |  76 +++
 .../Transactions/test/Transaction.test.tsx    |   2 +-
 .../test/mock_data/PaymentBreakdown.json      | 476 ++++++++++++++++++
 6 files changed, 602 insertions(+), 23 deletions(-)
 create mode 100644 src/containers/Transactions/test/BreakDownTab.test.tsx
 create mode 100644 src/containers/Transactions/test/mock_data/PaymentBreakdown.json

diff --git a/package-lock.json b/package-lock.json
index 6027ebad9..800a9c2c7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
         "@xrplf/isomorphic": "^1.0.0-beta.1",
         "@xrplf/prettier-config": "^1.9.1",
         "@xrplkit/txmeta": "^1.3.1",
+        "@xrplkit/xfl": "^2.1.0",
         "assert": "^2.1.0",
         "autoprefixer": "^10.4.20",
         "axios": "^1.6.5",
@@ -7434,6 +7435,11 @@
         "@xrplkit/xfl": "2.0.2"
       }
     },
+    "node_modules/@xrplkit/amount/node_modules/@xrplkit/xfl": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+      "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+    },
     "node_modules/@xrplkit/txmeta": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/@xrplkit/txmeta/-/txmeta-1.3.1.tgz",
@@ -7443,11 +7449,16 @@
         "@xrplkit/xfl": "2.0.2"
       }
     },
-    "node_modules/@xrplkit/xfl": {
+    "node_modules/@xrplkit/txmeta/node_modules/@xrplkit/xfl": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
       "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
     },
+    "node_modules/@xrplkit/xfl": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.1.0.tgz",
+      "integrity": "sha512-CgRztE77c0hsZ57aPxwQg0vC6gSP/3Hz7cdzUQJSMBTy+b3VK/rGs+rMrmd9CY68jvVyTrhRpq6EgUPDBsywIg=="
+    },
     "node_modules/abab": {
       "version": "2.0.5",
       "dev": true,
@@ -33799,6 +33810,13 @@
       "integrity": "sha512-poV7ym7EhjAlEGym9Kc3AHuy3uuhVW3qnl2KDr8D4zk7hANj7aG6l1XdtWIAGAgBpHnvPEaOG7+llPRRv1irZw==",
       "requires": {
         "@xrplkit/xfl": "2.0.2"
+      },
+      "dependencies": {
+        "@xrplkit/xfl": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+          "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+        }
       }
     },
     "@xrplkit/txmeta": {
@@ -33808,12 +33826,19 @@
       "requires": {
         "@xrplkit/amount": "1.2.3",
         "@xrplkit/xfl": "2.0.2"
+      },
+      "dependencies": {
+        "@xrplkit/xfl": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
+          "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+        }
       }
     },
     "@xrplkit/xfl": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.0.2.tgz",
-      "integrity": "sha512-OUZZzSoXSxYxuhBcz08Wb9Xme71PkFYejk3vq4jPzdXreVhF71ZrM6nSObHFgasC8/srWKoqiS37CnB2Ht3k/g=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@xrplkit/xfl/-/xfl-2.1.0.tgz",
+      "integrity": "sha512-CgRztE77c0hsZ57aPxwQg0vC6gSP/3Hz7cdzUQJSMBTy+b3VK/rGs+rMrmd9CY68jvVyTrhRpq6EgUPDBsywIg=="
     },
     "abab": {
       "version": "2.0.5",
diff --git a/package.json b/package.json
index cb3b9666c..ad022aaf5 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,8 @@
     "@vitejs/plugin-react": "^4.2.1",
     "@xrplf/isomorphic": "^1.0.0-beta.1",
     "@xrplf/prettier-config": "^1.9.1",
+    "@xrplkit/txmeta": "^1.3.1",
+    "@xrplkit/xfl": "^2.1.0",
     "assert": "^2.1.0",
     "autoprefixer": "^10.4.20",
     "axios": "^1.6.5",
diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index 3e0e92ce7..338c479ad 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -26,7 +26,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     label: Boolean
     type: String
   }> = ({ data, label, type }) => {
-    const balances = []
+    const balances: string[] = []
     data.forEach((change: any, index: any) => {
       const amount = change
       amount.value *= -1
@@ -43,11 +43,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
       if (!label) {
         balanceLabel = ''
       }
-      balances.push(
-        <li key={String(index)}>
-          {balanceLabel} <Amount value={formatAmount(amount)} />
-        </li>,
-      )
+      balances.push(<li key={String(index)}>{balanceLabel}</li>)
     })
 
     return <ul>{balances}</ul>
@@ -57,7 +53,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
     parsed,
     account,
   }) => {
-    const changes = []
+    const changes: string[] = []
     parsed.accountBalanceChanges.forEach((change, index) => {
       if (account !== change.account) {
         let type: string = ''
@@ -254,32 +250,36 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
   }
 
   const renderData = () => {
-    data.tx.meta = data.meta
+    if (data === undefined || data.tx === undefined) {
+      return null
+    }
+
+    const mutated = data
+    mutated.tx.meta = data.meta
     try {
-      const parsed = pathParser(data.tx)
+      const parsed = pathParser(mutated.tx)
       if (
         parsed.sourceAmount.value === '0' &&
-        data.tx.TransactionType === 'OfferCreate'
+        mutated.tx.TransactionType === 'OfferCreate'
       ) {
         return <h3>{t('no_cross')}</h3>
       }
-
       return (
         <div className="row">
           <div className="detail-section">
-            <div className="title">{data.tx.TransactionType}</div>
-            <div>
+            <div className="title">{mutated.tx.TransactionType}</div>
+            <div className="source-account">
               Source: <Account account={parsed.sourceAccount} />
             </div>
-            <div>
-              <Amount value={formatAmount(parsed.sourceAmount)} />
+            <div className="source-amount">
+              <Amount value={formatAmount(parsed.sourceAmount as any)} />
             </div>
             <br />
-            <div>
+            <div className="destination-account">
               Destination: <Account account={parsed.destinationAccount} />
             </div>
-            <div>
-              <Amount value={formatAmount(parsed.destinationAmount)} />
+            <div className="destination-amount">
+              <Amount value={formatAmount(parsed.destinationAmount as any)} />
             </div>
           </div>
           <div className="detail-section no-border">
diff --git a/src/containers/Transactions/test/BreakDownTab.test.tsx b/src/containers/Transactions/test/BreakDownTab.test.tsx
new file mode 100644
index 000000000..0a0f829d4
--- /dev/null
+++ b/src/containers/Transactions/test/BreakDownTab.test.tsx
@@ -0,0 +1,76 @@
+import { mount } from 'enzyme'
+import { I18nextProvider } from 'react-i18next'
+import { BrowserRouter as Router } from 'react-router-dom'
+
+import EnableAmendment from './mock_data/EnableAmendment.json'
+import Payment from './mock_data/PaymentBreakdown.json'
+import { BreakDownTab } from '../BreakDownTab'
+import i18n from '../../../i18n/testConfig'
+
+describe('BreakdownTab container', () => {
+  const createWrapper = (tx) =>
+    mount(
+      <Router>
+        <I18nextProvider i18n={i18n}>
+          <BreakDownTab data={tx} />
+        </I18nextProvider>
+      </Router>,
+    )
+
+  it('renders EnableAmendment without crashing', () => {
+    const wrapper = createWrapper(EnableAmendment)
+    wrapper.unmount()
+  })
+
+  it('renders breakdown tab information', () => {
+    const wrapper = createWrapper(Payment)
+
+    console.log(Payment)
+
+    expect(wrapper.find('.breakdown-body').length).toBe(1)
+    expect(wrapper.find('.detail-section').length).toBe(3)
+
+    expect(wrapper.find('.source-account').length).toBe(1)
+    expect(wrapper.find('.source-amount').length).toBe(1)
+    expect(wrapper.find('.destination-account').length).toBe(1)
+    expect(wrapper.find('.destination-amount').length).toBe(1)
+
+    expect(
+      wrapper.contains(<div className="title">liquidity_source</div>),
+    ).toBe(true)
+
+    expect(wrapper.contains(<option value="source">USD source</option>)).toBe(
+      true,
+    )
+    expect(
+      wrapper.contains(<option value="destination">XRP destination</option>),
+    ).toBe(true)
+
+    expect(wrapper.contains(<p>graph_dependent_currency</p>)).toBe(true)
+
+    expect(
+      wrapper.contains(<span className="margin-text">amm (98%)</span>),
+    ).toBe(true)
+    expect(
+      wrapper.contains(<span className="margin-text">rippling (0%)</span>),
+    ).toBe(true)
+    expect(
+      wrapper.contains(<span className="margin-text">dex (2%)</span>),
+    ).toBe(true)
+    expect(
+      wrapper.contains(<span className="margin-text">direct (0%)</span>),
+    ).toBe(true)
+
+    expect(wrapper.contains(<div className="title">balance_changes</div>)).toBe(
+      true,
+    )
+    expect(wrapper.contains(<span className="badge dex">dex</span>)).toBe(true)
+    expect(
+      wrapper.contains(<span className="badge rippling">rippling</span>),
+    ).toBe(true)
+    expect(wrapper.contains(<span className="badge amm">amm</span>)).toBe(true)
+
+    console.log(wrapper.debug())
+    wrapper.unmount()
+  })
+})
diff --git a/src/containers/Transactions/test/Transaction.test.tsx b/src/containers/Transactions/test/Transaction.test.tsx
index 31ee2d3e9..f9573dffa 100644
--- a/src/containers/Transactions/test/Transaction.test.tsx
+++ b/src/containers/Transactions/test/Transaction.test.tsx
@@ -135,7 +135,7 @@ describe('Transaction container', () => {
       )
       expect(summary.contains(<TxStatus status="tesSUCCESS" />)).toBe(true)
       expect(wrapper.find('.tabs').length).toBe(1)
-      expect(wrapper.find('a.tab').length).toBe(3)
+      expect(wrapper.find('a.tab').length).toBe(4)
       expect(wrapper.find('a.tab').at(0).props().title).toBe('simple')
       expect(wrapper.find('a.tab').at(1).props().title).toBe('breakdown')
       expect(wrapper.find('a.tab').at(2).props().title).toBe('detailed')
diff --git a/src/containers/Transactions/test/mock_data/PaymentBreakdown.json b/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
new file mode 100644
index 000000000..0c7223914
--- /dev/null
+++ b/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
@@ -0,0 +1,476 @@
+{
+  "hash": "9D6DC95E7B95F7302EBF711F9384B51666E3D98D5B177A6EF0C0250D7F3410D2",
+  "ledger_index": 88213902,
+  "date": 1716575361000,
+  "tx": {
+    "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+    "Amount": "149343627",
+    "DeliverMax": "149343627",
+    "DeliverMin": "146356755",
+    "Destination": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+    "Fee": "12",
+    "Flags": 131072,
+    "LastLedgerSequence": 88213910,
+    "Memos": [
+      {
+        "Memo": {
+          "MemoData": "5472616E73616374696F6E20696E6974696174656420627920786D61676E657469632E6F7267"
+        }
+      }
+    ],
+    "SendMax": {
+      "currency": "USD",
+      "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+      "value": "79.6770766125"
+    },
+    "Sequence": 88196798,
+    "SigningPubKey": "021738EBB3F528A186919463A8B4C31BADDE35B579B1F2F86DF4383547AE7865C9",
+    "SourceTag": 10011010,
+    "TransactionType": "Payment",
+    "TxnSignature": "304402205B749EEE748F7EB49BBA734558ADB257FB83B60C7224A7B6CAD9C910619486F202206EE3C12787A085AEFADC6E053824562A48DB2072E5F19D57C6D41415A5DBE5FB",
+    "ctid": "C542098E000D0000",
+    "date": 1716575361000,
+    "hash": "undefined",
+    "inLedger": "undefined",
+    "ledger_index": "undefined",
+    "meta": {
+      "AffectedNodes": [
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+              "Balance": "56685726",
+              "Flags": 0,
+              "OwnerCount": 13,
+              "Sequence": 75621582
+            },
+            "LedgerEntryType": "AccountRoot",
+            "LedgerIndex": "13CD16752E004F76B468237B2F44DA9CFCA143A28C8EB6686D6A05695C8C3F7B",
+            "PreviousFields": { "Balance": "59581035", "OwnerCount": 14 },
+            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+            "PreviousTxnLgrSeq": 88213895
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+              "Balance": "6284089037",
+              "Flags": 0,
+              "OwnerCount": 4,
+              "Sequence": 88196799
+            },
+            "LedgerEntryType": "AccountRoot",
+            "LedgerIndex": "181A3BAD298B55A47F4F9A0247D638F33BFF7DEDC7A1ECD1392C2ADF9A3F46C9",
+            "PreviousFields": { "Balance": "6134969072", "Sequence": 88196798 },
+            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+            "PreviousTxnLgrSeq": 88213878
+          }
+        },
+        {
+          "DeletedNode": {
+            "FinalFields": {
+              "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+              "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
+              "BookNode": "0",
+              "Flags": 0,
+              "OwnerNode": "0",
+              "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+              "PreviousTxnLgrSeq": 88213895,
+              "Sequence": 75621581,
+              "TakerGets": "0",
+              "TakerPays": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "0"
+              }
+            },
+            "LedgerEntryType": "Offer",
+            "LedgerIndex": "6AB7F7F338C9FFF65323CCAEF7E38FE93D45D6F67E0ABF11822216D1A90DF89E",
+            "PreviousFields": {
+              "TakerGets": "2895309",
+              "TakerPays": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "1.543863643330838"
+              }
+            }
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-222732.5928364204"
+              },
+              "Flags": 16908288,
+              "HighLimit": {
+                "currency": "USD",
+                "issuer": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
+                "value": "0"
+              },
+              "HighNode": "0",
+              "LowLimit": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "0"
+              },
+              "LowNode": "bd7"
+            },
+            "LedgerEntryType": "RippleState",
+            "LedgerIndex": "832F2523220A304ECEB7B2AE3E0D30829ACBCA0A31722FA8D952CC5BE7D9478B",
+            "PreviousFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-222654.5789600612"
+              }
+            },
+            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+            "PreviousTxnLgrSeq": 88213878
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "AMMID": "EF95AD04AF97DF0DD76C5C624F93EF6F5479CDF8F30FAE612F1D434B5D6A914B",
+              "Account": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
+              "Balance": "417539550052",
+              "Flags": 26214400,
+              "OwnerCount": 1,
+              "Sequence": 86795414
+            },
+            "LedgerEntryType": "AccountRoot",
+            "LedgerIndex": "B21B05E69AFB3F98B8D6F8066A69C4B189F3D804D8BE896AE11E60189AAFAD51",
+            "PreviousFields": { "Balance": "417685774720" },
+            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+            "PreviousTxnLgrSeq": 88213878
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-15.22762820406059"
+              },
+              "Flags": 2228224,
+              "HighLimit": {
+                "currency": "USD",
+                "issuer": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+                "value": "1000000000"
+              },
+              "HighNode": "0",
+              "LowLimit": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "0"
+              },
+              "LowNode": "b09"
+            },
+            "LedgerEntryType": "RippleState",
+            "LedgerIndex": "CFCB7153408413FDB9A4B5AD3530680442200FA6F620711A80567DD1A965FD96",
+            "PreviousFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-13.68376456072975"
+              }
+            },
+            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+            "PreviousTxnLgrSeq": 88213895
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Flags": 0,
+              "Owner": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+              "RootIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
+            },
+            "LedgerEntryType": "DirectoryNode",
+            "LedgerIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
+          }
+        },
+        {
+          "ModifiedNode": {
+            "FinalFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-6450000000000000e-26"
+              },
+              "Flags": 2228224,
+              "HighLimit": {
+                "currency": "USD",
+                "issuer": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+                "value": "0"
+              },
+              "HighNode": "0",
+              "LowLimit": {
+                "currency": "USD",
+                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "value": "0"
+              },
+              "LowNode": "bea"
+            },
+            "LedgerEntryType": "RippleState",
+            "LedgerIndex": "DE51B19CCC570DB23F7A831943C8D874FB1928E513EC88090A543E32340AE813",
+            "PreviousFields": {
+              "Balance": {
+                "currency": "USD",
+                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                "value": "-79.6770766125645"
+              }
+            },
+            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+            "PreviousTxnLgrSeq": 88213878
+          }
+        },
+        {
+          "DeletedNode": {
+            "FinalFields": {
+              "ExchangeRate": "4e12f1b0ae6a0fb3",
+              "Flags": 0,
+              "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
+              "TakerGetsCurrency": "0000000000000000000000000000000000000000",
+              "TakerGetsIssuer": "0000000000000000000000000000000000000000",
+              "TakerPaysCurrency": "0000000000000000000000005553440000000000",
+              "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1"
+            },
+            "LedgerEntryType": "DirectoryNode",
+            "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3"
+          }
+        }
+      ],
+      "DeliveredAmount": "149119977",
+      "TransactionIndex": 13,
+      "TransactionResult": "tesSUCCESS",
+      "delivered_amount": "149119977"
+    },
+    "validated": "undefined",
+    "metaData": "undefined",
+    "status": "undefined"
+  },
+  "meta": {
+    "AffectedNodes": [
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+            "Balance": "56685726",
+            "Flags": 0,
+            "OwnerCount": 13,
+            "Sequence": 75621582
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "13CD16752E004F76B468237B2F44DA9CFCA143A28C8EB6686D6A05695C8C3F7B",
+          "PreviousFields": { "Balance": "59581035", "OwnerCount": 14 },
+          "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+          "PreviousTxnLgrSeq": 88213895
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+            "Balance": "6284089037",
+            "Flags": 0,
+            "OwnerCount": 4,
+            "Sequence": 88196799
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "181A3BAD298B55A47F4F9A0247D638F33BFF7DEDC7A1ECD1392C2ADF9A3F46C9",
+          "PreviousFields": { "Balance": "6134969072", "Sequence": 88196798 },
+          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+          "PreviousTxnLgrSeq": 88213878
+        }
+      },
+      {
+        "DeletedNode": {
+          "FinalFields": {
+            "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+            "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
+            "BookNode": "0",
+            "Flags": 0,
+            "OwnerNode": "0",
+            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+            "PreviousTxnLgrSeq": 88213895,
+            "Sequence": 75621581,
+            "TakerGets": "0",
+            "TakerPays": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "0"
+            }
+          },
+          "LedgerEntryType": "Offer",
+          "LedgerIndex": "6AB7F7F338C9FFF65323CCAEF7E38FE93D45D6F67E0ABF11822216D1A90DF89E",
+          "PreviousFields": {
+            "TakerGets": "2895309",
+            "TakerPays": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "1.543863643330838"
+            }
+          }
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-222732.5928364204"
+            },
+            "Flags": 16908288,
+            "HighLimit": {
+              "currency": "USD",
+              "issuer": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
+              "value": "0"
+            },
+            "HighNode": "0",
+            "LowLimit": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "0"
+            },
+            "LowNode": "bd7"
+          },
+          "LedgerEntryType": "RippleState",
+          "LedgerIndex": "832F2523220A304ECEB7B2AE3E0D30829ACBCA0A31722FA8D952CC5BE7D9478B",
+          "PreviousFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-222654.5789600612"
+            }
+          },
+          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+          "PreviousTxnLgrSeq": 88213878
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "AMMID": "EF95AD04AF97DF0DD76C5C624F93EF6F5479CDF8F30FAE612F1D434B5D6A914B",
+            "Account": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
+            "Balance": "417539550052",
+            "Flags": 26214400,
+            "OwnerCount": 1,
+            "Sequence": 86795414
+          },
+          "LedgerEntryType": "AccountRoot",
+          "LedgerIndex": "B21B05E69AFB3F98B8D6F8066A69C4B189F3D804D8BE896AE11E60189AAFAD51",
+          "PreviousFields": { "Balance": "417685774720" },
+          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+          "PreviousTxnLgrSeq": 88213878
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-15.22762820406059"
+            },
+            "Flags": 2228224,
+            "HighLimit": {
+              "currency": "USD",
+              "issuer": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+              "value": "1000000000"
+            },
+            "HighNode": "0",
+            "LowLimit": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "0"
+            },
+            "LowNode": "b09"
+          },
+          "LedgerEntryType": "RippleState",
+          "LedgerIndex": "CFCB7153408413FDB9A4B5AD3530680442200FA6F620711A80567DD1A965FD96",
+          "PreviousFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-13.68376456072975"
+            }
+          },
+          "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
+          "PreviousTxnLgrSeq": 88213895
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Flags": 0,
+            "Owner": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
+            "RootIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
+          },
+          "LedgerEntryType": "DirectoryNode",
+          "LedgerIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
+        }
+      },
+      {
+        "ModifiedNode": {
+          "FinalFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-6450000000000000e-26"
+            },
+            "Flags": 2228224,
+            "HighLimit": {
+              "currency": "USD",
+              "issuer": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+              "value": "0"
+            },
+            "HighNode": "0",
+            "LowLimit": {
+              "currency": "USD",
+              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "value": "0"
+            },
+            "LowNode": "bea"
+          },
+          "LedgerEntryType": "RippleState",
+          "LedgerIndex": "DE51B19CCC570DB23F7A831943C8D874FB1928E513EC88090A543E32340AE813",
+          "PreviousFields": {
+            "Balance": {
+              "currency": "USD",
+              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
+              "value": "-79.6770766125645"
+            }
+          },
+          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
+          "PreviousTxnLgrSeq": 88213878
+        }
+      },
+      {
+        "DeletedNode": {
+          "FinalFields": {
+            "ExchangeRate": "4e12f1b0ae6a0fb3",
+            "Flags": 0,
+            "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
+            "TakerGetsCurrency": "0000000000000000000000000000000000000000",
+            "TakerGetsIssuer": "0000000000000000000000000000000000000000",
+            "TakerPaysCurrency": "0000000000000000000000005553440000000000",
+            "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1"
+          },
+          "LedgerEntryType": "DirectoryNode",
+          "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3"
+        }
+      }
+    ],
+    "DeliveredAmount": "149119977",
+    "TransactionIndex": 13,
+    "TransactionResult": "tesSUCCESS",
+    "delivered_amount": "149119977"
+  }
+}

From 43071102e86ecab47f4ead05a49af2b741162315 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Fri, 24 May 2024 16:45:42 -0400
Subject: [PATCH 77/79] remove debug

---
 src/containers/Transactions/test/BreakDownTab.test.tsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/containers/Transactions/test/BreakDownTab.test.tsx b/src/containers/Transactions/test/BreakDownTab.test.tsx
index 0a0f829d4..4505cf561 100644
--- a/src/containers/Transactions/test/BreakDownTab.test.tsx
+++ b/src/containers/Transactions/test/BreakDownTab.test.tsx
@@ -25,7 +25,7 @@ describe('BreakdownTab container', () => {
   it('renders breakdown tab information', () => {
     const wrapper = createWrapper(Payment)
 
-    console.log(Payment)
+    // console.log(Payment)
 
     expect(wrapper.find('.breakdown-body').length).toBe(1)
     expect(wrapper.find('.detail-section').length).toBe(3)
@@ -70,7 +70,7 @@ describe('BreakdownTab container', () => {
     ).toBe(true)
     expect(wrapper.contains(<span className="badge amm">amm</span>)).toBe(true)
 
-    console.log(wrapper.debug())
+    // console.log(wrapper.debug())
     wrapper.unmount()
   })
 })

From 7d79dc45db5f1763ec6319d7483aeb590300d76d Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Fri, 24 May 2024 16:59:19 -0400
Subject: [PATCH 78/79] revert unwanted change

---
 src/containers/Transactions/BreakDownTab/index.tsx | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index 338c479ad..126b5e57c 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -43,7 +43,11 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
       if (!label) {
         balanceLabel = ''
       }
-      balances.push(<li key={String(index)}>{balanceLabel}</li>)
+      balances.push(
+        <li key={String(index)}>
+          {balanceLabel} <Amount value={formatAmount(amount)} />
+        </li>,
+      )
     })
 
     return <ul>{balances}</ul>

From de34ac952512b43115f56556f6606dc20e4c9b21 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Fri, 24 May 2024 18:37:27 -0400
Subject: [PATCH 79/79] more test

---
 .../Transactions/BreakDownTab/index.tsx       |   6 +-
 .../Transactions/test/BreakDownTab.test.tsx   |  37 +-
 .../test/mock_data/PaymentBreakdown.json      | 466 ++++++------------
 3 files changed, 173 insertions(+), 336 deletions(-)

diff --git a/src/containers/Transactions/BreakDownTab/index.tsx b/src/containers/Transactions/BreakDownTab/index.tsx
index 126b5e57c..697caaa14 100644
--- a/src/containers/Transactions/BreakDownTab/index.tsx
+++ b/src/containers/Transactions/BreakDownTab/index.tsx
@@ -45,7 +45,8 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
       }
       balances.push(
         <li key={String(index)}>
-          {balanceLabel} <Amount value={formatAmount(amount)} />
+          {balanceLabel}{' '}
+          <Amount change_type={type} value={formatAmount(amount)} />
         </li>,
       )
     })
@@ -290,7 +291,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
             <div className="title">{t('liquidity_source')}</div>
             <Cylindars parsed={parsed} account={parsed.sourceAccount} />
           </div>
-          <div className="detail-section">
+          <div className="detail-section balance-changes">
             <div className="title">{t('balance_changes')}</div>
             <Transaction parsed={parsed} account={parsed.sourceAccount} />
           </div>
@@ -302,6 +303,7 @@ export const BreakDownTab: FC<{ data: any }> = ({ data }) => {
         </div>
       )
     } catch (e) {
+      // console.log(e)
       return <h3>{t('incomplete_transaction')}</h3>
     }
   }
diff --git a/src/containers/Transactions/test/BreakDownTab.test.tsx b/src/containers/Transactions/test/BreakDownTab.test.tsx
index 4505cf561..928f7ddf7 100644
--- a/src/containers/Transactions/test/BreakDownTab.test.tsx
+++ b/src/containers/Transactions/test/BreakDownTab.test.tsx
@@ -39,23 +39,23 @@ describe('BreakdownTab container', () => {
       wrapper.contains(<div className="title">liquidity_source</div>),
     ).toBe(true)
 
-    expect(wrapper.contains(<option value="source">USD source</option>)).toBe(
+    expect(wrapper.contains(<option value="source">XRP source</option>)).toBe(
       true,
     )
     expect(
-      wrapper.contains(<option value="destination">XRP destination</option>),
+      wrapper.contains(<option value="destination">USDC destination</option>),
     ).toBe(true)
 
     expect(wrapper.contains(<p>graph_dependent_currency</p>)).toBe(true)
 
     expect(
-      wrapper.contains(<span className="margin-text">amm (98%)</span>),
+      wrapper.contains(<span className="margin-text">amm (100%)</span>),
     ).toBe(true)
     expect(
-      wrapper.contains(<span className="margin-text">rippling (0%)</span>),
+      wrapper.contains(<span className="margin-text">rippling (100%)</span>),
     ).toBe(true)
     expect(
-      wrapper.contains(<span className="margin-text">dex (2%)</span>),
+      wrapper.contains(<span className="margin-text">dex (0%)</span>),
     ).toBe(true)
     expect(
       wrapper.contains(<span className="margin-text">direct (0%)</span>),
@@ -64,13 +64,38 @@ describe('BreakdownTab container', () => {
     expect(wrapper.contains(<div className="title">balance_changes</div>)).toBe(
       true,
     )
-    expect(wrapper.contains(<span className="badge dex">dex</span>)).toBe(true)
+
+    expect(wrapper.contains(<span className="badge dex">dex</span>)).toBe(false)
+    expect(wrapper.contains(<span className="badge dex">direct</span>)).toBe(
+      false,
+    )
     expect(
       wrapper.contains(<span className="badge rippling">rippling</span>),
     ).toBe(true)
     expect(wrapper.contains(<span className="badge amm">amm</span>)).toBe(true)
 
+    const balanceChanges = wrapper.find('.balance-changes')
+    expect(balanceChanges.find('BalanceChange')).toHaveLength(2)
     // console.log(wrapper.debug())
+
+    expect(
+      balanceChanges.contains(
+        <span className="amount-localized">26.79746261</span>,
+      ),
+    ).toBe(true)
+    expect(
+      balanceChanges.contains(
+        <span className="amount-localized">-26.877855</span>,
+      ),
+    ).toBe(true)
+    expect(
+      balanceChanges.contains(
+        <span className="amount-localized">-50.624692</span>,
+      ),
+    ).toBe(true)
+
     wrapper.unmount()
   })
+
+  // console.log(balanceChanges.debug())
 })
diff --git a/src/containers/Transactions/test/mock_data/PaymentBreakdown.json b/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
index 0c7223914..6336382c0 100644
--- a/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
+++ b/src/containers/Transactions/test/mock_data/PaymentBreakdown.json
@@ -1,35 +1,40 @@
 {
-  "hash": "9D6DC95E7B95F7302EBF711F9384B51666E3D98D5B177A6EF0C0250D7F3410D2",
-  "ledger_index": 88213902,
-  "date": 1716575361000,
   "tx": {
-    "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
-    "Amount": "149343627",
-    "DeliverMax": "149343627",
-    "DeliverMin": "146356755",
-    "Destination": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+    "Account": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+    "Amount": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "1000000000000000e2"
+    },
+    "DeliverMax": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "1000000000000000e2"
+    },
+    "DeliverMin": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "25.639817695"
+    },
+    "Destination": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
     "Fee": "12",
     "Flags": 131072,
-    "LastLedgerSequence": 88213910,
+    "LastLedgerSequence": 88214940,
     "Memos": [
       {
         "Memo": {
-          "MemoData": "5472616E73616374696F6E20696E6974696174656420627920786D61676E657469632E6F7267"
+          "MemoData": "53574150205472616E73616374696F6E20696E69746961746564207669612058506D61726B65742E636F6D"
         }
       }
     ],
-    "SendMax": {
-      "currency": "USD",
-      "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-      "value": "79.6770766125"
-    },
-    "Sequence": 88196798,
-    "SigningPubKey": "021738EBB3F528A186919463A8B4C31BADDE35B579B1F2F86DF4383547AE7865C9",
-    "SourceTag": 10011010,
+    "SendMax": "50624692",
+    "Sequence": 88214147,
+    "SigningPubKey": "02F00DADAD94C694359D9FB84163D390CDC418BDA6313A139945C09D2277B39B55",
+    "SourceTag": 20221212,
     "TransactionType": "Payment",
-    "TxnSignature": "304402205B749EEE748F7EB49BBA734558ADB257FB83B60C7224A7B6CAD9C910619486F202206EE3C12787A085AEFADC6E053824562A48DB2072E5F19D57C6D41415A5DBE5FB",
-    "ctid": "C542098E000D0000",
-    "date": 1716575361000,
+    "TxnSignature": "30450221009510B1D5C84A82D870C2827F6A82E6E8AE930778A75D2623D1E8D8280368D6D602207B74F93375275265AB59988748DD1D34F758960EE8FEE5C572A8E84A71205C0F",
+    "ctid": "C5420D9400120000",
+    "date": 1716579292000,
     "hash": "undefined",
     "inLedger": "undefined",
     "ledger_index": "undefined",
@@ -38,218 +43,119 @@
         {
           "ModifiedNode": {
             "FinalFields": {
-              "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-              "Balance": "56685726",
+              "Account": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+              "Balance": "15877383",
               "Flags": 0,
-              "OwnerCount": 13,
-              "Sequence": 75621582
+              "OwnerCount": 1,
+              "Sequence": 88214148
             },
             "LedgerEntryType": "AccountRoot",
-            "LedgerIndex": "13CD16752E004F76B468237B2F44DA9CFCA143A28C8EB6686D6A05695C8C3F7B",
-            "PreviousFields": { "Balance": "59581035", "OwnerCount": 14 },
-            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-            "PreviousTxnLgrSeq": 88213895
-          }
-        },
-        {
-          "ModifiedNode": {
-            "FinalFields": {
-              "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
-              "Balance": "6284089037",
-              "Flags": 0,
-              "OwnerCount": 4,
-              "Sequence": 88196799
-            },
-            "LedgerEntryType": "AccountRoot",
-            "LedgerIndex": "181A3BAD298B55A47F4F9A0247D638F33BFF7DEDC7A1ECD1392C2ADF9A3F46C9",
-            "PreviousFields": { "Balance": "6134969072", "Sequence": 88196798 },
-            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-            "PreviousTxnLgrSeq": 88213878
-          }
-        },
-        {
-          "DeletedNode": {
-            "FinalFields": {
-              "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-              "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
-              "BookNode": "0",
-              "Flags": 0,
-              "OwnerNode": "0",
-              "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-              "PreviousTxnLgrSeq": 88213895,
-              "Sequence": 75621581,
-              "TakerGets": "0",
-              "TakerPays": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-                "value": "0"
-              }
-            },
-            "LedgerEntryType": "Offer",
-            "LedgerIndex": "6AB7F7F338C9FFF65323CCAEF7E38FE93D45D6F67E0ABF11822216D1A90DF89E",
-            "PreviousFields": {
-              "TakerGets": "2895309",
-              "TakerPays": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-                "value": "1.543863643330838"
-              }
-            }
+            "LedgerIndex": "4ACE281E26640B951CB4A23768CA6C7E1B0F602053B3C86A653847FE5A5AA1ED",
+            "PreviousFields": { "Balance": "66502087", "Sequence": 88214147 },
+            "PreviousTxnID": "6947EB21D0A745A96F9B2F9B5BABFFE43CE66AF8488365DBC112BC38F8FAC0EA",
+            "PreviousTxnLgrSeq": 88214779
           }
         },
         {
           "ModifiedNode": {
             "FinalFields": {
               "Balance": {
-                "currency": "USD",
+                "currency": "5553444300000000000000000000000000000000",
                 "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-222732.5928364204"
+                "value": "-26.79746261485543"
               },
-              "Flags": 16908288,
+              "Flags": 2228224,
               "HighLimit": {
-                "currency": "USD",
-                "issuer": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
-                "value": "0"
+                "currency": "5553444300000000000000000000000000000000",
+                "issuer": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+                "value": "775905"
               },
               "HighNode": "0",
               "LowLimit": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "currency": "5553444300000000000000000000000000000000",
+                "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
                 "value": "0"
               },
-              "LowNode": "bd7"
+              "LowNode": "14f"
             },
             "LedgerEntryType": "RippleState",
-            "LedgerIndex": "832F2523220A304ECEB7B2AE3E0D30829ACBCA0A31722FA8D952CC5BE7D9478B",
+            "LedgerIndex": "5F1DFBA426DB53A57ECEFE3EAEB804107DA1B899D4A90C794E577E5082D7C125",
             "PreviousFields": {
               "Balance": {
-                "currency": "USD",
+                "currency": "5553444300000000000000000000000000000000",
                 "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-222654.5789600612"
+                "value": "0"
               }
             },
-            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-            "PreviousTxnLgrSeq": 88213878
+            "PreviousTxnID": "6947EB21D0A745A96F9B2F9B5BABFFE43CE66AF8488365DBC112BC38F8FAC0EA",
+            "PreviousTxnLgrSeq": 88214779
           }
         },
         {
           "ModifiedNode": {
             "FinalFields": {
-              "AMMID": "EF95AD04AF97DF0DD76C5C624F93EF6F5479CDF8F30FAE612F1D434B5D6A914B",
-              "Account": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
-              "Balance": "417539550052",
+              "AMMID": "383669860F36CDD7BF543C0711DD523E35F60ACA22C8AAD8FDDBB2632C4C5821",
+              "Account": "rGHt6LT5v9DVaEAmFzj5ciuxuj41ZjLofs",
+              "Balance": "534441055888",
               "Flags": 26214400,
               "OwnerCount": 1,
-              "Sequence": 86795414
+              "Sequence": 86795379
             },
             "LedgerEntryType": "AccountRoot",
-            "LedgerIndex": "B21B05E69AFB3F98B8D6F8066A69C4B189F3D804D8BE896AE11E60189AAFAD51",
-            "PreviousFields": { "Balance": "417685774720" },
-            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-            "PreviousTxnLgrSeq": 88213878
+            "LedgerIndex": "AEAC617A4934A4E1029581A159AF8EB3356E4DE3C52324D9D5A73C00B8828BCF",
+            "PreviousFields": { "Balance": "534390431196" },
+            "PreviousTxnID": "1FADA966F7F1E8465E17DE2F83216663BE8360B172AC3A0D13FC81757C64AC42",
+            "PreviousTxnLgrSeq": 88214747
           }
         },
         {
           "ModifiedNode": {
             "FinalFields": {
               "Balance": {
-                "currency": "USD",
+                "currency": "5553444300000000000000000000000000000000",
                 "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-15.22762820406059"
-              },
-              "Flags": 2228224,
-              "HighLimit": {
-                "currency": "USD",
-                "issuer": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-                "value": "1000000000"
+                "value": "-284983.085646821"
               },
-              "HighNode": "0",
-              "LowLimit": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-                "value": "0"
-              },
-              "LowNode": "b09"
-            },
-            "LedgerEntryType": "RippleState",
-            "LedgerIndex": "CFCB7153408413FDB9A4B5AD3530680442200FA6F620711A80567DD1A965FD96",
-            "PreviousFields": {
-              "Balance": {
-                "currency": "USD",
-                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-13.68376456072975"
-              }
-            },
-            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-            "PreviousTxnLgrSeq": 88213895
-          }
-        },
-        {
-          "ModifiedNode": {
-            "FinalFields": {
-              "Flags": 0,
-              "Owner": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-              "RootIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
-            },
-            "LedgerEntryType": "DirectoryNode",
-            "LedgerIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
-          }
-        },
-        {
-          "ModifiedNode": {
-            "FinalFields": {
-              "Balance": {
-                "currency": "USD",
-                "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-6450000000000000e-26"
-              },
-              "Flags": 2228224,
+              "Flags": 16908288,
               "HighLimit": {
-                "currency": "USD",
-                "issuer": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+                "currency": "5553444300000000000000000000000000000000",
+                "issuer": "rGHt6LT5v9DVaEAmFzj5ciuxuj41ZjLofs",
                 "value": "0"
               },
               "HighNode": "0",
               "LowLimit": {
-                "currency": "USD",
-                "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+                "currency": "5553444300000000000000000000000000000000",
+                "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
                 "value": "0"
               },
-              "LowNode": "bea"
+              "LowNode": "10a"
             },
             "LedgerEntryType": "RippleState",
-            "LedgerIndex": "DE51B19CCC570DB23F7A831943C8D874FB1928E513EC88090A543E32340AE813",
+            "LedgerIndex": "CDE55A8290DF221A643F51798BE6294A69384066D1ECFB7C2B9BEE2004B38D63",
             "PreviousFields": {
               "Balance": {
-                "currency": "USD",
+                "currency": "5553444300000000000000000000000000000000",
                 "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-                "value": "-79.6770766125645"
+                "value": "-285009.9635018237"
               }
             },
-            "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-            "PreviousTxnLgrSeq": 88213878
-          }
-        },
-        {
-          "DeletedNode": {
-            "FinalFields": {
-              "ExchangeRate": "4e12f1b0ae6a0fb3",
-              "Flags": 0,
-              "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
-              "TakerGetsCurrency": "0000000000000000000000000000000000000000",
-              "TakerGetsIssuer": "0000000000000000000000000000000000000000",
-              "TakerPaysCurrency": "0000000000000000000000005553440000000000",
-              "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1"
-            },
-            "LedgerEntryType": "DirectoryNode",
-            "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3"
+            "PreviousTxnID": "1FADA966F7F1E8465E17DE2F83216663BE8360B172AC3A0D13FC81757C64AC42",
+            "PreviousTxnLgrSeq": 88214747
           }
         }
       ],
-      "DeliveredAmount": "149119977",
-      "TransactionIndex": 13,
+      "DeliveredAmount": {
+        "currency": "5553444300000000000000000000000000000000",
+        "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+        "value": "26.79746261485543"
+      },
+      "TransactionIndex": 18,
       "TransactionResult": "tesSUCCESS",
-      "delivered_amount": "149119977"
+      "delivered_amount": {
+        "currency": "5553444300000000000000000000000000000000",
+        "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+        "value": "26.79746261485543"
+      }
     },
     "validated": "undefined",
     "metaData": "undefined",
@@ -260,217 +166,121 @@
       {
         "ModifiedNode": {
           "FinalFields": {
-            "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-            "Balance": "56685726",
+            "Account": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+            "Balance": "15877383",
             "Flags": 0,
-            "OwnerCount": 13,
-            "Sequence": 75621582
+            "OwnerCount": 1,
+            "Sequence": 88214148
           },
           "LedgerEntryType": "AccountRoot",
-          "LedgerIndex": "13CD16752E004F76B468237B2F44DA9CFCA143A28C8EB6686D6A05695C8C3F7B",
-          "PreviousFields": { "Balance": "59581035", "OwnerCount": 14 },
-          "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-          "PreviousTxnLgrSeq": 88213895
-        }
-      },
-      {
-        "ModifiedNode": {
-          "FinalFields": {
-            "Account": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
-            "Balance": "6284089037",
-            "Flags": 0,
-            "OwnerCount": 4,
-            "Sequence": 88196799
-          },
-          "LedgerEntryType": "AccountRoot",
-          "LedgerIndex": "181A3BAD298B55A47F4F9A0247D638F33BFF7DEDC7A1ECD1392C2ADF9A3F46C9",
-          "PreviousFields": { "Balance": "6134969072", "Sequence": 88196798 },
-          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-          "PreviousTxnLgrSeq": 88213878
-        }
-      },
-      {
-        "DeletedNode": {
-          "FinalFields": {
-            "Account": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-            "BookDirectory": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
-            "BookNode": "0",
-            "Flags": 0,
-            "OwnerNode": "0",
-            "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-            "PreviousTxnLgrSeq": 88213895,
-            "Sequence": 75621581,
-            "TakerGets": "0",
-            "TakerPays": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-              "value": "0"
-            }
-          },
-          "LedgerEntryType": "Offer",
-          "LedgerIndex": "6AB7F7F338C9FFF65323CCAEF7E38FE93D45D6F67E0ABF11822216D1A90DF89E",
-          "PreviousFields": {
-            "TakerGets": "2895309",
-            "TakerPays": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-              "value": "1.543863643330838"
-            }
-          }
+          "LedgerIndex": "4ACE281E26640B951CB4A23768CA6C7E1B0F602053B3C86A653847FE5A5AA1ED",
+          "PreviousFields": { "Balance": "66502087", "Sequence": 88214147 },
+          "PreviousTxnID": "6947EB21D0A745A96F9B2F9B5BABFFE43CE66AF8488365DBC112BC38F8FAC0EA",
+          "PreviousTxnLgrSeq": 88214779
         }
       },
       {
         "ModifiedNode": {
           "FinalFields": {
             "Balance": {
-              "currency": "USD",
+              "currency": "5553444300000000000000000000000000000000",
               "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-222732.5928364204"
+              "value": "-26.79746261485543"
             },
-            "Flags": 16908288,
+            "Flags": 2228224,
             "HighLimit": {
-              "currency": "USD",
-              "issuer": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
-              "value": "0"
+              "currency": "5553444300000000000000000000000000000000",
+              "issuer": "r3GphWJaShhd1RNFnCaGMVyMawYcKHXCvo",
+              "value": "775905"
             },
             "HighNode": "0",
             "LowLimit": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "currency": "5553444300000000000000000000000000000000",
+              "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
               "value": "0"
             },
-            "LowNode": "bd7"
+            "LowNode": "14f"
           },
           "LedgerEntryType": "RippleState",
-          "LedgerIndex": "832F2523220A304ECEB7B2AE3E0D30829ACBCA0A31722FA8D952CC5BE7D9478B",
+          "LedgerIndex": "5F1DFBA426DB53A57ECEFE3EAEB804107DA1B899D4A90C794E577E5082D7C125",
           "PreviousFields": {
             "Balance": {
-              "currency": "USD",
+              "currency": "5553444300000000000000000000000000000000",
               "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-222654.5789600612"
+              "value": "0"
             }
           },
-          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-          "PreviousTxnLgrSeq": 88213878
+          "PreviousTxnID": "6947EB21D0A745A96F9B2F9B5BABFFE43CE66AF8488365DBC112BC38F8FAC0EA",
+          "PreviousTxnLgrSeq": 88214779
         }
       },
       {
         "ModifiedNode": {
           "FinalFields": {
-            "AMMID": "EF95AD04AF97DF0DD76C5C624F93EF6F5479CDF8F30FAE612F1D434B5D6A914B",
-            "Account": "rHUpaqUPbwzKZdzQ8ZQCme18FrgW9pB4am",
-            "Balance": "417539550052",
+            "AMMID": "383669860F36CDD7BF543C0711DD523E35F60ACA22C8AAD8FDDBB2632C4C5821",
+            "Account": "rGHt6LT5v9DVaEAmFzj5ciuxuj41ZjLofs",
+            "Balance": "534441055888",
             "Flags": 26214400,
             "OwnerCount": 1,
-            "Sequence": 86795414
+            "Sequence": 86795379
           },
           "LedgerEntryType": "AccountRoot",
-          "LedgerIndex": "B21B05E69AFB3F98B8D6F8066A69C4B189F3D804D8BE896AE11E60189AAFAD51",
-          "PreviousFields": { "Balance": "417685774720" },
-          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-          "PreviousTxnLgrSeq": 88213878
+          "LedgerIndex": "AEAC617A4934A4E1029581A159AF8EB3356E4DE3C52324D9D5A73C00B8828BCF",
+          "PreviousFields": { "Balance": "534390431196" },
+          "PreviousTxnID": "1FADA966F7F1E8465E17DE2F83216663BE8360B172AC3A0D13FC81757C64AC42",
+          "PreviousTxnLgrSeq": 88214747
         }
       },
       {
         "ModifiedNode": {
           "FinalFields": {
             "Balance": {
-              "currency": "USD",
+              "currency": "5553444300000000000000000000000000000000",
               "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-15.22762820406059"
-            },
-            "Flags": 2228224,
-            "HighLimit": {
-              "currency": "USD",
-              "issuer": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-              "value": "1000000000"
-            },
-            "HighNode": "0",
-            "LowLimit": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
-              "value": "0"
+              "value": "-284983.085646821"
             },
-            "LowNode": "b09"
-          },
-          "LedgerEntryType": "RippleState",
-          "LedgerIndex": "CFCB7153408413FDB9A4B5AD3530680442200FA6F620711A80567DD1A965FD96",
-          "PreviousFields": {
-            "Balance": {
-              "currency": "USD",
-              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-13.68376456072975"
-            }
-          },
-          "PreviousTxnID": "BE19A57B91862555B86A59A6331E2B56D3156CF18C5E1F74340D3CAFEE909D2F",
-          "PreviousTxnLgrSeq": 88213895
-        }
-      },
-      {
-        "ModifiedNode": {
-          "FinalFields": {
-            "Flags": 0,
-            "Owner": "rsFaWztpAqZKoBSLTuhrhYfBV4nwYg7TFP",
-            "RootIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
-          },
-          "LedgerEntryType": "DirectoryNode",
-          "LedgerIndex": "D838BBCEB616863B8BDCF5F5A638245459F3697855EB03F80BD09DA6F256D011"
-        }
-      },
-      {
-        "ModifiedNode": {
-          "FinalFields": {
-            "Balance": {
-              "currency": "USD",
-              "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-6450000000000000e-26"
-            },
-            "Flags": 2228224,
+            "Flags": 16908288,
             "HighLimit": {
-              "currency": "USD",
-              "issuer": "rBrnBoVq2ZBrq53ns1pNCCnsnhFizf59Lj",
+              "currency": "5553444300000000000000000000000000000000",
+              "issuer": "rGHt6LT5v9DVaEAmFzj5ciuxuj41ZjLofs",
               "value": "0"
             },
             "HighNode": "0",
             "LowLimit": {
-              "currency": "USD",
-              "issuer": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",
+              "currency": "5553444300000000000000000000000000000000",
+              "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
               "value": "0"
             },
-            "LowNode": "bea"
+            "LowNode": "10a"
           },
           "LedgerEntryType": "RippleState",
-          "LedgerIndex": "DE51B19CCC570DB23F7A831943C8D874FB1928E513EC88090A543E32340AE813",
+          "LedgerIndex": "CDE55A8290DF221A643F51798BE6294A69384066D1ECFB7C2B9BEE2004B38D63",
           "PreviousFields": {
             "Balance": {
-              "currency": "USD",
+              "currency": "5553444300000000000000000000000000000000",
               "issuer": "rrrrrrrrrrrrrrrrrrrrBZbvji",
-              "value": "-79.6770766125645"
+              "value": "-285009.9635018237"
             }
           },
-          "PreviousTxnID": "3CFE806B69A8FA91F8965B905BDCDD614B89AF8DC4B8E941D994F00CC1E57BBC",
-          "PreviousTxnLgrSeq": 88213878
-        }
-      },
-      {
-        "DeletedNode": {
-          "FinalFields": {
-            "ExchangeRate": "4e12f1b0ae6a0fb3",
-            "Flags": 0,
-            "RootIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3",
-            "TakerGetsCurrency": "0000000000000000000000000000000000000000",
-            "TakerGetsIssuer": "0000000000000000000000000000000000000000",
-            "TakerPaysCurrency": "0000000000000000000000005553440000000000",
-            "TakerPaysIssuer": "0A20B3C85F482532A9578DBB3950B85CA06594D1"
-          },
-          "LedgerEntryType": "DirectoryNode",
-          "LedgerIndex": "DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4E12F1B0AE6A0FB3"
+          "PreviousTxnID": "1FADA966F7F1E8465E17DE2F83216663BE8360B172AC3A0D13FC81757C64AC42",
+          "PreviousTxnLgrSeq": 88214747
         }
       }
     ],
-    "DeliveredAmount": "149119977",
-    "TransactionIndex": 13,
+    "DeliveredAmount": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "26.79746261485543"
+    },
+    "TransactionIndex": 18,
     "TransactionResult": "tesSUCCESS",
-    "delivered_amount": "149119977"
-  }
+    "delivered_amount": {
+      "currency": "5553444300000000000000000000000000000000",
+      "issuer": "rcEGREd8NmkKRE8GE424sksyt1tJVFZwu",
+      "value": "26.79746261485543"
+    }
+  },
+  "hash": "2C9C11811DFC51263267F7D5AA81C807876B905A99AE52321C582D8E186B7E12",
+  "ledger_index": 88214932,
+  "date": 1716579292000
 }