diff --git a/.build/jsonSchema.ts b/.build/jsonSchema.ts index d29ef7920..dd66d984c 100644 --- a/.build/jsonSchema.ts +++ b/.build/jsonSchema.ts @@ -24,6 +24,7 @@ const MERMAID_CONFIG_DIAGRAM_KEYS = [ 'gitGraph', 'c4', 'sankey', + 'packet', ] as const; /** diff --git a/.esbuild/build.ts b/.esbuild/build.ts index 3e829d719..3c87f9d62 100644 --- a/.esbuild/build.ts +++ b/.esbuild/build.ts @@ -1,8 +1,8 @@ import { build } from 'esbuild'; import { mkdir, writeFile } from 'node:fs/promises'; -import { MermaidBuildOptions, defaultOptions, getBuildConfig } from './util.js'; import { packageOptions } from '../.build/common.js'; import { generateLangium } from '../.build/generateLangium.js'; +import { MermaidBuildOptions, defaultOptions, getBuildConfig } from './util.js'; const shouldVisualize = process.argv.includes('--visualize'); @@ -56,7 +56,7 @@ const main = async () => { await generateLangium(); await mkdir('stats').catch(() => {}); const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[]; - // it should build `parser` before `mermaid` because it's a dependecy + // it should build `parser` before `mermaid` because it's a dependency for (const pkg of packageNames) { await buildPackage(pkg).catch(handler); } diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index c23dc88ba..b8232b8c0 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -18,7 +18,7 @@ permissions: env: # For PRs and MergeQueues, the target commit is used, and for push events, github.event.previous is used. - targetHash: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.before }} + targetHash: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || (github.event.before == '0000000000000000000000000000000000000000' && 'develop' || github.event.before) }} jobs: cache: @@ -30,7 +30,6 @@ jobs: uses: actions/setup-node@v4 with: node-version: 18.x - - name: Cache snapshots id: cache-snapshot uses: actions/cache@v4 diff --git a/__mocks__/c4Renderer.js b/__mocks__/c4Renderer.js deleted file mode 100644 index 576d5d863..000000000 --- a/__mocks__/c4Renderer.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Mocked C4Context diagram renderer - */ - -import { vi } from 'vitest'; - -export const drawPersonOrSystemArray = vi.fn(); -export const drawBoundary = vi.fn(); - -export const setConf = vi.fn(); - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - drawPersonOrSystemArray, - drawBoundary, - setConf, - draw, -}; diff --git a/__mocks__/classRenderer-v2.js b/__mocks__/classRenderer-v2.js deleted file mode 100644 index 1ad95806f..000000000 --- a/__mocks__/classRenderer-v2.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Mocked class diagram v2 renderer - */ - -import { vi } from 'vitest'; - -export const setConf = vi.fn(); - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - setConf, - draw, -}; diff --git a/__mocks__/classRenderer.js b/__mocks__/classRenderer.js deleted file mode 100644 index 1c20de4b1..000000000 --- a/__mocks__/classRenderer.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Mocked class diagram renderer - */ - -import { vi } from 'vitest'; - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - draw, -}; diff --git a/__mocks__/dagre-d3.ts b/__mocks__/dagre-d3.ts deleted file mode 100644 index bf6d341dc..000000000 --- a/__mocks__/dagre-d3.ts +++ /dev/null @@ -1 +0,0 @@ -// DO NOT delete this file. It is used by vitest to mock the dagre-d3 module. diff --git a/__mocks__/entity-decode/browser.ts b/__mocks__/entity-decode/browser.ts deleted file mode 100644 index bd82d79fd..000000000 --- a/__mocks__/entity-decode/browser.ts +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function (txt: string) { - return txt; -}; diff --git a/__mocks__/erRenderer.js b/__mocks__/erRenderer.js deleted file mode 100644 index 845d641f7..000000000 --- a/__mocks__/erRenderer.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Mocked er diagram renderer - */ - -import { vi } from 'vitest'; - -export const setConf = vi.fn(); - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - setConf, - draw, -}; diff --git a/__mocks__/flowRenderer-v2.js b/__mocks__/flowRenderer-v2.js deleted file mode 100644 index 89cc86031..000000000 --- a/__mocks__/flowRenderer-v2.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Mocked flow (flowchart) diagram v2 renderer - */ - -import { vi } from 'vitest'; - -export const setConf = vi.fn(); -export const addVertices = vi.fn(); -export const addEdges = vi.fn(); -export const getClasses = vi.fn().mockImplementation(() => { - return {}; -}); - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - setConf, - addVertices, - addEdges, - getClasses, - draw, -}; diff --git a/__mocks__/ganttRenderer.js b/__mocks__/ganttRenderer.js deleted file mode 100644 index 957249832..000000000 --- a/__mocks__/ganttRenderer.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Mocked gantt diagram renderer - */ - -import { vi } from 'vitest'; - -export const setConf = vi.fn(); - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - setConf, - draw, -}; diff --git a/__mocks__/gitGraphRenderer.js b/__mocks__/gitGraphRenderer.js deleted file mode 100644 index 1daa82ca4..000000000 --- a/__mocks__/gitGraphRenderer.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Mocked git (graph) diagram renderer - */ - -import { vi } from 'vitest'; - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - draw, -}; diff --git a/__mocks__/journeyRenderer.js b/__mocks__/journeyRenderer.js deleted file mode 100644 index 2bc77c0b1..000000000 --- a/__mocks__/journeyRenderer.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Mocked pie (picChart) diagram renderer - */ - -import { vi } from 'vitest'; -export const setConf = vi.fn(); - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - setConf, - draw, -}; diff --git a/__mocks__/pieRenderer.ts b/__mocks__/pieRenderer.ts deleted file mode 100644 index 439800f8c..000000000 --- a/__mocks__/pieRenderer.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Mocked pie (picChart) diagram renderer - */ -import { vi } from 'vitest'; - -const draw = vi.fn().mockImplementation(() => ''); - -export const renderer = { draw }; diff --git a/__mocks__/requirementRenderer.js b/__mocks__/requirementRenderer.js deleted file mode 100644 index 48d8997ac..000000000 --- a/__mocks__/requirementRenderer.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Mocked requirement diagram renderer - */ - -import { vi } from 'vitest'; - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - draw, -}; diff --git a/__mocks__/sankeyRenderer.js b/__mocks__/sankeyRenderer.js deleted file mode 100644 index 76324c93f..000000000 --- a/__mocks__/sankeyRenderer.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Mocked Sankey diagram renderer - */ - -import { vi } from 'vitest'; - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - draw, -}; diff --git a/__mocks__/sequenceRenderer.js b/__mocks__/sequenceRenderer.js deleted file mode 100644 index 11080c6bb..000000000 --- a/__mocks__/sequenceRenderer.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Mocked sequence diagram renderer - */ - -import { vi } from 'vitest'; - -export const bounds = vi.fn(); -export const drawActors = vi.fn(); -export const drawActorsPopup = vi.fn(); - -export const setConf = vi.fn(); - -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - bounds, - drawActors, - drawActorsPopup, - setConf, - draw, -}; diff --git a/__mocks__/stateRenderer-v2.js b/__mocks__/stateRenderer-v2.js deleted file mode 100644 index a2d103b50..000000000 --- a/__mocks__/stateRenderer-v2.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Mocked state diagram v2 renderer - */ - -import { vi } from 'vitest'; - -export const setConf = vi.fn(); -export const getClasses = vi.fn().mockImplementation(() => { - return {}; -}); -export const stateDomId = vi.fn().mockImplementation(() => { - return 'mocked-stateDiagram-stateDomId'; -}); -export const draw = vi.fn().mockImplementation(() => { - return ''; -}); - -export default { - setConf, - getClasses, - draw, -}; diff --git a/applitools.config.js b/applitools.config.js deleted file mode 100644 index 4cf02220a..000000000 --- a/applitools.config.js +++ /dev/null @@ -1,19 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { defineConfig } = require('cypress'); - -module.exports = defineConfig({ - testConcurrency: 1, - browser: [ - // Add browsers with different viewports - // { width: 800, height: 600, name: 'chrome' }, - // { width: 700, height: 500, name: 'firefox' }, - // { width: 1600, height: 1200, name: 'ie11' }, - // { width: 1024, height: 768, name: 'edgechromium' }, - // { width: 800, height: 600, name: 'safari' }, - // // Add mobile emulation devices in Portrait mode - // { deviceName: 'iPhone X', screenOrientation: 'portrait' }, - // { deviceName: 'Pixel 2', screenOrientation: 'portrait' }, - ], - // set batch name to the configuration - // batchName: `Mermaid ${process.env.APPLI_BRANCH ?? "'no APPLI_BRANCH set'"}`, -}); diff --git a/cypress.config.cjs b/cypress.config.cjs deleted file mode 100644 index 33633920a..000000000 --- a/cypress.config.cjs +++ /dev/null @@ -1,32 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ - -const { defineConfig } = require('cypress'); -const { addMatchImageSnapshotPlugin } = require('cypress-image-snapshot/plugin'); -const coverage = require('@cypress/code-coverage/task'); - -module.exports = defineConfig({ - projectId: 'n2sma2', - viewportWidth: 1440, - viewportHeight: 1024, - e2e: { - specPattern: 'cypress/integration/**/*.{js,ts}', - setupNodeEvents(on, config) { - coverage(on, config); - on('before:browser:launch', (browser = {}, launchOptions) => { - if (browser.name === 'chrome' && browser.isHeadless) { - launchOptions.args.push('--window-size=1440,1024', '--force-device-scale-factor=1'); - } - return launchOptions; - }); - addMatchImageSnapshotPlugin(on, config); - // copy any needed variables from process.env to config.env - config.env.useAppli = process.env.USE_APPLI ? true : false; - - // do not forget to return the changed config object! - return config; - }, - }, - video: false, -}); - -require('@applitools/eyes-cypress')(module); diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 000000000..4182d92a8 --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,30 @@ +import { defineConfig } from 'cypress'; +import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin'; +import coverage from '@cypress/code-coverage/task'; +import eyesPlugin from '@applitools/eyes-cypress'; +export default eyesPlugin( + defineConfig({ + projectId: 'n2sma2', + viewportWidth: 1440, + viewportHeight: 1024, + e2e: { + specPattern: 'cypress/integration/**/*.{js,ts}', + setupNodeEvents(on, config) { + coverage(on, config); + on('before:browser:launch', (browser, launchOptions) => { + if (browser.name === 'chrome' && browser.isHeadless) { + launchOptions.args.push('--window-size=1440,1024', '--force-device-scale-factor=1'); + } + return launchOptions; + }); + addMatchImageSnapshotPlugin(on, config); + // copy any needed variables from process.env to config.env + config.env.useAppli = process.env.USE_APPLI ? true : false; + + // do not forget to return the changed config object! + return config; + }, + }, + video: false, + }) +); diff --git a/cypress/integration/rendering/gantt.spec.js b/cypress/integration/rendering/gantt.spec.js index 73ff4ee00..4abde9d44 100644 --- a/cypress/integration/rendering/gantt.spec.js +++ b/cypress/integration/rendering/gantt.spec.js @@ -583,4 +583,106 @@ describe('Gantt diagram', () => { {} ); }); + + it("should render when there's a semicolon in the title", () => { + imgSnapshotTest( + ` + gantt + title ;Gantt With a Semicolon in the Title + dateFormat YYYY-MM-DD + section Section + A task :a1, 2014-01-01, 30d + Another task :after a1 , 20d + section Another + Task in sec :2014-01-12 , 12d + another task : 24d + `, + {} + ); + }); + + it("should render when there's a semicolon in a section is true", () => { + imgSnapshotTest( + ` + gantt + title Gantt Digram + dateFormat YYYY-MM-DD + section ;Section With a Semicolon + A task :a1, 2014-01-01, 30d + Another task :after a1 , 20d + section Another + Task in sec :2014-01-12 , 12d + another task : 24d + `, + {} + ); + }); + + it("should render when there's a semicolon in the task data", () => { + imgSnapshotTest( + ` + gantt + title Gantt Digram + dateFormat YYYY-MM-DD + section Section + ;A task with a semiclon :a1, 2014-01-01, 30d + Another task :after a1 , 20d + section Another + Task in sec :2014-01-12 , 12d + another task : 24d + `, + {} + ); + }); + + it("should render when there's a hashtag in the title", () => { + imgSnapshotTest( + ` + gantt + title #Gantt With a Hashtag in the Title + dateFormat YYYY-MM-DD + section Section + A task :a1, 2014-01-01, 30d + Another task :after a1 , 20d + section Another + Task in sec :2014-01-12 , 12d + another task : 24d + `, + {} + ); + }); + + it("should render when there's a hashtag in a section is true", () => { + imgSnapshotTest( + ` + gantt + title Gantt Digram + dateFormat YYYY-MM-DD + section #Section With a Hashtag + A task :a1, 2014-01-01, 30d + Another task :after a1 , 20d + section Another + Task in sec :2014-01-12 , 12d + another task : 24d + `, + {} + ); + }); + + it("should render when there's a hashtag in the task data", () => { + imgSnapshotTest( + ` + gantt + title Gantt Digram + dateFormat YYYY-MM-DD + section Section + #A task with a hashtag :a1, 2014-01-01, 30d + Another task :after a1 , 20d + section Another + Task in sec :2014-01-12 , 12d + another task : 24d + `, + {} + ); + }); }); diff --git a/cypress/integration/rendering/packet.spec.ts b/cypress/integration/rendering/packet.spec.ts new file mode 100644 index 000000000..61555ea53 --- /dev/null +++ b/cypress/integration/rendering/packet.spec.ts @@ -0,0 +1,67 @@ +import { imgSnapshotTest } from '../../helpers/util'; + +describe('packet structure', () => { + it('should render a simple packet diagram', () => { + imgSnapshotTest( + `packet-beta + title Hello world + 0-10: "hello" +` + ); + }); + + it('should render a complex packet diagram', () => { + imgSnapshotTest( + `packet-beta + 0-15: "Source Port" + 16-31: "Destination Port" + 32-63: "Sequence Number" + 64-95: "Acknowledgment Number" + 96-99: "Data Offset" + 100-105: "Reserved" + 106: "URG" + 107: "ACK" + 108: "PSH" + 109: "RST" + 110: "SYN" + 111: "FIN" + 112-127: "Window" + 128-143: "Checksum" + 144-159: "Urgent Pointer" + 160-191: "(Options and Padding)" + 192-223: "data" + ` + ); + }); + + it('should render a complex packet diagram with showBits false', () => { + imgSnapshotTest( + ` + --- + title: "Packet Diagram" + config: + packet: + showBits: false + --- + packet-beta + 0-15: "Source Port" + 16-31: "Destination Port" + 32-63: "Sequence Number" + 64-95: "Acknowledgment Number" + 96-99: "Data Offset" + 100-105: "Reserved" + 106: "URG" + 107: "ACK" + 108: "PSH" + 109: "RST" + 110: "SYN" + 111: "FIN" + 112-127: "Window" + 128-143: "Checksum" + 144-159: "Urgent Pointer" + 160-191: "(Options and Padding)" + 192-223: "data" + ` + ); + }); +}); diff --git a/cypress/integration/rendering/sequencediagram.spec.js b/cypress/integration/rendering/sequencediagram.spec.js index 27e03da9c..10432f057 100644 --- a/cypress/integration/rendering/sequencediagram.spec.js +++ b/cypress/integration/rendering/sequencediagram.spec.js @@ -792,6 +792,34 @@ context('Sequence diagram', () => { }); }); context('links', () => { + it('should support actor links', () => { + renderGraph( + ` + sequenceDiagram + link Alice: Dashboard @ https://dashboard.contoso.com/alice + link Alice: Wiki @ https://wiki.contoso.com/alice + link John: Dashboard @ https://dashboard.contoso.com/john + link John: Wiki @ https://wiki.contoso.com/john + Alice->>John: Hello John
+ John-->>Alice: Great

day! + `, + { securityLevel: 'loose' } + ); + cy.get('#actor0_popup').should((popupMenu) => { + const style = popupMenu.attr('style'); + expect(style).to.undefined; + }); + cy.get('#root-0').click(); + cy.get('#actor0_popup').should((popupMenu) => { + const style = popupMenu.attr('style'); + expect(style).to.match(/^display: block;$/); + }); + cy.get('#root-0').click(); + cy.get('#actor0_popup').should((popupMenu) => { + const style = popupMenu.attr('style'); + expect(style).to.match(/^display: none;$/); + }); + }); it('should support actor links and properties EXPERIMENTAL: USE WITH CAUTION', () => { //Be aware that the syntax for "properties" is likely to be changed. imgSnapshotTest( diff --git a/demos/dev/example.html b/demos/dev/example.html index adb6da331..4ece7efa8 100644 --- a/demos/dev/example.html +++ b/demos/dev/example.html @@ -3,10 +3,24 @@ Mermaid development page + -
info
-
 graph TB
       a --> b
@@ -15,22 +29,35 @@ graph TB
       c --> d
     
-
+
+ Type code to view diagram: +
+ +
+
+
info
diff --git a/demos/gantt.html b/demos/gantt.html index 88f52ef5c..9c82371ab 100644 --- a/demos/gantt.html +++ b/demos/gantt.html @@ -30,6 +30,21 @@
+
+      gantt
+        title #; Gantt Diagrams Allow Semicolons and Hashtags #;!
+        accTitle: A simple sample gantt diagram
+        accDescr: 2 sections with 2 tasks each, from 2014
+        dateFormat  YYYY-MM-DD
+        section #;Section
+        #;A task           :a1, 2014-01-01, 30d
+        #;Another task     :after a1  , 20d
+        section #;Another
+        Task in sec      :2014-01-12  , 12d
+        another task      : 24d
+    
+
+
     gantt
       title Airworks roadmap
diff --git a/demos/index.html b/demos/index.html
index c634aad2d..11fa14436 100644
--- a/demos/index.html
+++ b/demos/index.html
@@ -81,6 +81,9 @@
       
  • Sankey

  • +
  • +

    Packet

    +
  • diff --git a/demos/packet.html b/demos/packet.html new file mode 100644 index 000000000..f332dcf8c --- /dev/null +++ b/demos/packet.html @@ -0,0 +1,141 @@ + + + + + + Mermaid Quick Test Page + + + + + +

    Packet diagram demo

    + +
    +
    +      packet-beta
    +        0-15: "Source Port"
    +        16-31: "Destination Port"
    +        32-63: "Sequence Number"
    +        64-95: "Acknowledgment Number"
    +        96-99: "Data Offset"
    +        100-105: "Reserved"
    +        106: "URG"
    +        107: "ACK"
    +        108: "PSH"
    +        109: "RST"
    +        110: "SYN"
    +        111: "FIN"
    +        112-127: "Window"
    +        128-143: "Checksum"
    +        144-159: "Urgent Pointer"
    +        160-191: "(Options and Padding)"
    +        192-223: "data"
    +    
    + +
    +      ---
    +      config:
    +        packet:
    +          showBits: false
    +      ---
    +      packet-beta
    +        0-15: "Source Port"
    +        16-31: "Destination Port"
    +        32-63: "Sequence Number"
    +        64-95: "Acknowledgment Number"
    +        96-99: "Data Offset"
    +        100-105: "Reserved"
    +        106: "URG"
    +        107: "ACK"
    +        108: "PSH"
    +        109: "RST"
    +        110: "SYN"
    +        111: "FIN"
    +        112-127: "Window"
    +        128-143: "Checksum"
    +        144-159: "Urgent Pointer"
    +        160-191: "(Options and Padding)"
    +        192-223: "data"
    +    
    + +
    +      ---
    +      config:
    +        theme: forest
    +      ---
    +      packet-beta
    +        title Forest theme
    +        0-15: "Source Port"
    +        16-31: "Destination Port"
    +        32-63: "Sequence Number"
    +        64-95: "Acknowledgment Number"
    +        96-99: "Data Offset"
    +        100-105: "Reserved"
    +        106: "URG"
    +        107: "ACK"
    +        108: "PSH"
    +        109: "RST"
    +        110: "SYN"
    +        111: "FIN"
    +        112-127: "Window"
    +        128-143: "Checksum"
    +        144-159: "Urgent Pointer"
    +        160-191: "(Options and Padding)"
    +        192-223: "data"
    +    
    + +
    +      ---
    +      config:
    +        theme: dark
    +      ---
    +      packet-beta
    +        title Dark theme
    +        0-15: "Source Port"
    +        16-31: "Destination Port"
    +        32-63: "Sequence Number"
    +        64-95: "Acknowledgment Number"
    +        96-99: "Data Offset"
    +        100-105: "Reserved"
    +        106: "URG"
    +        107: "ACK"
    +        108: "PSH"
    +        109: "RST"
    +        110: "SYN"
    +        111: "FIN"
    +        112-127: "Window"
    +        128-143: "Checksum"
    +        144-159: "Urgent Pointer"
    +        160-191: "(Options and Padding)"
    +        192-223: "data"
    +    
    +
    + + + + + diff --git a/demos/sequence.html b/demos/sequence.html index b2733a384..8eecae610 100644 --- a/demos/sequence.html +++ b/demos/sequence.html @@ -23,6 +23,10 @@ participant Alice participant Bob participant John as John
    Second Line + link Alice: Dashboard @ https://dashboard.contoso.com/alice + link Alice: Wiki @ https://wiki.contoso.com/alice + link John: Dashboard @ https://dashboard.contoso.com/john + link John: Wiki @ https://wiki.contoso.com/john autonumber 10 10 rect rgb(200, 220, 100) rect rgb(200, 255, 200) @@ -62,6 +66,26 @@

    +    ---
    +    title: With forced menus
    +    config:
    +      sequence:
    +        forceMenus: true
    +    ---
    +    sequenceDiagram
    +      participant Alice
    +      participant John
    +      link Alice: Dashboard @ https://dashboard.contoso.com/alice
    +      link Alice: Wiki @ https://wiki.contoso.com/alice
    +      link John: Dashboard @ https://dashboard.contoso.com/john
    +      link John: Wiki @ https://wiki.contoso.com/john
    +      Alice->>John: Hello John, how are you?
    +      John-->>Alice: Great!
    +      Alice-)John: See you later!
    +  
    +
    +
         sequenceDiagram
           accTitle: Sequence diagram title is here
           accDescr: Hello friends
    diff --git a/docs/config/setup/modules/defaultConfig.md b/docs/config/setup/modules/defaultConfig.md
    index 7a9b891c4..d3495bc0c 100644
    --- a/docs/config/setup/modules/defaultConfig.md
    +++ b/docs/config/setup/modules/defaultConfig.md
    @@ -14,7 +14,7 @@
     
     #### Defined in
     
    -[defaultConfig.ts:272](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L272)
    +[defaultConfig.ts:275](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L275)
     
     ---
     
    diff --git a/docs/syntax/packet.md b/docs/syntax/packet.md
    new file mode 100644
    index 000000000..5cd0b5638
    --- /dev/null
    +++ b/docs/syntax/packet.md
    @@ -0,0 +1,141 @@
    +> **Warning**
    +>
    +> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT.
    +>
    +> ## Please edit the corresponding file in [/packages/mermaid/src/docs/syntax/packet.md](../../packages/mermaid/src/docs/syntax/packet.md).
    +
    +# Packet Diagram (v\+)
    +
    +## Introduction
    +
    +A packet diagram is a visual representation used to illustrate the structure and contents of a network packet. Network packets are the fundamental units of data transferred over a network.
    +
    +## Usage
    +
    +This diagram type is particularly useful for network engineers, educators, and students who require a clear and concise way to represent the structure of network packets.
    +
    +## Syntax
    +
    +```md
    +packet-beta
    +start: "Block name" %% Single-bit block
    +start-end: "Block name" %% Multi-bit blocks
    +... More Fields ...
    +```
    +
    +## Examples
    +
    +```mermaid-example
    +---
    +title: "TCP Packet"
    +---
    +packet-beta
    +0-15: "Source Port"
    +16-31: "Destination Port"
    +32-63: "Sequence Number"
    +64-95: "Acknowledgment Number"
    +96-99: "Data Offset"
    +100-105: "Reserved"
    +106: "URG"
    +107: "ACK"
    +108: "PSH"
    +109: "RST"
    +110: "SYN"
    +111: "FIN"
    +112-127: "Window"
    +128-143: "Checksum"
    +144-159: "Urgent Pointer"
    +160-191: "(Options and Padding)"
    +192-255: "Data (variable length)"
    +```
    +
    +```mermaid
    +---
    +title: "TCP Packet"
    +---
    +packet-beta
    +0-15: "Source Port"
    +16-31: "Destination Port"
    +32-63: "Sequence Number"
    +64-95: "Acknowledgment Number"
    +96-99: "Data Offset"
    +100-105: "Reserved"
    +106: "URG"
    +107: "ACK"
    +108: "PSH"
    +109: "RST"
    +110: "SYN"
    +111: "FIN"
    +112-127: "Window"
    +128-143: "Checksum"
    +144-159: "Urgent Pointer"
    +160-191: "(Options and Padding)"
    +192-255: "Data (variable length)"
    +```
    +
    +```mermaid-example
    +packet-beta
    +title UDP Packet
    +0-15: "Source Port"
    +16-31: "Destination Port"
    +32-47: "Length"
    +48-63: "Checksum"
    +64-95: "Data (variable length)"
    +```
    +
    +```mermaid
    +packet-beta
    +title UDP Packet
    +0-15: "Source Port"
    +16-31: "Destination Port"
    +32-47: "Length"
    +48-63: "Checksum"
    +64-95: "Data (variable length)"
    +```
    +
    +## Details of Syntax
    +
    +- **Ranges**: Each line after the title represents a different field in the packet. The range (e.g., `0-15`) indicates the bit positions in the packet.
    +- **Field Description**: A brief description of what the field represents, enclosed in quotes.
    +
    +## Configuration
    +
    +Please refer to the [configuration](/config/schema-docs/config-defs-packet-diagram-config.html) guide for details.
    +
    +
    diff --git a/package.json b/package.json
    index 65ffdfc27..aa9b962c5 100644
    --- a/package.json
    +++ b/package.json
    @@ -61,11 +61,11 @@
         ]
       },
       "devDependencies": {
    -    "@applitools/eyes-cypress": "^3.33.1",
    +    "@applitools/eyes-cypress": "^3.40.6",
         "@commitlint/cli": "^17.6.1",
         "@commitlint/config-conventional": "^17.6.1",
         "@cspell/eslint-plugin": "^6.31.1",
    -    "@cypress/code-coverage": "^3.10.7",
    +    "@cypress/code-coverage": "^3.12.18",
         "@rollup/plugin-typescript": "^11.1.1",
         "@types/cors": "^2.8.13",
         "@types/eslint": "^8.37.0",
    @@ -86,7 +86,7 @@
         "chokidar": "^3.5.3",
         "concurrently": "^8.0.1",
         "cors": "^2.8.5",
    -    "cypress": "^12.10.0",
    +    "cypress": "^12.17.4",
         "cypress-image-snapshot": "^4.0.1",
         "esbuild": "^0.19.0",
         "eslint": "^8.47.0",
    diff --git a/packages/mermaid/src/Diagram.ts b/packages/mermaid/src/Diagram.ts
    index b56697e9d..86e7bf159 100644
    --- a/packages/mermaid/src/Diagram.ts
    +++ b/packages/mermaid/src/Diagram.ts
    @@ -1,10 +1,8 @@
     import * as configApi from './config.js';
    -import { log } from './logger.js';
     import { getDiagram, registerDiagram } from './diagram-api/diagramAPI.js';
     import { detectType, getDiagramLoader } from './diagram-api/detectType.js';
     import { UnknownDiagramError } from './errors.js';
     import { encodeEntities } from './utils.js';
    -
     import type { DetailedError } from './utils.js';
     import type { DiagramDefinition, DiagramMetadata } from './diagram-api/types.js';
     
    @@ -15,51 +13,45 @@ export type ParseErrorFunction = (err: string | DetailedError | unknown, hash?:
      * @privateRemarks This is exported as part of the public mermaidAPI.
      */
     export class Diagram {
    -  type = 'graph';
    -  parser: DiagramDefinition['parser'];
    -  renderer: DiagramDefinition['renderer'];
    -  db: DiagramDefinition['db'];
    -  private init?: DiagramDefinition['init'];
    -
    -  private detectError?: UnknownDiagramError;
    -  constructor(public text: string, public metadata: Pick = {}) {
    -    this.text = encodeEntities(text);
    -    this.text += '\n';
    -    const cnf = configApi.getConfig();
    -    try {
    -      this.type = detectType(text, cnf);
    -    } catch (e) {
    -      this.type = 'error';
    -      this.detectError = e as UnknownDiagramError;
    -    }
    -    const diagram = getDiagram(this.type);
    -    log.debug('Type ' + this.type);
    -    // Setup diagram
    -    this.db = diagram.db;
    -    this.renderer = diagram.renderer;
    -    this.parser = diagram.parser;
    -    if (this.parser.parser) {
    -      // The parser.parser.yy is only present in JISON parsers. So, we'll only set if required.
    -      this.parser.parser.yy = this.db;
    -    }
    -    this.init = diagram.init;
    -    this.parse();
    -  }
    -
    -  parse() {
    -    if (this.detectError) {
    -      throw this.detectError;
    -    }
    -    this.db.clear?.();
    +  public static async fromText(text: string, metadata: Pick = {}) {
         const config = configApi.getConfig();
    -    this.init?.(config);
    -    // This block was added for legacy compatibility. Use frontmatter instead of adding more special cases.
    -    if (this.metadata.title) {
    -      this.db.setDiagramTitle?.(this.metadata.title);
    +    const type = detectType(text, config);
    +    text = encodeEntities(text) + '\n';
    +    try {
    +      getDiagram(type);
    +    } catch (e) {
    +      const loader = getDiagramLoader(type);
    +      if (!loader) {
    +        throw new UnknownDiagramError(`Diagram ${type} not found.`);
    +      }
    +      // Diagram not available, loading it.
    +      // new diagram will try getDiagram again and if fails then it is a valid throw
    +      const { id, diagram } = await loader();
    +      registerDiagram(id, diagram);
         }
    -    this.parser.parse(this.text);
    +    const { db, parser, renderer, init } = getDiagram(type);
    +    if (parser.parser) {
    +      // The parser.parser.yy is only present in JISON parsers. So, we'll only set if required.
    +      parser.parser.yy = db;
    +    }
    +    db.clear?.();
    +    init?.(config);
    +    // This block was added for legacy compatibility. Use frontmatter instead of adding more special cases.
    +    if (metadata.title) {
    +      db.setDiagramTitle?.(metadata.title);
    +    }
    +    await parser.parse(text);
    +    return new Diagram(type, text, db, parser, renderer);
       }
     
    +  private constructor(
    +    public type: string,
    +    public text: string,
    +    public db: DiagramDefinition['db'],
    +    public parser: DiagramDefinition['parser'],
    +    public renderer: DiagramDefinition['renderer']
    +  ) {}
    +
       async render(id: string, version: string) {
         await this.renderer.draw(this.text, id, version, this);
       }
    @@ -72,34 +64,3 @@ export class Diagram {
         return this.type;
       }
     }
    -
    -/**
    - * Parse the text asynchronously and generate a Diagram object asynchronously.
    - * **Warning:** This function may be changed in the future.
    - * @alpha
    - * @param text - The mermaid diagram definition.
    - * @param metadata - Diagram metadata, defined in YAML.
    - * @returns A the Promise of a Diagram object.
    - * @throws {@link UnknownDiagramError} if the diagram type can not be found.
    - * @privateRemarks This is exported as part of the public mermaidAPI.
    - */
    -export const getDiagramFromText = async (
    -  text: string,
    -  metadata: Pick = {}
    -): Promise => {
    -  const type = detectType(text, configApi.getConfig());
    -  try {
    -    // Trying to find the diagram
    -    getDiagram(type);
    -  } catch (error) {
    -    const loader = getDiagramLoader(type);
    -    if (!loader) {
    -      throw new UnknownDiagramError(`Diagram ${type} not found.`);
    -    }
    -    // Diagram not available, loading it.
    -    // new diagram will try getDiagram again and if fails then it is a valid throw
    -    const { id, diagram } = await loader();
    -    registerDiagram(id, diagram);
    -  }
    -  return new Diagram(text, metadata);
    -};
    diff --git a/packages/mermaid/src/config.type.ts b/packages/mermaid/src/config.type.ts
    index fc5f2ec5d..e9c2fecbf 100644
    --- a/packages/mermaid/src/config.type.ts
    +++ b/packages/mermaid/src/config.type.ts
    @@ -146,10 +146,43 @@ export interface MermaidConfig {
       gitGraph?: GitGraphDiagramConfig;
       c4?: C4DiagramConfig;
       sankey?: SankeyDiagramConfig;
    +  packet?: PacketDiagramConfig;
       dompurifyConfig?: DOMPurifyConfiguration;
       wrap?: boolean;
       fontSize?: number;
     }
    +/**
    + * The object containing configurations specific for packet diagrams.
    + *
    + * This interface was referenced by `MermaidConfig`'s JSON-Schema
    + * via the `definition` "PacketDiagramConfig".
    + */
    +export interface PacketDiagramConfig extends BaseDiagramConfig {
    +  /**
    +   * The height of each row in the packet diagram.
    +   */
    +  rowHeight?: number;
    +  /**
    +   * The width of each bit in the packet diagram.
    +   */
    +  bitWidth?: number;
    +  /**
    +   * The number of bits to display per row.
    +   */
    +  bitsPerRow?: number;
    +  /**
    +   * Toggle to display or hide bit numbers.
    +   */
    +  showBits?: boolean;
    +  /**
    +   * The horizontal padding between the blocks in a row.
    +   */
    +  paddingX?: number;
    +  /**
    +   * The vertical padding between the rows.
    +   */
    +  paddingY?: number;
    +}
     /**
      * This interface was referenced by `MermaidConfig`'s JSON-Schema
      * via the `definition` "BaseDiagramConfig".
    diff --git a/packages/mermaid/src/defaultConfig.ts b/packages/mermaid/src/defaultConfig.ts
    index fb9db0c6a..76a8152b7 100644
    --- a/packages/mermaid/src/defaultConfig.ts
    +++ b/packages/mermaid/src/defaultConfig.ts
    @@ -257,6 +257,9 @@ const config: RequiredDeep = {
         // TODO: can we make this default to `true` instead?
         useMaxWidth: false,
       },
    +  packet: {
    +    ...defaultConfigJson.packet,
    +  },
     };
     
     const keyify = (obj: any, prefix = ''): string[] =>
    diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.ts
    index d6b9c00d8..f6a89459b 100644
    --- a/packages/mermaid/src/diagram-api/diagram-orchestration.ts
    +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.ts
    @@ -20,6 +20,7 @@ import flowchartElk from '../diagrams/flowchart/elk/detector.js';
     import timeline from '../diagrams/timeline/detector.js';
     import mindmap from '../diagrams/mindmap/detector.js';
     import sankey from '../diagrams/sankey/sankeyDetector.js';
    +import { packet } from '../diagrams/packet/detector.js';
     import { registerLazyLoadedDiagrams } from './detectType.js';
     import { registerDiagram } from './diagramAPI.js';
     
    @@ -86,6 +87,7 @@ export const addDiagrams = () => {
         journey,
         quadrantChart,
         sankey,
    +    packet,
         xychart
       );
     };
    diff --git a/packages/mermaid/src/diagram-api/diagramAPI.spec.ts b/packages/mermaid/src/diagram-api/diagramAPI.spec.ts
    index 3b6bce683..fd0e45842 100644
    --- a/packages/mermaid/src/diagram-api/diagramAPI.spec.ts
    +++ b/packages/mermaid/src/diagram-api/diagramAPI.spec.ts
    @@ -2,12 +2,12 @@ import { detectType } from './detectType.js';
     import { getDiagram, registerDiagram } from './diagramAPI.js';
     import { addDiagrams } from './diagram-orchestration.js';
     import type { DiagramDetector } from './types.js';
    -import { getDiagramFromText } from '../Diagram.js';
    +import { Diagram } from '../Diagram.js';
     import { it, describe, expect, beforeAll } from 'vitest';
     
     addDiagrams();
     beforeAll(async () => {
    -  await getDiagramFromText('sequenceDiagram');
    +  await Diagram.fromText('sequenceDiagram');
     });
     
     describe('DiagramAPI', () => {
    diff --git a/packages/mermaid/src/diagram-api/types.ts b/packages/mermaid/src/diagram-api/types.ts
    index d4f34de70..6ab82bd0d 100644
    --- a/packages/mermaid/src/diagram-api/types.ts
    +++ b/packages/mermaid/src/diagram-api/types.ts
    @@ -1,7 +1,8 @@
     /* eslint-disable @typescript-eslint/no-explicit-any */
    +import type * as d3 from 'd3';
    +import type { SetRequired } from 'type-fest';
     import type { Diagram } from '../Diagram.js';
     import type { BaseDiagramConfig, MermaidConfig } from '../config.type.js';
    -import type * as d3 from 'd3';
     
     export interface DiagramMetadata {
       title?: string;
    @@ -32,13 +33,29 @@ export interface DiagramDB {
       getDiagramTitle?: () => string;
       setAccTitle?: (title: string) => void;
       getAccTitle?: () => string;
    -  setAccDescription?: (describetion: string) => void;
    +  setAccDescription?: (description: string) => void;
       getAccDescription?: () => string;
     
       setDisplayMode?: (title: string) => void;
       bindFunctions?: (element: Element) => void;
     }
     
    +/**
    + * DiagramDB with fields that is required for all new diagrams.
    + */
    +export type DiagramDBBase = {
    +  getConfig: () => Required;
    +} & SetRequired<
    +  DiagramDB,
    +  | 'clear'
    +  | 'getAccTitle'
    +  | 'getDiagramTitle'
    +  | 'getAccDescription'
    +  | 'setAccDescription'
    +  | 'setAccTitle'
    +  | 'setDiagramTitle'
    +>;
    +
     // This is what is returned from getClasses(...) methods.
     // It is slightly renamed to ..StyleClassDef instead of just ClassDef because "class" is a greatly ambiguous and overloaded word.
     // It makes it clear we're working with a style class definition, even though defining the type is currently difficult.
    @@ -104,7 +121,7 @@ export type DrawDefinition = (
     ) => void | Promise;
     
     export interface ParserDefinition {
    -  parse: (text: string) => void;
    +  parse: (text: string) => void | Promise;
       parser?: { yy: DiagramDB };
     }
     
    diff --git a/packages/mermaid/src/diagram.spec.ts b/packages/mermaid/src/diagram.spec.ts
    index c73fb0a3b..46054ed6d 100644
    --- a/packages/mermaid/src/diagram.spec.ts
    +++ b/packages/mermaid/src/diagram.spec.ts
    @@ -1,5 +1,5 @@
     import { describe, test, expect } from 'vitest';
    -import { Diagram, getDiagramFromText } from './Diagram.js';
    +import { Diagram } from './Diagram.js';
     import { addDetector } from './diagram-api/detectType.js';
     import { addDiagrams } from './diagram-api/diagram-orchestration.js';
     import type { DiagramLoader } from './diagram-api/types.js';
    @@ -30,10 +30,10 @@ const getDummyDiagram = (id: string, title?: string): Awaited {
       test('should detect inbuilt diagrams', async () => {
    -    const graph = (await getDiagramFromText('graph TD; A-->B')) as Diagram;
    +    const graph = (await Diagram.fromText('graph TD; A-->B')) as Diagram;
         expect(graph).toBeInstanceOf(Diagram);
         expect(graph.type).toBe('flowchart-v2');
    -    const sequence = (await getDiagramFromText(
    +    const sequence = (await Diagram.fromText(
           'sequenceDiagram; Alice->>+John: Hello John, how are you?'
         )) as Diagram;
         expect(sequence).toBeInstanceOf(Diagram);
    @@ -46,7 +46,7 @@ describe('diagram detection', () => {
           (str) => str.startsWith('loki'),
           () => Promise.resolve(getDummyDiagram('loki'))
         );
    -    const diagram = await getDiagramFromText('loki TD; A-->B');
    +    const diagram = await Diagram.fromText('loki TD; A-->B');
         expect(diagram).toBeInstanceOf(Diagram);
         expect(diagram.type).toBe('loki');
       });
    @@ -58,19 +58,19 @@ describe('diagram detection', () => {
           (str) => str.startsWith('flowchart-elk'),
           () => Promise.resolve(getDummyDiagram('flowchart-elk', title))
         );
    -    const diagram = await getDiagramFromText('flowchart-elk TD; A-->B');
    +    const diagram = await Diagram.fromText('flowchart-elk TD; A-->B');
         expect(diagram).toBeInstanceOf(Diagram);
         expect(diagram.db.getDiagramTitle?.()).toBe(title);
       });
     
       test('should throw the right error for incorrect diagram', async () => {
    -    await expect(getDiagramFromText('graph TD; A-->')).rejects.toThrowErrorMatchingInlineSnapshot(`
    +    await expect(Diagram.fromText('graph TD; A-->')).rejects.toThrowErrorMatchingInlineSnapshot(`
           "Parse error on line 2:
           graph TD; A-->
           --------------^
           Expecting 'AMP', 'COLON', 'PIPE', 'TESTSTR', 'DOWN', 'DEFAULT', 'NUM', 'COMMA', 'NODE_STRING', 'BRKT', 'MINUS', 'MULT', 'UNICODE_TEXT', got 'EOF'"
         `);
    -    await expect(getDiagramFromText('sequenceDiagram; A-->B')).rejects
    +    await expect(Diagram.fromText('sequenceDiagram; A-->B')).rejects
           .toThrowErrorMatchingInlineSnapshot(`
     "Parse error on line 1:
     ...quenceDiagram; A-->B
    @@ -80,13 +80,13 @@ Expecting 'TXT', got 'NEWLINE'"
       });
     
       test('should throw the right error for unregistered diagrams', async () => {
    -    await expect(getDiagramFromText('thor TD; A-->B')).rejects.toThrowErrorMatchingInlineSnapshot(
    +    await expect(Diagram.fromText('thor TD; A-->B')).rejects.toThrowErrorMatchingInlineSnapshot(
           '"No diagram type detected matching given configuration for text: thor TD; A-->B"'
         );
       });
     
       test('should consider entity codes when present in diagram defination', async () => {
    -    const diagram = await getDiagramFromText(`sequenceDiagram
    +    const diagram = await Diagram.fromText(`sequenceDiagram
         A->>B: I #9829; you!
         B->>A: I #9829; you #infin; times more!`);
         // @ts-ignore: we need to add types for sequenceDb which will be done in separate PR
    diff --git a/packages/mermaid/src/diagrams/common/common.ts b/packages/mermaid/src/diagrams/common/common.ts
    index caf43bc68..8609a175a 100644
    --- a/packages/mermaid/src/diagrams/common/common.ts
    +++ b/packages/mermaid/src/diagrams/common/common.ts
    @@ -18,13 +18,18 @@ export const getRows = (s?: string): string[] => {
       return str.split('#br#');
     };
     
    -/**
    - * Removes script tags from a text
    - *
    - * @param txt - The text to sanitize
    - * @returns The safer text
    - */
    -export const removeScript = (txt: string): string => {
    +const setupDompurifyHooksIfNotSetup = (() => {
    +  let setup = false;
    +
    +  return () => {
    +    if (!setup) {
    +      setupDompurifyHooks();
    +      setup = true;
    +    }
    +  };
    +})();
    +
    +function setupDompurifyHooks() {
       const TEMPORARY_ATTRIBUTE = 'data-temp-href-target';
     
       DOMPurify.addHook('beforeSanitizeAttributes', (node: Element) => {
    @@ -33,8 +38,6 @@ export const removeScript = (txt: string): string => {
         }
       });
     
    -  const sanitizedText = DOMPurify.sanitize(txt);
    -
       DOMPurify.addHook('afterSanitizeAttributes', (node: Element) => {
         if (node.tagName === 'A' && node.hasAttribute(TEMPORARY_ATTRIBUTE)) {
           node.setAttribute('target', node.getAttribute(TEMPORARY_ATTRIBUTE) || '');
    @@ -44,6 +47,18 @@ export const removeScript = (txt: string): string => {
           }
         }
       });
    +}
    +
    +/**
    + * Removes script tags from a text
    + *
    + * @param txt - The text to sanitize
    + * @returns The safer text
    + */
    +export const removeScript = (txt: string): string => {
    +  setupDompurifyHooksIfNotSetup();
    +
    +  const sanitizedText = DOMPurify.sanitize(txt);
     
       return sanitizedText;
     };
    diff --git a/packages/mermaid/src/diagrams/gantt/parser/gantt.jison b/packages/mermaid/src/diagrams/gantt/parser/gantt.jison
    index b4daab5dc..d6027fee9 100644
    --- a/packages/mermaid/src/diagrams/gantt/parser/gantt.jison
    +++ b/packages/mermaid/src/diagrams/gantt/parser/gantt.jison
    @@ -27,11 +27,10 @@ accDescr\s*"{"\s*                                { this.begin("acc_descr_multili
     
     \%\%(?!\{)*[^\n]*                                               /* skip comments */
     [^\}]\%\%*[^\n]*                                                /* skip comments */
    -\%\%*[^\n]*[\n]*           /* do nothing */
    +\%\%*[^\n]*[\n]*                                                /* do nothing */
     
     [\n]+                   return 'NL';
     \s+                     /* skip whitespace */
    -\#[^\n]*                /* skip comments */
     \%%[^\n]*               /* skip comments */
     
     /*
    @@ -86,10 +85,10 @@ weekday\s+friday                return 'weekday_friday'
     weekday\s+saturday              return 'weekday_saturday'
     weekday\s+sunday                return 'weekday_sunday'
     \d\d\d\d"-"\d\d"-"\d\d          return 'date';
    -"title"\s[^#\n;]+               return 'title';
    +"title"\s[^\n]+               return 'title';
     "accDescription"\s[^#\n;]+      return 'accDescription'
    -"section"\s[^#:\n;]+            return 'section';
    -[^#:\n;]+                       return 'taskTxt';
    +"section"\s[^\n]+            return 'section';
    +[^:\n]+                       return 'taskTxt';
     ":"[^#\n;]+                     return 'taskData';
     ":"                             return ':';
     <>                         return 'EOF';
    diff --git a/packages/mermaid/src/diagrams/gantt/parser/gantt.spec.js b/packages/mermaid/src/diagrams/gantt/parser/gantt.spec.js
    index e7ce1ffa4..ae5f74249 100644
    --- a/packages/mermaid/src/diagrams/gantt/parser/gantt.spec.js
    +++ b/packages/mermaid/src/diagrams/gantt/parser/gantt.spec.js
    @@ -28,8 +28,12 @@ describe('when parsing a gantt diagram it', function () {
       });
       it('should handle a title definition', function () {
         const str = 'gantt\ndateFormat yyyy-mm-dd\ntitle Adding gantt diagram functionality to mermaid';
    +    const semi = 'gantt\ndateFormat yyyy-mm-dd\ntitle ;Gantt diagram titles support semicolons';
    +    const hash = 'gantt\ndateFormat yyyy-mm-dd\ntitle #Gantt diagram titles support hashtags';
     
         expect(parserFnConstructor(str)).not.toThrow();
    +    expect(parserFnConstructor(semi)).not.toThrow();
    +    expect(parserFnConstructor(hash)).not.toThrow();
       });
       it('should handle an excludes definition', function () {
         const str =
    @@ -53,7 +57,23 @@ describe('when parsing a gantt diagram it', function () {
           'excludes weekdays 2019-02-01\n' +
           'section Documentation';
     
    +    const semi =
    +      'gantt\n' +
    +      'dateFormat yyyy-mm-dd\n' +
    +      'title Adding gantt diagram functionality to mermaid\n' +
    +      'excludes weekdays 2019-02-01\n' +
    +      'section ;Documentation';
    +
    +    const hash =
    +      'gantt\n' +
    +      'dateFormat yyyy-mm-dd\n' +
    +      'title Adding gantt diagram functionality to mermaid\n' +
    +      'excludes weekdays 2019-02-01\n' +
    +      'section #Documentation';
    +
         expect(parserFnConstructor(str)).not.toThrow();
    +    expect(parserFnConstructor(semi)).not.toThrow();
    +    expect(parserFnConstructor(hash)).not.toThrow();
       });
       it('should handle multiline section titles with different line breaks', function () {
         const str =
    @@ -73,7 +93,23 @@ describe('when parsing a gantt diagram it', function () {
           'section Documentation\n' +
           'Design jison grammar:des1, 2014-01-01, 2014-01-04';
     
    +    const semi =
    +      'gantt\n' +
    +      'dateFormat YYYY-MM-DD\n' +
    +      'title Adding gantt diagram functionality to mermaid\n' +
    +      'section Documentation\n' +
    +      ';Design jison grammar:des1, 2014-01-01, 2014-01-04';
    +
    +    const hash =
    +      'gantt\n' +
    +      'dateFormat YYYY-MM-DD\n' +
    +      'title Adding gantt diagram functionality to mermaid\n' +
    +      'section Documentation\n' +
    +      '#Design jison grammar:des1, 2014-01-01, 2014-01-04';
    +
         expect(parserFnConstructor(str)).not.toThrow();
    +    expect(parserFnConstructor(semi)).not.toThrow();
    +    expect(parserFnConstructor(hash)).not.toThrow();
     
         const tasks = parser.yy.getTasks();
     
    diff --git a/packages/mermaid/src/diagrams/info/info.spec.ts b/packages/mermaid/src/diagrams/info/info.spec.ts
    index b7adf9f2e..6e139ab78 100644
    --- a/packages/mermaid/src/diagrams/info/info.spec.ts
    +++ b/packages/mermaid/src/diagrams/info/info.spec.ts
    @@ -1,31 +1,27 @@
     import { parser } from './infoParser.js';
     
     describe('info', () => {
    -  it('should handle an info definition', () => {
    +  it('should handle an info definition', async () => {
         const str = `info`;
    -    expect(() => {
    -      parser.parse(str);
    -    }).not.toThrow();
    +    await expect(parser.parse(str)).resolves.not.toThrow();
       });
     
    -  it('should handle an info definition with showInfo', () => {
    +  it('should handle an info definition with showInfo', async () => {
         const str = `info showInfo`;
    -    expect(() => {
    -      parser.parse(str);
    -    }).not.toThrow();
    +    await expect(parser.parse(str)).resolves.not.toThrow();
       });
     
    -  it('should throw because of unsupported info grammar', () => {
    +  it('should throw because of unsupported info grammar', async () => {
         const str = `info unsupported`;
    -    expect(() => {
    -      parser.parse(str);
    -    }).toThrow('Parsing failed: unexpected character: ->u<- at offset: 5, skipped 11 characters.');
    +    await expect(parser.parse(str)).rejects.toThrow(
    +      'Parsing failed: unexpected character: ->u<- at offset: 5, skipped 11 characters.'
    +    );
       });
     
    -  it('should throw because of unsupported info grammar', () => {
    +  it('should throw because of unsupported info grammar', async () => {
         const str = `info unsupported`;
    -    expect(() => {
    -      parser.parse(str);
    -    }).toThrow('Parsing failed: unexpected character: ->u<- at offset: 5, skipped 11 characters.');
    +    await expect(parser.parse(str)).rejects.toThrow(
    +      'Parsing failed: unexpected character: ->u<- at offset: 5, skipped 11 characters.'
    +    );
       });
     });
    diff --git a/packages/mermaid/src/diagrams/info/infoParser.ts b/packages/mermaid/src/diagrams/info/infoParser.ts
    index 19c13a046..5fd54258a 100644
    --- a/packages/mermaid/src/diagrams/info/infoParser.ts
    +++ b/packages/mermaid/src/diagrams/info/infoParser.ts
    @@ -1,12 +1,11 @@
     import type { Info } from '@mermaid-js/parser';
     import { parse } from '@mermaid-js/parser';
    -
    -import { log } from '../../logger.js';
     import type { ParserDefinition } from '../../diagram-api/types.js';
    +import { log } from '../../logger.js';
     
     export const parser: ParserDefinition = {
    -  parse: (input: string): void => {
    -    const ast: Info = parse('info', input);
    +  parse: async (input: string): Promise => {
    +    const ast: Info = await parse('info', input);
         log.debug(ast);
       },
     };
    diff --git a/packages/mermaid/src/diagrams/packet/db.ts b/packages/mermaid/src/diagrams/packet/db.ts
    new file mode 100644
    index 000000000..d7b550472
    --- /dev/null
    +++ b/packages/mermaid/src/diagrams/packet/db.ts
    @@ -0,0 +1,59 @@
    +import { getConfig as commonGetConfig } from '../../config.js';
    +import type { PacketDiagramConfig } from '../../config.type.js';
    +import DEFAULT_CONFIG from '../../defaultConfig.js';
    +import { cleanAndMerge } from '../../utils.js';
    +import {
    +  clear as commonClear,
    +  getAccDescription,
    +  getAccTitle,
    +  getDiagramTitle,
    +  setAccDescription,
    +  setAccTitle,
    +  setDiagramTitle,
    +} from '../common/commonDb.js';
    +import type { PacketDB, PacketData, PacketWord } from './types.js';
    +
    +const defaultPacketData: PacketData = {
    +  packet: [],
    +};
    +
    +let data: PacketData = structuredClone(defaultPacketData);
    +
    +const DEFAULT_PACKET_CONFIG: Required = DEFAULT_CONFIG.packet;
    +
    +const getConfig = (): Required => {
    +  const config = cleanAndMerge({
    +    ...DEFAULT_PACKET_CONFIG,
    +    ...commonGetConfig().packet,
    +  });
    +  if (config.showBits) {
    +    config.paddingY += 10;
    +  }
    +  return config;
    +};
    +
    +const getPacket = (): PacketWord[] => data.packet;
    +
    +const pushWord = (word: PacketWord) => {
    +  if (word.length > 0) {
    +    data.packet.push(word);
    +  }
    +};
    +
    +const clear = () => {
    +  commonClear();
    +  data = structuredClone(defaultPacketData);
    +};
    +
    +export const db: PacketDB = {
    +  pushWord,
    +  getPacket,
    +  getConfig,
    +  clear,
    +  setAccTitle,
    +  getAccTitle,
    +  setDiagramTitle,
    +  getDiagramTitle,
    +  getAccDescription,
    +  setAccDescription,
    +};
    diff --git a/packages/mermaid/src/diagrams/packet/detector.ts b/packages/mermaid/src/diagrams/packet/detector.ts
    new file mode 100644
    index 000000000..5aca92e6c
    --- /dev/null
    +++ b/packages/mermaid/src/diagrams/packet/detector.ts
    @@ -0,0 +1,22 @@
    +import type {
    +  DiagramDetector,
    +  DiagramLoader,
    +  ExternalDiagramDefinition,
    +} from '../../diagram-api/types.js';
    +
    +const id = 'packet';
    +
    +const detector: DiagramDetector = (txt) => {
    +  return /^\s*packet-beta/.test(txt);
    +};
    +
    +const loader: DiagramLoader = async () => {
    +  const { diagram } = await import('./diagram.js');
    +  return { id, diagram };
    +};
    +
    +export const packet: ExternalDiagramDefinition = {
    +  id,
    +  detector,
    +  loader,
    +};
    diff --git a/packages/mermaid/src/diagrams/packet/diagram.ts b/packages/mermaid/src/diagrams/packet/diagram.ts
    new file mode 100644
    index 000000000..a73a77c05
    --- /dev/null
    +++ b/packages/mermaid/src/diagrams/packet/diagram.ts
    @@ -0,0 +1,12 @@
    +import type { DiagramDefinition } from '../../diagram-api/types.js';
    +import { db } from './db.js';
    +import { parser } from './parser.js';
    +import { renderer } from './renderer.js';
    +import { styles } from './styles.js';
    +
    +export const diagram: DiagramDefinition = {
    +  parser,
    +  db,
    +  renderer,
    +  styles,
    +};
    diff --git a/packages/mermaid/src/diagrams/packet/packet.spec.ts b/packages/mermaid/src/diagrams/packet/packet.spec.ts
    new file mode 100644
    index 000000000..b053ea627
    --- /dev/null
    +++ b/packages/mermaid/src/diagrams/packet/packet.spec.ts
    @@ -0,0 +1,175 @@
    +import { it, describe, expect } from 'vitest';
    +import { db } from './db.js';
    +import { parser } from './parser.js';
    +
    +const { clear, getPacket, getDiagramTitle, getAccTitle, getAccDescription } = db;
    +
    +describe('packet diagrams', () => {
    +  beforeEach(() => {
    +    clear();
    +  });
    +
    +  it('should handle a packet-beta definition', async () => {
    +    const str = `packet-beta`;
    +    await expect(parser.parse(str)).resolves.not.toThrow();
    +    expect(getPacket()).toMatchInlineSnapshot('[]');
    +  });
    +
    +  it('should handle diagram with data and title', async () => {
    +    const str = `packet-beta
    +    title Packet diagram
    +    accTitle: Packet accTitle
    +    accDescr: Packet accDescription
    +    0-10: "test"
    +    `;
    +    await expect(parser.parse(str)).resolves.not.toThrow();
    +    expect(getDiagramTitle()).toMatchInlineSnapshot('"Packet diagram"');
    +    expect(getAccTitle()).toMatchInlineSnapshot('"Packet accTitle"');
    +    expect(getAccDescription()).toMatchInlineSnapshot('"Packet accDescription"');
    +    expect(getPacket()).toMatchInlineSnapshot(`
    +      [
    +        [
    +          {
    +            "end": 10,
    +            "label": "test",
    +            "start": 0,
    +          },
    +        ],
    +      ]
    +    `);
    +  });
    +
    +  it('should handle single bits', async () => {
    +    const str = `packet-beta
    +    0-10: "test"
    +    11: "single"
    +    `;
    +    await expect(parser.parse(str)).resolves.not.toThrow();
    +    expect(getPacket()).toMatchInlineSnapshot(`
    +      [
    +        [
    +          {
    +            "end": 10,
    +            "label": "test",
    +            "start": 0,
    +          },
    +          {
    +            "end": 11,
    +            "label": "single",
    +            "start": 11,
    +          },
    +        ],
    +      ]
    +    `);
    +  });
    +
    +  it('should split into multiple rows', async () => {
    +    const str = `packet-beta
    +    0-10: "test"
    +    11-90: "multiple"
    +    `;
    +    await expect(parser.parse(str)).resolves.not.toThrow();
    +    expect(getPacket()).toMatchInlineSnapshot(`
    +      [
    +        [
    +          {
    +            "end": 10,
    +            "label": "test",
    +            "start": 0,
    +          },
    +          {
    +            "end": 31,
    +            "label": "multiple",
    +            "start": 11,
    +          },
    +        ],
    +        [
    +          {
    +            "end": 63,
    +            "label": "multiple",
    +            "start": 32,
    +          },
    +        ],
    +        [
    +          {
    +            "end": 90,
    +            "label": "multiple",
    +            "start": 64,
    +          },
    +        ],
    +      ]
    +    `);
    +  });
    +
    +  it('should split into multiple rows when cut at exact length', async () => {
    +    const str = `packet-beta
    +    0-16: "test"
    +    17-63: "multiple"
    +    `;
    +    await expect(parser.parse(str)).resolves.not.toThrow();
    +    expect(getPacket()).toMatchInlineSnapshot(`
    +      [
    +        [
    +          {
    +            "end": 16,
    +            "label": "test",
    +            "start": 0,
    +          },
    +          {
    +            "end": 31,
    +            "label": "multiple",
    +            "start": 17,
    +          },
    +        ],
    +        [
    +          {
    +            "end": 63,
    +            "label": "multiple",
    +            "start": 32,
    +          },
    +        ],
    +      ]
    +    `);
    +  });
    +
    +  it('should throw error if numbers are not continuous', async () => {
    +    const str = `packet-beta
    +    0-16: "test"
    +    18-20: "error"
    +    `;
    +    await expect(parser.parse(str)).rejects.toThrowErrorMatchingInlineSnapshot(
    +      '"Packet block 18 - 20 is not contiguous. It should start from 17."'
    +    );
    +  });
    +
    +  it('should throw error if numbers are not continuous for single packets', async () => {
    +    const str = `packet-beta
    +    0-16: "test"
    +    18: "error"
    +    `;
    +    await expect(parser.parse(str)).rejects.toThrowErrorMatchingInlineSnapshot(
    +      '"Packet block 18 - 18 is not contiguous. It should start from 17."'
    +    );
    +  });
    +
    +  it('should throw error if numbers are not continuous for single packets - 2', async () => {
    +    const str = `packet-beta
    +    0-16: "test"
    +    17: "good"
    +    19: "error"
    +    `;
    +    await expect(parser.parse(str)).rejects.toThrowErrorMatchingInlineSnapshot(
    +      '"Packet block 19 - 19 is not contiguous. It should start from 18."'
    +    );
    +  });
    +
    +  it('should throw error if end is less than start', async () => {
    +    const str = `packet-beta
    +    0-16: "test"
    +    25-20: "error"
    +    `;
    +    await expect(parser.parse(str)).rejects.toThrowErrorMatchingInlineSnapshot(
    +      '"Packet block 25 - 20 is invalid. End must be greater than start."'
    +    );
    +  });
    +});
    diff --git a/packages/mermaid/src/diagrams/packet/parser.ts b/packages/mermaid/src/diagrams/packet/parser.ts
    new file mode 100644
    index 000000000..06d180dfd
    --- /dev/null
    +++ b/packages/mermaid/src/diagrams/packet/parser.ts
    @@ -0,0 +1,85 @@
    +import type { Packet } from '@mermaid-js/parser';
    +import { parse } from '@mermaid-js/parser';
    +import type { ParserDefinition } from '../../diagram-api/types.js';
    +import { log } from '../../logger.js';
    +import { populateCommonDb } from '../common/populateCommonDb.js';
    +import { db } from './db.js';
    +import type { PacketBlock, PacketWord } from './types.js';
    +
    +const maxPacketSize = 10_000;
    +
    +const populate = (ast: Packet) => {
    +  populateCommonDb(ast, db);
    +  let lastByte = -1;
    +  let word: PacketWord = [];
    +  let row = 1;
    +  const { bitsPerRow } = db.getConfig();
    +  for (let { start, end, label } of ast.blocks) {
    +    if (end && end < start) {
    +      throw new Error(`Packet block ${start} - ${end} is invalid. End must be greater than start.`);
    +    }
    +    if (start !== lastByte + 1) {
    +      throw new Error(
    +        `Packet block ${start} - ${end ?? start} is not contiguous. It should start from ${
    +          lastByte + 1
    +        }.`
    +      );
    +    }
    +    lastByte = end ?? start;
    +    log.debug(`Packet block ${start} - ${lastByte} with label ${label}`);
    +
    +    while (word.length <= bitsPerRow + 1 && db.getPacket().length < maxPacketSize) {
    +      const [block, nextBlock] = getNextFittingBlock({ start, end, label }, row, bitsPerRow);
    +      word.push(block);
    +      if (block.end + 1 === row * bitsPerRow) {
    +        db.pushWord(word);
    +        word = [];
    +        row++;
    +      }
    +      if (!nextBlock) {
    +        break;
    +      }
    +      ({ start, end, label } = nextBlock);
    +    }
    +  }
    +  db.pushWord(word);
    +};
    +
    +const getNextFittingBlock = (
    +  block: PacketBlock,
    +  row: number,
    +  bitsPerRow: number
    +): [Required, PacketBlock | undefined] => {
    +  if (block.end === undefined) {
    +    block.end = block.start;
    +  }
    +
    +  if (block.start > block.end) {
    +    throw new Error(`Block start ${block.start} is greater than block end ${block.end}.`);
    +  }
    +
    +  if (block.end + 1 <= row * bitsPerRow) {
    +    return [block as Required, undefined];
    +  }
    +
    +  return [
    +    {
    +      start: block.start,
    +      end: row * bitsPerRow - 1,
    +      label: block.label,
    +    },
    +    {
    +      start: row * bitsPerRow,
    +      end: block.end,
    +      label: block.label,
    +    },
    +  ];
    +};
    +
    +export const parser: ParserDefinition = {
    +  parse: async (input: string): Promise => {
    +    const ast: Packet = await parse('packet', input);
    +    log.debug(ast);
    +    populate(ast);
    +  },
    +};
    diff --git a/packages/mermaid/src/diagrams/packet/renderer.ts b/packages/mermaid/src/diagrams/packet/renderer.ts
    new file mode 100644
    index 000000000..84feb8c43
    --- /dev/null
    +++ b/packages/mermaid/src/diagrams/packet/renderer.ts
    @@ -0,0 +1,95 @@
    +import type { Diagram } from '../../Diagram.js';
    +import type { PacketDiagramConfig } from '../../config.type.js';
    +import type { DiagramRenderer, DrawDefinition, Group, SVG } from '../../diagram-api/types.js';
    +import { selectSvgElement } from '../../rendering-util/selectSvgElement.js';
    +import { configureSvgSize } from '../../setupGraphViewbox.js';
    +import type { PacketDB, PacketWord } from './types.js';
    +
    +// eslint-disable-next-line @typescript-eslint/no-unused-vars
    +const draw: DrawDefinition = (_text, id, _version, diagram: Diagram) => {
    +  const db = diagram.db as PacketDB;
    +  const config = db.getConfig();
    +  const { rowHeight, paddingY, bitWidth, bitsPerRow } = config;
    +  const words = db.getPacket();
    +  const title = db.getDiagramTitle();
    +  const totalRowHeight = rowHeight + paddingY;
    +  const svgHeight = totalRowHeight * (words.length + 1) - (title ? 0 : rowHeight);
    +  const svgWidth = bitWidth * bitsPerRow + 2;
    +  const svg: SVG = selectSvgElement(id);
    +
    +  svg.attr('viewbox', `0 0 ${svgWidth} ${svgHeight}`);
    +  configureSvgSize(svg, svgHeight, svgWidth, config.useMaxWidth);
    +
    +  for (const [word, packet] of words.entries()) {
    +    drawWord(svg, packet, word, config);
    +  }
    +
    +  svg
    +    .append('text')
    +    .text(title)
    +    .attr('x', svgWidth / 2)
    +    .attr('y', svgHeight - totalRowHeight / 2)
    +    .attr('dominant-baseline', 'middle')
    +    .attr('text-anchor', 'middle')
    +    .attr('class', 'packetTitle');
    +};
    +
    +const drawWord = (
    +  svg: SVG,
    +  word: PacketWord,
    +  rowNumber: number,
    +  { rowHeight, paddingX, paddingY, bitWidth, bitsPerRow, showBits }: Required
    +) => {
    +  const group: Group = svg.append('g');
    +  const wordY = rowNumber * (rowHeight + paddingY) + paddingY;
    +  for (const block of word) {
    +    const blockX = (block.start % bitsPerRow) * bitWidth + 1;
    +    const width = (block.end - block.start + 1) * bitWidth - paddingX;
    +    // Block rectangle
    +    group
    +      .append('rect')
    +      .attr('x', blockX)
    +      .attr('y', wordY)
    +      .attr('width', width)
    +      .attr('height', rowHeight)
    +      .attr('class', 'packetBlock');
    +
    +    // Block label
    +    group
    +      .append('text')
    +      .attr('x', blockX + width / 2)
    +      .attr('y', wordY + rowHeight / 2)
    +      .attr('class', 'packetLabel')
    +      .attr('dominant-baseline', 'middle')
    +      .attr('text-anchor', 'middle')
    +      .text(block.label);
    +
    +    if (!showBits) {
    +      continue;
    +    }
    +    // Start byte count
    +    const isSingleBlock = block.end === block.start;
    +    const bitNumberY = wordY - 2;
    +    group
    +      .append('text')
    +      .attr('x', blockX + (isSingleBlock ? width / 2 : 0))
    +      .attr('y', bitNumberY)
    +      .attr('class', 'packetByte start')
    +      .attr('dominant-baseline', 'auto')
    +      .attr('text-anchor', isSingleBlock ? 'middle' : 'start')
    +      .text(block.start);
    +
    +    // Draw end byte count if it is not the same as start byte count
    +    if (!isSingleBlock) {
    +      group
    +        .append('text')
    +        .attr('x', blockX + width)
    +        .attr('y', bitNumberY)
    +        .attr('class', 'packetByte end')
    +        .attr('dominant-baseline', 'auto')
    +        .attr('text-anchor', 'end')
    +        .text(block.end);
    +    }
    +  }
    +};
    +export const renderer: DiagramRenderer = { draw };
    diff --git a/packages/mermaid/src/diagrams/packet/styles.ts b/packages/mermaid/src/diagrams/packet/styles.ts
    new file mode 100644
    index 000000000..ff940d0e6
    --- /dev/null
    +++ b/packages/mermaid/src/diagrams/packet/styles.ts
    @@ -0,0 +1,47 @@
    +import type { DiagramStylesProvider } from '../../diagram-api/types.js';
    +import { cleanAndMerge } from '../../utils.js';
    +import type { PacketStyleOptions } from './types.js';
    +
    +const defaultPacketStyleOptions: PacketStyleOptions = {
    +  byteFontSize: '10px',
    +  startByteColor: 'black',
    +  endByteColor: 'black',
    +  labelColor: 'black',
    +  labelFontSize: '12px',
    +  titleColor: 'black',
    +  titleFontSize: '14px',
    +  blockStrokeColor: 'black',
    +  blockStrokeWidth: '1',
    +  blockFillColor: '#efefef',
    +};
    +
    +export const styles: DiagramStylesProvider = ({ packet }: { packet?: PacketStyleOptions } = {}) => {
    +  const options = cleanAndMerge(defaultPacketStyleOptions, packet);
    +
    +  return `
    +	.packetByte {
    +		font-size: ${options.byteFontSize};
    +	}
    +	.packetByte.start {
    +		fill: ${options.startByteColor};
    +	}
    +	.packetByte.end {
    +		fill: ${options.endByteColor};
    +	}
    +	.packetLabel {
    +		fill: ${options.labelColor};
    +		font-size: ${options.labelFontSize};
    +	}
    +	.packetTitle {
    +		fill: ${options.titleColor};
    +		font-size: ${options.titleFontSize};
    +	}
    +	.packetBlock {
    +		stroke: ${options.blockStrokeColor};
    +		stroke-width: ${options.blockStrokeWidth};
    +		fill: ${options.blockFillColor};
    +	}
    +	`;
    +};
    +
    +export default styles;
    diff --git a/packages/mermaid/src/diagrams/packet/types.ts b/packages/mermaid/src/diagrams/packet/types.ts
    new file mode 100644
    index 000000000..ea3c5d0dd
    --- /dev/null
    +++ b/packages/mermaid/src/diagrams/packet/types.ts
    @@ -0,0 +1,29 @@
    +import type { Packet, RecursiveAstOmit } from '@mermaid-js/parser';
    +import type { PacketDiagramConfig } from '../../config.type.js';
    +import type { DiagramDBBase } from '../../diagram-api/types.js';
    +import type { ArrayElement } from '../../types.js';
    +
    +export type PacketBlock = RecursiveAstOmit>;
    +export type PacketWord = Required[];
    +
    +export interface PacketDB extends DiagramDBBase {
    +  pushWord: (word: PacketWord) => void;
    +  getPacket: () => PacketWord[];
    +}
    +
    +export interface PacketStyleOptions {
    +  byteFontSize?: string;
    +  startByteColor?: string;
    +  endByteColor?: string;
    +  labelColor?: string;
    +  labelFontSize?: string;
    +  blockStrokeColor?: string;
    +  blockStrokeWidth?: string;
    +  blockFillColor?: string;
    +  titleColor?: string;
    +  titleFontSize?: string;
    +}
    +
    +export interface PacketData {
    +  packet: PacketWord[];
    +}
    diff --git a/packages/mermaid/src/diagrams/pie/pie.spec.ts b/packages/mermaid/src/diagrams/pie/pie.spec.ts
    index fb0cbeec8..f68e80efd 100644
    --- a/packages/mermaid/src/diagrams/pie/pie.spec.ts
    +++ b/packages/mermaid/src/diagrams/pie/pie.spec.ts
    @@ -10,8 +10,8 @@ describe('pie', () => {
       beforeEach(() => db.clear());
     
       describe('parse', () => {
    -    it('should handle very simple pie', () => {
    -      parser.parse(`pie
    +    it('should handle very simple pie', async () => {
    +      await parser.parse(`pie
           "ash": 100
           `);
     
    @@ -19,8 +19,8 @@ describe('pie', () => {
           expect(sections['ash']).toBe(100);
         });
     
    -    it('should handle simple pie', () => {
    -      parser.parse(`pie
    +    it('should handle simple pie', async () => {
    +      await parser.parse(`pie
           "ash" : 60
           "bat" : 40
           `);
    @@ -30,8 +30,8 @@ describe('pie', () => {
           expect(sections['bat']).toBe(40);
         });
     
    -    it('should handle simple pie with showData', () => {
    -      parser.parse(`pie showData
    +    it('should handle simple pie with showData', async () => {
    +      await parser.parse(`pie showData
           "ash" : 60
           "bat" : 40
           `);
    @@ -43,8 +43,8 @@ describe('pie', () => {
           expect(sections['bat']).toBe(40);
         });
     
    -    it('should handle simple pie with comments', () => {
    -      parser.parse(`pie
    +    it('should handle simple pie with comments', async () => {
    +      await parser.parse(`pie
           %% comments
           "ash" : 60
           "bat" : 40
    @@ -55,8 +55,8 @@ describe('pie', () => {
           expect(sections['bat']).toBe(40);
         });
     
    -    it('should handle simple pie with a title', () => {
    -      parser.parse(`pie title a 60/40 pie
    +    it('should handle simple pie with a title', async () => {
    +      await parser.parse(`pie title a 60/40 pie
           "ash" : 60
           "bat" : 40
           `);
    @@ -68,8 +68,8 @@ describe('pie', () => {
           expect(sections['bat']).toBe(40);
         });
     
    -    it('should handle simple pie with an acc title (accTitle)', () => {
    -      parser.parse(`pie title a neat chart
    +    it('should handle simple pie with an acc title (accTitle)', async () => {
    +      await parser.parse(`pie title a neat chart
           accTitle: a neat acc title
           "ash" : 60
           "bat" : 40
    @@ -84,8 +84,8 @@ describe('pie', () => {
           expect(sections['bat']).toBe(40);
         });
     
    -    it('should handle simple pie with an acc description (accDescr)', () => {
    -      parser.parse(`pie title a neat chart
    +    it('should handle simple pie with an acc description (accDescr)', async () => {
    +      await parser.parse(`pie title a neat chart
           accDescr: a neat description
           "ash" : 60
           "bat" : 40
    @@ -100,8 +100,8 @@ describe('pie', () => {
           expect(sections['bat']).toBe(40);
         });
     
    -    it('should handle simple pie with a multiline acc description (accDescr)', () => {
    -      parser.parse(`pie title a neat chart
    +    it('should handle simple pie with a multiline acc description (accDescr)', async () => {
    +      await parser.parse(`pie title a neat chart
           accDescr {
             a neat description
             on multiple lines
    @@ -119,8 +119,8 @@ describe('pie', () => {
           expect(sections['bat']).toBe(40);
         });
     
    -    it('should handle simple pie with positive decimal', () => {
    -      parser.parse(`pie
    +    it('should handle simple pie with positive decimal', async () => {
    +      await parser.parse(`pie
           "ash" : 60.67
           "bat" : 40
           `);
    @@ -131,12 +131,12 @@ describe('pie', () => {
         });
     
         it('should handle simple pie with negative decimal', () => {
    -      expect(() => {
    -        parser.parse(`pie
    +      expect(async () => {
    +        await parser.parse(`pie
             "ash" : -60.67
             "bat" : 40.12
             `);
    -      }).toThrowError();
    +      }).rejects.toThrowError();
         });
       });
     
    diff --git a/packages/mermaid/src/diagrams/pie/pieParser.ts b/packages/mermaid/src/diagrams/pie/pieParser.ts
    index a958089ba..fbdc603d6 100644
    --- a/packages/mermaid/src/diagrams/pie/pieParser.ts
    +++ b/packages/mermaid/src/diagrams/pie/pieParser.ts
    @@ -13,8 +13,8 @@ const populateDb = (ast: Pie, db: PieDB) => {
     };
     
     export const parser: ParserDefinition = {
    -  parse: (input: string): void => {
    -    const ast: Pie = parse('pie', input);
    +  parse: async (input: string): Promise => {
    +    const ast: Pie = await parse('pie', input);
         log.debug(ast);
         populateDb(ast, db);
       },
    diff --git a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js
    index 8a7e2281c..5ec99f7ea 100644
    --- a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js
    +++ b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js
    @@ -1,12 +1,12 @@
     import { vi } from 'vitest';
     import { setSiteConfig } from '../../diagram-api/diagramAPI.js';
     import mermaidAPI from '../../mermaidAPI.js';
    -import { Diagram, getDiagramFromText } from '../../Diagram.js';
    +import { Diagram } from '../../Diagram.js';
     import { addDiagrams } from '../../diagram-api/diagram-orchestration.js';
     
     beforeAll(async () => {
       // Is required to load the sequence diagram
    -  await getDiagramFromText('sequenceDiagram');
    +  await Diagram.fromText('sequenceDiagram');
     });
     
     /**
    @@ -95,8 +95,8 @@ function addConf(conf, key, value) {
     let diagram;
     
     describe('more than one sequence diagram', () => {
    -  it('should not have duplicated messages', () => {
    -    const diagram1 = new Diagram(`
    +  it('should not have duplicated messages', async () => {
    +    const diagram1 = await Diagram.fromText(`
             sequenceDiagram
             Alice->Bob:Hello Bob, how are you?
             Bob-->Alice: I am good thanks!`);
    @@ -120,7 +120,7 @@ describe('more than one sequence diagram', () => {
             },
           ]
         `);
    -    const diagram2 = new Diagram(`
    +    const diagram2 = await Diagram.fromText(`
             sequenceDiagram
             Alice->Bob:Hello Bob, how are you?
             Bob-->Alice: I am good thanks!`);
    @@ -147,7 +147,7 @@ describe('more than one sequence diagram', () => {
         `);
     
         // Add John actor
    -    const diagram3 = new Diagram(`
    +    const diagram3 = await Diagram.fromText(`
             sequenceDiagram
             Alice->John:Hello John, how are you?
             John-->Alice: I am good thanks!`);
    @@ -176,8 +176,8 @@ describe('more than one sequence diagram', () => {
     });
     
     describe('when parsing a sequenceDiagram', function () {
    -  beforeEach(function () {
    -    diagram = new Diagram(`
    +  beforeEach(async function () {
    +    diagram = await Diagram.fromText(`
     sequenceDiagram
     Alice->Bob:Hello Bob, how are you?
     Note right of Bob: Bob thinks
    @@ -1613,7 +1613,7 @@ describe('when rendering a sequenceDiagram APA', function () {
         setSiteConfig({ logLevel: 5, sequence: conf });
       });
       let conf;
    -  beforeEach(function () {
    +  beforeEach(async function () {
         mermaidAPI.reset();
     
         // });
    @@ -1632,7 +1632,7 @@ describe('when rendering a sequenceDiagram APA', function () {
           mirrorActors: false,
         };
         setSiteConfig({ logLevel: 5, sequence: conf });
    -    diagram = new Diagram(`
    +    diagram = await Diagram.fromText(`
     sequenceDiagram
     Alice->Bob:Hello Bob, how are you?
     Note right of Bob: Bob thinks
    diff --git a/packages/mermaid/src/diagrams/sequence/svgDraw.js b/packages/mermaid/src/diagrams/sequence/svgDraw.js
    index f81147c10..ef8ed6f00 100644
    --- a/packages/mermaid/src/diagrams/sequence/svgDraw.js
    +++ b/packages/mermaid/src/diagrams/sequence/svgDraw.js
    @@ -10,22 +10,6 @@ export const drawRect = function (elem, rectData) {
       return svgDrawCommon.drawRect(elem, rectData);
     };
     
    -const addPopupInteraction = (id, actorCnt) => {
    -  addFunction(() => {
    -    const arr = document.querySelectorAll(id);
    -    // This will be the case when running in sandboxed mode
    -    if (arr.length === 0) {
    -      return;
    -    }
    -    arr[0].addEventListener('mouseover', function () {
    -      popupMenuUpFunc('actor' + actorCnt + '_popup');
    -    });
    -    arr[0].addEventListener('mouseout', function () {
    -      popupMenuDownFunc('actor' + actorCnt + '_popup');
    -    });
    -  });
    -};
    -
     export const drawPopup = function (elem, actor, minMenuWidth, textAttrs, forceMenus) {
       if (actor.links === undefined || actor.links === null || Object.keys(actor.links).length === 0) {
         return { height: 0, width: 0 };
    @@ -44,7 +28,6 @@ export const drawPopup = function (elem, actor, minMenuWidth, textAttrs, forceMe
       g.attr('id', 'actor' + actorCnt + '_popup');
       g.attr('class', 'actorPopupMenu');
       g.attr('display', displayValue);
    -  addPopupInteraction('#actor' + actorCnt + '_popup', actorCnt);
       var actorClass = '';
       if (rectData.class !== undefined) {
         actorClass = ' ' + rectData.class;
    @@ -90,36 +73,14 @@ export const drawPopup = function (elem, actor, minMenuWidth, textAttrs, forceMe
       return { height: rectData.height + linkY, width: menuWidth };
     };
     
    -export const popupMenu = function (popid) {
    +const popupMenuToggle = function (popid) {
       return (
         "var pu = document.getElementById('" +
         popid +
    -    "'); if (pu != null) { pu.style.display = 'block'; }"
    +    "'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"
       );
     };
     
    -export const popdownMenu = function (popid) {
    -  return (
    -    "var pu = document.getElementById('" +
    -    popid +
    -    "'); if (pu != null) { pu.style.display = 'none'; }"
    -  );
    -};
    -
    -const popupMenuUpFunc = function (popupId) {
    -  var pu = document.getElementById(popupId);
    -  if (pu != null) {
    -    pu.style.display = 'block';
    -  }
    -};
    -
    -const popupMenuDownFunc = function (popupId) {
    -  var pu = document.getElementById(popupId);
    -  if (pu != null) {
    -    pu.style.display = 'none';
    -  }
    -};
    -
     export const drawText = function (elem, textData) {
       let prevTextHeight = 0;
       let textHeight = 0;
    @@ -329,6 +290,9 @@ const drawActorTypeParticipant = function (elem, actor, conf, isFooter) {
     
       if (!isFooter) {
         actorCnt++;
    +    if (Object.keys(actor.links || {}).length && !conf.forceMenus) {
    +      g.attr('onclick', popupMenuToggle(`actor${actorCnt}_popup`)).attr('cursor', 'pointer');
    +    }
         g.append('line')
           .attr('id', 'actor' + actorCnt)
           .attr('x1', center)
    @@ -345,7 +309,6 @@ const drawActorTypeParticipant = function (elem, actor, conf, isFooter) {
     
         if (actor.links != null) {
           g.attr('id', 'root-' + actorCnt);
    -      addPopupInteraction('#root-' + actorCnt, actorCnt);
         }
       }
     
    @@ -1053,8 +1016,6 @@ export default {
       insertClockIcon,
       getTextObj,
       getNoteRect,
    -  popupMenu,
    -  popdownMenu,
       fixLifeLineHeights,
       sanitizeUrl,
     };
    diff --git a/packages/mermaid/src/docs/.vitepress/config.ts b/packages/mermaid/src/docs/.vitepress/config.ts
    index dfea8843f..c11af5904 100644
    --- a/packages/mermaid/src/docs/.vitepress/config.ts
    +++ b/packages/mermaid/src/docs/.vitepress/config.ts
    @@ -1,6 +1,6 @@
    +import { defineConfig, MarkdownOptions } from 'vitepress';
     import { version } from '../../../package.json';
     import MermaidExample from './mermaid-markdown-all.js';
    -import { defineConfig, MarkdownOptions } from 'vitepress';
     
     const allMarkdownTransformers: MarkdownOptions = {
       // the shiki theme to highlight code blocks
    @@ -146,13 +146,14 @@ function sidebarSyntax() {
             { text: 'Pie Chart', link: '/syntax/pie' },
             { text: 'Quadrant Chart', link: '/syntax/quadrantChart' },
             { text: 'Requirement Diagram', link: '/syntax/requirementDiagram' },
    -        { text: 'Gitgraph (Git) Diagram 🔥', link: '/syntax/gitgraph' },
    +        { text: 'Gitgraph (Git) Diagram', link: '/syntax/gitgraph' },
             { text: 'C4 Diagram 🦺⚠️', link: '/syntax/c4' },
    -        { text: 'Mindmaps 🔥', link: '/syntax/mindmap' },
    -        { text: 'Timeline 🔥', link: '/syntax/timeline' },
    -        { text: 'Zenuml 🔥', link: '/syntax/zenuml' },
    +        { text: 'Mindmaps', link: '/syntax/mindmap' },
    +        { text: 'Timeline', link: '/syntax/timeline' },
    +        { text: 'Zenuml', link: '/syntax/zenuml' },
             { text: 'Sankey 🔥', link: '/syntax/sankey' },
             { text: 'XYChart 🔥', link: '/syntax/xyChart' },
    +        { text: 'Packet 🔥', link: '/syntax/packet' },
             { text: 'Other Examples', link: '/syntax/examples' },
           ],
         },
    diff --git a/packages/mermaid/src/docs/syntax/packet.md b/packages/mermaid/src/docs/syntax/packet.md
    new file mode 100644
    index 000000000..b509cf130
    --- /dev/null
    +++ b/packages/mermaid/src/docs/syntax/packet.md
    @@ -0,0 +1,101 @@
    +# Packet Diagram (v+)
    +
    +## Introduction
    +
    +A packet diagram is a visual representation used to illustrate the structure and contents of a network packet. Network packets are the fundamental units of data transferred over a network.
    +
    +## Usage
    +
    +This diagram type is particularly useful for network engineers, educators, and students who require a clear and concise way to represent the structure of network packets.
    +
    +## Syntax
    +
    +```md
    +packet-beta
    +start: "Block name" %% Single-bit block
    +start-end: "Block name" %% Multi-bit blocks
    +... More Fields ...
    +```
    +
    +## Examples
    +
    +```mermaid-example
    +---
    +title: "TCP Packet"
    +---
    +packet-beta
    +0-15: "Source Port"
    +16-31: "Destination Port"
    +32-63: "Sequence Number"
    +64-95: "Acknowledgment Number"
    +96-99: "Data Offset"
    +100-105: "Reserved"
    +106: "URG"
    +107: "ACK"
    +108: "PSH"
    +109: "RST"
    +110: "SYN"
    +111: "FIN"
    +112-127: "Window"
    +128-143: "Checksum"
    +144-159: "Urgent Pointer"
    +160-191: "(Options and Padding)"
    +192-255: "Data (variable length)"
    +```
    +
    +```mermaid-example
    +packet-beta
    +title UDP Packet
    +0-15: "Source Port"
    +16-31: "Destination Port"
    +32-47: "Length"
    +48-63: "Checksum"
    +64-95: "Data (variable length)"
    +```
    +
    +## Details of Syntax
    +
    +- **Ranges**: Each line after the title represents a different field in the packet. The range (e.g., `0-15`) indicates the bit positions in the packet.
    +- **Field Description**: A brief description of what the field represents, enclosed in quotes.
    +
    +## Configuration
    +
    +Please refer to the [configuration](/config/schema-docs/config-defs-packet-diagram-config.html) guide for details.
    +
    +
    diff --git a/packages/mermaid/src/mermaidAPI.spec.ts b/packages/mermaid/src/mermaidAPI.spec.ts
    index ff7cc4bfd..901e19ea1 100644
    --- a/packages/mermaid/src/mermaidAPI.spec.ts
    +++ b/packages/mermaid/src/mermaidAPI.spec.ts
    @@ -1,4 +1,3 @@
    -'use strict';
     import { vi, it, expect, describe, beforeEach } from 'vitest';
     
     // -------------------------------------
    @@ -27,26 +26,26 @@ vi.mock('./diagrams/git/gitGraphRenderer.js');
     vi.mock('./diagrams/gantt/ganttRenderer.js');
     vi.mock('./diagrams/user-journey/journeyRenderer.js');
     vi.mock('./diagrams/pie/pieRenderer.js');
    +vi.mock('./diagrams/packet/renderer.js');
    +vi.mock('./diagrams/xychart/xychartRenderer.js');
     vi.mock('./diagrams/requirement/requirementRenderer.js');
     vi.mock('./diagrams/sequence/sequenceRenderer.js');
     vi.mock('./diagrams/state/stateRenderer-v2.js');
     
     // -------------------------------------
     
    -import mermaid from './mermaid.js';
    +import assignWithDepth from './assignWithDepth.js';
     import type { MermaidConfig } from './config.type.js';
    -
    -import mermaidAPI, { removeExistingElements } from './mermaidAPI.js';
    -import {
    -  createCssStyles,
    -  createUserStyles,
    +import mermaid from './mermaid.js';
    +import mermaidAPI, {
       appendDivSvgG,
       cleanUpSvgCode,
    +  createCssStyles,
    +  createUserStyles,
       putIntoIFrame,
    +  removeExistingElements,
     } from './mermaidAPI.js';
     
    -import assignWithDepth from './assignWithDepth.js';
    -
     // --------------
     // Mocks
     //   To mock a module, first define a mock for it, then (if used explicitly in the tests) import it. Be sure the path points to exactly the same file as is imported in mermaidAPI (the module being tested)
    @@ -56,6 +55,7 @@ vi.mock('./styles.js', () => {
         default: vi.fn().mockReturnValue(' .userStyle { font-weight:bold; }'),
       };
     });
    +
     import getStyles from './styles.js';
     
     vi.mock('stylis', () => {
    @@ -65,6 +65,7 @@ vi.mock('stylis', () => {
         serialize: vi.fn().mockReturnValue('stylis serialized css'),
       };
     });
    +
     import { compile, serialize } from 'stylis';
     import { decodeEntities, encodeEntities } from './utils.js';
     import { Diagram } from './Diagram.js';
    @@ -722,6 +723,8 @@ describe('mermaidAPI', () => {
           { textDiagramType: 'gantt', expectedType: 'gantt' },
           { textDiagramType: 'journey', expectedType: 'journey' },
           { textDiagramType: 'pie', expectedType: 'pie' },
    +      { textDiagramType: 'packet-beta', expectedType: 'packet' },
    +      { textDiagramType: 'xychart-beta', expectedType: 'xychart' },
           { textDiagramType: 'requirementDiagram', expectedType: 'requirement' },
           { textDiagramType: 'sequenceDiagram', expectedType: 'sequence' },
           { textDiagramType: 'stateDiagram-v2', expectedType: 'stateDiagram' },
    diff --git a/packages/mermaid/src/mermaidAPI.ts b/packages/mermaid/src/mermaidAPI.ts
    index 166bc25ad..0b37764ae 100644
    --- a/packages/mermaid/src/mermaidAPI.ts
    +++ b/packages/mermaid/src/mermaidAPI.ts
    @@ -17,7 +17,7 @@ import { compile, serialize, stringify } from 'stylis';
     import { version } from '../package.json';
     import * as configApi from './config.js';
     import { addDiagrams } from './diagram-api/diagram-orchestration.js';
    -import { Diagram, getDiagramFromText as getDiagramFromTextInternal } from './Diagram.js';
    +import { Diagram } from './Diagram.js';
     import errorRenderer from './diagrams/error/errorRenderer.js';
     import { attachFunctions } from './interactionDb.js';
     import { log, setLogLevel } from './logger.js';
    @@ -422,9 +422,9 @@ const render = async function (
       let parseEncounteredException;
     
       try {
    -    diag = await getDiagramFromText(text, { title: processed.title });
    +    diag = await Diagram.fromText(text, { title: processed.title });
       } catch (error) {
    -    diag = new Diagram('error');
    +    diag = await Diagram.fromText('error');
         parseEncounteredException = error;
       }
     
    @@ -536,7 +536,7 @@ function initialize(options: MermaidConfig = {}) {
     
     const getDiagramFromText = (text: string, metadata: Pick = {}) => {
       const { code } = preprocessDiagram(text);
    -  return getDiagramFromTextInternal(code, metadata);
    +  return Diagram.fromText(code, metadata);
     };
     
     /**
    diff --git a/packages/mermaid/src/schemas/config.schema.yaml b/packages/mermaid/src/schemas/config.schema.yaml
    index fd88b3b5e..bf8b90b83 100644
    --- a/packages/mermaid/src/schemas/config.schema.yaml
    +++ b/packages/mermaid/src/schemas/config.schema.yaml
    @@ -50,6 +50,7 @@ required:
       - gitGraph
       - c4
       - sankey
    +  - packet
     properties:
       theme:
         description: |
    @@ -211,6 +212,8 @@ properties:
         $ref: '#/$defs/C4DiagramConfig'
       sankey:
         $ref: '#/$defs/SankeyDiagramConfig'
    +  packet:
    +    $ref: '#/$defs/PacketDiagramConfig'
       dompurifyConfig:
         title: DOM Purify Configuration
         description: Configuration options to pass to the `dompurify` library.
    @@ -2009,6 +2012,43 @@ $defs: # JSON Schema definition (maybe we should move these to a separate file)
             type: string
             default: ''
     
    +  PacketDiagramConfig:
    +    title: Packet Diagram Config
    +    allOf: [{ $ref: '#/$defs/BaseDiagramConfig' }]
    +    description: The object containing configurations specific for packet diagrams.
    +    type: object
    +    unevaluatedProperties: false
    +    properties:
    +      rowHeight:
    +        description: The height of each row in the packet diagram.
    +        type: number
    +        minimum: 1
    +        default: 32
    +      bitWidth:
    +        description: The width of each bit in the packet diagram.
    +        type: number
    +        minimum: 1
    +        default: 32
    +      bitsPerRow:
    +        description: The number of bits to display per row.
    +        type: number
    +        minimum: 1
    +        default: 32
    +      showBits:
    +        description: Toggle to display or hide bit numbers.
    +        type: boolean
    +        default: true
    +      paddingX:
    +        description: The horizontal padding between the blocks in a row.
    +        type: number
    +        minimum: 0
    +        default: 5
    +      paddingY:
    +        description: The vertical padding between the rows.
    +        type: number
    +        minimum: 0
    +        default: 5
    +
       FontCalculator:
         title: Font Calculator
         description: |
    diff --git a/packages/mermaid/src/styles.spec.ts b/packages/mermaid/src/styles.spec.ts
    index d22b0f2ee..a139ff526 100644
    --- a/packages/mermaid/src/styles.spec.ts
    +++ b/packages/mermaid/src/styles.spec.ts
    @@ -27,6 +27,7 @@ import state from './diagrams/state/styles.js';
     import journey from './diagrams/user-journey/styles.js';
     import timeline from './diagrams/timeline/styles.js';
     import mindmap from './diagrams/mindmap/styles.js';
    +import packet from './diagrams/packet/styles.js';
     import themes from './themes/index.js';
     
     async function checkValidStylisCSSStyleSheet(stylisString: string) {
    @@ -94,6 +95,7 @@ describe('styles', () => {
             sequence,
             state,
             timeline,
    +        packet,
           })) {
             test(`should return a valid style for diagram ${diagramId} and theme ${themeId}`, async () => {
               const { default: getStyles, addStylesForDiagram } = await import('./styles.js');
    diff --git a/packages/mermaid/src/themes/theme-dark.js b/packages/mermaid/src/themes/theme-dark.js
    index c56625109..dc7a60009 100644
    --- a/packages/mermaid/src/themes/theme-dark.js
    +++ b/packages/mermaid/src/themes/theme-dark.js
    @@ -1,4 +1,4 @@
    -import { invert, lighten, darken, rgba, adjust, isDark } from 'khroma';
    +import { adjust, darken, invert, isDark, lighten, rgba } from 'khroma';
     import { mkBorder } from './theme-helpers.js';
     
     class Theme {
    @@ -268,6 +268,15 @@ class Theme {
             '#3498db,#2ecc71,#e74c3c,#f1c40f,#bdc3c7,#ffffff,#34495e,#9b59b6,#1abc9c,#e67e22',
         };
     
    +    this.packet = {
    +      startByteColor: this.primaryTextColor,
    +      endByteColor: this.primaryTextColor,
    +      labelColor: this.primaryTextColor,
    +      titleColor: this.primaryTextColor,
    +      blockStrokeColor: this.primaryTextColor,
    +      blockFillColor: this.background,
    +    };
    +
         /* class */
         this.classText = this.primaryTextColor;
     
    diff --git a/packages/mermaid/src/themes/theme-forest.js b/packages/mermaid/src/themes/theme-forest.js
    index 0270f51ff..eda905c66 100644
    --- a/packages/mermaid/src/themes/theme-forest.js
    +++ b/packages/mermaid/src/themes/theme-forest.js
    @@ -1,9 +1,9 @@
    -import { darken, lighten, adjust, invert, isDark } from 'khroma';
    -import { mkBorder } from './theme-helpers.js';
    +import { adjust, darken, invert, isDark, lighten } from 'khroma';
     import {
       oldAttributeBackgroundColorEven,
       oldAttributeBackgroundColorOdd,
     } from './erDiagram-oldHardcodedValues.js';
    +import { mkBorder } from './theme-helpers.js';
     
     class Theme {
       constructor() {
    @@ -240,6 +240,15 @@ class Theme {
           this.quadrantExternalBorderStrokeFill || this.primaryBorderColor;
         this.quadrantTitleFill = this.quadrantTitleFill || this.primaryTextColor;
     
    +    this.packet = {
    +      startByteColor: this.primaryTextColor,
    +      endByteColor: this.primaryTextColor,
    +      labelColor: this.primaryTextColor,
    +      titleColor: this.primaryTextColor,
    +      blockStrokeColor: this.primaryTextColor,
    +      blockFillColor: this.mainBkg,
    +    };
    +
         /* xychart */
         this.xyChart = {
           backgroundColor: this.xyChart?.backgroundColor || this.background,
    diff --git a/packages/mermaid/src/types.ts b/packages/mermaid/src/types.ts
    index 13da88503..487e089dc 100644
    --- a/packages/mermaid/src/types.ts
    +++ b/packages/mermaid/src/types.ts
    @@ -32,3 +32,5 @@ export interface EdgeData {
       labelStyle: string;
       curve: any;
     }
    +
    +export type ArrayElement = A extends readonly (infer T)[] ? T : never;
    diff --git a/packages/parser/langium-config.json b/packages/parser/langium-config.json
    index 999df51b0..c750f049d 100644
    --- a/packages/parser/langium-config.json
    +++ b/packages/parser/langium-config.json
    @@ -6,6 +6,11 @@
           "grammar": "src/language/info/info.langium",
           "fileExtensions": [".mmd", ".mermaid"]
         },
    +    {
    +      "id": "packet",
    +      "grammar": "src/language/packet/packet.langium",
    +      "fileExtensions": [".mmd", ".mermaid"]
    +    },
         {
           "id": "pie",
           "grammar": "src/language/pie/pie.langium",
    diff --git a/packages/parser/src/index.ts b/packages/parser/src/index.ts
    index d966ef897..75f0cb3d8 100644
    --- a/packages/parser/src/index.ts
    +++ b/packages/parser/src/index.ts
    @@ -1,2 +1,11 @@
    +import type { AstNode } from 'langium';
    +
     export * from './language/index.js';
     export * from './parse.js';
    +
    +/**
    + * Exclude/omit all `AstNode` attributes recursively.
    + */
    +export type RecursiveAstOmit = T extends object
    +  ? { [P in keyof T as Exclude]: RecursiveAstOmit }
    +  : T;
    diff --git a/packages/parser/src/language/index.ts b/packages/parser/src/language/index.ts
    index 087bdb6b8..9f1d92ba8 100644
    --- a/packages/parser/src/language/index.ts
    +++ b/packages/parser/src/language/index.ts
    @@ -1,19 +1,25 @@
     export {
       Info,
       MermaidAstType,
    +  Packet,
    +  PacketBlock,
       Pie,
       PieSection,
       isCommon,
       isInfo,
    +  isPacket,
    +  isPacketBlock,
       isPie,
       isPieSection,
     } from './generated/ast.js';
     export {
       InfoGeneratedModule,
       MermaidGeneratedSharedModule,
    +  PacketGeneratedModule,
       PieGeneratedModule,
     } from './generated/module.js';
     
     export * from './common/index.js';
     export * from './info/index.js';
    +export * from './packet/index.js';
     export * from './pie/index.js';
    diff --git a/packages/parser/src/language/packet/index.ts b/packages/parser/src/language/packet/index.ts
    new file mode 100644
    index 000000000..fd3c604b0
    --- /dev/null
    +++ b/packages/parser/src/language/packet/index.ts
    @@ -0,0 +1 @@
    +export * from './module.js';
    diff --git a/packages/parser/src/language/packet/module.ts b/packages/parser/src/language/packet/module.ts
    new file mode 100644
    index 000000000..460d5e535
    --- /dev/null
    +++ b/packages/parser/src/language/packet/module.ts
    @@ -0,0 +1,68 @@
    +import type {
    +  DefaultSharedModuleContext,
    +  LangiumServices,
    +  LangiumSharedServices,
    +  Module,
    +  PartialLangiumServices,
    +} from 'langium';
    +import { EmptyFileSystem, createDefaultModule, createDefaultSharedModule, inject } from 'langium';
    +import { CommonValueConverter } from '../common/valueConverter.js';
    +import { MermaidGeneratedSharedModule, PacketGeneratedModule } from '../generated/module.js';
    +import { PacketTokenBuilder } from './tokenBuilder.js';
    +
    +/**
    + * Declaration of `Packet` services.
    + */
    +type PacketAddedServices = {
    +  parser: {
    +    TokenBuilder: PacketTokenBuilder;
    +    ValueConverter: CommonValueConverter;
    +  };
    +};
    +
    +/**
    + * Union of Langium default services and `Packet` services.
    + */
    +export type PacketServices = LangiumServices & PacketAddedServices;
    +
    +/**
    + * Dependency injection module that overrides Langium default services and
    + * contributes the declared `Packet` services.
    + */
    +export const PacketModule: Module = {
    +  parser: {
    +    TokenBuilder: () => new PacketTokenBuilder(),
    +    ValueConverter: () => new CommonValueConverter(),
    +  },
    +};
    +
    +/**
    + * Create the full set of services required by Langium.
    + *
    + * First inject the shared services by merging two modules:
    + *  - Langium default shared services
    + *  - Services generated by langium-cli
    + *
    + * Then inject the language-specific services by merging three modules:
    + *  - Langium default language-specific services
    + *  - Services generated by langium-cli
    + *  - Services specified in this file
    + * @param context - Optional module context with the LSP connection
    + * @returns An object wrapping the shared services and the language-specific services
    + */
    +export function createPacketServices(context: DefaultSharedModuleContext = EmptyFileSystem): {
    +  shared: LangiumSharedServices;
    +  Packet: PacketServices;
    +} {
    +  const shared: LangiumSharedServices = inject(
    +    createDefaultSharedModule(context),
    +    MermaidGeneratedSharedModule
    +  );
    +  const Packet: PacketServices = inject(
    +    createDefaultModule({ shared }),
    +    PacketGeneratedModule,
    +    PacketModule
    +  );
    +  shared.ServiceRegistry.register(Packet);
    +  return { shared, Packet };
    +}
    diff --git a/packages/parser/src/language/packet/packet.langium b/packages/parser/src/language/packet/packet.langium
    new file mode 100644
    index 000000000..ad30f8df2
    --- /dev/null
    +++ b/packages/parser/src/language/packet/packet.langium
    @@ -0,0 +1,19 @@
    +grammar Packet
    +import "../common/common";
    +
    +entry Packet:
    +  NEWLINE*
    +  "packet-beta"
    +  (
    +    NEWLINE* TitleAndAccessibilities blocks+=PacketBlock*
    +    | NEWLINE+ blocks+=PacketBlock+
    +    | NEWLINE*
    +  )
    +;
    +
    +PacketBlock:
    +  start=INT('-' end=INT)? ':' label=STRING EOL
    +;
    +
    +terminal INT returns number: /0|[1-9][0-9]*/;
    +terminal STRING: /"[^"]*"|'[^']*'/;
    diff --git a/packages/parser/src/language/packet/tokenBuilder.ts b/packages/parser/src/language/packet/tokenBuilder.ts
    new file mode 100644
    index 000000000..accba5675
    --- /dev/null
    +++ b/packages/parser/src/language/packet/tokenBuilder.ts
    @@ -0,0 +1,7 @@
    +import { AbstractMermaidTokenBuilder } from '../common/index.js';
    +
    +export class PacketTokenBuilder extends AbstractMermaidTokenBuilder {
    +  public constructor() {
    +    super(['packet-beta']);
    +  }
    +}
    diff --git a/packages/parser/src/parse.ts b/packages/parser/src/parse.ts
    index aeec983da..577a1cea6 100644
    --- a/packages/parser/src/parse.ts
    +++ b/packages/parser/src/parse.ts
    @@ -1,34 +1,41 @@
     import type { LangiumParser, ParseResult } from 'langium';
     
    -import type { Info, Pie } from './index.js';
    -import { createInfoServices, createPieServices } from './language/index.js';
    +import type { Info, Packet, Pie } from './index.js';
     
    -export type DiagramAST = Info | Pie;
    +export type DiagramAST = Info | Packet | Pie;
     
     const parsers: Record = {};
     const initializers = {
    -  info: () => {
    -    // Will have to make parse async to use this. Can try later...
    -    // const { createInfoServices } = await import('./language/info/index.js');
    -    parsers['info'] = createInfoServices().Info.parser.LangiumParser;
    +  info: async () => {
    +    const { createInfoServices } = await import('./language/info/index.js');
    +    const parser = createInfoServices().Info.parser.LangiumParser;
    +    parsers['info'] = parser;
       },
    -  pie: () => {
    -    parsers['pie'] = createPieServices().Pie.parser.LangiumParser;
    +  packet: async () => {
    +    const { createPacketServices } = await import('./language/packet/index.js');
    +    const parser = createPacketServices().Packet.parser.LangiumParser;
    +    parsers['packet'] = parser;
    +  },
    +  pie: async () => {
    +    const { createPieServices } = await import('./language/pie/index.js');
    +    const parser = createPieServices().Pie.parser.LangiumParser;
    +    parsers['pie'] = parser;
       },
     } as const;
     
    -export function parse(diagramType: 'info', text: string): Info;
    -export function parse(diagramType: 'pie', text: string): Pie;
    -export function parse(
    +export async function parse(diagramType: 'info', text: string): Promise;
    +export async function parse(diagramType: 'packet', text: string): Promise;
    +export async function parse(diagramType: 'pie', text: string): Promise;
    +export async function parse(
       diagramType: keyof typeof initializers,
       text: string
    -): T {
    +): Promise {
       const initializer = initializers[diagramType];
       if (!initializer) {
         throw new Error(`Unknown diagram type: ${diagramType}`);
       }
       if (!parsers[diagramType]) {
    -    initializer();
    +    await initializer();
       }
       const parser: LangiumParser = parsers[diagramType];
       const result: ParseResult = parser.parse(text);
    diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
    index 949e5b8c4..b45cde2de 100644
    --- a/pnpm-lock.yaml
    +++ b/pnpm-lock.yaml
    @@ -9,7 +9,7 @@ importers:
       .:
         devDependencies:
           '@applitools/eyes-cypress':
    -        specifier: ^3.33.1
    +        specifier: ^3.40.6
             version: 3.40.6(typescript@5.3.3)
           '@commitlint/cli':
             specifier: ^17.6.1
    @@ -21,8 +21,8 @@ importers:
             specifier: ^6.31.1
             version: 6.31.3
           '@cypress/code-coverage':
    -        specifier: ^3.10.7
    -        version: 3.12.18(@babel/core@7.23.7)(@babel/preset-env@7.23.8)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0)
    +        specifier: ^3.12.18
    +        version: 3.12.19(@babel/core@7.23.7)(@babel/preset-env@7.23.8)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.90.0)
           '@rollup/plugin-typescript':
             specifier: ^11.1.1
             version: 11.1.6(typescript@5.3.3)
    @@ -49,7 +49,7 @@ importers:
             version: 3.0.15
           '@types/node':
             specifier: ^18.16.0
    -        version: 18.19.8
    +        version: 18.19.9
           '@types/prettier':
             specifier: ^2.7.2
             version: 2.7.3
    @@ -58,10 +58,10 @@ importers:
             version: 4.2.3
           '@typescript-eslint/eslint-plugin':
             specifier: ^6.7.2
    -        version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3)
    +        version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3)
           '@typescript-eslint/parser':
             specifier: ^6.7.2
    -        version: 6.19.0(eslint@8.56.0)(typescript@5.3.3)
    +        version: 6.19.1(eslint@8.56.0)(typescript@5.3.3)
           '@vitest/coverage-v8':
             specifier: ^0.34.0
             version: 0.34.6(vitest@0.34.6)
    @@ -84,14 +84,14 @@ importers:
             specifier: ^2.8.5
             version: 2.8.5
           cypress:
    -        specifier: ^12.10.0
    +        specifier: ^12.17.4
             version: 12.17.4
           cypress-image-snapshot:
             specifier: ^4.0.1
             version: 4.0.1(cypress@12.17.4)(jest@29.7.0)
           esbuild:
             specifier: ^0.19.0
    -        version: 0.19.11
    +        version: 0.19.12
           eslint:
             specifier: ^8.47.0
             version: 8.56.0
    @@ -106,7 +106,7 @@ importers:
             version: 7.1.0
           eslint-plugin-jest:
             specifier: ^27.2.1
    -        version: 27.6.3(@typescript-eslint/eslint-plugin@6.19.0)(eslint@8.56.0)(jest@29.7.0)(typescript@5.3.3)
    +        version: 27.6.3(@typescript-eslint/eslint-plugin@6.19.1)(eslint@8.56.0)(jest@29.7.0)(typescript@5.3.3)
           eslint-plugin-jsdoc:
             specifier: ^46.0.0
             version: 46.10.1(eslint@8.56.0)
    @@ -139,7 +139,7 @@ importers:
             version: 8.0.3
           jest:
             specifier: ^29.5.0
    -        version: 29.7.0(@types/node@18.19.8)(ts-node@10.9.2)
    +        version: 29.7.0(@types/node@18.19.9)(ts-node@10.9.2)
           jison:
             specifier: ^0.4.18
             version: 0.4.18
    @@ -163,7 +163,7 @@ importers:
             version: 1.0.1
           pnpm:
             specifier: ^8.6.8
    -        version: 8.14.1
    +        version: 8.14.3
           prettier:
             specifier: ^2.8.8
             version: 2.8.8
    @@ -187,7 +187,7 @@ importers:
             version: 5.3.3
           vite:
             specifier: ^4.4.12
    -        version: 4.5.2(@types/node@18.19.8)
    +        version: 4.5.2(@types/node@18.19.9)
           vite-plugin-istanbul:
             specifier: ^4.1.0
             version: 4.1.0(vite@4.5.2)
    @@ -356,7 +356,7 @@ importers:
             version: 2.0.3
           type-fest:
             specifier: ^4.1.0
    -        version: 4.9.0
    +        version: 4.10.1
           typedoc:
             specifier: ^0.25.0
             version: 0.25.7(typescript@5.3.3)
    @@ -374,7 +374,7 @@ importers:
             version: 4.1.2
           vitepress:
             specifier: ^1.0.0-alpha.72
    -        version: 1.0.0-rc.39(@algolia/client-search@4.22.1)(@types/node@18.19.8)(postcss@8.4.33)(search-insights@2.13.0)(typescript@5.3.3)
    +        version: 1.0.0-rc.39(@algolia/client-search@4.22.1)(@types/node@18.19.9)(postcss@8.4.33)(search-insights@2.13.0)(typescript@5.3.3)
           vitepress-plugin-search:
             specifier: ^1.0.4-alpha.20
             version: 1.0.4-alpha.22(flexsearch@0.7.43)(vitepress@1.0.0-rc.39)(vue@3.4.15)
    @@ -442,7 +442,7 @@ importers:
         dependencies:
           '@zenuml/core':
             specifier: ^3.0.6
    -        version: 3.16.2(ts-node@10.9.2)(typescript@5.3.3)
    +        version: 3.17.0(ts-node@10.9.2)(typescript@5.3.3)
         devDependencies:
           mermaid:
             specifier: workspace:^
    @@ -465,7 +465,7 @@ importers:
         devDependencies:
           '@iconify-json/carbon':
             specifier: ^1.1.16
    -        version: 1.1.27
    +        version: 1.1.28
           '@unocss/reset':
             specifier: ^0.58.0
             version: 0.58.3
    @@ -492,13 +492,13 @@ importers:
             version: 0.26.0(rollup@2.79.1)(vue@3.4.15)
           vite:
             specifier: ^4.4.12
    -        version: 4.5.2(@types/node@18.19.8)
    +        version: 4.5.2(@types/node@18.19.9)
           vite-plugin-pwa:
             specifier: ^0.17.0
             version: 0.17.4(vite@4.5.2)(workbox-build@7.0.0)(workbox-window@7.0.0)
           vitepress:
             specifier: 1.0.0-rc.39
    -        version: 1.0.0-rc.39(@algolia/client-search@4.22.1)(@types/node@18.19.8)(postcss@8.4.33)(search-insights@2.13.0)(typescript@5.3.3)
    +        version: 1.0.0-rc.39(@algolia/client-search@4.22.1)(@types/node@18.19.9)(postcss@8.4.33)(search-insights@2.13.0)(typescript@5.3.3)
           workbox-window:
             specifier: ^7.0.0
             version: 7.0.0
    @@ -524,13 +524,13 @@ importers:
         devDependencies:
           webpack:
             specifier: ^5.88.2
    -        version: 5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0)
    +        version: 5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0)
           webpack-cli:
             specifier: ^4.10.0
    -        version: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.89.0)
    +        version: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.90.0)
           webpack-dev-server:
             specifier: ^4.11.1
    -        version: 4.15.1(webpack-cli@4.10.0)(webpack@5.89.0)
    +        version: 4.15.1(webpack-cli@4.10.0)(webpack@5.90.0)
     
     packages:
     
    @@ -782,7 +782,7 @@ packages:
           '@types/ws': 8.5.5
           abort-controller: 3.0.0
           chalk: 4.1.2
    -      node-fetch: 2.6.7(encoding@0.1.13)
    +      node-fetch: 2.6.7
           semver: 7.5.4
           webdriver: 7.31.1(typescript@5.3.3)
           ws: 8.13.0
    @@ -872,14 +872,14 @@ packages:
           '@applitools/eg-frpc': 1.0.5
           '@applitools/eg-socks5-proxy-server': 0.5.4
           '@applitools/logger': 1.1.53
    -      dotenv: 16.3.2
    +      dotenv: 16.4.1
           encoding: 0.1.13
           fastify: 3.29.5
           fastify-plugin: 3.0.1
           find-process: 1.4.7
           ini: 3.0.1
           node-cleanup: 2.1.2
    -      node-fetch: 2.6.7(encoding@0.1.13)
    +      node-fetch: 2.7.0(encoding@0.1.13)
           p-retry: 4.6.2
           teen_process: 1.16.0
         transitivePeerDependencies:
    @@ -2230,7 +2230,7 @@ packages:
           babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.7)
           babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7)
           babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.7)
    -      core-js-compat: 3.35.0
    +      core-js-compat: 3.35.1
           semver: 6.3.1
         transitivePeerDependencies:
           - supports-color
    @@ -2448,7 +2448,7 @@ packages:
           lodash.merge: 4.6.2
           lodash.uniq: 4.5.0
           resolve-from: 5.0.0
    -      ts-node: 10.9.2(@types/node@18.19.8)(typescript@5.3.3)
    +      ts-node: 10.9.2(@types/node@18.19.9)(typescript@5.3.3)
           typescript: 5.3.3
         transitivePeerDependencies:
           - '@swc/core'
    @@ -2541,7 +2541,7 @@ packages:
           '@cspell/dict-elixir': 4.0.3
           '@cspell/dict-en-common-misspellings': 1.0.2
           '@cspell/dict-en-gb': 1.1.33
    -      '@cspell/dict-en_us': 4.3.13
    +      '@cspell/dict-en_us': 4.3.14
           '@cspell/dict-filetypes': 3.0.3
           '@cspell/dict-fonts': 3.0.2
           '@cspell/dict-fullstack': 3.1.5
    @@ -2660,8 +2660,8 @@ packages:
         resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==}
         dev: true
     
    -  /@cspell/dict-en_us@4.3.13:
    -    resolution: {integrity: sha512-T6lHiGCjloGNE0d8CogF+efJZPCAP8zdzn+KnlI0Bmjaz5nvG2LTX7CXl1zkOl1nYYev0FuIk9WJ9YPVRjcFbQ==}
    +  /@cspell/dict-en_us@4.3.14:
    +    resolution: {integrity: sha512-Od7vPVNN4td0Fild5BcCPikx+lBJ2L809zWeO3lThYHqtZXqsbaBNzfv9qlB1bXW199Ru461vu02CrklU1oD+Q==}
         dev: true
     
       /@cspell/dict-filetypes@3.0.3:
    @@ -2815,8 +2815,8 @@ packages:
         dependencies:
           '@jridgewell/trace-mapping': 0.3.9
     
    -  /@cypress/code-coverage@3.12.18(@babel/core@7.23.7)(@babel/preset-env@7.23.8)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.89.0):
    -    resolution: {integrity: sha512-RTOyCVr5CWaJ7cW1gOvlXSLDr0HNXZ7xSVfLSZEGsTODbaxeUV01Z1k93spnbVT7ri9UkxCEffPcsZsZi1oDng==}
    +  /@cypress/code-coverage@3.12.19(@babel/core@7.23.7)(@babel/preset-env@7.23.8)(babel-loader@9.1.3)(cypress@12.17.4)(webpack@5.90.0):
    +    resolution: {integrity: sha512-RNpgESArIwX2PG7k0KEb941eSYSBEGF1WB5NPeWrVJMX6KeAxj3Ki5aeYlFeV+wxoAJ+7gcF4s5xV18BQLCpjQ==}
         peerDependencies:
           '@babel/core': ^7.0.1
           '@babel/preset-env': ^7.0.0
    @@ -2826,8 +2826,8 @@ packages:
         dependencies:
           '@babel/core': 7.23.7
           '@babel/preset-env': 7.23.8(@babel/core@7.23.7)
    -      '@cypress/webpack-preprocessor': 6.0.1(@babel/core@7.23.7)(@babel/preset-env@7.23.8)(babel-loader@9.1.3)(webpack@5.89.0)
    -      babel-loader: 9.1.3(@babel/core@7.23.7)(webpack@5.89.0)
    +      '@cypress/webpack-preprocessor': 6.0.1(@babel/core@7.23.7)(@babel/preset-env@7.23.8)(babel-loader@9.1.3)(webpack@5.90.0)
    +      babel-loader: 9.1.3(@babel/core@7.23.7)(webpack@5.90.0)
           chalk: 4.1.2
           cypress: 12.17.4
           dayjs: 1.11.10
    @@ -2837,7 +2837,7 @@ packages:
           istanbul-lib-coverage: 3.2.2
           js-yaml: 4.1.0
           nyc: 15.1.0
    -      webpack: 5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0)
    +      webpack: 5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0)
         transitivePeerDependencies:
           - supports-color
         dev: true
    @@ -2866,7 +2866,7 @@ packages:
           uuid: 8.3.2
         dev: true
     
    -  /@cypress/webpack-preprocessor@6.0.1(@babel/core@7.23.7)(@babel/preset-env@7.23.8)(babel-loader@9.1.3)(webpack@5.89.0):
    +  /@cypress/webpack-preprocessor@6.0.1(@babel/core@7.23.7)(@babel/preset-env@7.23.8)(babel-loader@9.1.3)(webpack@5.90.0):
         resolution: {integrity: sha512-WVNeFVSnFKxE3WZNRIriduTgqJRpevaiJIPlfqYTTzfXRD7X1Pv4woDE+G4caPV9bJqVKmVFiwzrXMRNeJxpxA==}
         peerDependencies:
           '@babel/core': ^7.0.1
    @@ -2876,11 +2876,11 @@ packages:
         dependencies:
           '@babel/core': 7.23.7
           '@babel/preset-env': 7.23.8(@babel/core@7.23.7)
    -      babel-loader: 9.1.3(@babel/core@7.23.7)(webpack@5.89.0)
    +      babel-loader: 9.1.3(@babel/core@7.23.7)(webpack@5.90.0)
           bluebird: 3.7.1
           debug: 4.3.4(supports-color@8.1.1)
           lodash: 4.17.21
    -      webpack: 5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0)
    +      webpack: 5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0)
         transitivePeerDependencies:
           - supports-color
         dev: true
    @@ -2951,8 +2951,8 @@ packages:
           jsdoc-type-pratt-parser: 4.0.0
         dev: true
     
    -  /@esbuild/aix-ppc64@0.19.11:
    -    resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==}
    +  /@esbuild/aix-ppc64@0.19.12:
    +    resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
         engines: {node: '>=12'}
         cpu: [ppc64]
         os: [aix]
    @@ -2969,8 +2969,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/android-arm64@0.19.11:
    -    resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==}
    +  /@esbuild/android-arm64@0.19.12:
    +    resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
         engines: {node: '>=12'}
         cpu: [arm64]
         os: [android]
    @@ -2987,8 +2987,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/android-arm@0.19.11:
    -    resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==}
    +  /@esbuild/android-arm@0.19.12:
    +    resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
         engines: {node: '>=12'}
         cpu: [arm]
         os: [android]
    @@ -3005,8 +3005,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/android-x64@0.19.11:
    -    resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==}
    +  /@esbuild/android-x64@0.19.12:
    +    resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
         engines: {node: '>=12'}
         cpu: [x64]
         os: [android]
    @@ -3023,8 +3023,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/darwin-arm64@0.19.11:
    -    resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==}
    +  /@esbuild/darwin-arm64@0.19.12:
    +    resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
         engines: {node: '>=12'}
         cpu: [arm64]
         os: [darwin]
    @@ -3041,8 +3041,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/darwin-x64@0.19.11:
    -    resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==}
    +  /@esbuild/darwin-x64@0.19.12:
    +    resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
         engines: {node: '>=12'}
         cpu: [x64]
         os: [darwin]
    @@ -3059,8 +3059,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/freebsd-arm64@0.19.11:
    -    resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==}
    +  /@esbuild/freebsd-arm64@0.19.12:
    +    resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
         engines: {node: '>=12'}
         cpu: [arm64]
         os: [freebsd]
    @@ -3077,8 +3077,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/freebsd-x64@0.19.11:
    -    resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==}
    +  /@esbuild/freebsd-x64@0.19.12:
    +    resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
         engines: {node: '>=12'}
         cpu: [x64]
         os: [freebsd]
    @@ -3095,8 +3095,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/linux-arm64@0.19.11:
    -    resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==}
    +  /@esbuild/linux-arm64@0.19.12:
    +    resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
         engines: {node: '>=12'}
         cpu: [arm64]
         os: [linux]
    @@ -3113,8 +3113,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/linux-arm@0.19.11:
    -    resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==}
    +  /@esbuild/linux-arm@0.19.12:
    +    resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
         engines: {node: '>=12'}
         cpu: [arm]
         os: [linux]
    @@ -3131,8 +3131,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/linux-ia32@0.19.11:
    -    resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==}
    +  /@esbuild/linux-ia32@0.19.12:
    +    resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
         engines: {node: '>=12'}
         cpu: [ia32]
         os: [linux]
    @@ -3149,8 +3149,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/linux-loong64@0.19.11:
    -    resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==}
    +  /@esbuild/linux-loong64@0.19.12:
    +    resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
         engines: {node: '>=12'}
         cpu: [loong64]
         os: [linux]
    @@ -3167,8 +3167,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/linux-mips64el@0.19.11:
    -    resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==}
    +  /@esbuild/linux-mips64el@0.19.12:
    +    resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
         engines: {node: '>=12'}
         cpu: [mips64el]
         os: [linux]
    @@ -3185,8 +3185,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/linux-ppc64@0.19.11:
    -    resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==}
    +  /@esbuild/linux-ppc64@0.19.12:
    +    resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
         engines: {node: '>=12'}
         cpu: [ppc64]
         os: [linux]
    @@ -3203,8 +3203,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/linux-riscv64@0.19.11:
    -    resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==}
    +  /@esbuild/linux-riscv64@0.19.12:
    +    resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
         engines: {node: '>=12'}
         cpu: [riscv64]
         os: [linux]
    @@ -3221,8 +3221,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/linux-s390x@0.19.11:
    -    resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==}
    +  /@esbuild/linux-s390x@0.19.12:
    +    resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
         engines: {node: '>=12'}
         cpu: [s390x]
         os: [linux]
    @@ -3239,8 +3239,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/linux-x64@0.19.11:
    -    resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==}
    +  /@esbuild/linux-x64@0.19.12:
    +    resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
         engines: {node: '>=12'}
         cpu: [x64]
         os: [linux]
    @@ -3257,8 +3257,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/netbsd-x64@0.19.11:
    -    resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==}
    +  /@esbuild/netbsd-x64@0.19.12:
    +    resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
         engines: {node: '>=12'}
         cpu: [x64]
         os: [netbsd]
    @@ -3275,8 +3275,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/openbsd-x64@0.19.11:
    -    resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==}
    +  /@esbuild/openbsd-x64@0.19.12:
    +    resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
         engines: {node: '>=12'}
         cpu: [x64]
         os: [openbsd]
    @@ -3293,8 +3293,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/sunos-x64@0.19.11:
    -    resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==}
    +  /@esbuild/sunos-x64@0.19.12:
    +    resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
         engines: {node: '>=12'}
         cpu: [x64]
         os: [sunos]
    @@ -3311,8 +3311,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/win32-arm64@0.19.11:
    -    resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==}
    +  /@esbuild/win32-arm64@0.19.12:
    +    resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
         engines: {node: '>=12'}
         cpu: [arm64]
         os: [win32]
    @@ -3329,8 +3329,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/win32-ia32@0.19.11:
    -    resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==}
    +  /@esbuild/win32-ia32@0.19.12:
    +    resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
         engines: {node: '>=12'}
         cpu: [ia32]
         os: [win32]
    @@ -3347,8 +3347,8 @@ packages:
         dev: true
         optional: true
     
    -  /@esbuild/win32-x64@0.19.11:
    -    resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==}
    +  /@esbuild/win32-x64@0.19.12:
    +    resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
         engines: {node: '>=12'}
         cpu: [x64]
         os: [win32]
    @@ -3496,8 +3496,8 @@ packages:
         resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==}
         dev: true
     
    -  /@iconify-json/carbon@1.1.27:
    -    resolution: {integrity: sha512-tJVXv9+D9cjU5HcaY+8J0awv9AL/Mjo9MWR/fxHfHFPP/iokjPBEgq4jOBDGNe8W0k/BTrVI3zpgZjLoi6RNGg==}
    +  /@iconify-json/carbon@1.1.28:
    +    resolution: {integrity: sha512-tg+h0i+69JrIqUpQva2Mt611KdLMeCyibqS7lIqaMRXJgnalHtdqDcdZAKCSLb/hTbkJHyk0NCpQSYJ3f/v51w==}
         dependencies:
           '@iconify/types': 2.0.0
         dev: true
    @@ -3506,8 +3506,8 @@ packages:
         resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
         dev: true
     
    -  /@iconify/utils@2.1.15:
    -    resolution: {integrity: sha512-8chdk3NhkYiqIVxPRBPN5wGnVYaTqc8XUagCNez84Ex7yK/oNrj1XINVn7zv+JljqZbF6r5B/bd1gRNlMSwYhg==}
    +  /@iconify/utils@2.1.16:
    +    resolution: {integrity: sha512-2q2POA+bg1iKFMT3ZAeS8+Lo2PcbTXH2QKdQ9XwxSyCUg+XHA0ZW7mBoW8v0cU/SgitnM2OheEouPw7mRwY+Bg==}
         dependencies:
           '@antfu/install-pkg': 0.1.1
           '@antfu/utils': 0.7.7
    @@ -3551,7 +3551,7 @@ packages:
         engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
         dependencies:
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           chalk: 4.1.2
           jest-message-util: 29.7.0
           jest-util: 29.7.0
    @@ -3572,14 +3572,14 @@ packages:
           '@jest/test-result': 29.7.0
           '@jest/transform': 29.7.0
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           ansi-escapes: 4.3.2
           chalk: 4.1.2
           ci-info: 3.9.0
           exit: 0.1.2
           graceful-fs: 4.2.11
           jest-changed-files: 29.7.0
    -      jest-config: 29.7.0(@types/node@18.19.8)(ts-node@10.9.2)
    +      jest-config: 29.7.0(@types/node@18.19.9)(ts-node@10.9.2)
           jest-haste-map: 29.7.0
           jest-message-util: 29.7.0
           jest-regex-util: 29.6.3
    @@ -3607,7 +3607,7 @@ packages:
         dependencies:
           '@jest/fake-timers': 29.7.0
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           jest-mock: 29.7.0
         dev: true
     
    @@ -3634,7 +3634,7 @@ packages:
         dependencies:
           '@jest/types': 29.6.3
           '@sinonjs/fake-timers': 10.3.0
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           jest-message-util: 29.7.0
           jest-mock: 29.7.0
           jest-util: 29.7.0
    @@ -3667,7 +3667,7 @@ packages:
           '@jest/transform': 29.7.0
           '@jest/types': 29.6.3
           '@jridgewell/trace-mapping': 0.3.22
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           chalk: 4.1.2
           collect-v8-coverage: 1.0.2
           exit: 0.1.2
    @@ -3755,7 +3755,7 @@ packages:
           '@jest/schemas': 29.6.3
           '@types/istanbul-lib-coverage': 2.0.6
           '@types/istanbul-reports': 3.0.4
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           '@types/yargs': 17.0.32
           chalk: 4.1.2
         dev: true
    @@ -3943,104 +3943,104 @@ packages:
           rollup: 2.79.1
         dev: true
     
    -  /@rollup/rollup-android-arm-eabi@4.9.5:
    -    resolution: {integrity: sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==}
    +  /@rollup/rollup-android-arm-eabi@4.9.6:
    +    resolution: {integrity: sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==}
         cpu: [arm]
         os: [android]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-android-arm64@4.9.5:
    -    resolution: {integrity: sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==}
    +  /@rollup/rollup-android-arm64@4.9.6:
    +    resolution: {integrity: sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==}
         cpu: [arm64]
         os: [android]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-darwin-arm64@4.9.5:
    -    resolution: {integrity: sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==}
    +  /@rollup/rollup-darwin-arm64@4.9.6:
    +    resolution: {integrity: sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==}
         cpu: [arm64]
         os: [darwin]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-darwin-x64@4.9.5:
    -    resolution: {integrity: sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==}
    +  /@rollup/rollup-darwin-x64@4.9.6:
    +    resolution: {integrity: sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==}
         cpu: [x64]
         os: [darwin]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-linux-arm-gnueabihf@4.9.5:
    -    resolution: {integrity: sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==}
    +  /@rollup/rollup-linux-arm-gnueabihf@4.9.6:
    +    resolution: {integrity: sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==}
         cpu: [arm]
         os: [linux]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-linux-arm64-gnu@4.9.5:
    -    resolution: {integrity: sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==}
    +  /@rollup/rollup-linux-arm64-gnu@4.9.6:
    +    resolution: {integrity: sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==}
         cpu: [arm64]
         os: [linux]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-linux-arm64-musl@4.9.5:
    -    resolution: {integrity: sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==}
    +  /@rollup/rollup-linux-arm64-musl@4.9.6:
    +    resolution: {integrity: sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==}
         cpu: [arm64]
         os: [linux]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-linux-riscv64-gnu@4.9.5:
    -    resolution: {integrity: sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==}
    +  /@rollup/rollup-linux-riscv64-gnu@4.9.6:
    +    resolution: {integrity: sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==}
         cpu: [riscv64]
         os: [linux]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-linux-x64-gnu@4.9.5:
    -    resolution: {integrity: sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==}
    +  /@rollup/rollup-linux-x64-gnu@4.9.6:
    +    resolution: {integrity: sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==}
         cpu: [x64]
         os: [linux]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-linux-x64-musl@4.9.5:
    -    resolution: {integrity: sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==}
    +  /@rollup/rollup-linux-x64-musl@4.9.6:
    +    resolution: {integrity: sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==}
         cpu: [x64]
         os: [linux]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-win32-arm64-msvc@4.9.5:
    -    resolution: {integrity: sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==}
    +  /@rollup/rollup-win32-arm64-msvc@4.9.6:
    +    resolution: {integrity: sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==}
         cpu: [arm64]
         os: [win32]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-win32-ia32-msvc@4.9.5:
    -    resolution: {integrity: sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==}
    +  /@rollup/rollup-win32-ia32-msvc@4.9.6:
    +    resolution: {integrity: sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==}
         cpu: [ia32]
         os: [win32]
         requiresBuild: true
         dev: true
         optional: true
     
    -  /@rollup/rollup-win32-x64-msvc@4.9.5:
    -    resolution: {integrity: sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==}
    +  /@rollup/rollup-win32-x64-msvc@4.9.6:
    +    resolution: {integrity: sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==}
         cpu: [x64]
         os: [win32]
         requiresBuild: true
    @@ -4070,8 +4070,8 @@ packages:
         engines: {node: '>=10'}
         dev: true
     
    -  /@sinonjs/commons@3.0.0:
    -    resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==}
    +  /@sinonjs/commons@3.0.1:
    +    resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
         dependencies:
           type-detect: 4.0.8
         dev: true
    @@ -4079,7 +4079,7 @@ packages:
       /@sinonjs/fake-timers@10.3.0:
         resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
         dependencies:
    -      '@sinonjs/commons': 3.0.0
    +      '@sinonjs/commons': 3.0.1
         dev: true
     
       /@surma/rollup-plugin-off-main-thread@2.2.3:
    @@ -4165,13 +4165,13 @@ packages:
         resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
         dependencies:
           '@types/connect': 3.4.38
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/bonjour@3.5.13:
         resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/braces@3.0.4:
    @@ -4183,7 +4183,7 @@ packages:
         dependencies:
           '@types/http-cache-semantics': 4.0.4
           '@types/keyv': 3.1.4
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           '@types/responselike': 1.0.3
         dev: true
     
    @@ -4201,19 +4201,19 @@ packages:
         resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==}
         dependencies:
           '@types/express-serve-static-core': 4.17.41
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/connect@3.4.38:
         resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/cors@2.8.17:
         resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/cytoscape@3.19.16:
    @@ -4451,7 +4451,7 @@ packages:
       /@types/express-serve-static-core@4.17.41:
         resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           '@types/qs': 6.9.11
           '@types/range-parser': 1.2.7
           '@types/send': 0.17.4
    @@ -4478,20 +4478,20 @@ packages:
         resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
         dependencies:
           '@types/minimatch': 5.1.2
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/glob@8.1.0:
         resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==}
         dependencies:
           '@types/minimatch': 5.1.2
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/graceful-fs@4.1.9:
         resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/http-cache-semantics@4.0.4:
    @@ -4505,7 +4505,7 @@ packages:
       /@types/http-proxy@1.17.14:
         resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/istanbul-lib-coverage@2.0.6:
    @@ -4531,7 +4531,7 @@ packages:
       /@types/jsdom@21.1.6:
         resolution: {integrity: sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           '@types/tough-cookie': 4.0.5
           parse5: 7.1.2
         dev: true
    @@ -4543,7 +4543,7 @@ packages:
       /@types/keyv@3.1.4:
         resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/linkify-it@3.0.5:
    @@ -4611,15 +4611,15 @@ packages:
       /@types/node-forge@1.3.11:
         resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
    -  /@types/node@16.18.73:
    -    resolution: {integrity: sha512-GaTgwUNzESSlX9uhTX2RQcwj2KBf/Wda+52TTtuMpgzR2Rvw7NNypQ8BJdc5Wk6osxZHcUZAKip5PtqWsUl31Q==}
    +  /@types/node@16.18.75:
    +    resolution: {integrity: sha512-+FSfZd5mpMDTcIK7bp2GueIcAespzR4FROOXnEst248c85vwthIEwtXYOLgVc/sI4ihE1K/7yO1lEiSgvwAOxA==}
         dev: true
     
    -  /@types/node@18.19.8:
    -    resolution: {integrity: sha512-g1pZtPhsvGVTwmeVoexWZLTQaOvXwoSq//pTL0DHeNzUDrFnir4fgETdhjhIxjVnN+hKOuh98+E1eMLnUXstFg==}
    +  /@types/node@18.19.9:
    +    resolution: {integrity: sha512-oZFKlC8l5YtzGQNT4zC2PiSSKzQVZ8bAwwd+EYdPLtyk0nSEq6O16SkK+rkkT2eflDAbormJgEF3QnH3oDrTSw==}
         dependencies:
           undici-types: 5.26.5
     
    @@ -4652,13 +4652,13 @@ packages:
       /@types/resolve@1.17.1:
         resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/responselike@1.0.3:
         resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/retry@0.12.0:
    @@ -4668,7 +4668,7 @@ packages:
       /@types/rollup-plugin-visualizer@4.2.3:
         resolution: {integrity: sha512-eaAcHN/44KJ1uzLV7NYd6vTS3MsG7rev0eOJVpnsiNwNt/u8HFsOFr/71rZ4urR9il1r7FdZFP7Awky2sK7HAg==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           rollup: 2.79.1
         dev: true
     
    @@ -4680,7 +4680,7 @@ packages:
         resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
         dependencies:
           '@types/mime': 1.3.5
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/serve-index@1.9.4:
    @@ -4694,7 +4694,7 @@ packages:
         dependencies:
           '@types/http-errors': 2.0.4
           '@types/mime': 3.0.4
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/sinonjs__fake-timers@8.1.1:
    @@ -4708,7 +4708,7 @@ packages:
       /@types/sockjs@0.3.36:
         resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/stack-utils@2.0.3:
    @@ -4740,13 +4740,13 @@ packages:
       /@types/ws@8.5.10:
         resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/ws@8.5.5:
         resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
     
       /@types/yargs-parser@21.0.3:
    @@ -4763,7 +4763,7 @@ packages:
         resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
         requiresBuild: true
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
         dev: true
         optional: true
     
    @@ -4795,8 +4795,8 @@ packages:
           - supports-color
         dev: true
     
    -  /@typescript-eslint/eslint-plugin@6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3):
    -    resolution: {integrity: sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==}
    +  /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3):
    +    resolution: {integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==}
         engines: {node: ^16.0.0 || >=18.0.0}
         peerDependencies:
           '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
    @@ -4807,11 +4807,11 @@ packages:
             optional: true
         dependencies:
           '@eslint-community/regexpp': 4.10.0
    -      '@typescript-eslint/parser': 6.19.0(eslint@8.56.0)(typescript@5.3.3)
    -      '@typescript-eslint/scope-manager': 6.19.0
    -      '@typescript-eslint/type-utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3)
    -      '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3)
    -      '@typescript-eslint/visitor-keys': 6.19.0
    +      '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
    +      '@typescript-eslint/scope-manager': 6.19.1
    +      '@typescript-eslint/type-utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
    +      '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
    +      '@typescript-eslint/visitor-keys': 6.19.1
           debug: 4.3.4(supports-color@8.1.1)
           eslint: 8.56.0
           graphemer: 1.4.0
    @@ -4844,8 +4844,8 @@ packages:
           - supports-color
         dev: true
     
    -  /@typescript-eslint/parser@6.19.0(eslint@8.56.0)(typescript@5.3.3):
    -    resolution: {integrity: sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==}
    +  /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3):
    +    resolution: {integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==}
         engines: {node: ^16.0.0 || >=18.0.0}
         peerDependencies:
           eslint: ^7.0.0 || ^8.0.0
    @@ -4854,10 +4854,10 @@ packages:
           typescript:
             optional: true
         dependencies:
    -      '@typescript-eslint/scope-manager': 6.19.0
    -      '@typescript-eslint/types': 6.19.0
    -      '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3)
    -      '@typescript-eslint/visitor-keys': 6.19.0
    +      '@typescript-eslint/scope-manager': 6.19.1
    +      '@typescript-eslint/types': 6.19.1
    +      '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
    +      '@typescript-eslint/visitor-keys': 6.19.1
           debug: 4.3.4(supports-color@8.1.1)
           eslint: 8.56.0
           typescript: 5.3.3
    @@ -4873,12 +4873,12 @@ packages:
           '@typescript-eslint/visitor-keys': 5.62.0
         dev: true
     
    -  /@typescript-eslint/scope-manager@6.19.0:
    -    resolution: {integrity: sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==}
    +  /@typescript-eslint/scope-manager@6.19.1:
    +    resolution: {integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==}
         engines: {node: ^16.0.0 || >=18.0.0}
         dependencies:
    -      '@typescript-eslint/types': 6.19.0
    -      '@typescript-eslint/visitor-keys': 6.19.0
    +      '@typescript-eslint/types': 6.19.1
    +      '@typescript-eslint/visitor-keys': 6.19.1
         dev: true
     
       /@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@5.3.3):
    @@ -4901,8 +4901,8 @@ packages:
           - supports-color
         dev: true
     
    -  /@typescript-eslint/type-utils@6.19.0(eslint@8.56.0)(typescript@5.3.3):
    -    resolution: {integrity: sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==}
    +  /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3):
    +    resolution: {integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==}
         engines: {node: ^16.0.0 || >=18.0.0}
         peerDependencies:
           eslint: ^7.0.0 || ^8.0.0
    @@ -4911,8 +4911,8 @@ packages:
           typescript:
             optional: true
         dependencies:
    -      '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3)
    -      '@typescript-eslint/utils': 6.19.0(eslint@8.56.0)(typescript@5.3.3)
    +      '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
    +      '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3)
           debug: 4.3.4(supports-color@8.1.1)
           eslint: 8.56.0
           ts-api-utils: 1.0.3(typescript@5.3.3)
    @@ -4926,8 +4926,8 @@ packages:
         engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
         dev: true
     
    -  /@typescript-eslint/types@6.19.0:
    -    resolution: {integrity: sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==}
    +  /@typescript-eslint/types@6.19.1:
    +    resolution: {integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==}
         engines: {node: ^16.0.0 || >=18.0.0}
         dev: true
     
    @@ -4952,8 +4952,8 @@ packages:
           - supports-color
         dev: true
     
    -  /@typescript-eslint/typescript-estree@6.19.0(typescript@5.3.3):
    -    resolution: {integrity: sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==}
    +  /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3):
    +    resolution: {integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==}
         engines: {node: ^16.0.0 || >=18.0.0}
         peerDependencies:
           typescript: '*'
    @@ -4961,8 +4961,8 @@ packages:
           typescript:
             optional: true
         dependencies:
    -      '@typescript-eslint/types': 6.19.0
    -      '@typescript-eslint/visitor-keys': 6.19.0
    +      '@typescript-eslint/types': 6.19.1
    +      '@typescript-eslint/visitor-keys': 6.19.1
           debug: 4.3.4(supports-color@8.1.1)
           globby: 11.1.0
           is-glob: 4.0.3
    @@ -4994,8 +4994,8 @@ packages:
           - typescript
         dev: true
     
    -  /@typescript-eslint/utils@6.19.0(eslint@8.56.0)(typescript@5.3.3):
    -    resolution: {integrity: sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==}
    +  /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3):
    +    resolution: {integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==}
         engines: {node: ^16.0.0 || >=18.0.0}
         peerDependencies:
           eslint: ^7.0.0 || ^8.0.0
    @@ -5003,9 +5003,9 @@ packages:
           '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
           '@types/json-schema': 7.0.15
           '@types/semver': 7.5.6
    -      '@typescript-eslint/scope-manager': 6.19.0
    -      '@typescript-eslint/types': 6.19.0
    -      '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.3.3)
    +      '@typescript-eslint/scope-manager': 6.19.1
    +      '@typescript-eslint/types': 6.19.1
    +      '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3)
           eslint: 8.56.0
           semver: 7.5.4
         transitivePeerDependencies:
    @@ -5021,11 +5021,11 @@ packages:
           eslint-visitor-keys: 3.4.3
         dev: true
     
    -  /@typescript-eslint/visitor-keys@6.19.0:
    -    resolution: {integrity: sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==}
    +  /@typescript-eslint/visitor-keys@6.19.1:
    +    resolution: {integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==}
         engines: {node: ^16.0.0 || >=18.0.0}
         dependencies:
    -      '@typescript-eslint/types': 6.19.0
    +      '@typescript-eslint/types': 6.19.1
           eslint-visitor-keys: 3.4.3
         dev: true
     
    @@ -5044,7 +5044,7 @@ packages:
           '@unocss/core': 0.58.3
           '@unocss/reset': 0.58.3
           '@unocss/vite': 0.58.3(rollup@2.79.1)(vite@4.5.2)
    -      vite: 4.5.2(@types/node@18.19.8)
    +      vite: 4.5.2(@types/node@18.19.9)
         transitivePeerDependencies:
           - rollup
         dev: true
    @@ -5122,7 +5122,7 @@ packages:
       /@unocss/preset-icons@0.58.3:
         resolution: {integrity: sha512-SA4Eu4rOQ9+zUgIyK6RacS01ygm0PJWkqKlD8ccrBqEyZapqiU+vLL+v6X8YVjoZjR+5CVgcMD5Km7zEQgqXQw==}
         dependencies:
    -      '@iconify/utils': 2.1.15
    +      '@iconify/utils': 2.1.16
           '@unocss/core': 0.58.3
           ofetch: 1.3.3
         transitivePeerDependencies:
    @@ -5242,7 +5242,7 @@ packages:
           chokidar: 3.5.3
           fast-glob: 3.3.2
           magic-string: 0.30.5
    -      vite: 4.5.2(@types/node@18.19.8)
    +      vite: 4.5.2(@types/node@18.19.9)
         transitivePeerDependencies:
           - rollup
         dev: true
    @@ -5262,7 +5262,7 @@ packages:
           vite: ^4.0.0 || ^5.0.0
           vue: ^3.2.25
         dependencies:
    -      vite: 4.5.2(@types/node@18.19.8)
    +      vite: 4.5.2(@types/node@18.19.9)
           vue: 3.4.15(typescript@5.3.3)
         dev: true
     
    @@ -5273,7 +5273,7 @@ packages:
           vite: ^5.0.0
           vue: ^3.2.25
         dependencies:
    -      vite: 5.0.12(@types/node@18.19.8)
    +      vite: 5.0.12(@types/node@18.19.9)
           vue: 3.4.15(typescript@5.3.3)
         dev: true
     
    @@ -5553,7 +5553,7 @@ packages:
           typescript:
             optional: true
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           got: 11.8.6
           typescript: 5.3.3
         dev: true
    @@ -5675,14 +5675,14 @@ packages:
           '@xtuc/long': 4.2.2
         dev: true
     
    -  /@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.89.0):
    +  /@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.90.0):
         resolution: {integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==}
         peerDependencies:
           webpack: 4.x.x || 5.x.x
           webpack-cli: 4.x.x
         dependencies:
    -      webpack: 5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0)
    -      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.89.0)
    +      webpack: 5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0)
    +      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.90.0)
         dev: true
     
       /@webpack-cli/info@1.5.0(webpack-cli@4.10.0):
    @@ -5691,7 +5691,7 @@ packages:
           webpack-cli: 4.x.x
         dependencies:
           envinfo: 7.11.0
    -      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.89.0)
    +      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.90.0)
         dev: true
     
       /@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@4.15.1):
    @@ -5703,8 +5703,8 @@ packages:
           webpack-dev-server:
             optional: true
         dependencies:
    -      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.89.0)
    -      webpack-dev-server: 4.15.1(webpack-cli@4.10.0)(webpack@5.89.0)
    +      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.90.0)
    +      webpack-dev-server: 4.15.1(webpack-cli@4.10.0)(webpack@5.90.0)
         dev: true
     
       /@xmldom/xmldom@0.8.10:
    @@ -5720,8 +5720,8 @@ packages:
         resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
         dev: true
     
    -  /@zenuml/core@3.16.2(ts-node@10.9.2)(typescript@5.3.3):
    -    resolution: {integrity: sha512-/w4MC/NuXI8HgyH658zKGNsWZ9gA3Q+lpb8hrJD0/7Bwxtxue7dh+8qkXj64vHX0Wa7H04H6toNtDdZczuIsMQ==}
    +  /@zenuml/core@3.17.0(ts-node@10.9.2)(typescript@5.3.3):
    +    resolution: {integrity: sha512-MfxTLeCDXNyiuJH8qZyuMVM76wMx8dJ5hJFpzw7/RiPHp5AaWjVt8m4L2n/+RZaNaXlNEuNT7wiGmurM4qGRxg==}
         engines: {node: '>=12.0.0'}
         dependencies:
           '@headlessui-float/vue': 0.11.4(vue@3.4.15)
    @@ -6157,8 +6157,8 @@ packages:
         resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
         dev: true
     
    -  /axios@1.6.5(debug@4.3.4):
    -    resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==}
    +  /axios@1.6.6(debug@4.3.4):
    +    resolution: {integrity: sha512-XZLZDFfXKM9U/Y/B4nNynfCRUqNyVZ4sBC/n9GDRCkq9vd2mIvKjKKsbIh1WPmHmNbg6ND7cTBY3Y2+u1G3/2Q==}
         dependencies:
           follow-redirects: 1.15.5(debug@4.3.4)
           form-data: 4.0.0
    @@ -6185,7 +6185,7 @@ packages:
           - supports-color
         dev: true
     
    -  /babel-loader@9.1.3(@babel/core@7.23.7)(webpack@5.89.0):
    +  /babel-loader@9.1.3(@babel/core@7.23.7)(webpack@5.90.0):
         resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==}
         engines: {node: '>= 14.15.0'}
         peerDependencies:
    @@ -6195,7 +6195,7 @@ packages:
           '@babel/core': 7.23.7
           find-cache-dir: 4.0.0
           schema-utils: 4.2.0
    -      webpack: 5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0)
    +      webpack: 5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0)
         dev: true
     
       /babel-plugin-istanbul@6.1.1:
    @@ -6241,7 +6241,7 @@ packages:
         dependencies:
           '@babel/core': 7.23.7
           '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7)
    -      core-js-compat: 3.35.0
    +      core-js-compat: 3.35.1
         transitivePeerDependencies:
           - supports-color
         dev: true
    @@ -6407,8 +6407,8 @@ packages:
         engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
         hasBin: true
         dependencies:
    -      caniuse-lite: 1.0.30001579
    -      electron-to-chromium: 1.4.640
    +      caniuse-lite: 1.0.30001580
    +      electron-to-chromium: 1.4.645
           node-releases: 2.0.14
           update-browserslist-db: 1.0.13(browserslist@4.22.2)
         dev: true
    @@ -6550,8 +6550,8 @@ packages:
         engines: {node: '>=10'}
         dev: true
     
    -  /caniuse-lite@1.0.30001579:
    -    resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==}
    +  /caniuse-lite@1.0.30001580:
    +    resolution: {integrity: sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==}
         dev: true
     
       /caseless@0.12.0:
    @@ -7069,8 +7069,8 @@ packages:
         engines: {node: '>= 0.6'}
         dev: true
     
    -  /core-js-compat@3.35.0:
    -    resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==}
    +  /core-js-compat@3.35.1:
    +    resolution: {integrity: sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==}
         dependencies:
           browserslist: 4.22.2
         dev: true
    @@ -7114,7 +7114,7 @@ packages:
         dependencies:
           '@types/node': 20.5.1
           cosmiconfig: 8.3.6(typescript@5.3.3)
    -      ts-node: 10.9.2(@types/node@18.19.8)(typescript@5.3.3)
    +      ts-node: 10.9.2(@types/node@18.19.9)(typescript@5.3.3)
           typescript: 5.3.3
         dev: true
     
    @@ -7177,7 +7177,7 @@ packages:
           p-map: 5.5.0
         dev: true
     
    -  /create-jest@29.7.0(@types/node@18.19.8)(ts-node@10.9.2):
    +  /create-jest@29.7.0(@types/node@18.19.9)(ts-node@10.9.2):
         resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
         engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
         hasBin: true
    @@ -7186,7 +7186,7 @@ packages:
           chalk: 4.1.2
           exit: 0.1.2
           graceful-fs: 4.2.11
    -      jest-config: 29.7.0(@types/node@18.19.8)(ts-node@10.9.2)
    +      jest-config: 29.7.0(@types/node@18.19.9)(ts-node@10.9.2)
           jest-util: 29.7.0
           prompts: 2.4.2
         transitivePeerDependencies:
    @@ -7264,7 +7264,7 @@ packages:
         engines: {node: '>=14'}
         dependencies:
           '@cspell/cspell-service-bus': 6.31.3
    -      node-fetch: 2.7.0
    +      node-fetch: 2.7.0(encoding@0.1.13)
         transitivePeerDependencies:
           - encoding
         dev: true
    @@ -7397,7 +7397,7 @@ packages:
         dependencies:
           '@cypress/request': 2.88.12
           '@cypress/xvfb': 1.2.4(supports-color@8.1.1)
    -      '@types/node': 16.18.73
    +      '@types/node': 16.18.75
           '@types/sinonjs__fake-timers': 8.1.1
           '@types/sizzle': 2.3.8
           arch: 2.2.0
    @@ -7518,7 +7518,7 @@ packages:
         resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==}
         engines: {node: '>=12'}
         dependencies:
    -      delaunator: 5.0.0
    +      delaunator: 5.0.1
         dev: false
     
       /d3-dispatch@3.0.1:
    @@ -7939,8 +7939,8 @@ packages:
         resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
         dev: true
     
    -  /delaunator@5.0.0:
    -    resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==}
    +  /delaunator@5.0.1:
    +    resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
         dependencies:
           robust-predicates: 3.0.2
         dev: false
    @@ -8074,8 +8074,8 @@ packages:
           is-obj: 2.0.0
         dev: true
     
    -  /dotenv@16.3.2:
    -    resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==}
    +  /dotenv@16.4.1:
    +    resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==}
         engines: {node: '>=12'}
         dev: true
     
    @@ -8109,8 +8109,8 @@ packages:
           jake: 10.8.7
         dev: true
     
    -  /electron-to-chromium@1.4.640:
    -    resolution: {integrity: sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==}
    +  /electron-to-chromium@1.4.645:
    +    resolution: {integrity: sha512-EeS1oQDCmnYsRDRy2zTeC336a/4LZ6WKqvSaM1jLocEk5ZuyszkQtCpsqvuvaIXGOUjwtvF6LTcS8WueibXvSw==}
         dev: true
     
       /elkjs@0.8.2:
    @@ -8322,35 +8322,35 @@ packages:
           '@esbuild/win32-x64': 0.18.20
         dev: true
     
    -  /esbuild@0.19.11:
    -    resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==}
    +  /esbuild@0.19.12:
    +    resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
         engines: {node: '>=12'}
         hasBin: true
         requiresBuild: true
         optionalDependencies:
    -      '@esbuild/aix-ppc64': 0.19.11
    -      '@esbuild/android-arm': 0.19.11
    -      '@esbuild/android-arm64': 0.19.11
    -      '@esbuild/android-x64': 0.19.11
    -      '@esbuild/darwin-arm64': 0.19.11
    -      '@esbuild/darwin-x64': 0.19.11
    -      '@esbuild/freebsd-arm64': 0.19.11
    -      '@esbuild/freebsd-x64': 0.19.11
    -      '@esbuild/linux-arm': 0.19.11
    -      '@esbuild/linux-arm64': 0.19.11
    -      '@esbuild/linux-ia32': 0.19.11
    -      '@esbuild/linux-loong64': 0.19.11
    -      '@esbuild/linux-mips64el': 0.19.11
    -      '@esbuild/linux-ppc64': 0.19.11
    -      '@esbuild/linux-riscv64': 0.19.11
    -      '@esbuild/linux-s390x': 0.19.11
    -      '@esbuild/linux-x64': 0.19.11
    -      '@esbuild/netbsd-x64': 0.19.11
    -      '@esbuild/openbsd-x64': 0.19.11
    -      '@esbuild/sunos-x64': 0.19.11
    -      '@esbuild/win32-arm64': 0.19.11
    -      '@esbuild/win32-ia32': 0.19.11
    -      '@esbuild/win32-x64': 0.19.11
    +      '@esbuild/aix-ppc64': 0.19.12
    +      '@esbuild/android-arm': 0.19.12
    +      '@esbuild/android-arm64': 0.19.12
    +      '@esbuild/android-x64': 0.19.12
    +      '@esbuild/darwin-arm64': 0.19.12
    +      '@esbuild/darwin-x64': 0.19.12
    +      '@esbuild/freebsd-arm64': 0.19.12
    +      '@esbuild/freebsd-x64': 0.19.12
    +      '@esbuild/linux-arm': 0.19.12
    +      '@esbuild/linux-arm64': 0.19.12
    +      '@esbuild/linux-ia32': 0.19.12
    +      '@esbuild/linux-loong64': 0.19.12
    +      '@esbuild/linux-mips64el': 0.19.12
    +      '@esbuild/linux-ppc64': 0.19.12
    +      '@esbuild/linux-riscv64': 0.19.12
    +      '@esbuild/linux-s390x': 0.19.12
    +      '@esbuild/linux-x64': 0.19.12
    +      '@esbuild/netbsd-x64': 0.19.12
    +      '@esbuild/openbsd-x64': 0.19.12
    +      '@esbuild/sunos-x64': 0.19.12
    +      '@esbuild/win32-arm64': 0.19.12
    +      '@esbuild/win32-ia32': 0.19.12
    +      '@esbuild/win32-x64': 0.19.12
         dev: true
     
       /escalade@3.1.1:
    @@ -8418,7 +8418,7 @@ packages:
           htmlparser2: 8.0.2
         dev: true
     
    -  /eslint-plugin-jest@27.6.3(@typescript-eslint/eslint-plugin@6.19.0)(eslint@8.56.0)(jest@29.7.0)(typescript@5.3.3):
    +  /eslint-plugin-jest@27.6.3(@typescript-eslint/eslint-plugin@6.19.1)(eslint@8.56.0)(jest@29.7.0)(typescript@5.3.3):
         resolution: {integrity: sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA==}
         engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
         peerDependencies:
    @@ -8431,10 +8431,10 @@ packages:
           jest:
             optional: true
         dependencies:
    -      '@typescript-eslint/eslint-plugin': 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3)
    +      '@typescript-eslint/eslint-plugin': 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3)
           '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3)
           eslint: 8.56.0
    -      jest: 29.7.0(@types/node@18.19.8)(ts-node@10.9.2)
    +      jest: 29.7.0(@types/node@18.19.9)(ts-node@10.9.2)
         transitivePeerDependencies:
           - supports-color
           - typescript
    @@ -10414,7 +10414,7 @@ packages:
           '@jest/expect': 29.7.0
           '@jest/test-result': 29.7.0
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           chalk: 4.1.2
           co: 4.6.0
           dedent: 1.5.1
    @@ -10435,7 +10435,7 @@ packages:
           - supports-color
         dev: true
     
    -  /jest-cli@29.7.0(@types/node@18.19.8)(ts-node@10.9.2):
    +  /jest-cli@29.7.0(@types/node@18.19.9)(ts-node@10.9.2):
         resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
         engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
         hasBin: true
    @@ -10449,10 +10449,10 @@ packages:
           '@jest/test-result': 29.7.0
           '@jest/types': 29.6.3
           chalk: 4.1.2
    -      create-jest: 29.7.0(@types/node@18.19.8)(ts-node@10.9.2)
    +      create-jest: 29.7.0(@types/node@18.19.9)(ts-node@10.9.2)
           exit: 0.1.2
           import-local: 3.1.0
    -      jest-config: 29.7.0(@types/node@18.19.8)(ts-node@10.9.2)
    +      jest-config: 29.7.0(@types/node@18.19.9)(ts-node@10.9.2)
           jest-util: 29.7.0
           jest-validate: 29.7.0
           yargs: 17.7.2
    @@ -10463,7 +10463,7 @@ packages:
           - ts-node
         dev: true
     
    -  /jest-config@29.7.0(@types/node@18.19.8)(ts-node@10.9.2):
    +  /jest-config@29.7.0(@types/node@18.19.9)(ts-node@10.9.2):
         resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
         engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
         peerDependencies:
    @@ -10478,7 +10478,7 @@ packages:
           '@babel/core': 7.23.7
           '@jest/test-sequencer': 29.7.0
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           babel-jest: 29.7.0(@babel/core@7.23.7)
           chalk: 4.1.2
           ci-info: 3.9.0
    @@ -10498,7 +10498,7 @@ packages:
           pretty-format: 29.7.0
           slash: 3.0.0
           strip-json-comments: 3.1.1
    -      ts-node: 10.9.2(@types/node@18.19.8)(typescript@5.3.3)
    +      ts-node: 10.9.2(@types/node@18.19.9)(typescript@5.3.3)
         transitivePeerDependencies:
           - babel-plugin-macros
           - supports-color
    @@ -10539,7 +10539,7 @@ packages:
           '@jest/environment': 29.7.0
           '@jest/fake-timers': 29.7.0
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           jest-mock: 29.7.0
           jest-util: 29.7.0
         dev: true
    @@ -10555,7 +10555,7 @@ packages:
         dependencies:
           '@jest/types': 29.6.3
           '@types/graceful-fs': 4.1.9
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           anymatch: 3.1.3
           fb-watchman: 2.0.2
           graceful-fs: 4.2.11
    @@ -10577,7 +10577,7 @@ packages:
           chalk: 1.1.3
           get-stdin: 5.0.1
           glur: 1.1.2
    -      jest: 29.7.0(@types/node@18.19.8)(ts-node@10.9.2)
    +      jest: 29.7.0(@types/node@18.19.9)(ts-node@10.9.2)
           lodash: 4.17.21
           mkdirp: 0.5.6
           pixelmatch: 5.3.0
    @@ -10624,7 +10624,7 @@ packages:
         engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
         dependencies:
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           jest-util: 29.7.0
         dev: true
     
    @@ -10679,7 +10679,7 @@ packages:
           '@jest/test-result': 29.7.0
           '@jest/transform': 29.7.0
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           chalk: 4.1.2
           emittery: 0.13.1
           graceful-fs: 4.2.11
    @@ -10710,7 +10710,7 @@ packages:
           '@jest/test-result': 29.7.0
           '@jest/transform': 29.7.0
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           chalk: 4.1.2
           cjs-module-lexer: 1.2.3
           collect-v8-coverage: 1.0.2
    @@ -10762,7 +10762,7 @@ packages:
         engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
         dependencies:
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           chalk: 4.1.2
           ci-info: 3.9.0
           graceful-fs: 4.2.11
    @@ -10787,7 +10787,7 @@ packages:
         dependencies:
           '@jest/test-result': 29.7.0
           '@jest/types': 29.6.3
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           ansi-escapes: 4.3.2
           chalk: 4.1.2
           emittery: 0.13.1
    @@ -10799,7 +10799,7 @@ packages:
         resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
         engines: {node: '>= 10.13.0'}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           merge-stream: 2.0.0
           supports-color: 7.2.0
         dev: true
    @@ -10808,7 +10808,7 @@ packages:
         resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
         engines: {node: '>= 10.13.0'}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           merge-stream: 2.0.0
           supports-color: 8.1.1
         dev: true
    @@ -10817,13 +10817,13 @@ packages:
         resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
         engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           jest-util: 29.7.0
           merge-stream: 2.0.0
           supports-color: 8.1.1
         dev: true
     
    -  /jest@29.7.0(@types/node@18.19.8)(ts-node@10.9.2):
    +  /jest@29.7.0(@types/node@18.19.9)(ts-node@10.9.2):
         resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
         engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
         hasBin: true
    @@ -10836,7 +10836,7 @@ packages:
           '@jest/core': 29.7.0(ts-node@10.9.2)
           '@jest/types': 29.6.3
           import-local: 3.1.0
    -      jest-cli: 29.7.0(@types/node@18.19.8)(ts-node@10.9.2)
    +      jest-cli: 29.7.0(@types/node@18.19.9)(ts-node@10.9.2)
         transitivePeerDependencies:
           - '@types/node'
           - babel-plugin-macros
    @@ -11032,8 +11032,8 @@ packages:
         hasBin: true
         dev: true
     
    -  /jsonc-parser@3.2.0:
    -    resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
    +  /jsonc-parser@3.2.1:
    +    resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
         dev: true
     
       /jsonfile@4.0.0:
    @@ -12203,7 +12203,7 @@ packages:
         resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==}
         dev: true
     
    -  /node-fetch@2.6.7(encoding@0.1.13):
    +  /node-fetch@2.6.7:
         resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
         engines: {node: 4.x || >=6.0.0}
         peerDependencies:
    @@ -12212,11 +12212,10 @@ packages:
           encoding:
             optional: true
         dependencies:
    -      encoding: 0.1.13
           whatwg-url: 5.0.0
         dev: true
     
    -  /node-fetch@2.7.0:
    +  /node-fetch@2.7.0(encoding@0.1.13):
         resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
         engines: {node: 4.x || >=6.0.0}
         peerDependencies:
    @@ -12225,6 +12224,7 @@ packages:
           encoding:
             optional: true
         dependencies:
    +      encoding: 0.1.13
           whatwg-url: 5.0.0
         dev: true
     
    @@ -12826,7 +12826,7 @@ packages:
       /pkg-types@1.0.3:
         resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
         dependencies:
    -      jsonc-parser: 3.2.0
    +      jsonc-parser: 3.2.1
           mlly: 1.5.0
           pathe: 1.1.2
         dev: true
    @@ -12859,8 +12859,8 @@ packages:
         engines: {node: '>=12.13.0'}
         dev: true
     
    -  /pnpm@8.14.1:
    -    resolution: {integrity: sha512-hWxOzZfF0/MDVOvDc80y+zcnQpXEidstD2E6HmDwEMrfuxUDbVJfOgbewYl+QhmzxPbTvo8vYvsKNmvuaqp1Mw==}
    +  /pnpm@8.14.3:
    +    resolution: {integrity: sha512-w+2A61g74+K37zHrlri5z6oFA+XUTscXUUEgtRh7L5M3NukDjFGlojrVgnkLpB1Kt4RhjIn6fiNl9mZWhdYS7g==}
         engines: {node: '>=16.14'}
         hasBin: true
         dev: true
    @@ -12908,7 +12908,7 @@ packages:
         dependencies:
           lilconfig: 3.0.0
           postcss: 8.4.33
    -      ts-node: 10.9.2(@types/node@18.19.8)(typescript@5.3.3)
    +      ts-node: 10.9.2(@types/node@18.19.9)(typescript@5.3.3)
           yaml: 2.3.4
         dev: false
     
    @@ -13569,26 +13569,26 @@ packages:
           fsevents: 2.3.3
         dev: true
     
    -  /rollup@4.9.5:
    -    resolution: {integrity: sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==}
    +  /rollup@4.9.6:
    +    resolution: {integrity: sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==}
         engines: {node: '>=18.0.0', npm: '>=8.0.0'}
         hasBin: true
         dependencies:
           '@types/estree': 1.0.5
         optionalDependencies:
    -      '@rollup/rollup-android-arm-eabi': 4.9.5
    -      '@rollup/rollup-android-arm64': 4.9.5
    -      '@rollup/rollup-darwin-arm64': 4.9.5
    -      '@rollup/rollup-darwin-x64': 4.9.5
    -      '@rollup/rollup-linux-arm-gnueabihf': 4.9.5
    -      '@rollup/rollup-linux-arm64-gnu': 4.9.5
    -      '@rollup/rollup-linux-arm64-musl': 4.9.5
    -      '@rollup/rollup-linux-riscv64-gnu': 4.9.5
    -      '@rollup/rollup-linux-x64-gnu': 4.9.5
    -      '@rollup/rollup-linux-x64-musl': 4.9.5
    -      '@rollup/rollup-win32-arm64-msvc': 4.9.5
    -      '@rollup/rollup-win32-ia32-msvc': 4.9.5
    -      '@rollup/rollup-win32-x64-msvc': 4.9.5
    +      '@rollup/rollup-android-arm-eabi': 4.9.6
    +      '@rollup/rollup-android-arm64': 4.9.6
    +      '@rollup/rollup-darwin-arm64': 4.9.6
    +      '@rollup/rollup-darwin-x64': 4.9.6
    +      '@rollup/rollup-linux-arm-gnueabihf': 4.9.6
    +      '@rollup/rollup-linux-arm64-gnu': 4.9.6
    +      '@rollup/rollup-linux-arm64-musl': 4.9.6
    +      '@rollup/rollup-linux-riscv64-gnu': 4.9.6
    +      '@rollup/rollup-linux-x64-gnu': 4.9.6
    +      '@rollup/rollup-linux-x64-musl': 4.9.6
    +      '@rollup/rollup-win32-arm64-msvc': 4.9.6
    +      '@rollup/rollup-win32-ia32-msvc': 4.9.6
    +      '@rollup/rollup-win32-x64-msvc': 4.9.6
           fsevents: 2.3.3
         dev: true
     
    @@ -13864,7 +13864,7 @@ packages:
         resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==}
         dependencies:
           ansi-sequence-parser: 1.1.1
    -      jsonc-parser: 3.2.0
    +      jsonc-parser: 3.2.1
           vscode-oniguruma: 1.7.0
           vscode-textmate: 8.0.0
         dev: true
    @@ -14053,21 +14053,21 @@ packages:
           spdx-license-ids: 3.0.16
         dev: true
     
    -  /spdx-exceptions@2.3.0:
    -    resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
    +  /spdx-exceptions@2.4.0:
    +    resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==}
         dev: true
     
       /spdx-expression-parse@3.0.1:
         resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
         dependencies:
    -      spdx-exceptions: 2.3.0
    +      spdx-exceptions: 2.4.0
           spdx-license-ids: 3.0.16
         dev: true
     
       /spdx-expression-parse@4.0.0:
         resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==}
         dependencies:
    -      spdx-exceptions: 2.3.0
    +      spdx-exceptions: 2.4.0
           spdx-license-ids: 3.0.16
         dev: true
     
    @@ -14486,7 +14486,7 @@ packages:
           iterm2-version: 4.2.0
         dev: true
     
    -  /terser-webpack-plugin@5.3.10(esbuild@0.19.11)(webpack@5.89.0):
    +  /terser-webpack-plugin@5.3.10(esbuild@0.19.12)(webpack@5.90.0):
         resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==}
         engines: {node: '>= 10.13.0'}
         peerDependencies:
    @@ -14503,12 +14503,12 @@ packages:
             optional: true
         dependencies:
           '@jridgewell/trace-mapping': 0.3.22
    -      esbuild: 0.19.11
    +      esbuild: 0.19.12
           jest-worker: 27.5.1
           schema-utils: 3.3.0
           serialize-javascript: 6.0.2
           terser: 5.27.0
    -      webpack: 5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0)
    +      webpack: 5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0)
         dev: true
     
       /terser@5.27.0:
    @@ -14711,7 +14711,7 @@ packages:
         resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
         dev: false
     
    -  /ts-node@10.9.2(@types/node@18.19.8)(typescript@5.3.3):
    +  /ts-node@10.9.2(@types/node@18.19.9)(typescript@5.3.3):
         resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
         hasBin: true
         peerDependencies:
    @@ -14730,7 +14730,7 @@ packages:
           '@tsconfig/node12': 1.0.11
           '@tsconfig/node14': 1.0.3
           '@tsconfig/node16': 1.0.4
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           acorn: 8.11.3
           acorn-walk: 8.3.2
           arg: 4.1.3
    @@ -14768,7 +14768,7 @@ packages:
         engines: {node: '>=18.0.0'}
         hasBin: true
         dependencies:
    -      esbuild: 0.19.11
    +      esbuild: 0.19.12
           get-tsconfig: 4.7.2
         optionalDependencies:
           fsevents: 2.3.3
    @@ -14831,8 +14831,8 @@ packages:
         engines: {node: '>=10'}
         dev: true
     
    -  /type-fest@4.9.0:
    -    resolution: {integrity: sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==}
    +  /type-fest@4.10.1:
    +    resolution: {integrity: sha512-7ZnJYTp6uc04uYRISWtiX3DSKB/fxNQT0B5o1OUeCqiQiwF+JC9+rJiZIDrPrNCLLuTqyQmh4VdQqh/ZOkv9MQ==}
         engines: {node: '>=16'}
         dev: true
     
    @@ -15094,7 +15094,7 @@ packages:
           '@unocss/transformer-directives': 0.58.3
           '@unocss/transformer-variant-group': 0.58.3
           '@unocss/vite': 0.58.3(rollup@2.79.1)(vite@4.5.2)
    -      vite: 4.5.2(@types/node@18.19.8)
    +      vite: 4.5.2(@types/node@18.19.9)
         transitivePeerDependencies:
           - postcss
           - rollup
    @@ -15255,7 +15255,7 @@ packages:
           vfile-message: 3.1.4
         dev: true
     
    -  /vite-node@0.34.6(@types/node@18.19.8):
    +  /vite-node@0.34.6(@types/node@18.19.9):
         resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==}
         engines: {node: '>=v14.18.0'}
         hasBin: true
    @@ -15265,7 +15265,7 @@ packages:
           mlly: 1.5.0
           pathe: 1.1.2
           picocolors: 1.0.0
    -      vite: 4.5.2(@types/node@18.19.8)
    +      vite: 4.5.2(@types/node@18.19.9)
         transitivePeerDependencies:
           - '@types/node'
           - less
    @@ -15286,7 +15286,7 @@ packages:
           istanbul-lib-instrument: 5.2.1
           picocolors: 1.0.0
           test-exclude: 6.0.0
    -      vite: 4.5.2(@types/node@18.19.8)
    +      vite: 4.5.2(@types/node@18.19.9)
         transitivePeerDependencies:
           - supports-color
         dev: true
    @@ -15302,14 +15302,14 @@ packages:
           debug: 4.3.4(supports-color@8.1.1)
           fast-glob: 3.3.2
           pretty-bytes: 6.1.1
    -      vite: 4.5.2(@types/node@18.19.8)
    +      vite: 4.5.2(@types/node@18.19.9)
           workbox-build: 7.0.0
           workbox-window: 7.0.0
         transitivePeerDependencies:
           - supports-color
         dev: true
     
    -  /vite@4.5.2(@types/node@18.19.8):
    +  /vite@4.5.2(@types/node@18.19.9):
         resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==}
         engines: {node: ^14.18.0 || >=16.0.0}
         hasBin: true
    @@ -15337,7 +15337,7 @@ packages:
           terser:
             optional: true
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           esbuild: 0.18.20
           postcss: 8.4.33
           rollup: 3.29.4
    @@ -15345,7 +15345,7 @@ packages:
           fsevents: 2.3.3
         dev: true
     
    -  /vite@5.0.12(@types/node@18.19.8):
    +  /vite@5.0.12(@types/node@18.19.9):
         resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==}
         engines: {node: ^18.0.0 || >=20.0.0}
         hasBin: true
    @@ -15373,10 +15373,10 @@ packages:
           terser:
             optional: true
         dependencies:
    -      '@types/node': 18.19.8
    -      esbuild: 0.19.11
    +      '@types/node': 18.19.9
    +      esbuild: 0.19.12
           postcss: 8.4.33
    -      rollup: 4.9.5
    +      rollup: 4.9.6
         optionalDependencies:
           fsevents: 2.3.3
         dev: true
    @@ -15394,11 +15394,11 @@ packages:
           flexsearch: 0.7.43
           glob-to-regexp: 0.4.1
           markdown-it: 13.0.2
    -      vitepress: 1.0.0-rc.39(@algolia/client-search@4.22.1)(@types/node@18.19.8)(postcss@8.4.33)(search-insights@2.13.0)(typescript@5.3.3)
    +      vitepress: 1.0.0-rc.39(@algolia/client-search@4.22.1)(@types/node@18.19.9)(postcss@8.4.33)(search-insights@2.13.0)(typescript@5.3.3)
           vue: 3.4.15(typescript@5.3.3)
         dev: true
     
    -  /vitepress@1.0.0-rc.39(@algolia/client-search@4.22.1)(@types/node@18.19.8)(postcss@8.4.33)(search-insights@2.13.0)(typescript@5.3.3):
    +  /vitepress@1.0.0-rc.39(@algolia/client-search@4.22.1)(@types/node@18.19.9)(postcss@8.4.33)(search-insights@2.13.0)(typescript@5.3.3):
         resolution: {integrity: sha512-EcgoRlAAp37WOxUOYv45oxyhLrcy3Upey+mKpqW3ldsg6Ol4trPndRBk2GO0QiSvEKlb9BMerk49D/bFICN6kg==}
         hasBin: true
         peerDependencies:
    @@ -15424,7 +15424,7 @@ packages:
           shikiji: 0.9.19
           shikiji-core: 0.9.19
           shikiji-transformers: 0.9.19
    -      vite: 5.0.12(@types/node@18.19.8)
    +      vite: 5.0.12(@types/node@18.19.9)
           vue: 3.4.15(typescript@5.3.3)
         transitivePeerDependencies:
           - '@algolia/client-search'
    @@ -15487,7 +15487,7 @@ packages:
         dependencies:
           '@types/chai': 4.3.11
           '@types/chai-subset': 1.3.5
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           '@vitest/expect': 0.34.6
           '@vitest/runner': 0.34.6
           '@vitest/snapshot': 0.34.6
    @@ -15508,8 +15508,8 @@ packages:
           strip-literal: 1.3.0
           tinybench: 2.6.0
           tinypool: 0.7.0
    -      vite: 4.5.2(@types/node@18.19.8)
    -      vite-node: 0.34.6(@types/node@18.19.8)
    +      vite: 4.5.2(@types/node@18.19.9)
    +      vite-node: 0.34.6(@types/node@18.19.9)
           why-is-node-running: 2.2.2
         transitivePeerDependencies:
           - less
    @@ -15524,7 +15524,7 @@ packages:
       /vscode-json-languageservice@4.2.1:
         resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==}
         dependencies:
    -      jsonc-parser: 3.2.0
    +      jsonc-parser: 3.2.1
           vscode-languageserver-textdocument: 1.0.11
           vscode-languageserver-types: 3.17.5
           vscode-nls: 5.2.0
    @@ -15633,7 +15633,7 @@ packages:
         engines: {node: '>=12.0.0'}
         hasBin: true
         dependencies:
    -      axios: 1.6.5(debug@4.3.4)
    +      axios: 1.6.6(debug@4.3.4)
           joi: 17.12.0
           lodash: 4.17.21
           minimist: 1.2.8
    @@ -15671,7 +15671,7 @@ packages:
         resolution: {integrity: sha512-nCdJLxRnYvOMFqTEX7sqQtF/hV/Jgov0Y6ICeOm1DMTlZSRRDaUsBMlEAPkEwif9uBJYdM0znv8qzfX358AGqQ==}
         engines: {node: '>=12.0.0'}
         dependencies:
    -      '@types/node': 18.19.8
    +      '@types/node': 18.19.9
           '@wdio/config': 7.31.1(typescript@5.3.3)
           '@wdio/logger': 7.26.0
           '@wdio/protocols': 7.27.0
    @@ -15697,7 +15697,7 @@ packages:
         engines: {node: '>=12'}
         dev: true
     
    -  /webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.89.0):
    +  /webpack-cli@4.10.0(webpack-dev-server@4.15.1)(webpack@5.90.0):
         resolution: {integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==}
         engines: {node: '>=10.13.0'}
         hasBin: true
    @@ -15718,7 +15718,7 @@ packages:
             optional: true
         dependencies:
           '@discoveryjs/json-ext': 0.5.7
    -      '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.89.0)
    +      '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.90.0)
           '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0)
           '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0)(webpack-dev-server@4.15.1)
           colorette: 2.0.20
    @@ -15728,12 +15728,12 @@ packages:
           import-local: 3.1.0
           interpret: 2.2.0
           rechoir: 0.7.1
    -      webpack: 5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0)
    -      webpack-dev-server: 4.15.1(webpack-cli@4.10.0)(webpack@5.89.0)
    +      webpack: 5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0)
    +      webpack-dev-server: 4.15.1(webpack-cli@4.10.0)(webpack@5.90.0)
           webpack-merge: 5.10.0
         dev: true
     
    -  /webpack-dev-middleware@5.3.3(webpack@5.89.0):
    +  /webpack-dev-middleware@5.3.3(webpack@5.90.0):
         resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==}
         engines: {node: '>= 12.13.0'}
         peerDependencies:
    @@ -15744,10 +15744,10 @@ packages:
           mime-types: 2.1.35
           range-parser: 1.2.1
           schema-utils: 4.2.0
    -      webpack: 5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0)
    +      webpack: 5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0)
         dev: true
     
    -  /webpack-dev-server@4.15.1(webpack-cli@4.10.0)(webpack@5.89.0):
    +  /webpack-dev-server@4.15.1(webpack-cli@4.10.0)(webpack@5.90.0):
         resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==}
         engines: {node: '>= 12.13.0'}
         hasBin: true
    @@ -15788,9 +15788,9 @@ packages:
           serve-index: 1.9.1
           sockjs: 0.3.24
           spdy: 4.0.2
    -      webpack: 5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0)
    -      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.89.0)
    -      webpack-dev-middleware: 5.3.3(webpack@5.89.0)
    +      webpack: 5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0)
    +      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.90.0)
    +      webpack-dev-middleware: 5.3.3(webpack@5.90.0)
           ws: 8.16.0
         transitivePeerDependencies:
           - bufferutil
    @@ -15817,8 +15817,8 @@ packages:
         resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==}
         dev: true
     
    -  /webpack@5.89.0(esbuild@0.19.11)(webpack-cli@4.10.0):
    -    resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==}
    +  /webpack@5.90.0(esbuild@0.19.12)(webpack-cli@4.10.0):
    +    resolution: {integrity: sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==}
         engines: {node: '>=10.13.0'}
         hasBin: true
         peerDependencies:
    @@ -15848,9 +15848,9 @@ packages:
           neo-async: 2.6.2
           schema-utils: 3.3.0
           tapable: 2.2.1
    -      terser-webpack-plugin: 5.3.10(esbuild@0.19.11)(webpack@5.89.0)
    +      terser-webpack-plugin: 5.3.10(esbuild@0.19.12)(webpack@5.90.0)
           watchpack: 2.4.0
    -      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.89.0)
    +      webpack-cli: 4.10.0(webpack-dev-server@4.15.1)(webpack@5.90.0)
           webpack-sources: 3.2.3
         transitivePeerDependencies:
           - '@swc/core'