From babc465a30f85a1260b03f38afc65f2f39995e50 Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Tue, 14 Jan 2025 18:57:23 +0100 Subject: [PATCH 01/10] feat: enable PX Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- packages/network/src/node.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index f12b54e90..03c52af57 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -100,6 +100,14 @@ export class DRPNetworkNode { dcutr: dcutr(), identify: identify(), pubsub: gossipsub({ + // D is the number of peers to keep in the mesh + D: 5, + // Dlo is the lower bound on the number of peers to keep in the mesh + Dlo: 3, + // Dhi is the upper bound on the number of peers to keep in the mesh + Dhi: 12, + // doPX is whether to enable PX (Peer Exchange) + doPX: true, allowPublishToZeroTopicPeers: true, scoreParams: createPeerScoreParams({ IPColocationFactorWeight: 0, From 28838551e68d0ffcae2f45bd34ef469cad49e039 Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Wed, 15 Jan 2025 15:23:24 +0100 Subject: [PATCH 02/10] chore: -- Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- examples/grid/src/index.ts | 7 ++ packages/network/src/node.ts | 153 +++++++++++++++++++++++++---------- 2 files changed, 119 insertions(+), 41 deletions(-) diff --git a/examples/grid/src/index.ts b/examples/grid/src/index.ts index ac3372750..56ac76a81 100644 --- a/examples/grid/src/index.ts +++ b/examples/grid/src/index.ts @@ -216,6 +216,13 @@ async function main() { render(); }); + setInterval(() => { + peers = node.networkNode.getAllPeers(); + discoveryPeers = node.networkNode.getGroupPeers("drp::discovery"); + if (drpObject) objectPeers = node.networkNode.getGroupPeers(drpObject.id); + render(); + }, 1000); + const button_create = <HTMLButtonElement>( document.getElementById("createGrid") ); diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index 03c52af57..65b7e2c85 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -1,9 +1,14 @@ import { + GossipSub, type GossipsubEvents, type GossipsubMessage, gossipsub, } from "@chainsafe/libp2p-gossipsub"; -import { createPeerScoreParams } from "@chainsafe/libp2p-gossipsub/score"; +import { + createPeerScoreParams, + createPeerScoreThresholds, + createTopicScoreParams, +} from "@chainsafe/libp2p-gossipsub/score"; import { noise } from "@chainsafe/libp2p-noise"; import { yamux } from "@chainsafe/libp2p-yamux"; import { autoNAT } from "@libp2p/autonat"; @@ -15,9 +20,10 @@ import { import { generateKeyPairFromSeed } from "@libp2p/crypto/keys"; import { dcutr } from "@libp2p/dcutr"; import { devToolsMetrics } from "@libp2p/devtools-metrics"; -import { identify } from "@libp2p/identify"; +import { identify, identifyPush } from "@libp2p/identify"; import type { EventCallback, + PeerId, PubSub, Stream, StreamHandler, @@ -30,7 +36,12 @@ import * as filters from "@libp2p/websockets/filters"; import { webTransport } from "@libp2p/webtransport"; import { type MultiaddrInput, multiaddr } from "@multiformats/multiaddr"; import { Logger, type LoggerOptions } from "@ts-drp/logger"; -import { type Libp2p, createLibp2p } from "libp2p"; +import { + type Libp2p, + ServiceFactoryMap, + ServiceMap, + createLibp2p, +} from "libp2p"; import { fromString as uint8ArrayFromString } from "uint8arrays/from-string"; import { Message } from "./proto/drp/network/v1/messages_pb.js"; import { uint8ArrayToStream } from "./stream.js"; @@ -57,7 +68,7 @@ export interface DRPNetworkNodeConfig { export class DRPNetworkNode { private _config?: DRPNetworkNodeConfig; private _node?: Libp2p; - private _pubsub?: PubSub<GossipsubEvents>; + private _pubsub?: GossipSub; peerId = ""; @@ -80,41 +91,121 @@ export class DRPNetworkNode { ? this._config.bootstrap_peers : BOOTSTRAP_NODES; - const _pubsubPeerDiscovery = pubsubPeerDiscovery({ - interval: 10_000, - topics: ["drp::discovery"], - }); + //const _pubsubPeerDiscovery = pubsubPeerDiscovery({ + // interval: 10_000, + // listenOnly: false, + // topics: ["drp::discovery"], + //}); const _peerDiscovery = _bootstrapNodesList.length ? [ - _pubsubPeerDiscovery, + //_pubsubPeerDiscovery, bootstrap({ list: _bootstrapNodesList, }), ] - : [_pubsubPeerDiscovery]; + : [ + //_pubsubPeerDiscovery + ]; - const _node_services = { + let _node_services = { ping: ping(), autonat: autoNAT(), dcutr: dcutr(), identify: identify(), + identifyPush: identifyPush(), pubsub: gossipsub({ // D is the number of peers to keep in the mesh - D: 5, + //D: 5, // Dlo is the lower bound on the number of peers to keep in the mesh - Dlo: 3, + //Dlo: 3, // Dhi is the upper bound on the number of peers to keep in the mesh - Dhi: 12, + //Dhi: 12, // doPX is whether to enable PX (Peer Exchange) + //allowPublishToZeroTopicPeers: true, + //D: 0, + //Dlo: 0, + //Dhi: 0, + //Dout: 0, doPX: true, + gossipFactor: 1, + ignoreDuplicatePublishError: true, allowPublishToZeroTopicPeers: true, + pruneBackoff: 60 * 1000, scoreParams: createPeerScoreParams({ + topicScoreCap: 50, + + behaviourPenaltyWeight: 0, + behaviourPenaltyThreshold: 0, + behaviourPenaltyDecay: 0, + IPColocationFactorWeight: 0, + + appSpecificScore: (peerId: string) => { + console.log( + "appSpecificScore", + peerId, + this._config?.bootstrap_peers, + ); + if ( + this._config?.bootstrap_peers?.includes(peerId) || + peerId === "12D3KooWC6sm9iwmYbeQJCJipKTRghmABNz1wnpJANvSMabvecwJ" + ) { + return 1000; + } + return 0; + }, + topics: { + "drp::discovery": createTopicScoreParams({ + topicWeight: 1, + timeInMeshWeight: 0.1, + timeInMeshQuantum: 1000, + timeInMeshCap: 3, + + firstMessageDeliveriesWeight: 1, + firstMessageDeliveriesDecay: 0.9, + firstMessageDeliveriesCap: 5, + // P3 + meshMessageDeliveriesWeight: 0, + + // P3b + meshFailurePenaltyWeight: 0, + }), + }, + }), + scoreThresholds: createPeerScoreThresholds({ + gossipThreshold: -11110, + opportunisticGraftThreshold: 3.5, }), fallbackToFloodsub: false, + canRelayMessage: true, + emitSelf: true, + //globalSignaturePolicy: "StrictSign", }), }; + if (this._config?.bootstrap) { + _node_services = { + ..._node_services, + pubsub: gossipsub({ + D: 0, + Dlo: 0, + Dhi: 0, + Dout: 0, + doPX: true, + ignoreDuplicatePublishError: true, + allowPublishToZeroTopicPeers: true, + scoreParams: createPeerScoreParams({ + IPColocationFactorWeight: 0, + }), + scoreThresholds: createPeerScoreThresholds({ + gossipThreshold: -11110, + }), + fallbackToFloodsub: false, + canRelayMessage: true, + //globalSignaturePolicy: "StrictSign", + }), + }; + } const _bootstrap_services = { ..._node_services, @@ -132,6 +223,9 @@ export class DRPNetworkNode { ? this._config.addresses : ["/p2p-circuit", "/webrtc"], }, + connectionManager: { + maxConnections: 20, + }, connectionEncrypters: [noise()], connectionGater: { denyDialMultiaddr: () => { @@ -164,7 +258,7 @@ export class DRPNetworkNode { } } - this._pubsub = this._node.services.pubsub as PubSub<GossipsubEvents>; + this._pubsub = this._node.services.pubsub as GossipSub; this.peerId = this._node.peerId.toString(); log.info( @@ -175,36 +269,13 @@ export class DRPNetworkNode { this._node.addEventListener("peer:connect", (e) => log.info("::start::peer::connect", e.detail), ); - this._node.addEventListener("peer:discovery", async (e) => { - // current bug in v11.0.0 requires manual dial (https://github.com/libp2p/js-libp2p-pubsub-peer-discovery/issues/149) - const sortedAddrs = e.detail.multiaddrs.sort((a, b) => { - const localRegex = - /(^\/ip4\/127\.)|(^\/ip4\/10\.)|(^\/ip4\/172\.1[6-9]\.)|(^\/ip4\/172\.2[0-9]\.)|(^\/ip4\/172\.3[0-1]\.)|(^\/ip4\/192\.168\.)/; - const aLocal = localRegex.test(a.toString()); - const bLocal = localRegex.test(b.toString()); - const aWebrtc = a.toString().includes("/webrtc/"); - const bWebrtc = b.toString().includes("/webrtc/"); - if (aLocal && !bLocal) return 1; - if (!aLocal && bLocal) return -1; - if (aWebrtc && !bWebrtc) return -1; - if (!aWebrtc && bWebrtc) return 1; - return 0; - }); - - // Dial non-local multiaddrs, then WebRTC multiaddrs - for (const address of sortedAddrs) { - try { - await this._node?.dial(address); - } catch (e) { - log.error("::start::peer::dial::error", e); - } - } - log.info("::start::peer::discovery", e.detail); - }); this._node.addEventListener("peer:identify", (e) => log.info("::start::peer::identify", e.detail), ); + + // needded as I've disabled the pubsubPeerDiscovery + this._pubsub?.subscribe("drp::discovery"); } async stop() { From 918bf0a9856b6a55c1a49fd4733d486966e3a13a Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Wed, 15 Jan 2025 15:26:38 +0100 Subject: [PATCH 03/10] chore: -- Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- packages/network/src/node.ts | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index 65b7e2c85..b5d9266b9 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -1,9 +1,4 @@ -import { - GossipSub, - type GossipsubEvents, - type GossipsubMessage, - gossipsub, -} from "@chainsafe/libp2p-gossipsub"; +import { type GossipSub, gossipsub } from "@chainsafe/libp2p-gossipsub"; import { createPeerScoreParams, createPeerScoreThresholds, @@ -23,25 +18,17 @@ import { devToolsMetrics } from "@libp2p/devtools-metrics"; import { identify, identifyPush } from "@libp2p/identify"; import type { EventCallback, - PeerId, - PubSub, Stream, StreamHandler, } from "@libp2p/interface"; import { ping } from "@libp2p/ping"; -import { pubsubPeerDiscovery } from "@libp2p/pubsub-peer-discovery"; import { webRTC, webRTCDirect } from "@libp2p/webrtc"; import { webSockets } from "@libp2p/websockets"; import * as filters from "@libp2p/websockets/filters"; import { webTransport } from "@libp2p/webtransport"; import { type MultiaddrInput, multiaddr } from "@multiformats/multiaddr"; import { Logger, type LoggerOptions } from "@ts-drp/logger"; -import { - type Libp2p, - ServiceFactoryMap, - ServiceMap, - createLibp2p, -} from "libp2p"; +import { type Libp2p, createLibp2p } from "libp2p"; import { fromString as uint8ArrayFromString } from "uint8arrays/from-string"; import { Message } from "./proto/drp/network/v1/messages_pb.js"; import { uint8ArrayToStream } from "./stream.js"; From fde164d211f8c0bf29ffd3e215e7cad8ef38bf5d Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Wed, 15 Jan 2025 17:21:19 +0100 Subject: [PATCH 04/10] chore: clean up Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- packages/network/package.json | 3 +- packages/network/src/node.ts | 139 ++++--- packages/node/src/index.ts | 2 + packages/node/src/version.ts | 2 +- pnpm-lock.yaml | 744 +++++++++++++++++----------------- 5 files changed, 438 insertions(+), 452 deletions(-) diff --git a/packages/network/package.json b/packages/network/package.json index 5d86d865e..84ad5328e 100644 --- a/packages/network/package.json +++ b/packages/network/package.json @@ -43,7 +43,8 @@ "@libp2p/websockets": "^9.1.1", "@libp2p/webtransport": "^5.0.9", "@multiformats/multiaddr": "^12.3.1", - "@ts-drp/logger": "^0.6.1", + "@ts-drp/logger": "^0.6.0", + "@multiformats/multiaddr-matcher": "^1.6.0", "it-length-prefixed": "^9.1.0", "it-map": "^3.1.1", "it-pipe": "^3.0.1", diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index b5d9266b9..efa1b9088 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -1,5 +1,10 @@ -import { type GossipSub, gossipsub } from "@chainsafe/libp2p-gossipsub"; import { + type GossipSub, + type GossipsubMessage, + gossipsub, +} from "@chainsafe/libp2p-gossipsub"; +import { + TopicScoreParams, createPeerScoreParams, createPeerScoreThresholds, createTopicScoreParams, @@ -27,6 +32,7 @@ import { webSockets } from "@libp2p/websockets"; import * as filters from "@libp2p/websockets/filters"; import { webTransport } from "@libp2p/webtransport"; import { type MultiaddrInput, multiaddr } from "@multiformats/multiaddr"; +import { WebRTC } from "@multiformats/multiaddr-matcher"; import { Logger, type LoggerOptions } from "@ts-drp/logger"; import { type Libp2p, createLibp2p } from "libp2p"; import { fromString as uint8ArrayFromString } from "uint8arrays/from-string"; @@ -45,6 +51,7 @@ let log: Logger; // snake_casing to match the JSON config export interface DRPNetworkNodeConfig { addresses?: string[]; + announce?: string[]; bootstrap?: boolean; bootstrap_peers?: string[]; browser_metrics?: boolean; @@ -78,22 +85,20 @@ export class DRPNetworkNode { ? this._config.bootstrap_peers : BOOTSTRAP_NODES; - //const _pubsubPeerDiscovery = pubsubPeerDiscovery({ - // interval: 10_000, - // listenOnly: false, - // topics: ["drp::discovery"], - //}); - - const _peerDiscovery = _bootstrapNodesList.length - ? [ - //_pubsubPeerDiscovery, - bootstrap({ - list: _bootstrapNodesList, - }), - ] - : [ - //_pubsubPeerDiscovery - ]; + const _peerDiscovery = []; + const _bootstrapPeerID: string[] = []; + if (_bootstrapNodesList.length) { + _peerDiscovery.push( + bootstrap({ + list: _bootstrapNodesList, + }), + ); + for (const addr of _bootstrapNodesList) { + const peerId = multiaddr(addr).getPeerId(); + if (!peerId) continue; + _bootstrapPeerID.push(peerId); + } + } let _node_services = { ping: ping(), @@ -102,74 +107,46 @@ export class DRPNetworkNode { identify: identify(), identifyPush: identifyPush(), pubsub: gossipsub({ - // D is the number of peers to keep in the mesh - //D: 5, - // Dlo is the lower bound on the number of peers to keep in the mesh - //Dlo: 3, - // Dhi is the upper bound on the number of peers to keep in the mesh - //Dhi: 12, - // doPX is whether to enable PX (Peer Exchange) - //allowPublishToZeroTopicPeers: true, - //D: 0, - //Dlo: 0, - //Dhi: 0, - //Dout: 0, + // in the doc it says that doPX shall be false for none bootstrap nodes + // but I dunnow if we should never the less enable it on other nodes ? + // maybe with ACL at some point we could make a broswer node trustable + // and allow it to doPX ? Let me know doPX: true, - gossipFactor: 1, - ignoreDuplicatePublishError: true, allowPublishToZeroTopicPeers: true, pruneBackoff: 60 * 1000, scoreParams: createPeerScoreParams({ topicScoreCap: 50, - - behaviourPenaltyWeight: 0, - behaviourPenaltyThreshold: 0, - behaviourPenaltyDecay: 0, - IPColocationFactorWeight: 0, - appSpecificScore: (peerId: string) => { - console.log( - "appSpecificScore", - peerId, - this._config?.bootstrap_peers, - ); - if ( - this._config?.bootstrap_peers?.includes(peerId) || - peerId === "12D3KooWC6sm9iwmYbeQJCJipKTRghmABNz1wnpJANvSMabvecwJ" - ) { + if (_bootstrapPeerID.includes(peerId)) { return 1000; } return 0; }, topics: { "drp::discovery": createTopicScoreParams({ + // TODO: get a better score params this need to be + // investigated more before according to some value + // also it would be nice to have a way to set that scoring + // for each DRP id but the current gossipsub does not support + // that, I think we could either make a PR to gossipsub or + // make a custom lib with a scoring system that would be live + // notable ones: meshMessageXX + // meshFailureXX + // meshFailurePenaltyXX + // timeInMeshXX + // firstMessageDeliveriesXX topicWeight: 1, - timeInMeshWeight: 0.1, - timeInMeshQuantum: 1000, - timeInMeshCap: 3, - - firstMessageDeliveriesWeight: 1, - firstMessageDeliveriesDecay: 0.9, - firstMessageDeliveriesCap: 5, - // P3 - meshMessageDeliveriesWeight: 0, - - // P3b - meshFailurePenaltyWeight: 0, }), }, }), scoreThresholds: createPeerScoreThresholds({ - gossipThreshold: -11110, - opportunisticGraftThreshold: 3.5, + gossipThreshold: -50, }), fallbackToFloodsub: false, - canRelayMessage: true, - emitSelf: true, - //globalSignaturePolicy: "StrictSign", }), }; + if (this._config?.bootstrap) { _node_services = { ..._node_services, @@ -182,14 +159,13 @@ export class DRPNetworkNode { ignoreDuplicatePublishError: true, allowPublishToZeroTopicPeers: true, scoreParams: createPeerScoreParams({ + topicScoreCap: 50, IPColocationFactorWeight: 0, }), scoreThresholds: createPeerScoreThresholds({ - gossipThreshold: -11110, + gossipThreshold: -50, }), fallbackToFloodsub: false, - canRelayMessage: true, - //globalSignaturePolicy: "StrictSign", }), }; } @@ -209,9 +185,24 @@ export class DRPNetworkNode { listen: this._config?.addresses ? this._config.addresses : ["/p2p-circuit", "/webrtc"], + ...(this._config?.announce ? { announce: this._config.announce } : {}), }, connectionManager: { - maxConnections: 20, + // we would need something to know when we are in a browser context to add a maxConnections + // maxConnections: 20, + addressSorter: (a, b) => { + const localRegex = + /(^\/ip4\/127\.)|(^\/ip4\/10\.)|(^\/ip4\/172\.1[6-9]\.)|(^\/ip4\/172\.2[0-9]\.)|(^\/ip4\/172\.3[0-1]\.)|(^\/ip4\/192\.168\.)/; + const aLocal = localRegex.test(a.toString()); + const bLocal = localRegex.test(b.toString()); + const aWebrtc = WebRTC.matches(a.multiaddr); + const bWebrtc = WebRTC.matches(b.multiaddr); + if (aLocal && !bLocal) return 1; + if (!aLocal && bLocal) return -1; + if (aWebrtc && !bWebrtc) return -1; + if (!aWebrtc && bWebrtc) return 1; + return 0; + }, }, connectionEncrypters: [noise()], connectionGater: { @@ -257,6 +248,10 @@ export class DRPNetworkNode { log.info("::start::peer::connect", e.detail), ); + this._node.addEventListener("peer:discovery", (e) => + log.info("::start::peer::discovery", e.detail), + ); + this._node.addEventListener("peer:identify", (e) => log.info("::start::peer::identify", e.detail), ); @@ -275,6 +270,16 @@ export class DRPNetworkNode { await this.start(); } + changeTopicScoreParams(topic: string, params: TopicScoreParams) { + if (!this._pubsub) return; + this._pubsub.score.params.topics[topic] = params; + } + + removeTopicScoreParams(topic: string) { + if (!this._pubsub) return; + delete this._pubsub.score.params.topics[topic]; + } + subscribe(topic: string) { if (!this._node) { log.error("::subscribe: Node not initialized, please run .start()"); diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index dd6d46533..b786061db 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -1,4 +1,5 @@ import type { GossipsubMessage } from "@chainsafe/libp2p-gossipsub"; +import { createTopicScoreParams } from "@chainsafe/libp2p-gossipsub/score"; import type { EventCallback, StreamHandler } from "@libp2p/interface"; import { Logger, type LoggerOptions } from "@ts-drp/logger"; import { @@ -115,6 +116,7 @@ export class DRPNode { unsubscribeObject(id: string, purge?: boolean) { operations.unsubscribeObject(this, id, purge); + this.networkNode.removeTopicScoreParams(id); } async syncObject(id: string, peerId?: string) { diff --git a/packages/node/src/version.ts b/packages/node/src/version.ts index ed952a2db..72a311182 100644 --- a/packages/node/src/version.ts +++ b/packages/node/src/version.ts @@ -1 +1 @@ -export const VERSION = "0.6.0"; +export const VERSION = "0.6.1"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0bccb442..d52cdd7ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,10 +43,10 @@ importers: version: 5.7.2 vite: specifier: ^6.0.9 - version: 6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) + version: 6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) vite-tsconfig-paths: specifier: ^5.0.1 - version: 5.1.4(typescript@5.7.2)(vite@6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) + version: 5.1.4(typescript@5.7.2)(vite@6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) vitest: specifier: ^2.1.1 version: 2.1.8(@types/node@22.10.2)(terser@5.37.0) @@ -68,10 +68,10 @@ importers: version: 5.7.2 vite: specifier: ^6.0.9 - version: 6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) + version: 6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.31.0)(vite@6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) + version: 0.22.0(rollup@4.29.1)(vite@6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) examples/chat: dependencies: @@ -90,10 +90,10 @@ importers: version: 5.7.2 vite: specifier: ^6.0.9 - version: 6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) + version: 6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.31.0)(vite@6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) + version: 0.22.0(rollup@4.29.1)(vite@6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) examples/grid: dependencies: @@ -112,10 +112,10 @@ importers: version: 5.7.2 vite: specifier: ^6.0.9 - version: 6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) + version: 6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.31.0)(vite@6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) + version: 0.22.0(rollup@4.29.1)(vite@6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) examples/local-bootstrap: dependencies: @@ -131,10 +131,10 @@ importers: version: 5.7.2 vite: specifier: ^6.0.9 - version: 6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) + version: 6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.31.0)(vite@6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) + version: 0.22.0(rollup@4.29.1)(vite@6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)) packages/blueprints: dependencies: @@ -208,8 +208,11 @@ importers: '@multiformats/multiaddr': specifier: ^12.3.1 version: 12.3.4 + '@multiformats/multiaddr-matcher': + specifier: ^1.6.0 + version: 1.6.0 '@ts-drp/logger': - specifier: ^0.6.1 + specifier: ^0.6.0 version: link:../logger it-length-prefixed: specifier: ^9.1.0 @@ -397,24 +400,24 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.5': - resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} + '@babel/compat-data@7.26.3': + resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} engines: {node: '>=6.9.0'} '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.5': - resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.25.9': resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.25.9': @@ -452,8 +455,8 @@ packages: resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} '@babel/helper-remap-async-to-generator@7.25.9': @@ -462,8 +465,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -497,11 +500,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.26.5': - resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} @@ -703,8 +701,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -781,8 +779,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.26.5': - resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} + '@babel/plugin-transform-flow-strip-types@7.25.9': + resolution: {integrity: sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -859,8 +857,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -997,8 +995,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.26.5': - resolution: {integrity: sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==} + '@babel/plugin-transform-typescript@7.26.3': + resolution: {integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1064,18 +1062,14 @@ packages: resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.5': - resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.5': - resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} - engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2140,98 +2134,98 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.31.0': - resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==} + '@rollup/rollup-android-arm-eabi@4.29.1': + resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.31.0': - resolution: {integrity: sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==} + '@rollup/rollup-android-arm64@4.29.1': + resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.31.0': - resolution: {integrity: sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==} + '@rollup/rollup-darwin-arm64@4.29.1': + resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.31.0': - resolution: {integrity: sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==} + '@rollup/rollup-darwin-x64@4.29.1': + resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.31.0': - resolution: {integrity: sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==} + '@rollup/rollup-freebsd-arm64@4.29.1': + resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.31.0': - resolution: {integrity: sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==} + '@rollup/rollup-freebsd-x64@4.29.1': + resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.31.0': - resolution: {integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==} + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': + resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.31.0': - resolution: {integrity: sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==} + '@rollup/rollup-linux-arm-musleabihf@4.29.1': + resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.31.0': - resolution: {integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==} + '@rollup/rollup-linux-arm64-gnu@4.29.1': + resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.31.0': - resolution: {integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==} + '@rollup/rollup-linux-arm64-musl@4.29.1': + resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.31.0': - resolution: {integrity: sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': + resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': - resolution: {integrity: sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': + resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.31.0': - resolution: {integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==} + '@rollup/rollup-linux-riscv64-gnu@4.29.1': + resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.31.0': - resolution: {integrity: sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==} + '@rollup/rollup-linux-s390x-gnu@4.29.1': + resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.31.0': - resolution: {integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==} + '@rollup/rollup-linux-x64-gnu@4.29.1': + resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.31.0': - resolution: {integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==} + '@rollup/rollup-linux-x64-musl@4.29.1': + resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.31.0': - resolution: {integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==} + '@rollup/rollup-win32-arm64-msvc@4.29.1': + resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.31.0': - resolution: {integrity: sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==} + '@rollup/rollup-win32-ia32-msvc@4.29.1': + resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.31.0': - resolution: {integrity: sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==} + '@rollup/rollup-win32-x64-msvc@4.29.1': + resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} cpu: [x64] os: [win32] @@ -2351,9 +2345,6 @@ packages: '@types/node@22.10.2': resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} - '@types/node@22.10.7': - resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==} - '@types/object-inspect@1.13.0': resolution: {integrity: sha512-lwGTVESDDV+XsQ1pH4UifpJ1f7OtXzQ6QBOX2Afq2bM/T3oOt8hF6exJMjjIjtEWeAN2YAo25J7HxWh97CCz9w==} @@ -2711,8 +2702,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2782,8 +2773,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001695: - resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} case-anything@2.1.13: resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} @@ -2926,8 +2917,8 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js-compat@3.40.0: - resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3128,8 +3119,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.84: - resolution: {integrity: sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==} + electron-to-chromium@1.5.75: + resolution: {integrity: sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -3393,8 +3384,8 @@ packages: flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} - flow-parser@0.259.1: - resolution: {integrity: sha512-xiXLmMH2Z7OmdE9Q+MjljUMr/rbemFqZIRxaeZieVScG4HzQrKKhNcCYZbWTGpoN7ZPi7z8ClQbeVPq6t5AszQ==} + flow-parser@0.257.1: + resolution: {integrity: sha512-7+KYDpAXyBPD/wODhbPYO6IGUx+WwtJcLLG/r3DvbNyxaDyuYaTBKbSqeCldWQzuFcj+MsOVx2bpkEwVPB9JRw==} engines: {node: '>=0.4.0'} for-each@0.3.3: @@ -4695,8 +4686,8 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} prebuild-install@7.1.2: @@ -4967,8 +4958,8 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - rollup@4.31.0: - resolution: {integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==} + rollup@4.29.1: + resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5475,8 +5466,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.1.2: - resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5539,8 +5530,8 @@ packages: vite: optional: true - vite@5.4.14: - resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5570,8 +5561,8 @@ packages: terser: optional: true - vite@6.0.9: - resolution: {integrity: sha512-MSgUxHcaXLtnBPktkbUSoQUANApKYuxZ6DrbVENlIorbhL2dZydTLaZ01tjUoE3szeFzlFk9ANOKk0xurh4MKA==} + vite@6.0.11: + resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -5819,20 +5810,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.5': {} + '@babel/compat-data@7.26.3': {} '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/helper-compilation-targets': 7.26.5 + '@babel/generator': 7.26.3 + '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.5 + '@babel/parser': 7.26.3 '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -5841,23 +5832,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.5': + '@babel/generator@7.26.3': dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.26.3 - '@babel/helper-compilation-targets@7.26.5': + '@babel/helper-compilation-targets@7.25.9': dependencies: - '@babel/compat-data': 7.26.5 + '@babel/compat-data': 7.26.3 '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + browserslist: 4.24.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -5867,9 +5858,9 @@ snapshots: '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0) + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.4 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -5884,8 +5875,8 @@ snapshots: '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 debug: 4.4.0 lodash.debounce: 4.0.8 resolve: 1.22.10 @@ -5894,15 +5885,15 @@ snapshots: '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color @@ -5911,38 +5902,38 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.26.3 - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.25.9': {} '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.0)': + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color @@ -5955,46 +5946,42 @@ snapshots: '@babel/helper-wrap-function@7.25.9': dependencies: '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color '@babel/helpers@7.26.0': dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.26.5 + '@babel/types': 7.26.3 '@babel/parser@7.26.3': dependencies: '@babel/types': 7.26.3 - '@babel/parser@7.26.5': - dependencies: - '@babel/types': 7.26.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: @@ -6003,8 +5990,8 @@ snapshots: '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -6012,25 +5999,25 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) transitivePeerDependencies: @@ -6043,125 +6030,125 @@ snapshots: '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -6169,26 +6156,26 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.0)': + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color @@ -6196,7 +6183,7 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color @@ -6204,10 +6191,10 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0) - '@babel/traverse': 7.26.5 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.26.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6215,56 +6202,56 @@ snapshots: '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/template': 7.25.9 '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.26.0)': + '@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color @@ -6272,37 +6259,37 @@ snapshots: '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.5 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color @@ -6310,7 +6297,7 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color @@ -6318,9 +6305,9 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -6328,7 +6315,7 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color @@ -6336,47 +6323,47 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color @@ -6384,13 +6371,13 @@ snapshots: '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color @@ -6399,63 +6386,63 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.5 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 regenerator-transform: 0.15.2 '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) @@ -6466,12 +6453,12 @@ snapshots: '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color @@ -6479,24 +6466,24 @@ snapshots: '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-typescript@7.26.5(@babel/core@7.26.0)': + '@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: @@ -6505,32 +6492,32 @@ snapshots: '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/preset-env@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/compat-data': 7.26.5 + '@babel/compat-data': 7.26.3 '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-option': 7.25.9 '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) @@ -6544,7 +6531,7 @@ snapshots: '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) @@ -6569,7 +6556,7 @@ snapshots: '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) @@ -6595,7 +6582,7 @@ snapshots: babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) - core-js-compat: 3.40.0 + core-js-compat: 3.39.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -6603,25 +6590,25 @@ snapshots: '@babel/preset-flow@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.0) + '@babel/plugin-transform-flow-strip-types': 7.25.9(@babel/core@7.26.0) '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.3 esutils: 2.0.3 '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-option': 7.25.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) transitivePeerDependencies: - supports-color @@ -6641,16 +6628,16 @@ snapshots: '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 - '@babel/traverse@7.26.5': + '@babel/traverse@7.26.4': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.5 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 '@babel/template': 7.25.9 - '@babel/types': 7.26.5 + '@babel/types': 7.26.3 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: @@ -6661,11 +6648,6 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/types@7.26.5': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@bcoe/v8-coverage@0.2.3': {} '@biomejs/biome@1.9.4': @@ -7103,14 +7085,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.10.2 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.10.7 + '@types/node': 22.10.2 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -7144,7 +7126,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.10.7 + '@types/node': 22.10.2 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -7315,7 +7297,7 @@ snapshots: '@libp2p/multistream-select@6.0.10': dependencies: - '@libp2p/interface': 2.3.0 + '@libp2p/interface': 2.4.0 it-length-prefixed: 9.1.0 it-length-prefixed-stream: 1.2.0 it-stream-types: 2.0.2 @@ -7362,7 +7344,7 @@ snapshots: '@libp2p/peer-store@11.0.13': dependencies: '@libp2p/crypto': 5.0.8 - '@libp2p/interface': 2.3.0 + '@libp2p/interface': 2.4.0 '@libp2p/peer-id': 5.0.9 '@libp2p/peer-record': 8.0.13 '@multiformats/multiaddr': 12.3.4 @@ -7776,14 +7758,14 @@ snapshots: '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.0) + '@babel/plugin-transform-flow-strip-types': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) @@ -7800,7 +7782,7 @@ snapshots: '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.26.3(@babel/core@7.26.0) '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) '@babel/template': 7.25.9 '@react-native/babel-plugin-codegen': 0.76.5(@babel/preset-env@7.26.0(@babel/core@7.26.0)) @@ -7813,7 +7795,7 @@ snapshots: '@react-native/codegen@0.76.5(@babel/preset-env@7.26.0(@babel/core@7.26.0))': dependencies: - '@babel/parser': 7.26.5 + '@babel/parser': 7.26.3 '@babel/preset-env': 7.26.0(@babel/core@7.26.0) glob: 7.2.3 hermes-parser: 0.23.1 @@ -7900,77 +7882,77 @@ snapshots: walk-sync: 2.2.0 yaml: 2.6.1 - '@rollup/plugin-inject@5.0.5(rollup@4.31.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.29.1)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.31.0) + '@rollup/pluginutils': 5.1.4(rollup@4.29.1) estree-walker: 2.0.2 magic-string: 0.30.17 optionalDependencies: - rollup: 4.31.0 + rollup: 4.29.1 - '@rollup/pluginutils@5.1.4(rollup@4.31.0)': + '@rollup/pluginutils@5.1.4(rollup@4.29.1)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.31.0 + rollup: 4.29.1 - '@rollup/rollup-android-arm-eabi@4.31.0': + '@rollup/rollup-android-arm-eabi@4.29.1': optional: true - '@rollup/rollup-android-arm64@4.31.0': + '@rollup/rollup-android-arm64@4.29.1': optional: true - '@rollup/rollup-darwin-arm64@4.31.0': + '@rollup/rollup-darwin-arm64@4.29.1': optional: true - '@rollup/rollup-darwin-x64@4.31.0': + '@rollup/rollup-darwin-x64@4.29.1': optional: true - '@rollup/rollup-freebsd-arm64@4.31.0': + '@rollup/rollup-freebsd-arm64@4.29.1': optional: true - '@rollup/rollup-freebsd-x64@4.31.0': + '@rollup/rollup-freebsd-x64@4.29.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.31.0': + '@rollup/rollup-linux-arm-gnueabihf@4.29.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.31.0': + '@rollup/rollup-linux-arm-musleabihf@4.29.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.31.0': + '@rollup/rollup-linux-arm64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.31.0': + '@rollup/rollup-linux-arm64-musl@4.29.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.31.0': + '@rollup/rollup-linux-loongarch64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.31.0': + '@rollup/rollup-linux-riscv64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.31.0': + '@rollup/rollup-linux-s390x-gnu@4.29.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.31.0': + '@rollup/rollup-linux-x64-gnu@4.29.1': optional: true - '@rollup/rollup-linux-x64-musl@4.31.0': + '@rollup/rollup-linux-x64-musl@4.29.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.31.0': + '@rollup/rollup-win32-arm64-msvc@4.29.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.31.0': + '@rollup/rollup-win32-ia32-msvc@4.29.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.31.0': + '@rollup/rollup-win32-x64-msvc@4.29.1': optional: true '@scure/base@1.2.1': {} @@ -8042,24 +8024,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.26.3 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.26.3 '@types/dns-packet@5.6.5': dependencies: @@ -8069,7 +8051,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.2 '@types/hast@3.0.4': dependencies: @@ -8097,16 +8079,12 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.2 '@types/node@22.10.2': dependencies: undici-types: 6.20.0 - '@types/node@22.10.7': - dependencies: - undici-types: 6.20.0 - '@types/object-inspect@1.13.0': {} '@types/retry@0.12.2': {} @@ -8229,13 +8207,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.14(@types/node@22.10.2)(terser@5.37.0))': + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.14(@types/node@22.10.2)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) '@vitest/pretty-format@2.1.8': dependencies: @@ -8398,7 +8376,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -8409,13 +8387,13 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.26.5 + '@babel/types': 7.26.3 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): dependencies: - '@babel/compat-data': 7.26.5 + '@babel/compat-data': 7.26.3 '@babel/core': 7.26.0 '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) semver: 6.3.1 @@ -8426,7 +8404,7 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) - core-js-compat: 3.40.0 + core-js-compat: 3.39.0 transitivePeerDependencies: - supports-color @@ -8580,12 +8558,12 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.24.4: + browserslist@4.24.3: dependencies: - caniuse-lite: 1.0.30001695 - electron-to-chromium: 1.5.84 + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.75 node-releases: 2.0.19 - update-browserslist-db: 1.1.2(browserslist@4.24.4) + update-browserslist-db: 1.1.1(browserslist@4.24.3) bser@2.1.1: dependencies: @@ -8648,7 +8626,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001695: {} + caniuse-lite@1.0.30001690: {} case-anything@2.1.13: {} @@ -8683,7 +8661,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.2 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -8692,7 +8670,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.2 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -8785,9 +8763,9 @@ snapshots: convert-source-map@2.0.0: {} - core-js-compat@3.40.0: + core-js-compat@3.39.0: dependencies: - browserslist: 4.24.4 + browserslist: 4.24.3 core-util-is@1.0.3: {} @@ -8988,7 +8966,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.84: {} + electron-to-chromium@1.5.75: {} elliptic@6.6.1: dependencies: @@ -9341,7 +9319,7 @@ snapshots: flow-enums-runtime@0.0.6: {} - flow-parser@0.259.1: {} + flow-parser@0.257.1: {} for-each@0.3.3: dependencies: @@ -9752,7 +9730,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.26.0 - '@babel/parser': 7.26.5 + '@babel/parser': 7.26.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -9899,7 +9877,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.10.2 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -9909,7 +9887,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.10.7 + '@types/node': 22.10.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -9936,7 +9914,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.10.2 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -9944,7 +9922,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.10.7 + '@types/node': 22.10.2 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -9961,7 +9939,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.10.7 + '@types/node': 22.10.2 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -9986,7 +9964,7 @@ snapshots: jscodeshift@0.14.0(@babel/preset-env@7.26.0(@babel/core@7.26.0)): dependencies: '@babel/core': 7.26.0 - '@babel/parser': 7.26.5 + '@babel/parser': 7.26.3 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.0) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.0) @@ -9997,7 +9975,7 @@ snapshots: '@babel/register': 7.25.9(@babel/core@7.26.0) babel-core: 7.0.0-bridge.0(@babel/core@7.26.0) chalk: 4.1.2 - flow-parser: 0.259.1 + flow-parser: 0.257.1 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -10301,9 +10279,9 @@ snapshots: metro-source-map@0.81.0: dependencies: - '@babel/traverse': 7.26.5 - '@babel/traverse--for-generate-function-map': '@babel/traverse@7.26.5' - '@babel/types': 7.26.5 + '@babel/traverse': 7.26.4 + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.26.4' + '@babel/types': 7.26.3 flow-enums-runtime: 0.0.6 invariant: 2.2.4 metro-symbolicate: 0.81.0 @@ -10329,9 +10307,9 @@ snapshots: metro-transform-plugins@0.81.0: dependencies: '@babel/core': 7.26.0 - '@babel/generator': 7.26.5 + '@babel/generator': 7.26.3 '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.4 flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: @@ -10340,9 +10318,9 @@ snapshots: metro-transform-worker@0.81.0: dependencies: '@babel/core': 7.26.0 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 flow-enums-runtime: 0.0.6 metro: 0.81.0 metro-babel-transformer: 0.81.0 @@ -10361,11 +10339,11 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.26.0 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.5 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 accepts: 1.3.8 chalk: 4.1.2 ci-info: 2.0.0 @@ -10854,7 +10832,7 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss@8.5.1: + postcss@8.4.49: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -11230,29 +11208,29 @@ snapshots: hash-base: 3.0.5 inherits: 2.0.4 - rollup@4.31.0: + rollup@4.29.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.31.0 - '@rollup/rollup-android-arm64': 4.31.0 - '@rollup/rollup-darwin-arm64': 4.31.0 - '@rollup/rollup-darwin-x64': 4.31.0 - '@rollup/rollup-freebsd-arm64': 4.31.0 - '@rollup/rollup-freebsd-x64': 4.31.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.31.0 - '@rollup/rollup-linux-arm-musleabihf': 4.31.0 - '@rollup/rollup-linux-arm64-gnu': 4.31.0 - '@rollup/rollup-linux-arm64-musl': 4.31.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.31.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.31.0 - '@rollup/rollup-linux-riscv64-gnu': 4.31.0 - '@rollup/rollup-linux-s390x-gnu': 4.31.0 - '@rollup/rollup-linux-x64-gnu': 4.31.0 - '@rollup/rollup-linux-x64-musl': 4.31.0 - '@rollup/rollup-win32-arm64-msvc': 4.31.0 - '@rollup/rollup-win32-ia32-msvc': 4.31.0 - '@rollup/rollup-win32-x64-msvc': 4.31.0 + '@rollup/rollup-android-arm-eabi': 4.29.1 + '@rollup/rollup-android-arm64': 4.29.1 + '@rollup/rollup-darwin-arm64': 4.29.1 + '@rollup/rollup-darwin-x64': 4.29.1 + '@rollup/rollup-freebsd-arm64': 4.29.1 + '@rollup/rollup-freebsd-x64': 4.29.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 + '@rollup/rollup-linux-arm-musleabihf': 4.29.1 + '@rollup/rollup-linux-arm64-gnu': 4.29.1 + '@rollup/rollup-linux-arm64-musl': 4.29.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 + '@rollup/rollup-linux-riscv64-gnu': 4.29.1 + '@rollup/rollup-linux-s390x-gnu': 4.29.1 + '@rollup/rollup-linux-x64-gnu': 4.29.1 + '@rollup/rollup-linux-x64-musl': 4.29.1 + '@rollup/rollup-win32-arm64-msvc': 4.29.1 + '@rollup/rollup-win32-ia32-msvc': 4.29.1 + '@rollup/rollup-win32-x64-msvc': 4.29.1 fsevents: 2.3.3 run-applescript@7.0.0: {} @@ -11762,9 +11740,9 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.1.2(browserslist@4.24.4): + update-browserslist-db@1.1.1(browserslist@4.24.3): dependencies: - browserslist: 4.24.4 + browserslist: 4.24.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -11829,7 +11807,7 @@ snapshots: debug: 4.4.0 es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.14(@types/node@22.10.2)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - less @@ -11841,40 +11819,40 @@ snapshots: - supports-color - terser - vite-plugin-node-polyfills@0.22.0(rollup@4.31.0)(vite@6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)): + vite-plugin-node-polyfills@0.22.0(rollup@4.29.1)(vite@6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.31.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.29.1) node-stdlib-browser: 1.3.0 - vite: 6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) + vite: 6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) transitivePeerDependencies: - rollup - vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)): + vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.7.2) optionalDependencies: - vite: 6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) + vite: 6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1) transitivePeerDependencies: - supports-color - typescript - vite@5.4.14(@types/node@22.10.2)(terser@5.37.0): + vite@5.4.11(@types/node@22.10.2)(terser@5.37.0): dependencies: esbuild: 0.21.5 - postcss: 8.5.1 - rollup: 4.31.0 + postcss: 8.4.49 + rollup: 4.29.1 optionalDependencies: '@types/node': 22.10.2 fsevents: 2.3.3 terser: 5.37.0 - vite@6.0.9(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1): + vite@6.0.11(@types/node@22.10.2)(terser@5.37.0)(tsx@4.19.1)(yaml@2.6.1): dependencies: esbuild: 0.24.2 - postcss: 8.5.1 - rollup: 4.31.0 + postcss: 8.4.49 + rollup: 4.29.1 optionalDependencies: '@types/node': 22.10.2 fsevents: 2.3.3 @@ -11885,7 +11863,7 @@ snapshots: vitest@2.1.8(@types/node@22.10.2)(terser@5.37.0): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.14(@types/node@22.10.2)(terser@5.37.0)) + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.2)(terser@5.37.0)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -11901,7 +11879,7 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.14(@types/node@22.10.2)(terser@5.37.0) + vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) vite-node: 2.1.8(@types/node@22.10.2)(terser@5.37.0) why-is-node-running: 2.3.0 optionalDependencies: From 34f0dd5a21654478c38b9fcb76cd8b42a3ba2b68 Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Wed, 15 Jan 2025 17:25:14 +0100 Subject: [PATCH 05/10] chore: fix type Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- packages/network/src/node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index efa1b9088..183abcd0e 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -4,7 +4,7 @@ import { gossipsub, } from "@chainsafe/libp2p-gossipsub"; import { - TopicScoreParams, + type TopicScoreParams, createPeerScoreParams, createPeerScoreThresholds, createTopicScoreParams, From cff07859e8148c060709d2529d21d8d2f1dc4e27 Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Thu, 16 Jan 2025 11:07:04 +0100 Subject: [PATCH 06/10] chore: review Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- .env.example | 2 +- configs/bootstrap.json | 5 +++- configs/local-bootstrap.json | 5 +++- configs/node.json | 4 +++- packages/network/src/node.ts | 45 ++++++++++++++++++++---------------- packages/node/src/config.ts | 7 ++++-- 6 files changed, 42 insertions(+), 26 deletions(-) diff --git a/.env.example b/.env.example index c5dc113d2..6f598f3fc 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -ADDRESSES=/ip4/0.0.0.0/tcp/50000/ws,/ip4/0.0.0.0/tcp/50001 +LISTEN_ADDRESSES=/ip4/0.0.0.0/tcp/50000/ws,/ip4/0.0.0.0/tcp/50001 BOOTSTRAP=true BOOTSTRAP_PEERS=[] PRIVATE_KEY_SEED=example diff --git a/configs/bootstrap.json b/configs/bootstrap.json index 133bda093..44e17b85b 100644 --- a/configs/bootstrap.json +++ b/configs/bootstrap.json @@ -1,6 +1,9 @@ { "network_config": { - "addresses": ["/ip4/0.0.0.0/tcp/50000/ws", "/ip4/0.0.0.0/tcp/50001"], + "listen_addresses": [ + "/ip4/0.0.0.0/tcp/50000/ws", + "/ip4/0.0.0.0/tcp/50001" + ], "bootstrap": true, "bootstrap_peers": [ "/dns4/bootstrap1.topology.gg/tcp/443/wss/p2p/12D3KooWBu1pZ3v2u6tXSmkN35kiMLENpv3bEXcyT1GJTVhipAkG" diff --git a/configs/local-bootstrap.json b/configs/local-bootstrap.json index d6477c353..85fca33f2 100644 --- a/configs/local-bootstrap.json +++ b/configs/local-bootstrap.json @@ -1,6 +1,9 @@ { "network_config": { - "addresses": ["/ip4/0.0.0.0/tcp/50000/ws", "/ip4/0.0.0.0/tcp/50001"], + "listen_addresses": [ + "/ip4/0.0.0.0/tcp/50000/ws", + "/ip4/0.0.0.0/tcp/50001" + ], "bootstrap": true, "bootstrap_peers": [], "private_key_seed": "bootstrap" diff --git a/configs/node.json b/configs/node.json index 00d359ba9..1531b0501 100644 --- a/configs/node.json +++ b/configs/node.json @@ -1,6 +1,8 @@ { "network_config": { - "addresses": ["/webrtc"], + "listen_addresses": [ + "/webrtc" + ], "bootstrap_peers": [ "/ip4/127.0.0.1/tcp/50000/ws/p2p/12D3KooWC6sm9iwmYbeQJCJipKTRghmABNz1wnpJANvSMabvecwJ" ], diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index 183abcd0e..9b5f76de3 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -22,6 +22,8 @@ import { dcutr } from "@libp2p/dcutr"; import { devToolsMetrics } from "@libp2p/devtools-metrics"; import { identify, identifyPush } from "@libp2p/identify"; import type { + Address, + Ed25519PrivateKey, EventCallback, Stream, StreamHandler, @@ -50,8 +52,8 @@ let log: Logger; // snake_casing to match the JSON config export interface DRPNetworkNodeConfig { - addresses?: string[]; - announce?: string[]; + listen_addresses?: string[]; + announce_addresses?: string[]; bootstrap?: boolean; bootstrap_peers?: string[]; browser_metrics?: boolean; @@ -113,9 +115,7 @@ export class DRPNetworkNode { // and allow it to doPX ? Let me know doPX: true, allowPublishToZeroTopicPeers: true, - pruneBackoff: 60 * 1000, scoreParams: createPeerScoreParams({ - topicScoreCap: 50, IPColocationFactorWeight: 0, appSpecificScore: (peerId: string) => { if (_bootstrapPeerID.includes(peerId)) { @@ -151,6 +151,7 @@ export class DRPNetworkNode { _node_services = { ..._node_services, pubsub: gossipsub({ + // cf: https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.1.md#recommendations-for-network-operators D: 0, Dlo: 0, Dhi: 0, @@ -182,27 +183,17 @@ export class DRPNetworkNode { this._node = await createLibp2p({ privateKey, addresses: { - listen: this._config?.addresses - ? this._config.addresses + listen: this._config?.listen_addresses + ? this._config.listen_addresses : ["/p2p-circuit", "/webrtc"], - ...(this._config?.announce ? { announce: this._config.announce } : {}), + ...(this._config?.announce_addresses + ? { announce: this._config.announce_addresses } + : {}), }, connectionManager: { // we would need something to know when we are in a browser context to add a maxConnections // maxConnections: 20, - addressSorter: (a, b) => { - const localRegex = - /(^\/ip4\/127\.)|(^\/ip4\/10\.)|(^\/ip4\/172\.1[6-9]\.)|(^\/ip4\/172\.2[0-9]\.)|(^\/ip4\/172\.3[0-1]\.)|(^\/ip4\/192\.168\.)/; - const aLocal = localRegex.test(a.toString()); - const bLocal = localRegex.test(b.toString()); - const aWebrtc = WebRTC.matches(a.multiaddr); - const bWebrtc = WebRTC.matches(b.multiaddr); - if (aLocal && !bLocal) return 1; - if (!aLocal && bLocal) return -1; - if (aWebrtc && !bWebrtc) return -1; - if (!aWebrtc && bWebrtc) return 1; - return 0; - }, + addressSorter: this._sortAddresses, }, connectionEncrypters: [noise()], connectionGater: { @@ -270,6 +261,20 @@ export class DRPNetworkNode { await this.start(); } + private _sortAddresses(a: Address, b: Address) { + const localRegex = + /(^\/ip4\/127\.)|(^\/ip4\/10\.)|(^\/ip4\/172\.1[6-9]\.)|(^\/ip4\/172\.2[0-9]\.)|(^\/ip4\/172\.3[0-1]\.)|(^\/ip4\/192\.168\.)/; + const aLocal = localRegex.test(a.toString()); + const bLocal = localRegex.test(b.toString()); + const aWebrtc = WebRTC.matches(a.multiaddr); + const bWebrtc = WebRTC.matches(b.multiaddr); + if (aLocal && !bLocal) return 1; + if (!aLocal && bLocal) return -1; + if (aWebrtc && !bWebrtc) return -1; + if (!aWebrtc && bWebrtc) return 1; + return 0; + } + changeTopicScoreParams(topic: string, params: TopicScoreParams) { if (!this._pubsub) return; this._pubsub.score.params.topics[topic] = params; diff --git a/packages/node/src/config.ts b/packages/node/src/config.ts index e128b9c18..a87d371b7 100644 --- a/packages/node/src/config.ts +++ b/packages/node/src/config.ts @@ -16,8 +16,11 @@ export function loadConfig( if (!result.error) { config = {}; config.network_config = { - addresses: process.env.ADDRESSES - ? process.env.ADDRESSES.split(",") + listen_addresses: process.env.LISTEN_ADDRESSES + ? process.env.LISTEN_ADDRESSES.split(",") + : undefined, + announce_addresses: process.env.ANNOUNCE_ADDRESSES + ? process.env.ANNOUNCE_ADDRESSES.split(",") : undefined, bootstrap: process.env.BOOTSTRAP ? process.env.BOOTSTRAP === "true" From 7f414692839cd29e8850d450c5bcc823a02087b7 Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Thu, 16 Jan 2025 11:16:44 +0100 Subject: [PATCH 07/10] chore: rebase Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- packages/network/src/node.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index 9b5f76de3..37a6a729e 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -23,7 +23,6 @@ import { devToolsMetrics } from "@libp2p/devtools-metrics"; import { identify, identifyPush } from "@libp2p/identify"; import type { Address, - Ed25519PrivateKey, EventCallback, Stream, StreamHandler, From 9cbff39bea593b5933f73509ac100de121b1eb5e Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Thu, 16 Jan 2025 14:25:36 +0100 Subject: [PATCH 08/10] chore: review Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- configs/bootstrap.json | 5 +---- configs/local-bootstrap.json | 5 +---- configs/node.json | 4 +--- packages/network/src/node.ts | 15 --------------- packages/node/src/index.ts | 1 - 5 files changed, 3 insertions(+), 27 deletions(-) diff --git a/configs/bootstrap.json b/configs/bootstrap.json index 44e17b85b..48dc9e0a9 100644 --- a/configs/bootstrap.json +++ b/configs/bootstrap.json @@ -1,9 +1,6 @@ { "network_config": { - "listen_addresses": [ - "/ip4/0.0.0.0/tcp/50000/ws", - "/ip4/0.0.0.0/tcp/50001" - ], + "listen_addresses": ["/ip4/0.0.0.0/tcp/50000/ws", "/ip4/0.0.0.0/tcp/50001"], "bootstrap": true, "bootstrap_peers": [ "/dns4/bootstrap1.topology.gg/tcp/443/wss/p2p/12D3KooWBu1pZ3v2u6tXSmkN35kiMLENpv3bEXcyT1GJTVhipAkG" diff --git a/configs/local-bootstrap.json b/configs/local-bootstrap.json index 85fca33f2..ea0ff917e 100644 --- a/configs/local-bootstrap.json +++ b/configs/local-bootstrap.json @@ -1,9 +1,6 @@ { "network_config": { - "listen_addresses": [ - "/ip4/0.0.0.0/tcp/50000/ws", - "/ip4/0.0.0.0/tcp/50001" - ], + "listen_addresses": ["/ip4/0.0.0.0/tcp/50000/ws", "/ip4/0.0.0.0/tcp/50001"], "bootstrap": true, "bootstrap_peers": [], "private_key_seed": "bootstrap" diff --git a/configs/node.json b/configs/node.json index 1531b0501..80618543f 100644 --- a/configs/node.json +++ b/configs/node.json @@ -1,8 +1,6 @@ { "network_config": { - "listen_addresses": [ - "/webrtc" - ], + "listen_addresses": ["/webrtc"], "bootstrap_peers": [ "/ip4/127.0.0.1/tcp/50000/ws/p2p/12D3KooWC6sm9iwmYbeQJCJipKTRghmABNz1wnpJANvSMabvecwJ" ], diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index 37a6a729e..ee684dbbd 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -108,10 +108,6 @@ export class DRPNetworkNode { identify: identify(), identifyPush: identifyPush(), pubsub: gossipsub({ - // in the doc it says that doPX shall be false for none bootstrap nodes - // but I dunnow if we should never the less enable it on other nodes ? - // maybe with ACL at some point we could make a broswer node trustable - // and allow it to doPX ? Let me know doPX: true, allowPublishToZeroTopicPeers: true, scoreParams: createPeerScoreParams({ @@ -124,17 +120,6 @@ export class DRPNetworkNode { }, topics: { "drp::discovery": createTopicScoreParams({ - // TODO: get a better score params this need to be - // investigated more before according to some value - // also it would be nice to have a way to set that scoring - // for each DRP id but the current gossipsub does not support - // that, I think we could either make a PR to gossipsub or - // make a custom lib with a scoring system that would be live - // notable ones: meshMessageXX - // meshFailureXX - // meshFailurePenaltyXX - // timeInMeshXX - // firstMessageDeliveriesXX topicWeight: 1, }), }, diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index b786061db..404986bab 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -1,5 +1,4 @@ import type { GossipsubMessage } from "@chainsafe/libp2p-gossipsub"; -import { createTopicScoreParams } from "@chainsafe/libp2p-gossipsub/score"; import type { EventCallback, StreamHandler } from "@libp2p/interface"; import { Logger, type LoggerOptions } from "@ts-drp/logger"; import { From a3a0df4d31783ead793c28e7f9cb62f00308aac0 Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Mon, 20 Jan 2025 17:38:16 +0100 Subject: [PATCH 09/10] chore: review Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- examples/grid/src/index.ts | 7 ------- packages/network/src/node.ts | 28 ++++++++++++++++++---------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/examples/grid/src/index.ts b/examples/grid/src/index.ts index 56ac76a81..ac3372750 100644 --- a/examples/grid/src/index.ts +++ b/examples/grid/src/index.ts @@ -216,13 +216,6 @@ async function main() { render(); }); - setInterval(() => { - peers = node.networkNode.getAllPeers(); - discoveryPeers = node.networkNode.getGroupPeers("drp::discovery"); - if (drpObject) objectPeers = node.networkNode.getGroupPeers(drpObject.id); - render(); - }, 1000); - const button_create = <HTMLButtonElement>( document.getElementById("createGrid") ); diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index ee684dbbd..931e857d0 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -6,13 +6,12 @@ import { import { type TopicScoreParams, createPeerScoreParams, - createPeerScoreThresholds, createTopicScoreParams, } from "@chainsafe/libp2p-gossipsub/score"; import { noise } from "@chainsafe/libp2p-noise"; import { yamux } from "@chainsafe/libp2p-yamux"; import { autoNAT } from "@libp2p/autonat"; -import { bootstrap } from "@libp2p/bootstrap"; +import { type BootstrapComponents, bootstrap } from "@libp2p/bootstrap"; import { circuitRelayServer, circuitRelayTransport, @@ -24,10 +23,15 @@ import { identify, identifyPush } from "@libp2p/identify"; import type { Address, EventCallback, + PeerDiscovery, Stream, StreamHandler, } from "@libp2p/interface"; import { ping } from "@libp2p/ping"; +import { + type PubSubPeerDiscoveryComponents, + pubsubPeerDiscovery, +} from "@libp2p/pubsub-peer-discovery"; import { webRTC, webRTCDirect } from "@libp2p/webrtc"; import { webSockets } from "@libp2p/websockets"; import * as filters from "@libp2p/websockets/filters"; @@ -60,6 +64,10 @@ export interface DRPNetworkNodeConfig { log_config?: LoggerOptions; } +type PeerDiscoveryFunction = + | ((components: PubSubPeerDiscoveryComponents) => PeerDiscovery) + | ((components: BootstrapComponents) => PeerDiscovery); + export class DRPNetworkNode { private _config?: DRPNetworkNodeConfig; private _node?: Libp2p; @@ -86,7 +94,13 @@ export class DRPNetworkNode { ? this._config.bootstrap_peers : BOOTSTRAP_NODES; - const _peerDiscovery = []; + const _peerDiscovery: Array<PeerDiscoveryFunction> = [ + pubsubPeerDiscovery({ + topics: ["drp::discovery"], + interval: 10_000, + }), + ]; + const _bootstrapPeerID: string[] = []; if (_bootstrapNodesList.length) { _peerDiscovery.push( @@ -113,7 +127,7 @@ export class DRPNetworkNode { scoreParams: createPeerScoreParams({ IPColocationFactorWeight: 0, appSpecificScore: (peerId: string) => { - if (_bootstrapPeerID.includes(peerId)) { + if (_bootstrapNodesList.some((node) => node.includes(peerId))) { return 1000; } return 0; @@ -124,9 +138,6 @@ export class DRPNetworkNode { }), }, }), - scoreThresholds: createPeerScoreThresholds({ - gossipThreshold: -50, - }), fallbackToFloodsub: false, }), }; @@ -147,9 +158,6 @@ export class DRPNetworkNode { topicScoreCap: 50, IPColocationFactorWeight: 0, }), - scoreThresholds: createPeerScoreThresholds({ - gossipThreshold: -50, - }), fallbackToFloodsub: false, }), }; From 2c5c68e67f4cce5513cf4145826fe2286fb84a25 Mon Sep 17 00:00:00 2001 From: Sacha Froment <sfroment42@gmail.com> Date: Thu, 23 Jan 2025 08:12:38 +0100 Subject: [PATCH 10/10] chore: -- Signed-off-by: Sacha Froment <sfroment42@gmail.com> --- packages/network/src/node.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/network/src/node.ts b/packages/network/src/node.ts index 931e857d0..6c9ea18d7 100644 --- a/packages/network/src/node.ts +++ b/packages/network/src/node.ts @@ -183,8 +183,6 @@ export class DRPNetworkNode { : {}), }, connectionManager: { - // we would need something to know when we are in a browser context to add a maxConnections - // maxConnections: 20, addressSorter: this._sortAddresses, }, connectionEncrypters: [noise()],